Previous 15994 Revisions Next

r15501 Monday 25th June, 2012 at 11:35:02 UTC by Michael Zapf
ti99: Switched to class implementation of TMS5200 [Michael Zapf] (nw)
[src/mess/machine/ti99]spchsyn.c spchsyn.h speech8.c speech8.h

src/mess/machine/ti99/speech8.c
r15500r15501
2222#define SPEECHSYN_TAG "speechsyn"
2323#define SPEECHROM_TAG "speechrom"
2424
25#define REAL_TIMING 0
26
27/*
28    For comments on real timing see ti99/spchsyn.c
29*/
2530/****************************************************************************/
2631
2732ti998_spsyn_device::ti998_spsyn_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
r15500r15501
3338/*
3439    Memory read
3540*/
41#if REAL_TIMING
42// ======  This is the version with real timing =======
3643READ8Z_MEMBER( ti998_spsyn_device::readz )
3744{
3845   if ((offset & m_select_mask)==m_select_value)
3946   {
47      m_vsp->wsq_w(TRUE);
48      m_vsp->rsq_w(FALSE);
49      *value = m_vsp->read(offset) & 0xff;
50      if (VERBOSE>4) LOG("speech8: read value = %02x\n", *value);
51   }
52}
53
54/*
55    Memory write
56*/
57WRITE8_MEMBER( ti998_spsyn_device::write )
58{
59   if ((offset & m_select_mask)==(m_select_value | 0x0400))
60   {
61      m_vsp->rsq_w(m_vsp, TRUE);
62      m_vsp->wsq_w(m_vsp, FALSE);
63      if (VERBOSE>4) LOG("speech8: write value = %02x\n", data);
64      m_vsp->write(offset, data);
65   }
66}
67
68#else
69// ======  This is the version without real timing =======
70
71READ8Z_MEMBER( ti998_spsyn_device::readz )
72{
73   if ((offset & m_select_mask)==m_select_value)
74   {
4075      device_adjust_icount(machine().device("maincpu"),-(18+3));      /* this is just a minimum, it can be more */
41      *value = tms5220_status_r(m_vsp, offset) & 0xff;
76      *value = m_vsp->read(space, offset, 0xff) & 0xff;
77      if (VERBOSE>4) LOG("speech8: read value = %02x\n", *value);
4278   }
4379}
4480
r15500r15501
5591      /* when there are 15 bytes in FIFO.  It should be 16.  Of course, if */
5692      /* it were the case, we would need to store the value on the bus, */
5793      /* which would be more complex. */
58      if (!tms5220_readyq_r(m_vsp))
94      if (!m_vsp->readyq())
5995      {
60         attotime time_to_ready = attotime::from_double(tms5220_time_to_ready(m_vsp));
96         attotime time_to_ready = attotime::from_double(m_vsp->time_to_ready());
6197         int cycles_to_ready = machine().device<cpu_device>("maincpu")->attotime_to_cycles(time_to_ready);
62         if (VERBOSE>8) LOG("time to ready: %f -> %d\n", time_to_ready.as_double(), (int) cycles_to_ready);
98         if (VERBOSE>8) LOG("speech8: time to ready: %f -> %d\n", time_to_ready.as_double(), (int) cycles_to_ready);
6399
64100         device_adjust_icount(machine().device("maincpu"),-cycles_to_ready);
65101         machine().scheduler().timer_set(attotime::zero, FUNC_NULL);
66102      }
67      tms5220_data_w(m_vsp, offset, data);
103      if (VERBOSE>4) LOG("speech8: write value = %02x\n", data);
104      m_vsp->write(space, offset, data);
68105   }
69106}
107#endif
70108
71109/****************************************************************************
72110    Callbacks from TMS5220
73
74    TODO: Convert to methods as soon as TMS5220 has been converted
75111*****************************************************************************/
76112/*
77113    Read 'count' bits serially from speech ROM
78114*/
79static int ti998_spchroms_read(device_t *vspdev, int count)
115READ8_MEMBER( ti998_spsyn_device::spchrom_read )
80116{
81   ti998_spsyn_device *adapter = static_cast<ti998_spsyn_device*>(vspdev->owner());
82
83117   int val;
118   int count = offset;
84119
85   if (adapter->m_load_pointer)
86   {   /* first read after load address is ignored */
87      adapter->m_load_pointer = 0;
120   if (m_load_pointer != 0)
121   {   // first read after load address is ignored
122      m_load_pointer = 0;
88123      count--;
89124   }
90125
91   if (adapter->m_sprom_address < adapter->m_sprom_length)
126   if (m_sprom_address < m_sprom_length)
92127   {
93      if (count < adapter->m_rombits_count)
128      if (count < m_rombits_count)
94129      {
95         adapter->m_rombits_count -= count;
96         val = (adapter->m_speechrom[adapter->m_sprom_address] >> adapter->m_rombits_count) & (0xFF >> (8 - count));
130         m_rombits_count -= count;
131         val = (m_speechrom[m_sprom_address] >> m_rombits_count) & (0xFF >> (8 - count));
97132      }
98133      else
99134      {
100         val = ((int)adapter->m_speechrom[adapter->m_sprom_address]) << 8;
135         val = ((int)m_speechrom[m_sprom_address]) << 8;
101136
102         adapter->m_sprom_address = (adapter->m_sprom_address + 1) & TMS5220_ADDRESS_MASK;
137         m_sprom_address = (m_sprom_address + 1) & TMS5220_ADDRESS_MASK;
103138
104         if (adapter->m_sprom_address < adapter->m_sprom_length)
105            val |= adapter->m_speechrom[adapter->m_sprom_address];
139         if (m_sprom_address < m_sprom_length)
140            val |= m_speechrom[m_sprom_address];
106141
107         adapter->m_rombits_count += 8 - count;
142         m_rombits_count += 8 - count;
108143
109         val = (val >> adapter->m_rombits_count) & (0xFF >> (8 - count));
144         val = (val >> m_rombits_count) & (0xFF >> (8 - count));
110145      }
111146   }
112147   else
r15500r15501
118153/*
119154    Write an address nibble to speech ROM
120155*/
121static void ti998_spchroms_load_address(device_t *vspdev, int data)
156WRITE8_MEMBER( ti998_spsyn_device::spchrom_load_address )
122157{
123   ti998_spsyn_device *adapter = static_cast<ti998_spsyn_device*>(vspdev->owner());
124
125158   // tms5220 data sheet says that if we load only one 4-bit nibble, it won't work.
126159   // This code does not care about this.
127   adapter->m_sprom_address = ((adapter->m_sprom_address & ~(0xf << adapter->m_load_pointer))
128      | (((unsigned long) (data & 0xf)) << adapter->m_load_pointer) ) & TMS5220_ADDRESS_MASK;
129   adapter->m_load_pointer += 4;
130   adapter->m_rombits_count = 8;
160   m_sprom_address = ((m_sprom_address & ~(0xf << m_load_pointer))
161      | (((unsigned long) (data & 0xf)) << m_load_pointer) ) & TMS5220_ADDRESS_MASK;
162   m_load_pointer += 4;
163   m_rombits_count = 8;
131164}
132165
133166/*
134167    Perform a read and branch command
135168*/
136static void ti998_spchroms_read_and_branch(device_t *vspdev)
169WRITE8_MEMBER( ti998_spsyn_device::spchrom_read_and_branch )
137170{
138   ti998_spsyn_device *adapter = static_cast<ti998_spsyn_device*>(vspdev->owner());
139171   // tms5220 data sheet says that if more than one speech ROM (tms6100) is present,
140172   // there is a bus contention.  This code does not care about this. */
141   if (adapter->m_sprom_address < adapter->m_sprom_length-1)
142      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL)
143         | (((((unsigned long) adapter->m_speechrom[adapter->m_sprom_address]) << 8)
144         | adapter->m_speechrom[adapter->m_sprom_address+1]) & 0x3fffUL);
145   else if (adapter->m_sprom_address == adapter->m_sprom_length-1)
146      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL)
147         | ((((unsigned long) adapter->m_speechrom[adapter->m_sprom_address]) << 8) & 0x3fffUL);
173   if (m_sprom_address < m_sprom_length-1)
174      m_sprom_address = (m_sprom_address & 0x3c000UL)
175         | (((((unsigned long) m_speechrom[m_sprom_address]) << 8)
176         | m_speechrom[m_sprom_address+1]) & 0x3fffUL);
177   else if (m_sprom_address == m_sprom_length-1)
178      m_sprom_address = (m_sprom_address & 0x3c000UL)
179         | ((((unsigned long) m_speechrom[m_sprom_address]) << 8) & 0x3fffUL);
148180   else
149      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL);
181      m_sprom_address = (m_sprom_address & 0x3c000UL);
150182
151   adapter->m_rombits_count = 8;
183   m_rombits_count = 8;
152184}
153185
154186/*****************************************************************************/
155187/*
156188    Callback interface instance
157189*/
158static const tms5220_interface ti99_8_tms5200interface =
190static const tms52xx_config ti99_8_tms5200interface =
159191{
160192   DEVCB_NULL,                  // no IRQ callback
161193   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ti998_spsyn_device, speech8_ready),
162   ti998_spchroms_read,            // speech ROM read handler
163   ti998_spchroms_load_address,      // speech ROM load address handler
164   ti998_spchroms_read_and_branch   // speech ROM read and branch handler
194
195   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti998_spsyn_device, spchrom_read),            // speech ROM read handler
196   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti998_spsyn_device, spchrom_load_address),      // speech ROM load address handler
197   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti998_spsyn_device, spchrom_read_and_branch)   // speech ROM read and branch handler
165198};
166199
167200/**************************************************************************/
168201
169202WRITE_LINE_MEMBER( ti998_spsyn_device::speech8_ready )
170203{
171   // TODO: Fix polarity in TMS5220
204   // The TMS5200 implementation uses TRUE/FALSE, not ASSERT/CLEAR semantics
172205   m_ready((state==0)? ASSERT_LINE : CLEAR_LINE);
206   if (VERBOSE>5) LOG("spchsyn: READY = %d\n", (state==0));
207
208#if REAL_TIMING
209   // Need to do that here (see explanations in spchsyn.c)
210   if (state==0)
211   {
212      m_vsp->rsq_w(TRUE);
213      m_vsp->wsq_w(TRUE);
214   }
215#endif
173216}
174217
175218void ti998_spsyn_device::device_start()
176219{
177220   const speech8_config *conf = reinterpret_cast<const speech8_config *>(static_config());
178221   m_ready.resolve(conf->ready, *this);
179   m_vsp = subdevice(SPEECHSYN_TAG);
222   m_vsp = subdevice<tms5220n_device>(SPEECHSYN_TAG);
180223}
181224
182225void ti998_spsyn_device::device_reset()
r15500r15501
195238// Unlike the TI-99/4A, the 99/8 uses the TMS5220
196239MACHINE_CONFIG_FRAGMENT( ti998_speech )
197240   MCFG_SPEAKER_STANDARD_MONO("mono")
198   MCFG_SOUND_ADD(SPEECHSYN_TAG, TMS5220, 680000L)
241   MCFG_SOUND_ADD(SPEECHSYN_TAG, TMS5220N, 640000L)
199242   MCFG_SOUND_CONFIG(ti99_8_tms5200interface)
200243   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
201244MACHINE_CONFIG_END
src/mess/machine/ti99/speech8.h
r15500r15501
3939
4040   DECLARE_WRITE_LINE_MEMBER( speech8_ready );
4141
42   UINT8         *m_speechrom;         // pointer to speech ROM data
43   int          m_load_pointer;         // which 4-bit nibble will be affected by load address
44   int          m_rombits_count;      // current bit position in ROM
45   UINT32         m_sprom_address;      // 18 bit pointer in ROM
46   UINT32         m_sprom_length;         // length of data pointed by speechrom_data, from 0 to 2^18
42   DECLARE_READ8_MEMBER( spchrom_read );
43   DECLARE_WRITE8_MEMBER( spchrom_load_address );
44   DECLARE_WRITE8_MEMBER( spchrom_read_and_branch );
4745
4846   int            m_select_mask;
4947   int            m_select_value;
r15500r15501
5553   machine_config_constructor device_mconfig_additions() const;
5654
5755private:
58   device_t      *m_vsp;
56   tms5220n_device   *m_vsp;
57   UINT8         *m_speechrom;         // pointer to speech ROM data
58   int          m_load_pointer;         // which 4-bit nibble will be affected by load address
59   int          m_rombits_count;      // current bit position in ROM
60   UINT32         m_sprom_address;      // 18 bit pointer in ROM
61   UINT32         m_sprom_length;         // length of data pointed by speechrom_data, from 0 to 2^18
5962
6063   // Ready line to the CPU
6164   devcb_resolved_write_line m_ready;
src/mess/machine/ti99/spchsyn.c
r15500r15501
8080{
8181   if ((offset & m_select_mask)==m_select_value)
8282   {
83      tms5220_wsq_w(m_vsp, TRUE);
84      tms5220_rsq_w(m_vsp, FALSE);
85      *value = tms5220_status_r(m_vsp, offset) & 0xff;
83      m_vsp->wsq_w(TRUE);
84      m_vsp->rsq_w(FALSE);
85      *value = m_vsp->read(offset) & 0xff;
8686      if (VERBOSE>4) LOG("spchsyn: read value = %02x\n", *value);
8787   }
8888}
r15500r15501
9494{
9595   if ((offset & m_select_mask)==(m_select_value | 0x0400))
9696   {
97      tms5220_rsq_w(m_vsp, TRUE);
98      tms5220_wsq_w(m_vsp, FALSE);
97      m_vsp->rsq_w(m_vsp, TRUE);
98      m_vsp->wsq_w(m_vsp, FALSE);
9999      if (VERBOSE>4) LOG("spchsyn: write value = %02x\n", data);
100      tms5220_data_w(m_vsp, offset, data);
100      m_vsp->write(offset, data);
101101   }
102102}
103103
r15500r15501
109109   if ((offset & m_select_mask)==m_select_value)
110110   {
111111      device_adjust_icount(machine().device("maincpu"),-(18+3));      /* this is just a minimum, it can be more */
112      *value = tms5220_status_r(m_vsp, offset) & 0xff;
112      *value = m_vsp->read(space, offset, 0xff) & 0xff;
113113      if (VERBOSE>4) LOG("spchsyn: read value = %02x\n", *value);
114114   }
115115}
r15500r15501
127127      /* when there are 15 bytes in FIFO.  It should be 16.  Of course, if */
128128      /* it were the case, we would need to store the value on the bus, */
129129      /* which would be more complex. */
130      if (!tms5220_readyq_r(m_vsp))
130      if (!m_vsp->readyq())
131131      {
132         attotime time_to_ready = attotime::from_double(tms5220_time_to_ready(m_vsp));
132         attotime time_to_ready = attotime::from_double(m_vsp->time_to_ready());
133133         int cycles_to_ready = machine().device<cpu_device>("maincpu")->attotime_to_cycles(time_to_ready);
134         if (VERBOSE>8) LOG("time to ready: %f -> %d\n", time_to_ready.as_double(), (int) cycles_to_ready);
134         if (VERBOSE>8) LOG("spchsyn: time to ready: %f -> %d\n", time_to_ready.as_double(), (int) cycles_to_ready);
135135
136136         device_adjust_icount(machine().device("maincpu"),-cycles_to_ready);
137137         machine().scheduler().timer_set(attotime::zero, FUNC_NULL);
138138      }
139139      if (VERBOSE>4) LOG("spchsyn: write value = %02x\n", data);
140      tms5220_data_w(m_vsp, offset, data);
140      m_vsp->write(space, offset, data);
141141   }
142142}
143143#endif
144144
145145/****************************************************************************
146146    Callbacks from TMS5220
147
148    TODO: Convert to methods as soon as TMS5220 has been converted
149147*****************************************************************************/
150148/*
151    Read 'count' bits serially from speech ROM
149    Read 'count' bits serially from speech ROM. The offset is used as the count.
152150*/
153static int ti99_spchroms_read(device_t *vspdev, int count)
151READ8_MEMBER( ti_speech_synthesizer_device::spchrom_read )
154152{
155   ti_speech_synthesizer_device *adapter = static_cast<ti_speech_synthesizer_device*>(vspdev->owner());
156
157153   int val;
154   int count = offset;
158155
159   if (adapter->m_load_pointer)
160   {   /* first read after load address is ignored */
161      adapter->m_load_pointer = 0;
156   if (m_load_pointer != 0)
157   {   // first read after load address is ignored
158      m_load_pointer = 0;
162159      count--;
163160   }
164161
165   if (adapter->m_sprom_address < adapter->m_sprom_length)
162   if (m_sprom_address < m_sprom_length)
166163   {
167      if (count < adapter->m_rombits_count)
164      if (count < m_rombits_count)
168165      {
169         adapter->m_rombits_count -= count;
170         val = (adapter->m_speechrom[adapter->m_sprom_address] >> adapter->m_rombits_count) & (0xFF >> (8 - count));
166         m_rombits_count -= count;
167         val = (m_speechrom[m_sprom_address] >> m_rombits_count) & (0xFF >> (8 - count));
171168      }
172169      else
173170      {
174         val = ((int)adapter->m_speechrom[adapter->m_sprom_address]) << 8;
171         val = ((int)m_speechrom[m_sprom_address]) << 8;
175172
176         adapter->m_sprom_address = (adapter->m_sprom_address + 1) & TMS5220_ADDRESS_MASK;
173         m_sprom_address = (m_sprom_address + 1) & TMS5220_ADDRESS_MASK;
177174
178         if (adapter->m_sprom_address < adapter->m_sprom_length)
179            val |= adapter->m_speechrom[adapter->m_sprom_address];
175         if (m_sprom_address < m_sprom_length)
176            val |= m_speechrom[m_sprom_address];
180177
181         adapter->m_rombits_count += 8 - count;
178         m_rombits_count += 8 - count;
182179
183         val = (val >> adapter->m_rombits_count) & (0xFF >> (8 - count));
180         val = (val >> m_rombits_count) & (0xFF >> (8 - count));
184181      }
185182   }
186183   else
r15500r15501
190187}
191188
192189/*
193    Write an address nibble to speech ROM
190    Write an address nibble to speech ROM. The address nibble is in the data,
191    the offset is ignored.
194192*/
195static void ti99_spchroms_load_address(device_t *vspdev, int data)
193WRITE8_MEMBER( ti_speech_synthesizer_device::spchrom_load_address )
196194{
197   ti_speech_synthesizer_device *adapter = static_cast<ti_speech_synthesizer_device*>(vspdev->owner());
198
199195   // tms5220 data sheet says that if we load only one 4-bit nibble, it won't work.
200196   // This code does not care about this.
201   adapter->m_sprom_address = ((adapter->m_sprom_address & ~(0xf << adapter->m_load_pointer))
202      | (((unsigned long) (data & 0xf)) << adapter->m_load_pointer) ) & TMS5220_ADDRESS_MASK;
203   adapter->m_load_pointer += 4;
204   adapter->m_rombits_count = 8;
197   m_sprom_address = ((m_sprom_address & ~(0xf << m_load_pointer))
198      | (((unsigned long) (data & 0xf)) << m_load_pointer) ) & TMS5220_ADDRESS_MASK;
199   m_load_pointer += 4;
200   m_rombits_count = 8;
205201}
206202
207203/*
208    Perform a read and branch command
204    Perform a read and branch command. We do not use the offset or data parameter.
209205*/
210static void ti99_spchroms_read_and_branch(device_t *vspdev)
206WRITE8_MEMBER( ti_speech_synthesizer_device::spchrom_read_and_branch )
211207{
212   ti_speech_synthesizer_device *adapter = static_cast<ti_speech_synthesizer_device*>(vspdev->owner());
213208   // tms5220 data sheet says that if more than one speech ROM (tms6100) is present,
214209   // there is a bus contention.  This code does not care about this. */
215   if (adapter->m_sprom_address < adapter->m_sprom_length-1)
216      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL)
217         | (((((unsigned long) adapter->m_speechrom[adapter->m_sprom_address]) << 8)
218         | adapter->m_speechrom[adapter->m_sprom_address+1]) & 0x3fffUL);
219   else if (adapter->m_sprom_address == adapter->m_sprom_length-1)
220      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL)
221         | ((((unsigned long) adapter->m_speechrom[adapter->m_sprom_address]) << 8) & 0x3fffUL);
210   if (m_sprom_address < m_sprom_length-1)
211      m_sprom_address = (m_sprom_address & 0x3c000UL)
212         | (((((unsigned long) m_speechrom[m_sprom_address]) << 8)
213         | m_speechrom[m_sprom_address+1]) & 0x3fffUL);
214   else if (m_sprom_address == m_sprom_length-1)
215      m_sprom_address = (m_sprom_address & 0x3c000UL)
216         | ((((unsigned long) m_speechrom[m_sprom_address]) << 8) & 0x3fffUL);
222217   else
223      adapter->m_sprom_address = (adapter->m_sprom_address & 0x3c000UL);
218      m_sprom_address = (m_sprom_address & 0x3c000UL);
224219
225   adapter->m_rombits_count = 8;
220   m_rombits_count = 8;
226221}
227222
228223/****************************************************************************/
r15500r15501
230225/*
231226    Callback interface instance
232227*/
233static const tms5220_interface ti99_4x_tms5200interface =
228static const tms52xx_config ti99_4x_tms5200interface =
234229{
235230   DEVCB_NULL,                  // no IRQ callback
236231   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ti_speech_synthesizer_device, speech_ready),
237   ti99_spchroms_read,            // speech ROM read handler
238   ti99_spchroms_load_address,      // speech ROM load address handler
239   ti99_spchroms_read_and_branch   // speech ROM read and branch handler
232
233   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti_speech_synthesizer_device, spchrom_read),            // speech ROM read handler
234   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti_speech_synthesizer_device, spchrom_load_address),      // speech ROM load address handler
235   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, ti_speech_synthesizer_device, spchrom_read_and_branch)   // speech ROM read and branch handler
240236};
241237
242238/****************************************************************************/
r15500r15501
253249   // Need to do that here (see explanations above)
254250   if (state==0)
255251   {
256      tms5220_rsq_w(m_vsp, TRUE);
257      tms5220_wsq_w(m_vsp, TRUE);
252      m_vsp->rsq_w(TRUE);
253      m_vsp->wsq_w(TRUE);
258254   }
259255#endif
260256}
r15500r15501
265261
266262void ti_speech_synthesizer_device::device_config_complete()
267263{
268   m_vsp = subdevice("speechsyn");
264   m_vsp = subdevice<tmc0285n_device>("speechsyn");
269265}
270266
271267void ti_speech_synthesizer_device::device_reset()
r15500r15501
290286
291287MACHINE_CONFIG_FRAGMENT( ti99_speech )
292288   MCFG_SPEAKER_STANDARD_MONO("mono")
293   MCFG_SOUND_ADD("speechsyn", TMC0285, 640000L)
289   MCFG_SOUND_ADD("speechsyn", TMC0285N, 640000L)
294290   MCFG_SOUND_CONFIG(ti99_4x_tms5200interface)
295291   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
296292MACHINE_CONFIG_END
src/mess/machine/ti99/spchsyn.h
r15500r15501
2929
3030   DECLARE_WRITE_LINE_MEMBER( speech_ready );
3131
32   UINT8         *m_speechrom;         // pointer to speech ROM data
33   int          m_load_pointer;         // which 4-bit nibble will be affected by load address
34   int          m_rombits_count;      // current bit position in ROM
35   UINT32         m_sprom_address;      // 18 bit pointer in ROM
36   UINT32         m_sprom_length;         // length of data pointed by speechrom_data, from 0 to 2^18
32   DECLARE_READ8_MEMBER( spchrom_read );
33   DECLARE_WRITE8_MEMBER( spchrom_load_address );
34   DECLARE_WRITE8_MEMBER( spchrom_read_and_branch );
3735
3836protected:
3937   void         device_start();
r15500r15501
4341   void         device_config_complete();
4442
4543private:
46   device_t      *m_vsp;
44   tmc0285n_device   *m_vsp;
45
46   UINT8         *m_speechrom;         // pointer to speech ROM data
47   int          m_load_pointer;         // which 4-bit nibble will be affected by load address
48   int          m_rombits_count;      // current bit position in ROM
49   UINT32         m_sprom_address;      // 18 bit pointer in ROM
50   UINT32         m_sprom_length;         // length of data pointed by speechrom_data, from 0 to 2^18
4751};
4852
4953#endif

Previous 15994 Revisions Next


© 1998-2018 The MESS Team