tvgames/xavix2.cpp, tvgames/xavix_2002.cpp: Added four TV games (not working). (#13058)

* cpu/m6502/oxavix2000.lst: Don't treat unemulated instructions as fatal errors.
* tvgames/xavix_v.cpp: Implemented more drawing modes.

New systems marked not working
-----------------------------
Epoch / SSD Company LTD TV de Asobou! Manabou! Chou Nouryoku AIUEO Zukan (Japan) [David Haywood, TeamEurope]
Bandai / SSD Company LTD Let's! TV Play Ongeki Battle! Kamen Rider Hibiki: Kimero! Ikki Kasei no Kata (Japan) [David Haywood, TeamEurope]
Bandai / SSD Company LTD Let's! TV Play Taikan Taitoku Kekkaishi: Houi! Jouso! Ketsu! Metsu! (Japan) [David Haywood, TeamEurope]
Takara Tomy / Capcom / SSD Company LTD Ryuusei no Rockman: Denpa Henkan! On Air! (Japan) [David Haywood, TeamEurope]
This commit is contained in:
mamehaze 2024-12-11 18:59:10 +00:00 committed by GitHub
parent df3e2de8e1
commit 08c5c25ad5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 414 additions and 16 deletions

View File

@ -482,7 +482,7 @@ asr_abx
prefetch();
cmc_imp
fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
logerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state);
read_pc();
prefetch();

View File

@ -46188,6 +46188,7 @@ tvpc_tom
ltv_naru //
domfitad //
dombikec //
epo_dabj
@source:tvgames/xavix_2000.cpp
ban_omt //
@ -46210,6 +46211,8 @@ ttv_sw //
ttv_swj //
@source:tvgames/xavix_2002.cpp
ban_kksj
ban_ordj
domdance //
domfitch //
domfitex //
@ -46219,6 +46222,7 @@ mrangbat
suprtvpc
suprtvpcdo
suprtvpchk
tmy_rkmj
tmy_thom //
udance
xavaero //

View File

