summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/sound/multipcm.cpp214
-rw-r--r--src/devices/sound/multipcm.h36
-rw-r--r--src/devices/video/zeus2.cpp10
-rw-r--r--src/devices/video/zeus2.h8
-rw-r--r--src/mame/drivers/aci_ggm.cpp83
-rw-r--r--src/mame/drivers/hh_sm510.cpp2
-rw-r--r--src/mame/includes/midzeus.h78
-rw-r--r--src/mame/includes/model1.h6
-rw-r--r--src/mame/includes/model2.h61
-rw-r--r--src/mame/includes/slapshot.h2
-rw-r--r--src/mame/includes/taito_f3.h16
-rw-r--r--src/mame/layout/aci_ggm.lay474
-rw-r--r--src/mame/nl.lst3
-rw-r--r--src/mame/video/midzeus.cpp332
-rw-r--r--src/mame/video/model1.cpp32
-rw-r--r--src/mame/video/model2.cpp72
-rw-r--r--src/mame/video/slapshot.cpp6
-rw-r--r--src/mame/video/taito_f3.cpp40
18 files changed, 826 insertions, 649 deletions
diff --git a/src/devices/sound/multipcm.cpp b/src/devices/sound/multipcm.cpp
index e1aa70bddb6..ccad2612989 100644
--- a/src/devices/sound/multipcm.cpp
+++ b/src/devices/sound/multipcm.cpp
@@ -92,53 +92,53 @@ void multipcm_device::init_sample(sample_t *sample, uint32_t index)
sample->m_lfo_amplitude_reg = read_byte(address + 11) & 0xf;
}
-int32_t multipcm_device::envelope_generator_update(slot_t *slot)
+int32_t multipcm_device::envelope_generator_update(slot_t &slot)
{
- switch(slot->m_envelope_gen.m_state)
+ switch(slot.m_envelope_gen.m_state)
{
case state_t::ATTACK:
- slot->m_envelope_gen.m_volume += slot->m_envelope_gen.m_attack_rate;
- if (slot->m_envelope_gen.m_volume >= (0x3ff << EG_SHIFT))
+ slot.m_envelope_gen.m_volume += slot.m_envelope_gen.m_attack_rate;
+ if (slot.m_envelope_gen.m_volume >= (0x3ff << EG_SHIFT))
{
- slot->m_envelope_gen.m_state = state_t::DECAY1;
- if (slot->m_envelope_gen.m_decay1_rate >= (0x400 << EG_SHIFT)) //Skip DECAY1, go directly to DECAY2
+ slot.m_envelope_gen.m_state = state_t::DECAY1;
+ if (slot.m_envelope_gen.m_decay1_rate >= (0x400 << EG_SHIFT)) //Skip DECAY1, go directly to DECAY2
{
- slot->m_envelope_gen.m_state = state_t::DECAY2;
+ slot.m_envelope_gen.m_state = state_t::DECAY2;
}
- slot->m_envelope_gen.m_volume = 0x3ff << EG_SHIFT;
+ slot.m_envelope_gen.m_volume = 0x3ff << EG_SHIFT;
}
break;
case state_t::DECAY1:
- slot->m_envelope_gen.m_volume -= slot->m_envelope_gen.m_decay1_rate;
- if (slot->m_envelope_gen.m_volume <= 0)
+ slot.m_envelope_gen.m_volume -= slot.m_envelope_gen.m_decay1_rate;
+ if (slot.m_envelope_gen.m_volume <= 0)
{
- slot->m_envelope_gen.m_volume = 0;
+ slot.m_envelope_gen.m_volume = 0;
}
- if (slot->m_envelope_gen.m_volume >> EG_SHIFT <= (slot->m_envelope_gen.m_decay_level << 6))
+ if (slot.m_envelope_gen.m_volume >> EG_SHIFT <= (slot.m_envelope_gen.m_decay_level << 6))
{
- slot->m_envelope_gen.m_state = state_t::DECAY2;
+ slot.m_envelope_gen.m_state = state_t::DECAY2;
}
break;
case state_t::DECAY2:
- slot->m_envelope_gen.m_volume -= slot->m_envelope_gen.m_decay2_rate;
- if (slot->m_envelope_gen.m_volume <= 0)
+ slot.m_envelope_gen.m_volume -= slot.m_envelope_gen.m_decay2_rate;
+ if (slot.m_envelope_gen.m_volume <= 0)
{
- slot->m_envelope_gen.m_volume = 0;
+ slot.m_envelope_gen.m_volume = 0;
}
break;
case state_t::RELEASE:
- slot->m_envelope_gen.m_volume -= slot->m_envelope_gen.m_release_rate;
- if (slot->m_envelope_gen.m_volume <= 0)
+ slot.m_envelope_gen.m_volume -= slot.m_envelope_gen.m_release_rate;
+ if (slot.m_envelope_gen.m_volume <= 0)
{
- slot->m_envelope_gen.m_volume = 0;
- slot->m_playing = false;
+ slot.m_envelope_gen.m_volume = 0;
+ slot.m_playing = false;
}
break;
default:
return 1 << TL_SHIFT;
}
- return m_linear_to_exp_volume[slot->m_envelope_gen.m_volume >> EG_SHIFT];
+ return m_linear_to_exp_volume[slot.m_envelope_gen.m_volume >> EG_SHIFT];
}
uint32_t multipcm_device::get_rate(uint32_t *steps, uint32_t rate, uint32_t val)
@@ -159,28 +159,28 @@ uint32_t multipcm_device::get_rate(uint32_t *steps, uint32_t rate, uint32_t val)
return steps[r];
}
-void multipcm_device::envelope_generator_calc(slot_t *slot)
+void multipcm_device::envelope_generator_calc(slot_t &slot)
{
- int32_t octave = ((slot->m_regs[3] >> 4) - 1) & 0xf;
+ int32_t octave = ((slot.m_regs[3] >> 4) - 1) & 0xf;
if (octave & 8) {
octave = octave - 16;
}
int32_t rate;
- if (slot->m_sample.m_key_rate_scale != 0xf)
+ if (slot.m_sample.m_key_rate_scale != 0xf)
{
- rate = (octave + slot->m_sample.m_key_rate_scale) * 2 + ((slot->m_regs[3] >> 3) & 1);
+ rate = (octave + slot.m_sample.m_key_rate_scale) * 2 + ((slot.m_regs[3] >> 3) & 1);
}
else
{
rate = 0;
}
- slot->m_envelope_gen.m_attack_rate = get_rate(m_attack_step, rate, slot->m_sample.m_attack_reg);
- slot->m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step, rate, slot->m_sample.m_decay1_reg);
- slot->m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step, rate, slot->m_sample.m_decay2_reg);
- slot->m_envelope_gen.m_release_rate = get_rate(m_decay_release_step, rate, slot->m_sample.m_release_reg);
- slot->m_envelope_gen.m_decay_level = 0xf - slot->m_sample.m_decay_level;
+ slot.m_envelope_gen.m_attack_rate = get_rate(m_attack_step.get(), rate, slot.m_sample.m_attack_reg);
+ slot.m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step.get(), rate, slot.m_sample.m_decay1_reg);
+ slot.m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step.get(), rate, slot.m_sample.m_decay2_reg);
+ slot.m_envelope_gen.m_release_rate = get_rate(m_decay_release_step.get(), rate, slot.m_sample.m_release_reg);
+ slot.m_envelope_gen.m_decay_level = 0xf - slot.m_sample.m_decay_level;
}
@@ -228,8 +228,8 @@ const float multipcm_device::AMPLITUDE_SCALE_LIMIT[8] = // In Decibels
void multipcm_device::lfo_init()
{
- m_pitch_table = auto_alloc_array_clear(machine(), int32_t, 256);
- m_amplitude_table = auto_alloc_array_clear(machine(), int32_t, 256);
+ m_pitch_table = make_unique_clear<int32_t[]>(256);
+ m_amplitude_table = make_unique_clear<int32_t[]>(256);
for (int32_t i = 0; i < 256; ++i)
{
if (i < 64)
@@ -259,12 +259,12 @@ void multipcm_device::lfo_init()
}
}
- m_pitch_scale_tables = auto_alloc_array_clear(machine(), int32_t*, 8);
- m_amplitude_scale_tables = auto_alloc_array_clear(machine(), int32_t*, 8);
+ m_pitch_scale_tables = make_unique_clear<std::unique_ptr<int32_t[]>[]>(8);
+ m_amplitude_scale_tables = make_unique_clear<std::unique_ptr<int32_t[]>[]>(8);
for (int32_t table = 0; table < 8; ++table)
{
float limit = PHASE_SCALE_LIMIT[table];
- m_pitch_scale_tables[table] = auto_alloc_array_clear(machine(), int32_t, 256);
+ m_pitch_scale_tables[table] = make_unique_clear<int32_t[]>(256);
for(int32_t i = -128; i < 128; ++i)
{
const float value = (limit * (float)i) / 128.0f;
@@ -273,7 +273,7 @@ void multipcm_device::lfo_init()
}
limit = -AMPLITUDE_SCALE_LIMIT[table];
- m_amplitude_scale_tables[table] = auto_alloc_array_clear(machine(), int32_t, 256);
+ m_amplitude_scale_tables[table] = make_unique_clear<int32_t[]>(256);
for(int32_t i = 0; i < 256; ++i)
{
const float value = (limit * (float)i) / 256.0f;
@@ -289,53 +289,53 @@ uint32_t multipcm_device::value_to_fixed(const uint32_t bits, const float value)
return uint32_t(float_shift * value);
}
-int32_t multipcm_device::pitch_lfo_step(lfo_t *lfo)
+int32_t multipcm_device::pitch_lfo_step(lfo_t &lfo)
{
- lfo->m_phase += lfo->m_phase_step;
- int32_t p = lfo->m_table[(lfo->m_phase >> LFO_SHIFT) & 0xff];
- p = lfo->m_scale[p];
+ lfo.m_phase += lfo.m_phase_step;
+ int32_t p = lfo.m_table[(lfo.m_phase >> LFO_SHIFT) & 0xff];
+ p = lfo.m_scale[p];
return p << (TL_SHIFT - LFO_SHIFT);
}
-int32_t multipcm_device::amplitude_lfo_step(lfo_t *lfo)
+int32_t multipcm_device::amplitude_lfo_step(lfo_t &lfo)
{
- lfo->m_phase += lfo->m_phase_step;
- int32_t p = lfo->m_table[(lfo->m_phase >> LFO_SHIFT) & 0xff];
- p = lfo->m_scale[p];
+ lfo.m_phase += lfo.m_phase_step;
+ int32_t p = lfo.m_table[(lfo.m_phase >> LFO_SHIFT) & 0xff];
+ p = lfo.m_scale[p];
return p << (TL_SHIFT - LFO_SHIFT);
}
-void multipcm_device::lfo_compute_step(lfo_t *lfo, uint32_t lfo_frequency, uint32_t lfo_scale, int32_t amplitude_lfo)
+void multipcm_device::lfo_compute_step(lfo_t &lfo, uint32_t lfo_frequency, uint32_t lfo_scale, int32_t amplitude_lfo)
{
float step = (float)LFO_FREQ[lfo_frequency] * 256.0f / (float)m_rate;
- lfo->m_phase_step = uint32_t(float(1 << LFO_SHIFT) * step);
+ lfo.m_phase_step = uint32_t(float(1 << LFO_SHIFT) * step);
if (amplitude_lfo)
{
- lfo->m_table = m_amplitude_table;
- lfo->m_scale = m_amplitude_scale_tables[lfo_scale];
+ lfo.m_table = m_amplitude_table.get();
+ lfo.m_scale = m_amplitude_scale_tables[lfo_scale].get();
}
else
{
- lfo->m_table = m_pitch_table;
- lfo->m_scale = m_pitch_scale_tables[lfo_scale];
+ lfo.m_table = m_pitch_table.get();
+ lfo.m_scale = m_pitch_scale_tables[lfo_scale].get();
}
}
-void multipcm_device::write_slot(slot_t *slot, int32_t reg, uint8_t data)
+void multipcm_device::write_slot(slot_t &slot, int32_t reg, uint8_t data)
{
- slot->m_regs[reg] = data;
+ slot.m_regs[reg] = data;
switch(reg)
{
case 0: // PANPOT
- slot->m_pan = (data >> 4) & 0xf;
+ slot.m_pan = (data >> 4) & 0xf;
break;
case 1: // Sample
{
//according to YMF278 sample write causes some base params written to the regs (envelope+lfos)
//the game should never change the sample while playing.
sample_t sample;
- init_sample(&sample, slot->m_regs[1] | ((slot->m_regs[2] & 1) << 8));
+ init_sample(&sample, slot.m_regs[1] | ((slot.m_regs[2] & 1) << 8));
write_slot(slot, 6, sample.m_lfo_vibrato_reg);
write_slot(slot, 7, sample.m_lfo_amplitude_reg);
break;
@@ -343,8 +343,8 @@ void multipcm_device::write_slot(slot_t *slot, int32_t reg, uint8_t data)
case 2: //Pitch
case 3:
{
- uint32_t oct = ((slot->m_regs[3] >> 4) - 1) & 0xf;
- uint32_t pitch = ((slot->m_regs[3] & 0xf) << 6) | (slot->m_regs[2] >> 2);
+ uint32_t oct = ((slot.m_regs[3] >> 4) - 1) & 0xf;
+ uint32_t pitch = ((slot.m_regs[3] & 0xf) << 6) | (slot.m_regs[2] >> 2);
pitch = m_freq_step_table[pitch];
if (oct & 0x8)
{
@@ -354,68 +354,68 @@ void multipcm_device::write_slot(slot_t *slot, int32_t reg, uint8_t data)
{
pitch <<= oct;
}
- slot->m_step = pitch / m_rate;
+ slot.m_step = pitch / m_rate;
}
break;
case 4: //KeyOn/Off (and more?)
if (data & 0x80) //KeyOn
{
- init_sample(&slot->m_sample, slot->m_regs[1] | ((slot->m_regs[2] & 1) << 8));
- slot->m_playing = true;
- slot->m_base = slot->m_sample.m_start;
- slot->m_offset = 0;
- slot->m_prev_sample = 0;
- slot->m_total_level = slot->m_dest_total_level << TL_SHIFT;
+ init_sample(&slot.m_sample, slot.m_regs[1] | ((slot.m_regs[2] & 1) << 8));
+ slot.m_playing = true;
+ slot.m_base = slot.m_sample.m_start;
+ slot.m_offset = 0;
+ slot.m_prev_sample = 0;
+ slot.m_total_level = slot.m_dest_total_level << TL_SHIFT;
envelope_generator_calc(slot);
- slot->m_envelope_gen.m_state = state_t::ATTACK;
- slot->m_envelope_gen.m_volume = 0;
+ slot.m_envelope_gen.m_state = state_t::ATTACK;
+ slot.m_envelope_gen.m_volume = 0;
}
else
{
- if (slot->m_playing)
+ if (slot.m_playing)
{
- if (slot->m_sample.m_release_reg != 0xf)
+ if (slot.m_sample.m_release_reg != 0xf)
{
- slot->m_envelope_gen.m_state = state_t::RELEASE;
+ slot.m_envelope_gen.m_state = state_t::RELEASE;
}
else
{
- slot->m_playing = false;
+ slot.m_playing = false;
}
}
}
break;
case 5: // TL + Interpolation
- slot->m_dest_total_level = (data >> 1) & 0x7f;
+ slot.m_dest_total_level = (data >> 1) & 0x7f;
if (!(data & 1)) //Interpolate TL
{
- if ((slot->m_total_level >> TL_SHIFT) > slot->m_dest_total_level)
+ if ((slot.m_total_level >> TL_SHIFT) > slot.m_dest_total_level)
{
- slot->m_total_level_step = m_total_level_steps[0]; // decrease
+ slot.m_total_level_step = m_total_level_steps[0]; // decrease
}
else
{
- slot->m_total_level_step = m_total_level_steps[1]; // increase
+ slot.m_total_level_step = m_total_level_steps[1]; // increase
}
}
else
{
- slot->m_total_level = slot->m_dest_total_level << TL_SHIFT;
+ slot.m_total_level = slot.m_dest_total_level << TL_SHIFT;
}
break;
case 6: // LFO frequency + Pitch LFO
if (data)
{
- lfo_compute_step(&(slot->m_pitch_lfo), (slot->m_regs[6] >> 3) & 7, slot->m_regs[6] & 7, 0);
- lfo_compute_step(&(slot->m_amplitude_lfo), (slot->m_regs[6] >> 3) & 7, slot->m_regs[7] & 7, 1);
+ lfo_compute_step(slot.m_pitch_lfo, (slot.m_regs[6] >> 3) & 7, slot.m_regs[6] & 7, 0);
+ lfo_compute_step(slot.m_amplitude_lfo, (slot.m_regs[6] >> 3) & 7, slot.m_regs[7] & 7, 1);
}
break;
case 7: // Amplitude LFO
if (data)
{
- lfo_compute_step(&(slot->m_pitch_lfo), (slot->m_regs[6] >> 3) & 7, slot->m_regs[6] & 7, 0);
- lfo_compute_step(&(slot->m_amplitude_lfo), (slot->m_regs[6] >> 3) & 7, slot->m_regs[7] & 7, 1);
+ lfo_compute_step(slot.m_pitch_lfo, (slot.m_regs[6] >> 3) & 7, slot.m_regs[6] & 7, 0);
+ lfo_compute_step(slot.m_amplitude_lfo, (slot.m_regs[6] >> 3) & 7, slot.m_regs[7] & 7, 1);
}
break;
}
@@ -431,7 +431,7 @@ WRITE8_MEMBER( multipcm_device::write )
switch(offset)
{
case 0: //Data write
- write_slot(m_slots + m_cur_slot, m_address, data);
+ write_slot(m_slots[m_cur_slot], m_address, data);
break;
case 1:
m_cur_slot = VALUE_TO_CHANNEL[data & 0x1f];
@@ -481,8 +481,8 @@ void multipcm_device::device_start()
m_stream = machine().sound().stream_alloc(*this, 0, 2, m_rate);
// Volume + pan table
- m_left_pan_table = auto_alloc_array_clear(machine(), int32_t, 0x800);
- m_right_pan_table = auto_alloc_array_clear(machine(), int32_t, 0x800);
+ m_left_pan_table = make_unique_clear<int32_t[]>(0x800);
+ m_right_pan_table = make_unique_clear<int32_t[]>(0x800);
for (int32_t level = 0; level < 0x80; ++level)
{
const float vol_db = (float)level * (-24.0f) / 64.0f;
@@ -535,7 +535,7 @@ void multipcm_device::device_start()
}
//Pitch steps
- m_freq_step_table = auto_alloc_array_clear(machine(), uint32_t, 0x400);
+ m_freq_step_table = make_unique_clear<uint32_t[]>(0x400);
for (int32_t i = 0; i < 0x400; ++i)
{
const float fcent = m_rate * (1024.0f + (float)i) / 1024.0f;
@@ -543,8 +543,8 @@ void multipcm_device::device_start()
}
// Envelope steps
- m_attack_step = auto_alloc_array_clear(machine(), uint32_t, 0x40);
- m_decay_release_step = auto_alloc_array_clear(machine(), uint32_t, 0x40);
+ m_attack_step = make_unique_clear<uint32_t[]>(0x40);
+ m_decay_release_step = make_unique_clear<uint32_t[]>(0x40);
const double attack_rate_to_decay_rate = 14.32833;
for (int32_t i = 4; i < 0x40; ++i)
{
@@ -557,12 +557,12 @@ void multipcm_device::device_start()
m_decay_release_step[0] = m_decay_release_step[1] = m_decay_release_step[2] = m_decay_release_step[3] = 0;
// Total level interpolation steps
- m_total_level_steps = auto_alloc_array_clear(machine(), int32_t, 2);
+ m_total_level_steps = make_unique_clear<int32_t[]>(2);
m_total_level_steps[0] = -(float)(0x80 << TL_SHIFT) / (78.2f * 44100.0f / 1000.0f); // lower
m_total_level_steps[1] = (float)(0x80 << TL_SHIFT) / (78.2f * 2 * 44100.0f / 1000.0f); // raise
// build the linear->exponential ramps
- m_linear_to_exp_volume = auto_alloc_array_clear(machine(), int32_t, 0x400);
+ m_linear_to_exp_volume = make_unique_clear<int32_t[]>(0x400);
for(int32_t i = 0; i < 0x400; ++i)
{
const float db = -(96.0f - (96.0f * (float)i / (float)0x400));
@@ -574,7 +574,7 @@ void multipcm_device::device_start()
save_item(NAME(m_address));
// Slots
- m_slots = auto_alloc_array_clear(machine(), slot_t, 28);
+ m_slots = make_unique_clear<slot_t[]>(28);
for (int32_t slot = 0; slot < 28; ++slot)
{
m_slots[slot].m_slot_index = slot;
@@ -663,41 +663,41 @@ void multipcm_device::sound_stream_update(sound_stream &stream, stream_sample_t
int32_t smpr = 0;
for (int32_t sl = 0; sl < 28; ++sl)
{
- slot_t *slot = m_slots + sl;
- if (slot->m_playing)
+ slot_t &slot = m_slots[sl];
+ if (slot.m_playing)
{
- uint32_t vol = (slot->m_total_level >> TL_SHIFT) | (slot->m_pan << 7);
- uint32_t adr = slot->m_offset >> TL_SHIFT;
- uint32_t step = slot->m_step;
- int32_t csample = (int16_t) (read_byte(slot->m_base + adr) << 8);
- int32_t fpart = slot->m_offset & ((1 << TL_SHIFT) - 1);
- int32_t sample = (csample * fpart + slot->m_prev_sample * ((1 << TL_SHIFT) - fpart)) >> TL_SHIFT;
-
- if (slot->m_regs[6] & 7) // Vibrato enabled
+ uint32_t vol = (slot.m_total_level >> TL_SHIFT) | (slot.m_pan << 7);
+ uint32_t adr = slot.m_offset >> TL_SHIFT;
+ uint32_t step = slot.m_step;
+ int32_t csample = (int16_t) (read_byte(slot.m_base + adr) << 8);
+ int32_t fpart = slot.m_offset & ((1 << TL_SHIFT) - 1);
+ int32_t sample = (csample * fpart + slot.m_prev_sample * ((1 << TL_SHIFT) - fpart)) >> TL_SHIFT;
+
+ if (slot.m_regs[6] & 7) // Vibrato enabled
{
- step = step * pitch_lfo_step(&(slot->m_pitch_lfo));
+ step = step * pitch_lfo_step(slot.m_pitch_lfo);
step >>= TL_SHIFT;
}
- slot->m_offset += step;
- if (slot->m_offset >= (slot->m_sample.m_end << TL_SHIFT))
+ slot.m_offset += step;
+ if (slot.m_offset >= (slot.m_sample.m_end << TL_SHIFT))
{
- slot->m_offset = slot->m_sample.m_loop << TL_SHIFT;
+ slot.m_offset = slot.m_sample.m_loop << TL_SHIFT;
}
- if (adr ^ (slot->m_offset >> TL_SHIFT))
+ if (adr ^ (slot.m_offset >> TL_SHIFT))
{
- slot->m_prev_sample = csample;
+ slot.m_prev_sample = csample;
}
- if ((slot->m_total_level >> TL_SHIFT) != slot->m_dest_total_level)
+ if ((slot.m_total_level >> TL_SHIFT) != slot.m_dest_total_level)
{
- slot->m_total_level += slot->m_total_level_step;
+ slot.m_total_level += slot.m_total_level_step;
}
- if (slot->m_regs[7] & 7) // Tremolo enabled
+ if (slot.m_regs[7] & 7) // Tremolo enabled
{
- sample = sample * amplitude_lfo_step(&(slot->m_amplitude_lfo));
+ sample = sample * amplitude_lfo_step(slot.m_amplitude_lfo);
sample >>= TL_SHIFT;
}
diff --git a/src/devices/sound/multipcm.h b/src/devices/sound/multipcm.h
index 7e8a38502a7..1072a1846ed 100644
--- a/src/devices/sound/multipcm.h
+++ b/src/devices/sound/multipcm.h
@@ -92,24 +92,24 @@ private:
// internal state
sound_stream *m_stream;
- slot_t *m_slots;
+ std::unique_ptr<slot_t[]> m_slots;
uint32_t m_cur_slot;
uint32_t m_address;
float m_rate;
- uint32_t *m_attack_step;
- uint32_t *m_decay_release_step; // Envelope step tables
- uint32_t *m_freq_step_table; // Frequency step table
+ std::unique_ptr<uint32_t[]> m_attack_step;
+ std::unique_ptr<uint32_t[]> m_decay_release_step; // Envelope step tables
+ std::unique_ptr<uint32_t[]> m_freq_step_table; // Frequency step table
- int32_t *m_left_pan_table;
- int32_t *m_right_pan_table;
- int32_t *m_linear_to_exp_volume;
- int32_t *m_total_level_steps;
+ std::unique_ptr<int32_t[]> m_left_pan_table;
+ std::unique_ptr<int32_t[]> m_right_pan_table;
+ std::unique_ptr<int32_t[]> m_linear_to_exp_volume;
+ std::unique_ptr<int32_t[]> m_total_level_steps;
- int32_t *m_pitch_table;
- int32_t **m_pitch_scale_tables;
- int32_t *m_amplitude_table;
- int32_t **m_amplitude_scale_tables;
+ std::unique_ptr<int32_t[]> m_pitch_table;
+ std::unique_ptr<std::unique_ptr<int32_t[]>[]> m_pitch_scale_tables;
+ std::unique_ptr<int32_t[]> m_amplitude_table;
+ std::unique_ptr<std::unique_ptr<int32_t[]>[]> m_amplitude_scale_tables;
uint32_t value_to_fixed(const uint32_t bits, const float value);
@@ -117,16 +117,16 @@ private:
// Internal LFO functions
void lfo_init();
- void lfo_compute_step(lfo_t *lfo, uint32_t lfo_frequency, uint32_t LFOS, int32_t amplitude_lfo);
- int32_t pitch_lfo_step(lfo_t *lfo);
- int32_t amplitude_lfo_step(lfo_t *lfo);
+ void lfo_compute_step(lfo_t &lfo, uint32_t lfo_frequency, uint32_t LFOS, int32_t amplitude_lfo);
+ int32_t pitch_lfo_step(lfo_t &lfo);
+ int32_t amplitude_lfo_step(lfo_t &lfo);
// Internal envelope functions
- int32_t envelope_generator_update(slot_t *slot);
- void envelope_generator_calc(slot_t *slot);
+ int32_t envelope_generator_update(slot_t &slot);
+ void envelope_generator_calc(slot_t &slot);
uint32_t get_rate(uint32_t *steps, uint32_t rate, uint32_t val);
- void write_slot(slot_t *slot, int32_t reg, uint8_t data);
+ void write_slot(slot_t &slot, int32_t reg, uint8_t data);
int16_t clamp_to_int16(int32_t value);
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
index 971b676374a..99cb29aa8b2 100644
--- a/src/devices/video/zeus2.cpp
+++ b/src/devices/video/zeus2.cpp
@@ -71,12 +71,12 @@ TIMER_CALLBACK_MEMBER(zeus2_device::int_timer_callback)
void zeus2_device::device_start()
{
/* allocate memory for "wave" RAM */
- waveram = auto_alloc_array(machine(), uint32_t, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
+ m_waveram = std::make_unique<uint32_t[]>(WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
m_frameColor = std::make_unique<uint32_t[]>(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
m_frameDepth = std::make_unique<int32_t[]>(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
/* initialize polygon engine */
- poly = auto_alloc(machine(), zeus2_renderer(this));
+ poly = std::make_unique<zeus2_renderer>(this);
m_vblank.resolve_safe();
m_irq.resolve_safe();
@@ -116,7 +116,7 @@ void zeus2_device::device_start()
save_item(NAME(zeus_texbase));
save_item(NAME(zeus_quad_size));
save_item(NAME(m_useZOffset));
- save_pointer(NAME(waveram), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / 4);
+ save_pointer(NAME(m_waveram), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / 4);
save_pointer(NAME(m_frameColor), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
save_pointer(NAME(m_frameDepth), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
save_item(NAME(m_pal_table));
@@ -171,7 +171,7 @@ void zeus2_device::device_stop()
myfile.open(fileName.c_str(), std::ios::out | std::ios::trunc | std::ios::binary);
if (myfile.is_open())
- myfile.write((char *)waveram, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 2 * sizeof(uint32_t));
+ myfile.write((char *)m_waveram.get(), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 2 * sizeof(uint32_t));
myfile.close();
#endif
@@ -1107,7 +1107,7 @@ if (subregdata_count[which] < 256)
{
//int blockNum = ((m_renderRegs[0x9] >> 16) * 1024 + (m_renderRegs[0x9] & 0xffff));
int blockNum = m_renderRegs[0x9];
- void *dataPtr = (void *)(&waveram[blockNum * 2]);
+ void *dataPtr = (void *)(&m_waveram[blockNum * 2]);
if (logit)
logerror("\t(R%02X) = %06x PAL Control Load Table Byte Addr = %08X", which, value, blockNum * 8);
m_curPalTableSrc = m_renderRegs[0x9];
diff --git a/src/devices/video/zeus2.h b/src/devices/video/zeus2.h
index 82ef892f667..a33d8f4e475 100644
--- a/src/devices/video/zeus2.h
+++ b/src/devices/video/zeus2.h
@@ -63,8 +63,8 @@ struct zeus2_poly_extra_data
* Macros
*************************************/
-#define WAVERAM_BLOCK0(blocknum) ((void *)((uint8_t *)waveram + 8 * (blocknum)))
-#define WAVERAM_BLOCK0_EXT(blocknum) ((void *)((uint8_t *)m_state->waveram + 8 * (blocknum)))
+#define WAVERAM_BLOCK0(blocknum) ((void *)((uint8_t *)m_waveram.get() + 8 * (blocknum)))
+#define WAVERAM_BLOCK0_EXT(blocknum) ((void *)((uint8_t *)m_state->m_waveram.get() + 8 * (blocknum)))
#define WAVERAM_PTR8(base, bytenum) ((uint8_t *)(base) + BYTE4_XOR_LE(bytenum))
#define WAVERAM_READ8(base, bytenum) (*WAVERAM_PTR8(base, bytenum))
@@ -124,7 +124,7 @@ public:
uint32_t m_zeusbase[0x80];
uint32_t m_renderRegs[0x50];
- zeus2_renderer* poly;
+ std::unique_ptr<zeus2_renderer> poly;
rectangle zeus_cliprect;
@@ -136,7 +136,7 @@ public:
int zeus_quad_size;
bool m_useZOffset;
- uint32_t *waveram;
+ std::unique_ptr<uint32_t[]> m_waveram;
std::unique_ptr<uint32_t[]> m_frameColor;
std::unique_ptr<int32_t[]> m_frameDepth;
uint32_t m_pal_table[0x100];
diff --git a/src/mame/drivers/aci_ggm.cpp b/src/mame/drivers/aci_ggm.cpp
index 976927445de..5814963e2c8 100644
--- a/src/mame/drivers/aci_ggm.cpp
+++ b/src/mame/drivers/aci_ggm.cpp
@@ -38,10 +38,9 @@ Other games:
TODO:
- what's VIA PB0 for? game toggles it once per irq
- identify XTAL (2MHz CPU/VIA is correct, compared to video reference)
-- add display AP segment, is it used anywhere?
+- confirm display AP segment, is it used anywhere?
- verify cartridge pinout, right now assume A0-A15 (max known cart size is 24KB).
Boris/Sargon cartridge is A0-A11 and 2 CS lines, Steinitz uses the whole range.
-- add option to auto-switch keypad overlays
- (probably won't) add chesspieces to artwork? this machine supports more board
games than just chess: checkers, reversi, and even a blackjack game
@@ -84,6 +83,7 @@ public:
void ggm(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); }
+ DECLARE_CUSTOM_INPUT_MEMBER(overlay_r) { u8 data = m_inputs[5]->read(); return (data == 0xf) ? m_overlay : data; }
protected:
virtual void machine_start() override;
@@ -97,7 +97,7 @@ private:
required_device<dac_bit_interface> m_dac;
required_device<generic_slot_device> m_cart;
required_device<timer_device> m_ca1_off;
- required_ioport_array<6> m_inputs;
+ required_ioport_array<4+3> m_inputs;
void main_map(address_map &map);
@@ -120,6 +120,7 @@ private:
u8 m_shift_data;
u8 m_shift_clock;
u32 m_cart_mask;
+ u8 m_overlay;
};
void ggm_state::machine_start()
@@ -177,6 +178,10 @@ DEVICE_IMAGE_LOAD_MEMBER(ggm_state::cartridge)
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+ // keypad overlay
+ std::string overlay(image.get_feature("overlay"));
+ m_overlay = std::stoul(overlay, nullptr, 0) & 0xf;
+
// extra ram (optional)
if (image.get_feature("ram"))
m_maincpu->space(AS_PROGRAM).install_ram(0x0800, 0x0fff, nullptr);
@@ -266,7 +271,7 @@ void ggm_state::main_map(address_map &map)
******************************************************************************/
#define OVERLAY(val) \
- PORT_CONDITION("IN.5", 0x01, EQUALS, val)
+ PORT_CONDITION("IN.6", 0x0f, EQUALS, val)
static INPUT_PORTS_START( overlay_boris ) // actually most of the Chess games have a similar overlay
PORT_MODIFY("IN.0")
@@ -298,6 +303,66 @@ static INPUT_PORTS_START( overlay_boris ) // actually most of the Chess games ha
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
INPUT_PORTS_END
+static INPUT_PORTS_START( overlay_morphy ) // only changed "9" to "Audio"
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_U) PORT_NAME("Audio")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_W) PORT_NAME("B/W")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_L) PORT_NAME("Level")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_I) PORT_NAME("Halt / Hint")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_S) PORT_NAME("Best")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_R) PORT_NAME("Restore")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x02) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( overlay_steinitz )
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Display / 0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("Audio / 9")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Review / Left / Right")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_W) PORT_NAME("B/W")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_T) PORT_NAME("Time / Change")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_L) PORT_NAME("Level")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_I) PORT_NAME("Halt / Hint / Look")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_S) PORT_NAME("Best / Score")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_R) PORT_NAME("Restore / Timing")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x03) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+INPUT_PORTS_END
+
static INPUT_PORTS_START( ggm )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_X) PORT_NAME("Keypad 4-2")
@@ -328,6 +393,8 @@ static INPUT_PORTS_START( ggm )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_B) PORT_NAME("Keypad 4-5")
PORT_INCLUDE( overlay_boris )
+ PORT_INCLUDE( overlay_morphy )
+ PORT_INCLUDE( overlay_steinitz )
PORT_START("IN.4")
PORT_CONFNAME( 0x01, 0x00, "Version" ) // factory-set
@@ -336,9 +403,15 @@ static INPUT_PORTS_START( ggm )
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, ggm_state, reset_switch, 0) PORT_NAME("Memory Switch")
PORT_START("IN.5")
- PORT_CONFNAME( 0x01, 0x01, "Keypad Overlay" )
+ PORT_CONFNAME( 0x0f, 0x0f, "Keypad Overlay" )
PORT_CONFSETTING( 0x00, "None" )
+ PORT_CONFSETTING( 0x0f, "Auto" ) // get param from softwarelist
PORT_CONFSETTING( 0x01, "Boris 2.5" )
+ PORT_CONFSETTING( 0x02, "Morphy" )
+ PORT_CONFSETTING( 0x03, "Steinitz" )
+
+ PORT_START("IN.6")
+ PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_CUSTOM_MEMBER(DEVICE_SELF, ggm_state, overlay_r, nullptr)
INPUT_PORTS_END
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index 108c584bdcd..b61de6e5090 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -4721,7 +4721,7 @@ ROM_START( gnw_bfight )
ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) )
ROM_REGION( 0x100, "maincpu:melody", 0 )
- ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(aadc22a1) SHA1(f6e5572232eb9e83f6833073e1e1e99776245c50) ) // decap needed for verification
+ ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // decap needed for verification
ROM_REGION( 558341, "screen", 0)
ROM_LOAD( "gnw_bfight.svg", 0, 558341, CRC(f0d61fe8) SHA1(b0b56224a967e4b26836c0f7e3015d13b42ae5cc) )
diff --git a/src/mame/includes/midzeus.h b/src/mame/includes/midzeus.h
index c94f86fea88..b33f7481b45 100644
--- a/src/mame/includes/midzeus.h
+++ b/src/mame/includes/midzeus.h
@@ -12,9 +12,58 @@
#include "emupal.h"
#include "screen.h"
#include "machine/midwayic.h"
+#include "video/poly.h"
+
+/*************************************
+ *
+ * Type definitions
+ *
+ *************************************/
+
+struct mz_poly_extra_data
+{
+ const void * palbase;
+ const void * texbase;
+ uint16_t solidcolor;
+ uint16_t voffset;
+ int16_t zoffset;
+ uint16_t transcolor;
+ uint16_t texwidth;
+ uint16_t color;
+ uint32_t alpha;
+ uint32_t ctrl_word;
+ bool blend_enable;
+ bool depth_test_enable;
+ bool depth_write_enable;
+ uint32_t blend;
+ uint8_t (*get_texel)(const void *, int, int, int);
+};
+
+
+class midzeus_state;
+
+class midzeus_renderer : public poly_manager<float, mz_poly_extra_data, 4, 10000>
+{
+public:
+ midzeus_renderer(midzeus_state &state);
+
+ void render_poly(int32_t scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
+ void render_poly_solid_fixedz(int32_t scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
+
+ void zeus_draw_quad(int long_fmt, const uint32_t *databuffer, uint32_t texdata, bool logit);
+ void zeus_draw_debug_quad(const rectangle& rect, const vertex_t* vert);
+
+private:
+ midzeus_state& m_state;
+};
+
+typedef midzeus_renderer::vertex_t poly_vertex;
+
class midzeus_state : public driver_device
{
+ friend class midzeus_renderer;
+
public:
midzeus_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
@@ -127,4 +176,33 @@ private:
void log_fifo_command(const uint32_t *data, int numwords, const char *suffix);
void log_waveram(uint32_t length_and_base);
void update_gun_irq();
+
+ void *waveram0_ptr_from_block_addr(uint32_t addr);
+ void *waveram0_ptr_from_expanded_addr(uint32_t addr);
+ void *waveram1_ptr_from_expanded_addr(uint32_t addr);
+ void *waveram0_ptr_from_texture_addr(uint32_t addr, int width);
+ void waveram_plot_depth(int y, int x, uint16_t color, uint16_t depth);
+ void waveram_plot(int y, int x, uint16_t color);
+ void waveram_plot_check_depth(int y, int x, uint16_t color, uint16_t depth);
+ void waveram_plot_check_depth_nowrite(int y, int x, uint16_t color, uint16_t depth);
+
+ std::unique_ptr<midzeus_renderer> m_poly;
+ uint8_t m_log_fifo;
+
+ uint32_t m_zeus_fifo[20];
+ uint8_t m_zeus_fifo_words;
+ int16_t m_zeus_matrix[3][3];
+ int32_t m_zeus_point[3];
+ int16_t m_zeus_light[3];
+ void *m_zeus_renderbase;
+ uint32_t m_zeus_palbase;
+ uint32_t m_zeus_unkbase;
+ int m_zeus_enable_logging;
+ uint32_t m_zeus_objdata;
+ rectangle m_zeus_cliprect;
+
+ std::unique_ptr<uint32_t[]> m_waveram[2];
+ int m_yoffs;
+ int m_texel_width;
+ int m_is_mk4b;
};
diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h
index 361e42ed672..be4c1baca19 100644
--- a/src/mame/includes/model1.h
+++ b/src/mame/includes/model1.h
@@ -390,11 +390,11 @@ private:
};
std::unique_ptr<view_t> m_view;
- point_t *m_pointdb;
+ std::unique_ptr<point_t[]> m_pointdb;
point_t *m_pointpt;
- quad_t *m_quaddb;
+ std::unique_ptr<quad_t[]> m_quaddb;
quad_t *m_quadpt;
- quad_t **m_quadind;
+ std::unique_ptr<quad_t *[]> m_quadind;
offs_t m_pushpc;
u32 m_copro_hle_active_list_pos, m_copro_hle_active_list_length;
typedef void (model1_state::*tgp_func)();
diff --git a/src/mame/includes/model2.h b/src/mame/includes/model2.h
index dbcecfd7abc..bd8f437a753 100644
--- a/src/mame/includes/model2.h
+++ b/src/mame/includes/model2.h
@@ -71,7 +71,7 @@ public:
std::unique_ptr<uint16_t[]> m_colorxlat;
std::unique_ptr<uint16_t[]> m_lumaram;
uint8_t m_gamma_table[256];
- model2_renderer *m_poly;
+ std::unique_ptr<model2_renderer> m_poly;
/* Public for access by the ioports */
DECLARE_CUSTOM_INPUT_MEMBER(daytona_gearbox_r);
@@ -139,8 +139,8 @@ protected:
uint32_t m_geo_read_start_address;
uint32_t m_geo_write_start_address;
- raster_state *m_raster;
- geo_state *m_geo;
+ std::unique_ptr<raster_state> m_raster;
+ std::unique_ptr<geo_state> m_geo;
bitmap_rgb32 m_sys24_bitmap;
// uint32_t m_soundack;
void model2_check_irq_state();
@@ -760,4 +760,59 @@ struct quad_m2
uint8_t luma;
};
+/*******************************************
+ *
+ * Hardware 3D Rasterizer Internal State
+ *
+ *******************************************/
+
+#define MAX_TRIANGLES 32768
+
+struct raster_state
+{
+// uint32_t mode; /* bit 0 = Test Mode, bit 2 = Switch 60Hz(1)/30Hz(0) operation */
+ uint16_t *texture_rom; /* Texture ROM pointer */
+ uint32_t texture_rom_mask; /* Texture ROM mask */
+ int16_t viewport[4]; /* View port (startx,starty,endx,endy) */
+ int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */
+ uint16_t center_sel; /* Selected center */
+ uint32_t reverse; /* Left/Right Reverse */
+ float z_adjust; /* ZSort Mode */
+ float triangle_z; /* Current Triangle z value */
+ uint8_t master_z_clip; /* Master Z-Clip value */
+ uint32_t cur_command; /* Current command */
+ uint32_t command_buffer[32]; /* Command buffer */
+ uint32_t command_index; /* Command buffer index */
+ triangle tri_list[MAX_TRIANGLES]; /* Triangle list */
+ uint32_t tri_list_index; /* Triangle list index */
+ triangle *tri_sorted_list[0x10000]; /* Sorted Triangle list */
+ uint16_t min_z; /* Minimum sortable Z value */
+ uint16_t max_z; /* Maximum sortable Z value */
+ uint16_t texture_ram[0x10000]; /* Texture RAM pointer */
+ uint8_t log_ram[0x40000]; /* Log RAM pointer */
+};
+
+/*******************************************
+ *
+ * Geometry Engine Internal State
+ *
+ *******************************************/
+
+struct geo_state
+{
+ raster_state * raster;
+ uint32_t mode; /* bit 0 = Enable Specular, bit 1 = Calculate Normals */
+ uint32_t * polygon_rom; /* Polygon ROM pointer */
+ uint32_t polygon_rom_mask; /* Polygon ROM mask */
+ float matrix[12]; /* Current Transformation Matrix */
+ poly_vertex focus; /* Focus (x,y) */
+ poly_vertex light; /* Light Vector */
+ float lod; /* LOD */
+ float coef_table[32]; /* Distane Coefficient table */
+ texture_parameter texture_parameters[32]; /* Texture parameters */
+ uint32_t polygon_ram0[0x8000]; /* Fast Polygon RAM pointer */
+ uint32_t polygon_ram1[0x8000]; /* Slow Polygon RAM pointer */
+ model2_state *state;
+};
+
#endif // MAME_INCLUDES_MODEL2_H
diff --git a/src/mame/includes/slapshot.h b/src/mame/includes/slapshot.h
index c39c55de977..9463402b898 100644
--- a/src/mame/includes/slapshot.h
+++ b/src/mame/includes/slapshot.h
@@ -81,7 +81,7 @@ private:
optional_ioport m_io_service;
/* video-related */
- slapshot_tempsprite *m_spritelist;
+ std::unique_ptr<slapshot_tempsprite[]> m_spritelist;
bool m_sprites_disabled;
s32 m_sprites_active_area;
s32 m_sprites_master_scrollx;
diff --git a/src/mame/includes/taito_f3.h b/src/mame/includes/taito_f3.h
index 00e0f44cd82..2b2cb2758c0 100644
--- a/src/mame/includes/taito_f3.h
+++ b/src/mame/includes/taito_f3.h
@@ -13,6 +13,8 @@
#include "screen.h"
#include "tilemap.h"
+struct F3config;
+
/* This it the best way to allow game specific kludges until the system is fully understood */
enum {
/* Early F3 class games, these are not cartridge games and system features may be different */
@@ -276,11 +278,11 @@ protected:
u8 *m_tsrc_s[5];
u32 m_x_count[5];
u32 m_x_zoom[5];
- struct tempsprite *m_spritelist;
- const struct tempsprite *m_sprite_end;
- struct f3_playfield_line_inf *m_pf_line_inf;
- struct f3_spritealpha_line_inf *m_sa_line_inf;
- const struct F3config *m_game_config;
+ std::unique_ptr<tempsprite[]> m_spritelist;
+ const tempsprite *m_sprite_end;
+ std::unique_ptr<f3_playfield_line_inf[]> m_pf_line_inf;
+ std::unique_ptr<f3_spritealpha_line_inf[]> m_sa_line_inf;
+ const F3config *m_game_config;
int (taito_f3_state::*m_dpix_n[8][16])(u32 s_pix);
int (taito_f3_state::**m_dpix_lp[5])(u32 s_pix);
int (taito_f3_state::**m_dpix_sp[9])(u32 s_pix);
@@ -371,8 +373,8 @@ protected:
inline void dpix_1_sprite(u32 s_pix);
inline void dpix_bg(u32 bgcolor);
void init_alpha_blend_func();
- inline void draw_scanlines(bitmap_rgb32 &bitmap, int xsize, s16 *draw_line_num, const struct f3_playfield_line_inf **line_t, const int *sprite, u32 orient, int skip_layer_num);
- void visible_tile_check(struct f3_playfield_line_inf *line_t, int line, u32 x_index_fx, u32 y_index, u16 *pf_data_n);
+ inline void draw_scanlines(bitmap_rgb32 &bitmap, int xsize, s16 *draw_line_num, const f3_playfield_line_inf **line_t, const int *sprite, u32 orient, int skip_layer_num);
+ void visible_tile_check(f3_playfield_line_inf *line_t, int line, u32 x_index_fx, u32 y_index, u16 *pf_data_n);
void calculate_clip(int y, u16 pri, u32* clip0, u32* clip1, int *line_enable);
void get_spritealphaclip_info();
void get_line_ram_info(tilemap_t *tmap, int sx, int sy, int pos, u16 *pf_data_n);
diff --git a/src/mame/layout/aci_ggm.lay b/src/mame/layout/aci_ggm.lay
index 60a53704335..f51f070d9a5 100644
--- a/src/mame/layout/aci_ggm.lay
+++ b/src/mame/layout/aci_ggm.lay
@@ -5,9 +5,16 @@
<!-- define elements -->
+ <element name="blackb"><rect><color red="0" green="0" blue="0" /></rect></element>
<element name="black"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
<element name="disk_white"><disk><color red="0.73" green="0.73" blue="0.73" /></disk></element>
<element name="brown"><rect><color red="0.25" green="0.1" blue="0.05" /></rect></element>
+ <element name="yellow"><rect><color red="0.8" green="0.7" blue="0.4" /></rect></element>
+
+ <element name="red_s3" defstate="0"><rect state="3"><color red="0.8" green="0.1" blue="0.15" /></rect></element>
+ <element name="green_s3" defstate="0"><rect state="3"><color red="0.3" green="0.8" blue="0.2" /></rect></element>
+ <element name="brown_s3" defstate="0"><rect state="3"><color red="0.25" green="0.1" blue="0.05" /></rect></element>
+ <element name="brown_nb" defstate="0xf"><rect state="0"><color red="0.25" green="0.1" blue="0.05" /></rect></element>
<element name="digit" defstate="0">
<led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
@@ -42,118 +49,99 @@
<rect state="1"><color red="0" green="0" blue="0" /></rect>
</element>
+ <element name="nothing" defstate="0"><text string=" "/></element>
+
<element name="text_r1"><text string="MEM"><color red="0.3" green="0.3" blue="0.3" /></text></element>
<element name="text_r2"><text string="ON"><color red="0.3" green="0.3" blue="0.3" /></text></element>
- <element name="text_boris01">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="RESTORE"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris02">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="G.7"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris03">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="H.8"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris04">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="9"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris05">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="CE"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris06a">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="HALT /" align="1"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris06b">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="HINT" align="1"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris07">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="D.4"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris08">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="E.5"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris09">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="F.6"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris10">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="TIME"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris11">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string=".BEST"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris12">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="A.1"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris13">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="B.2"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris14">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="C.3"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris15">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="RANK"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris16">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="LEVEL"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris17">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="0"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris18">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="-"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris19">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="B/W"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
- <element name="text_boris20">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="ENTER"><color red="0.8" green="0.7" blue="0.4" /></text>
- </element>
+ <element name="text_boris01" defstate="0"><text state="1" string="RESTORE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris02" defstate="0"><text state="1" string="G.7"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris03" defstate="0"><text state="1" string="H.8"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris04" defstate="0"><text state="1" string="9"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris05" defstate="0"><text state="1" string="CE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris06a" defstate="0"><text state="1" string="HALT /" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris06b" defstate="0"><text state="1" string="HINT" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris07" defstate="0"><text state="1" string="D.4"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris08" defstate="0"><text state="1" string="E.5"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris09" defstate="0"><text state="1" string="F.6"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris10" defstate="0"><text state="1" string="TIME"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris11" defstate="0"><text state="1" string=".BEST"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris12" defstate="0"><text state="1" string="A.1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris13" defstate="0"><text state="1" string="B.2"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris14" defstate="0"><text state="1" string="C.3"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris15" defstate="0"><text state="1" string="RANK"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris16" defstate="0"><text state="1" string="LEVEL"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris17" defstate="0"><text state="1" string="0"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris18" defstate="0"><text state="1" string="-"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris19" defstate="0"><text state="1" string="B/W"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_boris20" defstate="0"><text state="1" string="ENTER"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+
+ <element name="text_morphy01" defstate="0"><text state="2" string="RESTORE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy02" defstate="0"><text state="2" string="G.7"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy03" defstate="0"><text state="2" string="H.8"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy04" defstate="0"><text state="2" string="AUDIO"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy05" defstate="0"><text state="2" string="CE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy06a" defstate="0"><text state="2" string="HALT /" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy06b" defstate="0"><text state="2" string="HINT" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy07" defstate="0"><text state="2" string="D.4"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy08" defstate="0"><text state="2" string="E.5"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy09" defstate="0"><text state="2" string="F.6"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy10" defstate="0"><text state="2" string="TIME"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy11" defstate="0"><text state="2" string=".BEST"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy12" defstate="0"><text state="2" string="A.1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy13" defstate="0"><text state="2" string="B.2"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy14" defstate="0"><text state="2" string="C.3"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy15" defstate="0"><text state="2" string="RANK"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy16" defstate="0"><text state="2" string="LEVEL"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy17" defstate="0"><text state="2" string="0"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy18" defstate="0"><text state="2" string="-"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy19" defstate="0"><text state="2" string="B/W"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_morphy20" defstate="0"><text state="2" string="ENTER"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+
+ <element name="text_steinitz01a" defstate="0"><text state="3" string="RESTORE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz01b" defstate="0"><text state="3" string="TIMING"><color red="0.05" green="0.7" blue="0.15" /></text></element>
+ <element name="text_steinitz02" defstate="0"><text state="3" string="G.7"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz03" defstate="0"><text state="3" string="H.8"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz04a" defstate="0"><text state="3" string="AUDIO"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz04b" defstate="0"><text state="3" string="9"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz05" defstate="0"><text state="3" string="CE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz06a" defstate="0"><text state="3" string="HALT /" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz06b" defstate="0"><text state="3" string="HINT" align="1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz06c" defstate="0"><text state="3" string="LOOK"><color red="0.05" green="0.7" blue="0.15" /></text></element>
+ <element name="text_steinitz07" defstate="0"><text state="3" string="D.4"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz08" defstate="0"><text state="3" string="E.5"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz09" defstate="0"><text state="3" string="F.6"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz10a" defstate="0"><text state="3" string="TIME"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz10b" defstate="0"><text state="3" string="CHANGE"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz11a" defstate="0"><text state="3" string="BEST"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz11b" defstate="0"><text state="3" string="SCORE"><color red="0.05" green="0.7" blue="0.15" /></text></element>
+ <element name="text_steinitz12" defstate="0"><text state="3" string="A.1"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz13" defstate="0"><text state="3" string="B.2"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz14" defstate="0"><text state="3" string="C.3"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz15" defstate="0"><text state="3" string="RANK"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz16" defstate="0"><text state="3" string="LEVEL"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz17a" defstate="0"><text state="3" string="DISPLAY"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz17b" defstate="0"><text state="3" string="0"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz18a" defstate="0"><text state="3" string="&#x2190;"><color red="0.05" green="0.7" blue="0.15" /></text></element>
+ <element name="text_steinitz18b" defstate="0"><text state="3" string="&#x2192;"><color red="0.55" green="0.0" blue="0.1" /></text></element>
+ <element name="text_steinitz18c" defstate="0"><text state="3" string="REVIEW"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz19" defstate="0"><text state="3" string="B/W"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+ <element name="text_steinitz20" defstate="0"><text state="3" string="ENTER"><color red="0.55" green="0.6" blue="0.35" /></text></element>
+
+ <element name="digitp" defstate="9224"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+ <element name="digitn" defstate="3244"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+ <element name="digitb" defstate="14398"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+ <element name="digitr" defstate="510"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+ <element name="digitq" defstate="7132"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+ <element name="digitk" defstate="7166"><led14seg><color red="0.75" green="0.1" blue="0.15" /></led14seg></element>
+
+ <element name="digitpi" defstate="7159"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
+ <element name="digitni" defstate="13139"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
+ <element name="digitbi" defstate="1985"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
+ <element name="digitri" defstate="15873"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
+ <element name="digitqi" defstate="9251"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
+ <element name="digitki" defstate="9217"><led14seg><color red="0" green="0" blue="0.0" /></led14seg></element>
- <element name="text_borisp">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[P]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
- <element name="text_borisn">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[N]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
- <element name="text_borisb">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[B]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
- <element name="text_borisr">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[R]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
- <element name="text_borisq">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[Q]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
- <element name="text_borisk">
- <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
- <text string="[K]"><color red="0.8" green="0.1" blue="0.15" /></text>
- </element>
<!-- groups -->
@@ -176,80 +164,204 @@
</repeat>
</group>
- <group name="buttons_base">
+
+ <group name="buttons">
<bounds x="0" y="0" width="19.5" height="13.5" />
+ <!-- input listeners -->
+ <element ref="nothing" inputtag="IN.3" inputmask="0x08"><bounds x="0" y="0" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.1" inputmask="0x04"><bounds x="4" y="0" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.1" inputmask="0x08"><bounds x="8" y="0" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.1" inputmask="0x10"><bounds x="12" y="0" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.2" inputmask="0x10"><bounds x="16" y="0" width="3.5" height="3" /></element>
+
+ <element ref="nothing" inputtag="IN.3" inputmask="0x02"><bounds x="0" y="3.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.0" inputmask="0x10"><bounds x="4" y="3.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.1" inputmask="0x01"><bounds x="8" y="3.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.1" inputmask="0x02"><bounds x="12" y="3.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.2" inputmask="0x08"><bounds x="16" y="3.5" width="3.5" height="3" /></element>
+
+ <element ref="nothing" inputtag="IN.3" inputmask="0x04"><bounds x="0" y="7" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.0" inputmask="0x02"><bounds x="4" y="7" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.0" inputmask="0x04"><bounds x="8" y="7" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.0" inputmask="0x08"><bounds x="12" y="7" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.2" inputmask="0x04"><bounds x="16" y="7" width="3.5" height="3" /></element>
+
+ <element ref="nothing" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="10.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.0" inputmask="0x01"><bounds x="4" y="10.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.2" inputmask="0x01"><bounds x="8" y="10.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.2" inputmask="0x02"><bounds x="12" y="10.5" width="3.5" height="3" /></element>
+ <element ref="nothing" inputtag="IN.3" inputmask="0x10"><bounds x="16" y="10.5" width="3.5" height="3" /></element>
+
+ <!-- buttons base -->
<repeat count="4">
<param name="y" start="0" increment="3.5" />
<repeat count="5">
<param name="x" start="0" increment="4" />
- <bezel element="~basecolor~"><bounds x="~x~" y="~y~" width="3.5" height="3" /></bezel>
+ <element ref="yellow"><bounds x="~x~" y="~y~" width="3.5" height="3" /></element>
</repeat>
</repeat>
- </group>
-
- <group name="buttons_boris">
- <bounds x="0" y="0" width="19.5" height="13.5" />
- <bezel element="text_boris01"><bounds x="0.1" y="0.9" width="3.3" height="1" /></bezel>
- <bezel element="text_boris02"><bounds x="4.1" y="0.01" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris03"><bounds x="8.1" y="0.01" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris04"><bounds x="12.1" y="0.4" width="3.3" height="1.9" /></bezel>
- <bezel element="text_boris05"><bounds x="16.1" y="0.6" width="3.3" height="1.5" /></bezel>
-
- <bezel element="text_boris06a"><bounds x="0.6" y="4.0" width="2.8" height="1" /></bezel>
- <bezel element="text_boris06b"><bounds x="0.6" y="5.0" width="2.8" height="1" /></bezel>
- <bezel element="text_boris07"><bounds x="4.1" y="3.51" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris08"><bounds x="8.1" y="3.51" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris09"><bounds x="12.1" y="3.51" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris10"><bounds x="16.1" y="4.4" width="3.3" height="1" /></bezel>
-
- <bezel element="text_boris11"><bounds x="0.1" y="7.9" width="3.3" height="1" /></bezel>
- <bezel element="text_boris12"><bounds x="4.1" y="7.01" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris13"><bounds x="8.1" y="7.01" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris14"><bounds x="12.1" y="7.01" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris15"><bounds x="16.1" y="7.9" width="3.3" height="1" /></bezel>
-
- <bezel element="text_boris16"><bounds x="0.1" y="11.4" width="3.3" height="1" /></bezel>
- <bezel element="text_boris17"><bounds x="4.1" y="10.9" width="3.3" height="1.9" /></bezel>
- <bezel element="text_boris18"><bounds x="8.1" y="10.9" width="3.3" height="1.9" /></bezel>
- <bezel element="text_boris19"><bounds x="12.1" y="11.1" width="3.3" height="1.5" /></bezel>
- <bezel element="text_boris20"><bounds x="16.1" y="11.4" width="3.3" height="1" /></bezel>
-
- <bezel element="text_borisp"><bounds x="4.1" y="8.3" width="3.3" height="1.5" /></bezel>
- <bezel element="text_borisn"><bounds x="8.1" y="8.3" width="3.3" height="1.5" /></bezel>
- <bezel element="text_borisb"><bounds x="12.1" y="8.3" width="3.3" height="1.5" /></bezel>
- <bezel element="text_borisr"><bounds x="4.1" y="4.8" width="3.3" height="1.5" /></bezel>
- <bezel element="text_borisq"><bounds x="8.1" y="4.8" width="3.3" height="1.5" /></bezel>
- <bezel element="text_borisk"><bounds x="12.1" y="4.8" width="3.3" height="1.5" /></bezel>
- </group>
-
- <group name="buttons_click">
- <bounds x="0" y="0" width="19.5" height="13.5" />
+ <repeat count="4">
+ <param name="y" start="0.15" increment="3.5" />
+ <repeat count="5">
+ <param name="x" start="0.15" increment="4" />
+ <element ref="brown"><bounds x="~x~" y="~y~" width="3.2" height="2.7" /></element>
+ </repeat>
+ </repeat>
- <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="0" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="4" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="8" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.1" inputmask="0x10"><bounds x="12" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.2" inputmask="0x10"><bounds x="16" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
-
- <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="0" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="4" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="8" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="12" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="16" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
-
- <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="0" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="4" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="8" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="12" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="16" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
-
- <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="4" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="8" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="12" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
- <bezel element="hl" inputtag="IN.3" inputmask="0x10"><bounds x="16" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <!-- chess symbols -->
+ <element ref="blackb"><bounds x="5.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="blackb"><bounds x="9.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="blackb"><bounds x="13.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="blackb"><bounds x="5.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="blackb"><bounds x="9.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="blackb"><bounds x="13.25" y="8.35" width="1" height="1.3" /></element>
+
+ <element name="digitr" ref="digitr"><bounds x="5.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitq" ref="digitq"><bounds x="9.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitk" ref="digitk"><bounds x="13.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitp" ref="digitp"><bounds x="5.25" y="8.35" width="1" height="1.3" /></element>
+ <element name="digitn" ref="digitn"><bounds x="9.25" y="8.35" width="1" height="1.3" /></element>
+ <element name="digitb" ref="digitb"><bounds x="13.25" y="8.35" width="1" height="1.3" /></element>
+
+ <element name="digitri" ref="digitri"><bounds x="5.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitqi" ref="digitqi"><bounds x="9.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitki" ref="digitki"><bounds x="13.25" y="4.85" width="1" height="1.3" /></element>
+ <element name="digitpi" ref="digitpi"><bounds x="5.25" y="8.35" width="1" height="1.3" /></element>
+ <element name="digitni" ref="digitni"><bounds x="9.25" y="8.35" width="1" height="1.3" /></element>
+ <element name="digitbi" ref="digitbi"><bounds x="13.25" y="8.35" width="1" height="1.3" /></element>
+
+ <element ref="brown" blend="add"><bounds x="5.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown" blend="add"><bounds x="9.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown" blend="add"><bounds x="13.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown" blend="add"><bounds x="5.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="brown" blend="add"><bounds x="9.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="brown" blend="add"><bounds x="13.25" y="8.35" width="1" height="1.3" /></element>
+
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="5.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="9.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="13.25" y="4.85" width="1" height="1.3" /></element>
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="5.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="9.25" y="8.35" width="1" height="1.3" /></element>
+ <element ref="brown_nb" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="13.25" y="8.35" width="1" height="1.3" /></element>
+
+ <!-- boris overlay -->
+ <element ref="text_boris01" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="1.0" width="3.3" height="0.8" /></element>
+ <element ref="text_boris02" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_boris03" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_boris04" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="0.5" width="3.3" height="1.7" /></element>
+ <element ref="text_boris05" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="0.7" width="3.3" height="1.3" /></element>
+
+ <element ref="text_boris06a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="4.25" width="2.8" height="0.8" /></element>
+ <element ref="text_boris06b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="4.95" width="2.8" height="0.8" /></element>
+ <element ref="text_boris07" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_boris08" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_boris09" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_boris10" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="4.5" width="3.3" height="0.8" /></element>
+
+ <element ref="text_boris11" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="8.0" width="3.3" height="0.8" /></element>
+ <element ref="text_boris12" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_boris13" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_boris14" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_boris15" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="8.0" width="3.3" height="0.8" /></element>
+
+ <element ref="text_boris16" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="11.5" width="3.3" height="0.8" /></element>
+ <element ref="text_boris17" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="11.0" width="3.3" height="1.7" /></element>
+ <element ref="text_boris18" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="11.0" width="3.3" height="1.7" /></element>
+ <element ref="text_boris19" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="11.2" width="3.3" height="1.3" /></element>
+ <element ref="text_boris20" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="11.5" width="3.3" height="0.8" /></element>
+
+ <!-- morphy overlay -->
+ <element ref="text_morphy01" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="1.0" width="3.3" height="0.8" /></element>
+ <element ref="text_morphy02" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy03" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy04" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="1.0" width="3.3" height="0.8" /></element>
+ <element ref="text_morphy05" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="0.7" width="3.3" height="1.3" /></element>
+
+ <element ref="text_morphy06a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="4.25" width="2.8" height="0.8" /></element>
+ <element ref="text_morphy06b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="4.95" width="2.8" height="0.8" /></element>
+ <element ref="text_morphy07" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy08" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy09" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy10" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="4.5" width="3.3" height="0.8" /></element>
+
+ <element ref="text_morphy11" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="8.0" width="3.3" height="0.8" /></element>
+ <element ref="text_morphy12" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy13" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy14" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy15" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="8.0" width="3.3" height="0.8" /></element>
+
+ <element ref="text_morphy16" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="11.5" width="3.3" height="0.8" /></element>
+ <element ref="text_morphy17" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="11.0" width="3.3" height="1.7" /></element>
+ <element ref="text_morphy18" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="11.0" width="3.3" height="1.7" /></element>
+ <element ref="text_morphy19" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="11.2" width="3.3" height="1.3" /></element>
+ <element ref="text_morphy20" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="11.5" width="3.3" height="0.8" /></element>
+
+ <!-- steinitz overlay -->
+ <element ref="red_s3" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="16.15" y="7.15" width="3.2" height="2.7" /></element>
+ <element ref="brown_s3" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="16.3" y="7.3" width="2.9" height="2.4" /></element>
+
+ <element ref="green_s3" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="0.15" y="10.65" width="3.2" height="2.7" /></element>
+ <element ref="brown_s3" inputtag="IN.6" inputmask="0x0f" inputraw="1"><bounds x="0.3" y="10.8" width="2.9" height="2.4" /></element>
+
+ <element ref="text_steinitz01a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="0.5" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz01b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="1.5" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz02" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz03" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="0.1" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz04a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="0.5" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz04b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="1.5" width="3.3" height="1.1" /></element>
+ <element ref="text_steinitz05" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="0.7" width="3.3" height="1.3" /></element>
+
+ <element ref="text_steinitz06a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="3.75" width="2.8" height="0.8" /></element>
+ <element ref="text_steinitz06b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.9" y="4.45" width="2.8" height="0.8" /></element>
+ <element ref="text_steinitz06c" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="5.4" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz07" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz08" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz09" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="3.6" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz10a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="4.0" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz10b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="5.0" width="3.3" height="0.8" /></element>
+
+ <element ref="text_steinitz11a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="7.5" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz11b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="8.5" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz12" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz13" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz14" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="7.1" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz15" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="8.0" width="3.3" height="0.8" /></element>
+
+ <element ref="text_steinitz16" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="0.1" y="11.0" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz17a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="11.0" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz17b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="4.1" y="12.0" width="3.3" height="1.1" /></element>
+ <element ref="text_steinitz18a" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="10.25" width="3.3" height="1.5" /></element>
+ <element ref="text_steinitz18b" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="10.8" width="3.3" height="1.5" /></element>
+ <element ref="text_steinitz18c" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="8.1" y="12.2" width="3.3" height="0.8" /></element>
+ <element ref="text_steinitz19" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="12.1" y="11.2" width="3.3" height="1.3" /></element>
+ <element ref="text_steinitz20" inputtag="IN.6" inputmask="0x0f" inputraw="1" blend="add"><bounds x="16.1" y="11.5" width="3.3" height="0.8" /></element>
+
+ <!-- input highlights -->
+ <element ref="hl" inputtag="IN.3" inputmask="0x08"><bounds x="0" y="0" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.1" inputmask="0x04"><bounds x="4" y="0" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.1" inputmask="0x08"><bounds x="8" y="0" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.1" inputmask="0x10"><bounds x="12" y="0" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.2" inputmask="0x10"><bounds x="16" y="0" width="3.5" height="3" /><color alpha="0.22" /></element>
+
+ <element ref="hl" inputtag="IN.3" inputmask="0x02"><bounds x="0" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.0" inputmask="0x10"><bounds x="4" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.1" inputmask="0x01"><bounds x="8" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.1" inputmask="0x02"><bounds x="12" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.2" inputmask="0x08"><bounds x="16" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+
+ <element ref="hl" inputtag="IN.3" inputmask="0x04"><bounds x="0" y="7" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.0" inputmask="0x02"><bounds x="4" y="7" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.0" inputmask="0x04"><bounds x="8" y="7" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.0" inputmask="0x08"><bounds x="12" y="7" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.2" inputmask="0x04"><bounds x="16" y="7" width="3.5" height="3" /><color alpha="0.22" /></element>
+
+ <element ref="hl" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.0" inputmask="0x01"><bounds x="4" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.2" inputmask="0x01"><bounds x="8" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.2" inputmask="0x02"><bounds x="12" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></element>
+ <element ref="hl" inputtag="IN.3" inputmask="0x10"><bounds x="16" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></element>
</group>
<group name="mem_switch">
@@ -264,26 +376,12 @@
<!-- build screen -->
- <view name="Internal Layout, Boris 2.5">
- <bounds left="-5" right="104" top="-2" bottom="93" />
- <group ref="display"><bounds x="0" y="0" width="88" height="19" /></group>
- <bezel element="black"><bounds x="-6" y="23" width="111" height="1.5" /></bezel>
-
- <param name="basecolor" value="brown" />
- <group ref="buttons_base"><bounds x="0" y="30" width="88" height="60.92" /></group>
- <group ref="buttons_boris"><bounds x="0" y="30" width="88" height="60.92" /></group>
- <group ref="buttons_click"><bounds x="0" y="30" width="88" height="60.92" /></group>
- <group ref="mem_switch"><bounds x="87" y="28" width="18" height="19.2" /></group>
- </view>
-
- <view name="Internal Layout, No Overlay">
+ <view name="Internal Layout">
<bounds left="-5" right="104" top="-2" bottom="93" />
<group ref="display"><bounds x="0" y="0" width="88" height="19" /></group>
<bezel element="black"><bounds x="-6" y="23" width="111" height="1.5" /></bezel>
- <param name="basecolor" value="brown" />
- <group ref="buttons_base"><bounds x="0" y="30" width="88" height="60.92" /></group>
- <group ref="buttons_click"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="buttons"><bounds x="0" y="30" width="88" height="60.92" /></group>
<group ref="mem_switch"><bounds x="87" y="28" width="18" height="19.2" /></group>
</view>
diff --git a/src/mame/nl.lst b/src/mame/nl.lst
index 9bc09a6cdbc..06b9c762942 100644
--- a/src/mame/nl.lst
+++ b/src/mame/nl.lst
@@ -66,9 +66,6 @@ popeyeu // (c) 1982
popeyef // (c) 1982
popeyebl // bootleg
-@source:aci_prodigy.cpp
-prodigy // ACI Destiny Prodigy, 1981
-
@source:testpat.cpp
tp1983
tp1985
diff --git a/src/mame/video/midzeus.cpp b/src/mame/video/midzeus.cpp
index 6032119a7bd..5e069383921 100644
--- a/src/mame/video/midzeus.cpp
+++ b/src/mame/video/midzeus.cpp
@@ -8,7 +8,6 @@
#include "emu.h"
#include "includes/midzeus.h"
-#include "video/poly.h"
#include "video/rgbutil.h"
@@ -39,77 +38,6 @@
/*************************************
*
- * Type definitions
- *
- *************************************/
-
-struct mz_poly_extra_data
-{
- const void * palbase;
- const void * texbase;
- uint16_t solidcolor;
- uint16_t voffset;
- int16_t zoffset;
- uint16_t transcolor;
- uint16_t texwidth;
- uint16_t color;
- uint32_t alpha;
- uint32_t ctrl_word;
- bool blend_enable;
- bool depth_test_enable;
- bool depth_write_enable;
- uint32_t blend;
- uint8_t (*get_texel)(const void *, int, int, int);
-};
-
-
-class midzeus_renderer : public poly_manager<float, mz_poly_extra_data, 4, 10000>
-{
-public:
- midzeus_renderer(midzeus_state &state);
-
- void render_poly(int32_t scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
- void render_poly_solid_fixedz(int32_t scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
-
- void zeus_draw_quad(int long_fmt, const uint32_t *databuffer, uint32_t texdata, bool logit);
- void zeus_draw_debug_quad(const rectangle& rect, const vertex_t* vert);
-
-private:
- midzeus_state& m_state;
-};
-
-typedef midzeus_renderer::vertex_t poly_vertex;
-
-
-/*************************************
- *
- * Global variables
- *
- *************************************/
-
-static midzeus_renderer *poly;
-static uint8_t log_fifo;
-
-static uint32_t zeus_fifo[20];
-static uint8_t zeus_fifo_words;
-static int16_t zeus_matrix[3][3];
-static int32_t zeus_point[3];
-static int16_t zeus_light[3];
-static void *zeus_renderbase;
-static uint32_t zeus_palbase;
-static uint32_t zeus_unkbase;
-static int zeus_enable_logging;
-static uint32_t zeus_objdata;
-static rectangle zeus_cliprect;
-
-static uint32_t *waveram[2];
-static int yoffs;
-static int texel_width;
-static int is_mk4b;
-
-
-/*************************************
- *
* Function prototypes
*
*************************************/
@@ -126,8 +54,8 @@ static inline uint8_t get_texel_alt_8bit(const void *base, int y, int x, int wid
*
*************************************/
-#define WAVERAM_BLOCK0(blocknum) ((void *)((uint8_t *)waveram[0] + 8 * (blocknum)))
-#define WAVERAM_BLOCK1(blocknum) ((void *)((uint8_t *)waveram[1] + 8 * (blocknum)))
+#define WAVERAM_BLOCK0(blocknum) ((void *)((uint8_t *)m_waveram[0].get() + 8 * (blocknum)))
+#define WAVERAM_BLOCK1(blocknum) ((void *)((uint8_t *)m_waveram[1].get() + 8 * (blocknum)))
#define WAVERAM_PTR8(base, bytenum) ((uint8_t *)(base) + BYTE4_XOR_LE(bytenum))
#define WAVERAM_READ8(base, bytenum) (*WAVERAM_PTR8(base, bytenum))
@@ -160,25 +88,25 @@ static inline uint8_t get_texel_alt_8bit(const void *base, int y, int x, int wid
*
*************************************/
-static inline void *waveram0_ptr_from_block_addr(uint32_t addr)
+inline void *midzeus_state::waveram0_ptr_from_block_addr(uint32_t addr)
{
uint32_t blocknum = (addr % WAVERAM0_WIDTH) + ((addr >> 12) % WAVERAM0_HEIGHT) * WAVERAM0_WIDTH;
return WAVERAM_BLOCK0(blocknum);
}
-static inline void *waveram0_ptr_from_expanded_addr(uint32_t addr)
+inline void *midzeus_state::waveram0_ptr_from_expanded_addr(uint32_t addr)
{
uint32_t blocknum = (addr % WAVERAM0_WIDTH) + ((addr >> 16) % WAVERAM0_HEIGHT) * WAVERAM0_WIDTH;
return WAVERAM_BLOCK0(blocknum);
}
-static inline void *waveram1_ptr_from_expanded_addr(uint32_t addr)
+inline void *midzeus_state::waveram1_ptr_from_expanded_addr(uint32_t addr)
{
uint32_t blocknum = (addr % WAVERAM1_WIDTH) + ((addr >> 16) % WAVERAM1_HEIGHT) * WAVERAM1_WIDTH;
return WAVERAM_BLOCK1(blocknum);
}
-static inline void *waveram0_ptr_from_texture_addr(uint32_t addr, int width)
+inline void *midzeus_state::waveram0_ptr_from_texture_addr(uint32_t addr, int width)
{
uint32_t blocknum = (((addr & ~1) * width) / 8) % (WAVERAM0_WIDTH * WAVERAM0_HEIGHT);
return WAVERAM_BLOCK0(blocknum);
@@ -192,42 +120,42 @@ static inline void *waveram0_ptr_from_texture_addr(uint32_t addr, int width)
*
*************************************/
-static inline void waveram_plot_depth(int y, int x, uint16_t color, uint16_t depth)
+inline void midzeus_state::waveram_plot_depth(int y, int x, uint16_t color, uint16_t depth)
{
- if (zeus_cliprect.contains(x, y))
+ if (m_zeus_cliprect.contains(x, y))
{
- WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
- WAVERAM_WRITEDEPTH(zeus_renderbase, y, x, depth);
+ WAVERAM_WRITEPIX(m_zeus_renderbase, y, x, color);
+ WAVERAM_WRITEDEPTH(m_zeus_renderbase, y, x, depth);
}
}
#ifdef UNUSED_FUNCTION
-static inline void waveram_plot(int y, int x, uint16_t color)
+inline void midzeus_state::waveram_plot(int y, int x, uint16_t color)
{
- if (zeus_cliprect.contains(x, y))
- WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ if (m_zeus_cliprect.contains(x, y))
+ WAVERAM_WRITEPIX(m_zeus_renderbase, y, x, color);
}
-static inline void waveram_plot_check_depth(int y, int x, uint16_t color, uint16_t depth)
+inline void midzeus_state::waveram_plot_check_depth(int y, int x, uint16_t color, uint16_t depth)
{
- if (zeus_cliprect.contains(x, y))
+ if (m_zeus_cliprect.contains(x, y))
{
- uint16_t *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x);
+ uint16_t *depthptr = WAVERAM_PTRDEPTH(m_zeus_renderbase, y, x);
if (depth <= *depthptr)
{
- WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ WAVERAM_WRITEPIX(m_zeus_renderbase, y, x, color);
*depthptr = depth;
}
}
}
-static inline void waveram_plot_check_depth_nowrite(int y, int x, uint16_t color, uint16_t depth)
+inline void midzeus_state::waveram_plot_check_depth_nowrite(int y, int x, uint16_t color, uint16_t depth)
{
- if (zeus_cliprect.contains(x, y))
+ if (m_zeus_cliprect.contains(x, y))
{
- uint16_t *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x);
+ uint16_t *depthptr = WAVERAM_PTRDEPTH(m_zeus_renderbase, y, x);
if (depth <= *depthptr)
- WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ WAVERAM_WRITEPIX(m_zeus_renderbase, y, x, color);
}
}
#endif
@@ -281,40 +209,40 @@ VIDEO_START_MEMBER(midzeus_state,midzeus)
int i;
/* allocate memory for "wave" RAM */
- waveram[0] = auto_alloc_array(machine(), uint32_t, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
- waveram[1] = auto_alloc_array(machine(), uint32_t, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8/4);
+ m_waveram[0] = std::make_unique<uint32_t[]>(WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
+ m_waveram[1] = std::make_unique<uint32_t[]>(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8/4);
/* initialize a 5-5-5 palette */
for (i = 0; i < 32768; i++)
m_palette->set_pen_color(i, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0));
/* initialize polygon engine */
- poly = auto_alloc(machine(), midzeus_renderer(*this));
+ m_poly = std::make_unique<midzeus_renderer>(*this);
/* we need to cleanup on exit */
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&midzeus_state::exit_handler, this));
- yoffs = 0;
- texel_width = 256;
- zeus_renderbase = waveram[1];
+ m_yoffs = 0;
+ m_texel_width = 256;
+ m_zeus_renderbase = m_waveram[1].get();
/* state saving */
- save_item(NAME(zeus_fifo));
- save_item(NAME(zeus_fifo_words));
- save_item(NAME(zeus_matrix));
- save_item(NAME(zeus_point));
- save_item(NAME(zeus_light));
- save_item(NAME(zeus_palbase));
- save_item(NAME(zeus_objdata));
- save_item(NAME(zeus_cliprect.min_x));
- save_item(NAME(zeus_cliprect.max_x));
- save_item(NAME(zeus_cliprect.min_y));
- save_item(NAME(zeus_cliprect.max_y));
- save_pointer(NAME(waveram[0]), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / sizeof(waveram[0][0]));
- save_pointer(NAME(waveram[1]), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8 / sizeof(waveram[1][0]));
+ save_item(NAME(m_zeus_fifo));
+ save_item(NAME(m_zeus_fifo_words));
+ save_item(NAME(m_zeus_matrix));
+ save_item(NAME(m_zeus_point));
+ save_item(NAME(m_zeus_light));
+ save_item(NAME(m_zeus_palbase));
+ save_item(NAME(m_zeus_objdata));
+ save_item(NAME(m_zeus_cliprect.min_x));
+ save_item(NAME(m_zeus_cliprect.max_x));
+ save_item(NAME(m_zeus_cliprect.min_y));
+ save_item(NAME(m_zeus_cliprect.max_y));
+ save_pointer(NAME(m_waveram[0]), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / sizeof(m_waveram[0][0]));
+ save_pointer(NAME(m_waveram[1]), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8 / sizeof(m_waveram[1][0]));
/* hack */
- is_mk4b = strcmp(machine().system().name, "mk4b") == 0;
+ m_is_mk4b = strcmp(machine().system().name, "mk4b") == 0;
}
@@ -348,7 +276,7 @@ uint32_t midzeus_state::screen_update_midzeus(screen_device &screen, bitmap_ind1
{
int x, y;
- poly->wait("VIDEO_UPDATE");
+ m_poly->wait("VIDEO_UPDATE");
/* normal update case */
if (!machine().input().code_pressed(KEYCODE_V))
@@ -368,24 +296,24 @@ uint32_t midzeus_state::screen_update_midzeus(screen_device &screen, bitmap_ind1
{
const void *base;
- if (machine().input().code_pressed(KEYCODE_DOWN)) yoffs += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
- if (machine().input().code_pressed(KEYCODE_UP)) yoffs -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
- if (machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (machine().input().code_pressed(KEYCODE_LEFT)) ; }
- if (machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (machine().input().code_pressed(KEYCODE_RIGHT)) ; }
+ if (machine().input().code_pressed(KEYCODE_DOWN)) m_yoffs += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
+ if (machine().input().code_pressed(KEYCODE_UP)) m_yoffs -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
+ if (machine().input().code_pressed(KEYCODE_LEFT) && m_texel_width > 4) { m_texel_width >>= 1; while (machine().input().code_pressed(KEYCODE_LEFT)) ; }
+ if (machine().input().code_pressed(KEYCODE_RIGHT) && m_texel_width < 512) { m_texel_width <<= 1; while (machine().input().code_pressed(KEYCODE_RIGHT)) ; }
- if (yoffs < 0) yoffs = 0;
- base = waveram0_ptr_from_block_addr(yoffs << 12);
+ if (m_yoffs < 0) m_yoffs = 0;
+ base = waveram0_ptr_from_block_addr(m_yoffs << 12);
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
{
uint16_t *dest = &bitmap.pix16(y);
for (x = cliprect.min_x; x <= cliprect.max_x; x++)
{
- uint8_t tex = get_texel_8bit(base, y, x, texel_width);
+ uint8_t tex = get_texel_8bit(base, y, x, m_texel_width);
dest[x] = (tex << 8) | tex;
}
}
- popmessage("offs = %06X", yoffs << 12);
+ popmessage("offs = %06X", m_yoffs << 12);
}
return 0;
@@ -471,7 +399,7 @@ READ32_MEMBER(midzeus_state::zeus_r)
WRITE32_MEMBER(midzeus_state::zeus_w)
{
- bool logit = zeus_enable_logging || ((offset < 0xb0 || offset > 0xb7) && (offset < 0xe0 || offset > 0xe1));
+ bool logit = m_zeus_enable_logging || ((offset < 0xb0 || offset > 0xb7) && (offset < 0xe0 || offset > 0xe1));
if (logit)
logerror("%06X:zeus_w", m_maincpu->pc());
@@ -502,20 +430,20 @@ void midzeus_state::zeus_pointer_w(uint32_t which, uint32_t data, bool logit)
case 0x018000:
if (logit)
logerror(" -- setptr(objdata)\n");
- zeus_objdata = data;
+ m_zeus_objdata = data;
break;
// case 0x00c040: -- set in model data in invasn
case 0x00c040:
if (logit)
logerror(" -- setptr(palbase)\n");
- zeus_palbase = data;
+ m_zeus_palbase = data;
break;
case 0x02c0f0:
if (logit)
logerror(" -- setptr(unkbase)\n");
- zeus_unkbase = data;
+ m_zeus_unkbase = data;
break;
@@ -656,7 +584,7 @@ void midzeus_state::zeus_register_update(offs_t offset)
// m_zeusbase[0x46] = ??? = 0x00000000
// m_zeusbase[0x4c] = ??? = 0x00808080 (brightness?)
// m_zeusbase[0x4e] = ??? = 0x00808080 (brightness?)
- mz_poly_extra_data& extra = poly->object_data_alloc();
+ mz_poly_extra_data& extra = m_poly->object_data_alloc();
poly_vertex vert[4];
vert[0].x = (int16_t)m_zeusbase[0x08];
@@ -671,8 +599,8 @@ void midzeus_state::zeus_register_update(offs_t offset)
extra.solidcolor = m_zeusbase[0x00];
extra.zoffset = 0x7fff;
- poly->zeus_draw_debug_quad(zeus_cliprect, vert);
- poly->wait("Normal");
+ m_poly->zeus_draw_debug_quad(m_zeus_cliprect, vert);
+ m_poly->wait("Normal");
}
else
logerror("Execute unknown command\n");
@@ -680,15 +608,15 @@ void midzeus_state::zeus_register_update(offs_t offset)
break;
case 0x70:
- zeus_point[0] = m_zeusbase[0x70] << 16;
+ m_zeus_point[0] = m_zeusbase[0x70] << 16;
break;
case 0x72:
- zeus_point[1] = m_zeusbase[0x72] << 16;
+ m_zeus_point[1] = m_zeusbase[0x72] << 16;
break;
case 0x74:
- zeus_point[2] = m_zeusbase[0x74] << 16;
+ m_zeus_point[2] = m_zeusbase[0x74] << 16;
break;
case 0x80:
@@ -704,7 +632,7 @@ void midzeus_state::zeus_register_update(offs_t offset)
case 0x84:
/* MK4: Written in tandem with 0xcc */
/* MK4: Writes either 0x80 (and 0x000000 to 0xcc) or 0x00 (and 0x800000 to 0xcc) */
- zeus_renderbase = waveram1_ptr_from_expanded_addr(m_zeusbase[0x84] << 16);
+ m_zeus_renderbase = waveram1_ptr_from_expanded_addr(m_zeusbase[0x84] << 16);
break;
case 0xb0:
@@ -745,7 +673,7 @@ void midzeus_state::zeus_register_update(offs_t offset)
else
src = (const uint32_t *)waveram0_ptr_from_expanded_addr(m_zeusbase[0xb4]);
- poly->wait("vram_read");
+ m_poly->wait("vram_read");
m_zeusbase[0xb0] = WAVERAM_READ32(src, 0);
m_zeusbase[0xb2] = WAVERAM_READ32(src, 1);
}
@@ -766,22 +694,22 @@ void midzeus_state::zeus_register_update(offs_t offset)
if (htotal > 0 && vtotal > 0 && visarea.min_x < visarea.max_x && visarea.max_y < vtotal)
{
m_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS(MIDZEUS_VIDEO_CLOCK / 8.0 / (htotal * vtotal)));
- zeus_cliprect = visarea;
- zeus_cliprect.max_x -= zeus_cliprect.min_x;
- zeus_cliprect.min_x = 0;
+ m_zeus_cliprect = visarea;
+ m_zeus_cliprect.max_x -= m_zeus_cliprect.min_x;
+ m_zeus_cliprect.min_x = 0;
}
}
break;
case 0xcc:
m_screen->update_partial(m_screen->vpos());
- log_fifo = machine().input().code_pressed(KEYCODE_L);
+ m_log_fifo = machine().input().code_pressed(KEYCODE_L);
break;
case 0xe0:
- zeus_fifo[zeus_fifo_words++] = m_zeusbase[0xe0];
- if (zeus_fifo_process(zeus_fifo, zeus_fifo_words))
- zeus_fifo_words = 0;
+ m_zeus_fifo[m_zeus_fifo_words++] = m_zeusbase[0xe0];
+ if (zeus_fifo_process(m_zeus_fifo, m_zeus_fifo_words))
+ m_zeus_fifo_words = 0;
break;
}
}
@@ -805,23 +733,23 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
case 0x01:
if (numwords < 2 && data[0] != 0)
return false;
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, "");
- zeus_pointer_w(data[0] & 0xffffff, data[1], log_fifo);
+ zeus_pointer_w(data[0] & 0xffffff, data[1], m_log_fifo);
break;
/* 0x13: render model based on previously set information */
case 0x13: /* invasn */
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, "");
- zeus_draw_model((m_zeusbase[0x06] << 16), log_fifo);
+ zeus_draw_model((m_zeusbase[0x06] << 16), m_log_fifo);
break;
/* 0x17: write 16-bit value to low registers */
case 0x17:
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, " -- reg16");
- zeus_register16_w((data[0] >> 16) & 0x7f, data[0], log_fifo);
+ zeus_register16_w((data[0] >> 16) & 0x7f, data[0], m_log_fifo);
break;
/* 0x18: write 32-bit value to low registers */
@@ -829,15 +757,15 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
case 0x18:
if (numwords < 2)
return false;
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, " -- reg32");
- zeus_register32_w((data[0] >> 16) & 0x7f, data[1], log_fifo);
+ zeus_register32_w((data[0] >> 16) & 0x7f, data[1], m_log_fifo);
break;
/* 0x1A/0x1B: sync pipeline(?) */
case 0x1a:
case 0x1b:
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, " -- sync\n");
break;
@@ -851,7 +779,7 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
/* requires 8 words total */
if (numwords < 8)
return false;
- if (log_fifo)
+ if (m_log_fifo)
{
log_fifo_command(data, numwords, "");
logerror("\n\t\tmatrix ( %04X %04X %04X ) ( %04X %04X %04X ) ( %04X %04X %04X )\n\t\tvector %8.2f %8.2f %8.5f\n",
@@ -864,14 +792,14 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
}
/* extract the matrix from the raw data */
- zeus_matrix[0][0] = data[2]; zeus_matrix[0][1] = data[2] >> 16; zeus_matrix[0][2] = data[0];
- zeus_matrix[1][0] = data[3]; zeus_matrix[1][1] = data[3] >> 16; zeus_matrix[1][2] = data[1] >> 16;
- zeus_matrix[2][0] = data[4]; zeus_matrix[2][1] = data[4] >> 16; zeus_matrix[2][2] = data[1];
+ m_zeus_matrix[0][0] = data[2]; m_zeus_matrix[0][1] = data[2] >> 16; m_zeus_matrix[0][2] = data[0];
+ m_zeus_matrix[1][0] = data[3]; m_zeus_matrix[1][1] = data[3] >> 16; m_zeus_matrix[1][2] = data[1] >> 16;
+ m_zeus_matrix[2][0] = data[4]; m_zeus_matrix[2][1] = data[4] >> 16; m_zeus_matrix[2][2] = data[1];
/* extract the translation point from the raw data */
- zeus_point[0] = data[5];
- zeus_point[1] = data[6];
- zeus_point[2] = data[7];
+ m_zeus_point[0] = data[5];
+ m_zeus_point[1] = data[6];
+ m_zeus_point[2] = data[7];
}
/* double matrix form */
@@ -883,7 +811,7 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
/* requires 13 words total */
if (numwords < 13)
return false;
- if (log_fifo)
+ if (m_log_fifo)
{
log_fifo_command(data, numwords, "");
logerror("\n\t\tmatrix ( %04X %04X %04X ) ( %04X %04X %04X ) ( %04X %04X %04X )\n\t\tmatrix ( %04X %04X %04X ) ( %04X %04X %04X ) ( %04X %04X %04X )\n\t\tvector %8.2f %8.2f %8.5f\n",
@@ -909,20 +837,20 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
matrix2[2][0] = data[5]; matrix2[2][1] = data[6]; matrix2[2][2] = data[7];
/* multiply them together to get the final matrix */
- zeus_matrix[0][0] = ((int64_t)(matrix1[0][0] * matrix2[0][0]) + (int64_t)(matrix1[0][1] * matrix2[1][0]) + (int64_t)(matrix1[0][2] * matrix2[2][0])) >> 16;
- zeus_matrix[0][1] = ((int64_t)(matrix1[0][0] * matrix2[0][1]) + (int64_t)(matrix1[0][1] * matrix2[1][1]) + (int64_t)(matrix1[0][2] * matrix2[2][1])) >> 16;
- zeus_matrix[0][2] = ((int64_t)(matrix1[0][0] * matrix2[0][2]) + (int64_t)(matrix1[0][1] * matrix2[1][2]) + (int64_t)(matrix1[0][2] * matrix2[2][2])) >> 16;
- zeus_matrix[1][0] = ((int64_t)(matrix1[1][0] * matrix2[0][0]) + (int64_t)(matrix1[1][1] * matrix2[1][0]) + (int64_t)(matrix1[1][2] * matrix2[2][0])) >> 16;
- zeus_matrix[1][1] = ((int64_t)(matrix1[1][0] * matrix2[0][1]) + (int64_t)(matrix1[1][1] * matrix2[1][1]) + (int64_t)(matrix1[1][2] * matrix2[2][1])) >> 16;
- zeus_matrix[1][2] = ((int64_t)(matrix1[1][0] * matrix2[0][2]) + (int64_t)(matrix1[1][1] * matrix2[1][2]) + (int64_t)(matrix1[1][2] * matrix2[2][2])) >> 16;
- zeus_matrix[2][0] = ((int64_t)(matrix1[2][0] * matrix2[0][0]) + (int64_t)(matrix1[2][1] * matrix2[1][0]) + (int64_t)(matrix1[2][2] * matrix2[2][0])) >> 16;
- zeus_matrix[2][1] = ((int64_t)(matrix1[2][0] * matrix2[0][1]) + (int64_t)(matrix1[2][1] * matrix2[1][1]) + (int64_t)(matrix1[2][2] * matrix2[2][1])) >> 16;
- zeus_matrix[2][2] = ((int64_t)(matrix1[2][0] * matrix2[0][2]) + (int64_t)(matrix1[2][1] * matrix2[1][2]) + (int64_t)(matrix1[2][2] * matrix2[2][2])) >> 16;
+ m_zeus_matrix[0][0] = ((int64_t)(matrix1[0][0] * matrix2[0][0]) + (int64_t)(matrix1[0][1] * matrix2[1][0]) + (int64_t)(matrix1[0][2] * matrix2[2][0])) >> 16;
+ m_zeus_matrix[0][1] = ((int64_t)(matrix1[0][0] * matrix2[0][1]) + (int64_t)(matrix1[0][1] * matrix2[1][1]) + (int64_t)(matrix1[0][2] * matrix2[2][1])) >> 16;
+ m_zeus_matrix[0][2] = ((int64_t)(matrix1[0][0] * matrix2[0][2]) + (int64_t)(matrix1[0][1] * matrix2[1][2]) + (int64_t)(matrix1[0][2] * matrix2[2][2])) >> 16;
+ m_zeus_matrix[1][0] = ((int64_t)(matrix1[1][0] * matrix2[0][0]) + (int64_t)(matrix1[1][1] * matrix2[1][0]) + (int64_t)(matrix1[1][2] * matrix2[2][0])) >> 16;
+ m_zeus_matrix[1][1] = ((int64_t)(matrix1[1][0] * matrix2[0][1]) + (int64_t)(matrix1[1][1] * matrix2[1][1]) + (int64_t)(matrix1[1][2] * matrix2[2][1])) >> 16;
+ m_zeus_matrix[1][2] = ((int64_t)(matrix1[1][0] * matrix2[0][2]) + (int64_t)(matrix1[1][1] * matrix2[1][2]) + (int64_t)(matrix1[1][2] * matrix2[2][2])) >> 16;
+ m_zeus_matrix[2][0] = ((int64_t)(matrix1[2][0] * matrix2[0][0]) + (int64_t)(matrix1[2][1] * matrix2[1][0]) + (int64_t)(matrix1[2][2] * matrix2[2][0])) >> 16;
+ m_zeus_matrix[2][1] = ((int64_t)(matrix1[2][0] * matrix2[0][1]) + (int64_t)(matrix1[2][1] * matrix2[1][1]) + (int64_t)(matrix1[2][2] * matrix2[2][1])) >> 16;
+ m_zeus_matrix[2][2] = ((int64_t)(matrix1[2][0] * matrix2[0][2]) + (int64_t)(matrix1[2][1] * matrix2[1][2]) + (int64_t)(matrix1[2][2] * matrix2[2][2])) >> 16;
/* extract the translation point from the raw data */
- zeus_point[0] = data[10];
- zeus_point[1] = data[11];
- zeus_point[2] = data[12];
+ m_zeus_point[0] = data[10];
+ m_zeus_point[1] = data[11];
+ m_zeus_point[2] = data[12];
}
break;
@@ -932,15 +860,15 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
case 0x2e:
if (numwords < 2)
return false;
- if (log_fifo)
+ if (m_log_fifo)
{
log_fifo_command(data, numwords, "");
logerror(" -- light xyz = %d,%d,%d\n", (int16_t)data[1], (int16_t)(data[1] >> 16), (int16_t)data[0]);
}
- zeus_light[0] = (int16_t)(data[1] & 0xffff);
- zeus_light[1] = (int16_t)(data[1] >> 16);
- zeus_light[2] = (int16_t)(data[0] & 0xffff);
+ m_zeus_light[0] = (int16_t)(data[1] & 0xffff);
+ m_zeus_light[1] = (int16_t)(data[1] >> 16);
+ m_zeus_light[2] = (int16_t)(data[0] & 0xffff);
break;
/* 0x25: display control? */
/* 0x28: same for mk4b */
@@ -948,7 +876,7 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
case 0x25:
{
/* 0x25 is used differently in mk4b. What determines this? */
- if (is_mk4b)
+ if (m_is_mk4b)
{
if (numwords < 2)
return false;
@@ -961,21 +889,21 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
if (numwords < 4 || ((data[0] & 0x808000) && numwords < 10))
return false;
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, " -- alt. quad and hack screen clear\n");
if ((numwords < 10) && (data[0] & 0xffff7f) == 0)
{
/* not right -- just a hack */
int x, y;
- for (y = zeus_cliprect.min_y; y <= zeus_cliprect.max_y; y++)
- for (x = zeus_cliprect.min_x; x <= zeus_cliprect.max_x; x++)
+ for (y = m_zeus_cliprect.min_y; y <= m_zeus_cliprect.max_y; y++)
+ for (x = m_zeus_cliprect.min_x; x <= m_zeus_cliprect.max_x; x++)
waveram_plot_depth(y, x, 0, 0x7fff);
}
else
{
uint32_t texdata = (m_zeusbase[0x06] << 16) | (m_zeusbase[0x00] >> 16);
- poly->zeus_draw_quad(false, data, texdata, log_fifo);
+ m_poly->zeus_draw_quad(false, data, texdata, m_log_fifo);
}
break;
@@ -983,7 +911,7 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
/* 0x70: same for mk4 */
case 0x2d:
case 0x70:
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, "\n");
break;
@@ -991,15 +919,15 @@ int midzeus_state::zeus_fifo_process(const uint32_t *data, int numwords)
case 0x67:
if (numwords < 3)
return false;
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, "");
- zeus_objdata = data[1];
- zeus_draw_model(data[2], log_fifo);
+ m_zeus_objdata = data[1];
+ zeus_draw_model(data[2], m_log_fifo);
break;
default:
printf("Unknown command %08X\n", data[0]);
- if (log_fifo)
+ if (m_log_fifo)
log_fifo_command(data, numwords, "\n");
break;
}
@@ -1021,16 +949,16 @@ void midzeus_state::zeus_draw_model(uint32_t texdata, bool logit)
int model_done = false;
if (logit)
- logerror(" -- model @ %08X\n", zeus_objdata);
+ logerror(" -- model @ %08X\n", m_zeus_objdata);
- while (zeus_objdata != 0 && !model_done)
+ while (m_zeus_objdata != 0 && !model_done)
{
- const void *base = waveram0_ptr_from_block_addr(zeus_objdata);
- int count = zeus_objdata >> 24;
+ const void *base = waveram0_ptr_from_block_addr(m_zeus_objdata);
+ int count = m_zeus_objdata >> 24;
int curoffs;
/* reset the objdata address */
- zeus_objdata = 0;
+ m_zeus_objdata = 0;
/* loop until we run out of data */
for (curoffs = 0; curoffs <= count; curoffs++)
@@ -1089,7 +1017,7 @@ void midzeus_state::zeus_draw_model(uint32_t texdata, bool logit)
case 0x25: /* mk4 */
case 0x28: /* mk4r1 */
case 0x30: /* invasn */
- poly->zeus_draw_quad(true, databuffer, texdata, logit);
+ m_poly->zeus_draw_quad(true, databuffer, texdata, logit);
break;
default:
@@ -1132,6 +1060,9 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
int xy_offset = long_fmt ? 2 : 1;
+ int16_t (*zeus_matrix)[3] = m_state.m_zeus_matrix;
+ int32_t *zeus_point = m_state.m_zeus_point;
+
for (uint32_t i = 0; i < 4; i++)
{
uint32_t ixy = databuffer[xy_offset + i*2];
@@ -1143,7 +1074,6 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
uint8_t v = iuvz >> 24;
int64_t x, y, z;
-
x = (int64_t)(xo * zeus_matrix[0][0]) + (int64_t)(yo * zeus_matrix[0][1]) + (int64_t)(zo * zeus_matrix[0][2]) + zeus_point[0];
y = (int64_t)(xo * zeus_matrix[1][0]) + (int64_t)(yo * zeus_matrix[1][1]) + (int64_t)(zo * zeus_matrix[1][2]) + zeus_point[1];
z = (int64_t)(xo * zeus_matrix[2][0]) + (int64_t)(yo * zeus_matrix[2][1]) + (int64_t)(zo * zeus_matrix[2][2]) + zeus_point[2];
@@ -1202,7 +1132,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
}
}
- numverts = poly->zclip_if_less(4, &vert[0], &clipvert[0], 4, 512.0f);
+ numverts = m_state.m_poly->zclip_if_less(4, &vert[0], &clipvert[0], 4, 512.0f);
if (numverts < 3)
return;
@@ -1230,7 +1160,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
clipvert[i].y += 0.0005f;
}
- mz_poly_extra_data& extra = poly->object_data_alloc();
+ mz_poly_extra_data& extra = m_state.m_poly->object_data_alloc();
if (ctrl_word & 0x01000000)
{
@@ -1238,7 +1168,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
extra.texwidth = 512 >> texwshift;
extra.voffset = ctrl_word & 0xffff;
- extra.texbase = waveram0_ptr_from_texture_addr(texbase, extra.texwidth);
+ extra.texbase = m_state.waveram0_ptr_from_texture_addr(texbase, extra.texwidth);
if (tex_type == 1)
{
@@ -1263,12 +1193,12 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
extra.depth_test_enable = !(m_state.m_zeusbase[0x04] & 0x800);
extra.depth_write_enable = m_state.m_zeusbase[0x04] & 0x200;
extra.transcolor = ((ctrl_word >> 16) & 1) ? 0 : 0x100;
- extra.palbase = waveram0_ptr_from_block_addr(zeus_palbase);
+ extra.palbase = m_state.waveram0_ptr_from_block_addr(m_state.m_zeus_palbase);
// Note: Before being upgraded to the new polygon rasterizing code, this function call was
// a poly_render_quad_fan. It appears as though the new code defaults to a fan if
// the template argument is 4, but keep an eye out for missing quads.
- poly->render_polygon<4>(zeus_cliprect,
+ m_state.m_poly->render_polygon<4>(m_state.m_zeus_cliprect,
render_delegate(&midzeus_renderer::render_poly, this),
4,
clipvert);
@@ -1276,7 +1206,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
void midzeus_renderer::zeus_draw_debug_quad(const rectangle& rect, const vertex_t *vert)
{
- poly->render_polygon<4>(rect, render_delegate(&midzeus_renderer::render_poly_solid_fixedz, this), 0, vert);
+ m_state.m_poly->render_polygon<4>(rect, render_delegate(&midzeus_renderer::render_poly_solid_fixedz, this), 0, vert);
}
@@ -1303,7 +1233,7 @@ void midzeus_renderer::render_poly(int32_t scanline, const extent_t& extent, con
for (uint32_t x = extent.startx; x < extent.stopx; x++)
{
- uint16_t *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, scanline, x);
+ uint16_t *depthptr = WAVERAM_PTRDEPTH(m_state.m_zeus_renderbase, scanline, x);
int32_t depth = (curz >> 16) + object.zoffset;
if (depth > 0x7fff)
@@ -1385,7 +1315,7 @@ void midzeus_renderer::render_poly(int32_t scanline, const extent_t& extent, con
// Destination enable?
if (object.blend & 0x00800000)
{
- uint16_t dst = WAVERAM_READPIX(zeus_renderbase, scanline, x);
+ uint16_t dst = WAVERAM_READPIX(m_state.m_zeus_renderbase, scanline, x);
dstr = (dst >> 10) & 0x1f;
dstg = (dst >> 5) & 0x1f;
@@ -1479,7 +1409,7 @@ void midzeus_renderer::render_poly(int32_t scanline, const extent_t& extent, con
outg >>= 3;
outb >>= 3;
- WAVERAM_WRITEPIX(zeus_renderbase, scanline, x, (outr << 10) | (outg << 5) | outb);
+ WAVERAM_WRITEPIX(m_state.m_zeus_renderbase, scanline, x, (outr << 10) | (outg << 5) | outb);
if (object.depth_write_enable)
*depthptr = depth;
@@ -1502,7 +1432,7 @@ void midzeus_renderer::render_poly_solid_fixedz(int32_t scanline, const extent_t
int x;
for (x = extent.startx; x < extent.stopx; x++)
- waveram_plot_depth(scanline, x, color, depth);
+ m_state.waveram_plot_depth(scanline, x, color, depth);
}
diff --git a/src/mame/video/model1.cpp b/src/mame/video/model1.cpp
index 9cf4db2c057..a5301c2b3d6 100644
--- a/src/mame/video/model1.cpp
+++ b/src/mame/video/model1.cpp
@@ -451,20 +451,20 @@ int model1_state::quad_t::compare(const model1_state::quad_t* other) const
void model1_state::sort_quads() const
{
- const int count = m_quadpt - m_quaddb;
+ const int count = m_quadpt - &m_quaddb[0];
for (int i = 0; i < count; i++)
{
- m_quadind[i] = m_quaddb + i;
+ m_quadind[i] = &m_quaddb[i];
}
- qsort(m_quadind, count, sizeof(model1_state::quad_t*), comp_quads);
+ qsort(&m_quadind[0], count, sizeof(model1_state::quad_t*), comp_quads);
}
void model1_state::unsort_quads() const
{
- const int count = m_quadpt - m_quaddb;
+ const int count = m_quadpt - &m_quaddb[0];
for (int i = 0; i < count; i++)
{
- m_quadind[i] = m_quaddb + i;
+ m_quadind[i] = &m_quaddb[i];
}
}
@@ -472,7 +472,7 @@ void model1_state::unsort_quads() const
void model1_state::draw_quads(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
view_t *view = m_view.get();
- int count = m_quadpt - m_quaddb;
+ int count = m_quadpt - &m_quaddb[0];
/* clip to the cliprect */
int save_x1 = view->x1;
@@ -1176,15 +1176,15 @@ int model1_state::skip_direct(int list_offset) const
void model1_state::draw_objects(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- if (m_quadpt != m_quaddb)
+ if (m_quadpt != &m_quaddb[0])
{
LOG_TGP(("VIDEO: sort&draw\n"));
sort_quads();
draw_quads(bitmap, cliprect);
}
- m_quadpt = m_quaddb;
- m_pointpt = m_pointdb;
+ m_quadpt = &m_quaddb[0];
+ m_pointpt = &m_pointdb[0];
}
@@ -1199,8 +1199,8 @@ int model1_state::draw_direct(bitmap_rgb32 &bitmap, const rectangle &cliprect, i
unsort_quads();
draw_quads(bitmap, cliprect);
- m_quadpt = m_quaddb;
- m_pointpt = m_pointdb;
+ m_quadpt = &m_quaddb[0];
+ m_pointpt = &m_pointdb[0];
return list_offset;
}
@@ -1568,12 +1568,12 @@ void model1_state::video_start()
m_poly_ram = make_unique_clear<uint32_t[]>(0x400000);
m_tgp_ram = make_unique_clear<uint16_t[]>(0x100000-0x40000);
- m_pointdb = auto_alloc_array_clear(machine(), model1_state::point_t, 1000000*2);
- m_quaddb = auto_alloc_array_clear(machine(), model1_state::quad_t, 1000000);
- m_quadind = auto_alloc_array_clear(machine(), model1_state::quad_t *, 1000000);
+ m_pointdb = make_unique_clear<model1_state::point_t[]>(1000000*2);
+ m_quaddb = make_unique_clear<model1_state::quad_t[]>(1000000);
+ m_quadind = make_unique_clear<model1_state::quad_t *[]>(1000000);
- m_pointpt = m_pointdb;
- m_quadpt = m_quaddb;
+ m_pointpt = &m_pointdb[0];
+ m_quadpt = &m_quaddb[0];
m_listctl[0] = m_listctl[1] = 0;
m_clipfn[0].m_isclipped = &model1_state::fclip_isc_bottom;
diff --git a/src/mame/video/model2.cpp b/src/mame/video/model2.cpp
index e84d78bb020..f63991d2ea3 100644
--- a/src/mame/video/model2.cpp
+++ b/src/mame/video/model2.cpp
@@ -101,62 +101,6 @@
/*******************************************
*
- * Hardware 3D Rasterizer Internal State
- *
- *******************************************/
-
-#define MAX_TRIANGLES 32768
-
-struct raster_state
-{
-// uint32_t mode; /* bit 0 = Test Mode, bit 2 = Switch 60Hz(1)/30Hz(0) operation */
- uint16_t *texture_rom; /* Texture ROM pointer */
- uint32_t texture_rom_mask; /* Texture ROM mask */
- int16_t viewport[4]; /* View port (startx,starty,endx,endy) */
- int16_t center[4][2]; /* Centers (eye 0[x,y],1[x,y],2[x,y],3[x,y]) */
- uint16_t center_sel; /* Selected center */
- uint32_t reverse; /* Left/Right Reverse */
- float z_adjust; /* ZSort Mode */
- float triangle_z; /* Current Triangle z value */
- uint8_t master_z_clip; /* Master Z-Clip value */
- uint32_t cur_command; /* Current command */
- uint32_t command_buffer[32]; /* Command buffer */
- uint32_t command_index; /* Command buffer index */
- triangle tri_list[MAX_TRIANGLES]; /* Triangle list */
- uint32_t tri_list_index; /* Triangle list index */
- triangle *tri_sorted_list[0x10000]; /* Sorted Triangle list */
- uint16_t min_z; /* Minimum sortable Z value */
- uint16_t max_z; /* Maximum sortable Z value */
- uint16_t texture_ram[0x10000]; /* Texture RAM pointer */
- uint8_t log_ram[0x40000]; /* Log RAM pointer */
-};
-
-/*******************************************
- *
- * Geometry Engine Internal State
- *
- *******************************************/
-
-struct geo_state
-{
- raster_state * raster;
- uint32_t mode; /* bit 0 = Enable Specular, bit 1 = Calculate Normals */
- uint32_t * polygon_rom; /* Polygon ROM pointer */
- uint32_t polygon_rom_mask; /* Polygon ROM mask */
- float matrix[12]; /* Current Transformation Matrix */
- poly_vertex focus; /* Focus (x,y) */
- poly_vertex light; /* Light Vector */
- float lod; /* LOD */
- float coef_table[32]; /* Distane Coefficient table */
- texture_parameter texture_parameters[32]; /* Texture parameters */
- uint32_t polygon_ram0[0x8000]; /* Fast Polygon RAM pointer */
- uint32_t polygon_ram1[0x8000]; /* Slow Polygon RAM pointer */
- model2_state *state;
-};
-
-
-/*******************************************
- *
* Generic 3D Math Functions
*
*******************************************/
@@ -341,7 +285,7 @@ inline bool model2_state::check_culling( raster_state *raster, uint32_t attr, fl
void model2_state::raster_init( memory_region *texture_rom )
{
- m_raster = auto_alloc_clear(machine(), <raster_state>());
+ m_raster = make_unique_clear<raster_state>();
m_raster->texture_rom = (uint16_t *)texture_rom->base();
m_raster->texture_rom_mask = (texture_rom->bytes() / 2) - 1;
@@ -826,7 +770,7 @@ void model2_state::model2_3d_process_triangle( raster_state *raster, uint32_t at
void model2_renderer::model2_3d_render(triangle *tri, const rectangle &cliprect)
{
- model2_renderer *poly = m_state.m_poly;
+ model2_renderer *poly = m_state.m_poly.get();
m2_poly_extra_data& extra = poly->object_data_alloc();
uint8_t renderer;
@@ -942,7 +886,7 @@ inline void model2_state::model2_3d_project( triangle *tri )
/* 3D Rasterizer frame start: Resets frame variables */
void model2_state::model2_3d_frame_start( void )
{
- raster_state *raster = m_raster;
+ raster_state *raster = m_raster.get();
/* reset the triangle list index */
raster->tri_list_index = 0;
@@ -957,7 +901,7 @@ void model2_state::model2_3d_frame_start( void )
void model2_state::model2_3d_frame_end( bitmap_rgb32 &bitmap, const rectangle &cliprect )
{
- raster_state *raster = m_raster;
+ raster_state *raster = m_raster.get();
int32_t z;
/* if we have nothing to render, bail */
@@ -1216,10 +1160,10 @@ void model2_state::model2_3d_push( raster_state *raster, uint32_t input )
void model2_state::geo_init(memory_region *polygon_rom)
{
- m_geo = auto_alloc_clear(machine(), <geo_state>());
+ m_geo = make_unique_clear<geo_state>();
m_geo->state = this;
- m_geo->raster = m_raster;
+ m_geo->raster = m_raster.get();
m_geo->polygon_rom = (uint32_t *)polygon_rom->base();
m_geo->polygon_rom_mask = (polygon_rom->bytes() / 4) - 1;
@@ -2599,7 +2543,7 @@ void model2_state::geo_parse( void )
}
/* process it */
- input = geo_process_command( m_geo, opcode, input, &end_code );
+ input = geo_process_command( m_geo.get(), opcode, input, &end_code );
}
}
@@ -2614,7 +2558,7 @@ void model2_state::video_start()
m_sys24_bitmap.allocate(width, height+4);
- m_poly = auto_alloc(machine(), model2_renderer(*this));
+ m_poly = std::make_unique<model2_renderer>(*this);
/* initialize the hardware rasterizer */
raster_init( memregion("textures") );
diff --git a/src/mame/video/slapshot.cpp b/src/mame/video/slapshot.cpp
index a74e083b99e..37827d8d650 100644
--- a/src/mame/video/slapshot.cpp
+++ b/src/mame/video/slapshot.cpp
@@ -10,7 +10,7 @@ void slapshot_state::video_start()
{
m_spriteram_delayed = std::make_unique<u16[]>(m_spriteram.bytes() / 2);
m_spriteram_buffered = std::make_unique<u16[]>(m_spriteram.bytes() / 2);
- m_spritelist = auto_alloc_array(machine(), struct slapshot_tempsprite, 0x400);
+ m_spritelist = std::make_unique<slapshot_tempsprite[]>(0x400);
m_sprites_disabled = true;
m_sprites_active_area = 0;
@@ -91,7 +91,7 @@ void slapshot_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
/* pdrawgfx() needs us to draw sprites front to back, so we have to build a list
while processing sprite ram and then draw them all at the end */
- struct slapshot_tempsprite *sprite_ptr = m_spritelist;
+ slapshot_tempsprite *sprite_ptr = &m_spritelist[0];
/* must remember enable status from last frame because driftout fails to
reactivate them from a certain point onwards. */
@@ -341,7 +341,7 @@ void slapshot_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
/* this happens only if primsks != nullptr */
- while (sprite_ptr != m_spritelist)
+ while (sprite_ptr != &m_spritelist[0])
{
sprite_ptr--;
diff --git a/src/mame/video/taito_f3.cpp b/src/mame/video/taito_f3.cpp
index ab993ed068e..2d1ae3b058e 100644
--- a/src/mame/video/taito_f3.cpp
+++ b/src/mame/video/taito_f3.cpp
@@ -227,7 +227,7 @@ struct F3config
int sprite_lag;
};
-static const struct F3config f3_config_table[] =
+static const F3config f3_config_table[] =
{
/* Name Extend Lag */
{ RINGRAGE, 0, 2 },
@@ -459,7 +459,7 @@ WRITE_LINE_MEMBER(taito_f3_state::screen_vblank)
void taito_f3_state::video_start()
{
- const struct F3config *pCFG = &f3_config_table[0];
+ const F3config *pCFG = &f3_config_table[0];
m_alpha_level_2as = 127;
m_alpha_level_2ad = 127;
@@ -552,12 +552,12 @@ void taito_f3_state::video_start()
}
m_spriteram16_buffered = std::make_unique<u16[]>(0x10000 / 2);
- m_spritelist = auto_alloc_array(machine(), struct tempsprite, 0x400);
- m_sprite_end = m_spritelist;
+ m_spritelist = std::make_unique<tempsprite[]>(0x400);
+ m_sprite_end = &m_spritelist[0];
m_vram_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taito_f3_state::get_tile_info_text), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
m_pixel_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(taito_f3_state::get_tile_info_pixel), this), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
- m_pf_line_inf = auto_alloc_array(machine(), struct f3_playfield_line_inf, 5);
- m_sa_line_inf = auto_alloc_array(machine(), struct f3_spritealpha_line_inf, 1);
+ m_pf_line_inf = std::make_unique<f3_playfield_line_inf[]>(5);
+ m_sa_line_inf = std::make_unique<f3_spritealpha_line_inf[]>(1);
m_screen->register_screen_bitmap(m_pri_alp_bitmap);
m_tile_opaque_sp = std::make_unique<u8[]>(m_gfxdecode->gfx(2)->elements());
for (int i = 0; i < 8; i++)
@@ -1276,7 +1276,7 @@ void taito_f3_state::init_alpha_blend_func()
#define GET_PIXMAP_POINTER(pf_num) \
{ \
- const struct f3_playfield_line_inf *line_tmp = line_t[pf_num]; \
+ const f3_playfield_line_inf *line_tmp = line_t[pf_num]; \
m_src[pf_num] = line_tmp->src[y]; \
m_src_s[pf_num] = line_tmp->src_s[y]; \
m_src_e[pf_num] = line_tmp->src_e[y]; \
@@ -1331,7 +1331,7 @@ void taito_f3_state::init_alpha_blend_func()
inline void taito_f3_state::draw_scanlines(
bitmap_rgb32 &bitmap, int xsize, s16 *draw_line_num,
- const struct f3_playfield_line_inf **line_t,
+ const f3_playfield_line_inf **line_t,
const int *sprite,
u32 orient,
int skip_layer_num)
@@ -1449,7 +1449,7 @@ inline void taito_f3_state::draw_scanlines(
/******************************************************************************/
void taito_f3_state::visible_tile_check(
- struct f3_playfield_line_inf *line_t,
+ f3_playfield_line_inf *line_t,
int line,
u32 x_index_fx,u32 y_index,
u16 *pf_data_n)
@@ -1521,7 +1521,7 @@ void taito_f3_state::visible_tile_check(
void taito_f3_state::calculate_clip(int y, u16 pri, u32 *clip0, u32 *clip1, int *line_enable)
{
- const struct f3_spritealpha_line_inf *sa_line_t = &m_sa_line_inf[0];
+ const f3_spritealpha_line_inf *sa_line_t = &m_sa_line_inf[0];
switch (pri)
{
@@ -1625,7 +1625,7 @@ void taito_f3_state::calculate_clip(int y, u16 pri, u32 *clip0, u32 *clip1, int
void taito_f3_state::get_spritealphaclip_info()
{
- struct f3_spritealpha_line_inf *line_t = &m_sa_line_inf[0];
+ f3_spritealpha_line_inf *line_t = &m_sa_line_inf[0];
int y, y_end, y_inc;
@@ -1722,7 +1722,7 @@ void taito_f3_state::get_spritealphaclip_info()
/* sx and sy are 16.16 fixed point numbers */
void taito_f3_state::get_line_ram_info(tilemap_t *tmap, int sx, int sy, int pos, u16 *pf_data_n)
{
- struct f3_playfield_line_inf *line_t = &m_pf_line_inf[pos];
+ f3_playfield_line_inf *line_t = &m_pf_line_inf[pos];
int y_start, y_end, y_inc;
int line_base, zoom_base, col_base, pri_base, inc;
@@ -1925,8 +1925,8 @@ void taito_f3_state::get_line_ram_info(tilemap_t *tmap, int sx, int sy, int pos,
void taito_f3_state::get_vram_info(tilemap_t *vram_tilemap, tilemap_t *pixel_tilemap, int sx, int sy)
{
- const struct f3_spritealpha_line_inf *sprite_alpha_line_t = &m_sa_line_inf[0];
- struct f3_playfield_line_inf *line_t = &m_pf_line_inf[4];
+ const f3_spritealpha_line_inf *sprite_alpha_line_t = &m_sa_line_inf[0];
+ f3_playfield_line_inf *line_t = &m_pf_line_inf[4];
int y_start, y_end, y_inc;
int pri_base, inc;
@@ -2075,11 +2075,11 @@ void taito_f3_state::scanline_draw(bitmap_rgb32 &bitmap, const rectangle &clipre
u8 sprite_alpha_check;
u8 sprite_alpha_all_2a;
int layer_tmp[5];
- struct f3_playfield_line_inf *pf_line_inf = m_pf_line_inf;
- struct f3_spritealpha_line_inf *sa_line_inf = m_sa_line_inf;
+ f3_playfield_line_inf *pf_line_inf = m_pf_line_inf.get();
+ f3_spritealpha_line_inf *sa_line_inf = m_sa_line_inf.get();
int count_skip_layer = 0;
int sprite[6] = {0, 0, 0, 0, 0, 0};
- const struct f3_playfield_line_inf *line_t[5];
+ const f3_playfield_line_inf *line_t[5];
/* find same status of scanlines */
pri[0] = pf_line_inf[0].pri[y_start];
@@ -2735,7 +2735,7 @@ void taito_f3_state::get_sprite_info(const u16 *spriteram16_ptr)
int x_addition_left = 8, y_addition_left = 8;
- struct tempsprite *sprite_ptr = m_spritelist;
+ tempsprite *sprite_ptr = &m_spritelist[0];
int total_sprites = 0;
@@ -3008,7 +3008,7 @@ void taito_f3_state::get_sprite_info(const u16 *spriteram16_ptr)
void taito_f3_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- const struct tempsprite *sprite_ptr;
+ const tempsprite *sprite_ptr;
gfx_element *sprite_gfx = m_gfxdecode->gfx(2);
sprite_ptr = m_sprite_end;
@@ -3017,7 +3017,7 @@ void taito_f3_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprec
// if sprites use more than 4bpp, the bottom bits of the color code must be masked out.
// This fixes (at least) stage 1 battle ships and attract mode explosions in Ray Force.
- while (sprite_ptr != m_spritelist)
+ while (sprite_ptr != &m_spritelist[0])
{
sprite_ptr--;