diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst index 536a1414bcf..f3f248026c3 100644 --- a/src/devices/cpu/m6502/oxavix2000.lst +++ b/src/devices/cpu/m6502/oxavix2000.lst @@ -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(); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index cfb1e58ac2e..8dc4d85078f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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 // diff --git a/src/mame/tvgames/xavix.cpp b/src/mame/tvgames/xavix.cpp index 6f061363b96..544fea87417 100644 --- a/src/mame/tvgames/xavix.cpp +++ b/src/mame/tvgames/xavix.cpp @@ -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プレイ ドラゴンボ-ルZ バトル体感かめはめ波~ おめぇとフュージョン / バンダイ / 日本 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プレイ NARUTO-ナルト- 忍者体感~だってばよ~ / バンダイ / 日本 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? } diff --git a/src/mame/tvgames/xavix.h b/src/mame/tvgames/xavix.h index 2fc6c039a01..7c79ccb826f 100644 --- a/src/mame/tvgames/xavix.h +++ b/src/mame/tvgames/xavix.h @@ -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 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: diff --git a/src/mame/tvgames/xavix2.cpp b/src/mame/tvgames/xavix2.cpp index 0df246d7842..d27134397a1 100644 --- a/src/mame/tvgames/xavix2.cpp +++ b/src/mame/tvgames/xavix2.cpp @@ -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 @@ -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プレイ NARUTO-ナルト- 忍者体感~だってばよ~ / バンダイ / 日本 -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) diff --git a/src/mame/tvgames/xavix_2002.cpp b/src/mame/tvgames/xavix_2002.cpp index 048df098b2a..42e292ea437 100644 --- a/src/mame/tvgames/xavix_2002.cpp +++ b/src/mame/tvgames/xavix_2002.cpp @@ -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 ) +// Let’s! 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 ) diff --git a/src/mame/tvgames/xavix_m.cpp b/src/mame/tvgames/xavix_m.cpp index 790df99c9f9..bba9ee7a154 100644 --- a/src/mame/tvgames/xavix_m.cpp +++ b/src/mame/tvgames/xavix_m.cpp @@ -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)); } diff --git a/src/mame/tvgames/xavix_v.cpp b/src/mame/tvgames/xavix_v.cpp index b497398c449..cbd9fec88b8 100644 --- a/src/mame/tvgames/xavix_v.cpp +++ b/src/mame/tvgames/xavix_v.cpp @@ -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;