mirror of
https://github.com/libretro/FreeIntv.git
synced 2025-02-16 06:47:38 +00:00
Create cart.c
This commit is contained in:
parent
6adb7bdc70
commit
3e0ec1a920
399
src/cart.c
Normal file
399
src/cart.c
Normal file
@ -0,0 +1,399 @@
|
||||
/*
|
||||
This file is part of FreeIntv.
|
||||
|
||||
FreeIntv is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeIntv is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeIntv. If not, see http://www.gnu.org/licenses/
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "memory.h"
|
||||
#include "cart.h"
|
||||
|
||||
int isROM();
|
||||
int loadROM();
|
||||
int getLoadMethod();
|
||||
void load0();
|
||||
void load1();
|
||||
void load2();
|
||||
void load3();
|
||||
void load4();
|
||||
void load5();
|
||||
void load6();
|
||||
void load7();
|
||||
void load8();
|
||||
void load9();
|
||||
|
||||
const char *title[0x40];
|
||||
|
||||
int data[0x20000]; // rom data loaded from file
|
||||
|
||||
int size = 0; // size of file read
|
||||
|
||||
int pos = 0; // current position in data
|
||||
|
||||
int LoadCart(char *path)
|
||||
{
|
||||
unsigned char word[1];
|
||||
FILE *fp;
|
||||
|
||||
size = 0;
|
||||
|
||||
if((fp = fopen(path,"rb"))!=NULL)
|
||||
{
|
||||
while(fread(word,sizeof(word),1,fp) && size<0x20000)
|
||||
{
|
||||
data[size] = word[0];
|
||||
size++;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if(isROM()) // intellicart format
|
||||
{
|
||||
return loadROM();
|
||||
}
|
||||
else
|
||||
{
|
||||
// check cartinfo database for load method
|
||||
switch(getLoadMethod())
|
||||
{
|
||||
case 0: load0(); break;
|
||||
case 1: load1(); break;
|
||||
case 2: load2(); break;
|
||||
case 3: load3(); break;
|
||||
case 4: load4(); break;
|
||||
case 5: load5(); break;
|
||||
case 6: load6(); break;
|
||||
case 7: load7(); break;
|
||||
case 8: load8(); break;
|
||||
case 9: load9(); break;
|
||||
default: load0();
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int readWord()
|
||||
{
|
||||
pos = pos * (pos<size);
|
||||
int val = (data[pos]<<8) | data[pos+1];
|
||||
pos+=2;
|
||||
return val;
|
||||
}
|
||||
|
||||
int loadRange(int start, int stop)
|
||||
{
|
||||
while(start<=stop && pos<size) // load segment
|
||||
{
|
||||
Memory[start] = readWord();
|
||||
start++;
|
||||
}
|
||||
}
|
||||
|
||||
// http://spatula-city.org/~im14u2c/intv/jzintv-1.0-beta3/doc/rom_fmt/IntellicartManual.booklet.pdf
|
||||
int isROM() // check for intellicart format rom
|
||||
{
|
||||
// check magic number (used for intellicart baud rate detection)
|
||||
return (data[0]==0xA8);
|
||||
}
|
||||
|
||||
int loadROM() // load intellicart format rom
|
||||
{
|
||||
pos = 0;
|
||||
int i;
|
||||
int segments = readWord() & 0xFF; // number of non-contiguous rom segments (drop magic number)
|
||||
int ocs = readWord(); // 1's compliment of segments
|
||||
int t;
|
||||
int start;
|
||||
int stop;
|
||||
for(i=0; i<segments; i++)
|
||||
{
|
||||
t = readWord(); // high bytes of segment start and stop addresses
|
||||
start = t & 0xFF00;
|
||||
stop = ((t<<8) & 0xFF00) | 0xFF;
|
||||
loadRange(start, stop);
|
||||
t = readWord(); // CRC for segment (ignored)
|
||||
}
|
||||
// Enable tables (ignored)
|
||||
return 1;
|
||||
}
|
||||
|
||||
// http://atariage.com/forums/topic/203179-config-files-to-use-with-various-intellivision-titles/
|
||||
|
||||
void load0() // default - handles majority of carts
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
loadRange(0xD000, 0xDFFF);
|
||||
loadRange(0xF000, 0xFFFF);
|
||||
}
|
||||
|
||||
void load1()
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
loadRange(0xD000, 0xFFFF);
|
||||
}
|
||||
|
||||
void load2()
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
loadRange(0x9000, 0xBFFF);
|
||||
loadRange(0xD000, 0xDFFF);
|
||||
}
|
||||
|
||||
void load3()
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
loadRange(0x9000, 0xAFFF);
|
||||
loadRange(0xD000, 0xDFFF);
|
||||
loadRange(0xF000, 0xFFFF);
|
||||
}
|
||||
|
||||
void load4()
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
// [memattr] $D000 - $D3FF = RAM 8 // automatic
|
||||
}
|
||||
|
||||
void load5()
|
||||
{
|
||||
loadRange(0x5000, 0x7FFF);
|
||||
loadRange(0x9000, 0xBFFF);
|
||||
}
|
||||
|
||||
void load6()
|
||||
{
|
||||
loadRange(0x6000, 0x7FFF);
|
||||
}
|
||||
|
||||
void load7()
|
||||
{
|
||||
loadRange(0x4800, 0x67FF);
|
||||
}
|
||||
|
||||
void load8()
|
||||
{
|
||||
loadRange(0x5000, 0x6000);
|
||||
loadRange(0x7000, 0x7FFF);
|
||||
}
|
||||
|
||||
void load9()
|
||||
{
|
||||
loadRange(0x5000, 0x6FFF);
|
||||
loadRange(0x9000, 0xAFFF);
|
||||
loadRange(0xD000, 0xDFFF);
|
||||
loadRange(0xF000, 0xFFFF);
|
||||
}
|
||||
|
||||
int fingerprints[344] =
|
||||
{
|
||||
15702, 0, // 4-TRIS (2001) (Joseph Zbiciak)
|
||||
10253, 0, // ABPA Backgammon (1978) (Mattel)
|
||||
9709, 0, // Advanced D&D - Treasure of Tarmin (1982) (Mattel)
|
||||
11212, 0, // Advanced Dungeons and Dragons (1982) (Mattel)
|
||||
11087, 0, // Adventure (AD&D - Cloudy Mountain) (1982) (Mattel)
|
||||
11426, 0, // Air Strike (1982) (Mattel)
|
||||
9766, 0, // All-Star Major League Baseball (1983) (Mattel)
|
||||
10847, 0, // Armor Battle (1978) (Mattel)
|
||||
9371, 0, // Astrosmash (1981) (Mattel)
|
||||
10908, 7, // Atlantis (1981) (Imagic)
|
||||
10218, 0, // Auto Racing (1979) (Mattel)
|
||||
10894, 0, // B-17 Bomber (1981) (Mattel)
|
||||
11349, 0, // Baseball (1978) (Mattel)
|
||||
// (missing Baseball II proto, method 3)
|
||||
9904, 0, // BeamRider (1983) (Activision)
|
||||
10538, 7, // Beauty and the Beast (1982) (Imagic)
|
||||
9337, 0, // Blockade Runner (1983) (Interphase)
|
||||
9654, 2, // Body Slam - Super Pro Wrestling (1988) (Intv Corp)
|
||||
10921, 0, // Bomb Squad (1982) (Mattel)
|
||||
11614, 0, // Bouncing Pixels (1999) (JRMZ Electronics)
|
||||
9978, 0, // Boxing (1980) (Mattel)
|
||||
9379, 0, // Brickout! (1981) (Mattel)
|
||||
8612, 0, // Bump 'N' Jump (1982-83) (Mattel)
|
||||
11137, 0, // BurgerTime! (1982) (Mattel)
|
||||
11765, 0, // Buzz Bombers (1982) (Mattel)
|
||||
8689, 0, // Carnival (1982) (Coleco-CBS)
|
||||
11007, 0, // Castle Trailer (2003) (Arnauld Chevallier)
|
||||
11666, 6, // Centipede (1983) (Atarisoft)
|
||||
11477, 1, // Championship Tennis (1985) (Mattel)
|
||||
7102, 0, // Checkers (1979) (Mattel)
|
||||
// missing Choplifter method 5
|
||||
// missing Choplifter method 1
|
||||
9602, 2, // Chip Shot - Super Pro Golf (1987) (Intv Corp)
|
||||
8402, 2, // Commando (1987) (Mattel)
|
||||
12615, 5, // Congo Bongo (1983) (Sega)
|
||||
10329, 0, // Crazy Clones (1981) (PD)
|
||||
10496, 2, // Deep Pockets-Super Pro Pool and Billiards (1990) (Realtime)
|
||||
12619, 5, // Defender (1983) (Atarisoft)
|
||||
10665, 7, // Demon Attack (1982) (Imagic)
|
||||
12174, 5, // Dig Dug (1987) (Intv Corp)
|
||||
10444, 2, // Diner (1987) (Intv Corp)
|
||||
9395, 0, // Donkey Kong (1982) (Coleco)
|
||||
10004, 0, // Donkey Kong Jr (1982) (Coleco)
|
||||
14879, 0, // Doom (2002) (Joseph Zbiciak)
|
||||
10144, 0, // Dracula (1982) (Imagic)
|
||||
10083, 0, // Dragonfire (1982) (Imagic)
|
||||
6406, 0, // Dreadnaught Factor, The (1983) (Activision)
|
||||
6474, 0, // Dreadnaught Factor, The (1983) (Activision)
|
||||
12407, 0, // Duncan's Thin Ice (1983) (Mattel)
|
||||
11910, 0, // Easter Eggs (1981) (Mattel)
|
||||
9499, 0, // Eggs 'n' Eyes by Scott Nudds (1996) (PD)
|
||||
9775, 0, // Electric Company - Math Fun (1978) (CTW)
|
||||
9066, 0, // Electric Company - Word Fun (1980) (CTW)
|
||||
10109, 0, // Fathom (1983) (Imagic)
|
||||
13433, 0, // Frog Bog (1982) (Mattel)
|
||||
9676, 0, // Frogger (1983) (Parker Bros)
|
||||
11101, 0, // GROM, The (1978) (General Instruments)
|
||||
12756, 9, // Game Factory (Prototype) (1983) (Mattel)
|
||||
11614, 0, // Go For the Gold (1981) (Mattel)
|
||||
9926, 0, // Grid Shock (1982) (Mattel)
|
||||
10621, 0, // Groovy! (1999) (JRMZ Electronics)
|
||||
6362, 0, // Happy Trails (1983) (Activision) [o1]
|
||||
6362, 0, // Happy Trails (1983) (Activision)
|
||||
10224, 0, // Hard Hat (1979) (Mattel)
|
||||
10009, 0, // Horse Racing (1980) (Mattel)
|
||||
10552, 2, // Hover Force (1986) (Intv Corp)
|
||||
9109, 0, // Hypnotic Lights (1981) (Mattel)
|
||||
10266, 0, // Ice Trek (1983) (Imagic)
|
||||
11042, 0, // Jetsons, The - Ways With Words (1983) (Mattel)
|
||||
9273, 1, // King of the Mountain (1982) (Mattel)
|
||||
8809, 0, // Kool-Aid Man (1983) (Mattel)
|
||||
9378, 0, // Lady Bug (1983) (Coleco)
|
||||
11981, 4, // Land Battle (1982) (Mattel)
|
||||
8281, 0, // Las Vegas Blackjack and Poker (1979) (Mattel)
|
||||
11001, 0, // Las Vegas Roulette (1979) (Mattel)
|
||||
6185, 0, // League of Light (Prototype) (1983) (Activision)
|
||||
15735, 2, // Learning Fun I - Math Master Factor Fun (1987) (Intv Corp)
|
||||
14363, 2, // Learning Fun II - Word Wizard Memory Fun (1987) (Intv Corp)
|
||||
10644, 0, // Lock 'N' Chase (1982) (Mattel)
|
||||
10842, 0, // Loco-Motion (1982) (Mattel)
|
||||
11349, 8, // MTE201 Intellivision Test Cartridge (1978) (Mattel)
|
||||
10304, 0, // Magic Carousel (Prototype) (1983) (Intv Corp)
|
||||
12439, 0, // Masters of the Universe-The Power of He-Man! (1983) (Mattel)
|
||||
9802, 0, // Maze Demo #1 (2000) (JRMZ Electronics)
|
||||
11067, 0, // Maze Demo #2 (2000) (JRMZ Electronics)
|
||||
10242, 0, // Melody Blaster (1983) (Mattel)
|
||||
11108, 7, // Microsurgeon (1982) (Imagic)
|
||||
10643, 0, // Mind Strike! (1982) (Mattel)
|
||||
11576, 0, // Minotaur (1981) (Mattel)
|
||||
6217, 0, // Minotaur V1.1 (1981) (Mattel)
|
||||
6217, 0, // Minotaur (Treasure of Tarmin Hack) (1982) (Mattel)
|
||||
6498, 0, // Minotaur V2 (1981) (Mattel)
|
||||
9244, 0, // Mission X (1982) (Mattel)
|
||||
11500, 0, // Motocross (1982) (Mattel)
|
||||
10251, 0, // Mountain Madness - Super Pro Skiing (1987) (Intv Corp)
|
||||
9275, 0, // Mouse Trap (1982) (Coleco)
|
||||
10506, 0, // Mr. Basic Meets Bits 'N Bytes (1983) (Mattel)
|
||||
10637, 0, // NASL Soccer (1979) (Mattel)
|
||||
9563, 0, // NBA Basketball (1978) (Mattel)
|
||||
10626, 0, // NFL Football (1978) (Mattel)
|
||||
9318, 0, // NHL Hockey (1979) (Mattel)
|
||||
9301, 0, // Night Stalker (1982) (Mattel)
|
||||
10884, 0, // Nova Blast (1983) (Imagic)
|
||||
12646, 0, // Number Jumble (1983) (Mattel)
|
||||
8088, 0, // PBA Bowling (1980) (Mattel)
|
||||
10071, 0, // PGA Golf (1979) (Mattel)
|
||||
5049, 5, // Pac-Man (1983) (Atarisoft)
|
||||
5049, 5, // Pac-Man (1983) (Intv Corp)
|
||||
11430, 0, // Pinball (1981) (Mattel)
|
||||
6302, 0, // Pitfall! (1982) (Activision)
|
||||
10490, 2, // Pole Position (1986) (Intv Corp)
|
||||
10523, 0, // Pong (1999) (Joseph Zbiciak)
|
||||
10115, 0, // Popeye (1983) (Parker Bros)
|
||||
6902, 0, // Q-bert (1983) (Parker Bros)
|
||||
8238, 0, // Reversi (1984) (Mattel)
|
||||
10980, 0, // River Raid (1982-83) (Activision)
|
||||
10090, 0, // Royal Dealer (1981) (Mattel)
|
||||
9836, 0, // Safecracker (1983) (Imagic)
|
||||
9923, 0, // Santa's Helper (1983) (Mattel)
|
||||
10420, 0, // Scooby Doo's Maze Chase (1983) (Mattel)
|
||||
// missing Scarfinger method 2
|
||||
11292, 0, // Sea Battle (1980) (Mattel)
|
||||
10760, 0, // Sears Super Video Arcade BIOS (1978) (Sears)
|
||||
11784, 0, // Sewer Sam (1983) (Interphase)
|
||||
10336, 0, // Shark! Shark! (1982) (Mattel) [a1]
|
||||
10335, 0, // Shark! Shark! (1982) (Mattel)
|
||||
10738, 0, // Sharp Shot (1982) (Mattel)
|
||||
9888, 2, // Slam Dunk - Super Pro Basketball (1987) (Intv Corp)
|
||||
11858, 0, // Slap Shot - Super Pro Hockey (1987) (Intv Corp)
|
||||
11002, 0, // Snafu (1981) (Mattel)
|
||||
10566, 0, // Space Armada (1981) (Mattel)
|
||||
10018, 0, // Space Battle (1979) (Mattel)
|
||||
10656, 0, // Space Cadet (1982) (Mattel)
|
||||
// missing Spaceshuttle method 1
|
||||
9487, 0, // Space Hawk (1981) (Mattel)
|
||||
10228, 0, // Space Spartans (1981) (Mattel)
|
||||
11692, 2, // Spiker! - Super Pro Volleyball (1988) (Intv Corp)
|
||||
11879, 0, // Spirit V1.0 (2003) (Arnauld Chevallier)
|
||||
10447, 2, // Stadium Mud Buggies (1988) (Intv Corp)
|
||||
5776, 0, // Stampede (1982) (Activision)
|
||||
10470, 0, // Star Strike (1981) (Mattel)
|
||||
9680, 0, // Star Wars - The Empire Strikes Back (1983) (Parker Bros)
|
||||
8789, 0, // Street (1981) (Mattel)
|
||||
11615, 0, // Sub Hunt (1981) (Mattel)
|
||||
11402, 0, // Super Cobra (1983) (Konami)
|
||||
10849, 0, // Super Masters! (1982) (Mattel)
|
||||
12534, 2, // Super Pro Decathlon (1988) (Intv Corp)
|
||||
11689, 2, // Super Pro Football (1986) (Intv Corp)
|
||||
10973, 0, // Super Soccer (1983) (Mattel)
|
||||
10000, 0, // Swords and Serpents (1982) (Imagic)
|
||||
10575, 0, // TRON - Deadly Discs (1981) (Mattel)
|
||||
10970, 0, // TRON - Deadly Discs - Deadly Dogs (1987) (Intv Corp)
|
||||
11495, 0, // TRON - Maze-A-Tron (1981) (Mattel)
|
||||
11094, 0, // TRON - Solar Sailer (1982) (Mattel)
|
||||
11888, 0, // Takeover (1982) (Mattel)
|
||||
9825, 0, // Tennis (1980) (Mattel)
|
||||
11267, 0, // Tetris (2000) (Joseph Zbiciak)
|
||||
11832, 0, // Thin Ice (Prototype) (1983) (Intv Corp)
|
||||
13276, 0, // Thunder Castle (1982) (Mattel)
|
||||
9992, 3, // Tower of Doom (1986) (Intv Corp)
|
||||
8777, 0, // Triple Action (1981) (Mattel)
|
||||
9893, 9, // Triple Challenge (1986) (Intv Corp)
|
||||
10422, 0, // Tropical Trouble (1982) (Imagic)
|
||||
10249, 0, // Truckin' (1983) (Imagic)
|
||||
11365, 0, // Turbo (1983) (Coleco)
|
||||
9949, 0, // Tutankham (1983) (Parker Bros)
|
||||
10084, 0, // U.S. Ski Team Skiing (1980) (Mattel)
|
||||
9871, 4, // USCF Chess (1981) (Mattel)
|
||||
9784, 0, // Utopia (1981) (Mattel)
|
||||
10602, 0, // Vectron (1982) (Mattel)
|
||||
9894, 0, // Venture (1982) (Coleco)
|
||||
10015, 0, // White Water! (1983) (Imagic)
|
||||
11411, 0, // World Cup Football (1985) (Nice Ideas)
|
||||
15043, 1, // World Series Major League Baseball (1983) (Mattel)
|
||||
10887, 0, // Worm Whomper (1983) (Activision)
|
||||
11566, 0 // Zaxxon (1982) (Coleco)
|
||||
};
|
||||
|
||||
int getLoadMethod() // lazy, but it works
|
||||
{
|
||||
int i;
|
||||
int method = 0;
|
||||
int f = 0;
|
||||
// find fingerprint
|
||||
for(i=0; i<256; i++)
|
||||
{
|
||||
f = f + data[i];
|
||||
}
|
||||
for (i=0; i<344; i+=2)
|
||||
{
|
||||
if(f==fingerprints[i])
|
||||
{
|
||||
method = fingerprints[i+1];
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user