mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
First pass in improving Amiga SW compatibility (#8722)
* amiga.cpp: connect missing DSKINDEX signal from FDC to CIA-B ICR bit 4 * amigafdc.cpp: workaround live_counter > 8 to reset, makes abreed to boot to gameplay * 8364_paula.cpp: fix output channel of irq delegation, and throw one when a DMA reaches the end of a stream. Fixes asparmgp/gpmaster BGMs at very least * mos6526.cpp: guard against resetting IRQs when none is chained * makes timer B polling reads to actually work in barb2paln4, fixing booting * amigafdc.cpp: start adding logmacros * amigafdc.cpp: fix DMAON readback, giving logica2 diag BIOS the chance to print extensive floppy test info * 8364_paula.cpp: avoid reading audio DMA buffers outside the allocated ranges, fixes sound buzzing/aliasing bug * alg.cpp: standardize title metadatas * amigaocs_flop.xml: QA, consistent XML titles, consistent ids of virus plagued disks (additional field plus mark these as baddump) * amigaocs_flop.xml: mark the failures on mount and bulk test with ATK * 8364_paula.cpp: fix DMA reload behaviour (fixes BGMs in Ocean games), add live logging, misc * amiga.cpp: ignore bit 0 with BPLxMOD writes, fixes hpoker/hpokera GFXs * amigaocs_flop.xml: misc QA notes
This commit is contained in:
parent
4e74debb69
commit
b3e20002b7
@ -10,7 +10,7 @@ license:CC0
|
|||||||
will not function.
|
will not function.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<softwarelist name="amigaecs_flop" description="Amiga ECS disk images">
|
<softwarelist name="amigaecs_flop" description="Commodore Amiga ECS disk images">
|
||||||
|
|
||||||
<software name="cmang2up" supported="no">
|
<software name="cmang2up" supported="no">
|
||||||
<!-- SPS (CAPS) release 1997 -->
|
<!-- SPS (CAPS) release 1997 -->
|
||||||
@ -645,13 +645,15 @@ license:CC0
|
|||||||
</part>
|
</part>
|
||||||
</software>
|
</software>
|
||||||
|
|
||||||
<software name="snapper" supported="no">
|
<!-- boot OK -->
|
||||||
|
<software name="snapper" supported="yes">
|
||||||
<!-- SPS (CAPS) release 2534 -->
|
<!-- SPS (CAPS) release 2534 -->
|
||||||
<description>Snapperazzi (Euro)</description>
|
<description>Snapperazzi (Euro)</description>
|
||||||
<!-- retail, standalone -->
|
<!-- retail, standalone -->
|
||||||
<!-- (Amiga, ECS, PAL) -->
|
<!-- (Amiga, ECS, PAL) -->
|
||||||
<year>1993</year>
|
<year>1993</year>
|
||||||
<publisher>Alternative Software</publisher>
|
<publisher>Alternative Software</publisher>
|
||||||
|
<!-- TODO: is this truly a ECS exclusive game? Reports indicates this being OCS as well, it also works on vanilla a500 -->
|
||||||
<info name="usage" value="Requires ECS" />
|
<info name="usage" value="Requires ECS" />
|
||||||
<part name="flop1" interface="floppy_3_5">
|
<part name="flop1" interface="floppy_3_5">
|
||||||
<feature name="part_id" value="Disk 1" />
|
<feature name="part_id" value="Disk 1" />
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,22 +2,36 @@
|
|||||||
// copyright-holders: Aaron Giles, Dirk Best
|
// copyright-holders: Aaron Giles, Dirk Best
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Commodore 8364 "Paula"
|
MOS Technology 8364 "Paula"
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Inherit FDC, serial and irq controller to here;
|
||||||
|
- Move Agnus "location" logic from here;
|
||||||
|
- low-pass filter;
|
||||||
|
- convert volume values to non-linear dB scale (cfr. )
|
||||||
|
- Verify ADKCON modulation;
|
||||||
|
- Verify manual mode;
|
||||||
|
- When a DMA stop occurs, is the correlated channel playback stopped
|
||||||
|
at the end of the current cycle or as soon as possible like current
|
||||||
|
implementation?
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "8364_paula.h"
|
#include "8364_paula.h"
|
||||||
|
|
||||||
|
#define LIVE_AUDIO_VIEW 0
|
||||||
|
|
||||||
//#define VERBOSE 1
|
//#define VERBOSE 1
|
||||||
#include "logmacro.h"
|
#include "logmacro.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// DEVICE DEFINITIONS
|
// DEVICE DEFINITIONS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
DEFINE_DEVICE_TYPE(PAULA_8364, paula_8364_device, "paula_8364", "8364 Paula")
|
DEFINE_DEVICE_TYPE(PAULA_8364, paula_8364_device, "paula_8364", "MOS 8364 \"Paula\"")
|
||||||
|
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
@ -51,9 +65,6 @@ void paula_8364_device::device_start()
|
|||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
m_channel[i].index = i;
|
m_channel[i].index = i;
|
||||||
m_channel[i].curticks = 0;
|
|
||||||
m_channel[i].manualmode = false;
|
|
||||||
m_channel[i].curlocation = 0;
|
|
||||||
m_channel[i].irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(paula_8364_device::signal_irq), this));
|
m_channel[i].irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(paula_8364_device::signal_irq), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,6 +72,24 @@ void paula_8364_device::device_start()
|
|||||||
m_stream = stream_alloc(0, 4, clock() / CLOCK_DIVIDER);
|
m_stream = stream_alloc(0, 4, clock() / CLOCK_DIVIDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void paula_8364_device::device_reset()
|
||||||
|
{
|
||||||
|
m_dmacon = 0;
|
||||||
|
m_adkcon = 0;
|
||||||
|
for (auto &chan : m_channel)
|
||||||
|
{
|
||||||
|
chan.loc = 0;
|
||||||
|
chan.len = 0;
|
||||||
|
chan.per = 0;
|
||||||
|
chan.vol = 0;
|
||||||
|
chan.curticks = 0;
|
||||||
|
chan.manualmode = false;
|
||||||
|
chan.curlocation = 0;
|
||||||
|
chan.curlength = 0;
|
||||||
|
chan.dma_enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// update - stream updater
|
// update - stream updater
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -99,6 +128,18 @@ void paula_8364_device::reg_w(offs_t offset, uint16_t data)
|
|||||||
case REG_DMACON:
|
case REG_DMACON:
|
||||||
m_stream->update();
|
m_stream->update();
|
||||||
m_dmacon = (data & 0x8000) ? (m_dmacon | (data & 0x021f)) : (m_dmacon & ~(data & 0x021f)); // only bits 15, 9 and 5 to 0
|
m_dmacon = (data & 0x8000) ? (m_dmacon | (data & 0x021f)) : (m_dmacon & ~(data & 0x021f)); // only bits 15, 9 and 5 to 0
|
||||||
|
// update the DMA latches on each channel and reload if fresh
|
||||||
|
// This holds true particularly for Ocean games (bchvolly, lostpatr, pang) and waylildr:
|
||||||
|
// they sets a DMA length for a channel then enable DMA then resets that length to 1
|
||||||
|
// after a short delay loop.
|
||||||
|
for (int channum = 0; channum < 4; channum++)
|
||||||
|
{
|
||||||
|
audio_channel *chan = &m_channel[channum];
|
||||||
|
if (!chan->dma_enabled && ((m_dmacon >> channum) & 1))
|
||||||
|
dma_reload(chan, true);
|
||||||
|
|
||||||
|
chan->dma_enabled = BIT(m_dmacon, channum);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REG_ADKCON:
|
case REG_ADKCON:
|
||||||
@ -106,7 +147,7 @@ void paula_8364_device::reg_w(offs_t offset, uint16_t data)
|
|||||||
m_adkcon = (data & 0x8000) ? (m_adkcon | (data & 0x7fff)) : (m_adkcon & ~(data & 0x7fff));
|
m_adkcon = (data & 0x8000) ? (m_adkcon | (data & 0x7fff)) : (m_adkcon & ~(data & 0x7fff));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// to be moved
|
// FIXME: location belongs to Agnus
|
||||||
case REG_AUD0LCL: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
|
case REG_AUD0LCL: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
|
||||||
case REG_AUD0LCH: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
|
case REG_AUD0LCH: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
|
||||||
case REG_AUD1LCL: m_channel[CHAN_1].loc = (m_channel[CHAN_1].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
|
case REG_AUD1LCL: m_channel[CHAN_1].loc = (m_channel[CHAN_1].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
|
||||||
@ -119,19 +160,19 @@ void paula_8364_device::reg_w(offs_t offset, uint16_t data)
|
|||||||
// audio data
|
// audio data
|
||||||
case REG_AUD0LEN: m_channel[CHAN_0].len = data; break;
|
case REG_AUD0LEN: m_channel[CHAN_0].len = data; break;
|
||||||
case REG_AUD0PER: m_channel[CHAN_0].per = data; break;
|
case REG_AUD0PER: m_channel[CHAN_0].per = data; break;
|
||||||
case REG_AUD0VOL: m_channel[CHAN_0].vol = data; break;
|
case REG_AUD0VOL: m_channel[CHAN_0].vol = data & 0x7f; break;
|
||||||
case REG_AUD0DAT: m_channel[CHAN_0].dat = data; m_channel[CHAN_0].manualmode = true; break;
|
case REG_AUD0DAT: m_channel[CHAN_0].dat = data; m_channel[CHAN_0].manualmode = true; break;
|
||||||
case REG_AUD1LEN: m_channel[CHAN_1].len = data; break;
|
case REG_AUD1LEN: m_channel[CHAN_1].len = data; break;
|
||||||
case REG_AUD1PER: m_channel[CHAN_1].per = data; break;
|
case REG_AUD1PER: m_channel[CHAN_1].per = data; break;
|
||||||
case REG_AUD1VOL: m_channel[CHAN_1].vol = data; break;
|
case REG_AUD1VOL: m_channel[CHAN_1].vol = data & 0x7f; break;
|
||||||
case REG_AUD1DAT: m_channel[CHAN_1].dat = data; m_channel[CHAN_1].manualmode = true; break;
|
case REG_AUD1DAT: m_channel[CHAN_1].dat = data; m_channel[CHAN_1].manualmode = true; break;
|
||||||
case REG_AUD2LEN: m_channel[CHAN_2].len = data; break;
|
case REG_AUD2LEN: m_channel[CHAN_2].len = data; break;
|
||||||
case REG_AUD2PER: m_channel[CHAN_2].per = data; break;
|
case REG_AUD2PER: m_channel[CHAN_2].per = data; break;
|
||||||
case REG_AUD2VOL: m_channel[CHAN_2].vol = data; break;
|
case REG_AUD2VOL: m_channel[CHAN_2].vol = data & 0x7f; break;
|
||||||
case REG_AUD2DAT: m_channel[CHAN_2].dat = data; m_channel[CHAN_2].manualmode = true; break;
|
case REG_AUD2DAT: m_channel[CHAN_2].dat = data; m_channel[CHAN_2].manualmode = true; break;
|
||||||
case REG_AUD3LEN: m_channel[CHAN_3].len = data; break;
|
case REG_AUD3LEN: m_channel[CHAN_3].len = data; break;
|
||||||
case REG_AUD3PER: m_channel[CHAN_3].per = data; break;
|
case REG_AUD3PER: m_channel[CHAN_3].per = data; break;
|
||||||
case REG_AUD3VOL: m_channel[CHAN_3].vol = data; break;
|
case REG_AUD3VOL: m_channel[CHAN_3].vol = data & 0x7f; break;
|
||||||
case REG_AUD3DAT: m_channel[CHAN_3].dat = data; m_channel[CHAN_3].manualmode = true; break;
|
case REG_AUD3DAT: m_channel[CHAN_3].dat = data; m_channel[CHAN_3].manualmode = true; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,20 +183,51 @@ void paula_8364_device::reg_w(offs_t offset, uint16_t data)
|
|||||||
|
|
||||||
TIMER_CALLBACK_MEMBER( paula_8364_device::signal_irq )
|
TIMER_CALLBACK_MEMBER( paula_8364_device::signal_irq )
|
||||||
{
|
{
|
||||||
m_int_w(param);
|
m_int_w(param, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// dma_reload
|
// dma_reload
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
void paula_8364_device::dma_reload(audio_channel *chan)
|
void paula_8364_device::dma_reload(audio_channel *chan, bool startup)
|
||||||
{
|
{
|
||||||
chan->curlocation = chan->loc;
|
chan->curlocation = chan->loc;
|
||||||
|
// TODO: how to treat length == 0?
|
||||||
chan->curlength = chan->len;
|
chan->curlength = chan->len;
|
||||||
|
// TODO: on startup=false irq should be delayed two cycles
|
||||||
|
if (startup)
|
||||||
chan->irq_timer->adjust(attotime::from_hz(15750), chan->index); // clock() / 227
|
chan->irq_timer->adjust(attotime::from_hz(15750), chan->index); // clock() / 227
|
||||||
|
else
|
||||||
|
signal_irq(nullptr, chan->index);
|
||||||
|
|
||||||
LOG("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength);
|
LOG("dma_reload(%d): offs=%06X len=%04X\n", chan->index, chan->curlocation, chan->curlength);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string paula_8364_device::print_audio_state()
|
||||||
|
{
|
||||||
|
std::ostringstream outbuffer;
|
||||||
|
|
||||||
|
util::stream_format(outbuffer, "DMACON: %04x (%d) ADKCON %04x\n", m_dmacon, BIT(m_dmacon, 9), m_adkcon);
|
||||||
|
for (auto &chan : m_channel)
|
||||||
|
{
|
||||||
|
util::stream_format(outbuffer, "%d (%d) (%d%d) REGS: %06x %04x %03x %02x %d LIVE: %06x %04x %d\n"
|
||||||
|
, chan.index
|
||||||
|
, BIT(m_dmacon, chan.index)
|
||||||
|
, BIT(m_adkcon, chan.index+4)
|
||||||
|
, BIT(m_adkcon, chan.index)
|
||||||
|
, chan.loc
|
||||||
|
, chan.len
|
||||||
|
, chan.per
|
||||||
|
, chan.vol
|
||||||
|
, chan.manualmode
|
||||||
|
, chan.curlocation
|
||||||
|
, chan.curlength
|
||||||
|
, chan.dma_enabled
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return outbuffer.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -182,15 +254,8 @@ void paula_8364_device::sound_stream_update(sound_stream &stream, std::vector<re
|
|||||||
|
|
||||||
int samples = outputs[0].samples() * CLOCK_DIVIDER;
|
int samples = outputs[0].samples() * CLOCK_DIVIDER;
|
||||||
|
|
||||||
// update the DMA states on each channel and reload if fresh
|
if (LIVE_AUDIO_VIEW)
|
||||||
for (channum = 0; channum < 4; channum++)
|
popmessage(print_audio_state());
|
||||||
{
|
|
||||||
audio_channel *chan = &m_channel[channum];
|
|
||||||
if (!chan->dma_enabled && ((m_dmacon >> channum) & 1))
|
|
||||||
dma_reload(chan);
|
|
||||||
|
|
||||||
chan->dma_enabled = BIT(m_dmacon, channum);
|
|
||||||
}
|
|
||||||
|
|
||||||
// loop until done
|
// loop until done
|
||||||
while (samples > 0)
|
while (samples > 0)
|
||||||
@ -219,6 +284,7 @@ void paula_8364_device::sound_stream_update(sound_stream &stream, std::vector<re
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// normalize the volume value
|
// normalize the volume value
|
||||||
|
// FIXME: definitely not linear
|
||||||
volume = (volume & 0x40) ? 64 : (volume & 0x3f);
|
volume = (volume & 0x40) ? 64 : (volume & 0x3f);
|
||||||
volume *= 4;
|
volume *= 4;
|
||||||
|
|
||||||
@ -268,9 +334,18 @@ void paula_8364_device::sound_stream_update(sound_stream &stream, std::vector<re
|
|||||||
if (chan->curlength != 0)
|
if (chan->curlength != 0)
|
||||||
chan->curlength--;
|
chan->curlength--;
|
||||||
|
|
||||||
// if we run out of data, reload the dma
|
// if we run out of data, reload the dma and signal an IRQ,
|
||||||
|
// gpmaster/asparmgp definitely expects this
|
||||||
|
// (uses channel 3 as a sequencer, changing the start address on the fly)
|
||||||
if (chan->curlength == 0)
|
if (chan->curlength == 0)
|
||||||
dma_reload(chan);
|
{
|
||||||
|
dma_reload(chan, false);
|
||||||
|
// reload the data pointer, otherwise aliasing / buzzing outside the given buffer will be heard
|
||||||
|
// For example: Xenon 2 sets up location=0x63298 length=0x20
|
||||||
|
// for silencing channels on-the-fly without relying on irqs.
|
||||||
|
// Without this the location will read at 0x632d8 (data=0x7a7d), causing annoying buzzing.
|
||||||
|
chan->dat = m_mem_r(chan->curlocation);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// latch the next byte of the sample
|
// latch the next byte of the sample
|
||||||
|
@ -66,6 +66,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start() override;
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
|
||||||
// sound stream update overrides
|
// sound stream update overrides
|
||||||
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
|
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
|
||||||
@ -133,11 +134,11 @@ private:
|
|||||||
uint16_t dat;
|
uint16_t dat;
|
||||||
};
|
};
|
||||||
|
|
||||||
void dma_reload(audio_channel *chan);
|
void dma_reload(audio_channel *chan, bool startup);
|
||||||
|
|
||||||
// callbacks
|
// callbacks
|
||||||
devcb_read16 m_mem_r;
|
devcb_read16 m_mem_r;
|
||||||
devcb_write_line m_int_w;
|
devcb_write8 m_int_w;
|
||||||
|
|
||||||
// internal state
|
// internal state
|
||||||
uint16_t m_dmacon;
|
uint16_t m_dmacon;
|
||||||
@ -147,6 +148,8 @@ private:
|
|||||||
sound_stream *m_stream;
|
sound_stream *m_stream;
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER( signal_irq );
|
TIMER_CALLBACK_MEMBER( signal_irq );
|
||||||
|
|
||||||
|
std::string print_audio_state();
|
||||||
};
|
};
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
|
@ -12,6 +12,18 @@
|
|||||||
#include "formats/ipf_dsk.h"
|
#include "formats/ipf_dsk.h"
|
||||||
#include "amigafdc.h"
|
#include "amigafdc.h"
|
||||||
|
|
||||||
|
#define LOG_WARN (1U << 1) // Show warnings
|
||||||
|
#define LOG_DMA (1U << 2) // Show DMA setups
|
||||||
|
#define LOG_SYNC (1U << 3) // Show sync block setups
|
||||||
|
|
||||||
|
#define VERBOSE (LOG_WARN | LOG_DMA | LOG_SYNC)
|
||||||
|
|
||||||
|
#include "logmacro.h"
|
||||||
|
|
||||||
|
#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
|
||||||
|
#define LOGDMA(...) LOGMASKED(LOG_DMA, __VA_ARGS__)
|
||||||
|
#define LOGSYNC(...) LOGMASKED(LOG_SYNC, __VA_ARGS__)
|
||||||
|
|
||||||
DEFINE_DEVICE_TYPE(AMIGA_FDC, amiga_fdc_device, "amiga_fdc", "Amiga FDC")
|
DEFINE_DEVICE_TYPE(AMIGA_FDC, amiga_fdc_device, "amiga_fdc", "Amiga FDC")
|
||||||
|
|
||||||
void amiga_fdc_device::floppy_formats(format_registration &fr)
|
void amiga_fdc_device::floppy_formats(format_registration &fr)
|
||||||
@ -210,7 +222,12 @@ void amiga_fdc_device::live_run(const attotime &limit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cur_live.bit_counter > 8)
|
if(cur_live.bit_counter > 8)
|
||||||
fatalerror("amiga_fdc_device::live_run - cur_live.bit_counter > 8\n");
|
{
|
||||||
|
// CHECKME: abreed, ghoulsvf Ghouls'n Goblins and lastnin2 at very least throws this
|
||||||
|
// is it a side effect of something else not happening at the right time or the assumption is right?
|
||||||
|
cur_live.bit_counter = 0;
|
||||||
|
LOGWARN("%s: live_run - cur_live.bit_counter > 8\n", machine().describe_context());
|
||||||
|
}
|
||||||
|
|
||||||
if(cur_live.bit_counter == 8) {
|
if(cur_live.bit_counter == 8) {
|
||||||
live_delay(RUNNING_SYNCPOINT);
|
live_delay(RUNNING_SYNCPOINT);
|
||||||
@ -233,7 +250,10 @@ void amiga_fdc_device::live_run(const attotime &limit)
|
|||||||
return;
|
return;
|
||||||
cur_live.bit_counter++;
|
cur_live.bit_counter++;
|
||||||
if(cur_live.bit_counter > 8)
|
if(cur_live.bit_counter > 8)
|
||||||
fatalerror("amiga_fdc_device::live_run - cur_live.bit_counter > 8\n");
|
{
|
||||||
|
cur_live.bit_counter = 0;
|
||||||
|
LOGWARN("%s: live_run - cur_live.bit_counter > 8\n", machine().describe_context());
|
||||||
|
}
|
||||||
|
|
||||||
if(cur_live.bit_counter == 8) {
|
if(cur_live.bit_counter == 8) {
|
||||||
live_delay(RUNNING_SYNCPOINT);
|
live_delay(RUNNING_SYNCPOINT);
|
||||||
@ -247,6 +267,14 @@ void amiga_fdc_device::live_run(const attotime &limit)
|
|||||||
if(!(dskbyt & 0x2000)) {
|
if(!(dskbyt & 0x2000)) {
|
||||||
if(cur_live.shift_reg == dsksync) {
|
if(cur_live.shift_reg == dsksync) {
|
||||||
if(adkcon & 0x0400) {
|
if(adkcon & 0x0400) {
|
||||||
|
// FIXME: exact dsksync behaviour
|
||||||
|
// - Some games currently writes two dsksync to the buffer (marked as "[FDC] dsksync"),
|
||||||
|
// removing one will make most of them happy.
|
||||||
|
// This is reported as 0-lower cylinder good and everything else as bad in the ATK suite;
|
||||||
|
// - Some games trashes memory, mostly the ones with "[FDC] dsksync bootblock":
|
||||||
|
// they attempt to load the tracks in AmigaDOS in the same way that's done by the
|
||||||
|
// Kickstart to check if the disk is bootable.
|
||||||
|
// This is reported as 0-upper cylinder bad in the ATK suite;
|
||||||
if(dma_state == DMA_WAIT_START) {
|
if(dma_state == DMA_WAIT_START) {
|
||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
|
|
||||||
@ -257,16 +285,22 @@ void amiga_fdc_device::live_run(const attotime &limit)
|
|||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
dma_value = dma_read();
|
dma_value = dma_read();
|
||||||
|
|
||||||
} else
|
} else {
|
||||||
|
LOGSYNC("%s: DSKSYNC on %06x %d\n", this->tag(), dskpt, dma_state);
|
||||||
dma_write(dsksync);
|
dma_write(dsksync);
|
||||||
|
}
|
||||||
|
|
||||||
} else if(dma_state != DMA_IDLE) {
|
} else if(dma_state != DMA_IDLE) {
|
||||||
|
LOGSYNC("%s: DSKSYNC on %06x %d\n", this->tag(), dskpt, dma_state);
|
||||||
dma_write(dsksync);
|
dma_write(dsksync);
|
||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
|
|
||||||
} else if(cur_live.bit_counter != 8)
|
} else if(cur_live.bit_counter != 8)
|
||||||
cur_live.bit_counter = 0;
|
cur_live.bit_counter = 0;
|
||||||
}
|
}
|
||||||
|
//else
|
||||||
|
// LOGSYNC("%s: no DSKSYNC\n", this->tag());
|
||||||
|
|
||||||
dskbyt |= 0x1000;
|
dskbyt |= 0x1000;
|
||||||
m_write_dsksyn(1);
|
m_write_dsksyn(1);
|
||||||
} else
|
} else
|
||||||
@ -332,6 +366,11 @@ void amiga_fdc_device::dma_check()
|
|||||||
bool was_writing = dskbyt & 0x2000;
|
bool was_writing = dskbyt & 0x2000;
|
||||||
dskbyt &= 0x9fff;
|
dskbyt &= 0x9fff;
|
||||||
if(dma_enabled()) {
|
if(dma_enabled()) {
|
||||||
|
LOGDMA("%s: DMA start dskpt=%08x dsklen=%04x dir=%s adkcon=%04x dsksync=%04x\n",
|
||||||
|
machine().describe_context(),
|
||||||
|
dskpt, dsklen & 0x3fff, BIT(dsklen, 14) ? "RAM->disk" : "disk->RAM", adkcon, dsksync
|
||||||
|
);
|
||||||
|
|
||||||
if(dma_state == IDLE) {
|
if(dma_state == IDLE) {
|
||||||
dma_state = adkcon & 0x0400 ? DMA_WAIT_START : DMA_RUNNING_BYTE_0;
|
dma_state = adkcon & 0x0400 ? DMA_WAIT_START : DMA_RUNNING_BYTE_0;
|
||||||
if(dma_state == DMA_RUNNING_BYTE_0) {
|
if(dma_state == DMA_RUNNING_BYTE_0) {
|
||||||
@ -344,7 +383,6 @@ void amiga_fdc_device::dma_check()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dskbyt |= 0x4000;
|
|
||||||
if(dsklen & 0x4000)
|
if(dsklen & 0x4000)
|
||||||
dskbyt |= 0x2000;
|
dskbyt |= 0x2000;
|
||||||
}
|
}
|
||||||
@ -355,7 +393,6 @@ void amiga_fdc_device::dma_check()
|
|||||||
cur_live.pll.stop_writing(floppy, cur_live.tm);
|
cur_live.pll.stop_writing(floppy, cur_live.tm);
|
||||||
if(!was_writing && (dskbyt & 0x2000))
|
if(!was_writing && (dskbyt & 0x2000))
|
||||||
cur_live.pll.start_writing(cur_live.tm);
|
cur_live.pll.start_writing(cur_live.tm);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void amiga_fdc_device::adkcon_set(uint16_t data)
|
void amiga_fdc_device::adkcon_set(uint16_t data)
|
||||||
@ -409,6 +446,7 @@ uint16_t amiga_fdc_device::dskptl_r()
|
|||||||
void amiga_fdc_device::dsksync_w(uint16_t data)
|
void amiga_fdc_device::dsksync_w(uint16_t data)
|
||||||
{
|
{
|
||||||
live_sync();
|
live_sync();
|
||||||
|
LOGSYNC("%s: DSKSYNC %04x\n", machine().describe_context(), data);
|
||||||
dsksync = data;
|
dsksync = data;
|
||||||
live_run();
|
live_run();
|
||||||
}
|
}
|
||||||
@ -416,6 +454,7 @@ void amiga_fdc_device::dsksync_w(uint16_t data)
|
|||||||
void amiga_fdc_device::dmacon_set(uint16_t data)
|
void amiga_fdc_device::dmacon_set(uint16_t data)
|
||||||
{
|
{
|
||||||
live_sync();
|
live_sync();
|
||||||
|
LOGDMA("%s: DMACON set DSKEN %d DMAEN %d (%04x)\n", machine().describe_context(), BIT(data, 4), BIT(data, 9), data);
|
||||||
dmacon = data;
|
dmacon = data;
|
||||||
dma_check();
|
dma_check();
|
||||||
live_run();
|
live_run();
|
||||||
@ -423,7 +462,14 @@ void amiga_fdc_device::dmacon_set(uint16_t data)
|
|||||||
|
|
||||||
uint16_t amiga_fdc_device::dskbytr_r()
|
uint16_t amiga_fdc_device::dskbytr_r()
|
||||||
{
|
{
|
||||||
uint16_t res = dskbyt;
|
uint16_t res = (dskbyt & ~0x4000);
|
||||||
|
// check if DMA is on
|
||||||
|
// logica2 diagnostic BIOS floppy test requires this
|
||||||
|
bool dmaon = (dma_state != DMA_IDLE) && ((dmacon & 0x0210) == 0x0210);
|
||||||
|
res |= dmaon << 14;
|
||||||
|
|
||||||
|
// reset DSKBYT ready on read
|
||||||
|
if (!machine().side_effects_disabled())
|
||||||
dskbyt &= 0x7fff;
|
dskbyt &= 0x7fff;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -454,6 +500,7 @@ void amiga_fdc_device::ciaaprb_w(uint8_t data)
|
|||||||
|
|
||||||
live_sync();
|
live_sync();
|
||||||
|
|
||||||
|
// FIXME: several sources claims that multiple drive selects is really possible
|
||||||
if(!(data & 0x08))
|
if(!(data & 0x08))
|
||||||
floppy = floppy_devices[0];
|
floppy = floppy_devices[0];
|
||||||
else if(!(data & 0x10))
|
else if(!(data & 0x10))
|
||||||
@ -494,7 +541,8 @@ uint8_t amiga_fdc_device::ciaapra_r()
|
|||||||
{
|
{
|
||||||
uint8_t ret = 0x3c;
|
uint8_t ret = 0x3c;
|
||||||
if(floppy) {
|
if(floppy) {
|
||||||
//if(!floppy->ready_r()) fixit: seems to not work well with multiple disk drives
|
// FIXME: seems to not work well with multiple disk drives
|
||||||
|
//if(!floppy->ready_r())
|
||||||
ret &= ~0x20;
|
ret &= ~0x20;
|
||||||
if(!floppy->trk00_r())
|
if(!floppy->trk00_r())
|
||||||
ret &= ~0x10;
|
ret &= ~0x10;
|
||||||
|
@ -902,7 +902,10 @@ uint8_t mos6526_device::read(offs_t offset)
|
|||||||
case ICR:
|
case ICR:
|
||||||
data = (m_ir1 << 7) | m_icr;
|
data = (m_ir1 << 7) | m_icr;
|
||||||
|
|
||||||
if (machine().side_effects_disabled())
|
// Do not reset irqs unless one is effectively issued.
|
||||||
|
// cfr. amigaocs_flop.xml barb2paln4 that polls for Timer B status
|
||||||
|
// until it expires at PC=7821c and other places.
|
||||||
|
if (machine().side_effects_disabled() || !m_icr)
|
||||||
return data;
|
return data;
|
||||||
|
|
||||||
m_icr_read = true;
|
m_icr_read = true;
|
||||||
|
@ -7,6 +7,13 @@
|
|||||||
Amiga 500 + Sony laserdisc player LDP-1450
|
Amiga 500 + Sony laserdisc player LDP-1450
|
||||||
(LDP-3300P for Zorton Brothers, LDP-1500 for Marbella Vice)
|
(LDP-3300P for Zorton Brothers, LDP-1500 for Marbella Vice)
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Implement LD comms (thru Amiga SERDAT / SERDATR ports);
|
||||||
|
- Why it enables FDC DMA like at all?
|
||||||
|
Is the board really capable of reading floppies for some reason?
|
||||||
|
- Picmatic games may really belong to a different driver,
|
||||||
|
just sharing the Amiga base state;
|
||||||
|
|
||||||
Games Supported:
|
Games Supported:
|
||||||
|
|
||||||
Mad Dog McCree [3 versions]
|
Mad Dog McCree [3 versions]
|
||||||
@ -913,49 +920,52 @@ GAME( 199?, alg_bios, 0, alg_r1, alg, alg_state, init_ntsc,
|
|||||||
|
|
||||||
// Rev. A board
|
// Rev. A board
|
||||||
// PAL R1
|
// PAL R1
|
||||||
GAME( 1990, maddoga, maddog, alg_r1, alg, alg_state, init_palr1, ROT0, "American Laser Games", "Mad Dog McCree v1C board rev.A", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1990, maddoga, maddog, alg_r1, alg, alg_state, init_palr1, ROT0, "American Laser Games", "Mad Dog McCree (v1C board rev.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
// PAL R3
|
// PAL R3
|
||||||
GAME( 1991, wsjr, alg_bios, alg_r1, alg, alg_state, init_palr3, ROT0, "American Laser Games", "Who Shot Johnny Rock? v1.6", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1991, wsjr, alg_bios, alg_r1, alg, alg_state, init_palr3, ROT0, "American Laser Games", "Who Shot Johnny Rock? (v1.6)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1991, wsjr_15, wsjr, alg_r1, alg, alg_state, init_palr3, ROT0, "American Laser Games", "Who Shot Johnny Rock? v1.5", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1991, wsjr_15, wsjr, alg_r1, alg, alg_state, init_palr3, ROT0, "American Laser Games", "Who Shot Johnny Rock? (v1.5)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
// Rev. B board
|
// Rev. B board
|
||||||
// PAL R6
|
// PAL R6
|
||||||
|
|
||||||
GAME( 1990, maddog, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog McCree v2.03 board rev.B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1990, maddog, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog McCree (v2.03 board rev.B)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1990, maddog_202, maddog, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog McCree v2.02 board rev.B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1990, maddog_202, maddog, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog McCree (v2.02 board rev.B)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
// Works OK but uses right player (2) controls only for trigger and holster
|
// Works OK but uses right player (2) controls only for trigger and holster
|
||||||
GAME( 1992, maddog2, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold v2.04", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, maddog2, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold (v2.04)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1992, maddog2_202, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold v2.02", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, maddog2_202, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold (v2.02)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1992, maddog2_110, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold v1.10", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, maddog2_110, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold (v1.10)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1992, maddog2_100, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold v1.00", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, maddog2_100, maddog2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Mad Dog II: The Lost Gold (v1.00)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
// Works ok but uses right player (2) controls only for trigger and holster
|
// Works ok but uses right player (2) controls only for trigger and holster
|
||||||
GAME( 1992, spacepir, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Space Pirates v2.2", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, spacepir, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Space Pirates (v2.2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1992, spacepir_14, spacepir, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Space Pirates v1.4", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, spacepir_14, spacepir, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Space Pirates (v1.4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
GAME( 1992, gallgall, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Gallagher's Gallery v2.2", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, gallgall, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Gallagher's Gallery (v2.2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1992, gallgall_21, gallgall, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Gallagher's Gallery v2.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1992, gallgall_21, gallgall, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Gallagher's Gallery (v2.1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
// All good, but no holster
|
// All good, but no holster
|
||||||
GAME( 1993, crimepat, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol v1.51", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimepat, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol (v1.51)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1993, crimepat_14, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol v1.4", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimepat_14, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol (v1.4)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1993, crimepat_12, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol v1.2", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimepat_12, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol (v1.2)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1993, crimepat_10, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol v1.0", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimepat_10, crimepat, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol (v1.0)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
GAME( 1993, crimep2, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol 2: Drug Wars v1.3", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimep2, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol 2: Drug Wars (v1.3)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1993, crimep2_11, crimep2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol 2: Drug Wars v1.1", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1993, crimep2_11, crimep2, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "Crime Patrol 2: Drug Wars (v1.1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1994, lastbh, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "The Last Bounty Hunter v1.01", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1994, lastbh, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "The Last Bounty Hunter (v1.01)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1994, lastbh_006, lastbh, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "The Last Bounty Hunter v0.06", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1994, lastbh_006, lastbh, alg_r2, alg_2p, alg_state, init_palr6, ROT0, "American Laser Games", "The Last Bounty Hunter (v0.06)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1995, fastdraw, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT90, "American Laser Games", "Fast Draw Showdown v1.31", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1995, fastdraw, alg_bios, alg_r2, alg_2p, alg_state, init_palr6, ROT90, "American Laser Games", "Fast Draw Showdown (v1.31)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1995, fastdraw_130, fastdraw, alg_r2, alg_2p, alg_state, init_palr6, ROT90, "American Laser Games", "Fast Draw Showdown v1.30", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1995, fastdraw_130, fastdraw, alg_r2, alg_2p, alg_state, init_palr6, ROT90, "American Laser Games", "Fast Draw Showdown (v1.30)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
// Works OK but uses right player (2) controls only for trigger and holster
|
// Works OK but uses right player (2) controls only for trigger and holster
|
||||||
|
|
||||||
// NOVA games on ALG hardware with own address scramble
|
// NOVA games on ALG hardware with own address scramble
|
||||||
GAME( 1995, aplatoon, alg_bios, alg_r2, alg, alg_state, init_aplatoon, ROT0, "Nova?", "Platoon V.3.1 US", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1995, aplatoon, alg_bios, alg_r2, alg, alg_state, init_aplatoon, ROT0, "Nova?", "Platoon (V.3.1 US)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
|
||||||
// Picmatic games NTSC or PAL (50 or 100Hz) TV standard, own ROM board
|
// Picmatic games NTSC or PAL (50 or 100Hz) TV standard, own ROM board
|
||||||
GAME( 1993, zortonbr_100, zortonbr, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Zorton Brothers v1.00 (Los Justicieros)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
// CHECKME: Zorton Brothers is the English title while Los Justicieros is the Spanish one?
|
||||||
GAME( 1994, zortonbr, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Zorton Brothers v1.01 (Los Justicieros)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
// Eventually confirm if they shares same roms with different LD side depending on language,
|
||||||
|
// or perhaps the title "Zorton Brothers" is the only one for Arcade LD, while "Los Justicieros" is the later PC release?
|
||||||
|
GAME( 1993, zortonbr_100, zortonbr, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Zorton Brothers / Los Justicieros (v1.00)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
GAME( 1994, zortonbr, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Zorton Brothers / Los Justicieros (v1.01)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1994, marvice, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Marbella Vice", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1994, marvice, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Marbella Vice", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1994, marvice100hz, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Marbella Vice (100Hz display)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1994, marvice100hz, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Marbella Vice (100Hz display)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
GAME( 1995, tierras100hz, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Tierras Salvajes (100Hz display)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
GAME( 1995, tierras100hz, alg_bios, picmatic, alg, alg_state, init_pal, ROT0, "Picmatic", "Tierras Salvajes (100Hz display)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS )
|
||||||
|
@ -1607,6 +1607,7 @@ void amiga_state::amiga_base(machine_config &config)
|
|||||||
|
|
||||||
// floppy drives
|
// floppy drives
|
||||||
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_PAL);
|
AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_PAL);
|
||||||
|
m_fdc->index_callback().set(m_cia_1, FUNC(mos8520_device::flag_w));
|
||||||
m_fdc->read_dma_callback().set(FUNC(amiga_state::chip_ram_r));
|
m_fdc->read_dma_callback().set(FUNC(amiga_state::chip_ram_r));
|
||||||
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
|
m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
|
||||||
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
|
m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
|
||||||
@ -1864,7 +1865,7 @@ void a3000_state::a3000(machine_config &config)
|
|||||||
// real-time clock
|
// real-time clock
|
||||||
RP5C01(config, "rtc", XTAL(32'768));
|
RP5C01(config, "rtc", XTAL(32'768));
|
||||||
|
|
||||||
// todo: zorro3 slots, super dmac, scsi
|
// TODO: zorro3 slots, super dmac, scsi
|
||||||
|
|
||||||
// software
|
// software
|
||||||
SOFTWARE_LIST(config, "a3000_list").set_original("amiga_a3000");
|
SOFTWARE_LIST(config, "a3000_list").set_original("amiga_a3000");
|
||||||
@ -1949,7 +1950,7 @@ void a600_state::a600(machine_config &config)
|
|||||||
ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
|
ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
|
||||||
ata.irq_handler().set("gayle", FUNC(gayle_device::ide_interrupt_w));
|
ata.irq_handler().set("gayle", FUNC(gayle_device::ide_interrupt_w));
|
||||||
|
|
||||||
// todo: pcmcia
|
// TODO: pcmcia
|
||||||
|
|
||||||
// software
|
// software
|
||||||
SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
|
SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
|
||||||
@ -2008,7 +2009,7 @@ void a1200_state::a1200(machine_config &config)
|
|||||||
subdevice<amiga_keyboard_bus_device>("kbd").set_default_option("a1200_us");
|
subdevice<amiga_keyboard_bus_device>("kbd").set_default_option("a1200_us");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// todo: pcmcia
|
// TODO: pcmcia
|
||||||
|
|
||||||
// software
|
// software
|
||||||
SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
|
SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
|
||||||
@ -2059,7 +2060,7 @@ void a4000_state::a4000(machine_config &config)
|
|||||||
ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
|
ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
|
||||||
ata.irq_handler().set(FUNC(a4000_state::ide_interrupt_w));
|
ata.irq_handler().set(FUNC(a4000_state::ide_interrupt_w));
|
||||||
|
|
||||||
// todo: zorro3
|
// TODO: zorro3
|
||||||
|
|
||||||
// software
|
// software
|
||||||
SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
|
SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
|
||||||
@ -2088,7 +2089,7 @@ void a4000_state::a400030(machine_config &config)
|
|||||||
m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a400030_mem);
|
m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a400030_mem);
|
||||||
m_maincpu->set_cpu_space(AS_PROGRAM);
|
m_maincpu->set_cpu_space(AS_PROGRAM);
|
||||||
|
|
||||||
// todo: ide
|
// TODO: ide
|
||||||
}
|
}
|
||||||
|
|
||||||
void a4000_state::a400030n(machine_config &config)
|
void a4000_state::a400030n(machine_config &config)
|
||||||
@ -2163,7 +2164,7 @@ void a4000_state::a4000t(machine_config &config)
|
|||||||
m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000t_mem);
|
m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000t_mem);
|
||||||
m_maincpu->set_cpu_space(AS_PROGRAM);
|
m_maincpu->set_cpu_space(AS_PROGRAM);
|
||||||
|
|
||||||
// todo: ide, zorro3, scsi, super dmac
|
// TODO: ide, zorro3, scsi, super dmac
|
||||||
}
|
}
|
||||||
|
|
||||||
void a4000_state::a4000tn(machine_config &config)
|
void a4000_state::a4000tn(machine_config &config)
|
||||||
@ -2422,7 +2423,8 @@ ROM_END
|
|||||||
|
|
||||||
ROM_START( cd32 )
|
ROM_START( cd32 )
|
||||||
ROM_REGION32_BE(0x100000, "kickstart", 0)
|
ROM_REGION32_BE(0x100000, "kickstart", 0)
|
||||||
// ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(a4fbc94a) SHA1(816ce6c5077875850c7d43452230a9ba3a2902db)) // todo: this is the real dump
|
// TODO: this is the real dump
|
||||||
|
// ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(a4fbc94a) SHA1(816ce6c5077875850c7d43452230a9ba3a2902db))
|
||||||
ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(d3837ae4) SHA1(06807db3181637455f4d46582d9972afec8956d9))
|
ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(d3837ae4) SHA1(06807db3181637455f4d46582d9972afec8956d9))
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
@ -458,7 +458,7 @@ public:
|
|||||||
uint16_t custom_chip_r(offs_t offset);
|
uint16_t custom_chip_r(offs_t offset);
|
||||||
void custom_chip_w(offs_t offset, uint16_t data);
|
void custom_chip_w(offs_t offset, uint16_t data);
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER( paula_int_w );
|
void paula_int_w(offs_t channel, u8 state);
|
||||||
|
|
||||||
uint16_t rom_mirror_r(offs_t offset, uint16_t mem_mask = ~0);
|
uint16_t rom_mirror_r(offs_t offset, uint16_t mem_mask = ~0);
|
||||||
uint32_t rom_mirror32_r(offs_t offset, uint32_t mem_mask = ~0);
|
uint32_t rom_mirror32_r(offs_t offset, uint32_t mem_mask = ~0);
|
||||||
|
@ -202,7 +202,7 @@ WRITE_LINE_MEMBER(amiga_state::fdc_dskblk_w)
|
|||||||
|
|
||||||
WRITE_LINE_MEMBER(amiga_state::fdc_dsksyn_w)
|
WRITE_LINE_MEMBER(amiga_state::fdc_dsksyn_w)
|
||||||
{
|
{
|
||||||
set_interrupt(INTENA_SETCLR | INTENA_DSKSYN);
|
set_interrupt((state ? INTENA_SETCLR : 0) | INTENA_DSKSYN);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( amiga_state::kbreset_w )
|
WRITE_LINE_MEMBER( amiga_state::kbreset_w )
|
||||||
@ -387,9 +387,9 @@ TIMER_CALLBACK_MEMBER( amiga_state::amiga_irq_proc )
|
|||||||
m_irq_timer->reset();
|
m_irq_timer->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( amiga_state::paula_int_w )
|
void amiga_state::paula_int_w (offs_t channel, u8 state)
|
||||||
{
|
{
|
||||||
set_interrupt(INTENA_SETCLR | (0x80 << state));
|
set_interrupt(INTENA_SETCLR | (0x80 << channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -922,7 +922,7 @@ TIMER_CALLBACK_MEMBER( amiga_state::amiga_blitter_proc )
|
|||||||
CUSTOM_REG(REG_DMACON) &= ~0x4000;
|
CUSTOM_REG(REG_DMACON) &= ~0x4000;
|
||||||
|
|
||||||
// signal an interrupt
|
// signal an interrupt
|
||||||
set_interrupt(0x8000 | INTENA_BLIT);
|
set_interrupt(INTENA_SETCLR | INTENA_BLIT);
|
||||||
|
|
||||||
/* reset the blitter timer */
|
/* reset the blitter timer */
|
||||||
m_blitter_timer->reset();
|
m_blitter_timer->reset();
|
||||||
@ -1443,7 +1443,6 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data)
|
|||||||
|
|
||||||
data = (data & INTENA_SETCLR) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
|
data = (data & INTENA_SETCLR) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
|
||||||
CUSTOM_REG(offset) = data;
|
CUSTOM_REG(offset) = data;
|
||||||
|
|
||||||
if (temp & INTENA_SETCLR)
|
if (temp & INTENA_SETCLR)
|
||||||
// if we're enabling irq's, delay a bit
|
// if we're enabling irq's, delay a bit
|
||||||
m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES));
|
m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES));
|
||||||
@ -1497,6 +1496,13 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data)
|
|||||||
CUSTOM_REG(offset) = data;
|
CUSTOM_REG(offset) = data;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case REG_BPL1MOD: case REG_BPL2MOD:
|
||||||
|
// bit 0 is implicitly ignored on writes,
|
||||||
|
// and wouldn't otherwise make sense with 68k inability of word reading with odd addresses.
|
||||||
|
// hpoker/hpokera would otherwise draw misaligned bottom GFX area without this (writes 0x27)
|
||||||
|
data &= ~1;
|
||||||
|
break;
|
||||||
|
|
||||||
case REG_COLOR00: case REG_COLOR01: case REG_COLOR02: case REG_COLOR03:
|
case REG_COLOR00: case REG_COLOR01: case REG_COLOR02: case REG_COLOR03:
|
||||||
case REG_COLOR04: case REG_COLOR05: case REG_COLOR06: case REG_COLOR07:
|
case REG_COLOR04: case REG_COLOR05: case REG_COLOR06: case REG_COLOR07:
|
||||||
case REG_COLOR08: case REG_COLOR09: case REG_COLOR10: case REG_COLOR11:
|
case REG_COLOR08: case REG_COLOR09: case REG_COLOR10: case REG_COLOR11:
|
||||||
|
Loading…
Reference in New Issue
Block a user