Merge branch 'master' of https://github.com/mamedev/mame
Some checks are pending
CI (Windows) / build-windows (gcc, gcc, g++, mame, mame) (push) Waiting to run

This commit is contained in:
Andrei Holub 2025-01-31 08:08:53 -05:00
commit 139386c476
70 changed files with 2468 additions and 1439 deletions

View File

@ -42,6 +42,7 @@
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <array>
#include <memory>
#include <string>
#include <vector>
@ -109,17 +110,6 @@ inline int32_t clamp(int32_t value, int32_t minval, int32_t maxval)
}
//-------------------------------------------------
// array_size - return the size of an array
//-------------------------------------------------
template<typename ArrayType, int ArraySize>
constexpr uint32_t array_size(ArrayType (&array)[ArraySize])
{
return ArraySize;
}
//-------------------------------------------------
// count_leading_zeros - return the number of
// leading zeros in a 32-bit value; CPU-optimized
@ -254,7 +244,8 @@ inline int16_t roundtrip_fp(int32_t value)
// apply the shift back and forth to zero out bits that are lost
exponent -= 1;
return (value >> exponent) << exponent;
int32_t mask = (1 << exponent) - 1;
return value & ~mask;
}
@ -350,7 +341,7 @@ public:
{
// create file
char name[20];
sprintf(name, "wavlog-%02d.wav", m_index);
snprintf(&name[0], sizeof(name), "wavlog-%02d.wav", m_index);
FILE *out = fopen(name, "wb");
// make the wav file header
@ -483,6 +474,8 @@ public:
class ymfm_engine_callbacks
{
public:
virtual ~ymfm_engine_callbacks() = default;
// timer callback; called by the interface when a timer fires
virtual void engine_timer_expired(uint32_t tnum) = 0;
@ -504,6 +497,8 @@ class ymfm_interface
template<typename RegisterType> friend class fm_engine_base;
public:
virtual ~ymfm_interface() = default;
// the following functions must be implemented by any derived classes; the
// default implementations are sufficient for some minimal operation, but will
// likely need to be overridden to integrate with the outside world; they are

View File

@ -267,7 +267,7 @@ public:
// assign operators
void assign(uint32_t index, fm_operator<RegisterType> *op)
{
assert(index < array_size(m_op));
assert(index < m_op.size());
m_op[index] = op;
if (op != nullptr)
op->set_choffs(m_choffs);
@ -330,7 +330,7 @@ private:
uint32_t m_choffs; // channel offset in registers
int16_t m_feedback[2]; // feedback memory for operator 1
mutable int16_t m_feedback_in; // next input value for op 1 feedback (set in output)
fm_operator<RegisterType> *m_op[4]; // up to 4 operators
std::array<fm_operator<RegisterType> *, 4> m_op; // up to 4 operators
RegisterType &m_regs; // direct reference to registers
fm_engine_base<RegisterType> &m_owner; // reference to the owning engine
};

View File

@ -839,12 +839,12 @@ void fm_channel<RegisterType>::save_restore(ymfm_saved_state &state)
template<class RegisterType>
void fm_channel<RegisterType>::keyonoff(uint32_t states, keyon_type type, uint32_t chnum)
{
for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
m_op[opnum]->keyonoff(bitfield(states, opnum), type);
if (debug::LOG_KEYON_EVENTS && ((debug::GLOBAL_FM_CHANNEL_MASK >> chnum) & 1) != 0)
for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
debug::log_keyon("%c%s\n", bitfield(states, opnum) ? '+' : '-', m_regs.log_keyon(m_choffs, m_op[opnum]->opoffs()).c_str());
}
@ -860,7 +860,7 @@ bool fm_channel<RegisterType>::prepare()
uint32_t active_mask = 0;
// prepare all operators and determine if they are active
for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
if (m_op[opnum]->prepare())
active_mask |= 1 << opnum;
@ -880,7 +880,7 @@ void fm_channel<RegisterType>::clock(uint32_t env_counter, int32_t lfo_raw_pm)
m_feedback[0] = m_feedback[1];
m_feedback[1] = m_feedback_in;
for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
if (m_op[opnum] != nullptr)
m_op[opnum]->clock(env_counter, lfo_raw_pm);
@ -888,7 +888,7 @@ void fm_channel<RegisterType>::clock(uint32_t env_counter, int32_t lfo_raw_pm)
useful temporary code for envelope debugging
if (m_choffs == 0x101)
{
for (uint32_t opnum = 0; opnum < array_size(m_op); opnum++)
for (uint32_t opnum = 0; opnum < m_op.size(); opnum++)
{
auto &op = *m_op[((opnum & 1) << 1) | ((opnum >> 1) & 1)];
printf(" %c%03X%c%c ",
@ -1504,6 +1504,8 @@ void fm_engine_base<RegisterType>::update_timer(uint32_t tnum, uint32_t enable,
template<class RegisterType>
void fm_engine_base<RegisterType>::engine_timer_expired(uint32_t tnum)
{
assert(tnum == 0 || tnum == 1);
// update status
if (tnum == 0 && m_regs.enable_timer_a())
set_reset_status(STATUS_TIMERA, 0);
@ -1515,7 +1517,7 @@ void fm_engine_base<RegisterType>::engine_timer_expired(uint32_t tnum)
for (uint32_t chnum = 0; chnum < CHANNELS; chnum++)
if (bitfield(RegisterType::CSM_TRIGGER_MASK, chnum))
{
m_channel[chnum]->keyonoff(1, KEYON_CSM, chnum);
m_channel[chnum]->keyonoff(0xf, KEYON_CSM, chnum);
m_modified_channels |= 1 << chnum;
}

View File

@ -90,5 +90,4 @@ protected:
}
#endif // YMFM_MISC_H

View File

@ -386,9 +386,9 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
uint32_t opnum = (opoffs & 31) - 2 * ((opoffs & 31) / 8) + 18 * bitfield(opoffs, 8);
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
end += snprintf(&buffer[end], sizeof(buffer) - end, "%2u.%02u freq=%04X fb=%u alg=%X mul=%X tl=%02X ksr=%u ns=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u",
chnum, opnum,
ch_block_freq(choffs),
ch_feedback(choffs),
@ -405,25 +405,25 @@ std::string opl_registers_base<Revision>::log_keyon(uint32_t choffs, uint32_t op
op_eg_sustain(opoffs));
if (OUTPUTS > 1)
end += sprintf(end, " out=%c%c%c%c",
end += snprintf(&buffer[end], sizeof(buffer) - end, " out=%c%c%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-',
ch_output_2(choffs) ? '0' : '-',
ch_output_3(choffs) ? '1' : '-');
if (op_lfo_am_enable(opoffs) != 0)
end += sprintf(end, " am=%u", lfo_am_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", lfo_am_depth());
if (op_lfo_pm_enable(opoffs) != 0)
end += sprintf(end, " pm=%u", lfo_pm_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", lfo_pm_depth());
if (waveform_enable() && op_waveform(opoffs) != 0)
end += sprintf(end, " wf=%u", op_waveform(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=%u", op_waveform(opoffs));
if (is_rhythm(choffs))
end += sprintf(end, " rhy=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " rhy=1");
if (DYNAMIC_OPS)
{
operator_mapping map;
operator_map(map);
if (bitfield(map.chan[chnum], 16, 8) != 0xff)
end += sprintf(end, " 4op");
end += snprintf(&buffer[end], sizeof(buffer) - end, " 4op");
}
return buffer;
@ -685,9 +685,9 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X inst=%X fb=%u mul=%X",
chnum, opnum,
ch_block_freq(choffs),
ch_instrument(choffs),
@ -695,11 +695,11 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
op_multiple(opoffs));
if (bitfield(opoffs, 0) == 1 || (is_rhythm(choffs) && choffs >= 6))
end += sprintf(end, " vol=%X", op_volume(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " vol=%X", op_volume(opoffs));
else
end += sprintf(end, " tl=%02X", ch_total_level(choffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " tl=%02X", ch_total_level(choffs));
end += sprintf(end, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
end += snprintf(&buffer[end], sizeof(buffer) - end, " ksr=%u ksl=%u adr=%X/%X/%X sl=%X sus=%u/%u",
op_ksr(opoffs),
op_ksl(opoffs),
op_attack_rate(opoffs),
@ -710,13 +710,13 @@ std::string opll_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_sustain(choffs));
if (op_lfo_am_enable(opoffs))
end += sprintf(end, " am=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=1");
if (op_lfo_pm_enable(opoffs))
end += sprintf(end, " pm=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=1");
if (op_waveform(opoffs) != 0)
end += sprintf(end, " wf=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=1");
if (is_rhythm(choffs))
end += sprintf(end, " rhy=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " rhy=1");
return buffer;
}
@ -1715,9 +1715,15 @@ uint8_t ymf278b::read_status()
uint8_t ymf278b::read_data_pcm()
{
// write to FM
// read from PCM
if (bitfield(m_address, 9) != 0)
return m_pcm.read(m_address & 0xff);
{
uint8_t result = m_pcm.read(m_address & 0xff);
if ((m_address & 0xff) == 0x02)
result |= 0x20;
return result;
}
return 0;
}

View File

@ -60,17 +60,17 @@ opm_registers::opm_registers() :
{
// waveform 0 is a sawtooth
uint8_t am = index ^ 0xff;
int8_t pm = int8_t(index);
uint8_t pm = index;
m_lfo_waveform[0][index] = am | (pm << 8);
// waveform 1 is a square wave
am = bitfield(index, 7) ? 0 : 0xff;
pm = int8_t(am ^ 0x80);
pm = am ^ 0x80;
m_lfo_waveform[1][index] = am | (pm << 8);
// waveform 2 is a triangle wave
am = bitfield(index, 7) ? (index << 1) : ((index ^ 0xff) << 1);
pm = int8_t(bitfield(index, 6) ? am : ~am);
pm = bitfield(index, 6) ? am : ~am;
m_lfo_waveform[2][index] = am | (pm << 8);
// waveform 3 is noise; it is filled in dynamically
@ -330,7 +330,7 @@ uint32_t opm_registers::compute_phase_step(uint32_t choffs, uint32_t opoffs, opd
if (pm_sensitivity < 6)
delta += lfo_raw_pm >> (6 - pm_sensitivity);
else
delta += lfo_raw_pm << (pm_sensitivity - 5);
delta += uint32_t(lfo_raw_pm) << (pm_sensitivity - 5);
}
// apply delta and convert to a frequency number
@ -354,9 +354,9 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt2=%u dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
ch_block_freq(choffs),
op_detune2(opoffs),
@ -376,14 +376,14 @@ std::string opm_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
if (noise_enable() && opoffs == 31)
end += sprintf(end, " noise=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " noise=1");
return buffer;
}

View File

@ -143,26 +143,23 @@ bool opn_registers_base<IsOpnA>::write(uint16_t index, uint8_t data, uint32_t &c
assert(index < REGISTERS);
// writes in the 0xa0-af/0x1a0-af region are handled as latched pairs
// borrow unused registers 0xb8-bf/0x1b8-bf as temporary holding locations
// borrow unused registers 0xb8-bf as temporary holding locations
if ((index & 0xf0) == 0xa0)
{
if (bitfield(index, 0, 2) == 3)
return false;
uint32_t latchindex = 0xb8 | bitfield(index, 3);
if (IsOpnA)
latchindex |= index & 0x100;
// writes to the upper half just latch (only low 6 bits matter)
if (bitfield(index, 2))
m_regdata[latchindex] = data | 0x80;
m_regdata[latchindex] = data & 0x3f;
// writes to the lower half only commit if the latch is there
else if (bitfield(m_regdata[latchindex], 7))
// writes to the lower half also apply said latch
else
{
m_regdata[index] = data;
m_regdata[index | 4] = m_regdata[latchindex] & 0x3f;
m_regdata[latchindex] = 0;
m_regdata[index | 4] = m_regdata[latchindex];
}
return false;
}
@ -409,9 +406,9 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
}
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X",
chnum, opnum,
block_freq,
op_detune(opoffs),
@ -427,21 +424,21 @@ std::string opn_registers_base<IsOpnA>::log_keyon(uint32_t choffs, uint32_t opof
op_sustain_level(opoffs));
if (OUTPUTS > 1)
end += sprintf(end, " out=%c%c",
end += snprintf(&buffer[end], sizeof(buffer) - end, " out=%c%c",
ch_output_0(choffs) ? 'L' : '-',
ch_output_1(choffs) ? 'R' : '-');
if (op_ssg_eg_enable(opoffs))
end += sprintf(end, " ssg=%X", op_ssg_eg_mode(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " ssg=%X", op_ssg_eg_mode(opoffs));
bool am = (op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
end += sprintf(end, " lfo=%02X", lfo_rate());
end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X", lfo_rate());
if (multi_freq() && choffs == 2)
end += sprintf(end, " multi=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " multi=1");
return buffer;
}

View File

@ -793,7 +793,7 @@ public:
ymf276(ymfm_interface &intf) : ym2612(intf) { }
// generate one sample of sound
void generate(output_data *output, uint32_t numsamples);
void generate(output_data *output, uint32_t numsamples = 1);
};
}

View File

@ -339,9 +339,9 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u freq=%04X dt=%+2d fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
chnum, opnum,
(opoffs & 1) ? ch_block_freq_24(choffs) : ch_block_freq_13(choffs),
int32_t(op_detune(opoffs)) - 0x20,
@ -360,14 +360,14 @@ std::string opq_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
bool am = (lfo_enable() && op_lfo_am_enable(opoffs) && ch_lfo_am_sens(choffs) != 0);
if (am)
end += sprintf(end, " am=%u", ch_lfo_am_sens(choffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u", ch_lfo_am_sens(choffs));
bool pm = (lfo_enable() && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u", ch_lfo_pm_sens(choffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u", ch_lfo_pm_sens(choffs));
if (am || pm)
end += sprintf(end, " lfo=%02X", lfo_rate());
end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X", lfo_rate());
if (ch_reverb(choffs))
end += sprintf(end, " reverb");
end += snprintf(&buffer[end], sizeof(buffer) - end, " reverb");
return buffer;
}

290
3rdparty/ymfm/src/ymfm_opx.h vendored Normal file
View File

@ -0,0 +1,290 @@
// BSD 3-Clause License
//
// Copyright (c) 2021, Aaron Giles
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef YMFM_OPX_H
#define YMFM_OPX_H
#pragma once
#include "ymfm.h"
#include "ymfm_fm.h"
namespace ymfm
{
//*********************************************************
// REGISTER CLASSES
//*********************************************************
// ======================> opx_registers
//
// OPX register map:
//
// System-wide registers:
//
// Per-channel registers (channel in address bits 0-2)
//
// Per-operator registers (4 banks):
// 00-0F x------- Enable
// -xxxx--- EXT out
// -------x Key on
// 10-1F xxxxxxxx LFO frequency
// 20-2F xx------ AM sensitivity (0-3)
// --xxx--- PM sensitivity (0-7)
// ------xx LFO waveform (0=disable, 1=saw, 2=
// 30-3F -xxx---- Detune (0-7)
// ----xxxx Multiple (0-15)
// 40-4F -xxxxxxx Total level (0-127)
// 50-5F xxx----- Key scale (0-7)
// ---xxxxx Attack rate (0-31)
// 60-6F ---xxxxx Decay rate (0-31)
// 70-7F ---xxxxx Sustain rate (0-31)
// 80-8F xxxx---- Sustain level (0-15)
// ----xxxx Release rate (0-15)
// 90-9F xxxxxxxx Frequency number (low 8 bits)
// A0-AF xxxx---- Block (0-15)
// ----xxxx Frequency number (high 4 bits)
// B0-BF x------- Acc on
// -xxx---- Feedback level (0-7)
// -----xxx Waveform (0-7, 7=PCM)
// C0-CF ----xxxx Algorithm (0-15)
// D0-DF xxxx---- CH0 level (0-15)
// ----xxxx CH1 level (0-15)
// E0-EF xxxx---- CH2 level (0-15)
// ----xxxx CH3 level (0-15)
//
class opx_registers : public fm_registers_base
{
// LFO waveforms are 256 entries long
static constexpr uint32_t LFO_WAVEFORM_LENGTH = 256;
public:
// constants
static constexpr uint32_t OUTPUTS = 8;
static constexpr uint32_t CHANNELS = 24;
static constexpr uint32_t ALL_CHANNELS = (1 << CHANNELS) - 1;
static constexpr uint32_t OPERATORS = CHANNELS * 2;
static constexpr uint32_t WAVEFORMS = 8;
static constexpr uint32_t REGISTERS = 0x800;
static constexpr uint32_t DEFAULT_PRESCALE = 8;
static constexpr uint32_t EG_CLOCK_DIVIDER = 2;
static constexpr uint32_t CSM_TRIGGER_MASK = ALL_CHANNELS;
static constexpr uint32_t REG_MODE = 0x14;
static constexpr uint8_t STATUS_TIMERA = 0x01;
static constexpr uint8_t STATUS_TIMERB = 0x02;
static constexpr uint8_t STATUS_BUSY = 0x80;
static constexpr uint8_t STATUS_IRQ = 0;
// constructor
opx_registers();
// reset to initial state
void reset();
// save/restore
void save_restore(ymfm_saved_state &state);
// map channel number to register offset
static constexpr uint32_t channel_offset(uint32_t chnum)
{
assert(chnum < CHANNELS);
return chnum;
}
// map operator number to register offset
static constexpr uint32_t operator_offset(uint32_t opnum)
{
assert(opnum < OPERATORS);
return opnum;
}
// return an array of operator indices for each channel
struct operator_mapping { uint32_t chan[CHANNELS]; };
void operator_map(operator_mapping &dest) const;
// handle writes to the register array
bool write(uint16_t index, uint8_t data, uint32_t &chan, uint32_t &opmask);
// clock the noise and LFO, if present, returning LFO PM value
int32_t clock_noise_and_lfo();
// return the AM offset from LFO for the given channel
uint32_t lfo_am_offset(uint32_t choffs) const;
// return the current noise state, gated by the noise clock
uint32_t noise_state() const { return m_noise_state; }
// caching helpers
void cache_operator_data(uint32_t choffs, uint32_t opoffs, opdata_cache &cache);
// compute the phase step, given a PM value
uint32_t compute_phase_step(uint32_t choffs, uint32_t opoffs, opdata_cache const &cache, int32_t lfo_raw_pm);
// log a key-on event
std::string log_keyon(uint32_t choffs, uint32_t opoffs);
// system-wide registers
uint32_t noise_frequency() const { return byte(0x0f, 0, 5); }
uint32_t noise_enable() const { return byte(0x0f, 7, 1); }
uint32_t timer_a_value() const { return word(0x10, 0, 8, 0x11, 0, 2); }
uint32_t timer_b_value() const { return byte(0x12, 0, 8); }
uint32_t csm() const { return byte(0x14, 7, 1); }
uint32_t reset_timer_b() const { return byte(0x14, 5, 1); }
uint32_t reset_timer_a() const { return byte(0x14, 4, 1); }
uint32_t enable_timer_b() const { return byte(0x14, 3, 1); }
uint32_t enable_timer_a() const { return byte(0x14, 2, 1); }
uint32_t load_timer_b() const { return byte(0x14, 1, 1); }
uint32_t load_timer_a() const { return byte(0x14, 0, 1); }
uint32_t lfo2_pm_depth() const { return byte(0x148, 0, 7); } // fake
uint32_t lfo2_rate() const { return byte(0x16, 0, 8); }
uint32_t lfo2_am_depth() const { return byte(0x17, 0, 7); }
uint32_t lfo_rate() const { return byte(0x18, 0, 8); }
uint32_t lfo_am_depth() const { return byte(0x19, 0, 7); }
uint32_t lfo_pm_depth() const { return byte(0x149, 0, 7); } // fake
uint32_t output_bits() const { return byte(0x1b, 6, 2); }
uint32_t lfo2_sync() const { return byte(0x1b, 5, 1); }
uint32_t lfo_sync() const { return byte(0x1b, 4, 1); }
uint32_t lfo2_waveform() const { return byte(0x1b, 2, 2); }
uint32_t lfo_waveform() const { return byte(0x1b, 0, 2); }
// per-channel registers
uint32_t ch_volume(uint32_t choffs) const { return byte(0x00, 0, 8, choffs); }
uint32_t ch_output_any(uint32_t choffs) const { return byte(0x20, 7, 1, choffs) | byte(0x30, 0, 1, choffs); }
uint32_t ch_output_0(uint32_t choffs) const { return byte(0x30, 0, 1, choffs); }
uint32_t ch_output_1(uint32_t choffs) const { return byte(0x20, 7, 1, choffs) | byte(0x30, 0, 1, choffs); }
uint32_t ch_output_2(uint32_t choffs) const { return 0; }
uint32_t ch_output_3(uint32_t choffs) const { return 0; }
uint32_t ch_key_on(uint32_t choffs) const { return byte(0x20, 6, 1, choffs); }
uint32_t ch_feedback(uint32_t choffs) const { return byte(0x20, 3, 3, choffs); }
uint32_t ch_algorithm(uint32_t choffs) const { return byte(0x20, 0, 3, choffs); }
uint32_t ch_block_freq(uint32_t choffs) const { return word(0x28, 0, 7, 0x30, 2, 6, choffs); }
uint32_t ch_lfo_pm_sens(uint32_t choffs) const { return byte(0x38, 4, 3, choffs); }
uint32_t ch_lfo_am_sens(uint32_t choffs) const { return byte(0x38, 0, 2, choffs); }
uint32_t ch_lfo2_pm_sens(uint32_t choffs) const { return byte(0x140, 4, 3, choffs); } // fake
uint32_t ch_lfo2_am_sens(uint32_t choffs) const { return byte(0x140, 0, 2, choffs); } // fake
// per-operator registers
uint32_t op_detune(uint32_t opoffs) const { return byte(0x40, 4, 3, opoffs); }
uint32_t op_multiple(uint32_t opoffs) const { return byte(0x40, 0, 4, opoffs); }
uint32_t op_fix_range(uint32_t opoffs) const { return byte(0x40, 4, 3, opoffs); }
uint32_t op_fix_frequency(uint32_t opoffs) const { return byte(0x40, 0, 4, opoffs); }
uint32_t op_waveform(uint32_t opoffs) const { return byte(0x100, 4, 3, opoffs); } // fake
uint32_t op_fine(uint32_t opoffs) const { return byte(0x100, 0, 4, opoffs); } // fake
uint32_t op_total_level(uint32_t opoffs) const { return byte(0x60, 0, 7, opoffs); }
uint32_t op_ksr(uint32_t opoffs) const { return byte(0x80, 6, 2, opoffs); }
uint32_t op_fix_mode(uint32_t opoffs) const { return byte(0x80, 5, 1, opoffs); }
uint32_t op_attack_rate(uint32_t opoffs) const { return byte(0x80, 0, 5, opoffs); }
uint32_t op_lfo_am_enable(uint32_t opoffs) const { return byte(0xa0, 7, 1, opoffs); }
uint32_t op_decay_rate(uint32_t opoffs) const { return byte(0xa0, 0, 5, opoffs); }
uint32_t op_detune2(uint32_t opoffs) const { return byte(0xc0, 6, 2, opoffs); }
uint32_t op_sustain_rate(uint32_t opoffs) const { return byte(0xc0, 0, 5, opoffs); }
uint32_t op_eg_shift(uint32_t opoffs) const { return byte(0x120, 6, 2, opoffs); } // fake
uint32_t op_reverb_rate(uint32_t opoffs) const { return byte(0x120, 0, 3, opoffs); } // fake
uint32_t op_sustain_level(uint32_t opoffs) const { return byte(0xe0, 4, 4, opoffs); }
uint32_t op_release_rate(uint32_t opoffs) const { return byte(0xe0, 0, 4, opoffs); }
protected:
// return a bitfield extracted from a byte
uint32_t byte(uint32_t offset, uint32_t start, uint32_t count, uint32_t extra_offset = 0) const
{
return bitfield(m_regdata[offset + extra_offset], start, count);
}
// return a bitfield extracted from a pair of bytes, MSBs listed first
uint32_t word(uint32_t offset1, uint32_t start1, uint32_t count1, uint32_t offset2, uint32_t start2, uint32_t count2, uint32_t extra_offset = 0) const
{
return (byte(offset1, start1, count1, extra_offset) << count2) | byte(offset2, start2, count2, extra_offset);
}
// internal state
uint32_t m_lfo_counter[2]; // LFO counter
uint32_t m_noise_lfsr; // noise LFSR state
uint8_t m_noise_counter; // noise counter
uint8_t m_noise_state; // latched noise state
uint8_t m_noise_lfo; // latched LFO noise value
uint8_t m_lfo_am[2]; // current LFO AM value
uint8_t m_regdata[REGISTERS]; // register data
uint16_t m_phase_substep[OPERATORS]; // phase substep for fixed frequency
int16_t m_lfo_waveform[4][LFO_WAVEFORM_LENGTH]; // LFO waveforms; AM in low 8, PM in upper 8
uint16_t m_waveform[WAVEFORMS][WAVEFORM_LENGTH]; // waveforms
};
//*********************************************************
// IMPLEMENTATION CLASSES
//*********************************************************
// ======================> ymf271
class ymf271
{
public:
using fm_engine = fm_engine_base<opx_registers>;
static constexpr uint32_t OUTPUTS = fm_engine::OUTPUTS;
using output_data = fm_engine::output_data;
// constructor
ymf271(ymfm_interface &intf);
// reset
void reset();
// save/restore
void save_restore(ymfm_saved_state &state);
// pass-through helpers
uint32_t sample_rate(uint32_t input_clock) const { return m_fm.sample_rate(input_clock); }
void invalidate_caches() { m_fm.invalidate_caches(); }
// read access
uint8_t read_status();
uint8_t read(uint32_t offset);
// write access
void write_address(uint8_t data);
void write_data(uint8_t data);
void write(uint32_t offset, uint8_t data);
// generate one sample of sound
void generate(output_data *output, uint32_t numsamples = 1);
protected:
// internal state
uint8_t m_address; // address register
fm_engine m_fm; // core FM engine
};
}
#endif // YMFM_OPX_H

View File

@ -129,17 +129,17 @@ opz_registers::opz_registers() :
{
// waveform 0 is a sawtooth
uint8_t am = index ^ 0xff;
int8_t pm = int8_t(index);
uint8_t pm = index;
m_lfo_waveform[0][index] = am | (pm << 8);
// waveform 1 is a square wave
am = bitfield(index, 7) ? 0 : 0xff;
pm = int8_t(am ^ 0x80);
pm = am ^ 0x80;
m_lfo_waveform[1][index] = am | (pm << 8);
// waveform 2 is a triangle wave
am = bitfield(index, 7) ? (index << 1) : ((index ^ 0xff) << 1);
pm = int8_t(bitfield(index, 6) ? am : ~am);
pm = bitfield(index, 6) ? am : ~am;
m_lfo_waveform[2][index] = am | (pm << 8);
// waveform 3 is noise; it is filled in dynamically
@ -555,16 +555,16 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
uint32_t opnum = opoffs;
char buffer[256];
char *end = &buffer[0];
int end = 0;
end += sprintf(end, "%u.%02u", chnum, opnum);
end += snprintf(&buffer[end], sizeof(buffer) - end, "%u.%02u", chnum, opnum);
if (op_fix_mode(opoffs))
end += sprintf(end, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " fixfreq=%X fine=%X shift=%X", op_fix_frequency(opoffs), op_fine(opoffs), op_fix_range(opoffs));
else
end += sprintf(end, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " freq=%04X dt2=%u fine=%X", ch_block_freq(choffs), op_detune2(opoffs), op_fine(opoffs));
end += sprintf(end, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
end += snprintf(&buffer[end], sizeof(buffer) - end, " dt=%u fb=%u alg=%X mul=%X tl=%02X ksr=%u adsr=%02X/%02X/%02X/%X sl=%X out=%c%c",
op_detune(opoffs),
ch_feedback(choffs),
ch_algorithm(choffs),
@ -580,32 +580,32 @@ std::string opz_registers::log_keyon(uint32_t choffs, uint32_t opoffs)
ch_output_1(choffs) ? 'R' : '-');
if (op_eg_shift(opoffs) != 0)
end += sprintf(end, " egshift=%u", op_eg_shift(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " egshift=%u", op_eg_shift(opoffs));
bool am = (lfo_am_depth() != 0 && ch_lfo_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am)
end += sprintf(end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " am=%u/%02X", ch_lfo_am_sens(choffs), lfo_am_depth());
bool pm = (lfo_pm_depth() != 0 && ch_lfo_pm_sens(choffs) != 0);
if (pm)
end += sprintf(end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm=%u/%02X", ch_lfo_pm_sens(choffs), lfo_pm_depth());
if (am || pm)
end += sprintf(end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo=%02X/%c", lfo_rate(), "WQTN"[lfo_waveform()]);
bool am2 = (lfo2_am_depth() != 0 && ch_lfo2_am_sens(choffs) != 0 && op_lfo_am_enable(opoffs) != 0);
if (am2)
end += sprintf(end, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " am2=%u/%02X", ch_lfo2_am_sens(choffs), lfo2_am_depth());
bool pm2 = (lfo2_pm_depth() != 0 && ch_lfo2_pm_sens(choffs) != 0);
if (pm2)
end += sprintf(end, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
end += snprintf(&buffer[end], sizeof(buffer) - end, " pm2=%u/%02X", ch_lfo2_pm_sens(choffs), lfo2_pm_depth());
if (am2 || pm2)
end += sprintf(end, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
end += snprintf(&buffer[end], sizeof(buffer) - end, " lfo2=%02X/%c", lfo2_rate(), "WQTN"[lfo2_waveform()]);
if (op_reverb_rate(opoffs) != 0)
end += sprintf(end, " rev=%u", op_reverb_rate(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " rev=%u", op_reverb_rate(opoffs));
if (op_waveform(opoffs) != 0)
end += sprintf(end, " wf=%u", op_waveform(opoffs));
end += snprintf(&buffer[end], sizeof(buffer) - end, " wf=%u", op_waveform(opoffs));
if (noise_enable() && opoffs == 31)
end += sprintf(end, " noise=1");
end += snprintf(&buffer[end], sizeof(buffer) - end, " noise=1");
return buffer;
}

View File

@ -46,7 +46,6 @@ namespace ymfm
void pcm_registers::reset()
{
std::fill_n(&m_regdata[0], REGISTERS, 0);
m_regdata[0x02] = 0x20;
m_regdata[0xf8] = 0x1b;
}

View File

@ -49,6 +49,8 @@ namespace ymfm
class ssg_override
{
public:
virtual ~ssg_override() = default;
// reset our status
virtual void ssg_reset() = 0;

View File

@ -4,8 +4,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mamedev.mame"
android:versionCode="273"
android:versionName="0.273"
android:versionCode="274"
android:versionName="0.274"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->

View File

@ -63,9 +63,9 @@ copyright = u'1997-2025, MAMEdev and contributors'
# built documents.
#
# The short X.Y version.
version = '0.273'
version = '0.274'
# The full version, including alpha/beta/rc tags.
release = '0.273'
release = '0.274'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -27,6 +27,20 @@ TODO:
</part>
</software>
<software name="interfer" supported="no">
<description>Interference (demo)</description>
<year>1993</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="developer" value="Sanity"/>
<info name="release" value="19930424"/>
<!-- OCS/ECS -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="901120">
<rom name="sanity-interference.adf" size="901120" crc="7075359f" sha1="8dc41dccf7dab7b742f9fd21d3e2d2055120f3dc"/>
</dataarea>
</part>
</software>
<software name="miseryd2" supported="no">
<description>Misery Dentro 2 (demo)</description>
<year>1993</year>
@ -42,6 +56,20 @@ TODO:
</part>
</software>
<software name="puggs" supported="no">
<description>Puggs In Space (demo)</description>
<year>1989</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="developer" value="Dionysus"/>
<!-- 10th best demo in EuroChart Top Ten #3 -->
<!-- OCS/ECS -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="901120">
<rom name="dionysus-puggsinspace.adf" size="901120" crc="c55e5390" sha1="b8af05dc8905c1e215f3b2b4c450020d890add25"/>
</dataarea>
</part>
</software>
<software name="elysium" supported="no">
<description>Sanity Elysium (demo)</description>
<year>1991</year>

View File

@ -115,7 +115,7 @@ license:CC0-1.0
<year>1988</year>
<publisher>Taito</publisher>
<info name="programmer" value="Ryan Ridges and John Lund" />
<info name="version" value="12-Jan-89" />
<info name="version" value="12-Jan-89 - ROM 03 compatible" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
@ -252,17 +252,19 @@ license:CC0-1.0
</software>
<software name="calcraft">
<description>Calendar Crafter (A-194 version 1.2) (trex crack)</description>
<description>Calendar Crafter (A-194 version 1.2) (cleanly cracked)</description>
<year>1987</year>
<publisher>MECC</publisher>
<info name="partno" value="A-194" />
<info name="programmer" value="Gene Breault, Charolyn Kapplinger, Diane Portner, Steven D. Splinter, and Paul R. Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.2" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
<!-- productivity program -->
<!-- It requires a 768K Apple IIgs ROM 01 or later. -->
<!-- "Calendar Crafter" is a utility that allows you to design and print customized calendars to help organize your month / year. -->
<!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="calendar crafter v1.2 iigs(trex crack).2mg" size="819264" crc="65717231" sha1="2f2415385a699fc78a68a3a73ff8470a5fc8df6f"/>
@ -473,17 +475,19 @@ license:CC0-1.0
</software>
<software name="dsgnprnt">
<description>Designer Prints (A-252 version 1.0) (trex crack)</description>
<description>Designer Prints (A-252 version 1.0) (cleanly cracked)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-252" />
<info name="programmer" value="Diane Portner, Michael Stein, Brian Walker, and Paul Wenker" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
<!-- desktop publishing program -->
<!-- It requires a 768K Apple IIgs ROM 01 or later. -->
<!-- "Designer Prints" is a versatile desktop publishing program for making worksheets, certificates, posters and other printed materials. -->
<!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
<dataarea name="flop" size="819264">
@ -499,17 +503,19 @@ license:CC0-1.0
</software>
<software name="dsgnpuzl">
<description>Designer Puzzles (A-223 version 1.0) (trex crack)</description>
<description>Designer Puzzles (A-223 version 1.0) (cleanly cracked)</description>
<year>1989</year>
<publisher>MECC</publisher>
<info name="partno" value="A-223" />
<info name="programmer" value="Susan Gabrys, John J. Krenz, Diane Portner, and Steve Splinter" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 768K Apple IIgs ROM 01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
<!-- desktop publishing program -->
<!-- It requires a 768K Apple IIgs ROM 01 or later. -->
<!-- "Designer Puzzles" is a versatile desktop publishing program for making word scrambles and crossword puzzles -->
<!-- Protection: Bad block check for block $8 -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - System disk"/>
<dataarea name="flop" size="819264">
@ -570,6 +576,26 @@ license:CC0-1.0
</part>
</software>
<software name="drawplus10">
<description>Draw Plus (version 1.0) (cleanly cracked)</description>
<year>1987</year>
<publisher>Activision</publisher>
<info name="programmer" value="H. Lamiraux" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs. -->
<!-- "Draw Plus" is full-color precision drawing program with text and graphics intergraion. -->
<!-- Protection: Bad block check for block $7, later versions dropped the copy protection -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="draw plus v1.0 iigs (trex crack).2mg" size="819264" crc="efddd532" sha1="518ccb81ca6c20686e18c5a88b3d54708c62aba1" />
</dataarea>
</part>
</software>
<software name="fantavsn">
<description>Fantavision (version 2.1) (cleanly cracked)</description>
<year>1987</year>
@ -674,7 +700,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>Activision</publisher>
<info name="programmer" value="Paul Terry, Jack Thornton, Scott Orr, John Cutter, Troy Lyndon, and Russell Lieblich" />
<info name="usage" value="Requires a 256K Apple IIgs." />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2023-04-13 -->
<!-- It requires a 512K Apple IIgs. -->
@ -1174,7 +1200,7 @@ license:CC0-1.0
<publisher>Davidson and Associates</publisher>
<info name="author" value="Jan Davidson and Cathy Johnson" />
<info name="programmer" value="C.K. Haun" />
<info name="version" value="1.1" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 512K Apple IIgs ROM1 or later." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
@ -1334,6 +1360,33 @@ license:CC0-1.0
<rom name="mercury v1.0 iigs - disk 2 - program (trex crack).2mg" size="819264" crc="2682521b" sha1="5fd3948bac00b1ca4e08c79ccb437483798f25a9"/>
</dataarea>
</part>
</software> <software name="mulscribe">
<description>MultiScribe IIgs (version 3.01c) (cleanly cracked)</description>
<year>1987</year>
<publisher>StyleWare</publisher>
<info name="developer" value="StyleWare" />
<info name="version" value="3.01c" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs. -->
<!-- "MultiScrible" is a word-processor featuring the ability to use different fonts, print styles, colors as well as allowing you to add boxes, circles and other designs. -->
<!-- First marketed as "Scholastic MutiScrible GS by StyleWare", then it became StyleWare MultiScribe GS and eventually Beagle Bros Software acquired the StyleWare library and rebranded it as BeagleWrite GS. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1 - Program" />
<dataarea name="flop" size="819264">
<rom name="multiscribe gs v3.01c disk 1 - program (trex crack).2mg" size="819264" crc="d63e2246" sha1="8b5b7074f8967a79eb417cdb1a2648638473aa0f" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<feature name="part_id" value="Disk 2 - Utilities" />
<dataarea name="flop" size="819264">
<rom name="multiscribe gs v3.01c disk 2 - utilities (trex crack).2mg" size="819264" crc="c4a8d1b1" sha1="0e31bb265b031397f8b386916e791e618d3a891e" />
</dataarea>
</part>
</software>
<software name="mcs">
@ -1799,14 +1852,16 @@ license:CC0-1.0
<year>1988</year>
<publisher>Electronic Arts</publisher>
<info name="programmer" value="Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer" />
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
<info name="version" value="1.1 07-Oct-88 - ROM 03 compatible" />
<!-- sod.sys16 dated 07-Oct-88 -->
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- sports game -->
<!-- It requires a 512K Apple IIgs. Music requires 768K. -->
<!-- "Skate or Die" is a 1988 sports game developed by Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer, and distributed by Electronic Arts. -->
<!-- Patched to be compatible with ROM03 -->
<!-- sod.sys16 dated 07-Oct-88 -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="skate or die v1.1 iigs (trex crack).2mg" size="819264" crc="dde655cd" sha1="cf40c92a699cf9e7c79f1a25c3f22f32f5a28d46"/>
@ -1819,17 +1874,20 @@ license:CC0-1.0
<year>1988</year>
<publisher>Electronic Arts</publisher>
<info name="programmer" value="Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer" />
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
<info name="version" value="1.0 12-Aug-88 - ROM 03 compatible" />
<info name="usage" value="Requires a 512K Apple IIgs. Music requires 768K." />
<!-- sod.sys16 dated 12-Aug-88 -->
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- sports game -->
<!-- Dump released: 2025-01-25, redump based on WOZ released on 2024-09-02 -->
<!-- It requires a 512K Apple IIgs. Music requires 768K. -->
<!-- "Skate or Die" is a 1988 sports game developed by Michael Kosaka, Stephen Landrum, David Bunch, and Michelle Shelfer, and distributed by Electronic Arts. -->
<!-- Patched to be compatible with ROM03 -->
<!-- sod.sys16 dated 12-Aug-88 -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="skate or die v1.0 iigs (trex crack).2mg" size="819264" crc="466b7067" sha1="776c78d962d46b6b20ca464bbbed2e2f746f4099"/>
<rom name="skate or die v1.0 iigs (trex crack).2mg" size="819264" crc="f87d1ec3" sha1="9e28b572f9d53fd276066b3701de42d45ee9cc51"/>
</dataarea>
</part>
</software>
@ -1839,6 +1897,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>Sierra On-Line</publisher>
<info name="release" value="2021-08-13"/>
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
<!-- It requires a 512K Apple IIgs. -->
@ -2354,6 +2413,70 @@ license:CC0-1.0
</part>
</software>
<software name="ntsbalpha">
<description>The New Talking Stickybear Alphabet (cleanly cracked)</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs ROM01 or later. -->
<!-- "The New Talking Stickybear Alphabet" is an educational program designed to teach children the alphabet through the use of graphics and speech -->
<!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
<dataarea name="flop" size="819264">
<rom name="the new talking stickybear alphabet iigs disk 1 (trex crack).2mg" size="819264" crc="4f80d28b" sha1="c6b243cc8aa3c2b39658095c5a1b91bbdcd40629" />
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<feature name="part_id" value="Disk 2" />
<dataarea name="flop" size="819264">
<rom name="the new talking stickybear alphabet iigs disk 2 (trex crack).2mg" size="819264" crc="35817368" sha1="1426cf78a664e0ec41128fec150c084e9d1f3874" />
</dataarea>
</part>
</software>
<software name="ntsbopp">
<description>The New Talking Stickybear Opposites (cleanly cracked)</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="developer" value="Optimum Resource" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs ROM01 or later. -->
<!-- "The New Talking Stickybear Opposites" is an educational program designed to teach children opposites through the use of graphics and speech -->
<!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="the new talking stickybear opposites iigs (trex crack).2mg" size="819264" crc="a2ce5ec8" sha1="0954c66f8858d26ce70c1926236b4115f705f2c5" />
</dataarea>
</part>
</software>
<software name="ntsbshapes">
<description>The New Talking Stickybear Shapes (cleanly cracked)</description>
<year>1988</year>
<publisher>Optimum Resource</publisher>
<info name="programmer" value="Richard Hefter, David Cunningham, and Susan Dubicki" />
<info name="usage" value="Requires a 512K Apple IIgs ROM01 or later." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs ROM01 or later. -->
<!-- "The New Talking Stickybear Shapes" is an educational program designed to teach children basic shapes through the use of graphics and speech -->
<!-- Protection: Unformatted track $03, Side $01 (bad blocks $54 through $5F) check -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="the new talking stickybear shapes iigs (trex crack).2mg" size="819264" crc="f52125b9" sha1="93967102bb9642aba3607291cf30d6e0a1a01c5e" />
</dataarea>
</part>
</software>
<software name="printshp">
<description>The Print Shop (version 1.0) (cleanly cracked)</description>
<year>1987</year>
@ -2406,6 +2529,7 @@ license:CC0-1.0
<year>1987</year>
<publisher>PBI Software</publisher>
<info name="programmer" value="Richard L. Seaborne and Jeff A. Lamberts" />
<info name="version" value="1.0" />
<info name="usage" value="Requires a 768K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS"/>
<!-- Dump released: 2021-08-13 -->
@ -2540,18 +2664,39 @@ license:CC0-1.0
</part>
</software>
<software name="topdraw100a">
<description>TopDraw (version 1.00A (7/12/87)) (trex crack)</description>
<software name="topdraw">
<description>TopDraw (version 1.01A (8/4/87)) (cleanly cracked)</description>
<year>1987</year>
<publisher>StyleWare</publisher>
<info name="programmer" value="Robert A. Hearn and Jeff G. Erickson" />
<info name="version" value="1.01A (8/4/87)" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2025-01-25 -->
<!-- It requires a 512K Apple IIgs. -->
<!-- "TopDraw" is a professional object-oriented graphics drawing environment. Beagle Bros Software later acquired the StyleWare library and rebranded TopDraw as BeagleDraw. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="topdraw v1.01a iigs (trex crack).2mg" size="819264" crc="d7cf235e" sha1="b488b0cef54cb71f447a0d6b508f86220cb09d4d" />
</dataarea>
</part>
</software>
<software name="topdraw100a" cloneof="topdraw">
<description>TopDraw (version 1.00A (7/12/87)) (cleanly cracked)</description>
<year>1987</year>
<publisher>StyleWare</publisher>
<info name="programmer" value="Robert A. Hearn and Jeff G. Erickson" />
<info name="usage" value="Requires a 1MB Apple IIgs." />
<info name="version" value="1.00A (7/12/87)" />
<info name="usage" value="Requires a 512K Apple IIgs." />
<sharedfeat name="compatibility" value="A2GS" />
<!-- Dump released: 2021-08-13 -->
<!-- graphics program -->
<!-- TopDraw later became Beagle Draw sold under the Beagle Brothers banner. -->
<!-- It requires a 512K Apple IIgs. -->
<!-- "TopDraw" is a professional object-oriented graphics drawing environment. Beagle Bros Software later acquired the StyleWare library and rebranded TopDraw as BeagleDraw. -->
<!-- Protection: Nibble count on tracks $20 & $21 -->
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="topdraw v1.00a iigs (trex crack).2mg" size="819264" crc="39e7967f" sha1="35746bbc2232251d96264989705a6e6286bafef5"/>

View File

@ -10321,6 +10321,7 @@ license:CC0-1.0
<!--
Origin: Redump
http://redump.org/disc/88153/
http://redump.org/disc/88154/
-->
<description>Validation Disc (Version 1.0)</description>
<!-- '89 for disc 1, '90 for disc 2 -->

View File

@ -36399,7 +36399,9 @@ Please stick to using the floppy versions for the time being...
</part>
</software>
<software name="technocp" supported="no">
<!-- All data is in the one tape image. When the game asks to flip the tape to side 2, just keep the tape running.
You may want to take note where this occurs in case you need to restart and rewind the tape. -->
<software name="technocp" supported="yes">
<description>Techno Cop (UK)</description>
<year>1988</year>
<publisher>Gremlin Graphics Software</publisher>

View File

@ -5873,7 +5873,7 @@ Has optional unemulated [32X] mode, which in turn needs [disc swap]
<rom name="Game no Kandume Vol.1 (Japan) (Track 30).bin" size="19121760" crc="aa75b323" />
<rom name="Game no Kandume Vol.1 (Japan) (Track 31).bin" size="1300656" crc="0db9cca1" />
-->
<description>Game no Kandume Vol.1 (Japan)</description>
<description>Game no Kanzume Vol.1 (Japan)</description>
<year>1994</year>
<publisher>Sega</publisher>
<info name="serial" value="G-6032"/>
@ -5916,7 +5916,7 @@ Has optional unemulated [32X] mode, which in turn needs [disc swap]
<rom name="Game no Kandume Vol.2 (Japan) (Track 23).bin" size="19121760" crc="aa75b323" />
<rom name="Game no Kandume Vol.2 (Japan) (Track 24).bin" size="1420608" crc="e76b47df" />
-->
<description>Game no Kandume Vol.2 (Japan)</description>
<description>Game no Kanzume Vol.2 (Japan)</description>
<year>1994</year>
<publisher>Sega</publisher>
<info name="serial" value="G-6033"/>

View File

@ -257,6 +257,20 @@ kanji name, romaji name, manufacturer, release date in %MMM %YY format, notes
</part>
</software>
<software name="ctgolf" supported="no">
<description>Computer the Golf</description>
<year>1983</year>
<publisher>日本ファルコム (Nihon Falcom)</publisher>
<!-- PC8801 -->
<info name="release" value="198310xx"/>
<info name="alt_title" value="コンピュータ ザ ゴルフ"/>
<part name="cass" interface="pc8801_cass">
<dataarea name="cass" size="23624">
<rom name="computer the golf.t88" size="23624" crc="a149466d" sha1="176a97e426d4b0a9fca206db249bdcb07870d24c"/>
</dataarea>
</part>
</software>
<software name="cosmox">
<description>Cosmo Cross</description>
<year>19??</year>

View File

@ -240,6 +240,7 @@ Are the following undumped or mistranslated (check also if available in TOSEC)?
- ゴルゴ13 狼の巣 (198410xx) by Pony Canyon
- Breakfast3号 (1984xxxx) by Kominiketo
- Blue Blood disks (at least Vol. 1-6 and CG set Vol. 1 according to gradiusm)
- S.F.3.D Original Operation V by Cross Media Soft
Not included:
- ミラーズ (19901210) by Studio Wing, uses CDROM (>PC8801MC)
@ -5898,12 +5899,13 @@ Not extensively tested
</software>
<software name="carmine">
<description>Carmine</description>
<description>Carmine 88</description>
<year>1987</year>
<publisher>マイクロキャビン (Micro Cabin)</publisher>
<!-- PC8801 -->
<!-- PC8801mk2SR -->
<info name="release" value="198702xx"/>
<info name="alt_title" value="カーマイン"/>
<info name="alt_title" value="カーマイン88"/>
<info name="usage" value="Needs BASIC V2"/>
<!--combined image-->
<!--rom name="carmine.d88" size="770496" crc="ade94761" sha1="220ee916091ece8176e56867e3923529a8c49591"/-->
@ -5923,12 +5925,13 @@ Not extensively tested
</software>
<software name="carminea" cloneof="carmine">
<description>Carmine (alt?)</description>
<description>Carmine 88 (alt?)</description>
<year>1987</year>
<publisher>マイクロキャビン (Micro Cabin)</publisher>
<!-- PC8801 -->
<!-- PC8801mk2SR -->
<info name="release" value="198702xx"/>
<info name="alt_title" value="カーマイン"/>
<info name="alt_title" value="カーマイン88"/>
<info name="usage" value="Needs BASIC V2"/>
<!--combined image-->
<!--rom name="carmine.d88" size="1140944" crc="62aeef7e" sha1="18a952b782b71177fa0000652422d0ed23d7d6a5"/-->
@ -29118,26 +29121,13 @@ Start and Program Disks OK, the remaining part is damaged (missing d88 headers?)
</part>
</software>
<software name="sf3dopv">
<description>S.F.3.D Original Operation V</description>
<year>1985</year>
<publisher>クロスメディアソフト (Cross Media Soft)</publisher>
<!-- PC8801 -->
<info name="release" value="198512xx"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="365168">
<rom name="s.f.3.d original operation v (1985)(cross media).d88" size="365168" crc="ffb66bfb" sha1="8524f776b1a0730086ebc78ae6dc20b4483fff57"/>
</dataarea>
</part>
</software>
<software name="sf3dthxg">
<description>S.F.3.D. - Original Operation Thanksgiving</description>
<description>Point X Senryō Sakusen S.F.3.D - Original Operation Thanksgiving</description>
<year>1986</year>
<publisher>クロスメディアソフト (Cross Media Soft)</publisher>
<!-- PC8801 -->
<info name="release" value="198609xx"/>
<info name="alt_title" value="ポイントX占領作戦 (Box)"/>
<info name="alt_title" value="ポイントX占領作戦 S.F.3.D - Original Operation Thanksgiving (Box)"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="365168">
<rom name="s.f.3.d. - original operation thanksgiving.d88" size="365168" crc="4985b37a" sha1="d13efd4b247b0e6ec702e769e51a5963fa007411"/>
@ -29145,6 +29135,20 @@ Start and Program Disks OK, the remaining part is damaged (missing d88 headers?)
</part>
</software>
<software name="sf3dthxga" cloneof="sf3dthxg">
<description>Point X Senryō Sakusen S.F.3.D - Original Operation Thanksgiving (alt)</description>
<year>1986</year>
<publisher>クロスメディアソフト (Cross Media Soft)</publisher>
<!-- PC8801 -->
<info name="release" value="198609xx"/>
<info name="alt_title" value="ポイントX占領作戦 S.F.3.D - Original Operation Thanksgiving (Box)"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="365168">
<rom name="s.f.3.d. - original operation thanksgiving (a).d88" size="365168" crc="ffb66bfb" sha1="8524f776b1a0730086ebc78ae6dc20b4483fff57"/>
</dataarea>
</part>
</software>
<software name="saziri">
<description>Sa・Zi・Ri</description>
<year>1988</year>

View File

@ -1572,7 +1572,7 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo '#define BARE_BUILD_VERSION "0.273"' > $@
@echo '#define BARE_BUILD_VERSION "0.274"' > $@
@echo '#define BARE_VCS_REVISION "$(NEW_GIT_VERSION)"' >> $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char bare_vcs_revision[];' >> $@
@ -1582,7 +1582,7 @@ $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo 'const char build_version[] = BARE_BUILD_VERSION " (" BARE_VCS_REVISION ")";' >> $@
else
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo #define BARE_BUILD_VERSION "0.273" > $@
@echo #define BARE_BUILD_VERSION "0.274" > $@
@echo #define BARE_VCS_REVISION "$(NEW_GIT_VERSION)" >> $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char bare_vcs_revision[]; >> $@

View File

@ -319,6 +319,6 @@ ioport_constructor z_89_11_device::device_input_ports() const
return INPUT_PORTS_NAME(z_89_11_device);
}
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(H89BUS_Z_89_11, device_h89bus_right_card_interface, z_89_11_device, "z_89_11", "Heath/Zenith Z-89-11 Multi-Function I/O Card");

View File

@ -46,8 +46,7 @@
#include "machine/z80sio.h"
// Debugging
#undef VERBOSE
#define VERBOSE 0
//#define VERBOSE 1
#include "logmacro.h"
namespace {
@ -154,7 +153,7 @@ protected:
bool m_rt_in;
uint8_t m_modem_ctrl;
uint8_t m_modem_status;
uint8_t m_low_ram[ LOW_RAM_SIZE ];
uint8_t m_low_ram[LOW_RAM_SIZE];
};
base_98628_9_device::base_98628_9_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
@ -385,14 +384,16 @@ void base_98628_9_device::cpu_io_mem_map(address_map &map)
void base_98628_9_device::install_68k_map(offs_t base_addr)
{
dio().install_memory(0x0000 + base_addr,
0x0007 + base_addr,
read16sm_delegate(*this, [this](offs_t addr) { return reg_r(addr); }, ""),
write16sm_delegate(*this, [this](offs_t addr, uint16_t data) { reg_w(addr, uint8_t(data)); }, ""));
dio().install_memory(0x4000 + base_addr,
0x7fff + base_addr,
read16sm_delegate(*this, FUNC(base_98628_9_device::low_ram_r_68k)),
write16sm_delegate(*this, FUNC(base_98628_9_device::low_ram_w_68k)));
dio().install_memory(
0x0000 + base_addr,
0x0007 + base_addr,
read16sm_delegate(*this, NAME([this] (offs_t addr) { return reg_r(addr); })),
write16sm_delegate(*this, NAME([this] (offs_t addr, uint16_t data) { reg_w(addr, uint8_t(data)); })));
dio().install_memory(
0x4000 + base_addr,
0x7fff + base_addr,
read16sm_delegate(*this, FUNC(base_98628_9_device::low_ram_r_68k)),
write16sm_delegate(*this, FUNC(base_98628_9_device::low_ram_w_68k)));
}
uint8_t base_98628_9_device::reg_r(offs_t addr)
@ -503,7 +504,7 @@ uint8_t base_98628_9_device::low_ram_r_z80(offs_t addr)
m_sio->ctsb_w(m_ctsb);
LOG("CTSB 0\n");
}
return m_low_ram[ addr & (LOW_RAM_SIZE - 1) ];
return m_low_ram[addr & (LOW_RAM_SIZE - 1)];
}
uint16_t base_98628_9_device::low_ram_r_68k(offs_t addr)
@ -514,7 +515,7 @@ uint16_t base_98628_9_device::low_ram_r_68k(offs_t addr)
update_irq();
LOG("IRQ 0\n");
}
return m_low_ram[ addr & (LOW_RAM_SIZE - 1) ];
return m_low_ram[addr & (LOW_RAM_SIZE - 1)];
}
void base_98628_9_device::low_ram_w_z80(offs_t addr, uint8_t data)
@ -525,7 +526,7 @@ void base_98628_9_device::low_ram_w_z80(offs_t addr, uint8_t data)
LOG("IRQ 1\n");
update_irq();
}
m_low_ram[ addr & (LOW_RAM_SIZE - 1) ] = data;
m_low_ram[addr & (LOW_RAM_SIZE - 1)] = data;
}
void base_98628_9_device::low_ram_w_68k(offs_t addr, uint16_t data)
@ -536,7 +537,7 @@ void base_98628_9_device::low_ram_w_68k(offs_t addr, uint16_t data)
LOG("CTSB 1\n");
m_sio->ctsb_w(m_ctsb);
}
m_low_ram[ addr & (LOW_RAM_SIZE - 1) ] = uint8_t(data);
m_low_ram[addr & (LOW_RAM_SIZE - 1)] = uint8_t(data);
}
uint8_t base_98628_9_device::sio_r(offs_t addr)
@ -873,7 +874,7 @@ protected:
bool m_tx;
bool m_last_tt;
uint8_t m_sr;
uint8_t m_high_ram[ HIGH_RAM_SIZE ];
uint8_t m_high_ram[HIGH_RAM_SIZE];
};
void dio16_98629_device::device_start()
@ -995,20 +996,21 @@ void dio16_98629_device::cpu_program_mem_map(address_map &map)
void dio16_98629_device::install_68k_map(offs_t base_addr)
{
base_98628_9_device::install_68k_map(base_addr);
dio().install_memory(0x8000 + base_addr,
0xbfff + base_addr,
read16sm_delegate(*this, [this](offs_t addr) { return high_ram_r_z80(addr); }, ""),
write16sm_delegate(*this, [this](offs_t addr, uint16_t data) { high_ram_w_z80(addr, uint8_t(data)); }, ""));
dio().install_memory(
0x8000 + base_addr,
0xbfff + base_addr,
read16sm_delegate(*this, NAME([this] (offs_t addr) { return high_ram_r_z80(addr); })),
write16sm_delegate(*this, NAME([this] (offs_t addr, uint16_t data) { high_ram_w_z80(addr, uint8_t(data)); })));
}
uint8_t dio16_98629_device::high_ram_r_z80(offs_t addr)
{
return m_high_ram[ addr & (HIGH_RAM_SIZE - 1) ];
return m_high_ram[addr & (HIGH_RAM_SIZE - 1)];
}
void dio16_98629_device::high_ram_w_z80(offs_t addr, uint8_t data)
{
m_high_ram[ addr & (HIGH_RAM_SIZE - 1) ] = data;
m_high_ram[addr & (HIGH_RAM_SIZE - 1)] = data;
}
void dio16_98629_device::tx_out(int state)

View File

@ -2,10 +2,12 @@
// copyright-holders:Andrei I. Holub
#include "emu.h"
#include "kl1839vm1.h"
#include "kl1839vm1dasm.h"
#include "cpu/vax/vaxdasm.h"
#include <algorithm>
#include <regex>
@ -132,7 +134,7 @@ u32 kl1839vm1_device::shr(u32 val, bool va, u8 fo, bool a_c, bool l_r)
void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va = false, u8 fo = 0)
{
u64 res = 0;
switch(fd)
switch (fd)
{
case 0b11:
x = s8(x);
@ -148,7 +150,7 @@ void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va =
}
RSP &= ~(VF | CF);
switch(kop)
switch (kop)
{
case 0b0000: res = y; break;
// 0b0001:
@ -191,7 +193,7 @@ void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va =
default: break;
}
switch(fd)
switch (fd)
{
case 0b11:
res &= 0x000000ff;
@ -207,7 +209,8 @@ void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va =
break;
}
R(rz) |= res;
if (rz == 0x1f) mreg_w();
if (rz == 0x1f)
mreg_w();
}
bool kl1839vm1_device::mreg_r()
@ -874,10 +877,14 @@ void kl1839vm1_device::vax_decode_pc()
}
if (!m_op_size)
{
LOGVAX("(%x): undecoded OP=%02x .. EXIT\n", PC, op);
}
else
{
PC += m_op_size; // move to a next op
;//LOGVAX("(%x): Decoded: OP=%02x args:%d \n", PC, op, m_pcm_queue.size());
/*LOGVAX("(%x): Decoded: OP=%02x args:%d \n", PC, op, m_pcm_queue.size())*/;
}
}
u32 kl1839vm1_device::vax_pcm_pull(bool is_bo)

View File

@ -1109,7 +1109,7 @@ bool vax_disassembler::is_read_mode(vax_disassembler::mode m)
}
}
const vax_disassembler::mode* vax_disassembler::get_operands(u8 op)
const vax_disassembler::mode *vax_disassembler::get_operands(u8 op)
{
return s_nonprefix_ops[op].operand;
}

View File

@ -31,7 +31,7 @@ public:
vax_disassembler();
static bool is_read_mode(mode m);
static const mode* get_operands(u8 op);
static const mode *get_operands(u8 op);
protected:
// disassembler overrides

View File

@ -6,11 +6,10 @@
* CMOS Local Area Network Controller for Ethernet (C-LANCE).
*
* Sources:
* - Am7990 Local Area Network Controller for Ethernet (LANCE), Publication #05698, Rev. C, June 1990, Advanced Micro Devices
* - Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE), Publication #17881, Rev. C, January 1998, Advanced Micro Devices
*
* http://bitsavers.org/components/amd/Am7990/Am7990.pdf
* http://bitsavers.org/components/amd/Am7990/Am79c90.pdf
*
* TODO
* TODO:
* - external loopback
* - hp9k/3xx diagnostic failures
*
@ -64,6 +63,7 @@ am7990_device_base::am7990_device_base(const machine_config &mconfig, device_typ
, m_intr_out_cb(*this)
, m_dma_in_cb(*this, 0)
, m_dma_out_cb(*this)
, m_interrupt(nullptr)
, m_transmit_poll(nullptr)
, m_intr_out_state(1)
{
@ -84,6 +84,7 @@ constexpr attotime am7990_device_base::TX_POLL_PERIOD;
void am7990_device_base::device_start()
{
m_interrupt = timer_alloc(FUNC(am7990_device_base::interrupt), this);
m_transmit_poll = timer_alloc(FUNC(am7990_device_base::transmit_poll), this);
m_transmit_poll->adjust(TX_POLL_PERIOD, 0, TX_POLL_PERIOD);
@ -123,7 +124,12 @@ void am7990_device_base::device_reset()
update_interrupts();
}
void am7990_device_base::update_interrupts()
void am7990_device_base::interrupt(s32 param)
{
m_intr_out_cb(param);
}
void am7990_device_base::update_interrupts(attotime const delay)
{
if (m_csr[0] & CSR0_INEA)
{
@ -131,7 +137,7 @@ void am7990_device_base::update_interrupts()
if (bool(m_csr[0] & CSR0_INTR) == m_intr_out_state)
{
m_intr_out_state = !m_intr_out_state;
m_intr_out_cb(m_intr_out_state);
m_interrupt->adjust(delay, m_intr_out_state);
if (!m_intr_out_state)
LOG("interrupt asserted\n");
@ -143,7 +149,7 @@ void am7990_device_base::update_interrupts()
if (!m_intr_out_state)
{
m_intr_out_state = !m_intr_out_state;
m_intr_out_cb(m_intr_out_state);
m_interrupt->adjust(delay, m_intr_out_state);
}
}
}
@ -543,6 +549,8 @@ void am7990_device_base::regs_w(offs_t offset, u16 data)
{
LOGMASKED(LOG_REG, "regs_w csr%d data 0x%04x (%s)\n", m_rap, data, machine().describe_context());
attotime delay = attotime::zero;
switch (m_rap)
{
case 0: // Control/Status
@ -571,7 +579,17 @@ void am7990_device_base::regs_w(offs_t offset, u16 data)
if ((data & CSR0_INIT) && !(m_csr[0] & CSR0_INIT))
{
if (m_csr[0] & CSR0_STOP)
{
initialize();
/*
* Initialization reads 12 words from the bus using single
* word DMA transfers. Allow 2 cycles for bus acquisition
* and release, plus 6 cycles for each single word DMA
* transfer.
*/
delay = attotime::from_ticks((1 + 6 + 1) * 12, clock());
}
else
m_csr[0] |= m_idon ? CSR0_IDON : CSR0_INIT;
}
@ -649,7 +667,7 @@ void am7990_device_base::regs_w(offs_t offset, u16 data)
else
m_csr[0] &= ~CSR0_INTR;
update_interrupts();
update_interrupts(delay);
break;
case 1: // Least significant 15 bits of the Initialization Block

View File

@ -34,9 +34,10 @@ protected:
// device helpers
void initialize();
void update_interrupts();
void interrupt(s32 param);
void update_interrupts(attotime const delay = attotime::zero);
int receive(u8 *buf, int length);
TIMER_CALLBACK_MEMBER(transmit_poll);
void transmit_poll(s32 param);
void transmit();
bool address_filter(u8 *buf);
@ -163,6 +164,7 @@ private:
u8 m_tx_ring_pos;
u16 m_tx_md[4];
emu_timer *m_interrupt;
emu_timer *m_transmit_poll;
int m_intr_out_state;
bool m_idon;

View File

@ -972,6 +972,15 @@ u16 mc68328_device::csd_lsw_r() // 0x11e, 0x12e, 0x13e, 0x14e
// MMU/chip-select hardware - EZ variant
//-------------------------------------------------
void mc68ez328_device::scr_w(u8 data)
{
if (data & SCR_WDTH8)
{
m_pasel = 0xff;
}
mc68328_base_device::scr_w(data);
}
u8 mc68ez328_device::revision_r(offs_t offset)
{
LOGMASKED(LOG_PLL, "%s: revision_r: Silicon Revision[%d] = %02x\n", machine().describe_context(), offset, 0x01);
@ -2668,7 +2677,7 @@ void mc68328_base_device::update_gptimer_state()
}
else
{
timer->adjust(attotime::from_ticks(regs.tcmp, get_timer_frequency<Timer>()));
timer->adjust(attotime::from_hz(get_timer_frequency<Timer>()));
}
}
else
@ -2683,39 +2692,30 @@ TIMER_CALLBACK_MEMBER(mc68328_base_device::timer_tick)
timer_regs &regs = get_timer_regs(Timer);
emu_timer *timer = get_timer(Timer);
regs.tcn = regs.tcmp;
regs.tstat |= TSTAT_COMP;
if ((regs.tctl & TCTL_FRR) == TCTL_FRR_RESTART)
u32 frequency = get_timer_frequency<Timer>();
if (frequency > 0)
{
u32 frequency = get_timer_frequency<Timer>();
if (frequency > 0)
{
attotime period = attotime::from_hz(frequency) * regs.tcmp;
regs.tcn = 0x0000;
timer->adjust(period);
}
else
{
timer->adjust(attotime::never);
}
attotime period = attotime::from_hz(frequency);
timer->adjust(period);
}
else
{
u32 frequency = get_timer_frequency<Timer>();
if (frequency > 0)
{
attotime period = attotime::from_hz(frequency) * 0x10000;
timer->adjust(period);
}
else
{
timer->adjust(attotime::never);
}
timer->adjust(attotime::never);
}
if ((regs.tctl & TCTL_IRQEN) == TCTL_IRQEN_ENABLE)
regs.tcn++;
if (regs.tcn == regs.tcmp)
{
set_interrupt_line(get_timer_int(Timer), 1);
regs.tstat |= TSTAT_COMP;
if ((regs.tctl & TCTL_FRR) == TCTL_FRR_RESTART)
{
regs.tcn = 0x0000;
}
if ((regs.tctl & TCTL_IRQEN) == TCTL_IRQEN_ENABLE)
{
set_interrupt_line(get_timer_int(Timer), 1);
}
}
}

View File

@ -430,7 +430,7 @@ protected:
RTCHMSR_HOURS_SHIFT = 24,
};
void scr_w(u8 data);
virtual void scr_w(u8 data);
void grpbasea_w(u16 data);
void grpbaseb_w(u16 data);
@ -1143,6 +1143,8 @@ private:
INT_MEMIQ_MASK = (1 << INT_MEMIQ),
};
virtual void scr_w(u8 data) override;
void csa_w(offs_t offset, u16 data, u16 mem_mask);
void csb_w(offs_t offset, u16 data, u16 mem_mask);
void csc_w(offs_t offset, u16 data, u16 mem_mask);

View File

@ -2551,9 +2551,11 @@ void z80sio_channel::txc_w(int state)
// Generate a new bit
bool new_bit = false;
if ((m_wr4 & (WR4_SYNC_MODE_MASK | WR4_STOP_BITS_MASK)) == (WR4_SYNC_MODE_SDLC | WR4_STOP_BITS_SYNC) &&
(m_tx_flags & (TX_FLAG_DATA_TX | TX_FLAG_CRC_TX)) && (m_tx_hist & 0x1f) == 0x1f)
(m_tx_flags & (TX_FLAG_DATA_TX | TX_FLAG_CRC_TX)) && (m_tx_hist & 0x1f) == 0x1f)
{
// SDLC, sending data/CRC & 5 ones in a row: do zero insertion
new_bit = false;
}
else
{
bool get_out = false;

View File

@ -2106,13 +2106,15 @@ void lua_engine::initialize()
ui_type["options"] = sol::property([] (mame_ui_manager &m) { return static_cast<core_options *>(&m.options()); });
ui_type["line_height"] = sol::property([] (mame_ui_manager &m) { return m.get_line_height(); });
ui_type["menu_active"] = sol::property(&mame_ui_manager::is_menu_active);
ui_type["show_menu"] = &mame_ui_manager::show_menu;
ui_type["ui_active"] = sol::property(&mame_ui_manager::ui_active, &mame_ui_manager::set_ui_active);
ui_type["single_step"] = sol::property(&mame_ui_manager::single_step, &mame_ui_manager::set_single_step);
ui_type["show_fps"] = sol::property(&mame_ui_manager::show_fps, &mame_ui_manager::set_show_fps);
ui_type["show_profiler"] = sol::property(&mame_ui_manager::show_profiler, &mame_ui_manager::set_show_profiler);
ui_type["image_display_enabled"] = sol::property(&mame_ui_manager::image_display_enabled, &mame_ui_manager::set_image_display_enabled);
// undocumented/unsupported
ui_type["show_menu"] = &mame_ui_manager::show_menu; // FIXME: this is dangerous - it doesn't give a proper chance for the current UI handler to clean up
/* rom_entry library
*

View File

@ -791,7 +791,8 @@ cassette_image::error cassette_image::legacy_construct(const LegacyWaveFiller *l
error err;
int length;
int sample_count;
std::vector<int16_t> samples;
std::unique_ptr<int16_t []> samples;
std::unique_ptr<uint8_t []> chunk;
int pos = 0;
uint64_t offset = 0;
@ -814,16 +815,21 @@ cassette_image::error cassette_image::legacy_construct(const LegacyWaveFiller *l
/* determine number of samples */
if (args.chunk_sample_calc != nullptr)
{
if (size > 0x7FFFFFFF)
if (size > 0x7fffffff)
{
err = error::OUT_OF_MEMORY;
goto done;
}
LOG_FORMATS("Image size: %x\n", size);
std::vector<uint8_t> bytes(size);
image_read(&bytes[0], 0, size);
sample_count = args.chunk_sample_calc(&bytes[0], (int)size);
std::unique_ptr<uint8_t []> bytes(new (std::nothrow) uint8_t [size]);
if (!bytes)
{
err = error::OUT_OF_MEMORY;
goto done;
}
image_read(bytes.get(), 0, size);
sample_count = args.chunk_sample_calc(bytes.get(), (int)size);
// chunk_sample_calc functions report errors by returning negative numbers
if (sample_count < 0)
@ -843,7 +849,12 @@ cassette_image::error cassette_image::legacy_construct(const LegacyWaveFiller *l
sample_count += args.header_samples + args.trailer_samples;
/* allocate a buffer for the completed samples */
samples.resize(sample_count);
samples.reset(new (std::nothrow) int16_t [sample_count]);
if (!samples)
{
err = error::OUT_OF_MEMORY;
goto done;
}
/* if there has to be a header */
if (args.header_samples > 0)
@ -858,14 +869,28 @@ cassette_image::error cassette_image::legacy_construct(const LegacyWaveFiller *l
}
/* convert the file data to samples */
chunk.reset(new (std::nothrow) uint8_t [args.chunk_size]);
if (!chunk)
{
err = error::OUT_OF_MEMORY;
goto done;
}
while ((pos < sample_count) && (offset < size))
{
/* allocate a buffer for the binary data */
std::vector<uint8_t> chunk(args.chunk_size);
image_read(&chunk[0], offset, args.chunk_size);
image_read(chunk.get(), offset, args.chunk_size);
offset += args.chunk_size;
length = args.fill_wave(&samples[pos], args.chunk_size, &chunk[0]);
/*
This approach is problematic because we don't have control on incomming image size when processing the data
(at least in tap implementation).
The method sending the size of output (calculated in 'chunk_sample_calc' above) which uses same data as a input but
without knowing how much data available in the image. Having wrong header with size bigger than image couses illegal
access beyond image data.
Desired state is:
length = args.fill_wave(&samples[pos], args.chunk_size, chunk.get());
aslo the fix for tap is commented out in 'tap_cas_fill_wave'
*/
length = args.fill_wave(&samples[pos], sample_count - pos, chunk.get());
if (length < 0)
{
err = error::INVALID_IMAGE;
@ -875,6 +900,7 @@ cassette_image::error cassette_image::legacy_construct(const LegacyWaveFiller *l
if (length == 0)
break;
}
chunk.reset();
/* if there has to be a trailer */
if (args.trailer_samples > 0)

View File

@ -833,16 +833,19 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, const uint8_t *bytes
int16_t *p = buffer;
int size = 0;
while (length > 0)
//while (length > 0)
while (size < length)
{
int data_size = get_u16le(&bytes[0]);
int pilot_length = (bytes[2] == 0x00) ? 8063 : 3223;
LOG_FORMATS("tap_cas_fill_wave: Handling TAP block containing 0x%X bytes\n", data_size);
/*
length -= data_size;
if (length < 0)
{
data_size += length; // Take as much as we can.
}
*/
bytes += 2;
size += tzx_cas_handle_block(&p, bytes, 1000, data_size, 2168, pilot_length, 667, 735, 855, 1710, 8);
bytes += data_size;

View File

@ -2,16 +2,13 @@
// copyright-holders:m1macrophage
/*
The Midiverb is a digital delay & reverb unit.
The MIDIverb is a digital delay & reverb unit.
The computer portion of the device is very simple. The firmware runs on a
80C31 microcontroller. It reads the 4 buttons, drives the two 7-segment
displays, and listens to MIDI for program changes. It also controls which
program (effect) is running on the DSP.
An interesting aspect of the Midiverb is its DSP, which is built out of discrete
logic components. This runs custom microcode consisting of 4 instructions.
The UI is very simple. The user can choose one of 63 effects by using the
"up" and "down" buttons on the unit. The effect can also be set via MIDI
program changes, and the MIDI channel is configurable ("channel" button). The
@ -20,12 +17,18 @@ silence program is also enabled temporarily when switching between effects.
Finally, there is a wet/dry control knob. For more information on the audio
hardware, see midiverb_state::configure_audio().
An interesting aspect of the MIDIverb is its DSP, which is built out of discrete
logic components and runs custom microcode. Each microcode instruction consists
of a 2-bit opcode and 14-bit RAM delta offset. The effects program makes up the
top 6 bits of the microcode ROM address, and the DSP just loops over the 128
instructions of each program. There are also pre-determined program counter
addresses where specific functions are performed (e.g. ADC, DAC). For more info,
see midiverb_dsp::sound_stream_update().
This driver is based on https://www.youtube.com/watch?v=JNPpU08YZjk
and https://www.youtube.com/watch?v=5DYbirWuBaU, and is intended as an
educational tool.
TODO: DSP emulation (coming soon).
Usage notes:
The driver comes with an interactive layout.
@ -43,13 +46,9 @@ Audio inputs are emulated using MAME's sample playback mechanism.
- When the emulation is running, press Space to trigger the processing of those
files.
- Look out for any errors, such as unsupported file format.
- If there is distortion, adjust INPUT LEVEL (in the Slider Controls menu).
- If there is distortion or crackling, adjust INPUT LEVEL (in the Slider
Controls menu).
- Use the "DRY/WET MIX" Slider Control to adjust the wet/dry ratio.
- At the moment, DSP emulation is mostly a passthrough. It just does a
12-bit quantization and causes a resampling at its lowish sample rate. But it
should still be possible to hear the difference between the dry and wet
signals, in part due to all the filtering stages.
*/
#include "emu.h"
@ -68,8 +67,9 @@ Audio inputs are emulated using MAME's sample playback mechanism.
#include "alesis_midiverb.lh"
#define LOG_PROGRAM_CHANGE (1U << 1)
#define LOG_DSP_EXECUTION (1U << 2)
#define VERBOSE (LOG_GENERAL | LOG_PROGRAM_CHANGE)
#define VERBOSE (LOG_GENERAL)
//#define LOG_OUTPUT_FUNC osd_printf_info
#include "logmacro.h"
@ -88,8 +88,18 @@ protected:
void sound_stream_update(sound_stream &stream, const std::vector<read_stream_view> &inputs, std::vector<write_stream_view> &outputs) override;
private:
u16 analog_to_digital(float sample) const;
float digital_to_analog(u16 sample) const;
required_memory_region m_microcode;
sound_stream *m_stream = nullptr;
// State
u8 m_program = 0;
u16 m_accum = 0;
u16 m_reg = 0;
u16 m_ram_offset = 0;
std::vector<u16> m_ram; // 4 x TMS4416-15 (16K x 4bit). U14, U19, U22, U25.
static constexpr const int CLOCKS_PER_INSTRUCTION = 2;
static constexpr const int INSTRUCTIONS_PER_SAMPLE = 128;
@ -101,6 +111,8 @@ DEFINE_DEVICE_TYPE(MIDIVERB_DSP, midiverb_dsp, "midiverb_dsp", "MIDIverb discret
midiverb_dsp::midiverb_dsp(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MIDIVERB_DSP, tag, owner, clock)
, device_sound_interface(mconfig, *this)
, m_microcode(*this, ":dsp_microcode")
, m_ram(0x4000, 0) // 16K
{
}
@ -112,7 +124,7 @@ void midiverb_dsp::program_select_w(u8 data)
m_stream->update();
m_program = new_program;
LOGMASKED(LOG_PROGRAM_CHANGE, "Program changed to: %d\n", m_program);
LOGMASKED(LOG_PROGRAM_CHANGE, "DSP: Program changed to: %d\n", m_program);
}
void midiverb_dsp::device_start()
@ -123,10 +135,24 @@ void midiverb_dsp::device_start()
m_stream = stream_alloc(1, 2, sample_clock.value());
save_item(NAME(m_program));
save_item(NAME(m_accum));
save_item(NAME(m_reg));
save_item(NAME(m_ram_offset));
save_item(NAME(m_ram));
}
#define LOG_DSP(...) do { \
if (sample_i < DEBUG_SAMPLES) \
LOGMASKED(LOG_DSP_EXECUTION, __VA_ARGS__); \
} while(0)
void midiverb_dsp::sound_stream_update(sound_stream &stream, const std::vector<read_stream_view> &inputs, std::vector<write_stream_view> &outputs)
{
static constexpr const u8 MAX_PC = 0x7f;
static constexpr const int DEBUG_SAMPLES = 2;
static constexpr const char* const OP_NAME[4] =
{ "ADDHF", "LDHF ", "STPOS", "STNEG" };
assert(inputs.size() == 1);
assert(outputs.size() == 2);
@ -134,28 +160,135 @@ void midiverb_dsp::sound_stream_update(sound_stream &stream, const std::vector<r
write_stream_view &left = outputs[0];
write_stream_view &right = outputs[1];
const int n = in.samples();
const u16 rom_base = u16(m_program) << 8;
for (int i = 0; i < n; ++i)
for (int sample_i = 0; sample_i < n; ++sample_i)
{
// Analog-to-digital conversion is done with a 12-bit DAC+SAR.
// Note that samples in the stream are treated as voltages (see
// configure_audio()). Convert the voltage to the range: -/+1.
const float sample_in = std::clamp(in.get(i), -DAC_MAX_V, DAC_MAX_V) / DAC_MAX_V;
// Quantize to 12 bits, keeping in mind that the range is -1 - 1 (reason
// for "/ 2"), then convert to 13 bits ("* 2").
const s16 quantized = floorf(sample_in * ((1 << 12) / 2 - 1)) * 2;
assert(quantized > -4096 && quantized < 4096);
u16 rom_address = rom_base + 2 * (MAX_PC - 1);
for (u8 pc = 0; pc <= MAX_PC; ++pc)
{
// Each microcode instruction consists of two bytes. A 2-bit opcode
// and a 14-bit RAM offset. Microcode execution is pipelined:
// - The RAM offset in each instruction gets added to the current
// RAM address *after* the execution of the instruction, so it
// affects the RAM access of the next instruction.
// - The 2-bit opcode being executed comes from the *previous*
// instruction in ROM.
// - The "program counter" (whose value is used for some control
// signals, see below) leads the instruction currently being
// executed.
// TODO: Implement DSP logic (coming soon).
const u8 op = m_microcode->as_u8(rom_address + 1) >> 6;
rom_address = rom_base + 2 * ((pc + MAX_PC) & MAX_PC);
const u8 ram_row = m_microcode->as_u8(rom_address);
const u8 ram_col = m_microcode->as_u8(rom_address + 1) & 0x3f;
const u16 ram_offset_delta = (u16(ram_col) << 8) | ram_row;
// Digital-to-analog conversion uses the 12-bit DAC and 1 extra bit
// (LSB), for a total of 13 bits. The extra bit is implemented by
// conditionally injecting extra current into the current-to-voltage
// converter that follows the DAC.
const float sample_out = DAC_MAX_V * float(quantized) / ((1 << 13) / 2 - 1);
left.put(i, sample_out);
right.put(i, sample_out);
// Control signals. Names match those in:
// https://www.youtube.com/watch?v=JNPpU08YZjk.
const bool mode_rc0 = (pc == 0); // Read from ADC.
const bool ld_dac = (pc == 0x60 || pc == 0x70); // Write to DAC.
const bool dac_left = (pc == 0x70); // Route DAC to left (instead of right) channel.
const bool ld_dsp = !mode_rc0 && !ld_dac; // Write to register.
const bool clear_acc = BIT(op, 0); // Clear the accumulator.
const bool rd_r0 = (op == 0x02); // Place register contents on the bus.
const bool rd_r1 = (op == 0x03); // Place negated register contents on the bus.
const bool dram_w = BIT(op, 1) || mode_rc0; // Write (instead of read) RAM.
u16 bus_value = 0;
int num_bus_writes = 0;
if (mode_rc0)
{
bus_value = analog_to_digital(in.get(sample_i));
++num_bus_writes;
}
if (rd_r0)
{
bus_value = m_reg;
++num_bus_writes;
}
if (rd_r1)
{
bus_value = ~m_reg;
++num_bus_writes;
}
if (!dram_w)
{
bus_value = m_ram[m_ram_offset];
++num_bus_writes;
}
if (num_bus_writes == 0)
LOG("DSP microcode error: floating bus\n");
else if (num_bus_writes > 1)
LOG("DSP microcode error: bus conflict %d %d %d %d\n", mode_rc0, rd_r0, rd_r1, !dram_w);
if (dram_w)
m_ram[m_ram_offset] = bus_value;
if (ld_dac)
{
if (dac_left)
left.put(sample_i, digital_to_analog(bus_value));
else
right.put(sample_i, digital_to_analog(bus_value));
}
if (clear_acc)
m_accum = 0;
if (ld_dsp)
{
const u16 sign = BIT(bus_value, 15);
m_accum += ((sign << 15) | (bus_value >> 1)) + sign;
m_reg = m_accum;
}
LOG_DSP("%04X %02x - DSP OP: %d %s (%04x), A: %6d, R: %6d, bus: %6d, ram: %6d @ %04x",
rom_address, pc, op, OP_NAME[op], ram_offset_delta, m_accum,
m_reg, bus_value, m_ram[m_ram_offset], m_ram_offset);
if (mode_rc0)
LOG_DSP(" [ADC]");
if (ld_dac)
{
if (dac_left)
LOG_DSP(" [DAC LEFT]");
else
LOG_DSP(" [DAC RIGHT]");
}
LOG_DSP("\n");
m_ram_offset = (m_ram_offset + ram_offset_delta) & (m_ram.size() - 1);
}
LOG_DSP("\n");
}
LOGMASKED(LOG_DSP_EXECUTION, "\n");
}
u16 midiverb_dsp::analog_to_digital(float sample) const
{
// Analog-to-digital conversion is done with a 12-bit DAC+SAR.
// Note that samples in the stream are treated as voltages (see
// configure_audio()). Convert the voltage to the range: -/+1.
const float transformed = std::clamp(sample, -DAC_MAX_V, DAC_MAX_V) / DAC_MAX_V;
// Quantize to 12 bits, keeping in mind that the range is -1 - 1 (reason
// for "/ 2"). Then convert to 13 bits ("* 2"). Bit 0 is always set ("+ 1).
const s16 quantized = floorf(transformed * ((1 << 12) / 2 - 1)) * 2 + 1;
assert(quantized > -4096 && quantized < 4096);
return static_cast<u16>(quantized);
}
float midiverb_dsp::digital_to_analog(u16 sample) const
{
// Digital-to-analog conversion uses the 12-bit DAC and 1 extra bit
// (LSB), for a total of 13 bits. The extra bit is implemented by
// conditionally injecting extra current into the current-to-voltage
// converter that follows the DAC. There is also saturation logic to detect
// overflows and underflows, and set the DAC to the max or min value
// respectively.
const s16 saturated = std::clamp<s16>(static_cast<s16>(sample), -4095, 4095);
return DAC_MAX_V * float(saturated) / ((1 << 13) / 2 - 1);
}
namespace {
@ -502,17 +635,21 @@ INPUT_PORTS_START(midiverb)
PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(midiverb_state::audio_input_play), 0)
PORT_START("audio_input_level")
PORT_ADJUSTER(50, "INPUT LEVEL")
PORT_ADJUSTER(90, "INPUT LEVEL")
PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(midiverb_state::audio_input_level), 0)
INPUT_PORTS_END
ROM_START(midiverb)
ROM_REGION(0x2000, MAINCPU_TAG, 0)
// U54. 2764 ROM.
ROM_REGION(0x2000, MAINCPU_TAG, 0) // U54. 2764 ROM.
ROM_LOAD("mvop_4-7-86.u54", 0x000000, 0x002000, CRC(14d6596d) SHA1(c6dc579d8086556b2dd4909c8deb3c7006293816))
ROM_REGION(0x4000, "dsp_microcode", 0) // U51, 27256, 32K ROM, but only 16K used.
ROM_LOAD("mvobj_2-6-86.u51", 0x000000, 0x004000, CRC(1aa25250) SHA1(ebd7ca265540c3420f4259d0eaefecaf6d95a1bf))
ROM_CONTINUE(0x000000, 0x004000) // A14 (pin 27) tied to VCC. Only upper half used.
// Seems to have also shipped with a 27128 ROM (16K), with the same
// "MVOBJ 2-6-86" label.
ROM_END
} // anonymous namespace
SYST(1986, midiverb, 0, 0, midiverb, midiverb, midiverb_state, empty_init, "Alesis", "MIDIverb", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
SYST(1986, midiverb, 0, 0, midiverb, midiverb, midiverb_state, empty_init, "Alesis", "MIDIverb", MACHINE_SUPPORTS_SAVE)

View File

@ -416,8 +416,8 @@ public:
uint16_t m_genlock_color = 0;
/* separate 6 in-order bitplanes into 2 x 3-bit bitplanes in two nibbles */
// FIXME: we instantiate 256 entries so that it pleases AGA
uint8_t m_separate_bitplanes[2][256];
// AGA adds extra complexity with PF2OFx, so we need to instantiate at init time
std::vector<uint8_t> m_separate_bitplanes[2];
/* aga */
int m_aga_diwhigh_written = 0;
@ -429,6 +429,7 @@ public:
int m_aga_sprite_fetched_words = 0;
int m_aga_sprite_dma_used_words[8]{};
void video_start_common();
DECLARE_VIDEO_START( amiga );
DECLARE_VIDEO_START( amiga_aga );
void amiga_palette(palette_device &palette) const;

View File

@ -81,9 +81,24 @@ void amiga_state::amiga_palette(palette_device &palette) const
*
*************************************/
void amiga_state::video_start_common()
{
/* reset the genlock color */
m_genlock_color = 0xffff;
m_sprite_ctl_written = 0;
m_screen->register_screen_bitmap(m_flickerfixer);
m_screen->register_screen_bitmap(m_scanline_bitmap);
}
VIDEO_START_MEMBER( amiga_state, amiga )
{
video_start_common();
/* generate tables that produce the correct playfield color for dual playfield mode */
m_separate_bitplanes[0].resize(64);
m_separate_bitplanes[1].resize(64);
for (int j = 0; j < 64; j++)
{
int pf1pix = ((j >> 0) & 1) | ((j >> 1) & 2) | ((j >> 2) & 4);
@ -92,16 +107,8 @@ VIDEO_START_MEMBER( amiga_state, amiga )
m_separate_bitplanes[0][j] = (pf1pix || !pf2pix) ? pf1pix : (pf2pix + 8);
m_separate_bitplanes[1][j] = pf2pix ? (pf2pix + 8) : pf1pix;
}
// TODO: verify usage of values in the 64-255 range
// TODO: verify usage of values in the 64-255 range on real HW
// (should black out pf1 if j & 0x40, pf2 if j & 0x80)
/* reset the genlock color */
m_genlock_color = 0xffff;
m_sprite_ctl_written = 0;
m_screen->register_screen_bitmap(m_flickerfixer);
m_screen->register_screen_bitmap(m_scanline_bitmap);
}

View File

@ -86,15 +86,25 @@ void amiga_state::aga_palette_write(int color_reg, uint16_t data)
VIDEO_START_MEMBER(amiga_state,amiga_aga)
{
VIDEO_START_CALL_MEMBER( amiga );
video_start_common();
for (int j = 0; j < 256; j++)
// fill the AGA dblpf table, taking bplcon3:pf2ofx into account for offset values
m_separate_bitplanes[0].resize(256 * 8);
m_separate_bitplanes[1].resize(256 * 8);
static const int dblpfofs[] = { 0, 2, 4, 8, 16, 32, 64, 128 };
for (int offset_index = 0; offset_index < 8; offset_index ++)
{
int pf1pix = ((j >> 0) & 1) | ((j >> 1) & 2) | ((j >> 2) & 4) | ((j >> 3) & 8);
int pf2pix = ((j >> 1) & 1) | ((j >> 2) & 2) | ((j >> 3) & 4) | ((j >> 4) & 8);
int offset_value = dblpfofs[offset_index];
for (int j = 0; j < 256; j++)
{
int pf1pix = ((j >> 0) & 1) | ((j >> 1) & 2) | ((j >> 2) & 4) | ((j >> 3) & 8);
int pf2pix = ((j >> 1) & 1) | ((j >> 2) & 2) | ((j >> 3) & 4) | ((j >> 4) & 8);
m_separate_bitplanes[0][j] = (pf1pix || !pf2pix) ? pf1pix : (pf2pix + 16);
m_separate_bitplanes[1][j] = pf2pix ? (pf2pix + 16) : pf1pix;
m_separate_bitplanes[0][j + (offset_index << 8)] = (pf1pix || !pf2pix) ? pf1pix : (pf2pix + offset_value);
m_separate_bitplanes[1][j + (offset_index << 8)] = pf2pix ? (pf2pix + offset_value) : pf1pix;
}
}
m_aga_diwhigh_written = 0;
@ -464,6 +474,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
int pf1pri = 0, pf2pri = 0;
int planes = 0;
int raw_scanline = 0;
u8 bplam = 0;
u16 pf2ofx = 0;
uint32_t *dst = nullptr;
int ebitoffs = 0, obitoffs = 0;
@ -543,7 +555,6 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
// Update 2025: check and resort all these entries
// - wbenc30 scrolling in lores mode (fmode=3, expects a +58!, verify ddfstrt / delays)
// - sockid_a, alfred gameplay (fmode=1)
// - virocp_a (fmode=1, +26)
// - ssf2t (fmode=3, wants >+100, scrolling is very offset)
// - turbojam gameplay
// (fmode=3, unaffected here, may be missing ddfstop bits given the screen masking)
@ -551,12 +562,14 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
// - cd32 cdtv:insidino copyright screen (fmode=3)
// - cd32 cdtv:labytime intro/tutorial screens
// (swaps between fmode=1 and 3, verify ddfstrt / ddfstop)
const int offset_hack[] = {
11,
// fmode 1: virocp_a (copyright) +26
11,
11,
// fmode 3: dxgalaga (title) wants +20
20
// fmode 3: dxgalaga (title) wants +20, fatman_a (title) +24
24
};
const int default_bit_offset[] = { 15, 31, 31, 63 };
@ -628,6 +641,17 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
// In practice we need to separate bitplane delays & drawing first.
//shres = CUSTOM_REG(REG_BPLCON0) & 0x0040;
// offset table for pf2 when in dualpf
// - alfred_a, gameplay background
// - slamtilt, main menu cursor
// NOTE: val << 8 so we don't need to adjust per-pixel
pf2ofx = ((CUSTOM_REG(REG_BPLCON3) >> 10) & 7) << 8;
// bplam applies xor to bitplane colors (i.e. acting as pal bank)
// - aladdin, status bar in gameplay
// TODO: implement for ham and dualpf, below
bplam = CUSTOM_REG(REG_BPLCON4) >> 8;
// In AGA Extra Half-Brite applies if this condition is satisfied
// (bit 9 of BPLCON2 is KILLEHB)
// cfr. bblow_a main menu
@ -640,15 +664,16 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
/* compute the pixel fetch parameters */
// TODO: ECS/AGA can put bit 1 in play here
ddf_start_pixel = ( CUSTOM_REG(REG_DDFSTRT) & 0xfc ) * 2;
ddf_start_pixel = ( CUSTOM_REG(REG_DDFSTRT) & 0xf8 ) * 2;
ddf_start_pixel += hires ? ddf_start_offset_hires[bitplane_fmode] : ddf_start_offset_lores[bitplane_fmode];
ddf_stop_pixel = ( CUSTOM_REG(REG_DDFSTOP) & 0xfc ) * 2;
ddf_stop_pixel = ( CUSTOM_REG(REG_DDFSTOP) & 0xf8 ) * 2;
ddf_stop_pixel += hires ? ddf_stop_offset_hires[bitplane_fmode] : ddf_stop_offset_lores[bitplane_fmode];
// FIXME: as like OCS/ECS Amiga verify this one
if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 )
// - https://github.com/dirkwhoffmann/vAmigaTS/blob/master/Agnus/DDF/DDF/ddf1/ddf1_A500_ECS.JPG
// - turbojam (gameplay, fmode 3) wants this, particularly when scrolling left (+15 isn't enough).
if ( (CUSTOM_REG(REG_DDFSTRT) & 6) != (CUSTOM_REG(REG_DDFSTOP) & 6))
{
ddf_stop_pixel += 8;
ddf_stop_pixel += defbitoffs;
}
// display window
@ -881,6 +906,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
/* dual playfield mode */
else if (dualpf)
{
// pf2pri really, overshadows above (i.e. pf1pri -> pf1p2:0)
const u8 pf_layer_pri = BIT(CUSTOM_REG(REG_BPLCON2), 6);
/* mask out the sprite if it doesn't have priority */
pix = sprpix & 0xff;
pri = (sprpix >> 12);
@ -896,7 +923,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
if (pix)
dst[x*2+0] = aga_palette[pix];
else
dst[x*2+0] = aga_palette[m_separate_bitplanes[(CUSTOM_REG(REG_BPLCON2) >> 6) & 1][pfpix0]];
dst[x*2+0] = aga_palette[m_separate_bitplanes[pf_layer_pri][pfpix0 | pf2ofx]];
/* mask out the sprite if it doesn't have priority */
pix = sprpix & 0xff;
@ -912,7 +939,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
if (pix)
dst[x*2+1] = aga_palette[pix];
else
dst[x*2+1] = aga_palette[m_separate_bitplanes[(CUSTOM_REG(REG_BPLCON2) >> 6) & 1][pfpix1]];
dst[x*2+1] = aga_palette[m_separate_bitplanes[pf_layer_pri][pfpix1 | pf2ofx]];
}
/* single playfield mode */
@ -934,8 +961,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline)
{
// TODO: does it applies to sprites too?
rgb_t *dst_palette = ehb ? m_aga_ehb_palette : aga_palette;
dst[x*2+0] = dst_palette[pfpix0];
dst[x*2+1] = dst_palette[pfpix1];
dst[x*2+0] = dst_palette[pfpix0 ^ bplam];
dst[x*2+1] = dst_palette[pfpix1 ^ bplam];
}
}
}

View File

@ -476,27 +476,19 @@ void macadb_device::portable_update_keyboard()
bool macadb_device::adb_pollmouse()
{
s32 NewX, NewY, NewButton;
s32 const NewButton = m_mouse0->read() & 0x03;
s32 const NewX = m_mouse1->read();
s32 const NewY = m_mouse2->read();
NewButton = m_mouse0->read() & 0x03;
NewX = m_mouse1->read();
NewY = m_mouse2->read();
if ((NewX != m_lastmousex) || (NewY != m_lastmousey) || (NewButton != m_lastbutton))
{
return true;
}
return false;
return (NewX != m_lastmousex) || (NewY != m_lastmousey) || (NewButton != m_lastbutton);
}
void macadb_device::adb_accummouse(u8 *MouseX, u8 *MouseY )
{
int MouseCountX = 0, MouseCountY = 0;
int NewX, NewY;
NewX = m_mouse1->read();
NewY = m_mouse2->read();
int const NewX = m_mouse1->read();
int const NewY = m_mouse2->read();
// printf("pollmouse: X %d Y %d\n", NewX, NewY);
@ -538,10 +530,8 @@ void macadb_device::adb_accummouse(u8 *MouseX, u8 *MouseY )
void macadb_device::adb_talk()
{
int addr, reg;
addr = (m_command>>4);
reg = (m_command & 3);
int const addr = m_command >> 4;
int const reg = m_command & 3;
// printf("Mac sent %x (cmd %d addr %d reg %d mr %d kr %d)\n", m_command, (m_command>>2)&3, addr, reg, m_mouseaddr, m_keybaddr);
@ -612,10 +602,8 @@ void macadb_device::adb_talk()
this->adb_accummouse(&mouseX, &mouseY);
}
//printf("X %x Y %x\n", mouseX, mouseY);
m_buffer[0] = (m_lastbutton & 0x01) ? 0x00 : 0x80;
m_buffer[0] |= mouseY & 0x7f;
m_buffer[1] = (m_lastbutton & 0x02) ? 0x00 : 0x80;
m_buffer[1] |= mouseX & 0x7f;
m_buffer[0] = (BIT(~m_lastbutton, 0) << 7) | (mouseY & 0x7f);
m_buffer[1] = (BIT(~m_lastbutton, 1) << 7) | (mouseX & 0x7f);
if ((m_buffer[0] != m_last_mouse[0]) || (m_buffer[1] != m_last_mouse[1]))
{

View File

@ -6064,6 +6064,24 @@ static INPUT_PORTS_START( kotbinyo )
INPUT_PORTS_END
static INPUT_PORTS_START( kotbinyosu )
PORT_INCLUDE( kotbinyo )
PORT_MODIFY("DSW2")
PORT_DIPNAME( 0x08, 0x08, "Unknown 2-3" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "Unknown 2-4" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) // Shows Kkot Bi Nyo title regardless of the setting of 2-9
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // Shows Speed Up title, but only if 2-9 is On
PORT_MODIFY("DSW5")
PORT_DIPNAME( 0x08, 0x00, "Unknown 2-9" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) // Shows Kkot Bi Nyo title regardless of the setting of 2-4
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // Shows Speed Up title, but only if 2-4 is On
INPUT_PORTS_END
static INPUT_PORTS_START( kotbinsp )
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
@ -10863,6 +10881,31 @@ ROM_START( kotbinyo )
ROM_REGION( 0x80000, "oki", 0 ) // samples
ROM_LOAD( "snd.1c", 0x00000, 0x40000, CRC(d3a739a7) SHA1(f21009f588202f36e4d4e1ab7566c162b5118424) )
ROM_RELOAD( 0x40000, 0x40000 )
ROM_REGION( 0x104, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "ampal16l8.7a", 0x000, 0x104, NO_DUMP )
ROM_END
// 9090123-1 PCB. Title can be chosen via DSWs between Kkot Bi Nyo and Speed Up (스피드업)
// Speed Up seems to be just the minigames, with the Hanafuda main game disabled.
ROM_START( kotbinyosu )
ROM_REGION( 0x80000, "maincpu", 0 ) // ! KL5C80 Code !
ROM_LOAD( "prg.5b", 0x00000, 0x80000, CRC(ce35efe7) SHA1(4d76d9540936e9de34bfe6ffabd13a44fa892ed7) ) // only this differs, SLDH
ROM_REGION( 0x280000, "blitter", 0 )
ROM_LOAD16_BYTE( "gfx.8b", 0x000000, 0x80000, CRC(126f3591) SHA1(f21236587f555035ec25f1a9f5eb651a533446b2) )
ROM_LOAD16_BYTE( "gfx.8c", 0x000001, 0x80000, CRC(ab52b33d) SHA1(05edeb5def0fda9b2028bc64f7484abe0f8705a3) )
ROM_LOAD16_BYTE( "gfx.10b", 0x100000, 0x80000, CRC(2e9d35f9) SHA1(a412fbfc400d2ccb308c7d5c6ed0da6080a88ee0) )
ROM_LOAD16_BYTE( "gfx.10c", 0x100001, 0x80000, CRC(83851ae1) SHA1(9fbf84d9abc81448105582cea8cdb43cbf82f857) )
ROM_LOAD16_BYTE( "gfx.12b", 0x200000, 0x40000, CRC(bf5ae6c2) SHA1(ac22c3e4e954c116e2e33ce2db0250c608f13a71) )
ROM_LOAD16_BYTE( "gfx.12c", 0x200001, 0x40000, CRC(2f476026) SHA1(79b62cedd6d703af7b02db3916bb373ad1e7da85) )
ROM_REGION( 0x80000, "oki", 0 ) // samples
ROM_LOAD( "snd.1c", 0x00000, 0x40000, CRC(d3a739a7) SHA1(f21009f588202f36e4d4e1ab7566c162b5118424) )
ROM_RELOAD( 0x40000, 0x40000 )
ROM_REGION( 0x104, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "palce16v8h-25.7a", 0x000, 0x104, NO_DUMP ) // locked
ROM_END
@ -12426,95 +12469,96 @@ ROM_END
} // anonymous namespace
GAME( 1992, htengoku, 0, htengoku, htengoku, htengoku_state, empty_init, ROT180, "Dynax", "Hanafuda Hana Tengoku (Japan)", 0 )
GAME( 1992, htengoku, 0, htengoku, htengoku, htengoku_state, empty_init, ROT180, "Dynax", "Hanafuda Hana Tengoku (Japan)", 0 )
GAME( 1992, mmpanic, 0, mmpanic, mmpanic, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Monkey Mole Panic (USA)", MACHINE_NO_COCKTAIL )
GAME( 1992, mmpanic, 0, mmpanic, mmpanic, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Monkey Mole Panic (USA)", MACHINE_NO_COCKTAIL )
// "Waiwai Animal Land" (without the Jr.) should be the original Japanese version of Monkey Mole Panic
GAME( 1993, mjmyorn2, 0, mjmyornt, mjmyorn2, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Part 2 ~ Exotic Dream ~ (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1992, mjmyornt, mjmyorn2, mjmyornt, mjmyornt, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1993, mjmyorn2, 0, mjmyornt, mjmyorn2, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Part 2 ~ Exotic Dream ~ (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1992, mjmyornt, mjmyorn2, mjmyornt, mjmyornt, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1993, funkyfig, 0, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 1)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // scrolling, priority?
GAME( 1993, funkyfiga, funkyfig, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 2)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // ""
GAME( 1993, funkyfig, 0, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 1)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // scrolling, priority?
GAME( 1993, funkyfiga, funkyfig, funkyfig, funkyfig, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "The First Funky Fighter (USA, Canada, Mexico / Japan, set 2)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS ) // ""
GAME( 1993, quizchq, 0, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Quiz Channel Question (Japan, Ver 1.00)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, quizchql, quizchq, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "Nakanihon (Laxan license)", "Quiz Channel Question (Taiwan?, Ver 1.23)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, quizchqk, quizchq, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "KM Korea Co, Ltd (official license)", "Quiz Channel Question (Korea, Ver 1.10)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, quizchq, 0, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Quiz Channel Question (Japan, Ver 1.00)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, quizchql, quizchq, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "Nakanihon (Laxan license)", "Quiz Channel Question (Taiwan?, Ver 1.23)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, quizchqk, quizchq, quizchq, quizchq, ddenlovr_state, empty_init, ROT0, "KM Korea Co, Ltd (official license)", "Quiz Channel Question (Korea, Ver 1.10)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1993, animaljr, 0, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Exciting Animal Land Jr. (USA, Canada, Mexico)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND )
GAME( 1993, animaljrs, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Animalandia Jr. (Spanish)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND )
GAME( 1993, animaljrj, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Waiwai Animal Land Jr. (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1993, animaljr, 0, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Exciting Animal Land Jr. (USA, Canada, Mexico)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND )
GAME( 1993, animaljrs, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Animalandia Jr. (Spanish)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND )
GAME( 1993, animaljrj, animaljr, mmpanic, animaljr, mmpanic_state, empty_init, ROT0, "Nakanihon / East Technology (Taito license)", "Waiwai Animal Land Jr. (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmyster, 0, mjmyster, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 1)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmywrld, mjmyster, mjmywrld, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 2)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmyster, 0, mjmyster, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 1)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmywrld, mjmyster, mjmywrld, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious World (Japan, set 2)", MACHINE_NO_COCKTAIL )
GAME( 1994, hginga, 0, hginga, hginga, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Ginga (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1994, hginga, 0, hginga, hginga, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Ginga (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmyuniv, 0, mjmyuniv, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Universe (Japan, D85)", MACHINE_NO_COCKTAIL )
GAME( 1994, mjmyuniv, 0, mjmyuniv, mjmyster, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Universe (Japan, D85)", MACHINE_NO_COCKTAIL )
GAME( 1994, quiz365, 0, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Quiz 365 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION )
GAME( 1994, quiz365t, quiz365, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon / Taito", "Quiz 365 (Hong Kong & Taiwan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION )
GAME( 1994, quiz365, 0, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Quiz 365 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION )
GAME( 1994, quiz365t, quiz365, quiz365, quiz365, ddenlovr_state, empty_init, ROT0, "Nakanihon / Taito", "Quiz 365 (Hong Kong & Taiwan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION )
GAME( 1994, rongrong, 0, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Europe)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, rongrongj, rongrong, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, rongrongg, rongrong, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Germany)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, rongrong, 0, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Europe)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, rongrongj, rongrong, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, rongrongg, rongrong, rongrong, rongrong, ddenlovr_state, init_rongrong, ROT0, "Nakanihon (Activision license)", "Puzzle Game Rong Rong (Germany)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1994, hparadis, 0, hparadis, hparadis, ddenlovr_state, empty_init, ROT0, "Dynax", "Super Hana Paradise (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1994, hparadis, 0, hparadis, hparadis, ddenlovr_state, empty_init, ROT0, "Dynax", "Super Hana Paradise (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1995, hgokou, 0, hgokou, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou (Japan, ver. B)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, hgokoua, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou (Japan, ver. A)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, hgokbang, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Gokou Bangaihen (Japan)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, hgokou, 0, hgokou, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou (Japan, ver. B)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, hgokoua, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax (Alba license)", "Hanafuda Hana Gokou (Japan, ver. A)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, hgokbang, hgokou, hgokbang, hgokou, ddenlovr_state, empty_init, ROT0, "Dynax", "Hanafuda Hana Gokou Bangaihen (Japan)", MACHINE_NO_COCKTAIL | MACHINE_NOT_WORKING )
GAME( 1995, mjdchuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Da Zhonghua Quan (Taiwan, D111)", MACHINE_NO_COCKTAIL )
GAME( 1995, mjdchuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Da Zhonghua Quan (Taiwan, D111)", MACHINE_NO_COCKTAIL )
GAME( 1995, mjschuka, 0, mjschuka, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong Super Dai Chuuka Ken (Japan, D115)", MACHINE_NO_COCKTAIL )
GAME( 1995, mjschuka, 0, mjschuka, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong Super Dai Chuuka Ken (Japan, D115)", MACHINE_NO_COCKTAIL )
GAME( 1995, nettoqc, 0, nettoqc, nettoqc, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Nettoh Quiz Champion (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, ultrchmp, nettoqc, ultrchmp, ultrchmp, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Se Gye Hweng Dan Ultra Champion (Korea)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, ultrchmph, nettoqc, ultrchmp, ultrchmp, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Cheng Ba Shi Jie - Chao Shi Kong Guan Jun (Taiwan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, nettoqc, 0, nettoqc, nettoqc, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Nettoh Quiz Champion (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, ultrchmp, nettoqc, ultrchmp, ultrchmp, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Se Gye Hweng Dan Ultra Champion (Korea)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, ultrchmph, nettoqc, ultrchmp, ultrchmp, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Cheng Ba Shi Jie - Chao Shi Kong Guan Jun (Taiwan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_COLORS )
GAME( 1995, ddenlovj, 0, ddenlovj, ddenlovj, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 - Shiro Kuro Tsukeyo! (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1995, ddenlovrk, ddenlovj, ddenlovrk, ddenlovr, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 - Heukbaeg-euro Jeonghaja (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1995, ddenlovrb, ddenlovj, ddenlovr, ddenlovr, ddenlovr_state, empty_init, ROT0, "bootleg", "Don Den Lover Vol. 1 - Heukbaeg-euro Jeonghaja (Korea, bootleg)", MACHINE_NO_COCKTAIL )
GAME( 1996, ddenlovr, ddenlovj, ddenlovr, ddenlovr, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 (Hong Kong)", MACHINE_NO_COCKTAIL )
GAME( 1995, ddenlovj, 0, ddenlovj, ddenlovj, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 - Shiro Kuro Tsukeyo! (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1995, ddenlovrk, ddenlovj, ddenlovrk, ddenlovr, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 - Heukbaeg-euro Jeonghaja (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1995, ddenlovrb, ddenlovj, ddenlovr, ddenlovr, ddenlovr_state, empty_init, ROT0, "bootleg", "Don Den Lover Vol. 1 - Heukbaeg-euro Jeonghaja (Korea, bootleg)", MACHINE_NO_COCKTAIL )
GAME( 1996, ddenlovr, ddenlovj, ddenlovr, ddenlovr, ddenlovr_state, empty_init, ROT0, "Dynax", "Don Den Lover Vol. 1 (Hong Kong)", MACHINE_NO_COCKTAIL )
GAME( 1996, hanakanz, 0, hanakanz, hanakanz, hanakanz_state, empty_init, ROT0, "Dynax", "Hana Kanzashi (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1997, kotbinyo, hanakanz, kotbinyo, kotbinyo, hanakanz_state, empty_init, ROT0, "Dynax / Shinwhajin", "Kkot Bi Nyo (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1996, hanakanz, 0, hanakanz, hanakanz, hanakanz_state, empty_init, ROT0, "Dynax", "Hana Kanzashi (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1997, kotbinyo, hanakanz, kotbinyo, kotbinyo, hanakanz_state, empty_init, ROT0, "Dynax / Shinwhajin", "Kkot Bi Nyo (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1997, kotbinyosu, hanakanz, kotbinyo, kotbinyosu, hanakanz_state, empty_init, ROT0, "Dynax / Shinwhajin", "Speed Up / Kkot Bi Nyo (Korea)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 1997, kotbinsp, 0, kotbinsp, kotbinsp, hanakanz_state, empty_init, ROT0, "Dynax / Shinwhajin", "Kkot Bi Nyo Special (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1997, kotbinsp, 0, kotbinsp, kotbinsp, hanakanz_state, empty_init, ROT0, "Dynax / Shinwhajin", "Kkot Bi Nyo Special (Korea)", MACHINE_NO_COCKTAIL )
GAME( 1996, akamaru, 0, akamaru, akamaru, ddenlovr_state, empty_init, ROT0, "Dynax (Nakanihon license)", "Panel & Variety Akamaru Q Joushou Dont-R", MACHINE_NO_COCKTAIL )
GAME( 1996, akamaru, 0, akamaru, akamaru, ddenlovr_state, empty_init, ROT0, "Dynax (Nakanihon license)", "Panel & Variety Akamaru Q Joushou Dont-R", MACHINE_NO_COCKTAIL )
GAME( 1996, janshinp, 0, janshinp, janshinp, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Janshin Plus (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1996, janshinp, 0, janshinp, janshinp, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Janshin Plus (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1996, dtoyoken, 0, dtoyoken, dtoyoken, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Dai Touyouken (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1996, dtoyoken, 0, dtoyoken, dtoyoken, ddenlovr_state, empty_init, ROT0, "Dynax / Sigma", "Mahjong Dai Touyouken (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1996, sryudens, 0, sryudens, sryudens, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Mahjong Seiryu Densetsu (Japan, NM502)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, sryudens, 0, sryudens, sryudens, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Mahjong Seiryu Densetsu (Japan, NM502)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, seljan2, 0, seljan2, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM557)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, seljan2a, seljan2, sryudens, seljan2, ddenlovr_state, empty_init, ROT0, "Dynax / Face", "Return Of Sel Jan II (Japan, NM508)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, mjflove, 0, mjflove, mjflove, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Mahjong Fantasic Love (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, mjflove, 0, mjflove, mjflove, ddenlovr_state, empty_init, ROT0, "Nakanihon", "Mahjong Fantasic Love (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, mjmyorntr, 0, mjmyorntr, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Returns (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1997, mjmyorntr, 0, mjmyorntr, mjschuka, ddenlovr_state, empty_init, ROT0, "Dynax", "Mahjong The Mysterious Orient Returns (Japan, v1.00)", MACHINE_NO_COCKTAIL ) // no copyright warning, assume Japan from game strings
GAME( 1997, hkagerou, 0, hkagerou, hkagerou, hanakanz_state, empty_init, ROT0, "Nakanihon / Dynax", "Hana Kagerou (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1997, hkagerou, 0, hkagerou, hkagerou, hanakanz_state, empty_init, ROT0, "Nakanihon / Dynax", "Hana Kagerou (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1998, mjchuuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Zhonghua Ernu (Taiwan)", MACHINE_NO_COCKTAIL )
GAME( 1998, mjchuuka, 0, mjchuuka, mjchuuka, hanakanz_state, empty_init, ROT0, "Dynax", "Maque Zhonghua Ernu (Taiwan)", MACHINE_NO_COCKTAIL )
GAME( 1998, mjreach1, 0, mjreach1, mjreach1, hanakanz_state, empty_init, ROT0, "Nihon System", "Mahjong Reach Ippatsu (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1998, mjreach1, 0, mjreach1, mjreach1, hanakanz_state, empty_init, ROT0, "Nihon System", "Mahjong Reach Ippatsu (Japan)", MACHINE_NO_COCKTAIL )
GAME( 1999, jongtei, 0, jongtei, jongtei, hanakanz_state, empty_init, ROT0, "Dynax", "Mahjong Jong-Tei (Japan, NM532-01)", MACHINE_NO_COCKTAIL )
GAME( 2000, jongteia, jongtei, jongteia, jongtei, hanakanz_state, empty_init, ROT0, "Dynax (Techno-Top license)", "Mahjong Jong-Tei (Japan, Techno-Top license)", MACHINE_NO_COCKTAIL )
GAME( 1999, jongtei, 0, jongtei, jongtei, hanakanz_state, empty_init, ROT0, "Dynax", "Mahjong Jong-Tei (Japan, NM532-01)", MACHINE_NO_COCKTAIL )
GAME( 2000, jongteia, jongtei, jongteia, jongtei, hanakanz_state, empty_init, ROT0, "Dynax (Techno-Top license)", "Mahjong Jong-Tei (Japan, Techno-Top license)", MACHINE_NO_COCKTAIL )
GAME( 2000, mjgnight, 0, mjgnight, mjgnight, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Gorgeous Night (Japan, TSM003-01)", MACHINE_NO_COCKTAIL )
GAME( 2000, mjgnight, 0, mjgnight, mjgnight, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Gorgeous Night (Japan, TSM003-01)", MACHINE_NO_COCKTAIL )
GAME( 2000, hnrose, 0, hnrose, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Hana Night Rose (Japan, TSM008-04)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2000, hnrose, 0, hnrose, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Hana Night Rose (Japan, TSM008-04)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2001, daireach, 0, daireach, seljan2, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Dai-Reach (Japan, TSM012-C01)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2001, daireach, 0, daireach, seljan2, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Dai-Reach (Japan, TSM012-C01)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2002, daimyojn, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Dynax / Techno-Top / Techno-Planning", "Mahjong Daimyojin (Japan, T017-PB-00)", MACHINE_NO_COCKTAIL )
GAME( 2002, daimyojn, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Dynax / Techno-Top / Techno-Planning", "Mahjong Daimyojin (Japan, T017-PB-00)", MACHINE_NO_COCKTAIL )
GAME( 2002, mjtenho, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Tenho (Japan, P016B-000)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2002, mjtenho, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Tenho (Japan, P016B-000)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL )
GAME( 2004, momotaro, 0, daimyojn, daimyojn, hanakanz_state, init_momotaro, ROT0, "Techno-Top", "Mahjong Momotarou (Japan, T027-RB-01)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
GAME( 2004, momotaro, 0, daimyojn, daimyojn, hanakanz_state, init_momotaro, ROT0, "Techno-Top", "Mahjong Momotarou (Japan, T027-RB-01)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )

View File

@ -0,0 +1,201 @@
// license:BSD-3-Clause
// copyright-holders:
/*
Excellent System's ES-8906B PCB
Main components:
R6502AP CPU
6116ALSP-12 RAM (near CPU)
20.0000 MHz XTAL (near CPU)
HD46505SP CRTC
Excellent ES-8712 custom
4x 6116ALSP-12 RAM (near ES-8712)
4x bank of 8 DIP switches (SW2-5)
reset button (SW1)
NE555P (near SW1)
TODO: everything
*/
#include "emu.h"
#include "cpu/m6502/m6502.h"
#include "sound/es8712.h"
#include "video/mc6845.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class es8906_state : public driver_device
{
public:
es8906_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_gfxdecode(*this, "gfxdecode")
{ }
void es8906(machine_config &config);
protected:
virtual void video_start() override ATTR_COLD;
private:
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void program_map(address_map &map) ATTR_COLD;
};
void es8906_state::video_start()
{
}
uint32_t es8906_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
return 0;
}
void es8906_state::program_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).ram();
map(0x0800, 0x0800).w("crtc", FUNC(hd6845s_device::address_w));
map(0x0801, 0x0801).rw("crtc", FUNC(hd6845s_device::register_r), FUNC(hd6845s_device::register_w));
map(0x1000, 0x2fff).ram();
map(0x8000, 0xffff).rom();
}
static INPUT_PORTS_START( dream9 )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("SW2")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW2:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW2:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW2:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW2:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW2:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW2:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW2:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW2:8")
PORT_START("SW3")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW3:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW3:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW3:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW3:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW3:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW3:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW3:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW3:8")
PORT_START("SW4")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW4:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW4:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW4:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW4:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW4:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW4:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW4:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW4:8")
PORT_START("SW5")
PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW5:1")
PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW5:2")
PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW5:3")
PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "SW5:4")
PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "SW5:5")
PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "SW5:6")
PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "SW5:7")
PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "SW5:8")
INPUT_PORTS_END
static GFXDECODE_START( gfx_es8906 )
GFXDECODE_ENTRY( "tiles1", 0, gfx_8x8x4_planar, 0, 16 )
GFXDECODE_ENTRY( "tiles2", 0, gfx_8x8x4_planar, 0, 16 )
GFXDECODE_END
void es8906_state::es8906(machine_config &config)
{
M6502(config, m_maincpu, 20_MHz_XTAL / 10); // TODO: divider not verified
m_maincpu->set_addrmap(AS_PROGRAM, &es8906_state::program_map);
hd6845s_device &crtc(HD6845S(config, "crtc", 20_MHz_XTAL / 10)); // TODO: verify
crtc.set_screen(m_screen);
crtc.set_show_border_area(false);
crtc.set_char_width(8);
crtc.out_vsync_callback().set_inputline(m_maincpu, 0);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // TODO: everything
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(40*8, 32*8);
m_screen->set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
m_screen->set_screen_update(FUNC(es8906_state::screen_update));
m_screen->set_palette("palette");
GFXDECODE(config, m_gfxdecode, "palette", gfx_es8906);
PALETTE(config, "palette", palette_device::RGB_444_PROMS, "proms", 256); // TODO
SPEAKER(config, "speaker").front_center();
ES8712(config, "essnd", 0);
}
ROM_START( dream9 ) // (C)1989 EXCELLENT SYSTEM SUPER 9 Ver1.52 PROGRAM by KAY/AMTECH Feb,6 1990, but pics show "Dream 9"
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "d5-00_excellent.3h", 0x00000, 0x10000, CRC(7c0ad390) SHA1(b173f7d4521a4bea4246b988e6b4fce179ac12bc) )
ROM_REGION( 0x20000, "tiles1", 0 ) // all labels have "エクセレント システム" (means "Excellent System") before what's below
ROM_LOAD( "9l.9l", 0x00000, 0x10000, CRC(63692c62) SHA1(ef06ffe4204b0c1e40f9685b62f403b94a9b6693) )
ROM_LOAD( "11l.11l", 0x10000, 0x10000, CRC(9251d1a6) SHA1(ccce3240d825e7611a4e4412b4f37710d0957179) )
ROM_REGION( 0x20000, "tiles2", 0 ) // idem
ROM_LOAD( "12l.12l", 0x00000, 0x10000, CRC(25395909) SHA1(d5e8caac642847450896a855e293431ad6620a77) )
ROM_LOAD( "14l.14l", 0x10000, 0x10000, CRC(45757954) SHA1(bda96f437e5b65058e2f068b73998bad4b0bd5a3) )
ROM_REGION( 0x300, "proms", 0 )
ROM_LOAD( "r.11b", 0x0000, 0x0100, CRC(b41df116) SHA1(5cae3e6c70775ad63bccbfc4847b4feee5b79ddf) )
ROM_LOAD( "g.12b", 0x0100, 0x0100, CRC(70ac57cd) SHA1(fe238c363f09f20cdc1c6f7f6279201671664750) )
ROM_LOAD( "b.13b", 0x0200, 0x0100, CRC(99458711) SHA1(0be119f928b9085e36056b9b6b7e8623765eef44) )
ROM_END
} // anonymous namespace
GAME( 1990, dream9, 0, es8906, dream9, es8906_state, empty_init, ROT0, "Excellent System", "Dream 9 (v1.52)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )

View File

@ -4107,9 +4107,8 @@ GAME( 1996, daiskiss, konamigx, konamigx, gokuparo, konamigx_state, init_k
GAME( 1996, tokkae, konamigx, konamigx_6bpp, tokkae, konamigx_state, init_konamigx, ROT0, "Konami", "Taisen Tokkae-dama (ver JAA)", MACHINE_IMPERFECT_GRAPHICS )
// protection controls player ship direction in attract mode - doesn't impact playability
GAME( 1996, salmndr2, konamigx, salmndr2, gokuparo, konamigx_state, init_konamigx, ROT0, "Konami", "Salamander 2 (ver JAA)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_UNEMULATED_PROTECTION )
GAME( 1996, salmndr2a, salmndr2, salmndr2, gokuparo, konamigx_state, init_konamigx, ROT0, "Konami", "Salamander 2 (ver AAB)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_UNEMULATED_PROTECTION )
GAME( 1996, salmndr2, konamigx, salmndr2, gokuparo, konamigx_state, init_konamigx, ROT0, "Konami", "Salamander 2 (ver JAA)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, salmndr2a, salmndr2, salmndr2, gokuparo, konamigx_state, init_konamigx, ROT0, "Konami", "Salamander 2 (ver AAB)", MACHINE_IMPERFECT_GRAPHICS )
// bad sprite colours, part of tilemap gets blanked out when a game starts (might be more protection)
GAME( 1997, winspike, konamigx, winspike, common, konamigx_state, init_konamigx, ROT0, "Konami", "Winning Spike (ver EAA)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS )

View File

@ -1,633 +0,0 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
copyright-holders:Felipe Sanches, m1macrophage
-->
<mamelayout version="2">
<!-- define elements -->
<element name="red_led" defstate="0">
<rect state="1">
<color red="1" green="0.0" blue="0.0" />
</rect>
<rect state="0">
<color red="0.2" green="0.0" blue="0.0" />
</rect>
</element>
<element name="cpanel">
<rect><color red="0.13" green="0.13" blue="0.11"/></rect>
</element>
<element name="clear_rect">
<rect><color red="0.8" green="0.8" blue="0.8"/></rect>
</element>
<element name="grey_rect">
<rect><color red="0.4" green="0.4" blue="0.4" /></rect>
</element>
<element name="brown_line">
<rect><color red="0.72" green="0.45" blue="0.13" /></rect>
</element>
<element name="light_grey_disk">
<disk><color red="0.2" green="0.2" blue="0.2"/></disk>
</element>
<element name="dark_grey_disk">
<disk><color red="0.1" green="0.1" blue="0.1"/></disk>
</element>
<element name="slider-well">
<rect><color red="0.04" green="0.05" blue="0.05"/></rect>
</element>
<element name="slider-wider-well">
<rect><color red="0.13" green="0.15" blue="0.15"/></rect>
</element>
<element name="slider-knob">
<rect><color red="0.18" green="0.2" blue="0.18"/></rect>
</element>
<element name="lcd_border">
<rect><color red="0.06" green="0.06" blue="0.04"/></rect>
</element>
<element name="lcd_bg">
<rect><color red="0.62" green="0.71" blue="0.53"/></rect>
</element>
<element name="button">
<rect state="0"><color red="0.25" green="0.25" blue="0.25"/></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.5"/></rect>
</element>
<element name="tone_display_text"><text string="TONE DISPLAY"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="midi_out_text"><text string="MIDI OUT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="effect_ctrl_text"><text string="EFFECT/CTRL"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="part_text"><text string="PART"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="user_text"><text string="USER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f1_text"><text string="F1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f2_text"><text string="F2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f3_text"><text string="F3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f4_text"><text string="F4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f5_text"><text string="F5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="exit_text"><text string="EXIT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="dec_text"><text string="DEC"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="del_text"><text string="DEL"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="inc_text"><text string="INC"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="ins_text"><text string="INS"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="tone_palette_text"><text string="TONE PALETTE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="lower_text"><text string="LOWER"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="upper_text"><text string="UPPER"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="level_text"><text string="LEVEL"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="pan_text"><text string="PAN"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="tuning_text"><text string="TUNING"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="cutoff_text"><text string="CUTOFF"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="resonance_text"><text string="RESONANCE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="attack_text"><text string="ATTACK"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="release_text"><text string="RELEASE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="solo_text"><text string="SOLO"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="portamento_text"><text string="PORTAMENTO"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="mode_text"><text string="MODE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="play_text"><text string="PLAY"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="edit_text"><text string="EDIT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="pcm_card_text"><text string="PCM CARD"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="panic_text"><text string="PANIC"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="rom_play_text"><text string="ROM PLAY"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="lower_1_text"><text string="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="lower_2_text"><text string="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="upper_3_text"><text string="3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="upper_4_text"><text string="4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="tone_zone_select_text"><text string="TONE/ZONE SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="performance_text"><text string="PERFORMANCE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="patch_text"><text string="PATCH"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="tone_text"><text string="TONE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="a_slash_text"><text string="A/"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="b_text"><text string="B"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="int_slash_text"><text string="INT/"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="card_text"><text string="CARD"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="command_text"><text string="COMMAND"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="write_text"><text string="WRITE"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="enter_text"><text string="ENTER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="caps_text"><text string="CAPS"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="space_text"><text string="SPACE"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="a_b_text"><text string="A B"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="c_d_text"><text string="C D"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="e_f_text"><text string="E F"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="g_h_text"><text string="G H"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="i_j_text"><text string="I J"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="k_l_text"><text string="K L"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="bank_text"><text string="BANK"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="1_text"><text string="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="2_text"><text string="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="3_text"><text string="3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="4_text"><text string="4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="5_text"><text string="5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="6_text"><text string="6"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="7_text"><text string="7"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="8_text"><text string="8"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="m_n_text"><text string="M N"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="o_p_text"><text string="O P"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="q_r_text"><text string="Q R"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="s_t_text"><text string="S T"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="u_v_text"><text string="U V"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="dash_w_text"><text string="- W"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="9_x_text"><text string="9 X"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="0_y_text"><text string="0 Y"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="1_z_text"><text string="1 Z"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="2_slash_text"><text string="2 /"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="3_plus_text"><text string="3 +"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="4_times_text"><text string="4 *"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="5_hash_text"><text string="5 #"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="6_dot_text"><text string="6 ."><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="7_comma_text"><text string="7 ,"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="8_exclam_text"><text string="8 !"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="number_text"><text string="NUMBER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="value_text"><text string="VALUE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="double_page_icon_grey">
<image><data><![CDATA[
<svg width="11" height="12" viewBox="0 0 2.910422 3.175">
<path style="stroke:#d1d1d1;fill:none;stroke-width:0.29;" d="m 1.66,0.17 -1.52,0.4 V 2.9 l 1.52,-0.4 z m -0.4,2.52 v 0.3 l 1.52,-0.4 V 0.27 l -1.2,0.3" />
</svg>
]]></data></image>
</element>
<element name="double_page_icon_brown">
<image><data><![CDATA[
<svg width="11" height="12" viewBox="0 0 2.910422 3.175">
<path style="stroke:#b77222;fill:none;stroke-width:0.29;" d="m 1.66,0.17 -1.52,0.4 V 2.9 l 1.52,-0.4 z m -0.4,2.52 v 0.3 l 1.52,-0.4 V 0.27 l -1.2,0.3" />
</svg>
]]></data></image>
</element>
<element name="triple_page_icon_grey">
<image><data><![CDATA[
<svg width="15" height="12" viewBox="0 0 4.3750049 3.500126">
<path style="stroke:#d1d1d1;fill:none;stroke-width:0.29" d="M 2.57,3 V 3.3 L 4.23,2.9 V 0.4 L 3,0.7 M 1.8,0.18 0.15,0.6 V 3.1 L 1.8,2.68 Z M 1.36,2.89 V 3.2 L 3,2.78 V 0.29 L 1.8,0.58" />
</svg>
]]></data></image>
</element>
<element name="grey_arrows">
<image><data><![CDATA[
<svg width="90" height="110" viewBox="0 0 23.8125 29.1">
<path style="fill:#d1d1d1;stroke-width:0.264" d="m 13.23,25.43 -1.32,3.67 -1.32,-3.67 z m 0,-21.76 L 11.9,0 10.58,3.67 Z m 6.88,9.94 3.7,1.3 -3.7,1.3 z m -16.4,0 L 0,14.92 3.7,16.23 Z" />
</svg>
]]></data></image>
</element>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="0" right="1048" top="0" bottom="524" />
<element ref="cpanel"><bounds x="8" y="8" width="1032" height="300" /></element>
<element ref="lcd_border"><bounds x="178" y="16" width="632" height="200" /></element>
<element ref="lcd_bg"><bounds x="254" y="48" width="488" height="136" /></element>
<screen index="0"><bounds x="258" y="52" width="480" height="128" /></screen>
<element ref="cpanel"><bounds x="8" y="316" width="464" height="200" /></element>
<element ref="cpanel"><bounds x="480" y="316" width="560" height="200" /></element>
<!-- white rect around "performance ... int/card" labels-->
<element ref="clear_rect"><bounds x="497" y="363" width="244" height="13" /></element>
<element ref="cpanel"><bounds x="498" y="364" width="242" height="11" /></element>
<!-- white rect around "command write enter" labels-->
<element ref="clear_rect"><bounds x="743" y="363" width="138" height="13" /></element>
<element ref="cpanel"><bounds x="744" y="364" width="136" height="11" /></element>
<!-- white line over "patch tone a/b" labels-->
<element ref="clear_rect"><bounds x="555" y="365" width="132" height="1" /></element>
<element ref="tone_display_text"><bounds x="39" y="92" width="69" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="112" y="90" width="11" height="12"/></element>
<element ref="midi_out_text"><bounds x="51" y="140" width="47" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="102" y="138" width="11" height="12"/></element>
<element ref="effect_ctrl_text"><bounds x="45" y="188" width="64" height="10"/></element>
<element ref="triple_page_icon_grey"><bounds x="113" y="185" width="15" height="12"/></element>
<element ref="part_text"><bounds x="62" y="236" width="25" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="90" y="235" width="11" height="12"/></element>
<element ref="user_text"><bounds x="194" y="236" width="26" height="10"/></element>
<element ref="f1_text"><bounds x="309" y="236" width="11" height="10"/></element>
<element ref="f2_text"><bounds x="399" y="236" width="11" height="10"/></element>
<element ref="f3_text"><bounds x="489" y="236" width="11" height="10"/></element>
<element ref="f4_text"><bounds x="579" y="236" width="11" height="10"/></element>
<element ref="f5_text"><bounds x="669" y="236" width="11" height="10"/></element>
<element ref="exit_text"><bounds x="770" y="236" width="22" height="10"/></element>
<element ref="grey_arrows"><bounds x="894" y="89" width="90" height="110"/></element>
<element ref="dec_text"><bounds x="891" y="236" width="19" height="10"/></element>
<element ref="del_text"><bounds x="891" y="273" width="18" height="10"/></element>
<element ref="inc_text"><bounds x="968" y="236" width="16" height="10"/></element>
<element ref="ins_text"><bounds x="968" y="273" width="16" height="10"/></element>
<element ref="brown_line"><bounds x="31" y="336" width="173" height="1" /></element>
<element ref="brown_line"><bounds x="271" y="336" width="177" height="1" /></element>
<element ref="tone_palette_text"><bounds x="206" y="331" width="62" height="9"/></element>
<element ref="brown_line"><bounds x="200" y="346" width="39" height="1" /></element>
<element ref="brown_line"><bounds x="273" y="346" width="39" height="1" /></element>
<element ref="lower_text"><bounds x="242" y="341" width="29" height="9"/></element>
<element ref="brown_line"><bounds x="337" y="346" width="39" height="1" /></element>
<element ref="brown_line"><bounds x="409" y="346" width="39" height="1" /></element>
<element ref="upper_text"><bounds x="379" y="341" width="27" height="9"/></element>
<element ref="slider-wider-well" id="SLIDER4"><bounds x="200" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="217" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER4" inputmask="0x7f"/>
<bounds state="100" x="203" y="352" width="37" height="24"/>
<bounds state="0" x="203" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER5"><bounds x="269" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="286" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER5" inputmask="0x7f"/>
<bounds state="100" x="272" y="352" width="37" height="24"/>
<bounds state="0" x="272" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER6"><bounds x="337" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="354" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER6" inputmask="0x7f"/>
<bounds state="100" x="340" y="352" width="37" height="24"/>
<bounds state="0" x="340" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER7"><bounds x="405" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="422" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER7" inputmask="0x7f"/>
<bounds state="100" x="408" y="352" width="37" height="24"/>
<bounds state="0" x="408" y="417" width="37" height="24"/>
</element>
<element ref="lower_1_text"><bounds x="220" y="455" width="6" height="10"/></element>
<element ref="lower_2_text"><bounds x="287" y="455" width="6" height="10"/></element>
<element ref="upper_3_text"><bounds x="355" y="455" width="6" height="10"/></element>
<element ref="upper_4_text"><bounds x="423" y="455" width="6" height="10"/></element>
<element ref="clear_rect"><bounds x="200" y="481" width="82" height="1" /></element>
<element ref="clear_rect"><bounds x="366" y="481" width="82" height="1" /></element>
<element ref="tone_zone_select_text"><bounds x="281" y="480" width="87" height="9"/></element>
<element ref="clear_rect"><bounds x="30" y="455" width="54" height="1" /></element>
<element ref="clear_rect"><bounds x="109" y="455" width="55" height="1" /></element>
<element ref="mode_text"><bounds x="86" y="450" width="21" height="8"/></element>
<element ref="level_text"><bounds x="40" y="368" width="19" height="8"/></element>
<element ref="cutoff_text"><bounds x="37" y="398" width="24" height="8"/></element>
<element ref="solo_text"><bounds x="41" y="428" width="16" height="8"/></element>
<element ref="play_text"><bounds x="42" y="458" width="15" height="8"/></element>
<element ref="pan_text"><bounds x="91" y="368" width="12" height="8"/></element>
<element ref="resonance_text"><bounds x="78" y="398" width="38" height="8"/></element>
<element ref="portamento_text"><bounds x="76" y="428" width="43" height="8"/></element>
<element ref="edit_text"><bounds x="91" y="458" width="14" height="8"/></element>
<element ref="tuning_text"><bounds x="128" y="368" width="23" height="8"/></element>
<element ref="double_page_icon_brown"><bounds x="154" y="367" width="7" height="8"/></element>
<element ref="attack_text"><bounds x="134" y="398" width="24" height="8"/></element>
<element ref="release_text"><bounds x="132" y="428" width="27" height="8"/></element>
<element ref="pcm_card_text"><bounds x="130" y="458" width="33" height="8"/></element>
<element ref="grey_rect"><bounds x="48" y="477" width="99" height="15" /></element>
<element ref="cpanel"><bounds x="49" y="476" width="97" height="15" /></element>
<element ref="cpanel"><bounds x="80" y="487" width="36" height="8" /></element>
<element ref="rom_play_text"><bounds x="82" y="489" width="32" height="8"/></element>
<element ref="grey_rect"><bounds x="48" y="477" width="50" height="7" /></element>
<element ref="cpanel"><bounds x="49" y="476" width="48" height="7" /></element>
<element ref="cpanel"><bounds x="63" y="480" width="24" height="8" /></element>
<element ref="panic_text"><bounds x="65" y="481" width="20" height="8"/></element>
<element ref="performance_text"><bounds x="500" y="366" width="47" height="8"/></element>
<element ref="patch_text"><bounds x="562" y="366" width="19" height="8"/></element>
<element ref="tone_text"><bounds x="612" y="366" width="17" height="8"/></element>
<element ref="a_slash_text"><bounds x="663" y="366" width="6" height="8"/></element>
<element ref="b_text"><bounds x="670" y="366" width="4" height="8"/></element>
<element ref="int_slash_text"><bounds x="702" y="366" width="12" height="8"/></element>
<element ref="card_text"><bounds x="714" y="366" width="17" height="8"/></element>
<element ref="command_text"><bounds x="748" y="366" width="33" height="8"/></element>
<element ref="write_text"><bounds x="804" y="366" width="20" height="8"/></element>
<element ref="enter_text"><bounds x="852" y="366" width="20" height="8"/></element>
<element ref="caps_text"><bounds x="515" y="389" width="16" height="8"/></element>
<element ref="space_text"><bounds x="562" y="389" width="19" height="8"/></element>
<element ref="a_b_text"><bounds x="625" y="389" width="14" height="8"/></element>
<element ref="c_d_text"><bounds x="673" y="389" width="14" height="8"/></element>
<element ref="e_f_text"><bounds x="722" y="389" width="13" height="8"/></element>
<element ref="g_h_text"><bounds x="769" y="389" width="14" height="8"/></element>
<element ref="i_j_text"><bounds x="821" y="389" width="9" height="8"/></element>
<element ref="k_l_text"><bounds x="867" y="389" width="13" height="8"/></element>
<element ref="clear_rect"><bounds x="506" y="423" width="173" height="1" /></element>
<element ref="clear_rect"><bounds x="704" y="423" width="176" height="1" /></element>
<element ref="bank_text"><bounds x="682" y="418" width="20" height="9"/></element>
<element ref="1_text"><bounds x="522" y="428" width="4" height="8"/></element>
<element ref="2_text"><bounds x="570" y="428" width="4" height="8"/></element>
<element ref="3_text"><bounds x="619" y="428" width="4" height="8"/></element>
<element ref="4_text"><bounds x="667" y="428" width="4" height="8"/></element>
<element ref="5_text"><bounds x="715" y="428" width="4" height="8"/></element>
<element ref="6_text"><bounds x="763" y="428" width="4" height="8"/></element>
<element ref="7_text"><bounds x="812" y="428" width="4" height="8"/></element>
<element ref="8_text"><bounds x="860" y="428" width="4" height="8"/></element>
<element ref="m_n_text"><bounds x="527" y="449" width="15" height="8"/></element>
<element ref="o_p_text"><bounds x="576" y="449" width="14" height="8"/></element>
<element ref="q_r_text"><bounds x="625" y="449" width="15" height="8"/></element>
<element ref="s_t_text"><bounds x="674" y="449" width="13" height="8"/></element>
<element ref="u_v_text"><bounds x="722" y="449" width="14" height="8"/></element>
<element ref="dash_w_text"><bounds x="770" y="449" width="14" height="8"/></element>
<element ref="9_x_text"><bounds x="819" y="449" width="14" height="8"/></element>
<element ref="0_y_text"><bounds x="867" y="449" width="14" height="8"/></element>
<element ref="1_text"><bounds x="522" y="458" width="4" height="8"/></element>
<element ref="2_text"><bounds x="570" y="458" width="4" height="8"/></element>
<element ref="3_text"><bounds x="619" y="458" width="4" height="8"/></element>
<element ref="4_text"><bounds x="667" y="458" width="4" height="8"/></element>
<element ref="5_text"><bounds x="715" y="458" width="4" height="8"/></element>
<element ref="6_text"><bounds x="763" y="458" width="4" height="8"/></element>
<element ref="7_text"><bounds x="812" y="458" width="4" height="8"/></element>
<element ref="8_text"><bounds x="860" y="458" width="4" height="8"/></element>
<element ref="1_z_text"><bounds x="529" y="479" width="13" height="8"/></element>
<element ref="2_slash_text"><bounds x="578" y="479" width="11" height="8"/></element>
<element ref="3_plus_text"><bounds x="625" y="479" width="14" height="8"/></element>
<element ref="4_times_text"><bounds x="674" y="479" width="12" height="8"/></element>
<element ref="5_hash_text"><bounds x="722" y="479" width="14" height="8"/></element>
<element ref="6_dot_text"><bounds x="771" y="479" width="11" height="8"/></element>
<element ref="7_comma_text"><bounds x="820" y="479" width="11" height="8"/></element>
<element ref="8_exclam_text"><bounds x="868" y="479" width="11" height="8"/></element>
<element ref="clear_rect"><bounds x="506" y="488" width="166" height="1" /></element>
<element ref="clear_rect"><bounds x="713" y="488" width="167" height="1" /></element>
<element ref="number_text"><bounds x="674" y="486" width="38" height="9"/></element>
<element ref="value_text"><bounds x="960" y="352" width="24" height="9"/></element>
<element name="value_dial" ref="light_grey_disk"><bounds x="919" y="363" width="106" height="106"/></element>
<element name="value_dial_finger" ref="dark_grey_disk"><bounds x="931" y="381" width="32" height="32"/></element>
<!-- PERFORMANCE -->
<element ref="button" inputtag="KEY0" inputmask="0x80"><bounds x="505" y="379" width="37" height="9"/></element>
<element name="LP26" ref="red_led"><bounds x="518" y="380" width="10" height="3" /></element>
<!-- PATCH -->
<element ref="button" inputtag="KEY0" inputmask="0x40"><bounds x="553" y="379" width="37" height="9"/></element>
<element name="LP31" ref="red_led"><bounds x="566" y="380" width="10" height="3" /></element>
<!-- TONE -->
<element ref="button" inputtag="KEY0" inputmask="0x20"><bounds x="602" y="379" width="37" height="9"/></element>
<element name="LP32" ref="red_led"><bounds x="615" y="380" width="10" height="3" /></element>
<!-- A/B -->
<element ref="button" inputtag="KEY0" inputmask="0x10"><bounds x="650" y="379" width="37" height="9"/></element>
<element name="LP33" ref="red_led"><bounds x="663" y="380" width="10" height="3" /></element>
<!-- INT/CARD -->
<element ref="button" inputtag="KEY0" inputmask="0x08"><bounds x="698" y="379" width="37" height="9"/></element>
<element name="LP34" ref="red_led"><bounds x="711" y="380" width="10" height="3" /></element>
<!-- COMMAND -->
<element ref="button" inputtag="KEY0" inputmask="0x04"><bounds x="747" y="379" width="37" height="9"/></element>
<element name="LP35" ref="red_led"><bounds x="760" y="380" width="10" height="3" /></element>
<!-- WRITE -->
<element ref="button" inputtag="KEY0" inputmask="0x02"><bounds x="795" y="379" width="37" height="9"/></element>
<element name="LP36" ref="red_led"><bounds x="808" y="380" width="10" height="3" /></element>
<!-- ENTER -->
<element ref="button" inputtag="KEY0" inputmask="0x01"><bounds x="843" y="379" width="37" height="9"/></element>
<element name="LP37" ref="red_led"><bounds x="856" y="380" width="10" height="3" /></element>
<!-- Bank 1 --><element ref="button" inputtag="KEY1" inputmask="0x80"><bounds x="505" y="439" width="37" height="9"/></element>
<!-- Bank 2 --><element ref="button" inputtag="KEY1" inputmask="0x40"><bounds x="553" y="439" width="37" height="9"/></element>
<!-- Bank 3 --><element ref="button" inputtag="KEY1" inputmask="0x20"><bounds x="602" y="439" width="37" height="9"/></element>
<!-- Bank 4 --><element ref="button" inputtag="KEY1" inputmask="0x10"><bounds x="650" y="439" width="37" height="9"/></element>
<!-- Bank 5 --><element ref="button" inputtag="KEY1" inputmask="0x08"><bounds x="698" y="439" width="37" height="9"/></element>
<!-- Bank 6 --><element ref="button" inputtag="KEY1" inputmask="0x04"><bounds x="747" y="439" width="37" height="9"/></element>
<!-- Bank 7 --><element ref="button" inputtag="KEY1" inputmask="0x02"><bounds x="795" y="439" width="37" height="9"/></element>
<!-- Bank 8 --><element ref="button" inputtag="KEY1" inputmask="0x01"><bounds x="843" y="439" width="37" height="9"/></element>
<!-- Number 1 --><element ref="button" inputtag="KEY2" inputmask="0x80"><bounds x="505" y="469" width="37" height="9"/></element>
<!-- Number 2 --><element ref="button" inputtag="KEY2" inputmask="0x40"><bounds x="553" y="469" width="37" height="9"/></element>
<!-- Number 3 --><element ref="button" inputtag="KEY2" inputmask="0x20"><bounds x="602" y="469" width="37" height="9"/></element>
<!-- Number 4 --><element ref="button" inputtag="KEY2" inputmask="0x10"><bounds x="650" y="469" width="37" height="9"/></element>
<!-- Number 5 --><element ref="button" inputtag="KEY2" inputmask="0x08"><bounds x="698" y="469" width="37" height="9"/></element>
<!-- Number 6 --><element ref="button" inputtag="KEY2" inputmask="0x04"><bounds x="747" y="469" width="37" height="9"/></element>
<!-- Number 7 --><element ref="button" inputtag="KEY2" inputmask="0x02"><bounds x="795" y="469" width="37" height="9"/></element>
<!-- Number 8 --><element ref="button" inputtag="KEY2" inputmask="0x01"><bounds x="843" y="469" width="37" height="9"/></element>
<!-- DEC/DEL --><element ref="button" inputtag="KEY3" inputmask="0x80"><bounds x="871" y="252" width="59" height="13"/></element>
<!-- INC/INS --><element ref="button" inputtag="KEY3" inputmask="0x40"><bounds x="947" y="252" width="59" height="13"/></element>
<!-- Down --><element ref="button" inputtag="KEY3" inputmask="0x20"><bounds x="909" y="204" width="59" height="13"/></element>
<!-- Left --><element ref="button" inputtag="KEY3" inputmask="0x10"><bounds x="871" y="157" width="59" height="13"/></element>
<!-- Right --><element ref="button" inputtag="KEY3" inputmask="0x08"><bounds x="947" y="157" width="59" height="13"/></element>
<!-- Up --><element ref="button" inputtag="KEY3" inputmask="0x04"><bounds x="909" y="108" width="59" height="13"/></element>
<!-- MIDI OUT -->
<element ref="button" inputtag="KEY3" inputmask="0x02"><bounds x="53" y="157" width="59" height="13"/></element>
<element name="LP03" ref="red_led"><bounds x="75" y="158" width="15" height="5" /></element>
<!-- TONE DISPLAY -->
<element ref="button" inputtag="KEY3" inputmask="0x01"><bounds x="53" y="108" width="59" height="13"/></element>
<element name="LP02" ref="red_led"><bounds x="75" y="109" width="15" height="5" /></element>
<!-- EXIT --><element ref="button" inputtag="KEY4" inputmask="0x80"><bounds x="751" y="252" width="59" height="13"/></element>
<!-- F5 --><element ref="button" inputtag="KEY4" inputmask="0x40"><bounds x="645" y="252" width="59" height="13"/></element>
<!-- F4 --><element ref="button" inputtag="KEY4" inputmask="0x20"><bounds x="555" y="252" width="59" height="13"/></element>
<!-- F3 --><element ref="button" inputtag="KEY4" inputmask="0x10"><bounds x="465" y="252" width="59" height="13"/></element>
<!-- F2 --><element ref="button" inputtag="KEY4" inputmask="0x08"><bounds x="375" y="252" width="59" height="13"/></element>
<!-- F1 --><element ref="button" inputtag="KEY4" inputmask="0x04"><bounds x="285" y="252" width="59" height="13"/></element>
<!-- USER -->
<element ref="button" inputtag="KEY4" inputmask="0x02"><bounds x="177" y="252" width="59" height="13"/></element>
<element name="LP00" ref="red_led"><bounds x="199" y="253" width="15" height="5" /></element>
<!-- PART -->
<element ref="button" inputtag="KEY4" inputmask="0x01"><bounds x="53" y="252" width="59" height="13"/></element>
<element name="LP01" ref="red_led"><bounds x="75" y="253" width="15" height="5" /></element>
<!-- EDIT -->
<element ref="button" inputtag="KEY5" inputmask="0x80"><bounds x="79" y="467" width="37" height="9"/></element>
<element name="LP04" ref="red_led"><bounds x="92" y="468" width="10" height="3" /></element>
<!-- PORTAMENTO -->
<element ref="button" inputtag="KEY5" inputmask="0x40"><bounds x="79" y="438" width="37" height="9"/></element>
<element name="LP05" ref="red_led"><bounds x="92" y="439" width="10" height="3" /></element>
<!-- RESONANCE -->
<element ref="button" inputtag="KEY5" inputmask="0x20"><bounds x="79" y="408" width="37" height="9"/></element>
<element name="LP06" ref="red_led"><bounds x="92" y="409" width="10" height="3" /></element>
<!-- PAN -->
<element ref="button" inputtag="KEY5" inputmask="0x10"><bounds x="79" y="378" width="37" height="9"/></element>
<element name="LP07" ref="red_led"><bounds x="92" y="379" width="10" height="3" /></element>
<!-- TUNING -->
<element ref="button" inputtag="KEY5" inputmask="0x08"><bounds x="127" y="378" width="37" height="9"/></element>
<element name="LP13" ref="red_led"><bounds x="140" y="379" width="10" height="3" /></element>
<!-- ATTACK -->
<element ref="button" inputtag="KEY5" inputmask="0x04"><bounds x="127" y="408" width="37" height="9"/></element>
<element name="LP12" ref="red_led"><bounds x="140" y="409" width="10" height="3" /></element>
<!-- RELEASE -->
<element ref="button" inputtag="KEY5" inputmask="0x02"><bounds x="127" y="438" width="37" height="9"/></element>
<element name="LP11" ref="red_led"><bounds x="140" y="439" width="10" height="3" /></element>
<!-- PCM CARD -->
<element ref="button" inputtag="KEY5" inputmask="0x01"><bounds x="127" y="467" width="37" height="9"/></element>
<element name="LP10" ref="red_led"><bounds x="140" y="468" width="10" height="3" /></element>
<!-- PLAY -->
<element ref="button" inputtag="KEY6" inputmask="0x80"><bounds x="30" y="467" width="37" height="9"/></element>
<element name="LP20" ref="red_led"><bounds x="43" y="468" width="10" height="3" /></element>
<!-- SOLO -->
<element ref="button" inputtag="KEY6" inputmask="0x40"><bounds x="30" y="438" width="37" height="9"/></element>
<element name="LP21" ref="red_led"><bounds x="43" y="439" width="10" height="3" /></element>
<!-- CUTOFF -->
<element ref="button" inputtag="KEY6" inputmask="0x20"><bounds x="30" y="408" width="37" height="9"/></element>
<element name="LP22" ref="red_led"><bounds x="43" y="409" width="10" height="3" /></element>
<!-- LEVEL -->
<element ref="button" inputtag="KEY6" inputmask="0x10"><bounds x="30" y="378" width="37" height="9"/></element>
<element name="LP23" ref="red_led"><bounds x="43" y="379" width="10" height="3" /></element>
<!-- UPPER (4) -->
<element ref="button" inputtag="KEY6" inputmask="0x08"><bounds x="407" y="467" width="37" height="9"/></element>
<element name="LP16" ref="red_led"><bounds x="420" y="468" width="10" height="3" /></element>
<!-- UPPER (3) -->
<element ref="button" inputtag="KEY6" inputmask="0x04"><bounds x="339" y="467" width="37" height="9"/></element>
<element name="LP17" ref="red_led"><bounds x="352" y="468" width="10" height="3" /></element>
<!-- LOWER (2) -->
<element ref="button" inputtag="KEY6" inputmask="0x02"><bounds x="271" y="467" width="37" height="9"/></element>
<element name="LP15" ref="red_led"><bounds x="284" y="468" width="10" height="3" /></element>
<!-- LOWER (1) -->
<element ref="button" inputtag="KEY6" inputmask="0x01"><bounds x="203" y="467" width="37" height="9"/></element>
<element name="LP14" ref="red_led"><bounds x="216" y="468" width="10" height="3" /></element>
<!-- EFFECT/CTRL -->
<element ref="button" inputtag="KEY7" inputmask="0x01"><bounds x="53" y="204" width="59" height="13"/></element>
<element name="LP24" ref="red_led"><bounds x="75" y="205" width="15" height="5" /></element>
</view>
<script><![CDATA[
file:set_resolve_tags_callback(
function()
-- These constants need to match the "slider" and
-- "slider-knob" element attributes.
local slider_height <const> = 82
local knob_height <const> = 24
local knob_slider_delta_y <const> = 5 -- slider y - knob y
local slider_deadzone <const> = math.floor(knob_height / 2) - knob_slider_delta_y
-- Local state used by the pointer update handler.
local sliders = {}
local slider_fields = {}
local selected = 0
-- Gather relevant elements and inputs into local state.
local view = file.views["Internal Layout"]
for i = 1, #view.items do
local item = view.items:at(i)
if item.id ~= nil and string.find(item.id, "SLIDER") == 1 then
local port_tag = item.id
local port = file.device:ioport(port_tag)
local field = nil
if port ~= nil then
for k, val in pairs(port.fields) do
field = val
break
end
if field == nil then
print("LAYOUT ERROR - Port does not have a field: " .. port_tag)
end
else
print("LAYOUT ERROR - Port not found: " .. port_tag)
end
table.insert(sliders, item)
table.insert(slider_fields, field)
end
end
view:set_pointer_updated_callback(
function(type, id, dev, x, y, btn, dn, up, cnt)
-- No button pressed. Reset state.
if btn & 1 == 0 then
selected = 0
return
end
-- Button just pressed. Find affected slider.
if dn & 1 ~= 0 then
for i = 1, #sliders do
if sliders[i].bounds:includes(x, y) then
selected = i
break
end
end
end
-- No slider selected. Nothing to do.
if selected <= 0 then
return
end
-- A slider is selected. Update state and, indirectly,
-- slider knob position, based on the pointer's Y position.
-- It is assumed the attached IO field is an IPT_ADJUSTER
-- with a range of 0-100 (the default).
local bbox = sliders[selected].bounds
local scale_factor = bbox.height / slider_height
local min_y = bbox.y0 + slider_deadzone * scale_factor
local max_y = bbox.y1 - slider_deadzone * scale_factor
local new_value = 100 - 100 * (y - min_y) / (max_y - min_y)
new_value = math.floor(new_value + 0.5)
if new_value < 0 then new_value = 0 end
if new_value > 100 then new_value = 100 end
slider_fields[selected].user_value = new_value
end)
end)
]]></script>
</mamelayout>

View File

@ -0,0 +1,633 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
copyright-holders:Felipe Sanches, m1macrophage
-->
<mamelayout version="2">
<!-- define elements -->
<element name="red_led" defstate="0">
<rect state="1">
<color red="1" green="0.0" blue="0.0" />
</rect>
<rect state="0">
<color red="0.2" green="0.0" blue="0.0" />
</rect>
</element>
<element name="cpanel">
<rect><color red="0.13" green="0.13" blue="0.11"/></rect>
</element>
<element name="clear_rect">
<rect><color red="0.8" green="0.8" blue="0.8"/></rect>
</element>
<element name="grey_rect">
<rect><color red="0.4" green="0.4" blue="0.4" /></rect>
</element>
<element name="brown_line">
<rect><color red="0.72" green="0.45" blue="0.13" /></rect>
</element>
<element name="light_grey_disk">
<disk><color red="0.2" green="0.2" blue="0.2"/></disk>
</element>
<element name="dark_grey_disk">
<disk><color red="0.1" green="0.1" blue="0.1"/></disk>
</element>
<element name="slider-well">
<rect><color red="0.04" green="0.05" blue="0.05"/></rect>
</element>
<element name="slider-wider-well">
<rect><color red="0.13" green="0.15" blue="0.15"/></rect>
</element>
<element name="slider-knob">
<rect><color red="0.18" green="0.2" blue="0.18"/></rect>
</element>
<element name="lcd_border">
<rect><color red="0.06" green="0.06" blue="0.04"/></rect>
</element>
<element name="lcd_bg">
<rect><color red="0.62" green="0.71" blue="0.53"/></rect>
</element>
<element name="button">
<rect state="0"><color red="0.25" green="0.25" blue="0.25"/></rect>
<rect state="1"><color red="0.5" green="0.5" blue="0.5"/></rect>
</element>
<element name="tone_display_text"><text string="TONE DISPLAY"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="midi_out_text"><text string="MIDI OUT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="effect_ctrl_text"><text string="EFFECT/CTRL"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="part_text"><text string="PART"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="user_text"><text string="USER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f1_text"><text string="F1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f2_text"><text string="F2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f3_text"><text string="F3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f4_text"><text string="F4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="f5_text"><text string="F5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="exit_text"><text string="EXIT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="dec_text"><text string="DEC"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="del_text"><text string="DEL"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="inc_text"><text string="INC"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="ins_text"><text string="INS"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="tone_palette_text"><text string="TONE PALETTE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="lower_text"><text string="LOWER"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="upper_text"><text string="UPPER"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="level_text"><text string="LEVEL"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="pan_text"><text string="PAN"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="tuning_text"><text string="TUNING"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="cutoff_text"><text string="CUTOFF"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="resonance_text"><text string="RESONANCE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="attack_text"><text string="ATTACK"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="release_text"><text string="RELEASE"><color red="0.72" green="0.45" blue="0.13" /></text></element>
<element name="solo_text"><text string="SOLO"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="portamento_text"><text string="PORTAMENTO"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="mode_text"><text string="MODE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="play_text"><text string="PLAY"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="edit_text"><text string="EDIT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="pcm_card_text"><text string="PCM CARD"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="panic_text"><text string="PANIC"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="rom_play_text"><text string="ROM PLAY"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="lower_1_text"><text string="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="lower_2_text"><text string="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="upper_3_text"><text string="3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="upper_4_text"><text string="4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="tone_zone_select_text"><text string="TONE/ZONE SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="performance_text"><text string="PERFORMANCE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="patch_text"><text string="PATCH"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="tone_text"><text string="TONE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="a_slash_text"><text string="A/"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="b_text"><text string="B"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="int_slash_text"><text string="INT/"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="card_text"><text string="CARD"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="command_text"><text string="COMMAND"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="write_text"><text string="WRITE"><color red="1.0" green="0.2" blue="0.2" /></text></element>
<element name="enter_text"><text string="ENTER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="caps_text"><text string="CAPS"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="space_text"><text string="SPACE"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="a_b_text"><text string="A B"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="c_d_text"><text string="C D"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="e_f_text"><text string="E F"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="g_h_text"><text string="G H"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="i_j_text"><text string="I J"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="k_l_text"><text string="K L"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="bank_text"><text string="BANK"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="1_text"><text string="1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="2_text"><text string="2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="3_text"><text string="3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="4_text"><text string="4"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="5_text"><text string="5"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="6_text"><text string="6"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="7_text"><text string="7"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="8_text"><text string="8"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="m_n_text"><text string="M N"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="o_p_text"><text string="O P"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="q_r_text"><text string="Q R"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="s_t_text"><text string="S T"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="u_v_text"><text string="U V"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="dash_w_text"><text string="- W"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="9_x_text"><text string="9 X"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="0_y_text"><text string="0 Y"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="1_z_text"><text string="1 Z"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="2_slash_text"><text string="2 /"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="3_plus_text"><text string="3 +"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="4_times_text"><text string="4 *"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="5_hash_text"><text string="5 #"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="6_dot_text"><text string="6 ."><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="7_comma_text"><text string="7 ,"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="8_exclam_text"><text string="8 !"><color red="0.4" green="0.4" blue="0.4" /></text></element>
<element name="number_text"><text string="NUMBER"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="value_text"><text string="VALUE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="double_page_icon_grey">
<image><data><![CDATA[
<svg width="11" height="12" viewBox="0 0 2.910422 3.175">
<path fill="none" stroke="#d1d1d1" stroke-width="0.29" d="m 1.66,0.17 -1.52,0.4 V 2.9 l 1.52,-0.4 z m -0.4,2.52 v 0.3 l 1.52,-0.4 V 0.27 l -1.2,0.3" />
</svg>
]]></data></image>
</element>
<element name="double_page_icon_brown">
<image><data><![CDATA[
<svg width="11" height="12" viewBox="0 0 2.910422 3.175">
<path fill="none" stroke="#b77222" stroke-width="0.29" d="m 1.66,0.17 -1.52,0.4 V 2.9 l 1.52,-0.4 z m -0.4,2.52 v 0.3 l 1.52,-0.4 V 0.27 l -1.2,0.3" />
</svg>
]]></data></image>
</element>
<element name="triple_page_icon_grey">
<image><data><![CDATA[
<svg width="15" height="12" viewBox="0 0 4.3750049 3.500126">
<path fill="none" stroke="#d1d1d1" stroke-width="0.29" d="M 2.57,3 V 3.3 L 4.23,2.9 V 0.4 L 3,0.7 M 1.8,0.18 0.15,0.6 V 3.1 L 1.8,2.68 Z M 1.36,2.89 V 3.2 L 3,2.78 V 0.29 L 1.8,0.58" />
</svg>
]]></data></image>
</element>
<element name="grey_arrows">
<image><data><![CDATA[
<svg width="90" height="110" viewBox="0 0 23.8125 29.1">
<path fill="#d1d1d1" d="m 13.23,25.43 -1.32,3.67 -1.32,-3.67 z m 0,-21.76 L 11.9,0 10.58,3.67 Z m 6.88,9.94 3.7,1.3 -3.7,1.3 z m -16.4,0 L 0,14.92 3.7,16.23 Z" />
</svg>
]]></data></image>
</element>
<!-- build screen -->
<view name="Internal Layout">
<bounds left="0" right="1048" top="0" bottom="524" />
<element ref="cpanel"><bounds x="8" y="8" width="1032" height="300" /></element>
<element ref="lcd_border"><bounds x="178" y="16" width="632" height="200" /></element>
<element ref="lcd_bg"><bounds x="254" y="48" width="488" height="136" /></element>
<screen index="0"><bounds x="258" y="52" width="480" height="128" /></screen>
<element ref="cpanel"><bounds x="8" y="316" width="464" height="200" /></element>
<element ref="cpanel"><bounds x="480" y="316" width="560" height="200" /></element>
<!-- white rect around "performance ... int/card" labels-->
<element ref="clear_rect"><bounds x="497" y="363" width="244" height="13" /></element>
<element ref="cpanel"><bounds x="498" y="364" width="242" height="11" /></element>
<!-- white rect around "command write enter" labels-->
<element ref="clear_rect"><bounds x="743" y="363" width="138" height="13" /></element>
<element ref="cpanel"><bounds x="744" y="364" width="136" height="11" /></element>
<!-- white line over "patch tone a/b" labels-->
<element ref="clear_rect"><bounds x="555" y="365" width="132" height="1" /></element>
<element ref="tone_display_text"><bounds x="39" y="92" width="69" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="112" y="90" width="11" height="12"/></element>
<element ref="midi_out_text"><bounds x="51" y="140" width="47" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="102" y="138" width="11" height="12"/></element>
<element ref="effect_ctrl_text"><bounds x="45" y="188" width="64" height="10"/></element>
<element ref="triple_page_icon_grey"><bounds x="113" y="185" width="15" height="12"/></element>
<element ref="part_text"><bounds x="62" y="236" width="25" height="10"/></element>
<element ref="double_page_icon_grey"><bounds x="90" y="235" width="11" height="12"/></element>
<element ref="user_text"><bounds x="194" y="236" width="26" height="10"/></element>
<element ref="f1_text"><bounds x="309" y="236" width="11" height="10"/></element>
<element ref="f2_text"><bounds x="399" y="236" width="11" height="10"/></element>
<element ref="f3_text"><bounds x="489" y="236" width="11" height="10"/></element>
<element ref="f4_text"><bounds x="579" y="236" width="11" height="10"/></element>
<element ref="f5_text"><bounds x="669" y="236" width="11" height="10"/></element>
<element ref="exit_text"><bounds x="770" y="236" width="22" height="10"/></element>
<element ref="grey_arrows"><bounds x="894" y="89" width="90" height="110"/></element>
<element ref="dec_text"><bounds x="891" y="236" width="19" height="10"/></element>
<element ref="del_text"><bounds x="891" y="273" width="18" height="10"/></element>
<element ref="inc_text"><bounds x="968" y="236" width="16" height="10"/></element>
<element ref="ins_text"><bounds x="968" y="273" width="16" height="10"/></element>
<element ref="brown_line"><bounds x="31" y="336" width="173" height="1" /></element>
<element ref="brown_line"><bounds x="271" y="336" width="177" height="1" /></element>
<element ref="tone_palette_text"><bounds x="206" y="331" width="62" height="9"/></element>
<element ref="brown_line"><bounds x="200" y="346" width="39" height="1" /></element>
<element ref="brown_line"><bounds x="273" y="346" width="39" height="1" /></element>
<element ref="lower_text"><bounds x="242" y="341" width="29" height="9"/></element>
<element ref="brown_line"><bounds x="337" y="346" width="39" height="1" /></element>
<element ref="brown_line"><bounds x="409" y="346" width="39" height="1" /></element>
<element ref="upper_text"><bounds x="379" y="341" width="27" height="9"/></element>
<element ref="slider-wider-well" id="SLIDER4"><bounds x="200" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="217" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER4" inputmask="0x7f"/>
<bounds state="100" x="203" y="352" width="37" height="24"/>
<bounds state="0" x="203" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER5"><bounds x="269" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="286" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER5" inputmask="0x7f"/>
<bounds state="100" x="272" y="352" width="37" height="24"/>
<bounds state="0" x="272" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER6"><bounds x="337" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="354" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER6" inputmask="0x7f"/>
<bounds state="100" x="340" y="352" width="37" height="24"/>
<bounds state="0" x="340" y="417" width="37" height="24"/>
</element>
<element ref="slider-wider-well" id="SLIDER7"><bounds x="405" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="422" y="357" width="10" height="82"/></element>
<element ref="slider-knob">
<animate inputtag="SLIDER7" inputmask="0x7f"/>
<bounds state="100" x="408" y="352" width="37" height="24"/>
<bounds state="0" x="408" y="417" width="37" height="24"/>
</element>
<element ref="lower_1_text"><bounds x="220" y="455" width="6" height="10"/></element>
<element ref="lower_2_text"><bounds x="287" y="455" width="6" height="10"/></element>
<element ref="upper_3_text"><bounds x="355" y="455" width="6" height="10"/></element>
<element ref="upper_4_text"><bounds x="423" y="455" width="6" height="10"/></element>
<element ref="clear_rect"><bounds x="200" y="481" width="82" height="1" /></element>
<element ref="clear_rect"><bounds x="366" y="481" width="82" height="1" /></element>
<element ref="tone_zone_select_text"><bounds x="281" y="480" width="87" height="9"/></element>
<element ref="clear_rect"><bounds x="30" y="455" width="54" height="1" /></element>
<element ref="clear_rect"><bounds x="109" y="455" width="55" height="1" /></element>
<element ref="mode_text"><bounds x="86" y="450" width="21" height="8"/></element>
<element ref="level_text"><bounds x="40" y="368" width="19" height="8"/></element>
<element ref="cutoff_text"><bounds x="37" y="398" width="24" height="8"/></element>
<element ref="solo_text"><bounds x="41" y="428" width="16" height="8"/></element>
<element ref="play_text"><bounds x="42" y="458" width="15" height="8"/></element>
<element ref="pan_text"><bounds x="91" y="368" width="12" height="8"/></element>
<element ref="resonance_text"><bounds x="78" y="398" width="38" height="8"/></element>
<element ref="portamento_text"><bounds x="76" y="428" width="43" height="8"/></element>
<element ref="edit_text"><bounds x="91" y="458" width="14" height="8"/></element>
<element ref="tuning_text"><bounds x="128" y="368" width="23" height="8"/></element>
<element ref="double_page_icon_brown"><bounds x="154" y="367" width="7" height="8"/></element>
<element ref="attack_text"><bounds x="134" y="398" width="24" height="8"/></element>
<element ref="release_text"><bounds x="132" y="428" width="27" height="8"/></element>
<element ref="pcm_card_text"><bounds x="130" y="458" width="33" height="8"/></element>
<element ref="grey_rect"><bounds x="48" y="477" width="99" height="15" /></element>
<element ref="cpanel"><bounds x="49" y="476" width="97" height="15" /></element>
<element ref="cpanel"><bounds x="80" y="487" width="36" height="8" /></element>
<element ref="rom_play_text"><bounds x="82" y="489" width="32" height="8"/></element>
<element ref="grey_rect"><bounds x="48" y="477" width="50" height="7" /></element>
<element ref="cpanel"><bounds x="49" y="476" width="48" height="7" /></element>
<element ref="cpanel"><bounds x="63" y="480" width="24" height="8" /></element>
<element ref="panic_text"><bounds x="65" y="481" width="20" height="8"/></element>
<element ref="performance_text"><bounds x="500" y="366" width="47" height="8"/></element>
<element ref="patch_text"><bounds x="562" y="366" width="19" height="8"/></element>
<element ref="tone_text"><bounds x="612" y="366" width="17" height="8"/></element>
<element ref="a_slash_text"><bounds x="663" y="366" width="6" height="8"/></element>
<element ref="b_text"><bounds x="670" y="366" width="4" height="8"/></element>
<element ref="int_slash_text"><bounds x="702" y="366" width="12" height="8"/></element>
<element ref="card_text"><bounds x="714" y="366" width="17" height="8"/></element>
<element ref="command_text"><bounds x="748" y="366" width="33" height="8"/></element>
<element ref="write_text"><bounds x="804" y="366" width="20" height="8"/></element>
<element ref="enter_text"><bounds x="852" y="366" width="20" height="8"/></element>
<element ref="caps_text"><bounds x="515" y="389" width="16" height="8"/></element>
<element ref="space_text"><bounds x="562" y="389" width="19" height="8"/></element>
<element ref="a_b_text"><bounds x="625" y="389" width="14" height="8"/></element>
<element ref="c_d_text"><bounds x="673" y="389" width="14" height="8"/></element>
<element ref="e_f_text"><bounds x="722" y="389" width="13" height="8"/></element>
<element ref="g_h_text"><bounds x="769" y="389" width="14" height="8"/></element>
<element ref="i_j_text"><bounds x="821" y="389" width="9" height="8"/></element>
<element ref="k_l_text"><bounds x="867" y="389" width="13" height="8"/></element>
<element ref="clear_rect"><bounds x="506" y="423" width="173" height="1" /></element>
<element ref="clear_rect"><bounds x="704" y="423" width="176" height="1" /></element>
<element ref="bank_text"><bounds x="682" y="418" width="20" height="9"/></element>
<element ref="1_text"><bounds x="522" y="428" width="4" height="8"/></element>
<element ref="2_text"><bounds x="570" y="428" width="4" height="8"/></element>
<element ref="3_text"><bounds x="619" y="428" width="4" height="8"/></element>
<element ref="4_text"><bounds x="667" y="428" width="4" height="8"/></element>
<element ref="5_text"><bounds x="715" y="428" width="4" height="8"/></element>
<element ref="6_text"><bounds x="763" y="428" width="4" height="8"/></element>
<element ref="7_text"><bounds x="812" y="428" width="4" height="8"/></element>
<element ref="8_text"><bounds x="860" y="428" width="4" height="8"/></element>
<element ref="m_n_text"><bounds x="527" y="449" width="15" height="8"/></element>
<element ref="o_p_text"><bounds x="576" y="449" width="14" height="8"/></element>
<element ref="q_r_text"><bounds x="625" y="449" width="15" height="8"/></element>
<element ref="s_t_text"><bounds x="674" y="449" width="13" height="8"/></element>
<element ref="u_v_text"><bounds x="722" y="449" width="14" height="8"/></element>
<element ref="dash_w_text"><bounds x="770" y="449" width="14" height="8"/></element>
<element ref="9_x_text"><bounds x="819" y="449" width="14" height="8"/></element>
<element ref="0_y_text"><bounds x="867" y="449" width="14" height="8"/></element>
<element ref="1_text"><bounds x="522" y="458" width="4" height="8"/></element>
<element ref="2_text"><bounds x="570" y="458" width="4" height="8"/></element>
<element ref="3_text"><bounds x="619" y="458" width="4" height="8"/></element>
<element ref="4_text"><bounds x="667" y="458" width="4" height="8"/></element>
<element ref="5_text"><bounds x="715" y="458" width="4" height="8"/></element>
<element ref="6_text"><bounds x="763" y="458" width="4" height="8"/></element>
<element ref="7_text"><bounds x="812" y="458" width="4" height="8"/></element>
<element ref="8_text"><bounds x="860" y="458" width="4" height="8"/></element>
<element ref="1_z_text"><bounds x="529" y="479" width="13" height="8"/></element>
<element ref="2_slash_text"><bounds x="578" y="479" width="11" height="8"/></element>
<element ref="3_plus_text"><bounds x="625" y="479" width="14" height="8"/></element>
<element ref="4_times_text"><bounds x="674" y="479" width="12" height="8"/></element>
<element ref="5_hash_text"><bounds x="722" y="479" width="14" height="8"/></element>
<element ref="6_dot_text"><bounds x="771" y="479" width="11" height="8"/></element>
<element ref="7_comma_text"><bounds x="820" y="479" width="11" height="8"/></element>
<element ref="8_exclam_text"><bounds x="868" y="479" width="11" height="8"/></element>
<element ref="clear_rect"><bounds x="506" y="488" width="166" height="1" /></element>
<element ref="clear_rect"><bounds x="713" y="488" width="167" height="1" /></element>
<element ref="number_text"><bounds x="674" y="486" width="38" height="9"/></element>
<element ref="value_text"><bounds x="960" y="352" width="24" height="9"/></element>
<element name="value_dial" ref="light_grey_disk"><bounds x="919" y="363" width="106" height="106"/></element>
<element name="value_dial_finger" ref="dark_grey_disk"><bounds x="931" y="381" width="32" height="32"/></element>
<!-- PERFORMANCE -->
<element ref="button" inputtag="KEY0" inputmask="0x80"><bounds x="505" y="379" width="37" height="9"/></element>
<element name="LP26" ref="red_led"><bounds x="518" y="380" width="10" height="3" /></element>
<!-- PATCH -->
<element ref="button" inputtag="KEY0" inputmask="0x40"><bounds x="553" y="379" width="37" height="9"/></element>
<element name="LP31" ref="red_led"><bounds x="566" y="380" width="10" height="3" /></element>
<!-- TONE -->
<element ref="button" inputtag="KEY0" inputmask="0x20"><bounds x="602" y="379" width="37" height="9"/></element>
<element name="LP32" ref="red_led"><bounds x="615" y="380" width="10" height="3" /></element>
<!-- A/B -->
<element ref="button" inputtag="KEY0" inputmask="0x10"><bounds x="650" y="379" width="37" height="9"/></element>
<element name="LP33" ref="red_led"><bounds x="663" y="380" width="10" height="3" /></element>
<!-- INT/CARD -->
<element ref="button" inputtag="KEY0" inputmask="0x08"><bounds x="698" y="379" width="37" height="9"/></element>
<element name="LP34" ref="red_led"><bounds x="711" y="380" width="10" height="3" /></element>
<!-- COMMAND -->
<element ref="button" inputtag="KEY0" inputmask="0x04"><bounds x="747" y="379" width="37" height="9"/></element>
<element name="LP35" ref="red_led"><bounds x="760" y="380" width="10" height="3" /></element>
<!-- WRITE -->
<element ref="button" inputtag="KEY0" inputmask="0x02"><bounds x="795" y="379" width="37" height="9"/></element>
<element name="LP36" ref="red_led"><bounds x="808" y="380" width="10" height="3" /></element>
<!-- ENTER -->
<element ref="button" inputtag="KEY0" inputmask="0x01"><bounds x="843" y="379" width="37" height="9"/></element>
<element name="LP37" ref="red_led"><bounds x="856" y="380" width="10" height="3" /></element>
<!-- Bank 1 --><element ref="button" inputtag="KEY1" inputmask="0x80"><bounds x="505" y="439" width="37" height="9"/></element>
<!-- Bank 2 --><element ref="button" inputtag="KEY1" inputmask="0x40"><bounds x="553" y="439" width="37" height="9"/></element>
<!-- Bank 3 --><element ref="button" inputtag="KEY1" inputmask="0x20"><bounds x="602" y="439" width="37" height="9"/></element>
<!-- Bank 4 --><element ref="button" inputtag="KEY1" inputmask="0x10"><bounds x="650" y="439" width="37" height="9"/></element>
<!-- Bank 5 --><element ref="button" inputtag="KEY1" inputmask="0x08"><bounds x="698" y="439" width="37" height="9"/></element>
<!-- Bank 6 --><element ref="button" inputtag="KEY1" inputmask="0x04"><bounds x="747" y="439" width="37" height="9"/></element>
<!-- Bank 7 --><element ref="button" inputtag="KEY1" inputmask="0x02"><bounds x="795" y="439" width="37" height="9"/></element>
<!-- Bank 8 --><element ref="button" inputtag="KEY1" inputmask="0x01"><bounds x="843" y="439" width="37" height="9"/></element>
<!-- Number 1 --><element ref="button" inputtag="KEY2" inputmask="0x80"><bounds x="505" y="469" width="37" height="9"/></element>
<!-- Number 2 --><element ref="button" inputtag="KEY2" inputmask="0x40"><bounds x="553" y="469" width="37" height="9"/></element>
<!-- Number 3 --><element ref="button" inputtag="KEY2" inputmask="0x20"><bounds x="602" y="469" width="37" height="9"/></element>
<!-- Number 4 --><element ref="button" inputtag="KEY2" inputmask="0x10"><bounds x="650" y="469" width="37" height="9"/></element>
<!-- Number 5 --><element ref="button" inputtag="KEY2" inputmask="0x08"><bounds x="698" y="469" width="37" height="9"/></element>
<!-- Number 6 --><element ref="button" inputtag="KEY2" inputmask="0x04"><bounds x="747" y="469" width="37" height="9"/></element>
<!-- Number 7 --><element ref="button" inputtag="KEY2" inputmask="0x02"><bounds x="795" y="469" width="37" height="9"/></element>
<!-- Number 8 --><element ref="button" inputtag="KEY2" inputmask="0x01"><bounds x="843" y="469" width="37" height="9"/></element>
<!-- DEC/DEL --><element ref="button" inputtag="KEY3" inputmask="0x80"><bounds x="871" y="252" width="59" height="13"/></element>
<!-- INC/INS --><element ref="button" inputtag="KEY3" inputmask="0x40"><bounds x="947" y="252" width="59" height="13"/></element>
<!-- Down --><element ref="button" inputtag="KEY3" inputmask="0x20"><bounds x="909" y="204" width="59" height="13"/></element>
<!-- Left --><element ref="button" inputtag="KEY3" inputmask="0x10"><bounds x="871" y="157" width="59" height="13"/></element>
<!-- Right --><element ref="button" inputtag="KEY3" inputmask="0x08"><bounds x="947" y="157" width="59" height="13"/></element>
<!-- Up --><element ref="button" inputtag="KEY3" inputmask="0x04"><bounds x="909" y="108" width="59" height="13"/></element>
<!-- MIDI OUT -->
<element ref="button" inputtag="KEY3" inputmask="0x02"><bounds x="53" y="157" width="59" height="13"/></element>
<element name="LP03" ref="red_led"><bounds x="75" y="158" width="15" height="5" /></element>
<!-- TONE DISPLAY -->
<element ref="button" inputtag="KEY3" inputmask="0x01"><bounds x="53" y="108" width="59" height="13"/></element>
<element name="LP02" ref="red_led"><bounds x="75" y="109" width="15" height="5" /></element>
<!-- EXIT --><element ref="button" inputtag="KEY4" inputmask="0x80"><bounds x="751" y="252" width="59" height="13"/></element>
<!-- F5 --><element ref="button" inputtag="KEY4" inputmask="0x40"><bounds x="645" y="252" width="59" height="13"/></element>
<!-- F4 --><element ref="button" inputtag="KEY4" inputmask="0x20"><bounds x="555" y="252" width="59" height="13"/></element>
<!-- F3 --><element ref="button" inputtag="KEY4" inputmask="0x10"><bounds x="465" y="252" width="59" height="13"/></element>
<!-- F2 --><element ref="button" inputtag="KEY4" inputmask="0x08"><bounds x="375" y="252" width="59" height="13"/></element>
<!-- F1 --><element ref="button" inputtag="KEY4" inputmask="0x04"><bounds x="285" y="252" width="59" height="13"/></element>
<!-- USER -->
<element ref="button" inputtag="KEY4" inputmask="0x02"><bounds x="177" y="252" width="59" height="13"/></element>
<element name="LP00" ref="red_led"><bounds x="199" y="253" width="15" height="5" /></element>
<!-- PART -->
<element ref="button" inputtag="KEY4" inputmask="0x01"><bounds x="53" y="252" width="59" height="13"/></element>
<element name="LP01" ref="red_led"><bounds x="75" y="253" width="15" height="5" /></element>
<!-- EDIT -->
<element ref="button" inputtag="KEY5" inputmask="0x80"><bounds x="79" y="467" width="37" height="9"/></element>
<element name="LP04" ref="red_led"><bounds x="92" y="468" width="10" height="3" /></element>
<!-- PORTAMENTO -->
<element ref="button" inputtag="KEY5" inputmask="0x40"><bounds x="79" y="438" width="37" height="9"/></element>
<element name="LP05" ref="red_led"><bounds x="92" y="439" width="10" height="3" /></element>
<!-- RESONANCE -->
<element ref="button" inputtag="KEY5" inputmask="0x20"><bounds x="79" y="408" width="37" height="9"/></element>
<element name="LP06" ref="red_led"><bounds x="92" y="409" width="10" height="3" /></element>
<!-- PAN -->
<element ref="button" inputtag="KEY5" inputmask="0x10"><bounds x="79" y="378" width="37" height="9"/></element>
<element name="LP07" ref="red_led"><bounds x="92" y="379" width="10" height="3" /></element>
<!-- TUNING -->
<element ref="button" inputtag="KEY5" inputmask="0x08"><bounds x="127" y="378" width="37" height="9"/></element>
<element name="LP13" ref="red_led"><bounds x="140" y="379" width="10" height="3" /></element>
<!-- ATTACK -->
<element ref="button" inputtag="KEY5" inputmask="0x04"><bounds x="127" y="408" width="37" height="9"/></element>
<element name="LP12" ref="red_led"><bounds x="140" y="409" width="10" height="3" /></element>
<!-- RELEASE -->
<element ref="button" inputtag="KEY5" inputmask="0x02"><bounds x="127" y="438" width="37" height="9"/></element>
<element name="LP11" ref="red_led"><bounds x="140" y="439" width="10" height="3" /></element>
<!-- PCM CARD -->
<element ref="button" inputtag="KEY5" inputmask="0x01"><bounds x="127" y="467" width="37" height="9"/></element>
<element name="LP10" ref="red_led"><bounds x="140" y="468" width="10" height="3" /></element>
<!-- PLAY -->
<element ref="button" inputtag="KEY6" inputmask="0x80"><bounds x="30" y="467" width="37" height="9"/></element>
<element name="LP20" ref="red_led"><bounds x="43" y="468" width="10" height="3" /></element>
<!-- SOLO -->
<element ref="button" inputtag="KEY6" inputmask="0x40"><bounds x="30" y="438" width="37" height="9"/></element>
<element name="LP21" ref="red_led"><bounds x="43" y="439" width="10" height="3" /></element>
<!-- CUTOFF -->
<element ref="button" inputtag="KEY6" inputmask="0x20"><bounds x="30" y="408" width="37" height="9"/></element>
<element name="LP22" ref="red_led"><bounds x="43" y="409" width="10" height="3" /></element>
<!-- LEVEL -->
<element ref="button" inputtag="KEY6" inputmask="0x10"><bounds x="30" y="378" width="37" height="9"/></element>
<element name="LP23" ref="red_led"><bounds x="43" y="379" width="10" height="3" /></element>
<!-- UPPER (4) -->
<element ref="button" inputtag="KEY6" inputmask="0x08"><bounds x="407" y="467" width="37" height="9"/></element>
<element name="LP16" ref="red_led"><bounds x="420" y="468" width="10" height="3" /></element>
<!-- UPPER (3) -->
<element ref="button" inputtag="KEY6" inputmask="0x04"><bounds x="339" y="467" width="37" height="9"/></element>
<element name="LP17" ref="red_led"><bounds x="352" y="468" width="10" height="3" /></element>
<!-- LOWER (2) -->
<element ref="button" inputtag="KEY6" inputmask="0x02"><bounds x="271" y="467" width="37" height="9"/></element>
<element name="LP15" ref="red_led"><bounds x="284" y="468" width="10" height="3" /></element>
<!-- LOWER (1) -->
<element ref="button" inputtag="KEY6" inputmask="0x01"><bounds x="203" y="467" width="37" height="9"/></element>
<element name="LP14" ref="red_led"><bounds x="216" y="468" width="10" height="3" /></element>
<!-- EFFECT/CTRL -->
<element ref="button" inputtag="KEY7" inputmask="0x01"><bounds x="53" y="204" width="59" height="13"/></element>
<element name="LP24" ref="red_led"><bounds x="75" y="205" width="15" height="5" /></element>
</view>
<script><![CDATA[
file:set_resolve_tags_callback(
function()
-- These constants need to match the "slider" and
-- "slider-knob" element attributes.
local slider_height <const> = 82
local knob_height <const> = 24
local knob_slider_delta_y <const> = 5 -- slider y - knob y
local slider_deadzone <const> = math.floor(knob_height / 2) - knob_slider_delta_y
-- Local state used by the pointer update handler.
local sliders = {}
local slider_fields = {}
local selected = 0
-- Gather relevant elements and inputs into local state.
local view = file.views["Internal Layout"]
for i = 1, #view.items do
local item = view.items:at(i)
if item.id ~= nil and string.find(item.id, "SLIDER") == 1 then
local port_tag = item.id
local port = file.device:ioport(port_tag)
local field = nil
if port ~= nil then
for k, val in pairs(port.fields) do
field = val
break
end
if field == nil then
print("LAYOUT ERROR - Port does not have a field: " .. port_tag)
end
else
print("LAYOUT ERROR - Port not found: " .. port_tag)
end
table.insert(sliders, item)
table.insert(slider_fields, field)
end
end
view:set_pointer_updated_callback(
function(type, id, dev, x, y, btn, dn, up, cnt)
-- No button pressed. Reset state.
if btn & 1 == 0 then
selected = 0
return
end
-- Button just pressed. Find affected slider.
if dn & 1 ~= 0 then
for i = 1, #sliders do
if sliders[i].bounds:includes(x, y) then
selected = i
break
end
end
end
-- No slider selected. Nothing to do.
if selected <= 0 then
return
end
-- A slider is selected. Update state and, indirectly,
-- slider knob position, based on the pointer's Y position.
-- It is assumed the attached IO field is an IPT_ADJUSTER
-- with a range of 0-100 (the default).
local bbox = sliders[selected].bounds
local scale_factor = bbox.height / slider_height
local min_y = bbox.y0 + slider_deadzone * scale_factor
local max_y = bbox.y1 - slider_deadzone * scale_factor
local new_value = 100 - 100 * (y - min_y) / (max_y - min_y)
new_value = math.floor(new_value + 0.5)
if new_value < 0 then new_value = 0 end
if new_value > 100 then new_value = 100 end
slider_fields[selected].user_value = new_value
end)
end)
]]></script>
</mamelayout>

View File

@ -17580,6 +17580,7 @@ jongtei // "532" Mahjong Jong-Tei (C) 1999 Dynax
jongteia // Mahjong Jong-Tei (C) 2000 Techno-Top
kotbinsp // "909" 1997 Dynax / Shinwhajin
kotbinyo // 1997 Dynax / Shinwhajin
kotbinyosu // 1997 Dynax / Shinwhajin
mjchuuka // "121" (c) 1998 Dynax
mjdchuka // "111" (c) 1995 Nakanihon
mjflove // "500" (c) 1996 Dynax
@ -17984,6 +17985,9 @@ rpanic // (c) 1992 Excellent System / Jaleco
@source:excellent/dblcrown.cpp
dblcrown // (c) 1994 Excellent System
@source:excellent/es8906.cpp
dream9
@source:excellent/es9501.cpp
d9flower
specd9
@ -29467,6 +29471,7 @@ castrev // Revolution
@source:misc/cb2001.cpp
cb2001 // (c) 2000 Dyna Electronics
cb4 // (c) 1997 Dyna Electronics
cb4a // (c) 1997 Dyna Electronics
cb5 // (c) 1997 Dyna Electronics
cb5_11 // (c) 1997 Dyna Electronics
crzybell // (c) 1995 Dyna Electronics
@ -31335,9 +31340,6 @@ mirderby // (c) 1988 Home Data?
@source:misc/mjsenpu.cpp
mjsenpu
@source:misc/mole.cpp
mole // (c) 1982 Yachiyo Electronics, Ltd.
@source:misc/monon_color.cpp
mononcol // (c) 2011 M&D
@ -32183,6 +32185,7 @@ fb2ndv1 // (c) 2004 Amcoe
fb2ndv2 // (c) 2004 Amcoe
fb3g // (c) 200? Amcoe - Fruit Bonus 3G
fb4 // (c) 2004 Amcoe - Fruit Bonus 2004
fb4_14 // (c) 2004 Amcoe
fb4b2 // (c) 2004 Amcoe
fb4c1 // (c) 2004 Amcoe
fb4c2 // (c) 2004 Amcoe
@ -32418,14 +32421,6 @@ vcarn // (c) 1999 Electronic Projects
sprcros2 // (c) 1986 GM Shoji
sprcros2a // (c) 1986 GM Shoji
@source:misc/ssingles.cpp
atamanot // (c) 1983 Yachiyo Denki / Uni Enterprize
ssingles // Yachiyo?
@source:misc/sstrangr.cpp
sstrangr // (c) 1978 Yachiyo Electronics, Ltd.
sstrangr2 // (c) 1979 Yachiyo Electronics, Ltd.
@source:misc/startouch.cpp
europl01 //
@ -41851,6 +41846,7 @@ rezon // (c) 1992 Allumer
rezono // (c) 1991 Allumer
setaroul // UF (c) 1989? Visco
setaroula // hack (CODERE)
setaroulm // UF (c) 1989? Visco
simpsonjr // bootleg of J. J. Squawkers by Daigom
sokonuke // (c) 1995 Sammy Industries
stg // (c) 1991 Athena / Tecmo
@ -47321,6 +47317,17 @@ x168 //
x820 //
x820ii //
@source:yachiyo/mole.cpp
mole // (c) 1982 Yachiyo Electronics, Ltd.
@source:yachiyo/ssingles.cpp
atamanot // (c) 1983 Yachiyo Denki / Uni Enterprize
ssingles // Yachiyo?
@source:yachiyo/sstrangr.cpp
sstrangr // (c) 1978 Yachiyo Electronics, Ltd.
sstrangr2 // (c) 1979 Yachiyo Electronics, Ltd.
@source:yamaha/fb01.cpp
fb01 // 1986 FB-01

View File

@ -7,7 +7,7 @@ This driver covers Dyna games running on the DYNA CPU91A-011 custom CPU.
It is an encrypted NEC V25 or V35.
It has been seen on the following PCBs:
D9203
D9205 (sub PCB)
D9205 or D9205B (sub PCB)
D9304
D9401
D9701 (sub PCB)
@ -1597,7 +1597,7 @@ ROM_END
ROM_START( cb4 ) // Wing W4 board + DYNA D9205 subboard; DYNA CB4 V5.0 in bookkeeping screen.
ROM_REGION16_LE( 0x040000, "boot_prg", 0 )
ROM_LOAD16_WORD( "5mk.2g", 0x020000, 0x10000, CRC(ecc6f80e) SHA1(b6de63cd5231ef9481ee79d841a6ea591add7e4d) )
ROM_LOAD16_WORD( "5mk.2g", 0x20000, 0x10000, CRC(ecc6f80e) SHA1(b6de63cd5231ef9481ee79d841a6ea591add7e4d) )
ROM_RELOAD( 0x30000, 0x10000)
ROM_REGION( 0x100000, "gfx", 0 )
@ -1609,6 +1609,20 @@ ROM_START( cb4 ) // Wing W4 board + DYNA D9205 subboard; DYNA CB4 V5.0 in bookke
ROM_LOAD( "82s147.11b", 0x200, 0x200, BAD_DUMP CRC(a67e7a63) SHA1(b23e0eb9af13e57bbc8602ddc7fb381ba5c8267e) )
ROM_END
ROM_START( cb4a ) // DYNA D9300 + DYNA D9205 subboard; DYNA CB4T V1.2 in bookkeeping screen.
ROM_REGION16_LE( 0x040000, "boot_prg", 0 )
ROM_LOAD16_WORD( "12fb.2g", 0x20000, 0x10000, CRC(2d0e519a) SHA1(a538e3003d8a008dd45ea9fd10b249744b87f3a6) )
ROM_RELOAD( 0x30000, 0x10000)
ROM_REGION( 0x100000, "gfx", 0 ) // not dumped for this set
ROM_LOAD16_BYTE( "cb4.4i", 0x000000, 0x040000, BAD_DUMP CRC(c1799150) SHA1(50e80607b93f6ee35e3e8ff5d854dc83afe76505) )
ROM_LOAD16_BYTE( "cb4.4j", 0x000001, 0x040000, BAD_DUMP CRC(3a12cf69) SHA1(232eeca78cdabcd952825aba0ad397e3dde79747) )
ROM_REGION( 0x400, "proms", 0 ) // not dumped yet
ROM_LOAD( "82s147.9b", 0x000, 0x200, BAD_DUMP CRC(dcf976d2) SHA1(73a08e4587f3516d694a8060b79470cf71df3925) )
ROM_LOAD( "82s147.11b", 0x200, 0x200, BAD_DUMP CRC(a67e7a63) SHA1(b23e0eb9af13e57bbc8602ddc7fb381ba5c8267e) )
ROM_END
ROM_START( cb5 ) // Wing W4 board + DYNA D9701 subboard; DYNA CB5 V1.3 in bookkeeping screen. Appears to be the missing link to igs/goldstar.cpp hw.
ROM_REGION16_LE( 0x040000, "boot_prg", 0 )
ROM_LOAD16_WORD( "cb5-131.1g", 0x020000, 0x20000, CRC(7d47192c) SHA1(bc65f0b3223789fbcd78a7f3ba4f1c0e2a1ee4da) )
@ -1767,6 +1781,7 @@ GAME( 1993, scherrym12 , scherrym, scherrym, cb2001, cb2001_state, init_sm
GAME( 1997, scherrymp, 0, scherrymp, scherrymp, cb2001_state, init_smaller_proms, ROT0, "Dyna", "Super Cherry Master Plus (V1.6)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1997, scherrymp10u, scherrymp, scherrymp, scherrymp, cb2001_state, empty_init, ROT0, "Dyna", "Super Cherry Master Plus (V1.0U)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1993, cb4, 0, cb5, cb5, cb2001_state, empty_init, ROT0, "Dyna", "Cherry Bonus IV (V5.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1993, cb4a, cb4, cb5, cb5, cb2001_state, empty_init, ROT0, "Dyna", "Cherry Bonus IV (V1.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1997, cb5, 0, cb5, cb5, cb2001_state, init_smaller_proms, ROT0, "Dyna", "Cherry Bonus V Five (V1.3)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1997, cb5_11, cb5, cb5, cb5, cb2001_state, init_smaller_proms, ROT0, "Dyna", "Cherry Bonus V Five (V1.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1998, mystjb, 0, scherrymp, scherrymp, cb2001_state, init_smaller_proms, ROT0, "Dyna", "Mystery J & B (V1.3G)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -3699,6 +3699,25 @@ ROM_START( fb4d2 )
ROM_LOAD( "fb415lt.id", 0x00, 0x20, CRC(f44d3e8c) SHA1(af462959a37c271c840324d74b2619691fadf8bd) )
ROM_END
ROM_START( fb4_14 )
ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */
ROM_LOAD( "rom1.bin", 0x00000, 0x40000, CRC(166fc16c) SHA1(aa571cf010a308c9f615df3aa11c956ee246dc6a) )
ROM_REGION( 0x040000, "oki", ROMREGION_ERASE00 ) /* Samples */
ROM_LOAD( "rom2.bin", 0x00000, 0x40000, CRC(f0bfb08e) SHA1(521a277bd0445d677afe33ec245b2b3f501771d0) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD16_BYTE( "rom3.bin", 0x00000, 0x80000, CRC(4176937d) SHA1(dbde944a154f648a86628a8165fa27032115c417) )
ROM_LOAD16_BYTE( "rom4.bin", 0x00001, 0x80000, CRC(f8c57041) SHA1(ca8f58e89d31563b363a78db89e2711402f3ba80) )
ROM_REGION( 0x100000, "gfx2", 0 )
ROM_LOAD16_BYTE( "rom5.bin", 0x00000, 0x80000, CRC(41ad506c) SHA1(19086ab859a60e5127af0e51381cbb9fda6de74a) )
ROM_LOAD16_BYTE( "rom6.bin", 0x00001, 0x80000, CRC(f6c07f3d) SHA1(709fe2a443fdd32a3f9ab9161d5321a01c0119bb) )
ROM_REGION( 0x1000, "nvram", ROMREGION_ERASE00 ) /* default settings */
ROM_LOAD( "fb415lt.id", 0x00, 0x20, CRC(1e27e3e1) SHA1(c2111ed7b3afa24457bca3fa4a4bc5947113b370) )
ROM_END
ROM_START( fb4v1 )
ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */
ROM_LOAD( "fb4v15r.bin", 0x00000, 0x40000, CRC(891f119f) SHA1(1823826cd958a951a930b9a1a23f7cf092ed6ab2) )
@ -5853,7 +5872,7 @@ void sfbonus_state::sfbonus_bitswap(
void sfbonus_state::init_abnudge() { sfbonus_bitswap( 0x33, 0,3,7,6,5,2,1,4, 0xff, 3,7,6,5,1,0,4,2, 0x36, 4,2,3,7,6,5,1,0, 0xa8, 3,2,4,0,1,7,6,5, 0x2c, 0,1,7,6,5,2,4,3, 0xff, 3,7,6,5,1,0,4,2, 0x26, 2,4,3,7,6,5,1,0, 0xbe, 4,1,3,0,2,7,6,5); }
void sfbonus_state::init_abnudged() { sfbonus_bitswap( 0x3b, 0,1,7,6,5,4,3,2, 0xef, 0,7,6,5,4,3,2,1, 0x21, 0,2,1,7,6,5,4,3, 0xa9, 4,3,0,1,2,7,6,5, 0x3d, 2,1,7,6,5,4,3,0, 0xed, 2,7,6,5,4,3,1,0, 0x21, 0,2,1,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5); }
void sfbonus_state::init_abnudgev() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x21, 2,1,0,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3f, 0,1,7,6,5,4,3,2, 0xee, 1,7,6,5,4,3,0,2, 0x25, 1,0,2,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
void sfbonus_state::init_act2000() { sfbonus_bitswap( 0x25, 1,2,7,6,5,4,3,0, 0xE6, 1,7,6,5,4,3,0,2, 0x20, 2,4,1,7,6,5,0,3, 0xBF, 0,3,1,2,4,7,6,5, 0x2E, 1,3,7,6,5,2,0,4, 0xE0, 3,7,6,5,2,0,4,1, 0x2D, 4,1,2,7,6,5,0,3, 0xB2, 2,0,4,1,3,7,6,5); }
void sfbonus_state::init_act2000() { sfbonus_bitswap( 0x25, 1,2,7,6,5,4,3,0, 0xe6, 1,7,6,5,4,3,0,2, 0x20, 2,4,1,7,6,5,0,3, 0xbf, 0,3,1,2,4,7,6,5, 0x2e, 1,3,7,6,5,2,0,4, 0xe0, 3,7,6,5,2,0,4,1, 0x2d, 4,1,2,7,6,5,0,3, 0xb2, 2,0,4,1,3,7,6,5); }
void sfbonus_state::init_act2000d() { sfbonus_bitswap( 0x3d, 0,2,7,6,5,4,3,1, 0xef, 1,7,6,5,4,3,2,0, 0x27, 0,2,1,7,6,5,4,3, 0xad, 4,3,0,1,2,7,6,5, 0x3b, 2,1,7,6,5,4,3,0, 0xed, 0,7,6,5,4,3,2,1, 0x27, 0,2,1,7,6,5,4,3, 0xaa, 4,3,1,2,0,7,6,5); }
void sfbonus_state::init_act2000v() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x23, 2,1,0,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3b, 0,1,7,6,5,4,3,2, 0xe9, 1,7,6,5,4,3,0,2, 0x21, 1,0,2,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
void sfbonus_state::init_act2000v2() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x21, 2,1,0,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3a, 0,1,7,6,5,4,3,2, 0xe9, 1,7,6,5,4,3,0,2, 0x21, 1,0,2,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
@ -5879,7 +5898,7 @@ void sfbonus_state::init_classiced() { sfbonus_bitswap( 0x38, 0,2,7,6,5,4
void sfbonus_state::init_classiced3() { sfbonus_bitswap( 0x3b, 2,1,7,6,5,4,3,0, 0xea, 2,7,6,5,4,3,0,1, 0x24, 2,1,0,7,6,5,4,3, 0xaa, 4,3,2,0,1,7,6,5, 0x3e, 1,0,7,6,5,4,3,2, 0xe8, 0,7,6,5,4,3,1,2, 0x24, 2,1,0,7,6,5,4,3, 0xae, 4,3,1,0,2,7,6,5); }
void sfbonus_state::init_classicev() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x22, 2,0,1,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3a, 2,1,7,6,5,4,3,0, 0xea, 2,7,6,5,4,3,1,0, 0x22, 2,1,0,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
void sfbonus_state::init_classicev3() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x22, 2,0,1,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3f, 2,1,7,6,5,4,3,0, 0xe9, 2,7,6,5,4,3,1,0, 0x22, 2,1,0,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
void sfbonus_state::init_dblchal() { sfbonus_bitswap( 0x3D, 0,3,7,6,5,2,1,4, 0xF3, 3,7,6,5,1,0,4,2, 0x3D, 2,0,1,7,6,5,3,4, 0xA8, 3,4,2,0,1,7,6,5, 0x3D, 2,3,7,6,5,1,0,4, 0xEF, 2,7,6,5,1,0,3,4, 0x3A, 4,2,3,7,6,5,1,0, 0xBA, 2,4,1,0,3,7,6,5); }
void sfbonus_state::init_dblchal() { sfbonus_bitswap( 0x3d, 0,3,7,6,5,2,1,4, 0xf3, 3,7,6,5,1,0,4,2, 0x3d, 2,0,1,7,6,5,3,4, 0xa8, 3,4,2,0,1,7,6,5, 0x3d, 2,3,7,6,5,1,0,4, 0xef, 2,7,6,5,1,0,3,4, 0x3a, 4,2,3,7,6,5,1,0, 0xba, 2,4,1,0,3,7,6,5); }
void sfbonus_state::init_dblchald() { sfbonus_bitswap( 0x3c, 0,1,7,6,5,4,3,2, 0xed, 0,7,6,5,4,3,2,1, 0x27, 0,2,1,7,6,5,4,3, 0xae, 4,3,1,0,2,7,6,5, 0x3b, 2,1,7,6,5,4,3,0, 0xea, 2,7,6,5,4,3,0,1, 0x27, 0,2,1,7,6,5,4,3, 0xae, 4,3,1,2,0,7,6,5); }
void sfbonus_state::init_dblchalv() { sfbonus_bitswap( 0x39, 1,2,7,6,5,4,3,0, 0xef, 2,7,6,5,4,3,0,1, 0x22, 2,0,1,7,6,5,4,3, 0xa8, 4,3,1,2,0,7,6,5, 0x3f, 1,0,7,6,5,4,3,2, 0xec, 1,7,6,5,4,3,0,2, 0x21, 1,0,2,7,6,5,4,3, 0xac, 4,3,0,1,2,7,6,5); }
void sfbonus_state::init_fb2gen() { sfbonus_bitswap( 0x35, 0,3,7,6,5,2,1,4, 0xe8, 2,7,6,5,4,3,1,0, 0x23, 4,3,2,7,6,5,1,0, 0xb8, 2,1,4,0,3,7,6,5, 0x2d, 0,1,7,6,5,4,2,3, 0xf8, 2,7,6,5,1,4,3,0, 0x23, 4,0,3,7,6,5,2,1, 0xb8, 2,1,4,0,3,7,6,5); }
@ -6118,6 +6137,7 @@ GAME( 2004, fb4b2, fb4, sfbonus, amcoe2_reels3, sfbonus_state, init_f
GAME( 2004, fb4c2, fb4, sfbonus, amcoe1_reels3, sfbonus_state, init_fb4, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.5LT, set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 2004, fb4d2, fb4, sfbonus, amcoe1_reels3, sfbonus_state, init_fb4d, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.5LT, set 3)", MACHINE_SUPPORTS_SAVE )
GAME( 2004, fb4v2, fb4, sfbonus, amcoe1_reels3, sfbonus_state, init_fb4v, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.5LT Dual)", MACHINE_SUPPORTS_SAVE )
GAME( 2004, fb4_14, fb4, sfbonus, amcoe1_reels3, sfbonus_state, init_fb4d, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.4)", MACHINE_SUPPORTS_SAVE )
GAME( 2004, fb4o, fb4, sfbonus, amcoe2_reels3, sfbonus_state, init_fb4, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.3XT)", MACHINE_SUPPORTS_SAVE )
GAME( 2004, fb4o2, fb4, sfbonus, amcoe2_reels3, sfbonus_state, init_fb4, ROT0, "Amcoe", "Fruit Bonus 2004 (Version 1.2)", MACHINE_SUPPORTS_SAVE )

View File

@ -418,17 +418,14 @@ ROM_END
ROM_START( sshota )
ROM_REGION( 0x2000, "maincpu", 0 )
ROM_LOAD( "ss_1.a6", 0x0000, 0x0400, CRC(45572eac) SHA1(17f59d651793fbfb1359327f85bf32e25c29e43d) )
ROM_LOAD( "ss_1.a6", 0x0000, 0x0400, CRC(ec1cbcd0) SHA1(6e4bcc7e83b1237a25f830b96c0bcb76b876ace4) )
ROM_LOAD( "ss_2.a7", 0x0400, 0x0400, CRC(2d63c338) SHA1(3b082ddd8dc42d68805c0a5d24e1eca3ad808f5c) )
ROM_LOAD( "ss_3.a9", 0x0800, 0x0400, CRC(79aae3e3) SHA1(7d9132b1a5663e118587bcebe9b467badaf51be5) )
ROM_LOAD( "ss_4.a10", 0x0c00, 0x0400, BAD_DUMP CRC(b7f6f5e8) SHA1(d02a84360ca746c1cc0d55198bfbff5a41183911) )
ROM_LOAD( "ss_4.a10", 0x0c00, 0x0400, CRC(3d4fbcbf) SHA1(a7d05fa2c65ce2f4f2d732f562f3b8b0effc6de7) )
ROM_LOAD( "ss_5.a11", 0x1000, 0x0400, CRC(d4f71cd9) SHA1(aab7e33c51e180c2486c59758105359d15e73a1e) )
ROM_LOAD( "ss_6.a12", 0x1400, 0x0400, CRC(9d2f087e) SHA1(9c64d6a872395f6097db740199a30bcbc803ac16) )
ROM_LOAD( "ss_7.a13", 0x1800, 0x0400, CRC(20185164) SHA1(b7ada6150a05539e9a788e6e28786a9a6832744a) )
ROM_LOAD( "ss_8.a15", 0x1c00, 0x0400, CRC(95a01a0e) SHA1(72c233bb94a45780fa061c603eedde9cd7df3998) )
// This seems a problem in the dump (it's 00 - HALT - here while it's 0xc4 - LDI - in the other set).
// This causes the game to hang when pressing start. Routine is otherwise identical to the other set.
ROM_FILL( 0x0c00, 0x0001, 0xc4 )
ROM_REGION( 0x0800, "gfx", 0 )
ROM_LOAD( "ss_a.b9", 0x0000, 0x0400, CRC(ad3413e0) SHA1(ea4c2728755fe52a00fdceddca0b641965045005) )

View File

@ -1134,4 +1134,3 @@ ROM_END
// In production from 1982 to 1985.
SYST(1982, memorymoog, 0, 0, memorymoog, memorymoog, memorymoog_state, empty_init, "Moog Music", "Memorymoog", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE)

View File

@ -366,7 +366,7 @@ void source_state::cv_w(offs_t offset, u8 data)
if (offset >= static_cast<int>(CV::SIZE))
return;
const float cv = MAX_CV * data / 255.0f;
const float cv = MAX_CV * data / 255.0F;
if (cv == m_cv[offset])
return;
m_cv[offset] = cv;
@ -410,7 +410,7 @@ float source_state::get_keyboard_v() const
// *** Convert pressed key to a voltage.
static constexpr const float KEYBOARD_VREF = 8.24f; // From schematic.
static constexpr const float KEYBOARD_VREF = 8.24F; // From schematic.
static constexpr const float RKEY = RES_R(100);
static constexpr const float R74 = RES_R(150);
static constexpr const float R76 = RES_K(220);

View File

@ -670,14 +670,13 @@ void pc8001_state::machine_start()
{
case 16*1024:
membank("bank3")->configure_entry(0, ram);
program.unmap_readwrite(0x6000, 0xbfff);
program.unmap_readwrite(0x8000, 0xbfff);
program.install_readwrite_bank(0xc000, 0xffff, membank("bank3"));
break;
case 32*1024:
membank("bank3")->configure_entry(0, ram);
program.unmap_readwrite(0x6000, 0xbfff);
program.unmap_readwrite(0x8000, 0xbfff);
program.install_readwrite_bank(0x8000, 0xffff, membank("bank3"));
break;
@ -812,13 +811,20 @@ void pc8001mk2sr_state::pc8001mk2sr(machine_config &config)
ROM_START( pc8001 )
ROM_REGION( 0x8000, Z80_TAG, ROMREGION_ERASEFF )
ROM_DEFAULT_BIOS("v110")
// PCB pictures shows divided by 3 ROMs (and 4th socket unpopulated)
// D2364C ROMs from a pc8001b PCB:
// - p12019-106.u10 072NBASIC
// - p11219-105.u11 073NBASIC
// - p12029-106.u12 171NBASIC
ROM_SYSTEM_BIOS( 0, "v101", "N-BASIC v1.01" )
ROMX_LOAD( "n80v101.rom", 0x00000, 0x6000, BAD_DUMP CRC(a2cc9f22) SHA1(6d2d838de7fea20ddf6601660d0525d5b17bf8a3), ROM_BIOS(0) )
ROM_SYSTEM_BIOS( 1, "v102", "N-BASIC v1.02" )
ROMX_LOAD( "n80v102.rom", 0x00000, 0x6000, BAD_DUMP CRC(ed01ca3f) SHA1(b34a98941499d5baf79e7c0e5578b81dbede4a58), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 2, "v110", "N-BASIC v1.10" )
ROMX_LOAD( "n80v110.rom", 0x00000, 0x6000, BAD_DUMP CRC(1e02d93f) SHA1(4603cdb7a3833e7feb257b29d8052c872369e713), ROM_BIOS(2) )
// empty socket, cfr. notes in header for usage instructions
ROM_LOAD_OPTIONAL( "exprom.u13", 0x6000, 0x2000, NO_DUMP )
ROM_REGION( 0x800, CGROM_TAG, 0)
ROM_LOAD( "font.rom", 0x000, 0x800, CRC(56653188) SHA1(84b90f69671d4b72e8f219e1fe7cd667e976cf7f) )

View File

@ -161,7 +161,7 @@
/*
* The noice generator consists of three LS164 8+8+8
* The noise generator consists of three LS164 8+8+8
* the output signal is taken after the xor, so
* taking bit 0 is not exact
*/

View File

@ -1661,4 +1661,3 @@ ROM_END
} // anonymous namespace
SYST(1980, obdmx, 0, 0, dmx, dmx, dmx_state, empty_init, "Oberheim", "DMX", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND)

View File

@ -23,12 +23,13 @@
#include "screen.h"
#include "softlist_dev.h"
#include "speaker.h"
#include "d70.lh"
#include "multibyte.h"
#include <queue>
#include "roland_d70.lh"
namespace {
@ -544,7 +545,7 @@ void roland_d70_state::d70(machine_config &config) {
MIDI_PORT(config, "mdout", midiout_slot, "midiout");
MIDI_PORT(config, "mdthru", midiout_slot, "midiout");
config.set_default_layout(layout_d70);
config.set_default_layout(layout_roland_d70);
}
void roland_d70_state::init_d70() {

View File

@ -4719,50 +4719,49 @@ void segaxbd_new_state_double::init_gprider_double()
// GAME DRIVERS
//**************************************************************************
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
GAME( 1987, aburner2, 0, sega_aburner2, aburner2, segaxbd_new_state, init_aburner2, ROT0,"Sega", "After Burner II", 0 )
GAME( 1987, aburner2g,aburner2, sega_aburner2, aburner2, segaxbd_new_state, init_aburner2, ROT0,"Sega", "After Burner II (German)", 0 )
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
GAME( 1987, aburner, 0, sega_aburner2, aburner, segaxbd_new_state, init_aburner2, ROT0, "Sega", "After Burner", 0 )
GAME( 1987, aburner, aburner2, sega_aburner2, aburner, segaxbd_new_state, init_aburner2, ROT0,"Sega", "After Burner", 0 )
GAME( 1987, aburner2, 0, sega_aburner2, aburner2, segaxbd_new_state, init_aburner2, ROT0, "Sega", "After Burner II", 0 )
GAME( 1987, aburner2g, aburner2, sega_aburner2, aburner2, segaxbd_new_state, init_aburner2, ROT0, "Sega", "After Burner II (German)", 0 )
GAME( 1987, thndrbld, 0, sega_xboard_fd1094, thndrbld, segaxbd_new_state, empty_init, ROT0, "Sega", "Thunder Blade (upright) (FD1094 317-0056)", 0 )
GAME( 1987, thndrbld1,thndrbld, sega_xboard, thndrbd1, segaxbd_new_state, empty_init, ROT0, "Sega", "Thunder Blade (deluxe/standing) (unprotected)", 0 )
GAME( 1987, thndrbld, 0, sega_xboard_fd1094, thndrbld, segaxbd_new_state, empty_init, ROT0, "Sega", "Thunder Blade (upright) (FD1094 317-0056)", 0 )
GAME( 1987, thndrbld1, thndrbld, sega_xboard, thndrbd1, segaxbd_new_state, empty_init, ROT0, "Sega", "Thunder Blade (deluxe/standing) (unprotected)", 0 )
GAME( 1989, lastsurv, 0, sega_lastsurv_fd1094,lastsurv, segaxbd_new_state, empty_init, ROT0, "Sega", "Last Survivor (Japan) (FD1094 317-0083)", MACHINE_NODEVICE_LAN )
GAME( 1989, lastsurv, 0, sega_lastsurv_fd1094,lastsurv, segaxbd_new_state, empty_init, ROT0, "Sega", "Last Survivor (Japan) (FD1094 317-0083)", MACHINE_NODEVICE_LAN )
GAME( 1989, loffire, 0, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (World) (FD1094 317-0136)", 0 )
GAME( 1989, loffireu, loffire, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (US) (FD1094 317-0135)", 0 )
GAME( 1989, loffirej, loffire, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (Japan) (FD1094 317-0134)", 0 )
GAME( 1989, loffire, 0, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (World) (FD1094 317-0136)", 0 )
GAME( 1989, loffireu, loffire, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (US) (FD1094 317-0135)", 0 )
GAME( 1989, loffirej, loffire, sega_xboard_fd1094, loffire, segaxbd_new_state, init_loffire, ROT0, "Sega", "Line of Fire / Bakudan Yarou (Japan) (FD1094 317-0134)", 0 )
GAME( 1989, rachero, 0, sega_xboard_fd1094, rachero, segaxbd_new_state, empty_init, ROT0, "Sega", "Racing Hero (FD1094 317-0144)", 0 )
GAME( 1989, rachero, 0, sega_xboard_fd1094, rachero, segaxbd_new_state, empty_init, ROT0, "Sega", "Racing Hero (FD1094 317-0144)", 0 )
GAME( 1989, smgp, 0, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World, Rev B) (FD1094 317-0126a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgp6, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World, Rev A) (FD1094 317-0126a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgp5, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World) (FD1094 317-0126)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev C) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu1, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev B) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu2, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev A) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpj, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (Japan, Rev B) (FD1094 317-0124a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpja, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (Japan, Rev A) (FD1094 317-0124a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgp, 0, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World, Rev B) (FD1094 317-0126a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgp6, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World, Rev A) (FD1094 317-0126a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgp5, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (World) (FD1094 317-0126)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev C) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu1, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev B) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpu2, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (US, Rev A) (FD1094 317-0125a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpj, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (Japan, Rev B) (FD1094 317-0124a)", MACHINE_NODEVICE_LAN )
GAME( 1989, smgpja, smgp, sega_smgp_fd1094, smgp, segaxbd_new_state, init_smgp, ROT0, "Sega", "Super Monaco GP (Japan, Rev A) (FD1094 317-0124a)", MACHINE_NODEVICE_LAN )
GAME( 1990, abcop, 0, sega_xboard_fd1094, abcop, segaxbd_new_state, empty_init, ROT0, "Sega", "A.B. Cop (World) (FD1094 317-0169b)", 0 )
GAME( 1990, abcopj, abcop, sega_xboard_fd1094, abcop, segaxbd_new_state, empty_init, ROT0, "Sega", "A.B. Cop (Japan) (FD1094 317-0169b)", 0 )
GAME( 1990, abcop, 0, sega_xboard_fd1094, abcop, segaxbd_new_state, empty_init, ROT0, "Sega", "A.B. Cop (World) (FD1094 317-0169b)", 0 )
GAME( 1990, abcopj, abcop, sega_xboard_fd1094, abcop, segaxbd_new_state, empty_init, ROT0, "Sega", "A.B. Cop (Japan) (FD1094 317-0169b)", 0 )
// wasn't officially available as a single PCB setup, but runs anyway albeit with messages suggesting you can compete against a nonexistent rival.
GAME( 1990, gpriders, gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (World, FD1094 317-0163)", 0 )
GAME( 1990, gpriderus,gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (US, FD1094 317-0162)", 0 )
GAME( 1990, gpriderjs,gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (Japan, FD1094 317-0161)", 0 )
GAME( 1990, gpriders, gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (World, FD1094 317-0163)", 0 )
GAME( 1990, gpriderus, gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (US, FD1094 317-0162)", 0 )
GAME( 1990, gpriderjs, gprider, sega_xboard_fd1094, gprider, segaxbd_new_state, init_gprider, ROT0, "Sega", "GP Rider (Japan, FD1094 317-0161)", 0 )
// multi X-Board (2 stacks directly connected, shared RAM on bridge PCB - not networked)
GAME( 1990, gprider, 0, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (World, FD1094 317-0163) (Twin setup)", 0 )
GAME( 1990, gprideru,gprider, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (US, FD1094 317-0162) (Twin setup)", 0 )
GAME( 1990, gpriderj,gprider, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (Japan, FD1094 317-0161) (Twin setup)", 0 )
GAME( 1990, gprider, 0, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (World, FD1094 317-0163) (Twin setup)", 0 )
GAME( 1990, gprideru, gprider, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (US, FD1094 317-0162) (Twin setup)", 0 )
GAME( 1990, gpriderj, gprider, sega_xboard_fd1094_double, gprider_double, segaxbd_new_state_double, init_gprider_double, ROT0, "Sega", "GP Rider (Japan, FD1094 317-0161) (Twin setup)", 0 )
// X-Board + other boards?
GAME( 1991, rascot, 0, sega_rascot, rascot, segaxbd_new_state, empty_init, ROT0, "Sega", "Royal Ascot (Japan, terminal?)", MACHINE_NODEVICE_LAN | MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
// decrypted bootlegs
GAME( 1987, thndrbldd, thndrbld, sega_xboard, thndrbld, segaxbd_new_state, empty_init, ROT0, "bootleg", "Thunder Blade (upright) (bootleg of FD1094 317-0056 set)", 0 )
GAME( 1989, racherod, rachero, sega_xboard, rachero, segaxbd_new_state, empty_init, ROT0, "bootleg", "Racing Hero (bootleg of FD1094 317-0144 set)", 0 )

View File

@ -1551,6 +1551,7 @@ public:
{ }
void setaroul(machine_config &config);
void setaroulm(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(coin_drop_start);
ioport_value coin_sensors_r();
@ -1582,7 +1583,7 @@ private:
void setaroul_palette(palette_device &palette) const;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
template <uint8_t Irq1, uint8_t Irq2> TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
void setaroul_map(address_map &map) ATTR_COLD;
@ -4664,6 +4665,15 @@ static INPUT_PORTS_START( setaroul )
PORT_DIPSETTING( 0x00, "Active High" )
INPUT_PORTS_END
static INPUT_PORTS_START( setaroulm )
PORT_INCLUDE( setaroul )
PORT_MODIFY("DSW2-B")
PORT_DIPNAME( 0x01, 0x01, "Show Reels" ) PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
/***************************************************************************
Eight Force
@ -7764,15 +7774,16 @@ void seta_state::qzkklgy2(machine_config &config)
The Roulette
***************************************************************************/
template <uint8_t Irq1, uint8_t Irq2>
TIMER_DEVICE_CALLBACK_MEMBER(setaroul_state::interrupt)
{
int scanline = param;
if ((scanline % 32) == 0) // every 2ms?
m_maincpu->set_input_line(2, HOLD_LINE); // read 1 board column (out of 26) every other call
m_maincpu->set_input_line(Irq1, HOLD_LINE); // read 1 board column (out of 26) every other call
if (scanline == 248)
m_maincpu->set_input_line(4, HOLD_LINE); // vblank
m_maincpu->set_input_line(Irq2, HOLD_LINE); // vblank
// lev 6: RS232
}
@ -7782,7 +7793,7 @@ void setaroul_state::setaroul(machine_config &config)
// basic machine hardware
M68000(config, m_maincpu, 16_MHz_XTAL / 2); // 8 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &setaroul_state::setaroul_map);
TIMER(config, "scantimer").configure_scanline(FUNC(setaroul_state::interrupt), "screen", 0, 1);
TIMER(config, "scantimer").configure_scanline(*this, NAME((&setaroul_state::interrupt<2, 4>)), "screen", 0, 1);
WATCHDOG_TIMER(config, m_watchdog);
@ -7827,6 +7838,13 @@ void setaroul_state::setaroul(machine_config &config)
config.set_default_layout(layout_setaroul);
}
void setaroul_state::setaroulm(machine_config &config)
{
setaroul(config);
TIMER(config.replace(), "scantimer").configure_scanline(*this, NAME((&setaroul_state::interrupt<5, 4>)), "screen", 0, 1);
}
/***************************************************************************
Eight Force
@ -11173,6 +11191,35 @@ ROM_START( setaroula )
ROM_LOAD16_BYTE( "uf0-018.u51", 0x001, 0x200, CRC(1c584d5f) SHA1(f1c7e3da8b108d78b459cae53fabb6e28d3a7ee8) )
ROM_END
ROM_START( setaroulm )
ROM_REGION( 0x0c0000, "maincpu", 0 ) // 68000 Code
ROM_LOAD16_BYTE( "uf011.002.5a", 0x000000, 0x010000, CRC(285f41ba) SHA1(b5ff09cae1e178526145f113cc3c85892e35ec34) )
ROM_LOAD16_BYTE( "uf011.003.7a", 0x000001, 0x010000, CRC(2ab925b0) SHA1(f02de8a6643330c833027dd99006ac2d5d07e2f0) )
ROM_REGION( 0x020000, "gfx1", 0 ) // Sprites
ROM_LOAD16_BYTE( "uf1.005.1j", 0x010001, 0x008000, CRC(12ee9729) SHA1(29f621811d52413ae37137035ad687fabfe9e56e) )
ROM_LOAD16_BYTE( "uf1.006.1l", 0x010000, 0x008000, CRC(5eb35519) SHA1(1af240ae725102f310a101829539d1ca5323e96c) )
ROM_LOAD16_BYTE( "uf1.007.1n", 0x000001, 0x008000, CRC(b287ddcf) SHA1(70d291fcb6a60be2c45e6ad61f1c3922d45ef7e0) )
ROM_LOAD16_BYTE( "uf1.008.1r", 0x000000, 0x008000, CRC(6de9a30b) SHA1(308468079b535d1b0ca437251c3135d7f0c91dce) )
ROM_REGION( 0x400000, "gfx2", 0 ) // Layer 1 - 8bpp, not dumped for this set, but MASK ROM codes match
ROM_LOAD32_BYTE( "uf0-010.u15", 0x000000, 0x080000, CRC(0af13a56) SHA1(c294b7947d004c0e0b280ca44636e4059e05a57e) )
ROM_LOAD32_BYTE( "uf0-012.u29", 0x000001, 0x080000, CRC(cba2a6b7) SHA1(8627eda24c6980a0e786fd9dc06176893a33c58f) )
ROM_LOAD32_BYTE( "uf0-014.u38", 0x000002, 0x080000, CRC(da2bd4e4) SHA1(244af8705f2fa4ab3f3a002af16a0e4d60e03de8) )
ROM_LOAD32_BYTE( "uf0-015.u40", 0x000003, 0x080000, CRC(11dc19fa) SHA1(e7084f61d075a61249d924a523c32e7993d9ae46) )
ROM_LOAD32_BYTE( "uf0-009.u13", 0x200000, 0x080000, CRC(20f2d7f5) SHA1(343a8fac76d6ee7f845f9988c491698ebd0150d4) )
ROM_LOAD32_BYTE( "uf0-011.u22", 0x200001, 0x080000, CRC(af60adf9) SHA1(6505cbce6e066d75b779fdbe2c034ba4daabbefe) )
ROM_LOAD32_BYTE( "uf0-013.u37", 0x200002, 0x080000, CRC(645ec3c3) SHA1(e9b8056c68bf33b0b7130a5ce2bafd11dfd6c29b) )
ROM_LOAD32_BYTE( "uf0-016.u48", 0x200003, 0x080000, CRC(10f99fa8) SHA1(7ef9a3f71dd071483cf3513ef57e2fcfe8702994) )
ROM_REGION( 0x100000, "x1snd", ROMREGION_ERASE00 ) // Samples
ROM_LOAD( "uf1-004.14a", 0x040000, 0x020000, CRC(d63ea334) SHA1(93aaf58c90c4f704caae19b63785e471b2c1281a) ) // 1xxxxxxxxxxxxxxxx = 0xFF, possibly bad
ROM_REGION( 0x400, "proms", 0 ) // not dumped for this set, but stickers match
ROM_LOAD16_BYTE( "uf0-017.u50", 0x000, 0x200, CRC(bf50c303) SHA1(31685ed4849e5c27654f02945678db425d54bf5e) )
ROM_LOAD16_BYTE( "uf0-018.u51", 0x001, 0x200, CRC(1c584d5f) SHA1(f1c7e3da8b108d78b459cae53fabb6e28d3a7ee8) )
ROM_END
void seta_state::init_bankx1()
{
@ -11237,6 +11284,7 @@ void jockeyc_state::init_inttoote()
GAME( 1989?, setaroul, 0, setaroul, setaroul, setaroul_state, empty_init, ROT270, "Visco", "The Roulette (Visco)", 0 )
GAME( 1989?, setaroula, setaroul, setaroul, setaroul, setaroul_state, empty_init, ROT270, "hack (CODERE)", "Super Ruleta 36 (Spanish hack of The Roulette)", 0 )
GAME( 1989?, setaroulm, setaroul, setaroulm, setaroulm, setaroul_state, empty_init, ROT270, "Visco", "The Roulette (Visco, medal)", MACHINE_NOT_WORKING ) // check if game plays correctly, I/O..
GAME( 1989, drgnunit, 0, drgnunit, drgnunit, seta_state, empty_init, ROT0, "Athena / Seta", "Dragon Unit / Castle of Dragon", 0 ) // Country/License: DSW

View File

@ -108,31 +108,43 @@ TODO:
*/
#include "emu.h"
#include "emupal.h"
#include "st0016.h"
#include "cpu/mips/mips1.h"
#include "emupal.h"
#include "speaker.h"
#include <algorithm>
#define LOG_COP (1 << 1)
#define LOG_ALL (LOG_COP)
#define VERBOSE (0)
#include "logmacro.h"
#define LOGCOP(...) LOGMASKED(LOG_COP, __VA_ARGS__)
namespace {
class speglsht_state : public driver_device
{
public:
speglsht_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_palette(*this, "palette"),
m_maincpu(*this,"maincpu"),
m_subcpu(*this, "sub"),
m_shared(*this, "shared"),
m_framebuffer(*this, "framebuffer"),
m_cop_ram(*this, "cop_ram"),
m_st0016_bank(*this, "st0016_bank")
{ }
: driver_device(mconfig, type, tag)
, m_maincpu(*this,"maincpu")
, m_subcpu(*this, "sub")
, m_shared(*this, "shared")
, m_framebuffer(*this, "framebuffer")
, m_cop_ram(*this, "cop_ram")
, m_st0016_bank(*this, "st0016_bank")
{ }
void speglsht(machine_config &config);
void speglsht(machine_config &config) ATTR_COLD;
void init_speglsht();
void init_speglsht() ATTR_COLD;
protected:
virtual void machine_start() override ATTR_COLD;
@ -140,7 +152,6 @@ protected:
virtual void video_start() override ATTR_COLD;
private:
required_device<palette_device> m_palette;
required_device<st0016_cpu_device> m_maincpu;
required_device<r3051_device> m_subcpu;
@ -150,7 +161,7 @@ private:
required_memory_bank m_st0016_bank;
std::unique_ptr<bitmap_ind16> m_bitmap;
bitmap_ind16 m_bitmap;
uint32_t m_videoreg;
uint32_t shared_r(offs_t offset);
@ -158,7 +169,7 @@ private:
void videoreg_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
void cop_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
uint32_t cop_r(offs_t offset);
uint32_t irq_ack_clear();
uint32_t irq_ack_r();
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@ -172,7 +183,7 @@ private:
void speglsht_state::st0016_mem(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("st0016_bank");
map(0x8000, 0xbfff).bankr(m_st0016_bank);
//map(0xc000, 0xcfff).rw(FUNC(speglsht_state::st0016_sprite_ram_r), FUNC(speglsht_state::st0016_sprite_ram_w));
//map(0xd000, 0xdfff).rw(FUNC(speglsht_state::st0016_sprite2_ram_r), FUNC(speglsht_state::st0016_sprite2_ram_w));
map(0xe000, 0xe7ff).ram();
@ -180,7 +191,7 @@ void speglsht_state::st0016_mem(address_map &map)
//map(0xe900, 0xe9ff) // sound - internal
//map(0xea00, 0xebff).rw(FUNC(speglsht_state::st0016_palette_ram_r), FUNC(speglsht_state::st0016_palette_ram_w));
//map(0xec00, 0xec1f).rw(FUNC(speglsht_state::st0016_character_ram_r), FUNC(speglsht_state::st0016_character_ram_w));
map(0xf000, 0xffff).ram().share("shared");
map(0xf000, 0xffff).ram().share(m_shared);
}
void speglsht_state::machine_start()
@ -188,7 +199,7 @@ void speglsht_state::machine_start()
m_st0016_bank->configure_entries(0, 256, memregion("maincpu")->base(), 0x4000);
}
// common rombank? should go in machine/st0016 with larger address space exposed?
// common rombank? should go in seta/st0016.cpp with larger address space exposed?
void speglsht_state::st0016_rom_bank_w(uint8_t data)
{
m_st0016_bank->set_entry(data);
@ -215,7 +226,7 @@ uint32_t speglsht_state::shared_r(offs_t offset)
void speglsht_state::shared_w(offs_t offset, uint32_t data)
{
m_shared[offset]=data&0xff;
m_shared[offset] = data & 0xff;
}
void speglsht_state::videoreg_w(offs_t offset, uint32_t data, uint32_t mem_mask)
@ -226,52 +237,52 @@ void speglsht_state::videoreg_w(offs_t offset, uint32_t data, uint32_t mem_mask)
void speglsht_state::cop_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
COMBINE_DATA(&m_cop_ram[offset]);
if (data & ~uint32_t(0xffff))
LOGCOP("%s: cop_w(%04x) = %08x & %08x\n", machine().describe_context(), offset, data, mem_mask);
if(m_cop_ram[offset]&0x8000) //fix (sign)
if (ACCESSING_BITS_0_15) // fit to 16bit
{
m_cop_ram[offset]|=0xffff0000;
data &= 0xffff;
mem_mask &= 0xffff;
COMBINE_DATA(&m_cop_ram[offset]);
if (m_cop_ram[offset] & 0x8000) // 16 bit signed to 32 bit
{
m_cop_ram[offset] |= 0xffff0000;
}
else
{
m_cop_ram[offset] &= 0xffff;
}
}
}
//matrix * vector
uint32_t speglsht_state::cop_r(offs_t offset)
{
int32_t *cop=(int32_t*)&m_cop_ram[0];
int32_t *cop = (int32_t *)&m_cop_ram[0];
union
{
int32_t a;
uint32_t b;
}temp;
int32_t res = 0;
switch (offset)
{
case 0x40/4:
case 0x10:
case 0x11:
case 0x12:
{
temp.a=((cop[0x3]*cop[0x0]+cop[0x4]*cop[0x1]+cop[0x5]*cop[0x2])>>14)+cop[0xc];
return temp.b;
}
case 0x44/4:
{
temp.a=((cop[0x6]*cop[0x0]+cop[0x7]*cop[0x1]+cop[0x8]*cop[0x2])>>14)+cop[0xd];
return temp.b;
}
case 0x48/4:
{
temp.a=((cop[0x9]*cop[0x0]+cop[0xa]*cop[0x1]+cop[0xb]*cop[0x2])>>14)+cop[0xe];
return temp.b;
unsigned displacement = (offset & 3) * 3;
res = ((cop[0x3 + displacement] * cop[0x0] + cop[0x4 + displacement] * cop[0x1] + cop[0x5 + displacement] * cop[0x2]) >> 14) + cop[0xc + (offset & 3)];
break;
}
}
return 0;
return uint32_t(res);
}
uint32_t speglsht_state::irq_ack_clear()
uint32_t speglsht_state::irq_ack_r()
{
m_subcpu->set_input_line(INPUT_LINE_IRQ4, CLEAR_LINE);
if (!machine().side_effects_disabled())
m_subcpu->set_input_line(INPUT_LINE_IRQ4, CLEAR_LINE);
return 0;
}
@ -279,17 +290,17 @@ void speglsht_state::speglsht_mem(address_map &map)
{
map(0x00000000, 0x000fffff).ram();
map(0x01000000, 0x01007fff).ram(); //tested - STATIC RAM
map(0x01600000, 0x0160004f).rw(FUNC(speglsht_state::cop_r), FUNC(speglsht_state::cop_w)).share("cop_ram");
map(0x01600000, 0x0160004f).rw(FUNC(speglsht_state::cop_r), FUNC(speglsht_state::cop_w)).share(m_cop_ram);
map(0x01800200, 0x01800203).w(FUNC(speglsht_state::videoreg_w));
map(0x01800300, 0x01800303).portr("IN0");
map(0x01800400, 0x01800403).portr("IN1");
map(0x01a00000, 0x01afffff).ram().share("framebuffer");
map(0x01a00000, 0x01afffff).ram().share(m_framebuffer);
map(0x01b00000, 0x01b07fff).ram(); //cleared ... video related ?
map(0x01c00000, 0x01dfffff).rom().region("subdata", 0);
map(0x0a000000, 0x0a003fff).rw(FUNC(speglsht_state::shared_r), FUNC(speglsht_state::shared_w));
map(0x0fc00000, 0x0fdfffff).rom().mirror(0x10000000).region("subprog", 0);
map(0x1eff0000, 0x1eff001f).ram();
map(0x1eff003c, 0x1eff003f).r(FUNC(speglsht_state::irq_ack_clear));
map(0x1eff003c, 0x1eff003f).r(FUNC(speglsht_state::irq_ack_r));
}
static INPUT_PORTS_START( speglsht )
@ -364,53 +375,44 @@ static INPUT_PORTS_START( speglsht )
PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
INPUT_PORTS_END
static GFXDECODE_START( gfx_speglsht )
GFXDECODE_END
void speglsht_state::machine_reset()
{
std::fill(&m_shared[0],&m_shared[m_shared.bytes()],0);
std::fill_n(&m_shared[0], m_shared.length(), 0);
}
void speglsht_state::video_start()
{
m_bitmap = std::make_unique<bitmap_ind16>(512, 512);
}
#define PLOT_PIXEL_RGB(x,y,r,g,b) if(y>=0 && x>=0 && x<512 && y<512) \
{ \
bitmap.pix(y, x) = (b) | ((g)<<8) | ((r)<<16); \
m_bitmap.allocate(512, 512);
save_item(NAME(m_videoreg));
}
uint32_t speglsht_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int dy=(m_videoreg&0x20)?(256*512):0; //visible frame
for(int y=0;y<256;y++)
int y = (cliprect.top() + 5 + (BIT(m_videoreg, 5) ? 256 : 0)) * 512;
for (int dsty = cliprect.top(); dsty <= cliprect.bottom(); dsty++, y += 512)
{
for(int x=0;x<512;x++)
uint32_t *const dstline = &bitmap.pix(dsty);
for (int dstx = cliprect.left(); dstx <= cliprect.right(); dstx++)
{
int tmp=dy+y*512+x;
PLOT_PIXEL_RGB(x-67,y-5,(m_framebuffer[tmp]>>0)&0xff,(m_framebuffer[tmp]>>8)&0xff,(m_framebuffer[tmp]>>16)&0xff);
uint32_t const pix = m_framebuffer[y + dstx + 67];
dstline[dstx] = rgb_t((pix >> 0) & 0xff, (pix >> 8) & 0xff, (pix >> 16) & 0xff);
}
}
//draw st0016 gfx to temporary bitmap (indexed 16)
m_bitmap->fill(0);
m_maincpu->draw_screen(screen, *m_bitmap, cliprect);
// draw st0016 gfx to temporary bitmap (indexed 16)
m_bitmap.fill(0);
m_maincpu->draw_screen(screen, m_bitmap, cliprect);
//copy temporary bitmap to rgb 32 bit bitmap
for(int y=cliprect.min_y; y<=cliprect.max_y;y++)
// copy temporary bitmap to rgb 32 bit bitmap
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
{
uint16_t const *const srcline = &m_bitmap->pix(y);
for(int x=cliprect.min_x; x<=cliprect.max_x;x++)
uint16_t const *const srcline = &m_bitmap.pix(y);
uint32_t *const dstline = &bitmap.pix(y);
for (int x = cliprect.left(); x <= cliprect.right(); x++)
{
if(srcline[x])
{
rgb_t color = m_maincpu->palette().pen_color(srcline[x]);
PLOT_PIXEL_RGB(x,y,color.r(),color.g(),color.b());
}
if (srcline[x])
dstline[x] = m_maincpu->palette().pen_color(srcline[x]);
}
}
@ -441,9 +443,6 @@ void speglsht_state::speglsht(machine_config &config)
screen.set_visarea(0, 319, 8, 239-8);
screen.set_screen_update(FUNC(speglsht_state::screen_update));
GFXDECODE(config, "gfxdecode", m_palette, gfx_speglsht);
PALETTE(config, m_palette).set_entries(16*16*4+1);
// TODO: Mono?
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();

View File

@ -46,7 +46,7 @@ static const discrete_dac_r1_ladder spiders_sound_dac =
0 // no cap
};
/* The noice generator consists of two LS164 plus a LS74, so the length is 8+8+1 */
/* The noise generator consists of two LS164 plus a LS74, so the length is 8+8+1 */
static const discrete_lfsr_desc spiders_lfsr =
{
DISC_CLK_IS_FREQ,

View File

@ -552,7 +552,7 @@ u8 tsconf_state::tsconf_port_xxaf_r(offs_t port)
void tsconf_state::copy_tiles_to_raw(const u8 *tiles_src, u8 *raw_target)
{
for(u32 ln = 0; ln < PAGE4K(8); ln += 4)
for (u32 ln = 0; ln < PAGE4K(8); ln += 4)
{
int targ = tiles_offset_to_raw(ln);
for (u8 x = 0; x < 4; ++x)

View File

@ -3709,13 +3709,9 @@ GAME( 1994, bublbust, pbobble, pbobble, pbobble, taitob_state, init_taito_b,
GAME( 1994, spacedx, 0, spacedx, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Space Invaders DX (US, v2.1)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, spacedxj, spacedx, spacedx, pbobble, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Space Invaders DX (Japan, v2.1)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, spacedxo, spacedx, spacedxo, spacedxo, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Space Invaders DX (Japan, v2.0)", MACHINE_SUPPORTS_SAVE )
/*
Sonic Blast Man is a ticket dispensing game.
(Japanese version however does not dispense them, only US does - try the "sbm_patch" in the machine_config).
It is a bit different from other games running on this system,
in that it has a punching pad that player needs to punch to hit
the enemy.
*/
// Sonic Blast Man is a ticket dispensing game. (Japanese version however does not dispense them, only US does - try the "sbm_patch" in the machine_config).
// It is a bit different from other games running on this system, in that it has a punching pad that player needs to punch to hit the enemy.
GAME( 1990, sbm, 0, sbm, sbm, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Sonic Blast Man (US)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL )
GAME( 1990, sbmj, sbm, sbm, sbmj, taitob_state, init_taito_b, ROT0, "Taito Corporation", "Sonic Blast Man (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL )
GAME( 1994, realpunc, 0, realpunc, realpunc, taitob_c_state, init_taito_b, ROT0, "Taito Corporation Japan", "Real Puncher (World, v2.12O)", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL )

View File

@ -631,8 +631,8 @@ void toaplan1_rallybik_state::rallybik_main_map(address_map &map)
// map(0x140000, 0x140001).w(?? video frame related ??)
map(0x140003, 0x140003).w(FUNC(toaplan1_rallybik_state::intenable_w));
map(0x140008, 0x14000f).w(FUNC(toaplan1_rallybik_state::bcu_control_w));
map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_rallybik_state::bgpalette_w)).share("bgpalette");
map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_rallybik_state::fgpalette_w)).share("fgpalette");
map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_rallybik_state::bgpalette_w)).share(m_bgpaletteram);
map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_rallybik_state::fgpalette_w)).share(m_fgpaletteram);
map(0x180000, 0x180fff).rw(FUNC(toaplan1_rallybik_state::shared_r), FUNC(toaplan1_rallybik_state::shared_w)).umask16(0x00ff);
map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_rallybik_state::tile_offsets_w));
map(0x1c8001, 0x1c8001).w(FUNC(toaplan1_rallybik_state::reset_sound_w));
@ -654,8 +654,8 @@ void toaplan1_state::truxton_main_map(address_map &map)
// map(0x140000, 0x140001).w(?? video frame related ??)
map(0x140003, 0x140003).w(FUNC(toaplan1_state::intenable_w));
map(0x140008, 0x14000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x144000, 0x1447ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x146000, 0x1467ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x180000, 0x180fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
map(0x1c0000, 0x1c0003).w(FUNC(toaplan1_state::tile_offsets_w));
map(0x1c0006, 0x1c0006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
@ -670,8 +670,8 @@ void toaplan1_state::hellfire_main_map(address_map &map)
// map(0x080000, 0x080001).w(?? video frame related ??)
map(0x080003, 0x080003).w(FUNC(toaplan1_state::intenable_w));
map(0x080008, 0x08000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x084000, 0x0847ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x086000, 0x0867ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x084000, 0x0847ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x086000, 0x0867ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x0c0000, 0x0c0fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
map(0x100001, 0x100001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
map(0x100002, 0x100003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
@ -697,8 +697,8 @@ void toaplan1_state::zerowing_main_map(address_map &map)
// map(0x400000, 0x400001).w(?? video frame related ??)
map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
map(0x480001, 0x480001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
map(0x480002, 0x480003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
@ -717,8 +717,8 @@ void toaplan1_demonwld_state::main_map(address_map &map)
// map(0x400000, 0x400001).w(?? video frame related ??)
map(0x400003, 0x400003).w(FUNC(toaplan1_demonwld_state::intenable_w));
map(0x400008, 0x40000f).w(FUNC(toaplan1_demonwld_state::bcu_control_w));
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_demonwld_state::bgpalette_w)).share("bgpalette");
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_demonwld_state::fgpalette_w)).share("fgpalette");
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_demonwld_state::bgpalette_w)).share(m_bgpaletteram);
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_demonwld_state::fgpalette_w)).share(m_fgpaletteram);
map(0x600000, 0x600fff).rw(FUNC(toaplan1_demonwld_state::shared_r), FUNC(toaplan1_demonwld_state::shared_w)).umask16(0x00ff);
map(0x800001, 0x800001).w(FUNC(toaplan1_demonwld_state::bcu_flipscreen_w));
map(0x800002, 0x800003).rw(FUNC(toaplan1_demonwld_state::tileram_offs_r), FUNC(toaplan1_demonwld_state::tileram_offs_w));
@ -746,8 +746,8 @@ void toaplan1_samesame_state::main_map(address_map &map)
// map(0x100000, 0x100001).w(?? video frame related ??)
map(0x100003, 0x100003).w(FUNC(toaplan1_samesame_state::intenable_w));
map(0x100008, 0x10000f).w(FUNC(toaplan1_samesame_state::bcu_control_w));
map(0x104000, 0x1047ff).ram().w(FUNC(toaplan1_samesame_state::bgpalette_w)).share("bgpalette");
map(0x106000, 0x1067ff).ram().w(FUNC(toaplan1_samesame_state::fgpalette_w)).share("fgpalette");
map(0x104000, 0x1047ff).ram().w(FUNC(toaplan1_samesame_state::bgpalette_w)).share(m_bgpaletteram);
map(0x106000, 0x1067ff).ram().w(FUNC(toaplan1_samesame_state::fgpalette_w)).share(m_fgpaletteram);
map(0x140000, 0x140001).portr("P1");
map(0x140002, 0x140003).portr("P2");
map(0x140004, 0x140005).portr("DSWA");
@ -785,8 +785,8 @@ void toaplan1_state::outzone_main_map(address_map &map)
// map(0x300000, 0x300001).w(?? video frame related ??)
map(0x300003, 0x300003).w(FUNC(toaplan1_state::intenable_w));
map(0x300008, 0x30000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x304000, 0x3047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x306000, 0x3067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x304000, 0x3047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x306000, 0x3067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x340000, 0x340003).w(FUNC(toaplan1_state::tile_offsets_w));
map(0x340006, 0x340006).w(FUNC(toaplan1_state::fcu_flipscreen_w));
}
@ -802,8 +802,8 @@ void toaplan1_state::outzonecv_main_map(address_map &map)
// map(0x400000, 0x400001).w(?? video frame related ??)
map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x440000, 0x440fff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff);
map(0x480001, 0x480001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
map(0x480002, 0x480003).rw(FUNC(toaplan1_state::tileram_offs_r), FUNC(toaplan1_state::tileram_offs_w));
@ -828,8 +828,8 @@ void toaplan1_state::vimana_main_map(address_map &map)
// map(0x400000, 0x400001).w(?? video frame related ??)
map(0x400003, 0x400003).w(FUNC(toaplan1_state::intenable_w));
map(0x400008, 0x40000f).w(FUNC(toaplan1_state::bcu_control_w));
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share("bgpalette");
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share("fgpalette");
map(0x404000, 0x4047ff).ram().w(FUNC(toaplan1_state::bgpalette_w)).share(m_bgpaletteram);
map(0x406000, 0x4067ff).ram().w(FUNC(toaplan1_state::fgpalette_w)).share(m_fgpaletteram);
map(0x440000, 0x4407ff).rw(FUNC(toaplan1_state::shared_r), FUNC(toaplan1_state::shared_w)).umask16(0x00ff); /* inputs, coins and sound handled by 647180 MCU via this space */
map(0x480000, 0x487fff).ram();
map(0x4c0001, 0x4c0001).w(FUNC(toaplan1_state::bcu_flipscreen_w));
@ -844,7 +844,7 @@ void toaplan1_state::vimana_main_map(address_map &map)
void toaplan1_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x87ff).ram().share("sharedram");
map(0x8000, 0x87ff).ram().share(m_sharedram);
}
void toaplan1_rallybik_state::rallybik_sound_io_map(address_map &map)
@ -856,7 +856,7 @@ void toaplan1_rallybik_state::rallybik_sound_io_map(address_map &map)
map(0x30, 0x30).w("coinlatch", FUNC(ls259_device::write_nibble_d0)); /* Coin counter/lockout */
map(0x40, 0x40).portr("DSWA");
map(0x50, 0x50).portr("DSWB");
map(0x60, 0x61).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x60, 0x61).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
}
void toaplan1_state::truxton_sound_io_map(address_map &map)
@ -868,7 +868,7 @@ void toaplan1_state::truxton_sound_io_map(address_map &map)
map(0x30, 0x30).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0x40, 0x40).portr("DSWA");
map(0x50, 0x50).portr("DSWB");
map(0x60, 0x61).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x60, 0x61).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x70, 0x70).portr("TJUMP");
}
@ -882,7 +882,7 @@ void toaplan1_state::hellfire_sound_io_map(address_map &map)
map(0x40, 0x40).portr("P1");
map(0x50, 0x50).portr("P2");
map(0x60, 0x60).portr("SYSTEM");
map(0x70, 0x71).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x70, 0x71).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
}
void toaplan1_state::zerowing_sound_io_map(address_map &map)
@ -895,13 +895,13 @@ void toaplan1_state::zerowing_sound_io_map(address_map &map)
map(0x80, 0x80).portr("SYSTEM");
map(0x88, 0x88).portr("TJUMP");
map(0xa0, 0xa0).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0xa8, 0xa9).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0xa8, 0xa9).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
}
void toaplan1_demonwld_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x00, 0x01).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x20, 0x20).portr("TJUMP");
map(0x40, 0x40).w(FUNC(toaplan1_demonwld_state::coin_w)); /* Coin counter/lockout */
map(0x60, 0x60).portr("SYSTEM");
@ -914,7 +914,7 @@ void toaplan1_demonwld_state::sound_io_map(address_map &map)
void toaplan1_state::outzone_sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x00, 0x01).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0x04, 0x04).w(FUNC(toaplan1_state::coin_w)); /* Coin counter/lockout */
map(0x08, 0x08).portr("DSWA");
map(0x0c, 0x0c).portr("DSWB");
@ -946,7 +946,7 @@ void toaplan1_demonwld_state::dsp_io_map(address_map &map)
void toaplan1_state::vimana_hd647180_mem_map(address_map &map)
{
map(0x08000, 0x087ff).ram().share("sharedram"); /* 2048 bytes of shared ram w/maincpu */
map(0x08000, 0x087ff).ram().share(m_sharedram); /* 2048 bytes of shared ram w/maincpu */
}
void toaplan1_state::vimana_hd647180_io_map(address_map &map)
@ -974,8 +974,8 @@ void toaplan1_state::vimana_hd647180_io_map(address_map &map)
map(0x82, 0x82).portr("DSWA");
map(0x83, 0x83).portr("SYSTEM");
map(0x84, 0x84).w(FUNC(toaplan1_state::coin_w)); // Coin counter/lockout // needs verify
map(0x87, 0x87).rw("ymsnd", FUNC(ym3812_device::status_r), FUNC(ym3812_device::address_w));
map(0x8f, 0x8f).w("ymsnd", FUNC(ym3812_device::data_w));
map(0x87, 0x87).rw(m_ymsnd, FUNC(ym3812_device::status_r), FUNC(ym3812_device::address_w));
map(0x8f, 0x8f).w(m_ymsnd, FUNC(ym3812_device::data_w));
}
u8 toaplan1_state::vimana_dswb_invert_r()
@ -999,10 +999,9 @@ void toaplan1_samesame_state::hd647180_io_map(address_map &map)
map.global_mask(0xff);
map(0x63, 0x63).nopr(); // read port D
map(0x80, 0x81).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
map(0xa0, 0xa0).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xb0, 0xb0).w(m_soundlatch, FUNC(generic_latch_8_device::acknowledge_w));
map(0x80, 0x81).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
}
/*****************************************************************************
@ -1902,29 +1901,29 @@ static const gfx_layout tilelayout =
static GFXDECODE_START( gfx_toaplan1 )
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 64 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 64*16, 64 )
GFXDECODE_ENTRY( "tiles", 0, tilelayout, 0, 64 )
GFXDECODE_ENTRY( "sprites", 0, tilelayout, 64*16, 64 )
GFXDECODE_END
static GFXDECODE_START( gfx_rallybik )
GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 64 )
GFXDECODE_ENTRY( "tiles", 0, tilelayout, 0, 64 )
GFXDECODE_END
#define PIXEL_CLOCK (XTAL(28'000'000) / 4)
static constexpr XTAL PIXEL_CLOCK = XTAL(28'000'000) / 4;
// HTOTAL and VTOTAL taken from CRTC registers (bcu_control_w)
// rallybik, demonwld and outzone program a larger VTOTAL than the other
// games, giving them a lower frame rate
#define HTOTAL ((224+1)*2)
#define HBEND (0)
#define HBSTART (320)
static constexpr unsigned HTOTAL = ((224+1)*2);
static constexpr unsigned HBEND = (0);
static constexpr unsigned HBSTART = (320);
#define VTOTAL ((134+1)*2)
#define VTOTAL55 ((140+1)*2)
#define VBEND (0)
#define VBSTART (240)
static constexpr unsigned VTOTAL = ((134+1)*2);
static constexpr unsigned VTOTAL55 = ((140+1)*2);
static constexpr unsigned VBEND = (0);
static constexpr unsigned VBSTART = (240);
void toaplan1_rallybik_state::rallybik(machine_config &config)
@ -2243,7 +2242,7 @@ ROM_START( rallybik )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b45-05.rom", 0x0000, 0x4000, CRC(10814601) SHA1(bad7a834d8849752a7f3000bb5154ec0fa50d695) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b45-09.bin", 0x00000, 0x20000, CRC(1dc7b010) SHA1(67e8633bd787ffcae0e7867e7e591c492c4f2d63) )
ROM_LOAD16_BYTE( "b45-08.bin", 0x00001, 0x20000, CRC(fab661ba) SHA1(acc43cd6d979b1c6a348727f315643d7b8f1496a) )
ROM_LOAD16_BYTE( "b45-07.bin", 0x40000, 0x20000, CRC(cd3748b4) SHA1(a20eb19a0f813112b4e5d9cd91db29de9b37af17) )
@ -2327,13 +2326,13 @@ ROM_START( truxton )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b65_09.2f", 0x0000, 0x4000, CRC(1bdd4ddc) SHA1(6bf7e3a7ca42f79082503ef471f30f271e2f0f99) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b65_08.13e", 0x00000, 0x20000, CRC(d2315b37) SHA1(eb42a884df319728c830c067c2423043ed4536ee) )
ROM_LOAD16_BYTE( "b65_07.11e", 0x00001, 0x20000, CRC(fb83252a) SHA1(48a38584d223f56286137f7acdfaec86ee6588e7) )
ROM_LOAD16_BYTE( "b65_06.10e", 0x40000, 0x20000, CRC(36cedcbe) SHA1(f79d4b1e98b3c9091ae907fb671ad201d3698b42) )
ROM_LOAD16_BYTE( "b65_05.8e", 0x40001, 0x20000, CRC(81cd95f1) SHA1(526a437fbe033ac21054ee5c3bf1ba2fed354c7a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "b65_04.20c", 0x00000, 0x20000, CRC(8c6ff461) SHA1(5199e31f4eb23bad01f7d1079f3618fe39d8a32e) )
ROM_LOAD16_BYTE( "b65_03.20b", 0x00001, 0x20000, CRC(58b1350b) SHA1(7eb2fe329579a6f651d3c1aed9155ac6ffefbc4b) )
ROM_LOAD16_BYTE( "b65_02.20ab", 0x40000, 0x20000, CRC(1dd55161) SHA1(c537456ac56801dea0ac48fb1389228530d00a61) )
@ -2352,13 +2351,13 @@ ROM_START( hellfire )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b90_03.11e", 0x0000, 0x8000, CRC(4058fa67) SHA1(155c364273c270cd74955f447efc804bb4c9b560) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b90_04.7x", 0x00000, 0x20000, CRC(ea6150fc) SHA1(1116947d10ce14fbc6a3b86368fc2024c6f51803) )
ROM_LOAD16_BYTE( "b90_05.7v", 0x00001, 0x20000, CRC(bb52c507) SHA1(b0b1821476647f10c7023f92a66a7f54b92f50c3) )
ROM_LOAD16_BYTE( "b90_06.7t", 0x40000, 0x20000, CRC(cf5b0252) SHA1(e2102967af61afb11d2290a40d13d2faf9ef1e12) )
ROM_LOAD16_BYTE( "b90_07.7r", 0x40001, 0x20000, CRC(b98af263) SHA1(54d636a50a41dbb58b54c22dfab3eabfdb452575) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "b90_11.3a", 0x00000, 0x20000, CRC(c33e543c) SHA1(b85cba30cc651f820aeedd41e04584df92078ed9) )
ROM_LOAD16_BYTE( "b90_10.3c", 0x00001, 0x20000, CRC(35fd1092) SHA1(5e136a35eea45034ccd4aea52cc0ffeec944e27e) )
ROM_LOAD16_BYTE( "b90_09.3d", 0x40000, 0x20000, CRC(cf01009e) SHA1(e260c479fa97f23a65c220e5071aaf2dc2baf46d) )
@ -2377,13 +2376,13 @@ ROM_START( hellfire1 )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b90_03.11e", 0x0000, 0x8000, CRC(4058fa67) SHA1(155c364273c270cd74955f447efc804bb4c9b560) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b90_04.7x", 0x00000, 0x20000, CRC(ea6150fc) SHA1(1116947d10ce14fbc6a3b86368fc2024c6f51803) )
ROM_LOAD16_BYTE( "b90_05.7v", 0x00001, 0x20000, CRC(bb52c507) SHA1(b0b1821476647f10c7023f92a66a7f54b92f50c3) )
ROM_LOAD16_BYTE( "b90_06.7t", 0x40000, 0x20000, CRC(cf5b0252) SHA1(e2102967af61afb11d2290a40d13d2faf9ef1e12) )
ROM_LOAD16_BYTE( "b90_07.7r", 0x40001, 0x20000, CRC(b98af263) SHA1(54d636a50a41dbb58b54c22dfab3eabfdb452575) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "b90_11.3a", 0x00000, 0x20000, CRC(c33e543c) SHA1(b85cba30cc651f820aeedd41e04584df92078ed9) )
ROM_LOAD16_BYTE( "b90_10.3c", 0x00001, 0x20000, CRC(35fd1092) SHA1(5e136a35eea45034ccd4aea52cc0ffeec944e27e) )
ROM_LOAD16_BYTE( "b90_09.3d", 0x40000, 0x20000, CRC(cf01009e) SHA1(e260c479fa97f23a65c220e5071aaf2dc2baf46d) )
@ -2402,13 +2401,13 @@ ROM_START( hellfire2a )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b90_03.11e", 0x0000, 0x8000, CRC(4058fa67) SHA1(155c364273c270cd74955f447efc804bb4c9b560) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b90_04.7x", 0x00000, 0x20000, CRC(ea6150fc) SHA1(1116947d10ce14fbc6a3b86368fc2024c6f51803) )
ROM_LOAD16_BYTE( "b90_05.7v", 0x00001, 0x20000, CRC(bb52c507) SHA1(b0b1821476647f10c7023f92a66a7f54b92f50c3) )
ROM_LOAD16_BYTE( "b90_06.7t", 0x40000, 0x20000, CRC(cf5b0252) SHA1(e2102967af61afb11d2290a40d13d2faf9ef1e12) )
ROM_LOAD16_BYTE( "b90_07.7r", 0x40001, 0x20000, CRC(b98af263) SHA1(54d636a50a41dbb58b54c22dfab3eabfdb452575) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "b90_11.3a", 0x00000, 0x20000, CRC(c33e543c) SHA1(b85cba30cc651f820aeedd41e04584df92078ed9) )
ROM_LOAD16_BYTE( "b90_10.3c", 0x00001, 0x20000, CRC(35fd1092) SHA1(5e136a35eea45034ccd4aea52cc0ffeec944e27e) )
ROM_LOAD16_BYTE( "b90_09.3d", 0x40000, 0x20000, CRC(cf01009e) SHA1(e260c479fa97f23a65c220e5071aaf2dc2baf46d) )
@ -2427,13 +2426,13 @@ ROM_START( hellfire1a )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "b90_03x.11e", 0x0000, 0x8000, CRC(f58c368f) SHA1(2ee5396a4b70a3374f3a3bbd791b1d962f6a8a52) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "b90_04.7x", 0x00000, 0x20000, CRC(ea6150fc) SHA1(1116947d10ce14fbc6a3b86368fc2024c6f51803) )
ROM_LOAD16_BYTE( "b90_05.7v", 0x00001, 0x20000, CRC(bb52c507) SHA1(b0b1821476647f10c7023f92a66a7f54b92f50c3) )
ROM_LOAD16_BYTE( "b90_06.7t", 0x40000, 0x20000, CRC(cf5b0252) SHA1(e2102967af61afb11d2290a40d13d2faf9ef1e12) )
ROM_LOAD16_BYTE( "b90_07.7r", 0x40001, 0x20000, CRC(b98af263) SHA1(54d636a50a41dbb58b54c22dfab3eabfdb452575) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "b90_11.3a", 0x00000, 0x20000, CRC(c33e543c) SHA1(b85cba30cc651f820aeedd41e04584df92078ed9) )
ROM_LOAD16_BYTE( "b90_10.3c", 0x00001, 0x20000, CRC(35fd1092) SHA1(5e136a35eea45034ccd4aea52cc0ffeec944e27e) )
ROM_LOAD16_BYTE( "b90_09.3d", 0x40000, 0x20000, CRC(cf01009e) SHA1(e260c479fa97f23a65c220e5071aaf2dc2baf46d) )
@ -2454,13 +2453,13 @@ ROM_START( zerowing ) // 2 player simultaneous version
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "o15-13.rom", 0x0000, 0x8000, CRC(e7b72383) SHA1(ea1f6f33a86d14d58bd396fd46081462f00177d5) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o15-05.rom", 0x00000, 0x20000, CRC(4e5dd246) SHA1(5366b4a6f3c900a4f57a6583b7399163a06f42d7) )
ROM_LOAD16_BYTE( "o15-06.rom", 0x00001, 0x20000, CRC(c8c6d428) SHA1(76ee5bcb8f10fe201fc5c32697beee3de9d8b751) )
ROM_LOAD16_BYTE( "o15-07.rom", 0x40000, 0x20000, CRC(efc40e99) SHA1(a04fad4197a7fb4787cd9bebf43e1d9b02b2f61b) )
ROM_LOAD16_BYTE( "o15-08.rom", 0x40001, 0x20000, CRC(1b019eab) SHA1(c9569ca85696825142acc5cde9ac829e82b1ca1b) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o15-03.rom", 0x00000, 0x20000, CRC(7f245fd3) SHA1(efbcb3663d4accc4f8128a8fee5475bc109bc17a) )
ROM_LOAD16_BYTE( "o15-04.rom", 0x00001, 0x20000, CRC(0b1a1289) SHA1(ce6c06342392d11952873e3b1d6aea8dc02a551c) )
ROM_LOAD16_BYTE( "o15-01.rom", 0x40000, 0x20000, CRC(70570e43) SHA1(acc9baec71b0930cb2f193677e0663efa5d5551d) )
@ -2481,13 +2480,13 @@ ROM_START( zerowing1 ) // 1 player version
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "o15-13.rom", 0x0000, 0x8000, CRC(e7b72383) SHA1(ea1f6f33a86d14d58bd396fd46081462f00177d5) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o15-05.rom", 0x00000, 0x20000, CRC(4e5dd246) SHA1(5366b4a6f3c900a4f57a6583b7399163a06f42d7) )
ROM_LOAD16_BYTE( "o15-06.rom", 0x00001, 0x20000, CRC(c8c6d428) SHA1(76ee5bcb8f10fe201fc5c32697beee3de9d8b751) )
ROM_LOAD16_BYTE( "o15-07.rom", 0x40000, 0x20000, CRC(efc40e99) SHA1(a04fad4197a7fb4787cd9bebf43e1d9b02b2f61b) )
ROM_LOAD16_BYTE( "o15-08.rom", 0x40001, 0x20000, CRC(1b019eab) SHA1(c9569ca85696825142acc5cde9ac829e82b1ca1b) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o15-03.rom", 0x00000, 0x20000, CRC(7f245fd3) SHA1(efbcb3663d4accc4f8128a8fee5475bc109bc17a) )
ROM_LOAD16_BYTE( "o15-04.rom", 0x00001, 0x20000, CRC(0b1a1289) SHA1(ce6c06342392d11952873e3b1d6aea8dc02a551c) )
ROM_LOAD16_BYTE( "o15-01.rom", 0x40000, 0x20000, CRC(70570e43) SHA1(acc9baec71b0930cb2f193677e0663efa5d5551d) )
@ -2508,13 +2507,13 @@ ROM_START( zerowingw ) // 2 player simultaneous version (Williams Electronics)
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "o15-13.rom", 0x0000, 0x8000, CRC(e7b72383) SHA1(ea1f6f33a86d14d58bd396fd46081462f00177d5) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o15-05.rom", 0x00000, 0x20000, CRC(4e5dd246) SHA1(5366b4a6f3c900a4f57a6583b7399163a06f42d7) )
ROM_LOAD16_BYTE( "o15-06.rom", 0x00001, 0x20000, CRC(c8c6d428) SHA1(76ee5bcb8f10fe201fc5c32697beee3de9d8b751) )
ROM_LOAD16_BYTE( "o15-07.rom", 0x40000, 0x20000, CRC(efc40e99) SHA1(a04fad4197a7fb4787cd9bebf43e1d9b02b2f61b) )
ROM_LOAD16_BYTE( "o15-08.rom", 0x40001, 0x20000, CRC(1b019eab) SHA1(c9569ca85696825142acc5cde9ac829e82b1ca1b) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o15-03.rom", 0x00000, 0x20000, CRC(7f245fd3) SHA1(efbcb3663d4accc4f8128a8fee5475bc109bc17a) )
ROM_LOAD16_BYTE( "o15-04.rom", 0x00001, 0x20000, CRC(0b1a1289) SHA1(ce6c06342392d11952873e3b1d6aea8dc02a551c) )
ROM_LOAD16_BYTE( "o15-01.rom", 0x40000, 0x20000, CRC(70570e43) SHA1(acc9baec71b0930cb2f193677e0663efa5d5551d) )
@ -2538,13 +2537,13 @@ ROM_START( demonwld )
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2569,13 +2568,13 @@ ROM_START( demonwld1 )
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2598,13 +2597,13 @@ ROM_START( demonwld2 )
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2627,13 +2626,13 @@ ROM_START( demonwld3 )
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2656,13 +2655,13 @@ ROM_START( demonwld4 )
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2685,13 +2684,13 @@ ROM_START( demonwld5 ) // standard TP-O16 PCB
ROM_LOAD16_BYTE( "dsp_21.bin", 0x0000, 0x0800, BAD_DUMP CRC(2d135376) SHA1(67a2cc774d272ee1cd6e6bc1c5fc33fc6968837e) )
ROM_LOAD16_BYTE( "dsp_22.bin", 0x0001, 0x0800, BAD_DUMP CRC(79389a71) SHA1(14ec4c1c9b06702319e89a7a250d0038393437f4) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "rom05", 0x00000, 0x20000, CRC(6506c982) SHA1(6d4c1ef91e5617724789ff196abb7abf23e4a7fb) )
ROM_LOAD16_BYTE( "rom07", 0x00001, 0x20000, CRC(a3a0d993) SHA1(50311b9447eb04271b17b212ca31d083ab5b2414) )
ROM_LOAD16_BYTE( "rom06", 0x40000, 0x20000, CRC(4fc5e5f3) SHA1(725d4b009d575ff8ffbe1c00df352ccf235465d7) )
ROM_LOAD16_BYTE( "rom08", 0x40001, 0x20000, CRC(eb53ab09) SHA1(d98195cc1b65b76335b5b24adb31deae1b313f3a) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "rom01", 0x00000, 0x20000, CRC(1b3724e9) SHA1(3dbb0450ab1e40e6df2b7c7356352419cd3f113d) )
ROM_LOAD16_BYTE( "rom02", 0x00001, 0x20000, CRC(7b20a44d) SHA1(4dc1a2fa2058077b112c73492808ee9381060ec7) )
ROM_LOAD16_BYTE( "rom03", 0x40000, 0x20000, CRC(2cacdcd0) SHA1(92216d1c6859e05d39363c30e0beb45bc0ae4e1c) )
@ -2712,13 +2711,13 @@ ROM_START( samesame )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2739,13 +2738,13 @@ ROM_START( samesame2 )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2766,13 +2765,13 @@ ROM_START( samesamenh ) /* this hack has been used on various PCBs */
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2845,13 +2844,13 @@ ROM_START( fireshrk )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2872,13 +2871,13 @@ ROM_START( fireshrka )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2899,13 +2898,13 @@ ROM_START( fireshrkd )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2926,13 +2925,13 @@ ROM_START( fireshrkdh )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2953,13 +2952,13 @@ ROM_START( samesamecn )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
@ -2978,11 +2977,11 @@ ROM_START( outzone )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp_018_09.3j", 0x0000, 0x8000, CRC(73d8e235) SHA1(f37ad497259a467cdf2ec8b3e6e7d3e873087e6c) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.19h", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) )
ROM_LOAD16_WORD( "tp-018_rom6.22h", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.1c", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.1e", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.1d", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3001,11 +3000,11 @@ ROM_START( outzoneh )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp_018_09.3j", 0x0000, 0x8000, CRC(73d8e235) SHA1(f37ad497259a467cdf2ec8b3e6e7d3e873087e6c) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.19h", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) )
ROM_LOAD16_WORD( "tp-018_rom6.22h", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.1c", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.1e", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.1d", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3024,7 +3023,7 @@ ROM_START( outzonea )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp_018_09.3j", 0x0000, 0x8000, CRC(73d8e235) SHA1(f37ad497259a467cdf2ec8b3e6e7d3e873087e6c) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.19h", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) )
ROM_LOAD16_WORD( "tp-018_rom6.22h", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) )
/* a bootleg board exists using the same data in a different layout
@ -3046,7 +3045,7 @@ ROM_START( outzonea )
ROM_LOAD16_BYTE( "12.bin", 0x0e0001, 0x10000, CRC(90d37ded) SHA1(6a4d1d2a8e548fce953833b6ad3658bff85b6c73) )
*/
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.1c", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.1e", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.1d", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3065,11 +3064,11 @@ ROM_START( outzoneb )
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp09.3j", 0x0000, 0x8000, CRC(dd56041f) SHA1(a481b8959b349761624166906175f8efcbebb7e7) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.19h", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) )
ROM_LOAD16_WORD( "tp-018_rom6.22h", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.1c", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.1e", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.1d", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3088,11 +3087,11 @@ ROM_START( outzonec ) // From board serial number 2122, is this a prototype?
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp_018_09.3j", 0x0000, 0x8000, BAD_DUMP CRC(73d8e235) SHA1(f37ad497259a467cdf2ec8b3e6e7d3e873087e6c) ) // see notes
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.19h", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) )
ROM_LOAD16_WORD( "tp-018_rom6.22h", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) )
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.1c", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.1e", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.1d", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3112,11 +3111,11 @@ ROM_START( outzonecv ) // This is a factory conversion of a Zero Wing (TP-015 ha
ROM_REGION( 0x8000, "audiocpu", 0 ) // Sound Z80 code
ROM_LOAD( "tp_018_09+.9l", 0x0000, 0x8000, CRC(b7201606) SHA1(d413074b59f25eb2136c1bc98189550410658493) ) // The actual label has a black dot instead of the "+"
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "tiles", 0 )
ROM_LOAD16_WORD( "tp-018_rom5.bin", 0x00000, 0x80000, CRC(c64ec7b6) SHA1(e73b51c3713c2ea7a572a02531c15d1261ddeaa0) ) // Located on a SUB 015 daughter card
ROM_LOAD16_WORD( "tp-018_rom6.bin", 0x80000, 0x80000, CRC(64b6c5ac) SHA1(07fa20115f603445c0d51af3465c0471c09d76b1) ) // Located on a SUB 015 daughter card
ROM_REGION( 0x80000, "gfx2", 0 )
ROM_REGION( 0x80000, "sprites", 0 )
ROM_LOAD16_BYTE( "tp-018_rom2.22a", 0x00000, 0x20000, CRC(6bb72d16) SHA1(a127b10d9c255542bd09fcb5df057c12fd28c0d1) )
ROM_LOAD16_BYTE( "tp-018_rom1.20a", 0x00001, 0x20000, CRC(0934782d) SHA1(e4a775ead23227d7d6e76aea23aa3103b511d031) )
ROM_LOAD16_BYTE( "tp-018_rom3.25a", 0x40000, 0x20000, CRC(ec903c07) SHA1(75906f31200877fc8f6e78c2606ad5be49778165) )
@ -3135,13 +3134,13 @@ ROM_START( vimana ) // From board serial number 1547.04 (July '94)
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-019.4m", 0x00000, 0x08000, CRC(41a97ebe) SHA1(9b377086e4d9b8de6e3c8c7d2dd099b80ab88934) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "tp-019_rom6.24f", 0x00000, 0x20000, CRC(2886878d) SHA1(f44933d87bbcd3bd58f46e0f0f89b05c409b713b) )
ROM_LOAD16_BYTE( "tp-019_rom5.22f", 0x00001, 0x20000, CRC(61a63d7a) SHA1(5cdebc03110252cc43d31b6f87f9a23556892977) )
ROM_LOAD16_BYTE( "tp-019_rom4.20f", 0x40000, 0x20000, CRC(b0515768) SHA1(9907b52b4d30ce5324270a12c40250068adafca8) )
ROM_LOAD16_BYTE( "tp-019_rom3.18f", 0x40001, 0x20000, CRC(0b539131) SHA1(07f3e3b9b28c8218e36668c24d16dbb6e9a66889) )
ROM_REGION( 0x100000, "gfx2", 0 )
ROM_REGION( 0x100000, "sprites", 0 )
ROM_LOAD16_WORD( "tp-019_rom1.20a", 0x00000, 0x80000, CRC(cdde26cd) SHA1(27893af4692ec7bcbaac9e790c0707c98df84e62) )
ROM_LOAD16_WORD( "tp-019_rom2.20b", 0x80000, 0x80000, CRC(1dbfc118) SHA1(4fd039a3172f73ad910349b2d360e8ae77ccddb2) )
@ -3158,13 +3157,13 @@ ROM_START( vimanan )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-019.4m", 0x00000, 0x08000, CRC(41a97ebe) SHA1(9b377086e4d9b8de6e3c8c7d2dd099b80ab88934) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "tp-019_rom6.24f", 0x00000, 0x20000, CRC(2886878d) SHA1(f44933d87bbcd3bd58f46e0f0f89b05c409b713b) )
ROM_LOAD16_BYTE( "tp-019_rom5.22f", 0x00001, 0x20000, CRC(61a63d7a) SHA1(5cdebc03110252cc43d31b6f87f9a23556892977) )
ROM_LOAD16_BYTE( "tp-019_rom4.20f", 0x40000, 0x20000, CRC(b0515768) SHA1(9907b52b4d30ce5324270a12c40250068adafca8) )
ROM_LOAD16_BYTE( "tp-019_rom3.18f", 0x40001, 0x20000, CRC(0b539131) SHA1(07f3e3b9b28c8218e36668c24d16dbb6e9a66889) )
ROM_REGION( 0x100000, "gfx2", 0 )
ROM_REGION( 0x100000, "sprites", 0 )
ROM_LOAD16_WORD( "tp-019_rom1.20a", 0x00000, 0x80000, CRC(cdde26cd) SHA1(27893af4692ec7bcbaac9e790c0707c98df84e62) )
ROM_LOAD16_WORD( "tp-019_rom2.20b", 0x80000, 0x80000, CRC(1dbfc118) SHA1(4fd039a3172f73ad910349b2d360e8ae77ccddb2) )
@ -3181,13 +3180,13 @@ ROM_START( vimanaj )
ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
ROM_LOAD( "hd647180_tp-019.4m", 0x00000, 0x08000, CRC(41a97ebe) SHA1(9b377086e4d9b8de6e3c8c7d2dd099b80ab88934) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_REGION( 0x80000, "tiles", 0 )
ROM_LOAD16_BYTE( "tp-019_rom6.24f", 0x00000, 0x20000, CRC(2886878d) SHA1(f44933d87bbcd3bd58f46e0f0f89b05c409b713b) )
ROM_LOAD16_BYTE( "tp-019_rom5.22f", 0x00001, 0x20000, CRC(61a63d7a) SHA1(5cdebc03110252cc43d31b6f87f9a23556892977) )
ROM_LOAD16_BYTE( "tp-019_rom4.20f", 0x40000, 0x20000, CRC(b0515768) SHA1(9907b52b4d30ce5324270a12c40250068adafca8) )
ROM_LOAD16_BYTE( "tp-019_rom3.18f", 0x40001, 0x20000, CRC(0b539131) SHA1(07f3e3b9b28c8218e36668c24d16dbb6e9a66889) )
ROM_REGION( 0x100000, "gfx2", 0 )
ROM_REGION( 0x100000, "sprites", 0 )
ROM_LOAD16_WORD( "tp-019_rom1.20a", 0x00000, 0x80000, CRC(cdde26cd) SHA1(27893af4692ec7bcbaac9e790c0707c98df84e62) )
ROM_LOAD16_WORD( "tp-019_rom2.20b", 0x80000, 0x80000, CRC(1dbfc118) SHA1(4fd039a3172f73ad910349b2d360e8ae77ccddb2) )
@ -3198,9 +3197,9 @@ ROM_END
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
GAME( 1988, rallybik, 0, rallybik, rallybik, toaplan1_rallybik_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Rally Bike / Dash Yarou", 0 )
GAME( 1988, rallybik, 0, rallybik, rallybik, toaplan1_rallybik_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Rally Bike (Europe, US) / Dash Yarou (Japan)", 0 )
GAME( 1988, truxton, 0, truxton, truxton, toaplan1_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Truxton / Tatsujin", 0 )
GAME( 1988, truxton, 0, truxton, truxton, toaplan1_state, empty_init, ROT270, "Toaplan / Taito Corporation", "Truxton (Europe, US) / Tatsujin (Japan)", 0 )
GAME( 1989, hellfire, 0, hellfire, hellfire, toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (2P set)", 0 )
GAME( 1989, hellfire1, hellfire, hellfire, hellfire1, toaplan1_state, empty_init, ROT0, "Toaplan (Taito license)", "Hellfire (1P set)", 0 )
@ -3211,21 +3210,21 @@ GAME( 1989, zerowing, 0, zerowing, zerowing2, toaplan1_state,
GAME( 1989, zerowing1, zerowing, zerowing, zerowing, toaplan1_state, empty_init, ROT0, "Toaplan", "Zero Wing (1P set)", 0 )
GAME( 1989, zerowingw, zerowing, zerowing, zerowing2, toaplan1_state, empty_init, ROT0, "Toaplan (Williams license)", "Zero Wing (2P set, Williams license)", 0 )
GAME( 1990, demonwld, 0, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 1)", 0 )
GAME( 1989, demonwld1, demonwld, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 2)", 0 )
GAME( 1989, demonwld2, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 3)", 0 )
GAME( 1989, demonwld3, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 4)", 0 )
GAME( 1989, demonwld4, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World / Horror Story (set 5)", 0 )
GAME( 1989, demonwld5, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan (APM Electronics license)", "Demon's World / Horror Story (set 6)", 0 )
GAME( 1990, demonwld, 0, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World (World) / Horror Story (Japan) (set 1)", 0 )
GAME( 1989, demonwld1, demonwld, demonwld, demonwld, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World (World) / Horror Story (Japan) (set 2)", 0 )
GAME( 1989, demonwld2, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World (World) / Horror Story (Japan) (set 3)", 0 )
GAME( 1989, demonwld3, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World (World) / Horror Story (Japan) (set 4)", 0 )
GAME( 1989, demonwld4, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan", "Demon's World (World) / Horror Story (Japan) (set 5)", 0 )
GAME( 1989, demonwld5, demonwld, demonwld, demonwld1, toaplan1_demonwld_state, empty_init, ROT0, "Toaplan (APM Electronics license)", "Demon's World (World) / Horror Story (Japan) (set 6)", 0 )
GAME( 1990, fireshrk, 0, samesame, fireshrk, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark", 0 )
GAME( 1989, fireshrka, fireshrk, samesame, fireshrka, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark (earlier)", 0 )
GAME( 1990, fireshrkd, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 1, easier)", 0 )
GAME( 1990, fireshrkdh, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 2, harder)", 0 )
GAME( 1989, samesame, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (1P set)", 0 )
GAME( 1989, samesame2, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (2P set)", 0 )
GAME( 1990, samesamecn, fireshrk, samesame, jiaojiao, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Hong Kong Honest Trading license)", "Jiao! Jiao! Jiao! (China, 2P set)", 0 )
GAME( 2015, samesamenh, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "hack (trap15)", "Same! Same! Same! (1P set, NEW VER! hack)", 0 )
GAME( 1990, fireshrk, 0, samesame, fireshrk, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark", 0 )
GAME( 1989, fireshrka, fireshrk, samesame, fireshrka, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Fire Shark (earlier)", 0 )
GAME( 1990, fireshrkd, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 1, easier)", 0 )
GAME( 1990, fireshrkdh, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 2, harder)", 0 )
GAME( 1989, samesame, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (Japan, 1P set)", 0 )
GAME( 1989, samesame2, fireshrk, samesame, samesame2, toaplan1_samesame_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (Japan, 2P set)", 0 )
GAME( 1990, samesamecn, fireshrk, samesame, jiaojiao, toaplan1_samesame_state, empty_init, ROT270, "Toaplan (Hong Kong Honest Trading license)", "Jiao! Jiao! Jiao! (China, 2P set)", 0 )
GAME( 2015, samesamenh, fireshrk, samesame, samesame, toaplan1_samesame_state, empty_init, ROT270, "hack (trap15)", "Same! Same! Same! (Japan, 1P set, NEW VER! hack)", 0 )
GAME( 1990, outzone, 0, outzone, outzone, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone", 0 )
GAME( 1990, outzoneh, outzone, outzone, outzone, toaplan1_state, empty_init, ROT270, "Toaplan", "Out Zone (harder)", 0 )

View File

@ -23,18 +23,18 @@ class toaplan1_state : public driver_device
public:
toaplan1_state(const machine_config &mconfig, device_type type, const char *tag, bool large = false) :
driver_device(mconfig, type, tag),
m_bgpaletteram(*this, "bgpalette"),
m_fgpaletteram(*this, "fgpalette"),
m_sharedram(*this, "sharedram"),
m_dswb_io(*this, "DSWB"),
m_tjump_io(*this, "TJUMP"),
m_spriteram(*this, "spriteram", large ? 0x1000 : 0x800, ENDIANNESS_BIG),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_ymsnd(*this, "ymsnd"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
m_palette(*this, "palette"),
m_bgpaletteram(*this, "bgpalette"),
m_fgpaletteram(*this, "fgpalette"),
m_sharedram(*this, "sharedram"),
m_spriteram(*this, "spriteram", large ? 0x1000 : 0x800, ENDIANNESS_BIG),
m_dswb_io(*this, "DSWB"),
m_tjump_io(*this, "TJUMP")
{ }
void truxton(machine_config &config);
@ -49,16 +49,22 @@ protected:
virtual void machine_reset() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
required_device<m68000_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<ym3812_device> m_ymsnd;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<u16> m_bgpaletteram;
required_shared_ptr<u16> m_fgpaletteram;
optional_shared_ptr<u8> m_sharedram;
memory_share_creator<u16> m_spriteram;
optional_ioport m_dswb_io;
optional_ioport m_tjump_io;
u8 m_intenable = 0;
std::unique_ptr<u16[]> m_tilevram[4];
/*
std::unique_ptr<u16[]> m_tilevram[3]; // || Drawn in this order
@ -67,13 +73,14 @@ protected:
std::unique_ptr<u16[]> m_tilevram[0]; // \/
*/
memory_share_creator<u16> m_spriteram;
std::unique_ptr<u16[]> m_buffered_spriteram;
std::unique_ptr<u16[]> m_spritesizeram;
std::unique_ptr<u16[]> m_buffered_spritesizeram;
u8 m_intenable = 0;
s32 m_bcu_flipscreen; /* Tile controller flip flag */
s32 m_fcu_flipscreen; /* Sprite controller flip flag */
bool m_fcu_flipscreen; /* Sprite controller flip flag */
s32 m_pf_voffs = 0;
s32 m_spriteram_offs = 0;
@ -82,8 +89,8 @@ protected:
s32 m_scrolly[4]{};
#ifdef MAME_DEBUG
int m_display_pf[4]{};
int m_displog = 0;
bool m_display_pf[4]{};
bool m_displog = false;
#endif
s32 m_tiles_offsetx = 0;
@ -137,12 +144,6 @@ protected:
void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void reset_sound();
void reset_callback(int state);
required_device<m68000_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<ym3812_device> m_ymsnd;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
void hellfire_main_map(address_map &map) ATTR_COLD;
void hellfire_sound_io_map(address_map &map) ATTR_COLD;
@ -174,6 +175,8 @@ protected:
virtual void video_start() override ATTR_COLD;
private:
required_device<toaplan_scu_device> m_spritegen;
void coin_counter_1_w(int state);
void coin_counter_2_w(int state);
void coin_lockout_1_w(int state);
@ -183,7 +186,6 @@ private:
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_vblank(int state);
required_device<toaplan_scu_device> m_spritegen;
void rallybik_main_map(address_map &map) ATTR_COLD;
void rallybik_sound_io_map(address_map &map) ATTR_COLD;
};
@ -205,10 +207,12 @@ protected:
virtual void machine_reset() override ATTR_COLD;
private:
required_device<tms32010_device> m_dsp;
/* Demon world */
int m_dsp_on = 0;
int m_dsp_bio = 0;
int m_dsp_execute = 0;
s32 m_dsp_on = 0;
s32 m_dsp_bio = 0;
bool m_dsp_execute = false;
u32 m_dsp_addr_w = 0;
u32 m_main_ram_seg = 0;
@ -220,7 +224,6 @@ private:
void dsp_ctrl_w(u8 data);
void dsp_int_w(int enable);
required_device<tms32010_device> m_dsp;
void dsp_io_map(address_map &map) ATTR_COLD;
void dsp_program_map(address_map &map) ATTR_COLD;
void main_map(address_map &map) ATTR_COLD;

View File

@ -50,19 +50,23 @@ u16 toaplan1_demonwld_state::dsp_r()
case 0xc00000: {address_space &mainspace = m_maincpu->space(AS_PROGRAM);
input_data = mainspace.read_word(m_main_ram_seg + m_dsp_addr_w);
break;}
default: logerror("DSP PC:%04x Warning !!! IO reading from %08x (port 1)\n", m_dsp->pcbase(), m_main_ram_seg + m_dsp_addr_w);
default:
if (!machine().side_effects_disabled())
logerror("DSP PC:%04x Warning !!! IO reading from %08x (port 1)\n", m_dsp->pcbase(), m_main_ram_seg + m_dsp_addr_w);
break;
}
logerror("DSP PC:%04x IO read %04x at %08x (port 1)\n", m_dsp->pcbase(), input_data, m_main_ram_seg + m_dsp_addr_w);
if (!machine().side_effects_disabled())
logerror("DSP PC:%04x IO read %04x at %08x (port 1)\n", m_dsp->pcbase(), input_data, m_main_ram_seg + m_dsp_addr_w);
return input_data;
}
void toaplan1_demonwld_state::dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
m_dsp_execute = false;
switch (m_main_ram_seg)
{
case 0xc00000: {if ((m_dsp_addr_w < 3) && (data == 0)) m_dsp_execute = 1;
case 0xc00000: {if ((m_dsp_addr_w < 3) && (data == 0)) m_dsp_execute = true;
address_space &mainspace = m_maincpu->space(AS_PROGRAM);
mainspace.write_word(m_main_ram_seg + m_dsp_addr_w, data);
break;}
@ -80,7 +84,7 @@ void toaplan1_demonwld_state::dsp_bio_w(u16 data)
/* communication to main processor*/
logerror("DSP PC:%04x IO write %04x at port 3\n", m_dsp->pcbase(), data);
if (data & 0x8000)
if (BIT(data, 15))
m_dsp_bio = CLEAR_LINE;
if (data == 0)
@ -89,7 +93,7 @@ void toaplan1_demonwld_state::dsp_bio_w(u16 data)
{
logerror("Turning 68000 on\n");
m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
m_dsp_execute = 0;
m_dsp_execute = false;
}
m_dsp_bio = ASSERT_LINE;
}
@ -127,14 +131,14 @@ void toaplan1_demonwld_state::device_post_load()
void toaplan1_demonwld_state::dsp_ctrl_w(u8 data)
{
#if 0
logerror("68000:%08x Writing %02x to $e0000b.\n",m_maincpu->pc() ,data);
logerror("68000:%08x Writing %02x to $e0000b.\n", m_maincpu->pc(), data);
#endif
switch (data)
{
case 0x00: dsp_int_w(1); break; /* Enable the INT line to the DSP */
case 0x01: dsp_int_w(0); break; /* Inhibit the INT line to the DSP */
default: logerror("68000:%08x Writing unknown command %02x to $e0000b\n",m_maincpu->pcbase() ,data); break;
default: logerror("68000:%08x Writing unknown command %02x to $e0000b\n", m_maincpu->pcbase(), data); break;
}
}
@ -223,7 +227,7 @@ void toaplan1_demonwld_state::machine_reset()
toaplan1_state::machine_reset();
m_dsp_addr_w = 0;
m_main_ram_seg = 0;
m_dsp_execute = 0;
m_dsp_execute = false;
}

View File

@ -126,9 +126,9 @@ Abnormalities:
#include "toaplan1.h"
#define TOAPLAN1_TILEVRAM_SIZE 0x4000 /* 4 tile layers each this RAM size */
#define TOAPLAN1_SPRITERAM_SIZE 0x800 /* sprite ram */
#define TOAPLAN1_SPRITESIZERAM_SIZE 0x80 /* sprite size ram */
static constexpr u32 TOAPLAN1_TILEVRAM_SIZE = 0x4000; /* 4 tile layers each this RAM size */
static constexpr u32 TOAPLAN1_SPRITERAM_SIZE = 0x800; /* sprite ram */
static constexpr u32 TOAPLAN1_SPRITESIZERAM_SIZE = 0x80; /* sprite size ram */
/***************************************************************************
@ -140,18 +140,16 @@ Abnormalities:
template<unsigned Layer>
TILE_GET_INFO_MEMBER(toaplan1_state::get_tile_info)
{
int color, tile_number, attrib;
tile_number = m_tilevram[Layer][2 * tile_index + 1] & 0x7fff;
attrib = m_tilevram[Layer][2 * tile_index];
color = attrib & 0x3f;
const u16 tile_number = m_tilevram[Layer][2 * tile_index + 1] & 0x7fff;
const u16 attrib = m_tilevram[Layer][2 * tile_index];
const u16 color = attrib & 0x3f;
tileinfo.set(0,
tile_number,
color,
0);
// "disabled" tiles are behind everything else
if (m_tilevram[Layer][2 * tile_index + 1] & 0x8000) tileinfo.category = 16;
else tileinfo.category = (attrib & 0xf000) >> 12;
if (BIT(m_tilevram[Layer][2 * tile_index + 1], 15)) tileinfo.category = 16;
else tileinfo.category = (attrib & 0xf000) >> 12;
}
/***************************************************************************
@ -182,11 +180,11 @@ void toaplan1_state::vram_alloc()
}
#ifdef MAME_DEBUG
m_display_pf[0] = 1;
m_display_pf[1] = 1;
m_display_pf[2] = 1;
m_display_pf[3] = 1;
m_displog = 0;
m_display_pf[0] = true;
m_display_pf[1] = true;
m_display_pf[2] = true;
m_display_pf[3] = true;
m_displog = false;
#endif
}
@ -229,7 +227,7 @@ void toaplan1_state::register_common()
void toaplan1_rallybik_state::video_start()
{
m_spritegen->gfx(0)->set_colorbase(64*16);
m_spritegen->gfx(0)->set_colorbase(64 * 16);
create_tilemaps();
vram_alloc();
@ -247,7 +245,7 @@ void toaplan1_rallybik_state::video_start()
m_tilemap[3]->set_scrolldy(-0x111, 0x8);
m_bcu_flipscreen = -1;
m_fcu_flipscreen = 0;
m_fcu_flipscreen = false;
register_common();
}
@ -268,7 +266,7 @@ void toaplan1_state::video_start()
m_tilemap[3]->set_scrolldy(-0x101, -0xff);
m_bcu_flipscreen = -1;
m_fcu_flipscreen = 0;
m_fcu_flipscreen = false;
register_common();
}
@ -304,8 +302,8 @@ void toaplan1_state::bcu_flipscreen_w(u8 data)
{
if (data != m_bcu_flipscreen)
{
logerror("Setting BCU controller flipscreen port to %02x\n",data);
m_bcu_flipscreen = data & 0x01; /* 0x0001 = flip, 0x0000 = no flip */
logerror("Setting BCU controller flipscreen port to %02x\n", data);
m_bcu_flipscreen = BIT(data, 0); /* 0x0001 = flip, 0x0000 = no flip */
machine().tilemap().set_flip_all((data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0));
set_scrolls();
@ -314,8 +312,8 @@ void toaplan1_state::bcu_flipscreen_w(u8 data)
void toaplan1_state::fcu_flipscreen_w(u8 data)
{
logerror("Setting FCU controller flipscreen port to %02x\n",data);
m_fcu_flipscreen = data & 0x80; /* 0x80 = flip, 0x00 = no flip */
logerror("Setting FCU controller flipscreen port to %02x\n", data);
m_fcu_flipscreen = BIT(data, 7); /* 0x80 = flip, 0x00 = no flip */
}
u16 toaplan1_state::spriteram_offs_r() // this aint really needed ?
@ -333,25 +331,25 @@ void toaplan1_state::bgpalette_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgpaletteram[offset]);
data = m_bgpaletteram[offset];
m_palette->set_pen_color(offset, pal5bit(data>>0), pal5bit(data>>5), pal5bit(data>>10));
m_palette->set_pen_color(offset, pal5bit(data >> 0), pal5bit(data >> 5), pal5bit(data >> 10));
}
void toaplan1_state::fgpalette_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgpaletteram[offset]);
data = m_fgpaletteram[offset];
m_palette->set_pen_color(offset + 64*16, pal5bit(data>>0), pal5bit(data>>5), pal5bit(data>>10));
m_palette->set_pen_color(offset + 64 * 16, pal5bit(data >> 0), pal5bit(data >> 5), pal5bit(data >> 10));
}
u16 toaplan1_state::spriteram_r()
{
return m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2)-1)];
return m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2) - 1)];
}
void toaplan1_state::spriteram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2)-1)]);
COMBINE_DATA(&m_spriteram[m_spriteram_offs & ((TOAPLAN1_SPRITERAM_SIZE / 2) - 1)]);
#ifdef MAME_DEBUG
if (m_spriteram_offs >= (TOAPLAN1_SPRITERAM_SIZE / 2))
@ -366,12 +364,12 @@ void toaplan1_state::spriteram_w(offs_t offset, u16 data, u16 mem_mask)
u16 toaplan1_state::spritesizeram_r()
{
return m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2)-1)];
return m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2) - 1)];
}
void toaplan1_state::spritesizeram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2)-1)]);
COMBINE_DATA(&m_spritesizeram[m_spriteram_offs & ((TOAPLAN1_SPRITESIZERAM_SIZE / 2) - 1)]);
#ifdef MAME_DEBUG
if (m_spriteram_offs >= (TOAPLAN1_SPRITESIZERAM_SIZE / 2))
@ -388,7 +386,7 @@ void toaplan1_state::spritesizeram_w(offs_t offset, u16 data, u16 mem_mask)
void toaplan1_state::bcu_control_w(offs_t offset, u16 data)
{
logerror("BCU tile controller register:%02x now = %04x\n",offset,data);
logerror("BCU tile controller register:%02x now = %04x\n", offset, data);
}
u16 toaplan1_state::tileram_offs_r()
@ -399,7 +397,7 @@ u16 toaplan1_state::tileram_offs_r()
void toaplan1_state::tileram_offs_w(offs_t offset, u16 data, u16 mem_mask)
{
if (data >= 0x4000)
logerror("Hmmm, unknown video layer being selected (%08x)\n",data);
logerror("Hmmm, unknown video layer being selected (%08x)\n", data);
COMBINE_DATA(&m_pf_voffs);
}
@ -408,7 +406,6 @@ u16 toaplan1_state::tileram_r(offs_t offset)
{
const int layer = m_pf_voffs >> 12;
const int offs = m_pf_voffs & 0xfff;
offs_t vram_offset;
u16 video_data = 0;
switch (layer) /* Locate Layer (PlayField) */
@ -417,12 +414,15 @@ u16 toaplan1_state::tileram_r(offs_t offset)
case 0x1:
case 0x2:
case 0x3:
vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2)-1);
video_data = m_tilevram[layer][vram_offset];
break;
{
offs_t vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2) - 1);
video_data = m_tilevram[layer][vram_offset];
break;
}
default:
if (!machine().side_effects_disabled())
logerror("Hmmm, reading %04x from unknown playfield layer address %06x Offset:%01x !!!\n", video_data, m_pf_voffs, offset);
break;
break;
}
return video_data;
@ -444,7 +444,6 @@ void toaplan1_state::tileram_w(offs_t offset, u16 data, u16 mem_mask)
{
const int layer = m_pf_voffs >> 12;
const int offs = m_pf_voffs & 0xfff;
offs_t vram_offset;
switch (layer) /* Locate Layer (PlayField) */
{
@ -452,13 +451,15 @@ void toaplan1_state::tileram_w(offs_t offset, u16 data, u16 mem_mask)
case 0x1:
case 0x2:
case 0x3:
vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2)-1);
COMBINE_DATA(&m_tilevram[layer][vram_offset]);
m_tilemap[layer]->mark_tile_dirty(vram_offset / 2);
break;
{
offs_t vram_offset = ((offs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE / 2) - 1);
COMBINE_DATA(&m_tilevram[layer][vram_offset]);
m_tilemap[layer]->mark_tile_dirty(vram_offset / 2);
break;
}
default:
logerror("Hmmm, writing %04x to unknown playfield layer address %06x Offset:%01x\n", data, m_pf_voffs, offset);
break;
logerror("Hmmm, writing %04x to unknown playfield layer address %06x Offset:%01x\n", data, m_pf_voffs, offset);
break;
}
}
@ -479,8 +480,10 @@ u16 toaplan1_state::scroll_regs_r(offs_t offset)
case 03:
case 05:
case 07: scroll = m_scrolly[layer]; break;
default: logerror("Hmmm, reading unknown video scroll register (%02x) !!!\n",offset);
break;
default:
if (!machine().side_effects_disabled())
logerror("Hmmm, reading unknown video scroll register (%02x) !!!\n",offset);
break;
}
return scroll;
}
@ -495,18 +498,18 @@ void toaplan1_state::scroll_regs_w(offs_t offset, u16 data, u16 mem_mask)
case 02: /* 1D5h */
case 04: /* 1D7h */
case 06: /* 1D9h */
COMBINE_DATA(&m_scrollx[layer]);
m_tilemap[layer]->set_scrollx(0, (m_scrollx[layer] >> 7) - m_tiles_offsetx);
break;
COMBINE_DATA(&m_scrollx[layer]);
m_tilemap[layer]->set_scrollx(0, (m_scrollx[layer] >> 7) - m_tiles_offsetx);
break;
case 01: /* 1EBh */
case 03: /* 1EBh */
case 05: /* 1EBh */
case 07: /* 1EBh */
COMBINE_DATA(&m_scrolly[layer]);
m_tilemap[layer]->set_scrolly(0, (m_scrolly[layer] >> 7) - m_tiles_offsety);
break;
COMBINE_DATA(&m_scrolly[layer]);
m_tilemap[layer]->set_scrolly(0, (m_scrolly[layer] >> 7) - m_tiles_offsety);
break;
default: logerror("Hmmm, writing %04x to unknown video scroll register (%02x) !!!\n",data ,offset);
break;
break;
}
}
@ -519,28 +522,26 @@ void toaplan1_state::log_vram()
if (machine().input().code_pressed(KEYCODE_M))
{
u16 *spriteram = m_spriteram;
u16 *buffered_spriteram = m_buffered_spriteram.get();
offs_t sprite_voffs;
u16 const *const spriteram = m_spriteram;
u16 const *const buffered_spriteram = m_buffered_spriteram.get();
while (machine().input().code_pressed(KEYCODE_M)) ;
if (m_spritesizeram) /* FCU controller */
{
int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos;
u16 *size = (u16 *)(m_spritesizeram.get());
u16 *bsize = (u16 *)(m_buffered_spritesizeram.get());
u16 const *const size = (u16 *)(m_spritesizeram.get());
u16 const *const bsize = (u16 *)(m_buffered_spritesizeram.get());
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
for (sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
for (offs_t sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
{
bschar = buffered_spriteram[sprite_voffs];
bsattr = buffered_spriteram[sprite_voffs + 1];
bsxpos = buffered_spriteram[sprite_voffs + 2];
bsypos = buffered_spriteram[sprite_voffs + 3];
schar = spriteram[sprite_voffs];
sattr = spriteram[sprite_voffs + 1];
sxpos = spriteram[sprite_voffs + 2];
sypos = spriteram[sprite_voffs + 3];
const int bschar = buffered_spriteram[sprite_voffs];
const int bsattr = buffered_spriteram[sprite_voffs + 1];
const int bsxpos = buffered_spriteram[sprite_voffs + 2];
const int bsypos = buffered_spriteram[sprite_voffs + 3];
const int schar = spriteram[sprite_voffs];
const int sattr = spriteram[sprite_voffs + 1];
const int sxpos = spriteram[sprite_voffs + 2];
const int sypos = spriteram[sprite_voffs + 3];
logerror("$(%04x) Tile-Attr-Xpos-Ypos Now:%04x %04x %04x.%01x %04x.%01x nxt:%04x %04x %04x.%01x %04x.%01x\n", sprite_voffs,
schar, sattr, sxpos, size[( sattr >> 6) & 0x3f] & 0xf, sypos,( size[( sattr >> 6) & 0x3f] >> 4) & 0xf,
bschar,bsattr,bsxpos,bsize[(bsattr >> 6) & 0x3f] & 0xf,bsypos,(bsize[(bsattr >> 6) & 0x3f] >> 4) & 0xf);
@ -548,20 +549,19 @@ void toaplan1_state::log_vram()
}
else /* SCU controller */
{
int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos;
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
for (sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
for (offs_t sprite_voffs = 0; sprite_voffs < m_spriteram.bytes() / 2; sprite_voffs += 4)
{
bschar = buffered_spriteram[sprite_voffs];
bsattr = buffered_spriteram[sprite_voffs + 1];
bsypos = buffered_spriteram[sprite_voffs + 2];
bsxpos = buffered_spriteram[sprite_voffs + 3];
schar = spriteram[sprite_voffs];
sattr = spriteram[sprite_voffs + 1];
sypos = spriteram[sprite_voffs + 2];
sxpos = spriteram[sprite_voffs + 3];
const int bschar = buffered_spriteram[sprite_voffs];
const int bsattr = buffered_spriteram[sprite_voffs + 1];
const int bsypos = buffered_spriteram[sprite_voffs + 2];
const int bsxpos = buffered_spriteram[sprite_voffs + 3];
const int schar = spriteram[sprite_voffs];
const int sattr = spriteram[sprite_voffs + 1];
const int sypos = spriteram[sprite_voffs + 2];
const int sxpos = spriteram[sprite_voffs + 3];
logerror("$(%04x) Tile-Attr-Xpos-Ypos Now:%04x %04x %04x %04x nxt:%04x %04x %04x %04x\n", sprite_voffs,
schar, sattr, sxpos, sypos,
bschar,bsattr,bsxpos, bsypos);
@ -571,16 +571,15 @@ void toaplan1_state::log_vram()
if (machine().input().code_pressed(KEYCODE_SLASH))
{
u16 *size = (u16 *)(m_spritesizeram.get());
u16 *bsize = (u16 *)(m_buffered_spritesizeram.get());
offs_t offs;
while (machine().input().code_pressed(KEYCODE_SLASH)) ;
if (m_spritesizeram) /* FCU controller */
{
u16 const *const size = (u16 *)(m_spritesizeram.get());
u16 const *const bsize = (u16 *)(m_buffered_spritesizeram.get());
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
for (offs = 0; offs < (TOAPLAN1_SPRITESIZERAM_SIZE / 2); offs += 4)
for (offs_t offs = 0; offs < (TOAPLAN1_SPRITESIZERAM_SIZE / 2); offs += 4)
{
logerror("SizeOffs:%04x now:%04x %04x %04x %04x next: %04x %04x %04x %04x\n", offs,
bsize[offs + 0], bsize[offs + 1],
@ -593,13 +592,12 @@ void toaplan1_state::log_vram()
if (machine().input().code_pressed(KEYCODE_N))
{
offs_t tile_voffs;
int tchar[4], tattr[4];
int tchar[4]{}, tattr[4]{};
while (machine().input().code_pressed(KEYCODE_N)) ; /* BCU controller */
logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n");
logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n",
m_scrollx[0], m_scrolly[0], m_scrollx[1], m_scrolly[1], m_scrollx[2], m_scrolly[2], m_scrollx[3], m_scrolly[3]);
for (tile_voffs = 0; tile_voffs < (TOAPLAN1_TILEVRAM_SIZE / 2); tile_voffs += 2)
for (offs_t tile_voffs = 0; tile_voffs < (TOAPLAN1_TILEVRAM_SIZE / 2); tile_voffs += 2)
{
tchar[0] = m_tilevram[0][tile_voffs + 1];
tattr[0] = m_tilevram[0][tile_voffs];
@ -624,8 +622,7 @@ void toaplan1_state::log_vram()
if (machine().input().code_pressed(KEYCODE_E))
{
while (machine().input().code_pressed(KEYCODE_E)) ;
m_displog += 1;
m_displog &= 1;
m_displog = !m_displog;
}
if (m_displog)
{
@ -636,29 +633,25 @@ void toaplan1_state::log_vram()
if (machine().input().code_pressed(KEYCODE_L)) /* Turn Playfield 4 on/off */
{
while (machine().input().code_pressed(KEYCODE_L)) ;
m_display_pf[3] += 1;
m_display_pf[3] &= 1;
m_display_pf[3] = !m_display_pf[3];
m_tilemap[3]->enable(m_display_pf[3]);
}
if (machine().input().code_pressed(KEYCODE_K)) /* Turn Playfield 3 on/off */
{
while (machine().input().code_pressed(KEYCODE_K)) ;
m_display_pf[2] += 1;
m_display_pf[2] &= 1;
m_display_pf[2] = !m_display_pf[2];
m_tilemap[2]->enable(m_display_pf[2]);
}
if (machine().input().code_pressed(KEYCODE_J)) /* Turn Playfield 2 on/off */
{
while (machine().input().code_pressed(KEYCODE_J)) ;
m_display_pf[1] += 1;
m_display_pf[1] &= 1;
m_display_pf[1] = !m_display_pf[1];
m_tilemap[1]->enable(m_display_pf[1]);
}
if (machine().input().code_pressed(KEYCODE_H)) /* Turn Playfield 1 on/off */
{
while (machine().input().code_pressed(KEYCODE_H)) ;
m_display_pf[0] += 1;
m_display_pf[0] &= 1;
m_display_pf[0] = !m_display_pf[0];
m_tilemap[0]->enable(m_display_pf[0]);
}
#endif
@ -684,21 +677,19 @@ void toaplan1_rallybik_state::pri_cb(u8 priority, u32 &pri_mask)
void toaplan1_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
u16 *source = (u16 *)m_buffered_spriteram.get();
u16 *size = (u16 *)m_buffered_spritesizeram.get();
int fcu_flipscreen = m_fcu_flipscreen;
u16 const *const source = (u16 *)m_buffered_spriteram.get();
u16 const *const size = (u16 *)m_buffered_spritesizeram.get();
const bool fcu_flipscreen = m_fcu_flipscreen;
for (int offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4)
{
if (!(source[offs] & 0x8000))
if (BIT(~source[offs], 15))
{
int sx, sy;
const u16 attrib = source[offs + 1];
const u8 priority = (attrib & 0xf000) >> 12;
u32 sprite = source[offs] & 0x7fff;
u32 color = attrib & 0x3f;
const u32 color = attrib & 0x3f;
/****** find sprite dimension ******/
const u32 sizeram_ptr = (attrib >> 6) & 0x3f;
@ -724,11 +715,13 @@ void toaplan1_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, c
for (int dim_y = 0; dim_y < sprite_sizey; dim_y += 8)
{
int sy;
if (fcu_flipscreen) sy = sy_base - dim_y;
else sy = sy_base + dim_y;
for (int dim_x = 0; dim_x < sprite_sizex; dim_x += 8)
{
int sx;
if (fcu_flipscreen) sx = sx_base - dim_x;
else sx = sx_base + dim_x;
@ -765,7 +758,7 @@ u32 toaplan1_rallybik_state::screen_update(screen_device &screen, bitmap_rgb32 &
{
// get priority mask
// value: 0x1 (tilemap priority 0x0~0x4), 0x2 (tilemap priority 0x5~0x8), 0x4 (tilemap priority 0x9~0xc), 0x8 (tilemap priority 0xd~)
int primask = 1 << (((priority - 1) >> 2));
const u32 primask = 1 << (((priority - 1) >> 2));
m_tilemap[3]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
m_tilemap[2]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);
m_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), primask);

View File

@ -50,8 +50,10 @@
******************************************************************************/
#include "emu.h"
#include "cpu/m6502/m6502.h"
#include "sound/ay8910.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -71,13 +73,16 @@ public:
void mole(machine_config &config);
protected:
virtual void video_start() override ATTR_COLD;
private:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
int m_tile_bank = 0;
uint8_t m_tile_bank = 0;
/* memory */
uint16_t m_tileram[0x400];
@ -88,9 +93,6 @@ private:
void mole_flipscreen_w(uint8_t data);
uint8_t mole_protection_r(offs_t offset);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
virtual void video_start() override ATTR_COLD;
uint32_t screen_update_mole(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void mole_map(address_map &map) ATTR_COLD;
};
@ -115,6 +117,7 @@ void mole_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mole_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 40, 25);
save_item(NAME(m_tileram));
save_item(NAME(m_tile_bank));
}
void mole_state::mole_tileram_w(offs_t offset, uint8_t data)
@ -145,7 +148,6 @@ uint32_t mole_state::screen_update_mole(screen_device &screen, bitmap_ind16 &bit
}
/*************************************
*
* Memory handlers
@ -316,20 +318,10 @@ GFXDECODE_END
*
*************************************/
void mole_state::machine_start()
{
save_item(NAME(m_tile_bank));
}
void mole_state::machine_reset()
{
m_tile_bank = 0;
}
void mole_state::mole(machine_config &config)
{
/* basic machine hardware */
M6502(config, m_maincpu, 4000000); // ???
M6502(config, m_maincpu, 2000000); // ???
m_maincpu->set_addrmap(AS_PROGRAM, &mole_state::mole_map);
m_maincpu->set_vblank_int("screen", FUNC(mole_state::irq0_line_assert));
@ -382,4 +374,4 @@ ROM_END
*
*************************************/
GAME( 1982, mole, 0, mole, mole, mole_state, empty_init, ROT0, "Yachiyo Electronics, Ltd.", "Mole Attack", MACHINE_SUPPORTS_SAVE )
GAME( 1982, mole, 0, mole, mole, mole_state, empty_init, ROT0, "Yachiyo Electronics", "Mole Attack", MACHINE_SUPPORTS_SAVE )

View File

@ -15,14 +15,14 @@
TODO:
- atamanot: needs a trojan, in order to understand how the protection really works.
- colors (missing PROM(s) ?)
- samples (at least two of unused ROMs contains samples (unkn. format , ADPCM ?)
- samples (at least two of unused ROMs contains samples (unkn. format, ADPCM ?)
- dips (one is tested in game (difficulty related?), another 2 are tested at start)
Unknown reads/writes:
- AY i/o ports (writes)
- mem $c000, $c001 = protection device ? if tests fails, game crashes (problems with stack - skipped code with "pop af")
- i/o port $8 = data read used for $e command arg for one of AY chips (volume? - could be a sample player (based on volume changes?)
- i/o port $1a = 1 or 0, rarely accessed, related to crt writes
- i/o port $1a = 1 or 0, rarely accessed, related to crt writes
==================================================================
@ -580,7 +580,6 @@ void ssingles_state::ssingles(machine_config &config)
SPEAKER(config, "mono").front_center();
AY8910(config, "ay1", 1'500'000).add_route(ALL_OUTPUTS, "mono", 0.5); // ? MHz
AY8910(config, "ay2", 1'500'000).add_route(ALL_OUTPUTS, "mono", 0.5); // ? MHz
}

View File

@ -8,7 +8,6 @@
/* */
/*******************************************************/
/*
********************************************************
@ -323,9 +322,11 @@ TODO:
#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "sound/samples.h"
#include "sound/sn76477.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -570,7 +571,7 @@ void sstrangr_state::sstrangr(machine_config &config)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_size(32*8, 262); // vert size is a guess, taken from mw8080bw
screen.set_size(32*8, 262); // vert size is a guess, taken from mw8080bw
screen.set_visarea(0*8, 32*8-1, 4*8, 32*8-1);
screen.set_refresh_hz(60);
screen.set_screen_update(FUNC(sstrangr_state::screen_update_sstrangr));
@ -634,7 +635,7 @@ static INPUT_PORTS_START( sstrngr2 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
PORT_START("INPUTS")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 )
PORT_SERVICE( 0x08, IP_ACTIVE_HIGH ) // This is an edge connector pin for testing ROM/RAM and I/O ports
@ -690,5 +691,5 @@ ROM_END
} // anonymous namespace
GAMEL( 1978, sstrangr, 0, sstrangr, sstrangr, sstrangr_state, empty_init, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_sstrangr )
GAME( 1979, sstrangr2, sstrangr, sstrngr2, sstrngr2, sstrangr_state, empty_init, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger 2", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAMEL( 1978, sstrangr, 0, sstrangr, sstrangr, sstrangr_state, empty_init, ROT270, "Yachiyo Electric", "Space Stranger", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE, layout_sstrangr )
GAME( 1979, sstrangr2, sstrangr, sstrngr2, sstrngr2, sstrangr_state, empty_init, ROT270, "Yachiyo Electric", "Space Stranger 2", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )