nintendo/n64_gateway.cpp: New driver and software list submission [Foxhack, Angelo Salese] (#11177)

New software list items marked not working
------------------------------------------
n64_lodgenet.xml: 1080° Snowboarding, Donkey Kong 64, Dr. Mario, Excitebike 64, F-Zero X, Gauntlet Legends, Hydro Thunder, Kirby 64 - The Crystal Shards, The Legend of Zelda - Majora's Mask, The Legend of Zelda - Ocarina of Time, Mario Golf, Mario Kart 64, Mario Party 3, Mario Tennis, Midway's Greatest Arcade Hits Vol. 1, Mortal Kombat 4, The New Tetris, Paper Mario, Pilotwings 64, Pokémon Snap, Rampage 2 - Universal Tour, Ready 2 Rumble Boxing, Rush 2 - Extreme Racing USA, Star Fox 64, Star Wars - Rogue Squadron, Super Mario 64, Super Smash Bros., Virtual Chess, Virtual Pool 64, Wave Race 64, Yoshi's Story [Forest of Illusion]
This commit is contained in:
David 'Foxhack' Silva 2023-05-08 10:03:57 -07:00 committed by GitHub
parent ec5040453a
commit 52d75fb4c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 846 additions and 27 deletions

436
hash/n64_lodgenet.xml Normal file
View file

@ -0,0 +1,436 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<softwarelist name="n64_lodgenet" description="LodgeNet 64 software">
<software name="1080snow" supported="no">
<description>1080° Snowboarding</description>
<year>1998</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nteg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nteg00.z64" size="0x1000000" crc="67e010d2" sha1="7266eef53af8f2c21f3e3288258121f97eddfa7e" status="baddump"/>
<!-- <rom name="nteg00.i64" size="64" crc="57c7bfe2" sha1="23e06350c61dccf3ffaade55873163adabf747f7" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="dk64" supported="no">
<description>Donkey Kong 64</description>
<year>1999</year>
<publisher>Nintendo</publisher>
<info name="serial" value="ndog00"/>
<info name="usage" value="Requires 16k EEPROM." />
<info name="user_notes" value="Will crash unless you let it run up until the intro song starts to play." />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="ndog00.z64" size="0x2000000" crc="acba2248" sha1="f39476827ccf7f03707de5d79949559a4dac390b" status="baddump"/>
<!-- <rom name="ndog00.i64" size="0x40" crc="2e760dba" sha1="3ec335744c43823df3bff3dc5936f6c0611e5891" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="drmar64" supported="no">
<description>Dr. Mario 64</description>
<year>2001</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nn6g00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x400000">
<rom name="nn6g00.z64" size="0x400000" crc="dd5190ee" sha1="e63b10abfaa37aa8c7f37643d6d4e82fadb511fe" status="baddump"/>
<!-- <rom name="nn6g00.i64" size="0x40" crc="8f5aa504" sha1="87ab08a44a9df500650223a00fa067b5fa616e08" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="excitb64" supported="no">
<description>Excitebike 64 (USA)</description>
<year>2000</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nmxg00"/>
<info name="usage" value="Requires 16k EEPROM." />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nmxg00.z64" size="0x1000000" crc="a1895884" sha1="3a043dc4c8b1351ca56c3ab9bb061bd7fa99c312" status="baddump"/>
<!-- <rom name="nmxg00.i64" size="0x40" crc="ddd8f443" sha1="f78929fd62668cd0f0b7146b1e55f4430cb1f997" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="fzerox" supported="no">
<description>F-Zero X</description>
<year>1998</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nfzg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nfzg00.z64" size="0x1000000" crc="1c753f3f" sha1="2a7cd80ce10a654f3844c602268d66cdbe78230d" status="baddump"/>
<!-- <rom name="nfzg00.i64" size="0x40" crc="0ca548dc" sha1="4b7077c638883195ec8a0b94f5e96391c2fc68ab" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="gauntleg" supported="no">
<description>Gauntlet Legends</description>
<year>1999</year>
<publisher>Midway</publisher>
<info name="serial" value="ngxg02"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="ngxg02.z64" size="0x1000000" crc="1f030279" sha1="45a8d42e17993d1009c858d1847b311197b04f8c" status="baddump"/>
<!-- <rom name="ngxg02.i64" size="0x40" crc="195f583f" sha1="9ab84f08b4d54ccf627080e657afa3f1893fec92" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="hydroth" supported="no">
<description>Hydro Thunder</description>
<year>2000</year>
<publisher>Midway</publisher>
<info name="serial" value="nhtg01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="nhtg01.z64" size="0x2000000" crc="1ec49934" sha1="30794eb5c1c6a22fbb9dd530f22d153163a6ccda" status="baddump"/>
<!-- <rom name="nhtg01.i64" size="0x40" crc="2e82689d" sha1="d77158239a249f4db34c31d6e2e15b9e3e948fe0" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="kirby64" supported="no">
<description>Kirby 64 - The Crystal Shards</description>
<year>2000</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nk4g00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="nk4g00.z64" size="0x2000000" crc="70ba28e4" sha1="f615c6e10d1044c944bd4965c5471bb3f1cf5c5b" status="baddump"/>
<!-- <rom name="nk4g00.i64" size="0x40" crc="5a049d23" sha1="265413c4a08f7aead7ca7bd746f3897c74eb0029" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="zeldamaj" supported="no">
<description>The Legend of Zelda - Majora's Mask</description>
<year>2000</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nzsg00"/>
<info name="usage" value="Requires 16k EEPROM." />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="nzsg00.z64" size="0x2000000" crc="e4b47e08" sha1="ecabc86f0de743c02ba3fa0c83ab163538b00be9" status="baddump"/>
<!-- <rom name="nzsg00.i64" size="0x40" crc="8d23977d" sha1="f882460a888b8db76e8b163fd508d89e7b2e9e00" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="zeldaoot" supported="no">
<description>The Legend of Zelda - Ocarina of Time</description>
<year>1998</year>
<publisher>Nintendo</publisher>
<info name="serial" value="czlg00" />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="czlg00.z64" size="0x2000000" crc="c4d2ac1d" sha1="86ff85565e0e4f78d56f50e73df51ba29d36738a" status="baddump"/>
<!-- <rom name="czlg00.i64" size="0x40" crc="0eb0198c" sha1="45185a1938db659ee6760117cd4f742aac5e18bf" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="marioglf" supported="no">
<description>Mario Golf</description>
<year>1999</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nmfg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="nmfg00.z64" size="0x2000000" crc="1c256575" sha1="47c5f700940bb65be1145e7d6543ddf1a816ddda" status="baddump"/>
<!-- <rom name="nmfg00.i64" size="0x40" crc="df31532f" sha1="51db8e096b345ca306d34d114dc82bf36211db1d" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="mariokrt" supported="no">
<description>Mario Kart 64</description>
<year>1997</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nktg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0xc00000">
<rom name="nktg00.z64" size="0xc00000" crc="407edef1" sha1="5b0a0c8b57881f43f9314b427a84d29a46a12607" status="baddump"/>
<!-- <rom name="nktg00.i64" size="0x40" crc="de24f369" sha1="45ffe8cdac5266f261b7b1ca3d2cca7c48877bea" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="mariopr3" supported="no">
<description>Mario Party 3</description>
<year>2001</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nmvg00"/>
<info name="usage" value="Requires 16k EEPROM." />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x2000000">
<rom name="nmvg00.z64" size="0x2000000" crc="9f929c0f" sha1="9be79ddb66a6306dec7404e934c6d9fe454f42f4" status="baddump"/>
<!-- <rom name="nmvg00.i64" size="0x40" crc="80ee8f86" sha1="c2c18a6d2b2c098767d7015f06300a1fc5772a33" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="marioten" supported="no">
<description>Mario Tennis</description>
<year>2000</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nm8g00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nm8g00.z64" size="0x1000000" crc="02af0a24" sha1="1f76e775c5f2e247d6550aecc2666149c6025989" status="baddump"/>
<!-- <rom name="nm8g00.i64" size="0x40" crc="fe9453db" sha1="0c1a3f857838c2f3c6268a825b9533725aabeec8" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="midwaygh" supported="no">
<description>Midway's Greatest Arcade Hits Vol. 1</description>
<year>2000</year>
<publisher>Midway</publisher>
<info name="serial" value="naig01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x400000">
<rom name="naig01.z64" size="0x400000" crc="f3c48bb7" sha1="a36131328ad707800f6841289cdede17b3b9ee16" status="baddump"/>
<!-- <rom name="naig01.i64" size="0x40" crc="ecd08883" sha1="7ece35ed1c97dfc8c1364dbf5f4a08475237dd45" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="mk4" supported="no">
<description>Mortal Kombat 4</description>
<year>1998</year>
<publisher>Midway</publisher>
<info name="serial" value="nm4g01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nm4g01.z64" size="0x1000000" crc="ea494c11" sha1="535429836cfd4b6f533dd6dda540a19286613518" status="baddump"/>
<!-- <rom name="nm4g01.i64" size="0x40" crc="d8b7a45d" sha1="11c67fab63842aa58dc9bb41535d1924222d5a54" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="ntetris" supported="no">
<description>The New Tetris</description>
<year>1999</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nrig00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0xc00000">
<rom name="nrig00.z64" size="0xc00000" crc="d3523b37" sha1="cf52ba144788ecc9c1f7cfd61d7878c6173b1ef6" status="baddump"/>
<!-- <rom name="nrig00.i64" size="0x40" crc="b120d9e4" sha1="18ebc23a139eea274333cce9635a2852bcf3ea2a" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="papermar" supported="no">
<description>Paper Mario</description>
<year>2000</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nmqg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x4000000">
<rom name="nmqg00.z64" size="0x4000000" crc="f845af4e" sha1="c54905138e67daaddc6def94e76f626c4fbc81f7" status="baddump"/>
<!-- <rom name="nmqg00.i64" size="0x40" crc="cb9f0acf" sha1="c0b890b570121defd863c1e01ef076091e0f5b44" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="pilotwin" supported="no">
<description>Pilotwings 64</description>
<year>1996</year>
<publisher>Nintendo</publisher>
<info name="serial" value="npwg01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x800000">
<rom name="npwg01.z64" size="0x800000" crc="29fa9832" sha1="580d65f3d5cae595bf7c62456ff6ea60a4595798" status="baddump"/>
<!-- <rom name="npwg01.i64" size="0x40" crc="8756a34a" sha1="7b623ec9ae5c7be5dd2830ba5d2d7c30f98ea57b" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="pokesnap" supported="no">
<description>Pokémon Snap</description>
<year>1999</year>
<publisher>Nintendo</publisher>
<info name="serial" value="npfg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="npfg00.z64" size="0x1000000" crc="8347c9bc" sha1="b624c57e4d9e7851b422475a200fe72a300e3b1c" status="baddump"/>
<!-- <rom name="npfg00.i64" size="0x40" crc="a72187f0" sha1="7017d71fce3e1f9e55a143f530288caaa9ca0bb9" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="rampage2" supported="no">
<description>Rampage 2 - Universal Tour</description>
<year>1998</year>
<publisher>Midway</publisher>
<info name="serial" value="n2pg01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0xc00000">
<rom name="n2pg01.z64" size="0xc00000" crc="c28afc5e" sha1="0a6c390b7d1a96b93fc28faa3b11cf18400b1773" status="baddump"/>
<!-- <rom name="n2pg01.i64" size="0x40" crc="86a3477e" sha1="5aff7233b78eb203563353089be032037c9af651" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="r2rumble" supported="no">
<description>Ready 2 Rumble Boxing</description>
<year>1999</year>
<publisher>Midway</publisher>
<info name="serial" value="nrdg01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1FB5360">
<rom name="nrdg01.z64" size="0x1FB5360" crc="6d8dab04" sha1="2ad70a3243a20cd02d24103a2717c90654c173ac" status="baddump"/>
<!-- Dump size is 33,248,096. Underdump? -->
<!-- <rom name="nrdg01.i64" size="0x40" crc="eda5e440" sha1="c8f691d1e88ddf1423685b593d3b6496728448ad" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="rush2" supported="no">
<description>Rush 2 - Extreme Racing USA</description>
<year>1998</year>
<publisher>Midway</publisher>
<info name="serial" value="nr2g02"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0xc00000">
<rom name="nr2g02.z64" size="0xc00000" crc="c7e9d391" sha1="1556edd66c54bf6ec200915ac4265f078c1555a2" status="baddump"/>
<!-- <rom name="nr2g02.i64" size="0x40" crc="889f42d1" sha1="78dff0630eba88816d0ddb45bb2af101e00b7f63" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="starfox" supported="no">
<description>Star Fox 64</description>
<year>1997</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nfxg01"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0xc00000">
<rom name="nfxg01.z64" size="0xc00000" crc="637a422d" sha1="1b759465439297fbbe21c19df0924d8e75b1aa5a" status="baddump"/>
<!-- <rom name="nfxg01.i64" size="0x40" crc="f89ccbcf" sha1="0de280df6c5ed6dd7c529c1784123a79514b3d74" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="swrogue" supported="no">
<description>Star Wars - Rogue Squadron</description>
<year>1998</year>
<publisher>LucasArts</publisher>
<info name="serial" value="nrsg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nrsg00.z64" size="0x1000000" crc="b31c4197" sha1="80cdebe735d21589b692157633aae4be0b98c08e" status="baddump"/>
<!-- <rom name="nrsg00.i64" size="0x40" crc="b2c4fd5d" sha1="dccd8a3aaecf1b3d8148f56dd51be31dc1048f27" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="sm64u" supported="no">
<description>Super Mario 64</description>
<year>1996</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nsmg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x800000">
<rom name="nsmg00.z64" size="0x800000" crc="35c02d9f" sha1="37f5ed5394d885de2aff705074bd76ddc95d3cc9" status="baddump"/>
<!-- <rom name="nsmg00.i64" size="0x40" crc="1749981b" sha1="1530b8a818b0457847b9b79add0840c4c2fa0629" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="smashbro" supported="no">
<description>Super Smash Bros.</description>
<year>1999</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nalg00"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nalg00.z64" size="0x1000000" crc="1c001a5d" sha1="a0aea7d219443209c6580a501601d3151c58d3ac" status="baddump"/>
<!-- <rom name="nalg00.i64" size="0x40" crc="6c30334f" sha1="7ecf5ccbc981ecca414ebaa86eef57ce721c32e8" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="vchess" supported="no">
<description>Virtual Chess 64</description>
<year>1998</year>
<publisher>Titus</publisher>
<info name="serial" value="nvcg02" />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x400000">
<rom name="nvcg02.z64" size="0x400000" crc="ac7aa76d" sha1="90a012eb6a0cb1ac158492a6c2683f181c5b0205" status="baddump"/>
<!-- <rom name="nvcg02.i64" size="0x40" crc="e59ad6fb" sha1="8ff65140eeb055798663a0cdcac8ebcdc90cefd8" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="vpool" supported="no">
<description>Virtual Pool 64</description>
<year>1998</year>
<publisher>Crave Entertainment</publisher>
<info name="serial" value="nvrg03" />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x400000">
<rom name="nvrg03.z64" size="0x400000" crc="b58fc734" sha1="b595e31c1599d52ef363c974ea54e52f201795f2" status="baddump"/>
<!-- <rom name="nvrg03.i64" size="0x40" crc="fdc31374" sha1="0ece94752fcb28e08c4c311bc3f5d545f3b7517a" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="waverace" supported="no">
<description>Wave Race 64</description>
<year>1996</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nwrg11"/>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x800000">
<rom name="nwrg11.z64" size="0x800000" crc="6def22dc" sha1="895c70d2280d5d6cc0bd7013a135c21b688f9f80" status="baddump"/>
<!-- <rom name="nwrg11.i64" size="0x40" crc="7940a187" sha1="7954964efb9f8cbba9d1385c2a24007714cd5966" status="baddump"/> -->
</dataarea>
</part>
</software>
<software name="yoshisto" supported="no">
<description>Yoshi's Story</description>
<year>1997</year>
<publisher>Nintendo</publisher>
<info name="serial" value="nysg00"/>
<info name="usage" value="Requires 16k EEPROM." />
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x1000000">
<rom name="nysg00.z64" size="0x1000000" crc="19a7091e" sha1="f489a3cdef729cd1ade23996096fe88501e75079" status="baddump"/>
<!-- <rom name="nysg00.i64" size="0x40" crc="57c2cf72" sha1="0c721086f560a6faf9e8b1476d033e261d3f24cc" status="baddump"/> -->
</dataarea>
</part>
</software>
<!-- System utilities -->
<software name="eeerase" supported="no">
<description>eeerase</description>
<year>19??</year>
<publisher>LodgeNet</publisher>
<part name="cart" interface="n64_cart">
<dataarea name="rom" size="0x120000">
<rom name="eeerase.z64" size="0x120000" crc="2d5bc167" sha1="bcb439e41a997ee459a0b792cbbfe4a765894d67" status="baddump"/>
<!-- <rom name="eeerase.i64" size="0x40" crc="8e89a3c6" sha1="9bc23e80b0737b0f9401f8512113f8284414538b" status="baddump"/> -->
</dataarea>
</part>
</software>
</softwarelist>

View file

@ -33757,6 +33757,9 @@ supergm3 // 1996
n64 // Nintendo N64
n64dd // Nintendo N64 (64DD Attachment)
@source:nintendo/n64_gateway.cpp
n64_lodgenet
@source:nintendo/n8080.cpp
bandido // (c) 1980 Exidy
helifire // (c) 1980 Nintendo

View file

@ -17,6 +17,31 @@
#include "softlist.h"
#include "speaker.h"
class n64_console_state : public n64_state
{
public:
n64_console_state(const machine_config &mconfig, device_type type, const char *tag)
: n64_state(mconfig, type, tag)
{ }
void n64(machine_config &config);
void n64dd(machine_config &config);
private:
uint32_t dd_null_r();
void n64_map(address_map &map);
void n64dd_map(address_map &map);
DECLARE_MACHINE_START(n64dd);
INTERRUPT_GEN_MEMBER(n64_reset_poll);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void mempak_format(uint8_t* pak);
std::error_condition disk_load(device_image_interface &image);
void disk_unload(device_image_interface &image);
void rsp_imem_map(address_map &map);
void rsp_dmem_map(address_map &map);
};
uint32_t n64_console_state::dd_null_r()
{
return 0xffffffff;

View file

@ -314,33 +314,6 @@ private:
};
class n64_console_state : public n64_state
{
public:
n64_console_state(const machine_config &mconfig, device_type type, const char *tag)
: n64_state(mconfig, type, tag)
{ }
void n64(machine_config &config);
void n64dd(machine_config &config);
protected:
void n64_map(address_map &map);
private:
uint32_t dd_null_r();
void n64dd_map(address_map &map);
DECLARE_MACHINE_START(n64dd);
INTERRUPT_GEN_MEMBER(n64_reset_poll);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void mempak_format(uint8_t* pak);
std::error_condition disk_load(device_image_interface &image);
void disk_unload(device_image_interface &image);
void rsp_imem_map(address_map &map);
void rsp_dmem_map(address_map &map);
};
// device type definition
DECLARE_DEVICE_TYPE(N64PERIPH, n64_periphs)

View file

@ -0,0 +1,382 @@
// license:BSD-3-Clause
// copyright-holders:Foxhack, Angelo Salese
/*
Nintendo Gateway 64
LodgeNet was a pay-per-view system that allowed television, movie and video
game rentals on hotels starting in 1993. They entered an agreement with
Nintendo to allow the rental of their games on airplanes and hotels for a
moderate fee.
The LodgeNet 64 system was exclusively used in hotels, and consisted of a
set-top box with a customized N64 system inside. You could choose one of
several games via a TV-driven menu, which would then be downloaded to your
room's system, and you would be charged a fee for one hour of playtime.
The games were different from their retail counterparts; Games had to have
their multiplayer modes, accessories and game save support removed, plus have
additional support for the system's "halt" functions, so they would be allowed
on the system. The game controllers were custom, with additional buttons for
use with their rental system and a reset button, and did not allow the use of
Rumble Paks or Memory Paks. While the hardware allowed temporary save files,
these would be deleted from the system with a special utility before a new game
was loaded. These files were stored in encrypted format in the LodgeNet
servers, and were decrypted after being downloaded to the system. An extra file
with additional info about the game, its encryption code, and EEPROM settings
was also present.
While the development info released mentions a requirement for PAL versions of
the games, none are currently known to exist.
38 Nintendo 64 titles were made available on the service, and 31 are currently
dumped. The following games have not been found:
- Extreme-G
- Forsaken 64
- Iggy's Reckin' Balls
- Milo's Astro Lanes
- Namco Museum 64
- San Francisco Rush: Extreme Racing
- Turok 2: Seeds of Evil
These games will function, but the actual LodgeNet system is not emulated,
so the extra controller buttons and other system functions are not
implemented.
The existing roms are decrypted, and should be considered bad dumps.
TODO:
- Set-top box part;
- Extra joypad buttons;
- Doesn't really have cartslot but rather uploads games thru a DOS/V Windows 95/98 program
that works with encrypted files.
\- Notice that the available dump is "patched to work on emulators",
it normally expect a specific ISA/PCI SCSI board plus a setup/install CD-ROM;
- Host HALT override
\- maps thru the "cartslot" space, adds extra state signals to the joypad
(up + down reads halts, left + right unhalts)
*/
#include "emu.h"
#include "n64.h"
#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
class n64_gateway_state : public n64_state
{
public:
n64_gateway_state(const machine_config& mconfig, device_type type, const char* tag) :
n64_state(mconfig, type, tag)
{ }
void n64_lodgenet_map(address_map &map);
void n64_lodgenet(machine_config &config);
private:
void n64_map(address_map &map);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
void rsp_imem_map(address_map &map);
void rsp_dmem_map(address_map &map);
};
void n64_gateway_state::n64_lodgenet_map(address_map &map)
{
map(0x00000000, 0x007fffff).ram().share("rdram"); // RDRAM
map(0x03f00000, 0x03f00027).rw("rcp", FUNC(n64_periphs::rdram_reg_r), FUNC(n64_periphs::rdram_reg_w));
map(0x04000000, 0x04000fff).ram().share("rsp_dmem"); // RSP DMEM
map(0x04001000, 0x04001fff).ram().share("rsp_imem"); // RSP IMEM
map(0x04040000, 0x040fffff).rw("rcp", FUNC(n64_periphs::sp_reg_r), FUNC(n64_periphs::sp_reg_w)); // RSP
map(0x04100000, 0x041fffff).rw("rcp", FUNC(n64_periphs::dp_reg_r), FUNC(n64_periphs::dp_reg_w)); // RDP
map(0x04300000, 0x043fffff).rw("rcp", FUNC(n64_periphs::mi_reg_r), FUNC(n64_periphs::mi_reg_w)); // MIPS Interface
map(0x04400000, 0x044fffff).rw("rcp", FUNC(n64_periphs::vi_reg_r), FUNC(n64_periphs::vi_reg_w)); // Video Interface
map(0x04500000, 0x045fffff).rw("rcp", FUNC(n64_periphs::ai_reg_r), FUNC(n64_periphs::ai_reg_w)); // Audio Interface
map(0x04600000, 0x046fffff).rw("rcp", FUNC(n64_periphs::pi_reg_r), FUNC(n64_periphs::pi_reg_w)); // Peripheral Interface
map(0x04700000, 0x047fffff).rw("rcp", FUNC(n64_periphs::ri_reg_r), FUNC(n64_periphs::ri_reg_w)); // RDRAM Interface
map(0x04800000, 0x048fffff).rw("rcp", FUNC(n64_periphs::si_reg_r), FUNC(n64_periphs::si_reg_w)); // Serial Interface
map(0x05000508, 0x0500050b).lr32(NAME([] () { return 0xffffffff; }));
map(0x08000000, 0x0801ffff).ram().share("sram"); // Cartridge SRAM
map(0x10000000, 0x13ffffff).rom().region("user2", 0); // Cartridge
map(0x1fc00000, 0x1fc007bf).rom().region("user1", 0); // PIF ROM
map(0x1fc007c0, 0x1fc007ff).rw("rcp", FUNC(n64_periphs::pif_ram_r), FUNC(n64_periphs::pif_ram_w));
// map(0x0ff70000, 0x0ff70003) Host HALT control
}
void n64_gateway_state::rsp_imem_map(address_map &map)
{
map(0x00000000, 0x00000fff).ram().share("rsp_imem");
}
void n64_gateway_state::rsp_dmem_map(address_map &map)
{
map(0x00000000, 0x00000fff).ram().share("rsp_dmem");
}
static INPUT_PORTS_START( n64_lodgenet )
PORT_START("input")
PORT_CONFNAME(0x0003, 0x0001, "Controller Port 0 Device")
PORT_CONFSETTING(0x00, "None")
PORT_CONFSETTING(0x01, "Joypad")
// PORT_CONFSETTING(0x02, "Mouse")
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
// PORT_CONFNAME(0x000C, 0x0000, "Controller Port 1 Device")
// PORT_CONFSETTING(0x00, "None")
// PORT_CONFSETTING(0x04, "Joypad")
// PORT_CONFSETTING(0x08, "Mouse")
// PORT_CONFNAME(0x0030, 0x0000, "Controller Port 2 Device")
// PORT_CONFSETTING(0x00, "None")
// PORT_CONFSETTING(0x10, "Joypad")
// PORT_CONFSETTING(0x20, "Mouse")
// PORT_CONFNAME(0x00C0, 0x0000, "Controller Port 3 Device")
// PORT_CONFSETTING(0x00, "None")
// PORT_CONFSETTING(0x40, "Joypad")
// PORT_CONFSETTING(0x80, "Mouse")
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
// PORT_CONFNAME(0x0100, 0x0000, "Disk Drive")
// PORT_CONFSETTING(0x0000, "Retail")
// PORT_CONFSETTING(0x0100, "Development")
//
PORT_CONFNAME(0xC000, 0x8000, "EEPROM Size")
PORT_CONFSETTING(0x0000, "None")
PORT_CONFSETTING(0x8000, "4KB")
PORT_CONFSETTING(0xC000, "16KB")
//Player 1
// TODO: extra buttons
PORT_START("P1")
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Button A / Left Click")
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Button B / Right Click")
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Button Z")
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START ) PORT_PLAYER(1) PORT_NAME("P1 Start")
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("P1 Joypad \xE2\x86\x91") /* Up */
PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("P1 Joypad \xE2\x86\x93") /* Down */
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("P1 Joypad \xE2\x86\x90") /* Left */
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("P1 Joypad \xE2\x86\x92") /* Right */
PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Button L")
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Button R")
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Button C \xE2\x86\x91") /* Up */
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("P1 Button C \xE2\x86\x93") /* Down */
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_PLAYER(1) PORT_NAME("P1 Button C \xE2\x86\x90") /* Left */
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_PLAYER(1) PORT_NAME("P1 Button C \xE2\x86\x92") /* Right */
PORT_START("P1_ANALOG_X")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1)
PORT_START("P1_ANALOG_Y")
PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) PORT_REVERSE
PORT_START("P1_MOUSE_X")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P1_MOUSE_Y")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
//Player 2
PORT_START("P2")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P2_ANALOG_X")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P2_ANALOG_Y")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P2_MOUSE_X")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P2_MOUSE_Y")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
//Player 3
PORT_START("P3")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3_ANALOG_X")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3_ANALOG_Y")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3_MOUSE_X")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3_MOUSE_Y")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
//Player 4
PORT_START("P4")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P4_ANALOG_X")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P4_ANALOG_Y")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P4_MOUSE_X")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P4_MOUSE_Y")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("RESET")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
// no reset button available
// PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Warm Reset") PORT_CODE(KEYCODE_3)
INPUT_PORTS_END
// TODO: c&p from n64.cpp, shouldn't have this at all
DEVICE_IMAGE_LOAD_MEMBER(n64_gateway_state::cart_load)
{
int i, length;
uint8_t *cart = memregion("user2")->base();
if (!image.loaded_through_softlist())
{
length = image.fread(cart, 0x4000000);
}
else
{
length = image.get_software_region_length("rom");
memcpy(cart, image.get_software_region("rom"), length);
}
m_rcp_periphs->cart_length = length;
if (cart[0] == 0x37 && cart[1] == 0x80)
{
for (i = 0; i < length; i += 4)
{
uint8_t b1 = cart[i + 0];
uint8_t b2 = cart[i + 1];
uint8_t b3 = cart[i + 2];
uint8_t b4 = cart[i + 3];
cart[i + 0] = b3;
cart[i + 1] = b4;
cart[i + 2] = b1;
cart[i + 3] = b2;
}
}
else
{
for (i = 0; i < length; i += 4)
{
uint8_t b1 = cart[i + 0];
uint8_t b2 = cart[i + 1];
uint8_t b3 = cart[i + 2];
uint8_t b4 = cart[i + 3];
cart[i + 0] = b4;
cart[i + 1] = b3;
cart[i + 2] = b2;
cart[i + 3] = b1;
}
}
m_rcp_periphs->m_nvram_image = &image.device();
logerror("cart length = %d\n", length);
device_image_interface *battery_image = dynamic_cast<device_image_interface *>(m_rcp_periphs->m_nvram_image);
if (battery_image)
{
//printf("Loading\n");
uint8_t data[0x30800];
battery_image->battery_load(data, 0x30800, 0x00);
if (m_sram != nullptr)
{
memcpy(m_sram, data, 0x20000);
}
memcpy(m_rcp_periphs->m_save_data.eeprom, data + 0x20000, 0x800);
//memcpy(m_rcp_periphs->m_save_data.mempak[0], data + 0x20800, 0x8000);
//memcpy(m_rcp_periphs->m_save_data.mempak[1], data + 0x28800, 0x8000);
}
//if (m_rcp_periphs->m_save_data.mempak[0][0] == 0) // Init if new
//{
//memset(m_rcp_periphs->m_save_data.eeprom, 0, 0x800);
//mempak_format(m_rcp_periphs->m_save_data.mempak[0]);
//mempak_format(m_rcp_periphs->m_save_data.mempak[1]);
//}
return std::make_pair(std::error_condition(), std::string());
}
void n64_gateway_state::n64_lodgenet(machine_config &config)
{
VR4300BE(config, m_vr4300, 93750000);
m_vr4300->set_force_no_drc(false);
//m_vr4300->set_icache_size(16384);
//m_vr4300->set_dcache_size(8192);
//m_vr4300->set_system_clock(62500000);
m_vr4300->set_addrmap(AS_PROGRAM, &n64_gateway_state::n64_lodgenet_map);
// m_vr4300->set_vblank_int("screen", FUNC(n64_console_state::n64_reset_poll));
RSP(config, m_rsp, 62500000);
m_rsp->set_force_no_drc(false);
m_rsp->dp_reg_r().set(m_rcp_periphs, FUNC(n64_periphs::dp_reg_r));
m_rsp->dp_reg_w().set(m_rcp_periphs, FUNC(n64_periphs::dp_reg_w));
m_rsp->sp_reg_r().set(m_rcp_periphs, FUNC(n64_periphs::sp_reg_r));
m_rsp->sp_reg_w().set(m_rcp_periphs, FUNC(n64_periphs::sp_reg_w));
m_rsp->status_set().set(m_rcp_periphs, FUNC(n64_periphs::sp_set_status));
m_rsp->set_addrmap(AS_PROGRAM, &n64_gateway_state::rsp_imem_map);
m_rsp->set_addrmap(AS_DATA, &n64_gateway_state::rsp_dmem_map);
config.set_maximum_quantum(attotime::from_hz(500000));
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
/* Video DACRATE is for quarter pixels, so the horizontal is also given in quarter pixels. However, the horizontal and vertical timing and sizing is adjustable by register and will be reset when the registers are written. */
screen.set_raw(DACRATE_NTSC*2,3093,0,3093,525,0,525);
screen.set_screen_update(FUNC(n64_state::screen_update_n64));
screen.screen_vblank().set(FUNC(n64_state::screen_vblank_n64));
PALETTE(config, "palette").set_entries(0x1000);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
DMADAC(config, "dac2").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
DMADAC(config, "dac1").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
N64PERIPH(config, m_rcp_periphs, 0);
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "n64_cart", "v64,z64,rom,n64,bin"));
cartslot.set_must_be_loaded(true);
cartslot.set_device_load(FUNC(n64_gateway_state::cart_load));
SOFTWARE_LIST(config, "cart_list").set_original("n64_lodgenet");
}
ROM_START( n64_lodgenet )
ROM_REGION( 0x20000, "gateway64", ROMREGION_ERASEFF )
// unknown CPU/controller, likely multiple ROMs for set-top box & game data receiver.
ROM_LOAD( "gateway64.bios", 0, 0x20000, NO_DUMP )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) /* dummy region for R4300 */
ROM_REGION32_BE( 0x800, "user1", 0 )
ROM_LOAD( "pifdata.bin", 0x0000, 0x0800, CRC(5ec82be9) SHA1(9174eadc0f0ea2654c95fd941406ab46b9dc9bdd) )
ROM_REGION32_BE( 0x4000000, "user2", ROMREGION_ERASEFF)
ROM_REGION16_BE( 0x80, "normpoint", 0 )
ROM_LOAD( "normpnt.rom", 0x00, 0x80, CRC(e7f2a005) SHA1(c27b4a364a24daeee6e99fd286753fd6216362b4) )
ROM_REGION16_BE( 0x80, "normslope", 0 )
ROM_LOAD( "normslp.rom", 0x00, 0x80, CRC(4f2ae525) SHA1(eab43f8cc52c8551d9cff6fced18ef80eaba6f05) )
ROM_END
CONS(1997?, n64_lodgenet, n64, 0, n64_lodgenet, n64_lodgenet, n64_gateway_state, empty_init, "Nintendo / LodgeNet", "Nintendo Gateway 64", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )