diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/sound/multipcm.cpp | 214 | ||||
-rw-r--r-- | src/devices/sound/multipcm.h | 36 | ||||
-rw-r--r-- | src/devices/video/zeus2.cpp | 10 | ||||
-rw-r--r-- | src/devices/video/zeus2.h | 8 | ||||
-rw-r--r-- | src/mame/drivers/aci_ggm.cpp | 83 | ||||
-rw-r--r-- | src/mame/drivers/hh_sm510.cpp | 2 | ||||
-rw-r--r-- | src/mame/includes/midzeus.h | 78 | ||||
-rw-r--r-- | src/mame/includes/model1.h | 6 | ||||
-rw-r--r-- | src/mame/includes/model2.h | 61 | ||||
-rw-r--r-- | src/mame/includes/slapshot.h | 2 | ||||
-rw-r--r-- | src/mame/includes/taito_f3.h | 16 | ||||
-rw-r--r-- | src/mame/layout/aci_ggm.lay | 474 | ||||
-rw-r--r-- | src/mame/nl.lst | 3 | ||||
-rw-r--r-- | src/mame/video/midzeus.cpp | 332 | ||||
-rw-r--r-- | src/mame/video/model1.cpp | 32 | ||||
-rw-r--r-- | src/mame/video/model2.cpp | 72 | ||||
-rw-r--r-- | src/mame/video/slapshot.cpp | 6 | ||||
-rw-r--r-- | src/mame/video/taito_f3.cpp | 40 |
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="←"><color red="0.05" green="0.7" blue="0.15" /></text></element> + <element name="text_steinitz18b" defstate="0"><text state="3" string="→"><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--; |