@ -42,12 +42,10 @@
Let's!TVプレイ Gyu! / / Let's!TV Play Gyu, the Twin Princess of the Mysterious Planet! Dance cutely with a dress change / Bandai / Japan
Let's!TVプレイ / / Let's!TV Play Experience Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan
Let's!TVプレイ / / Let's! TV Play Narikiri Experience Boukenger Run! Shoot! Mission starts! ! / Bandai / Japan
/ / Let's play on TV! Learn! Superpower Aiueo Illustrated Book / Epochsha / Japan
Let's!TVプレイ / / Let's!TV Play Narikiri Fight Ultraman Shoot! Deadly ray! ! / Takara Tomy / Japan
2005 DX体感 / / Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! / Epoch / Japan
Let's!TVプレイ MaxHeart MaxHeartにおどっちゃおう / / Let's!TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart / Bandai / Japan
Let's!TVプレイ / / Let's!TV Play Mahou Sentai Magiranger Dance & Battle at Magimat / Bandai / Japan
Let's!TVプレイ / / Let's!TV Play Ongeki Battle! Kamen Rider Hibiki Decide! Ichikkasei no Kata / Bandai / Japan
Jala Jaland /atlus/Japan (arcade version) - - - - - - -
2004 Printer for TV computer /EPOCH/Japan - - - - - - -
Accessory memory mascot for TV mail Pc mail cot 2 characters (Putchi, Petchi) /EPOCH/Japan - - - - - - -
@ -63,9 +61,7 @@
not dumped: no TSOP pads
2003 Beyblade Arcade Challenge 5-in-1 /Hasbro/USA - - - - - - have
2002 Excite Striker (UK)
2001 Webdiver Gradion /TAKARA/Japan - - - - - - -
2000 connecTV OPUS /RADICA EU (different ROM to US?)
not dumped: xavix2.cpp
@ -76,6 +72,9 @@
2005 Let's!TVプレイ / / Let's!TV Play Dragon Ball Z Battle Experience Kamehameha ~ Ometo Fusion / Bandai / Japan
dumped: either here, xavix_2000.cpp, or xavix_2002.cpp
Excite Striker (UK)
connecTV OPUS /RADICA EU (different ROM to US?)
Let's!TVプレイ / / (Let's! TV Play Ongeki Battle! Kamen Rider Hibiki Decide! Ichikkasei no Kata / Bandai / Japan)
Let's construct the town! /TAKARA/Japan - - - - - - -
TV hockey /TOMY/Japan - - - - - - -
Zuba-Zuba Blade /TAKARA/Japan - - - - - - -
@ -200,6 +199,7 @@
dumped: see xavix2.cpp
2006 Let's!TVプレイ  / / Let's!TV Play NARUTO Ninja Experience ~Dattebayo~ / Bandai / Japan
2006 / / Let's play on TV! Learn! Superpower Aiueo Illustrated Book / Epochsha / Japan
@ -423,6 +423,20 @@ void xavix_state::superxavix_lowbus_map(address_map &map)
map(0x6c00, 0x6cff).ram().w(FUNC(xavix_state::bmp_palram_sh_w)).share("bmp_palram_sh");
map(0x6d00, 0x6dff).ram().w(FUNC(xavix_state::bmp_palram_l_w)).share("bmp_palram_l");
// map(0x6a40, 0x6a7f).ram().share("ext_segment_regs"); // 16x32 extended segment regs
map(0x6f78, 0x6f78).rw(FUNC(xavix_state::superxavix_chr_pal_index_r), FUNC(xavix_state::superxavix_chr_pal_index_w)); // SgdPalChrIdx
map(0x6f79, 0x6f79).rw(FUNC(xavix_state::superxavix_chr_pal_hue_r), FUNC(xavix_state::superxavix_chr_pal_hue_w)); // SgdPalChrHue
map(0x6f7a, 0x6f7a).rw(FUNC(xavix_state::superxavix_chr_pal_saturation_r), FUNC(xavix_state::superxavix_chr_pal_saturation_w)); // SgdPalChrSat
map(0x6f7b, 0x6f7b).rw(FUNC(xavix_state::superxavix_chr_pal_lightness_r), FUNC(xavix_state::superxavix_chr_pal_lightness_w)); // SgdPalChrLgt
map(0x6f7c, 0x6f7c).rw(FUNC(xavix_state::superxavix_bitmap_pal_index_r), FUNC(xavix_state::superxavix_bitmap_pal_index_w)); // SgdPalBmpAdr
map(0x6f7d, 0x6f7d).rw(FUNC(xavix_state::superxavix_bitmap_pal_hue_r), FUNC(xavix_state::superxavix_bitmap_pal_hue_w)); // SgdPalBmpHue
map(0x6f7e, 0x6f7e).rw(FUNC(xavix_state::superxavix_bitmap_pal_saturation_r), FUNC(xavix_state::superxavix_bitmap_pal_saturation_w)); // SgdPalBmpSat
map(0x6f7f, 0x6f7f).rw(FUNC(xavix_state::superxavix_bitmap_pal_lightness_r), FUNC(xavix_state::superxavix_bitmap_pal_lightness_w)); // SgdPalBmpLgt
map(0x6fb0, 0x6fc7).ram().share("bmp_base");
// extended external bus stuff (possible banking control?)
map(0x7909, 0x7909).w(FUNC(xavix_state::extended_extbus_reg0_w));
map(0x790b, 0x790b).w(FUNC(xavix_state::extended_extbus_reg1_w));
@ -432,7 +446,7 @@ void xavix_state::superxavix_lowbus_map(address_map &map)
map(0x7a20, 0x7a22).rw("xavix2002io", FUNC(xavix2002_io_device::pio_out_r), FUNC(xavix2002_io_device::pio_out_w));
map(0x7a30, 0x7a32).r("xavix2002io", FUNC(xavix2002_io_device::pio_in_r));
map(0x6fb0, 0x6fc7).ram().share("bmp_base");
map(0x7ffd, 0x7ffd).nopw(); // looks like a watchdog?
}

View File

