Skip to content

Commit

Permalink
sega/sega_beena.cpp: Add TV Ocha-Ken barcode card rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
qufb committed Nov 21, 2023
1 parent f356a3b commit b5d5e50
Show file tree
Hide file tree
Showing 3 changed files with 286 additions and 10 deletions.
170 changes: 170 additions & 0 deletions hash/tvochken.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<softwarelist name="tvochken" description="TV Ocha-Ken ROM and barcode cards">

<software name="tvochken" supported="yes">
<description>TV to Ocha-Satsu Ocha-Ken Hotsu to Seikatsu</description>
<year>2005</year>
<publisher>Sega Toys</publisher>
<info name="alt_title" value="テレビとお茶札 お茶犬『ほっ』と生活"/>
<part name="cart" interface="tvochken">
<dataarea name="rom" size="0x400000" width="32" endianness="big">
<rom loadflag="load16_word_swap" name="m5m29gt320vp-80.u3" size="0x400000" crc="75c1fbc1" sha1="b07adcabaadb8b684335f52dd953f4696585c819"/>
</dataarea>
<dataarea name="card1" size="0x4f1749">
<rom name="0 - 0001.png" size="0x4f1749" crc="c5432bb7" sha1="375fb553245e88d37977f6a831ede72cf7c94eb8"/>
</dataarea>
<dataarea name="card2" size="0x4df6f0">
<rom name="0 - 0002.png" size="0x4df6f0" crc="6c83c38a" sha1="616a796615423e1eaa05a2637cd606d5816c7f01"/>
</dataarea>
<dataarea name="card3" size="0x4f220b">
<rom name="0 - 0003.png" size="0x4f220b" crc="a14f9d50" sha1="a3bce401fe3c70bef046addb4cbc31c5e0f04f0f"/>
</dataarea>
<dataarea name="card4" size="0x4f1602">
<rom name="0 - 0004.png" size="0x4f1602" crc="1c124ccf" sha1="840a3ee78ae0995b9b9fa9428da18d0ecd293f88"/>
</dataarea>
<dataarea name="card5" size="0x505a3a">
<rom name="0 - 0005.png" size="0x505a3a" crc="c7190bb3" sha1="e4d1307971c053fc7ad98b6b8bea19a639c88084"/>
</dataarea>
<dataarea name="card6" size="0x50cbd4">
<rom name="0 - 0006.png" size="0x50cbd4" crc="0ef3b099" sha1="b736179f3b34b8301b32f2f6ded732634c9c0f76"/>
</dataarea>
<dataarea name="card7" size="0x4da934">
<rom name="0 - 0007.png" size="0x4da934" crc="66e119c6" sha1="d3ddc0bc4bea354e767ff6cc9cf152ce84bd2b24"/>
</dataarea>
<dataarea name="card8" size="0x4eff47">
<rom name="0 - 0008.png" size="0x4eff47" crc="df475cf6" sha1="26ed60fb032b41464cc93582ab51b05ec61abf5c"/>
</dataarea>
<dataarea name="card9" size="0x4f423e">
<rom name="0 - 0009.png" size="0x4f423e" crc="d3f5b52c" sha1="157ec2a13e90381c5348352aafeffeb63f453f9c"/>
</dataarea>
<dataarea name="card10" size="0x58a781">
<rom name="0 - 0010.png" size="0x58a781" crc="dfae4f5e" sha1="515cd302381d9dcbefa69adaaa4c8bc13b661877"/>
</dataarea>
<dataarea name="card11" size="0x5b058b">
<rom name="0 - 0011.png" size="0x5b058b" crc="5bb62726" sha1="6199c01eb5fcc7de7fe90e89f3ee7140705caeba"/>
</dataarea>
<dataarea name="card12" size="0x5a279b">
<rom name="0 - 0012.png" size="0x5a279b" crc="b5d1111e" sha1="8b05ce9c1f74563ab9735645a5eb89a3cada74a5"/>
</dataarea>
<dataarea name="card13" size="0x4dc9ad">
<rom name="0 - 0013.png" size="0x4dc9ad" crc="707edf49" sha1="e7deac18147217e8128b5d8c440fc605c530da81"/>
</dataarea>
<dataarea name="card14" size="0x4ce76b">
<rom name="0 - 0014.png" size="0x4ce76b" crc="5c3ec4c2" sha1="a4954ed1710a87ee673d3a15b6dfdf5af46e80d6"/>
</dataarea>
<dataarea name="card15" size="0x531c9f">
<rom name="0 - 0015.png" size="0x531c9f" crc="3507b23e" sha1="ea12fa59718cdbbef6d7728e555176b76692c89b"/>
</dataarea>
<dataarea name="card16" size="0x5506d3">
<rom name="0 - 0016.png" size="0x5506d3" crc="6c3b995c" sha1="9f63ffa5ffec951af65dfb5ce432f13b0e1bd92b"/>
</dataarea>
<dataarea name="card17" size="0x50cfbd">
<rom name="0 - 0017.png" size="0x50cfbd" crc="a3cdf730" sha1="89035eeb714f45cac2ef0c9e8ee86d5ba50d04bb"/>
</dataarea>
<dataarea name="card18" size="0x4c9ed3">
<rom name="0 - 0018.png" size="0x4c9ed3" crc="8a0eaeb4" sha1="27131d1a642a27cea5ae1bb0c57fcd20d7e46f28"/>
</dataarea>
<dataarea name="card19" size="0x4e43a3">
<rom name="0 - 0019.png" size="0x4e43a3" crc="425cfb05" sha1="e62e0ae7da3aa45afc5d7744277288df32925b96"/>
</dataarea>
<dataarea name="card20" size="0x4a67a5">
<rom name="0 - 0020.png" size="0x4a67a5" crc="1b3ddf36" sha1="f89981193f4a0f5438a8a4d05b29bba5832712f2"/>
</dataarea>
<dataarea name="card21" size="0x595884">
<rom name="0 - 0021.png" size="0x595884" crc="812535ac" sha1="0e88309e4629e352542e0f77c282add67d9e0eff"/>
</dataarea>
<dataarea name="card22" size="0x59e757">
<rom name="0 - 0022.png" size="0x59e757" crc="a3af7a1e" sha1="2ce48f5948d2b4aed80cff97e4443fb377a0dc75"/>
</dataarea>
<dataarea name="card23" size="0x5845cc">
<rom name="0 - 0023.png" size="0x5845cc" crc="7962f20b" sha1="1cdb601803881b6161818902253d3e2d5c0676ca"/>
</dataarea>
<dataarea name="card24" size="0x4cbaec">
<rom name="0 - 0024.png" size="0x4cbaec" crc="3fb7395c" sha1="2e9631bc27edc15e5be25c22a81f6f51fc1c6f20"/>
</dataarea>
<dataarea name="card25" size="0x57375d">
<rom name="0 - 0025.png" size="0x57375d" crc="b6dc9acd" sha1="fff3ebbea33f7261ae8ae4d4c7c3847b9cf3f88a"/>
</dataarea>
<dataarea name="card26" size="0x583f9c">
<rom name="0 - 0026.png" size="0x583f9c" crc="46033178" sha1="ef265ce7fafa88cebe4d8c199687e58b0a1375a3"/>
</dataarea>
<dataarea name="card27" size="0x586407">
<rom name="0 - 0027.png" size="0x586407" crc="2278b79b" sha1="911200fd9b2662e60849ad8d0d818ffc77166815"/>
</dataarea>
<dataarea name="card28" size="0x4e0094">
<rom name="0 - 0028.png" size="0x4e0094" crc="4ecefa48" sha1="8bb7c0e2a1f117e7c1c205fb6f68dd3b79d3608f"/>
</dataarea>
<dataarea name="card29" size="0x58ee04">
<rom name="0 - 0029.png" size="0x58ee04" crc="52cadc27" sha1="820a47efb41e1e52e3a0e75b8550983e2890fe23"/>
</dataarea>
<dataarea name="card30" size="0x59ffec">
<rom name="0 - 0030.png" size="0x59ffec" crc="0bedfd6a" sha1="781cd0be18c3a29015317ace95e3749182a9c5e5"/>
</dataarea>
<dataarea name="card31" size="0x52a465">
<rom name="0 - 0031.png" size="0x52a465" crc="6f1fb6df" sha1="430c170759010daa72318bd6bac07637fb03ac66"/>
</dataarea>
<dataarea name="card32" size="0x5794b4">
<rom name="0 - 0032.png" size="0x5794b4" crc="0bd168a3" sha1="63eb11961046c3c382e695f0cf8292f2dbba0861"/>
</dataarea>
<dataarea name="card33" size="0x4b665e">
<rom name="0 - 0033.png" size="0x4b665e" crc="03cf3ac0" sha1="55d58cb97d5f464982d3cba4915a78e50110dc28"/>
</dataarea>
<dataarea name="card34" size="0x5992ff">
<rom name="0 - 0034.png" size="0x5992ff" crc="4c1c285c" sha1="cde5d284ffa9a9a44c88529692e5bc9f6fffb0c7"/>
</dataarea>
<dataarea name="card35" size="0x523acd">
<rom name="0 - 0035.png" size="0x523acd" crc="612aa0c0" sha1="b302fbad590fb8db3624884614c9a8bd8108acac"/>
</dataarea>
<dataarea name="card36" size="0x5213b6">
<rom name="0 - 0036.png" size="0x5213b6" crc="befc985e" sha1="d1caa434da81b2d1e0773d5edc147800c6d48b7a"/>
</dataarea>
<dataarea name="card37" size="0x4ff7ee">
<rom name="0 - 0037.png" size="0x4ff7ee" crc="eb1b4883" sha1="b5a36c627f224dd7d1d6953ac68dcd3ec055950c"/>
</dataarea>
<dataarea name="card38" size="0x519ced">
<rom name="0 - 0038.png" size="0x519ced" crc="ccc3807c" sha1="1834dea6b2246452b54b0f0136539e9b87cc85d1"/>
</dataarea>
<dataarea name="card39" size="0x5322d6">
<rom name="0 - 0039.png" size="0x5322d6" crc="e38dba54" sha1="e42c4a29a384f177bbf3658a8f28306985d5cb78"/>
</dataarea>
<dataarea name="card40" size="0x4e717c">
<rom name="0 - 0040.png" size="0x4e717c" crc="d5222fa8" sha1="32f55c769f00e44beff9539241ab974bb94ebe98"/>
</dataarea>
<dataarea name="card41" size="0x512de5">
<rom name="0 - 0041.png" size="0x512de5" crc="5d763c3c" sha1="eb7e09b68e77bfe92fe2699c8c2010f9e7ea0dfb"/>
</dataarea>
<dataarea name="card42" size="0x500827">
<rom name="0 - 0042.png" size="0x500827" crc="b4413674" sha1="f2255d47156f7fb45043517928b1afa86cc2c8b8"/>
</dataarea>
<dataarea name="card43" size="0x516bd5">
<rom name="0 - 0043.png" size="0x516bd5" crc="04c35610" sha1="e7867e16ad3acdb5459059381880aceb11935475"/>
</dataarea>
<dataarea name="card44" size="0x51e8b7">
<rom name="0 - 0044.png" size="0x51e8b7" crc="5e5cde23" sha1="67161d59ae158286c86f0800366206daa8ff080e"/>
</dataarea>
<dataarea name="card45" size="0x51a367">
<rom name="0 - 0045.png" size="0x51a367" crc="2d06e5d6" sha1="7d82cbbb0cff2ad1710dfb025ff5517dd3fb6321"/>
</dataarea>
<dataarea name="card46" size="0x509b6a">
<rom name="0 - 0046.png" size="0x509b6a" crc="91b3cf44" sha1="7be818e4dbfa9ea8bad46270edb71fa899be6aa6"/>
</dataarea>
<dataarea name="card47" size="0x50b36f">
<rom name="0 - 0047.png" size="0x50b36f" crc="106f037e" sha1="eb2a5d056b5f19c53233765c813cdfb53746f30b"/>
</dataarea>
<dataarea name="card48" size="0x5073bd">
<rom name="0 - 0048.png" size="0x5073bd" crc="f4f2efeb" sha1="07774d7bde672d5b40142448691689edafe63421"/>
</dataarea>
<dataarea name="card49" size="0x521ed6">
<rom name="0 - 0049.png" size="0x521ed6" crc="0cf9a850" sha1="b92be28de3c8284d75045b161a37e8eb52c16e83"/>
</dataarea>
<dataarea name="card50" size="0x4f7f34">
<rom name="0 - 0050.png" size="0x4f7f34" crc="a918012a" sha1="a5a96c2c0a2ec76a3ec1784faaade33e0b8743e2"/>
</dataarea>
</part>
</software>

