mirror of
https://github.com/holub/mame
synced 2025-04-27 02:33:13 +03:00
spectrum: Fix sprite flicker and missing graphics in several games. [geecab, R. Belmont]
This commit is contained in:
parent
6228bbe942
commit
128343eb7c
@ -38,6 +38,7 @@ public:
|
|||||||
DECLARE_READ8_MEMBER(beta_enable_r);
|
DECLARE_READ8_MEMBER(beta_enable_r);
|
||||||
DECLARE_READ8_MEMBER(beta_disable_r);
|
DECLARE_READ8_MEMBER(beta_disable_r);
|
||||||
DECLARE_MACHINE_RESET(pentagon);
|
DECLARE_MACHINE_RESET(pentagon);
|
||||||
|
DECLARE_VIDEO_START(pentagon);
|
||||||
INTERRUPT_GEN_MEMBER(pentagon_interrupt);
|
INTERRUPT_GEN_MEMBER(pentagon_interrupt);
|
||||||
TIMER_CALLBACK_MEMBER(irq_on);
|
TIMER_CALLBACK_MEMBER(irq_on);
|
||||||
TIMER_CALLBACK_MEMBER(irq_off);
|
TIMER_CALLBACK_MEMBER(irq_off);
|
||||||
@ -233,6 +234,22 @@ MACHINE_RESET_MEMBER(pentagon_state,pentagon)
|
|||||||
pentagon_update_memory();
|
pentagon_update_memory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VIDEO_START_MEMBER(pentagon_state,pentagon)
|
||||||
|
{
|
||||||
|
m_frame_invert_count = 16;
|
||||||
|
m_frame_number = 0;
|
||||||
|
m_flash_invert = 0;
|
||||||
|
|
||||||
|
m_previous_border_x = 0;
|
||||||
|
m_previous_border_y = 0;
|
||||||
|
machine().first_screen()->register_screen_bitmap(m_border_bitmap);
|
||||||
|
m_previous_screen_x = 0;
|
||||||
|
m_previous_screen_y = 0;
|
||||||
|
machine().first_screen()->register_screen_bitmap(m_screen_bitmap);
|
||||||
|
|
||||||
|
m_screen_location = m_ram->pointer() + (5 << 14);
|
||||||
|
}
|
||||||
|
|
||||||
/* F4 Character Displayer */
|
/* F4 Character Displayer */
|
||||||
static const gfx_layout spectrum_charlayout =
|
static const gfx_layout spectrum_charlayout =
|
||||||
{
|
{
|
||||||
@ -266,6 +283,7 @@ MACHINE_CONFIG_START(pentagon_state::pentagon)
|
|||||||
MCFG_SCREEN_MODIFY("screen")
|
MCFG_SCREEN_MODIFY("screen")
|
||||||
//MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 304)
|
//MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 304)
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 287)
|
MCFG_SCREEN_RAW_PARAMS(XTAL(14'000'000) / 2, 448, 0, 352, 320, 0, 287)
|
||||||
|
MCFG_VIDEO_START_OVERRIDE(pentagon_state, pentagon )
|
||||||
|
|
||||||
MCFG_BETA_DISK_ADD(BETA_DISK_TAG)
|
MCFG_BETA_DISK_ADD(BETA_DISK_TAG)
|
||||||
MCFG_GFXDECODE_MODIFY("gfxdecode", pentagon)
|
MCFG_GFXDECODE_MODIFY("gfxdecode", pentagon)
|
||||||
|
@ -643,13 +643,24 @@ GFXDECODE_END
|
|||||||
|
|
||||||
void spectrum_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
void spectrum_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
{
|
{
|
||||||
m_maincpu->set_input_line(0, CLEAR_LINE);
|
switch (id)
|
||||||
|
{
|
||||||
|
case TIMER_IRQ_OFF:
|
||||||
|
m_maincpu->set_input_line(0, CLEAR_LINE);
|
||||||
|
break;
|
||||||
|
case TIMER_SCANLINE:
|
||||||
|
timer_set(m_maincpu->cycles_to_attotime(m_CyclesPerLine), TIMER_SCANLINE);
|
||||||
|
spectrum_UpdateScreenBitmap();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert_always(false, "Unknown id in spectrum_state::device_timer");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(spectrum_state::spec_interrupt)
|
INTERRUPT_GEN_MEMBER(spectrum_state::spec_interrupt)
|
||||||
{
|
{
|
||||||
m_maincpu->set_input_line(0, HOLD_LINE);
|
m_maincpu->set_input_line(0, HOLD_LINE);
|
||||||
timer_set(attotime::from_ticks(32, m_maincpu->clock()), 0, 0);
|
timer_set(attotime::from_ticks(32, m_maincpu->clock()), TIMER_IRQ_OFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_CONFIG_START(spectrum_state::spectrum_common)
|
MACHINE_CONFIG_START(spectrum_state::spectrum_common)
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "machine/ram.h"
|
#include "machine/ram.h"
|
||||||
#include "machine/upd765.h"
|
#include "machine/upd765.h"
|
||||||
#include "sound/spkrdev.h"
|
#include "sound/spkrdev.h"
|
||||||
|
#include "screen.h"
|
||||||
|
|
||||||
/* Spectrum crystals */
|
/* Spectrum crystals */
|
||||||
|
|
||||||
@ -63,10 +64,17 @@ struct EVENT_LIST_ITEM
|
|||||||
class spectrum_state : public driver_device
|
class spectrum_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TIMER_IRQ_ON,
|
||||||
|
TIMER_IRQ_OFF,
|
||||||
|
TIMER_SCANLINE
|
||||||
|
};
|
||||||
spectrum_state(const machine_config &mconfig, device_type type, const char *tag)
|
spectrum_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag),
|
||||||
m_video_ram(*this, "video_ram"),
|
m_video_ram(*this, "video_ram"),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
|
m_screen(*this, "screen"),
|
||||||
m_cassette(*this, "cassette"),
|
m_cassette(*this, "cassette"),
|
||||||
m_ram(*this, RAM_TAG),
|
m_ram(*this, RAM_TAG),
|
||||||
m_speaker(*this, "speaker"),
|
m_speaker(*this, "speaker"),
|
||||||
@ -110,13 +118,17 @@ public:
|
|||||||
|
|
||||||
int m_ROMSelection;
|
int m_ROMSelection;
|
||||||
|
|
||||||
|
// Build up the screen bitmap line-by-line as the z80 uses CPU cycles.
|
||||||
|
// Elimiates sprite flicker on various games (E.g. Marauder and
|
||||||
|
// Stormlord) and makes Firefly playable.
|
||||||
|
emu_timer *m_scanline_timer;
|
||||||
|
|
||||||
EVENT_LIST_ITEM *m_pCurrentItem;
|
EVENT_LIST_ITEM *m_pCurrentItem;
|
||||||
int m_NumEvents;
|
int m_NumEvents;
|
||||||
int m_TotalEvents;
|
int m_TotalEvents;
|
||||||
char *m_pEventListBuffer;
|
char *m_pEventListBuffer;
|
||||||
int m_LastFrameStartTime;
|
int m_LastFrameStartTime;
|
||||||
int m_CyclesPerFrame;
|
int m_CyclesPerLine;
|
||||||
|
|
||||||
uint8_t *m_ram_0000;
|
uint8_t *m_ram_0000;
|
||||||
uint8_t m_ram_disabled_by_beta;
|
uint8_t m_ram_disabled_by_beta;
|
||||||
@ -183,6 +195,7 @@ public:
|
|||||||
DECLARE_QUICKLOAD_LOAD_MEMBER( spectrum );
|
DECLARE_QUICKLOAD_LOAD_MEMBER( spectrum );
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
|
||||||
void spectrum_common(machine_config &config);
|
void spectrum_common(machine_config &config);
|
||||||
void spectrum(machine_config &config);
|
void spectrum(machine_config &config);
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "includes/spectrum.h"
|
#include "includes/spectrum.h"
|
||||||
#include "screen.h"
|
#include "includes/spec128.h"
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
Start the video hardware emulation.
|
Start the video hardware emulation.
|
||||||
@ -31,12 +30,17 @@ VIDEO_START_MEMBER(spectrum_state,spectrum)
|
|||||||
|
|
||||||
m_previous_border_x = 0;
|
m_previous_border_x = 0;
|
||||||
m_previous_border_y = 0;
|
m_previous_border_y = 0;
|
||||||
machine().first_screen()->register_screen_bitmap(m_border_bitmap);
|
m_screen->register_screen_bitmap(m_border_bitmap);
|
||||||
m_previous_screen_x = 0;
|
m_previous_screen_x = 0;
|
||||||
m_previous_screen_y = 0;
|
m_previous_screen_y = 0;
|
||||||
machine().first_screen()->register_screen_bitmap(m_screen_bitmap);
|
m_screen->register_screen_bitmap(m_screen_bitmap);
|
||||||
|
|
||||||
m_screen_location = m_video_ram;
|
m_screen_location = m_video_ram;
|
||||||
|
|
||||||
|
m_CyclesPerLine = SPEC_CYCLES_PER_LINE;
|
||||||
|
m_scanline_timer = timer_alloc(TIMER_SCANLINE);
|
||||||
|
timer_set(m_maincpu->cycles_to_attotime(m_CyclesPerLine), TIMER_SCANLINE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VIDEO_START_MEMBER(spectrum_state,spectrum_128)
|
VIDEO_START_MEMBER(spectrum_state,spectrum_128)
|
||||||
@ -47,12 +51,16 @@ VIDEO_START_MEMBER(spectrum_state,spectrum_128)
|
|||||||
|
|
||||||
m_previous_border_x = 0;
|
m_previous_border_x = 0;
|
||||||
m_previous_border_y = 0;
|
m_previous_border_y = 0;
|
||||||
machine().first_screen()->register_screen_bitmap(m_border_bitmap);
|
m_screen->register_screen_bitmap(m_border_bitmap);
|
||||||
m_previous_screen_x = 0;
|
m_previous_screen_x = 0;
|
||||||
m_previous_screen_y = 0;
|
m_previous_screen_y = 0;
|
||||||
machine().first_screen()->register_screen_bitmap(m_screen_bitmap);
|
m_screen->register_screen_bitmap(m_screen_bitmap);
|
||||||
|
|
||||||
m_screen_location = m_ram->pointer() + (5 << 14);
|
m_screen_location = m_ram->pointer() + (5 << 14);
|
||||||
|
|
||||||
|
m_CyclesPerLine = SPEC128_CYCLES_PER_LINE;
|
||||||
|
m_scanline_timer = timer_alloc(TIMER_SCANLINE);
|
||||||
|
timer_set(m_maincpu->cycles_to_attotime(m_CyclesPerLine), TIMER_SCANLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -202,8 +210,8 @@ PALETTE_INIT_MEMBER(spectrum_state,spectrum)
|
|||||||
|
|
||||||
void spectrum_state::spectrum_UpdateScreenBitmap(bool eof)
|
void spectrum_state::spectrum_UpdateScreenBitmap(bool eof)
|
||||||
{
|
{
|
||||||
unsigned int x = machine().first_screen()->hpos();
|
unsigned int x = m_screen->hpos();
|
||||||
unsigned int y = machine().first_screen()->vpos();
|
unsigned int y = m_screen->vpos();
|
||||||
int width = m_screen_bitmap.width();
|
int width = m_screen_bitmap.width();
|
||||||
int height = m_screen_bitmap.height();
|
int height = m_screen_bitmap.height();
|
||||||
|
|
||||||
@ -259,8 +267,8 @@ void spectrum_state::spectrum_UpdateScreenBitmap(bool eof)
|
|||||||
|
|
||||||
void spectrum_state::spectrum_UpdateBorderBitmap()
|
void spectrum_state::spectrum_UpdateBorderBitmap()
|
||||||
{
|
{
|
||||||
unsigned int x = machine().first_screen()->hpos();
|
unsigned int x = m_screen->hpos();
|
||||||
unsigned int y = machine().first_screen()->vpos();
|
unsigned int y = m_screen->vpos();
|
||||||
int width = m_border_bitmap.width();
|
int width = m_border_bitmap.width();
|
||||||
int height = m_border_bitmap.height();
|
int height = m_border_bitmap.height();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user