d_kinst: Add kinst2

This commit is contained in:
Marcos Medeiros 2015-03-15 21:29:44 +00:00
parent bf697f0407
commit 936b9f616f
2 changed files with 168 additions and 30 deletions

View File

@ -9,6 +9,9 @@
#define IDE_IRQ 1
#define VBLANK_IRQ 0
#define KINST 0x100000
#define KINST2 0x200000
static UINT8 *AllMem;
static UINT8 *MemEnd;
static UINT8 *AllRam;
@ -134,7 +137,6 @@ static void ideWrite(UINT32 address, UINT32 value)
}
}
static UINT32 xReg = 0, soundData = 0;
static UINT32 kinstRead(UINT32 address)
{
UINT32 tmp;
@ -167,6 +169,37 @@ static UINT32 kinstRead(UINT32 address)
return ~0;
}
static UINT32 kinst2Read(UINT32 address)
{
UINT32 tmp;
if (address >= 0x10000080 && address <= 0x100000ff) {
switch (address & 0xFF) {
case 0x80:
tmp = ~2;
if (Dcs2kDataRead() & 0x800)
tmp |= 2;
return tmp;
case 0xA0:
return nSoundData;
case 0x98:
return ~DrvInputs[0];
case 0x90:
return ~DrvInputs[1];
case 0x88:
return ~DrvInputs[2] & ~0x00003e00;
}
return ~0;
}
if (address >= 0x10000100 && address <= 0x10000173) {
return ideRead(address);
}
printf("Invalid read %08X\n", address);
return ~0;
}
static void kinstWrite(UINT32 address, UINT64 value)
@ -201,6 +234,39 @@ static void kinstWrite(UINT32 address, UINT64 value)
}
static void kinst2Write(UINT32 address, UINT64 value)
{
if (address >= 0x10000080 && address <= 0x100000ff) {
switch (address & 0xFF) {
case 0x98:
DrvVRAMBase = (value & 4) ? 0x58000 : 0x30000;
break;
case 0x90:
Dcs2kResetWrite(~value & 1);
break;
case 0x80: {
UINT32 old = nSoundCtrl;
nSoundCtrl = value;
if (!(old & 2) && (nSoundCtrl & 2)) {
Dcs2kDataWrite(nSoundData);
}
break;
}
case 0xA0:
nSoundData = value;
break;
}
return;
}
if (address >= 0x10000100 && address <= 0x10000173) {
ideWrite(address, value);
return;
}
}
static void kinstWriteByte(UINT32 address, UINT8 value) { kinstWrite(address, value); }
static void kinstWriteHalf(UINT32 address, UINT16 value) { kinstWrite(address, value); }
static void kinstWriteWord(UINT32 address, UINT32 value) { kinstWrite(address, value); }
@ -211,6 +277,15 @@ static UINT16 kinstReadHalf(UINT32 address) { return kinstRead(address); }
static UINT32 kinstReadWord(UINT32 address) { return kinstRead(address); }
static UINT64 kinstReadDouble(UINT32 address) { return kinstRead(address); }
static void kinst2WriteByte(UINT32 address, UINT8 value) { kinst2Write(address, value); }
static void kinst2WriteHalf(UINT32 address, UINT16 value) { kinst2Write(address, value); }
static void kinst2WriteWord(UINT32 address, UINT32 value) { kinst2Write(address, value); }
static void kinst2WriteDouble(UINT32 address, UINT64 value) { kinst2Write(address, value); }
static UINT8 kinst2ReadByte(UINT32 address) { return kinst2Read(address); }
static UINT16 kinst2ReadHalf(UINT32 address) { return kinst2Read(address); }
static UINT32 kinst2ReadWord(UINT32 address) { return kinst2Read(address); }
static UINT64 kinst2ReadDouble(UINT32 address) { return kinst2Read(address); }
static void MakeInputs()
{
@ -239,17 +314,58 @@ static INT32 LoadSoundBanks()
if (BurnLoadRom(DrvSoundROM + 0xA00000, 6, 2)) return 1;
if (BurnLoadRom(DrvSoundROM + 0xC00000, 7, 2)) return 1;
if (BurnLoadRom(DrvSoundROM + 0xE00000, 8, 2)) return 1;
{
FILE *fp = fopen("sound.bin", "w");
fwrite(DrvSoundROM, 1, 0x1000000, fp);
fclose(fp);
}
return 0;
}
static INT32 DrvInit()
static INT32 kinstSetup()
{
printf("kinst: loading image at kinst.img\n");
// FIXME:
if (!DrvDisk->load_disk_image("hdd/kinst.img")) {
printf("kinst: harddisk image not found!");
return 1;
}
Mips3SetReadByteHandler(1, kinstReadByte);
Mips3SetReadHalfHandler(1, kinstReadHalf);
Mips3SetReadWordHandler(1, kinstReadWord);
Mips3SetReadDoubleHandler(1, kinstReadDouble);
Mips3SetWriteByteHandler(1, kinstWriteByte);
Mips3SetWriteHalfHandler(1, kinstWriteHalf);
Mips3SetWriteWordHandler(1, kinstWriteWord);
Mips3SetWriteDoubleHandler(1, kinstWriteDouble);
Mips3MapHandler(1, 0x10000000, 0x100001FF, MAP_READ | MAP_WRITE);
return 0;
}
static INT32 kinst2Setup()
{
printf("kinst: loading image at kinst2.img\n");
// FIXME:
if (!DrvDisk->load_disk_image("hdd/kinst2.img")) {
printf("kinst: harddisk image not found!");
return 1;
}
Mips3SetReadByteHandler(1, kinst2ReadByte);
Mips3SetReadHalfHandler(1, kinst2ReadHalf);
Mips3SetReadWordHandler(1, kinst2ReadWord);
Mips3SetReadDoubleHandler(1, kinst2ReadDouble);
Mips3SetWriteByteHandler(1, kinst2WriteByte);
Mips3SetWriteHalfHandler(1, kinst2WriteHalf);
Mips3SetWriteWordHandler(1, kinst2WriteWord);
Mips3SetWriteDoubleHandler(1, kinst2WriteDouble);
Mips3MapHandler(1, 0x10000000, 0x100001FF, MAP_READ | MAP_WRITE);
return 0;
}
static INT32 DrvInit(int version)
{
printf("kinst: DrvInit\n");
MemIndex();
@ -261,13 +377,6 @@ static INT32 DrvInit()
DrvDisk = new ide::ide_disk();
DrvDisk->set_irq_callback(IDESetIRQState);
printf("kinst: loading image at kinst.img\n");
// FIXME:
if (!DrvDisk->load_disk_image("kinst.img")) {
printf("kinst: harddisk image not found!");
return 1;
}
MemIndex();
GenerateColorLUT();
@ -294,17 +403,15 @@ static INT32 DrvInit()
Mips3MapMemory(DrvRAM0, 0x00000000, 0x0007FFFF, MAP_RAM);
Mips3MapMemory(DrvRAM1, 0x08000000, 0x087FFFFF, MAP_RAM);
Mips3SetReadByteHandler(1, kinstReadByte);
Mips3SetReadHalfHandler(1, kinstReadHalf);
Mips3SetReadWordHandler(1, kinstReadWord);
Mips3SetReadDoubleHandler(1, kinstReadDouble);
switch (version) {
case KINST:
kinstSetup();
break;
case KINST2:
kinst2Setup();
break;
}
Mips3SetWriteByteHandler(1, kinstWriteByte);
Mips3SetWriteHalfHandler(1, kinstWriteHalf);
Mips3SetWriteWordHandler(1, kinstWriteWord);
Mips3SetWriteDoubleHandler(1, kinstWriteDouble);
Mips3MapHandler(1, 0x10000000, 0x100001FF, MAP_READ | MAP_WRITE);
Dcs2kMapSoundROM(DrvSoundROM, 0x1000000);
Dcs2kBoot();
@ -317,6 +424,9 @@ static INT32 DrvInit()
return 0;
}
static INT32 kinstDrvInit() { return DrvInit(KINST); }
static INT32 kinst2DrvInit() { return DrvInit(KINST2); }
static INT32 DrvExit()
{
Dcs2kExit();
@ -366,10 +476,11 @@ static INT32 DrvFrame()
DrvDraw();
}
Dcs2kRun(MHz(10) / 60);
if (pBurnSoundOut) {
Dcs2kRun(MHz(10) / 60);
Dcs2kRender(pBurnSoundOut, nBurnSoundLen);
}
Dcs2kRender(pBurnSoundOut, nBurnSoundLen);
Mips3SetIRQLine(VBLANK_IRQ, 1);
Mips3Run(kHz(20));
@ -404,6 +515,32 @@ struct BurnDriver BurnDrvKinst = {
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_PREFIX_MIDWAY, GBF_VSFIGHT, 0,
NULL, kinstRomInfo, kinstRomName, NULL, NULL, kinstInputInfo, kinstDIPInfo,
DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000,
kinstDrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000,
320, 240, 4, 3
};
static struct BurnRomInfo kinst2RomDesc[] = {
{ "ki2-l14.u98", 0x80000, 0x27d0285e, 1 | BRF_PRG | BRF_ESS }, // 0 MIPS R4600 Code
{ "ki2_l1.u10", 0x80000, 0xfdf6ed51, 2 | BRF_SND | BRF_ESS }, // 1 DCS sound banks
{ "ki2_l1.u11", 0x80000, 0xf9e70024, 2 | BRF_SND | BRF_ESS }, // 2
{ "ki2_l1.u12", 0x80000, 0x2994c199, 2 | BRF_SND | BRF_ESS }, // 3
{ "ki2_l1.u13", 0x80000, 0x3fe6327b, 2 | BRF_SND | BRF_ESS }, // 4
{ "ki2_l1.u33", 0x80000, 0x6f4dcdcf, 2 | BRF_SND | BRF_ESS }, // 5
{ "ki2_l1.u34", 0x80000, 0x5db48206, 2 | BRF_SND | BRF_ESS }, // 6
{ "ki2_l1.u35", 0x80000, 0x7245ce69, 2 | BRF_SND | BRF_ESS }, // 7
{ "ki2_l1.u36", 0x80000, 0x8920acbb, 2 | BRF_SND | BRF_ESS }, // 8
};
STD_ROM_PICK(kinst2)
STD_ROM_FN(kinst2)
struct BurnDriver BurnDrvKinst2 = {
"kinst2", "kinst2", NULL, NULL, "1994/1995",
"Killer Instinct II (ver. 1.4)\0", NULL, "Rare/Nintendo", "MIDWAY",
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_PREFIX_MIDWAY, GBF_VSFIGHT, 0,
NULL, kinst2RomInfo, kinst2RomName, NULL, NULL, kinstInputInfo, kinstDIPInfo,
kinst2DrvInit, DrvExit, DrvFrame, DrvDraw, DrvScan, &DrvRecalc, 0x8000,
320, 240, 4, 3
};

View File

@ -4,7 +4,8 @@
//#include <QDebug>
#include <cstdio>
#define xlog(...) fprintf(stdout, "dcs: " __VA_ARGS__); fflush(stdout)
//#define xlog(...) fprintf(stdout, "dcs: " __VA_ARGS__); fflush(stdout)
#define xlog(...)
#define ENABLE_TRACE 0