mirror of
https://github.com/holub/mame
synced 2025-06-03 11:26:56 +03:00
k051316 tile flip configuration bits, replaces flag setting in callbacks (#10401)
* Added shadow config bits * Removed previous fix (hack) * bool-ize some ints, use BIT macro * Fixed k054000, got rid of thndrx2 patch * Attempt to get chqflag shadow/highlights working properly with no k051960 hack * k051316 tile flip configuration bits, replaces flag setting in callbacks * k051316: Removed flags cb parameter, added bool for each configuration bit * Got rid of duplicated state for flip enable bits * video/k051316.cpp: Cleanup * video/k051316.h: Cleanup Also, don’t split member initialisation between declarations and constructor - it’s a recipe for confusion. Co-authored-by: Vas Crabb <cuavas@users.noreply.github.com>
This commit is contained in:
parent
d2cb3388ee
commit
400baf8ce4
@ -30,8 +30,9 @@ control registers
|
||||
00e bit 0 = enable ROM reading (active low). This only makes the chip output the
|
||||
requested address: the ROM is actually read externally, not through
|
||||
the chip's data bus.
|
||||
bit 1 = unknown
|
||||
bit 2 = unknown
|
||||
bit 1 = enable tile X flip when tile color attribute bit 6 is set
|
||||
bit 2 = enable tile Y flip when tile color attribute bit 7 is set
|
||||
bits 3-7 = internal tests, shouldn't be used
|
||||
00f unused
|
||||
|
||||
*/
|
||||
@ -39,6 +40,7 @@ control registers
|
||||
#include "emu.h"
|
||||
#include "k051316.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
@ -104,7 +106,7 @@ GFXDECODE_MEMBER( k051316_device::gfxinfo4_ram )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
k051316_device::k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
k051316_device::k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, K051316, tag, owner, clock)
|
||||
, device_gfx_interface(mconfig, *this, gfxinfo)
|
||||
, m_zoom_rom(*this, DEVICE_SELF)
|
||||
@ -114,6 +116,9 @@ k051316_device::k051316_device(const machine_config &mconfig, const char *tag, d
|
||||
, m_pixels_per_byte(2) // 4bpp layout is default
|
||||
, m_layermask(0)
|
||||
, m_k051316_cb(*this)
|
||||
, m_readout_enabled(true)
|
||||
, m_flipx_enabled(false)
|
||||
, m_flipy_enabled(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -172,11 +177,16 @@ void k051316_device::device_start()
|
||||
m_tmap->map_pens_to_layer(0, m_layermask, m_layermask, TILEMAP_PIXEL_LAYER0);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_tmap->set_transparent_pen(0);
|
||||
}
|
||||
|
||||
save_item(NAME(m_ram));
|
||||
save_item(NAME(m_ctrlram));
|
||||
save_item(NAME(m_wrap));
|
||||
save_item(NAME(m_readout_enabled));
|
||||
save_item(NAME(m_flipx_enabled));
|
||||
save_item(NAME(m_flipy_enabled));
|
||||
|
||||
}
|
||||
|
||||
@ -186,7 +196,7 @@ void k051316_device::device_start()
|
||||
|
||||
void k051316_device::device_reset()
|
||||
{
|
||||
memset(m_ctrlram, 0, 0x10);
|
||||
std::fill(std::begin(m_ctrlram), std::end(m_ctrlram), 0);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@ -207,9 +217,9 @@ void k051316_device::write(offs_t offset, u8 data)
|
||||
|
||||
u8 k051316_device::rom_r(offs_t offset)
|
||||
{
|
||||
assert (m_zoom_rom.found());
|
||||
assert(m_zoom_rom.found());
|
||||
|
||||
if ((m_ctrlram[0x0e] & 0x01) == 0)
|
||||
if (m_readout_enabled)
|
||||
{
|
||||
int addr = offset + (m_ctrlram[0x0c] << 11) + (m_ctrlram[0x0d] << 19);
|
||||
addr /= m_pixels_per_byte;
|
||||
@ -228,12 +238,22 @@ u8 k051316_device::rom_r(offs_t offset)
|
||||
|
||||
void k051316_device::ctrl_w(offs_t offset, u8 data)
|
||||
{
|
||||
m_ctrlram[offset] = data;
|
||||
if (offset == 0x0e)
|
||||
{
|
||||
m_readout_enabled = !BIT(data, 0);
|
||||
if ((m_flipx_enabled != BIT(data, 1)) || (m_flipy_enabled != BIT(data, 2)))
|
||||
m_tmap->mark_all_dirty();
|
||||
m_flipx_enabled = BIT(data, 1);
|
||||
m_flipy_enabled = BIT(data, 2);
|
||||
}
|
||||
else if (offset < 0x0e)
|
||||
m_ctrlram[offset] = data;
|
||||
|
||||
//if (offset >= 0x0c) logerror("%s: write %02x to 051316 reg %x\n", machine().describe_context(), data, offset);
|
||||
}
|
||||
|
||||
// some games (ajax, rollerg, ultraman, etc.) have external logic that can enable or disable wraparound dynamically
|
||||
void k051316_device::wraparound_enable( int status )
|
||||
void k051316_device::wraparound_enable(int status)
|
||||
{
|
||||
m_wrap = status;
|
||||
}
|
||||
@ -248,9 +268,15 @@ TILE_GET_INFO_MEMBER(k051316_device::get_tile_info)
|
||||
{
|
||||
int code = m_ram[tile_index];
|
||||
int color = m_ram[tile_index + 0x400];
|
||||
int flags = 0;
|
||||
u8 flags = 0;
|
||||
|
||||
m_k051316_cb(&code, &color, &flags);
|
||||
if (m_flipx_enabled && (color & 0x40))
|
||||
flags |= TILE_FLIPX;
|
||||
|
||||
if (m_flipy_enabled && (color & 0x80))
|
||||
flags |= TILE_FLIPY;
|
||||
|
||||
m_k051316_cb(&code, &color);
|
||||
|
||||
tileinfo.set(0,
|
||||
code,
|
||||
@ -259,9 +285,9 @@ TILE_GET_INFO_MEMBER(k051316_device::get_tile_info)
|
||||
}
|
||||
|
||||
|
||||
void k051316_device::zoom_draw( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, uint32_t priority )
|
||||
void k051316_device::zoom_draw( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, u32 priority )
|
||||
{
|
||||
uint32_t startx, starty;
|
||||
u32 startx, starty;
|
||||
int incxx, incxy, incyx, incyy;
|
||||
|
||||
startx = 256 * ((int16_t)(256 * m_ctrlram[0x00] + m_ctrlram[0x01]));
|
||||
@ -283,7 +309,7 @@ void k051316_device::zoom_draw( screen_device &screen, bitmap_ind16 &bitmap, con
|
||||
flags, priority);
|
||||
|
||||
#if 0
|
||||
popmessage("%02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x",
|
||||
popmessage("%02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x",
|
||||
m_ctrlram[0x00],
|
||||
m_ctrlram[0x01],
|
||||
m_ctrlram[0x02],
|
||||
@ -297,8 +323,6 @@ void k051316_device::zoom_draw( screen_device &screen, bitmap_ind16 &bitmap, con
|
||||
m_ctrlram[0x0a],
|
||||
m_ctrlram[0x0b],
|
||||
m_ctrlram[0x0c], /* bank for ROM testing */
|
||||
m_ctrlram[0x0d],
|
||||
m_ctrlram[0x0e], /* 0 = test ROMs */
|
||||
m_ctrlram[0x0f]);
|
||||
m_ctrlram[0x0d]);
|
||||
#endif
|
||||
}
|
||||
|
@ -8,15 +8,15 @@
|
||||
#include "tilemap.h"
|
||||
|
||||
|
||||
#define K051316_CB_MEMBER(_name) void _name(int *code, int *color, int *flags)
|
||||
#define K051316_CB_MEMBER(_name) void _name(int *code, int *color)
|
||||
|
||||
|
||||
class k051316_device : public device_t, public device_gfx_interface
|
||||
{
|
||||
public:
|
||||
using zoom_delegate = device_delegate<void (int *code, int *color, int *flags)>;
|
||||
using zoom_delegate = device_delegate<void (int *code, int *color)>;
|
||||
|
||||
k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
k051316_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static const gfx_layout charlayout4;
|
||||
static const gfx_layout charlayout7;
|
||||
@ -45,7 +45,6 @@ public:
|
||||
The callback must put:
|
||||
- in code the resulting tile number
|
||||
- in color the resulting color index
|
||||
- if necessary, put flags for the TileMap code in the tile_info
|
||||
structure (e.g. TILE_FLIPX)
|
||||
*/
|
||||
|
||||
@ -53,7 +52,7 @@ public:
|
||||
void write(offs_t offset, u8 data);
|
||||
u8 rom_r(offs_t offset);
|
||||
void ctrl_w(offs_t offset, u8 data);
|
||||
void zoom_draw(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,uint32_t priority);
|
||||
void zoom_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, u32 priority);
|
||||
void wraparound_enable(int status);
|
||||
|
||||
void mark_gfx_dirty(offs_t byteoffset) { gfx(0)->mark_dirty(byteoffset * m_pixels_per_byte / (16 * 16)); }
|
||||
@ -67,8 +66,8 @@ protected:
|
||||
private:
|
||||
// internal state
|
||||
std::vector<uint8_t> m_ram;
|
||||
uint8_t m_ctrlram[16];
|
||||
tilemap_t *m_tmap = nullptr;
|
||||
uint8_t m_ctrlram[14];
|
||||
tilemap_t *m_tmap;
|
||||
|
||||
optional_region_ptr<uint8_t> m_zoom_rom;
|
||||
|
||||
@ -77,6 +76,9 @@ private:
|
||||
int m_pixels_per_byte;
|
||||
int m_layermask;
|
||||
zoom_delegate m_k051316_cb;
|
||||
bool m_readout_enabled;
|
||||
bool m_flipx_enabled;
|
||||
bool m_flipy_enabled;
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_tile_info);
|
||||
};
|
||||
|
@ -46,7 +46,6 @@ K051316_CB_MEMBER(_88games_state::zoom_callback)
|
||||
{
|
||||
enum { zoom_colorbase = 768 / 16 };
|
||||
|
||||
*flags = (*color & 0x40) ? TILE_FLIPX : 0;
|
||||
*code |= ((*color & 0x07) << 8);
|
||||
*color = zoom_colorbase + ((*color & 0x38) >> 3) + ((*color & 0x80) >> 4);
|
||||
}
|
||||
|
@ -143,7 +143,6 @@ K051316_CB_MEMBER(bottom9_state::zoom_callback)
|
||||
{
|
||||
enum { zoom_colorbase = 768 / 16 };
|
||||
|
||||
*flags = (*color & 0x40) ? TILE_FLIPX : 0;
|
||||
*code |= ((*color & 0x03) << 8);
|
||||
*color = zoom_colorbase + ((*color & 0x3c) >> 2);
|
||||
}
|
||||
|
@ -45,7 +45,6 @@ K051316_CB_MEMBER(chqflag_state::zoom_callback_2)
|
||||
{
|
||||
enum { zoom_colorbase_2 = 512 / 256 };
|
||||
|
||||
*flags = TILE_FLIPYX((*color & 0xc0) >> 6);
|
||||
*code |= ((*color & 0x0f) << 8);
|
||||
*color = zoom_colorbase_2 + ((*color & 0x10) >> 4);
|
||||
}
|
||||
|
@ -264,14 +264,12 @@ K053246_CB_MEMBER(overdriv_state::sprite_callback)
|
||||
|
||||
K051316_CB_MEMBER(overdriv_state::zoom_callback_1)
|
||||
{
|
||||
*flags = (*color & 0x40) ? TILE_FLIPX : 0;
|
||||
*code |= ((*color & 0x03) << 8);
|
||||
*color = m_zoom_colorbase[0] + ((*color & 0x3c) >> 2);
|
||||
}
|
||||
|
||||
K051316_CB_MEMBER(overdriv_state::zoom_callback_2)
|
||||
{
|
||||
*flags = (*color & 0x40) ? TILE_FLIPX : 0;
|
||||
*code |= ((*color & 0x03) << 8);
|
||||
*color = m_zoom_colorbase[1] + ((*color & 0x3c) >> 2);
|
||||
}
|
||||
|
@ -119,7 +119,6 @@ K05324X_CB_MEMBER(rollerg_state::sprite_callback)
|
||||
|
||||
K051316_CB_MEMBER(rollerg_state::zoom_callback)
|
||||
{
|
||||
*flags = TILE_FLIPYX((*color & 0xc0) >> 6);
|
||||
*code |= ((*color & 0x0f) << 8);
|
||||
*color = ((*color & 0x30) >> 4);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user