(MESS) famicom: added support for loading/saving BASIC programs from/to

cassette. wav files supported only. [Fabio Priuli]

(MESS) Added software list for BASIC programs saved to tape [Anna Wu, UglyJoe, Fabio Priuli]

If anyone has more Family BASIC tapes or other cassettes for Famicom games or add-ons (e.g. Bandai Karaoke or Fukutake Study Box) 
or for some chinese clones (ABM, or Bridge, or any other), please contact us.
This commit is contained in:
Fabio Priuli 2013-06-15 08:42:49 +00:00
parent ee99480ea1
commit 4a673c07aa
5 changed files with 292 additions and 7 deletions

1
.gitattributes vendored
View File

@ -91,6 +91,7 @@ hash/electron_cart.xml svneol=native#text/xml
hash/ep64_cart.xml svneol=native#text/xml
hash/ep64_cass.xml svneol=native#text/xml
hash/ep64_flop.xml svneol=native#text/xml
hash/famicom_cass.xml svneol=native#text/xml
hash/famicom_flop.xml svneol=native#text/xml
hash/fm77av.xml svneol=native#text/xml
hash/fm7_cass.xml svneol=native#text/xml

258
hash/famicom_cass.xml Normal file
View File

@ -0,0 +1,258 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="famicom_cass" description="Nintendo Famicom Family BASIC cassettes">
<!--
This list is a bit peculiar, since it contains cassette images obtained on a FC
by saving BASIC programs typed in from magazines, books, or homebrew
It's so difficult to find any of these, that they are definitely worth preservation!
-->
<software name="hero">
<description>Hero</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires BASIC v3" />
<part name="cass" interface="fc_cass">
<dataarea name="cass" size="3235916">
<rom name="hero.wav" size="3235916" crc="38bad4f5" sha1="696da9274a144cbc5e95b9c92df700014296f211" offset="0" />
</dataarea>
</part>
</software>
<software name="starkill">
<description>Starkiller</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="usage" value="Requires BASIC v3" />
<part name="cass" interface="fc_cass">
<dataarea name="cass" size="3255484">
<rom name="starkiller.wav" size="3255484" crc="597e2ab3" sha1="eafa3c0576dbf3ce4991abafd05e4d0bf7b3a8e4" offset="0" />
</dataarea>
</part>
</software>
<software name="urbanchm">
<description>Urban Champ</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cass" interface="fc_cass">
<dataarea name="cass" size="2318380">
<rom name="urbanchamp.wav" size="2318380" crc="1f5d0d6c" sha1="5d24f9cfa28f6cf5ee6c5188d1e9a425af0231ea" offset="0" />
</dataarea>
</part>
</software>
<!-- These come from a book titled 任天堂のファミリーコンピュータ - ファミリーベーシック - がわかる本
(Nintendo Family Computer & Family BASIC ga wakaru hon) and have been typed in and saved to
tape by UglyJoe of famicomworld -->
<software name="kanitori">
<description>Kanitori Game</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="カニトリ ゲーム" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2836972">
<rom name="bg1.wav" size="2836972" crc="eecd4278" sha1="12999d07a3cb9784008e51f97fb22543d2ab050a" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1063360">
<rom name="prog1.wav" size="1063360" crc="2ef3ed0e" sha1="3a7876bcc84e1d7b10739a4930cc248f853d1803" offset="0" />
</dataarea>
</part>
</software>
<software name="kblesson">
<description>Keyboard Lesson</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="キーボード レッスン" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2856673">
<rom name="bg2.wav" size="2856673" crc="4b8cc5ba" sha1="5783bd1e220487e047b98ddc0d9c5a5ea8b3ce41" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="969115">
<rom name="prog2.wav" size="969115" crc="2237442b" sha1="956649d436bb4d5ac0d6f47c1c04da1ee75964e6" offset="0" />
</dataarea>
</part>
</software>
<software name="moonbas2">
<description>Moon Base 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="ムーンベース2" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2895991">
<rom name="bg3.wav" size="2895991" crc="e5dcb41f" sha1="11e0c2265b693861fb2b4f1c411799b8cd3d4be1" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1019166">
<rom name="prog3.wav" size="1019166" crc="3c8ba31c" sha1="efddded189dc5700d3be6113b679f0cfe491e6fd" offset="0" />
</dataarea>
</part>
</software>
<software name="starship">
<description>Starship</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="スターシップ " />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2857206">
<rom name="bg4.wav" size="2857206" crc="0cf4637e" sha1="9dc1549662335f7b28e661ed86f809eea8c5d8ec" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1055373">
<rom name="prog4.wav" size="1055373" crc="ed38bc5d" sha1="70bbd042e9405f6b75aab5c9e483de272de3665a" offset="0" />
</dataarea>
</part>
</software>
<software name="sansugok">
<description>Sansuu Gokko</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="サンスウゴッコ" />
<info name="usage" value="Requires BASIC v2" />
<part name="cass" interface="fc_cass">
<dataarea name="cass" size="1064957">
<rom name="prog5.wav" size="1064957" crc="414aa041" sha1="57be005ead4a02edcf8354dc0e85eec83a150ed7" offset="0" />
</dataarea>
</part>
</software>
<software name="bonbon">
<description>Bound Bon-Bon</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="バウンド ボンボン" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2864660">
<rom name="bg6.wav" size="2864660" crc="d2a12690" sha1="467a34dc83f7e0607914cc0944e69c75c4a49498" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1159735">
<rom name="prog6.wav" size="1159735" crc="41e213bd" sha1="baca7c510a57ffaac8a13b5c2140653d151212c2" offset="0" />
</dataarea>
</part>
</software>
<software name="daimajin">
<description>Daimajin Attack</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="ダイマジン アタック" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2912049">
<rom name="bg7.wav" size="2912049" crc="998d0408" sha1="9e58958c03d742bd0e38322a399931c768dcea00" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1014374">
<rom name="prog7.wav" size="1014374" crc="217bb5db" sha1="601fdab3d9ad28657b16aa149f08e7880dc8c235" offset="0" />
</dataarea>
</part>
</software>
<software name="mariosht">
<description>Mario Shooter</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="マリオ シューター" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2890750">
<rom name="bg8.wav" size="2890750" crc="669d942e" sha1="029e6ee88ae890c0072377557f2ddfd3112de57e" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1105424">
<rom name="prog8.wav" size="1105424" crc="efbe8b45" sha1="065b05e8b0fc35580b3afe1c67dd8b8c36601c80" offset="0" />
</dataarea>
</part>
</software>
<software name="pingpon1">
<description>Ping Pong 1</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="ピンポン1" />
<info name="usage" value="Requires BASIC v2; load BG first, then Program" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2847622">
<rom name="bg9.wav" size="2847622" crc="0521c342" sha1="ec84d54220e3647df92f02b1e9096ada6c1cf93e" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="972310">
<rom name="prog9.wav" size="972310" crc="83f5aa2a" sha1="6d2de9de38d10ca6b55ef2daa86220af656a3768" offset="0" />
</dataarea>
</part>
</software>
<software name="pingpon2">
<description>Ping Pong 2</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<info name="alt_title" value="ピンポン2" />
<info name="usage" value="Requires BASIC v2" />
<part name="cass1" interface="fc_cass">
<feature name="part_id" value="BG Data" />
<dataarea name="cass" size="2847622">
<rom name="bg9.wav" size="2847622" crc="0521c342" sha1="ec84d54220e3647df92f02b1e9096ada6c1cf93e" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="fc_cass">
<feature name="part_id" value="Program Data" />
<dataarea name="cass" size="1057503">
<rom name="prog10.wav" size="1057503" crc="54540a93" sha1="da84c92adb6f7efcff330b629b6166a1d38ec38f" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -589,6 +589,17 @@ static const nes_cart_interface nes_crt_interface =
};
static const cassette_interface fc_cassette_interface =
{
cassette_default_formats,
NULL,
(cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED),
"fc_cass",
NULL
};
static MACHINE_CONFIG_START( nes, nes_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", N2A03, NTSC_CLOCK)
@ -618,8 +629,8 @@ static MACHINE_CONFIG_START( nes, nes_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
MCFG_NES_CARTRIDGE_ADD("nes_slot", nes_crt_interface, nes_cart, NULL)
MCFG_SOFTWARE_LIST_ADD("cart_list","nes")
MCFG_SOFTWARE_LIST_ADD("ntb_list","nes_ntbrom") // Nantettate Baseball mini_carts
MCFG_SOFTWARE_LIST_ADD("cart_list", "nes")
MCFG_SOFTWARE_LIST_ADD("ntb_list", "nes_ntbrom") // Nantettate Baseball mini_carts
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( nespal, nes )
@ -672,7 +683,10 @@ static MACHINE_CONFIG_DERIVED( famicom, nes )
MCFG_NES_CARTRIDGE_NOT_MANDATORY
MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, nes_floppy_interface)
MCFG_SOFTWARE_LIST_ADD("flop_list","famicom_flop")
MCFG_SOFTWARE_LIST_ADD("flop_list", "famicom_flop")
MCFG_CASSETTE_ADD( "tape", fc_cassette_interface )
MCFG_SOFTWARE_LIST_ADD("cass_list", "famicom_cass")
MACHINE_CONFIG_END

View File

@ -12,6 +12,7 @@
#include "video/ppu2c0x.h"
#include "machine/nes_slot.h"
#include "imagedev/cassette.h"
// official PCBs
#include "machine/nes_nxrom.h"
@ -456,7 +457,8 @@ public:
m_maincpu(*this, "maincpu"),
m_ppu(*this, "ppu"),
m_sound(*this, "nessound"),
m_cartslot(*this, "nes_slot")
m_cartslot(*this, "nes_slot"),
m_cassette(*this, "tape")
{ }
/* input_related - this part has to be cleaned up (e.g. in_2 and in_3 are not really necessary here...) */
@ -491,6 +493,7 @@ public:
required_device<ppu2c0x_device> m_ppu;
required_device<device_t> m_sound;
optional_device<nes_cart_slot_device> m_cartslot;
optional_device<cassette_image_device> m_cassette;
int nes_ppu_vidaccess(int address, int data);
void ppu_nmi(int *ppu_regs);

View File

@ -386,8 +386,15 @@ READ8_MEMBER(nes_state::fc_in0_r)
if ((exp & 0x0f) == 0x02)
{
// here we should have the tape input
ret |= 0;
// tape input
if ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_PLAY)
{
double level = m_cassette->input();
if (level < 0)
ret |= 0x00;
else
ret |= 0x02;
}
}
ret |= ((m_in_0.i0 >> m_in_0.shift) & 0x01);
@ -486,7 +493,9 @@ WRITE8_MEMBER(nes_state::fc_in0_w)
if ((exp & 0x0f) == 0x02 || (exp & 0x0f) == 0x03)
{
// here we should also have the tape output
// tape output (not fully tested)
if ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_RECORD)
m_cassette->output(((data & 0x07) == 0x07) ? +1.0 : -1.0);
if (BIT(data, 2)) // keyboard active
{