</softwarelist>
73 changes: 73 additions & 0 deletions src/mame/layout/tvochken.lay
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?xml version="1.0"?>
<!--
license:CC0-1.0
-->
<mamelayout version="2">
<element name="card">
<!-- force maximum state -->
<rect state="0"><color alpha="0" /></rect>
<rect state="49"><color alpha="0" /></rect>
</element>

<view name="Default View">
<screen index="0">
<bounds x="0" y="0" width="4" height="3" />
</screen>

<element id="card" ref="card">
<bounds x="0" y="3.1" width="4" height="2.66666" />
</element>
</view>

<script><![CDATA[
file:set_resolve_tags_callback(
function ()
-- get memory regions for card scans
local cards = { }
for i = 1, 50 do
local card = file.device:memregion(string.format('cartslot:card%u', i))
if card ~= nil then
cards[i] = card
else
break
end
end
-- card items are needed on-the-fly
local card = file.views['Default View'].items['card']
-- recompute target pen cursor size and area when necessary
local curxoffs, curyoffs, curxscale, curyscale, curwidth, curheight
file.views['Default View']:set_recomputed_callback(
function ()
local lbounds = card.bounds
curwidth = lbounds.width / 10
curheight = lbounds.height / 14
curxoffs = lbounds.x0 - (curwidth * 0.5)
curyoffs = lbounds.y0 - (curheight * 0.5)
curxscale = lbounds.width / 255
curyscale = lbounds.height / 255
end)
-- make card display respond to card selection input
local cardctrl = file.device:ioport('CARDS')
local function get_card() return cardctrl:read() end
card:set_element_state_callback(get_card)
-- render cards
local function draw_card(n, dest)
local card = cards[n]
if card ~= nil then
-- TODO: reduce temporary memory usage when I/O classes are exposed to Lua
local data = card:read(0, card.size)
local image = emu.bitmap_argb32.load(data)
image:resample(dest)
end
end
file.elements['card']:set_draw_callback(
function (state, bitmap)
draw_card((state + 1) & 0x3f, bitmap)
end)
end)
]]></script>
</mamelayout>
53 changes: 43 additions & 10 deletions src/mame/sega/sega_beena.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
#include "screen.h"