@ -425,6 +425,29 @@ private:
void spriteregs_w(uint8_t data);
void superxavix_bitmap_pal_index_w(uint8_t data);
uint8_t superxavix_bitmap_pal_index_r();
void superxavix_chr_pal_index_w(uint8_t data);
uint8_t superxavix_chr_pal_index_r();
uint8_t superxavix_bitmap_pal_hue_r();
uint8_t superxavix_bitmap_pal_saturation_r();
uint8_t superxavix_bitmap_pal_lightness_r();
uint8_t superxavix_chr_pal_hue_r();
uint8_t superxavix_chr_pal_saturation_r();
uint8_t superxavix_chr_pal_lightness_r();
uint8_t superxavix_pal_hue_r(bool bitmap);
uint8_t superxavix_pal_saturation_r(bool bitmap);
uint8_t superxavix_pal_lightness_r(bool bitmap);
void superxavix_bitmap_pal_hue_w(uint8_t data);
void superxavix_bitmap_pal_saturation_w(uint8_t data);
void superxavix_bitmap_pal_lightness_w(uint8_t data);
void superxavix_chr_pal_hue_w(uint8_t data);
void superxavix_chr_pal_saturation_w(uint8_t data);
void superxavix_chr_pal_lightness_w(uint8_t data);
void superxavix_pal_hue_w(uint8_t data, bool bitmap);
void superxavix_pal_saturation_w(uint8_t data, bool bitmap);
void superxavix_pal_lightness_w(uint8_t data, bool bitmap);
uint8_t pal_ntsc_r();
virtual uint8_t lightgun_r(offs_t offset) { logerror("%s: unhandled lightgun_r %d\n", machine().describe_context(), offset); return 0xff; }
@ -516,6 +539,9 @@ private:
uint8_t m_timer_baseval = 0;
uint8_t m_superxavix_pal_index = 0;
uint8_t m_superxavix_bitmap_pal_index = 0;
int16_t get_vectors(int which, int half);
// raster IRQ
@ -552,6 +578,13 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
uint8_t get_pen_lightness_from_dat(uint16_t dat);
uint8_t get_pen_saturation_from_dat(uint16_t dat);
uint8_t get_pen_hue_from_dat(uint16_t dat);
uint16_t apply_pen_lightness_to_dat(uint16_t dat, uint16_t lightness);
uint16_t apply_pen_saturation_to_dat(uint16_t dat, uint16_t saturation);
uint16_t apply_pen_hue_to_dat(uint16_t dat, uint16_t hue);
void update_pen(int pen, uint8_t shval, uint8_t lval);
void draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tile, int bpp, int xpos, int ypos, int drawheight, int drawwidth, int flipx, int flipy, int pal, int zval, int line);
void draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which);
@ -634,6 +667,7 @@ public:
void xavix2002_i2c_24c08(machine_config &config);
void xavix2002_i2c_24c04(machine_config &config);
void xavix2002_i2c_24c02(machine_config &config);
void xavix2002_i2c_mrangbat(machine_config& config);
protected:

View File

