mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
igs/pgmcrypt.cpp: Fixed Endianness issue for 32-bit games.
This commit is contained in:
parent
4f6083efd8
commit
6e151b21c1
@ -155,12 +155,12 @@ const tiny_rom_entry* dectalk_isa_device::device_rom_region() const
|
||||
|
||||
void dectalk_isa_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
I80186(config, m_cpu, XTAL(20'000'000));
|
||||
I80186(config, m_cpu, 20_MHz_XTAL);
|
||||
m_cpu->set_addrmap(AS_PROGRAM, &dectalk_isa_device::dectalk_cpu_map);
|
||||
m_cpu->set_addrmap(AS_IO, &dectalk_isa_device::dectalk_cpu_io);
|
||||
m_cpu->tmrout0_handler().set(FUNC(dectalk_isa_device::clock_w));
|
||||
|
||||
TMS32015(config, m_dsp, XTAL(80'000'000)); // this is wrong, but it works
|
||||
TMS32015(config, m_dsp, 80'000'000); // the a 20MHz oscillator is present - clock frequency hacked to make it "work"
|
||||
m_dsp->set_addrmap(AS_PROGRAM, &dectalk_isa_device::dectalk_dsp_map);
|
||||
m_dsp->set_addrmap(AS_IO, &dectalk_isa_device::dectalk_dsp_io);
|
||||
m_dsp->bio().set(FUNC(dectalk_isa_device::bio_line_r));
|
||||
|
@ -9,8 +9,8 @@
|
||||
#include "cpu/arm7/arm7core.h"
|
||||
#include "cpu/xa/xa.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "machine/v3021.h"
|
||||
#include "machine/ticket.h"
|
||||
#include "machine/v3021.h"
|
||||
#include "sound/ics2115.h"
|
||||
|
||||
#include "emupal.h"
|
||||
@ -51,9 +51,9 @@ private:
|
||||
|
||||
void draw_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect, int xpos, int ypos, int height, int width, int palette, int flipx, int romoffset);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
uint32_t igs027_gpio_r(offs_t offset);
|
||||
u32 igs027_gpio_r(offs_t offset);
|
||||
void igs027_gpio_w(offs_t offset, u32 data, u32 mem_mask);
|
||||
|
||||
TIMER_CALLBACK_MEMBER(igs027_timer0);
|
||||
@ -61,29 +61,29 @@ private:
|
||||
|
||||
void igs027_periph_init(void);
|
||||
void igs027_trigger_irq(int num);
|
||||
uint32_t igs027_periph_r(offs_t offset);
|
||||
u32 igs027_periph_r(offs_t offset);
|
||||
void igs027_periph_w(offs_t offset, u32 data, u32 mem_mask);
|
||||
|
||||
uint32_t xa_r(offs_t offset);
|
||||
u32 xa_r(offs_t offset);
|
||||
void xa_w(offs_t offset, u32 data, u32 mem_mask);
|
||||
void cpld_w(offs_t offset, u32 data, u32 mem_mask);
|
||||
|
||||
uint32_t m_gpio_o;
|
||||
uint32_t m_irq_enable;
|
||||
uint32_t m_irq_pending;
|
||||
u32 m_gpio_o;
|
||||
u32 m_irq_enable;
|
||||
u32 m_irq_pending;
|
||||
emu_timer *m_timer0;
|
||||
emu_timer *m_timer1;
|
||||
|
||||
uint32_t m_xa_cmd;
|
||||
u32 m_xa_cmd;
|
||||
int m_trackball_cnt;
|
||||
int m_trackball_axis[2], m_trackball_axis_pre[2], m_trackball_axis_diff[2];
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<xa_cpu_device> m_xa;
|
||||
required_shared_ptr<uint32_t> m_videoram;
|
||||
required_shared_ptr<u32> m_videoram;
|
||||
required_device<palette_device> m_palette;
|
||||
required_region_ptr<uint8_t> m_gfxrom;
|
||||
required_region_ptr<u8> m_gfxrom;
|
||||
|
||||
required_device<ticket_dispenser_device> m_ticket;
|
||||
required_ioport_array<2> m_io_dsw;
|
||||
@ -101,18 +101,18 @@ void igs_fear_state::draw_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect
|
||||
if ((romoffset != 0) && (romoffset != 0xffffffff))
|
||||
{
|
||||
//logerror("x=%d, y=%d, w=%d pix, h=%d pix, c=0x%02x, romoffset=0x%08x\n", xpos, ypos, width, height, palette, romoffset << 2);
|
||||
const uint8_t *gfxrom = &m_gfxrom[romoffset << 2];
|
||||
const u8 *gfxrom = &m_gfxrom[romoffset << 2];
|
||||
const int x_base = flipx ? (xpos + width - 1) : xpos;
|
||||
const int x_inc = flipx ? (-1) : 1;
|
||||
palette = (palette & 0x3f) << 7;
|
||||
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
uint16_t *dest = &bitmap.pix(ypos + y);
|
||||
u16 *dest = &bitmap.pix(ypos + y);
|
||||
int x_index = x_base;
|
||||
for (int x = 0; x < width; x++)
|
||||
{
|
||||
uint8_t pix = *gfxrom++;
|
||||
u8 pix = *gfxrom++;
|
||||
if (pix)
|
||||
{
|
||||
if (cliprect.contains(x_index, ypos + y))
|
||||
@ -124,7 +124,7 @@ void igs_fear_state::draw_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t igs_fear_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
u32 igs_fear_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0x3ff, cliprect);
|
||||
|
||||
@ -312,16 +312,18 @@ void igs_fear_state::vblank_irq(int state)
|
||||
m_maincpu->pulse_input_line(ARM7_FIRQ_LINE, m_maincpu->minimum_quantum_time());
|
||||
}
|
||||
|
||||
uint32_t igs_fear_state::igs027_gpio_r(offs_t offset)
|
||||
u32 igs_fear_state::igs027_gpio_r(offs_t offset)
|
||||
{
|
||||
uint32_t data = -1;
|
||||
u32 data = ~u32(0);
|
||||
switch (offset * 4)
|
||||
{
|
||||
case 0xc:
|
||||
uint8_t ret = 0xff;
|
||||
if (!BIT(m_gpio_o, 0)) ret &= m_io_dsw[0]->read();
|
||||
if (!BIT(m_gpio_o, 1)) ret &= m_io_dsw[1]->read();
|
||||
data = 0x2000 | (ret << 3);
|
||||
{
|
||||
u8 ret = 0xff;
|
||||
if (!BIT(m_gpio_o, 0)) ret &= m_io_dsw[0]->read();
|
||||
if (!BIT(m_gpio_o, 1)) ret &= m_io_dsw[1]->read();
|
||||
data = 0x2000 | (u32(ret) << 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return data;
|
||||
@ -339,17 +341,17 @@ void igs_fear_state::igs027_gpio_w(offs_t offset, u32 data, u32 mem_mask)
|
||||
|
||||
void igs_fear_state::igs027_periph_init()
|
||||
{
|
||||
m_irq_enable = 0xFF;
|
||||
m_irq_pending = 0xFF;
|
||||
m_irq_enable = 0xff;
|
||||
m_irq_pending = 0xff;
|
||||
m_timer0 = timer_alloc(FUNC(igs_fear_state::igs027_timer0), this);
|
||||
m_timer1 = timer_alloc(FUNC(igs_fear_state::igs027_timer1), this);
|
||||
}
|
||||
|
||||
void igs_fear_state::igs027_trigger_irq(int num)
|
||||
{
|
||||
if ((m_irq_enable & (1 << num)) == 0)
|
||||
if (!BIT(m_irq_enable, num))
|
||||
{
|
||||
m_irq_pending &= ~(1 << num);
|
||||
m_irq_pending &= ~(u32(1) << num);
|
||||
m_maincpu->pulse_input_line(ARM7_IRQ_LINE, m_maincpu->minimum_quantum_time());
|
||||
}
|
||||
}
|
||||
@ -383,23 +385,23 @@ void igs_fear_state::igs027_periph_w(offs_t offset, u32 data, u32 mem_mask)
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t igs_fear_state::igs027_periph_r(offs_t offset)
|
||||
u32 igs_fear_state::igs027_periph_r(offs_t offset)
|
||||
{
|
||||
uint32_t data = -1;
|
||||
u32 data = ~u32(0);
|
||||
switch (offset * 4)
|
||||
{
|
||||
case 0x200:
|
||||
data = m_irq_pending;
|
||||
m_irq_pending = 0xFF;
|
||||
m_irq_pending = 0xff;
|
||||
break;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
// TODO: ICS2115 & trackball support in XA
|
||||
uint32_t igs_fear_state::xa_r(offs_t offset)
|
||||
u32 igs_fear_state::xa_r(offs_t offset)
|
||||
{
|
||||
uint32_t data = -1;
|
||||
u32 data = ~u32(0);
|
||||
|
||||
switch (offset * 4)
|
||||
{
|
||||
@ -553,4 +555,4 @@ void igs_fear_state::init_igs_superkds()
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 2005, superkds, 0, igs_fear, superkds, igs_fear_state, init_igs_superkds, ROT0, "IGS", "Super Kids (S019CN)", MACHINE_IS_SKELETON )
|
||||
GAME( 2006, fearless, 0, igs_fear, fear, igs_fear_state, init_igs_fear, ROT0, "IGS", "Fearless Pinocchio (V101US)", MACHINE_IS_SKELETON )
|
||||
GAME( 2006, fearless, 0, igs_fear, fear, igs_fear_state, init_igs_fear, ROT0, "IGS", "Fearless Pinocchio (V101US)", MACHINE_IS_SKELETON )
|
||||
|
@ -19,6 +19,9 @@
|
||||
#include "emu.h"
|
||||
#include "pgmcrypt.h"
|
||||
|
||||
#include "endianness.h"
|
||||
|
||||
|
||||
// a common set of these are used, selectable in the real scheme by an uploaded bitfield
|
||||
// some may be duplicates simply due to differing ROM sizes
|
||||
|
||||
@ -1417,8 +1420,7 @@ static const uint8_t superkds_tab[256] = {
|
||||
|
||||
void superkds_decrypt(running_machine &machine)
|
||||
{
|
||||
// FIXME: Endianness bug - casting a 32-bit ROM region to u16
|
||||
auto const src = reinterpret_cast<u16 *>(machine.root_device().memregion("user1")->base());
|
||||
auto const src = util::little_endian_cast<u16>(reinterpret_cast<u32 *>(machine.root_device().memregion("user1")->base()));
|
||||
|
||||
int const rom_size = 0x80000;
|
||||
|
||||
@ -1443,8 +1445,7 @@ void superkds_decrypt(running_machine &machine)
|
||||
|
||||
void fearless_decrypt(running_machine &machine)
|
||||
{
|
||||
// FIXME: Endianness bug - casting a 32-bit ROM region to u16
|
||||
auto const src = reinterpret_cast<u16 *>(machine.root_device().memregion("user1")->base());
|
||||
auto const src = util::little_endian_cast<u16>(reinterpret_cast<u32 *>(machine.root_device().memregion("user1")->base()));
|
||||
|
||||
int const rom_size = 0x80000;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user