#include "beena.lh"
#include "tvochken.lh"

#define VERBOSE (0)
#include "logmacro.h"
Expand Down Expand Up @@ -1721,13 +1722,9 @@ void sega_9h0_0008_state::sega_9h0_0008(machine_config &config)

GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty);

config.set_default_layout(layout_beena);

SPEAKER(config, "speaker").front_center();
AP2010PCM(config, m_pcm); // Unknown clock
m_pcm->add_route(ALL_OUTPUTS, "speaker", 1.0);

SOFTWARE_LIST(config, "cart_list").set_original("sega_beena_cart");
}


Expand Down Expand Up @@ -1770,6 +1767,10 @@ void sega_beena_state::sega_beena(machine_config &config)
{
sega_9h0_0008(config);

config.set_default_layout(layout_beena);

SOFTWARE_LIST(config, "cart_list").set_original("sega_beena_cart");

GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "sega_beena_cart");
m_cart->set_endian(ENDIANNESS_BIG);
m_cart->set_width(GENERIC_ROM32_WIDTH);
Expand Down Expand Up @@ -1980,6 +1981,8 @@ class tvochken_state : public sega_9h0_0008_state

virtual uint32_t io_expansion_r() override;

void tvochken(machine_config &config);

private:
enum card_state : uint8_t
{
Expand All @@ -1991,6 +1994,7 @@ class tvochken_state : public sega_9h0_0008_state
virtual void machine_start() override;
virtual void machine_reset() override;

DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
virtual void install_game_rom() override;

required_ioport m_io_buttons;
Expand All @@ -2005,6 +2009,21 @@ class tvochken_state : public sega_9h0_0008_state
uint8_t m_card_status;
};