@ -4,7 +4,7 @@
XaviX 2
unknown architecture, does not appear to be 6502 derived like XaviX / SuperXaviX
RISC-like architecture, not 6502-derived like XaviX / SuperXaviX
die is marked "SSD 2002-2004 NEC 800208-51"
@ -12,12 +12,14 @@
#include "emu.h"
#include "screen.h"
#include "emupal.h"
#include "softlist.h"
#include "speaker.h"
#include "cpu/xavix2/xavix2.h"
#include "machine/i2cmem.h"
#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
#include <algorithm>
@ -125,7 +127,7 @@ protected:
void pio_mode_w(offs_t offset, u32 data, u32 mem_mask);
u32 pio_mode_r(offs_t offset);
virtual void pio_update() = 0;
virtual void pio_update();
void pio_w(offs_t offset, u32 data, u32 mem_mask);
u32 pio_r();
@ -491,6 +493,10 @@ u32 xavix2_state::pio_mode_r(offs_t offset)
return m_pio_mode[offset];
}
void xavix2_state::pio_update()
{
}
void naruto_state::pio_update()
{
if (BIT(m_pio_mask_out, 21))
@ -705,6 +711,10 @@ static INPUT_PORTS_START(domyos)
PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_BUTTON16) PORT_PLAYER(2)
INPUT_PORTS_END
static INPUT_PORTS_START( dabj )
PORT_START("pio")
INPUT_PORTS_END
void xavix2_state::config(machine_config &config)
{
// unknown CPU 'SSD 2002-2004 NEC 800208-51'
@ -745,6 +755,11 @@ ROM_START( ltv_naru )
ROM_LOAD( "naruto.bin", 0x000000, 0x800000, CRC(e3465ad2) SHA1(13e3d2de5d5a084635cab158f3639a1ea73265dc) )
ROM_END
ROM_START( epo_dabj )
ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "dabj.u3", 0x000000, 0x800000, CRC(9ebc1384) SHA1(38abaebd05bc9ab300ee5fbf37bd88ce9cbd20e1) )
ROM_END
ROM_START( domfitad )
ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "xpfitnessadventure.bin", 0x000000, 0x1000000, CRC(a7917081) SHA1(95ae5dc6e64a78ae060cb0e61d8b0af34a93c4ce) )
@ -758,7 +773,10 @@ ROM_END
} // anonymous namespace
// Let's!TVプレイ ナルト 忍者体感~だってばよ~ / バンダイ / 日本
CONS( 2006, ltv_naru, 0, 0, config, naruto, naruto_state, empty_init, "Bandai / SSD Company LTD", "Let's TV Play Naruto", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
CONS( 2006, ltv_naru, 0, 0, config, naruto, naruto_state, empty_init, "Bandai / SSD Company LTD", "Let's TV Play Naruto (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// テレビであそぼう!まなぼう! 超脳力あいうえお図鑑
CONS( 2006, epo_dabj, 0, 0, config, dabj, xavix2_state, empty_init, "Epoch / SSD Company LTD", "TV de Asobou! Manabou! Chou Nouryoku AIUEO Zukan (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// These are for the 'Domyos Interactive System' other Domyos Interactive System games can be found in xavix.cpp (the SoC is inside the cartridge, base acts as a 'TV adapter' only)

View File

@ -266,6 +266,14 @@ static INPUT_PORTS_START( xavixp )
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_CUSTOM )
INPUT_PORTS_END
static INPUT_PORTS_START( ban_ordj )
PORT_INCLUDE(xavix_i2c)
PORT_MODIFY("IN1")
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // something input related, having it high allows bypass of calibration screen
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
INPUT_PORTS_END
/* SuperXavix IO port handliner (per game) */
@ -418,6 +426,14 @@ void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config)
I2C_24C04(config, "i2cmem", 0);
}
void xavix_i2c_state::xavix2002_i2c_24c02(machine_config &config)
{
xavix2002(config);
I2C_24C02(config, "i2cmem", 0);
}
void xavix_i2c_state::xavix2002_i2c_mrangbat(machine_config &config)
{
xavix2002(config);
@ -539,6 +555,21 @@ ROM_START( tmy_thom )
ROM_LOAD( "thomastank.bin", 0x000000, 0x800000, CRC(a52a23be) SHA1(e5b3500239d9e56eb5405f7585982959e5a162da) )
ROM_END
ROM_START( ban_kksj )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "kksj.u1", 0x000000, 0x800000, CRC(8071dc36) SHA1(46f41d4185a115b27c685d1eabcd554b3c5a64b7) )
ROM_END
ROM_START( tmy_rkmj )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "rkmj.u1", 0x000000, 0x800000, CRC(80e70625) SHA1(500e287671a0822b736ed05704090d90187602ac) )
ROM_END
ROM_START( ban_ordj )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "ordj.u2", 0x000000, 0x800000, CRC(78fbb00f) SHA1(797b5495e292c36c003300ed18547e5643056149) )
ROM_END
ROM_START( epo_tfit )
ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
ROM_LOAD("tennisfitness.bin", 0x000000, 0x400000, CRC(cbf65bd2) SHA1(30b3da6f061b2dd91679db42a050f715901beb87) )
@ -627,6 +658,15 @@ CONS( 2004, epo_tfit, 0, 0, xavix2002_i2c_24c04, epo_tfit, xavix_i2c_state,
// それいけトーマス ソドー島のなかまたち
CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// TVプレイ 体感体得 結界師 方囲!定礎!結!滅!
CONS( 2007, ban_kksj, 0, 0, xavix2002_i2c_24c02, xavix_i2c, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Taitoku Kekkaishi: Houi! Jouso! Ketsu! Metsu! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// 流星のロックマン 電波変換!オン・エア!
CONS( 2007, tmy_rkmj, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Takara Tomy / Capcom / SSD Company LTD", "Ryuusei no Rockman: Denpa Henkan! On Air! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// Let's!TVプレイ 音撃バトル!仮面ライダー響鬼 決めろ!一気火勢の型
CONS( 2005, ban_ordj, 0, 0, xavix2002_i2c_24c04, ban_ordj, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Ongeki Battle! Kamen Rider Hibiki: Kimero! Ikki Kasei no Kata (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// has HT24LC16
CONS( 2008, udance, 0, 0, xavix2002, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "U-Dance", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )

View File

@ -899,6 +899,9 @@ void xavix_state::machine_start()
save_item(NAME(m_timer_baseval));
save_item(NAME(m_spritereg));
save_item(NAME(m_superxavix_pal_index));
save_item(NAME(m_superxavix_bitmap_pal_index));
save_item(NAME(m_sx_extended_extbus));
}

View File

@ -109,15 +109,300 @@ void xavix_state::spriteram_w(offs_t offset, uint8_t data)
}
}
void xavix_state::superxavix_bitmap_pal_index_w(uint8_t data)
{
m_superxavix_bitmap_pal_index = data;
}
uint8_t xavix_state::superxavix_bitmap_pal_index_r()
{
return m_superxavix_bitmap_pal_index;
}
void xavix_state::superxavix_chr_pal_index_w(uint8_t data)
{
m_superxavix_pal_index = data;
}
uint8_t xavix_state::superxavix_chr_pal_index_r()
{
return m_superxavix_pal_index;
}
uint8_t xavix_state::superxavix_bitmap_pal_hue_r()
{
return superxavix_pal_hue_r(true);
}
uint8_t xavix_state::superxavix_chr_pal_hue_r()
{
return superxavix_pal_hue_r(false);
}
uint8_t xavix_state::superxavix_pal_hue_r(bool bitmap)
{
u8 *sh, *sl;
u8 ind;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
}
uint16_t dat = (sh[ind]) | (sl[ind] << 8);
uint16_t val = get_pen_hue_from_dat(dat);
return val << 2;
}
uint8_t xavix_state::superxavix_bitmap_pal_saturation_r()
{
return superxavix_pal_saturation_r(true);
}
uint8_t xavix_state::superxavix_chr_pal_saturation_r()
{
return superxavix_pal_saturation_r(false);
}
uint8_t xavix_state::superxavix_pal_saturation_r(bool bitmap)
{
u8 *sh, *sl;
u8 ind;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
}
uint16_t dat = (sh[ind]) | (sl[ind] << 8);
uint16_t val = get_pen_saturation_from_dat(dat);
return val << 4;
}
uint8_t xavix_state::superxavix_bitmap_pal_lightness_r()
{
return superxavix_pal_lightness_r(true);
}
uint8_t xavix_state::superxavix_chr_pal_lightness_r()
{
return superxavix_pal_lightness_r(false);
}
uint8_t xavix_state::superxavix_pal_lightness_r(bool bitmap)
{
u8 *sh, *sl;
u8 ind;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
}
uint16_t dat = (sh[ind]) | (sl[ind] << 8);
uint16_t val = get_pen_lightness_from_dat(dat);
return val << 2;
}
void xavix_state::superxavix_bitmap_pal_hue_w(uint8_t data)
{
superxavix_pal_hue_w(data, true);
}
void xavix_state::superxavix_chr_pal_hue_w(uint8_t data)
{
superxavix_pal_hue_w(data, false);
}
void xavix_state::superxavix_pal_hue_w(uint8_t data, bool bitmap)
{
u8 *sh, *sl;
u8 ind;
int offset;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
offset = 256;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
offset = 0;
}
uint16_t olddat = (sh[ind]) | (sl[ind] << 8);
uint16_t newdata = apply_pen_hue_to_dat(olddat, data >> 2);
sh[ind] = newdata & 0xff;
sl[ind] = (newdata >> 8) & 0xff;
update_pen(ind+offset, sh[ind], sl[ind]);
}
void xavix_state::superxavix_bitmap_pal_saturation_w(uint8_t data)
{
superxavix_pal_saturation_w(data, true);
}
void xavix_state::superxavix_chr_pal_saturation_w(uint8_t data)
{
superxavix_pal_saturation_w(data, false);
}
void xavix_state::superxavix_pal_saturation_w(uint8_t data, bool bitmap)
{
u8 *sh, *sl;
u8 ind;
int offset;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
offset = 256;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
offset = 0;
}
uint16_t olddat = (sh[ind]) | (sl[ind] << 8);
uint16_t newdata = apply_pen_saturation_to_dat(olddat, data >> 4);
sh[ind] = newdata & 0xff;
sl[ind] = (newdata >> 8) & 0xff;
update_pen(ind+offset, sh[ind], sl[ind]);
}
void xavix_state::superxavix_bitmap_pal_lightness_w(uint8_t data)
{
superxavix_pal_lightness_w(data, true);
}
void xavix_state::superxavix_chr_pal_lightness_w(uint8_t data)
{
superxavix_pal_lightness_w(data, false);
}
void xavix_state::superxavix_pal_lightness_w(uint8_t data, bool bitmap)
{
u8 *sh, *sl;
u8 ind;
int offset;
if (bitmap)
{
sh = m_bmp_palram_sh;
sl = m_bmp_palram_l;
ind = m_superxavix_bitmap_pal_index;
offset = 256;
}
else
{
sh = m_palram_sh;
sl = m_palram_l;
ind = m_superxavix_pal_index;
offset = 0;
}
uint16_t olddat = (sh[ind]) | (sl[ind] << 8);
uint16_t newdata = apply_pen_lightness_to_dat(olddat, data >> 2);
sh[ind] = newdata & 0xff;
sl[ind] = (newdata >> 8) & 0xff;
update_pen(ind+offset, sh[ind], sl[ind]);
}
uint16_t xavix_state::apply_pen_lightness_to_dat(uint16_t dat, uint16_t lightness)
{
lightness &= 0x3f;
dat &= ~0x1f00;
dat &= ~0x8000;
dat |= (lightness & 0x3e) << 7;
dat |= (lightness & 0x01) << 15;
return dat;
}
uint16_t xavix_state::apply_pen_saturation_to_dat(uint16_t dat, uint16_t saturation)
{
saturation &= 0x0f;
dat &= ~0x00e0;
dat &= ~0x4000;
dat |= (saturation & 0x0e) << 4;
dat |= (saturation & 0x01) << 14;
return dat;
}
uint16_t xavix_state::apply_pen_hue_to_dat(uint16_t dat, uint16_t hue)
{
hue &= 0x3f;
dat &= ~0x001f;
dat &= ~0x2000;
dat |= (hue & 0x3e) >> 1;
dat |= (hue & 0x01) << 13;
return dat;
}
uint8_t xavix_state::get_pen_lightness_from_dat(uint16_t dat)
{
uint8_t y_raw = (dat & 0x1f00) >> 7;
y_raw |= (dat & 0x8000) >> 15; // currently we don't make use of this bit
return y_raw;
}
uint8_t xavix_state::get_pen_saturation_from_dat(uint16_t dat)
{
uint8_t c_raw = (dat & 0x00e0) >> 4;
c_raw |= (dat & 0x4000) >> 14; // currently we don't make use of this bit
return c_raw;
}
uint8_t xavix_state::get_pen_hue_from_dat(uint16_t dat)
{
uint8_t h_raw = (dat & 0x001f) << 1;
h_raw |= (dat & 0x2000) >> 13; // currently we don't make use of this bit
return h_raw;
}
void xavix_state::update_pen(int pen, uint8_t shval, uint8_t lval)
{
uint16_t dat;
dat = shval;
dat |= lval << 8;
int y_raw = (dat & 0x1f00) >> 8;
int c_raw = (dat & 0x00e0) >> 5;
int h_raw = (dat & 0x001f) >> 0;
int y_raw = get_pen_lightness_from_dat(dat) >> 1;
int c_raw = get_pen_saturation_from_dat(dat) >> 1;
int h_raw = get_pen_hue_from_dat(dat) >> 1;
// The dividers may be dynamic
double y = y_raw / 20.0;