void tvochken_state::tvochken(machine_config &config)
{
sega_9h0_0008(config);

config.set_default_layout(layout_tvochken);

SOFTWARE_LIST(config, "cart_list").set_original("tvochken");

GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tvochken");
m_cart->set_endian(ENDIANNESS_BIG);
m_cart->set_width(GENERIC_ROM32_WIDTH);
m_cart->set_device_load(FUNC(tvochken_state::cart_load));
m_cart->set_must_be_loaded(false);
}

void tvochken_state::machine_start()
{
sega_9h0_0008_state::machine_start();
Expand All @@ -2031,6 +2050,20 @@ void tvochken_state::machine_reset()
m_card_status = 0;
}

DEVICE_IMAGE_LOAD_MEMBER(tvochken_state::cart_load)
{
uint32_t const size = m_cart->common_get_size("rom");

m_cart->rom_alloc(size, GENERIC_ROM32_WIDTH, ENDIANNESS_BIG);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");

if (!image.loaded_through_softlist()) {
return std::make_pair(image_error::UNSUPPORTED, "Must be loaded through softlist");
}

return std::make_pair(std::error_condition(), std::string());
}

/**
* Combines all inputs:
* - Pressed buttons
Expand Down Expand Up @@ -2123,8 +2156,11 @@ uint32_t tvochken_state::io_expansion_r()

void tvochken_state::install_game_rom()
{
memory_region *rom = memregion("flash_rom");
m_maincpu->space(AS_PROGRAM).install_rom(ROM_FLASH_BASE, ROM_FLASH_BASE + 0x7fffff, 0x800000, rom->base());
if (m_cart->exists()) {
// Note that this is an internal flash ROM, but loaded with a cart interface
memory_region *rom = m_cart->memregion("cart:rom");
m_maincpu->space(AS_PROGRAM).install_rom(ROM_FLASH_BASE, ROM_FLASH_BASE + 0x7fffff, 0x800000, rom->base());
}
}


Expand Down Expand Up @@ -2220,13 +2256,10 @@ ROM_END

ROM_START( tvochken )
ROM_9H0_0008

ROM_REGION32_BE( 0x400000, "flash_rom", ROMREGION_ERASEFF )
ROM_LOAD16_WORD_SWAP( "m5m29gt320vp-80.u3", 0x00000000, 0x400000, CRC(75c1fbc1) SHA1(b07adcabaadb8b684335f52dd953f4696585c819) )
ROM_END

} // anonymous namespace

// year, name, parent, compat, machine, input, class, init, company, fullname, flags
CONS( 2005, beena, 0, 0, sega_beena, sega_beena, sega_beena_state, empty_init, "Sega", "Advanced Pico BEENA", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_TIMING|MACHINE_IMPERFECT_SOUND )
CONS( 2005, tvochken, 0, 0, sega_9h0_0008, tvochken, tvochken_state, empty_init, "Sega", "TV Ocha-Ken", MACHINE_REQUIRES_ARTWORK|MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_TIMING|MACHINE_IMPERFECT_SOUND )
CONS( 2005, tvochken, 0, 0, tvochken, tvochken, tvochken_state, empty_init, "Sega", "TV Ocha-Ken", MACHINE_REQUIRES_ARTWORK|MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_TIMING|MACHINE_IMPERFECT_SOUND )

0 comments on commit b5d5e50

Please sign in to comment.