mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-04-10 19:15:14 +00:00
This commit is contained in:
parent
c73cb830dc
commit
b2afd274cb
|
@ -1324,6 +1324,7 @@ static void ppc_stwcx_rc(UINT32 op)
|
||||||
ea = REG(RA) + REG(RB);
|
ea = REG(RA) + REG(RB);
|
||||||
|
|
||||||
/*if( ppc.reserved ) {
|
/*if( ppc.reserved ) {
|
||||||
|
*/
|
||||||
WRITE32(ea, REG(RS));
|
WRITE32(ea, REG(RS));
|
||||||
|
|
||||||
ppc.reserved = 0;
|
ppc.reserved = 0;
|
||||||
|
@ -1332,12 +1333,14 @@ static void ppc_stwcx_rc(UINT32 op)
|
||||||
CR(0) = 0x2;
|
CR(0) = 0x2;
|
||||||
if( XER & XER_SO )
|
if( XER & XER_SO )
|
||||||
CR(0) |= 0x1;
|
CR(0) |= 0x1;
|
||||||
} else*/ {
|
/*
|
||||||
|
} else {
|
||||||
//CR(0) = 0;
|
//CR(0) = 0;
|
||||||
CR(0) = 2; // set EQ to indicate success
|
CR(0) = 2; // set EQ to indicate success
|
||||||
if( XER & XER_SO )
|
if( XER & XER_SO )
|
||||||
CR(0) |= 0x1;
|
CR(0) |= 0x1;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ppc_stwu(UINT32 op)
|
static void ppc_stwu(UINT32 op)
|
||||||
|
|
|
@ -408,6 +408,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-19225.40", 0x91a985eb, 0x200000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-19225.40", 0x91a985eb, 0x200000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-19226.41", 0x00091722, 0x200000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-19226.41", 0x00091722, 0x200000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr19231.21", 0xB416FE96, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-19209.22", 0x3715E38C, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-19210.24", 0xC03D6502, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -467,6 +472,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-19885.40", 0xD1AE5473, 0x200000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-19885.40", 0xD1AE5473, 0x200000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-19886.41", 0x278AAE0B, 0x200000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-19886.41", 0x278AAE0B, 0x200000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-19891.21", 0xC3ECD448, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-19869.22", 0xEA1EF1CC, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-19870.24", 0x49C70296, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -596,6 +606,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-19686.40", 0x84EED592, 0x200000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-19686.40", 0x84EED592, 0x200000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-19687.41", 0x776CE694, 0x200000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-19687.41", 0x776CE694, 0x200000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-20096a.21",0x0FEF288B, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-19670.22", 0xBD31CC06, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-20101.24", 0x66D1E31F, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -661,6 +676,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-19916.40", 0x10B0C52E, 0x200000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-19916.40", 0x10B0C52E, 0x200000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-19917.41", 0x3035833B, 0x200000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-19917.41", 0x3035833B, 0x200000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-19940.21", 0xB06FFE5F, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr19934.22", 0xC7D8E194, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr19935.24", 0x91C1B618, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -791,6 +811,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-19801.40", 0xBEB79A00, 0x200000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-19801.40", 0xBEB79A00, 0x200000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-19802.41", 0xF2C3A7B7, 0x200000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-19802.41", 0xF2C3A7B7, 0x200000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-20921.21", 0x30F032A7, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-20903.22", 0xE343E131, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-20904.24", 0x21A91B84, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -850,6 +875,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-20630.40", 0xCC5881B8, 0x400000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-20630.40", 0xCC5881B8, 0x400000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-20631.41", 0x5CB69FFD, 0x400000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-20631.41", 0x5CB69FFD, 0x400000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-20636.21", 0x7139EBF8, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-20614.22", 0xA3930E4A, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-20615.24", 0x62E8A94A, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1282,6 +1312,11 @@ const struct GameInfo Model3GameList[] =
|
||||||
{ "VROM", "mpr-21373.40", 0xB76AD261, 0x400000, 2, 28, 32, FALSE },
|
{ "VROM", "mpr-21373.40", 0xB76AD261, 0x400000, 2, 28, 32, FALSE },
|
||||||
{ "VROM", "mpr-21374.41", 0xAE6C4D28, 0x400000, 2, 30, 32, FALSE },
|
{ "VROM", "mpr-21374.41", 0xAE6C4D28, 0x400000, 2, 30, 32, FALSE },
|
||||||
|
|
||||||
|
// Sound ROMs
|
||||||
|
{ "SndProg","epr-21383.21", 0x544d1e28, 0x80000, 2, 0, 2, TRUE },
|
||||||
|
{ "Samples","mpr-21355.22", 0xc1b2d326, 0x400000, 2, 0x000000, 2, FALSE },
|
||||||
|
{ "Samples","mpr-21357.24", 0x02703fab, 0x400000, 2, 0x400000, 2, FALSE },
|
||||||
|
|
||||||
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
{ NULL, NULL, 0, 0, 0, 0, 0, FALSE }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
int midiCtrlPort=0, midiPort=0;
|
|
||||||
/**
|
/**
|
||||||
** Supermodel
|
** Supermodel
|
||||||
** A Sega Model 3 Arcade Emulator.
|
** A Sega Model 3 Arcade Emulator.
|
||||||
|
@ -190,6 +189,7 @@ int midiCtrlPort=0, midiPort=0;
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "Supermodel.h"
|
#include "Supermodel.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Model 3 Inputs
|
Model 3 Inputs
|
||||||
|
|
||||||
|
@ -624,7 +624,6 @@ UINT32 CModel3::ReadSecurity(unsigned reg)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data = 0xFFFFFFFF;
|
data = 0xFFFFFFFF;
|
||||||
//ErrorLog("Protection device for %s not yet implemented!", Game->title);
|
|
||||||
DebugLog("Security read: reg=%X, PC=%08X, LR=%08X\n", reg, ppc_get_pc(), ppc_get_lr());
|
DebugLog("Security read: reg=%X, PC=%08X, LR=%08X\n", reg, ppc_get_pc(), ppc_get_lr());
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
|
@ -808,7 +807,7 @@ UINT8 CModel3::Read8(UINT32 addr)
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
printf("Read8 %08X\n", addr);
|
printf("PPC: Read8 %08X\n", addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// System registers
|
// System registers
|
||||||
|
@ -885,7 +884,7 @@ UINT16 CModel3::Read16(UINT32 addr)
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
printf("Read16 %08X\n", addr);
|
printf("PPC: Read16 %08X\n", addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// MPC105
|
// MPC105
|
||||||
|
@ -977,7 +976,7 @@ UINT32 CModel3::Read32(UINT32 addr)
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
printf("Read32 %08X\n", addr);
|
printf("PPC: Read32 %08X\n", addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Backup RAM
|
// Backup RAM
|
||||||
|
@ -1121,35 +1120,13 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
#if 0 //def SUPERMODEL_SOUND
|
|
||||||
case 0x08:
|
case 0x08:
|
||||||
//printf("%08X=%02X * (PC=%08X, LR=%08X)\n", addr, data, ppc_get_pc(), ppc_get_lr());
|
printf("PPC: %08X=%02X * (PC=%08X, LR=%08X)\n", addr, data, ppc_get_pc(), ppc_get_lr());
|
||||||
if ((addr&0xF)==0)
|
if ((addr&0xF) == 0) // MIDI data port
|
||||||
{
|
SoundBoard.WriteMIDIPort(data);
|
||||||
midiPort = data;
|
else if ((addr&0xF) == 4) // MIDI control port
|
||||||
//SoundBoard.WriteMIDIPort(data);
|
midiCtrlPort = data;
|
||||||
Turbo68KRun(480);
|
|
||||||
IRQ.Deassert(0x40);
|
|
||||||
}
|
|
||||||
else if ((addr&0xF)==4)
|
|
||||||
{
|
|
||||||
printf("Ctrl port=%02X\n", data);
|
|
||||||
SCSP_WriteMIDICtrlPort(data);
|
|
||||||
/*
|
|
||||||
if (data==0x27)
|
|
||||||
;//IRQ.Assert(0x40);
|
|
||||||
*/
|
|
||||||
|
|
||||||
midiCtrlPort=data;
|
|
||||||
if (data==0x6)
|
|
||||||
{
|
|
||||||
printf("MIDI port=%02X\n", midiPort);
|
|
||||||
if (midiPort!=0xFF)
|
|
||||||
SoundBoard.WriteMIDIPort(midiPort);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
// Backup RAM
|
// Backup RAM
|
||||||
case 0x0C:
|
case 0x0C:
|
||||||
|
@ -1225,7 +1202,7 @@ void CModel3::Write16(UINT32 addr, UINT16 data)
|
||||||
{
|
{
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
printf("%08X=%04X\n", addr, data);
|
printf("PPC: %08X=%04X\n", addr, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Backup RAM
|
// Backup RAM
|
||||||
|
@ -1334,7 +1311,7 @@ void CModel3::Write32(UINT32 addr, UINT32 data)
|
||||||
|
|
||||||
// Sound Board
|
// Sound Board
|
||||||
case 0x08:
|
case 0x08:
|
||||||
printf("%08X=%08X\n", addr, data);
|
printf("PPC: %08X=%08X\n", addr, data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Backup RAM
|
// Backup RAM
|
||||||
|
@ -1641,6 +1618,13 @@ void CModel3::Write8(UINT32 addr, UINT8 data)
|
||||||
GPU.WriteDMARegister8(addr&0xFF,data);
|
GPU.WriteDMARegister8(addr&0xFF,data);
|
||||||
else if (((addr>=0xF0040000) && (addr<0xF0040040)) || ((addr>=0xFE040000) && (addr<0xFE040040)))
|
else if (((addr>=0xF0040000) && (addr<0xF0040040)) || ((addr>=0xFE040000) && (addr<0xFE040040)))
|
||||||
WriteInputs(addr&0x3F,data);
|
WriteInputs(addr&0x3F,data);
|
||||||
|
else if (((addr>=0xF0080000) && (addr<=0xF0080007)) || ((addr>=0xFE080000) && (addr<=0xFE080007)))
|
||||||
|
{
|
||||||
|
if ((addr&0xF) == 0) // MIDI data port
|
||||||
|
SoundBoard.WriteMIDIPort(data);
|
||||||
|
else if ((addr&0xF) == 4) // MIDI control port
|
||||||
|
midiCtrlPort = data;
|
||||||
|
}
|
||||||
else if (((addr>=0xF00C0000) && (addr<0xF00E0000)) || ((addr>=0xFE0C0000) && (addr<0xFE0E0000)))
|
else if (((addr>=0xF00C0000) && (addr<0xF00E0000)) || ((addr>=0xFE0C0000) && (addr<0xFE0E0000)))
|
||||||
backupRAM[(addr&0x1FFFF)^3] = data;
|
backupRAM[(addr&0x1FFFF)^3] = data;
|
||||||
else if (((addr>=0xF0100000) && (addr<0xF0100040)) || ((addr>=0xFE100000) && (addr<0xFE100040)))
|
else if (((addr>=0xF0100000) && (addr<0xF0100040)) || ((addr>=0xFE100000) && (addr<0xFE100040)))
|
||||||
|
@ -1886,27 +1870,25 @@ void CModel3::RunFrame(void)
|
||||||
IRQ.Assert(0x02);
|
IRQ.Assert(0x02);
|
||||||
ppc_execute(10000); // TO-DO: Vblank probably needs to be longer. Maybe that's why some games run too fast/slow
|
ppc_execute(10000); // TO-DO: Vblank probably needs to be longer. Maybe that's why some games run too fast/slow
|
||||||
|
|
||||||
// Update sound
|
// Sound
|
||||||
#if 0 //def SUPERMODEL_SOUND
|
int irqCount = 0;
|
||||||
//if (midiCtrlPort==0x27)
|
while (midiCtrlPort == 0x27) // 27 triggers IRQ sequence, 06 stops it
|
||||||
{
|
|
||||||
//printf("*---\n");
|
|
||||||
|
|
||||||
for (int i = 0; i < 128; i++)
|
|
||||||
{
|
{
|
||||||
IRQ.Assert(0x40);
|
IRQ.Assert(0x40);
|
||||||
ppc_execute(2000);
|
ppc_execute(200);
|
||||||
}
|
|
||||||
|
|
||||||
//printf("---*\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print out sound command buffer in Scud Race RAM
|
|
||||||
printf("cmdbuf=%08X %08X %08X %08X %08X %08X %08X %08X\n", Read32(0x100180), Read32(0x100184), Read32(0x100188), Read32(0x10018C), Read32(0x100190), Read32(0x100194), Read32(0x100198), Read32(0x10019C));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SoundBoard.RunFrame();
|
|
||||||
IRQ.Deassert(0x40);
|
IRQ.Deassert(0x40);
|
||||||
|
ppc_execute(200);
|
||||||
|
|
||||||
|
++irqCount;
|
||||||
|
if (irqCount > (128*3))
|
||||||
|
{
|
||||||
|
printf("MIDI TIMEOUT!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IRQ.Deassert(0x40);
|
||||||
|
SoundBoard.RunFrame();
|
||||||
|
|
||||||
// End frame
|
// End frame
|
||||||
GPU.EndFrame();
|
GPU.EndFrame();
|
||||||
|
@ -1931,6 +1913,9 @@ void CModel3::Reset(void)
|
||||||
serialFIFO2 = 0;
|
serialFIFO2 = 0;
|
||||||
adcChannel = 0;
|
adcChannel = 0;
|
||||||
|
|
||||||
|
// MIDI
|
||||||
|
midiCtrlPort = 0;
|
||||||
|
|
||||||
// Reset all devices
|
// Reset all devices
|
||||||
ppc_reset();
|
ppc_reset();
|
||||||
IRQ.Reset();
|
IRQ.Reset();
|
||||||
|
|
|
@ -279,6 +279,9 @@ private:
|
||||||
UINT8 gunReg;
|
UINT8 gunReg;
|
||||||
int adcChannel;
|
int adcChannel;
|
||||||
|
|
||||||
|
// MIDI port
|
||||||
|
UINT8 midiCtrlPort; // controls MIDI (SCSP) IRQ behavior
|
||||||
|
|
||||||
// Emulated core Model 3 memory regions
|
// Emulated core Model 3 memory regions
|
||||||
UINT8 *memoryPool; // single allocated region for all ROM and system RAM
|
UINT8 *memoryPool; // single allocated region for all ROM and system RAM
|
||||||
UINT8 *ram; // 8 MB PowerPC RAM
|
UINT8 *ram; // 8 MB PowerPC RAM
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
|
|
||||||
unsigned char midiCtrlPort=0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
** Supermodel
|
** Supermodel
|
||||||
** A Sega Model 3 Arcade Emulator.
|
** A Sega Model 3 Arcade Emulator.
|
||||||
|
@ -30,6 +27,13 @@ unsigned char midiCtrlPort=0;
|
||||||
* callbacks. Some minor interface changes were made (external global variables
|
* callbacks. Some minor interface changes were made (external global variables
|
||||||
* were removed).
|
* were removed).
|
||||||
*
|
*
|
||||||
|
* The MIDI input buffer has been increased from 8 (which I assume is the
|
||||||
|
* actual size) in order to accommodate Model 3's PowerPC/68K communication.
|
||||||
|
* There is probably tight synchronization between the CPUs, with PowerPC-side
|
||||||
|
* interrupts being generated to fill the MIDI buffer as the 68K pulls data
|
||||||
|
* out, or there may be a UART with a large FIFO buffer. This can be simulated
|
||||||
|
* by increasing the MIDI buffer (MIDI_STACK_SIZE).
|
||||||
|
*
|
||||||
* To-Do List
|
* To-Do List
|
||||||
* ----------
|
* ----------
|
||||||
* - Remove asserts() in DSP code and make sure memory allocation errors are
|
* - Remove asserts() in DSP code and make sure memory allocation errors are
|
||||||
|
@ -118,9 +122,12 @@ static DWORD IrqTimA=1;
|
||||||
static DWORD IrqTimBC=2;
|
static DWORD IrqTimBC=2;
|
||||||
static DWORD IrqMidi=3;
|
static DWORD IrqMidi=3;
|
||||||
|
|
||||||
|
#define MIDI_STACK_SIZE 128
|
||||||
|
#define MIDI_STACK_SIZE_MASK (MIDI_STACK_SIZE-1)
|
||||||
|
|
||||||
static BYTE MidiOutStack[8];
|
static BYTE MidiOutStack[8];
|
||||||
static BYTE MidiOutW=0,MidiOutR=0;
|
static BYTE MidiOutW=0,MidiOutR=0;
|
||||||
static BYTE MidiStack[8];
|
static BYTE MidiStack[MIDI_STACK_SIZE];
|
||||||
static BYTE MidiOutFill;
|
static BYTE MidiOutFill;
|
||||||
static BYTE MidiInFill;
|
static BYTE MidiInFill;
|
||||||
static BYTE MidiW=0,MidiR=0;
|
static BYTE MidiW=0,MidiR=0;
|
||||||
|
@ -329,7 +336,7 @@ void CheckPendingIRQ()
|
||||||
{
|
{
|
||||||
//SCSP.data[0x20/2]|=0x8; //Hold midi line while there are commands pending
|
//SCSP.data[0x20/2]|=0x8; //Hold midi line while there are commands pending
|
||||||
Int68kCB(IrqMidi);
|
Int68kCB(IrqMidi);
|
||||||
printf("MIDI IRQ\n");
|
//printf("68K: MIDI IRQ\n");
|
||||||
//ErrorLogMessage("Midi");
|
//ErrorLogMessage("Midi");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -738,7 +745,7 @@ void SCSP_UpdateSlotReg(int s,int r)
|
||||||
if(KEYONB(s2) && (!s2->active || (s2->active && s2->EG.state==RELEASE)))
|
if(KEYONB(s2) && (!s2->active || (s2->active && s2->EG.state==RELEASE)))
|
||||||
{
|
{
|
||||||
DebugLog("KEYON %d",sl);
|
DebugLog("KEYON %d",sl);
|
||||||
printf("KEYON %d\n",sl);
|
printf("68K: KEYON %d\n",sl);
|
||||||
SCSP_StartSlot(s2);
|
SCSP_StartSlot(s2);
|
||||||
}
|
}
|
||||||
if(!KEYONB(s2) && s2->active)
|
if(!KEYONB(s2) && s2->active)
|
||||||
|
@ -885,7 +892,7 @@ void SCSP_UpdateRegR(int reg)
|
||||||
if(MidiR!=MidiW)
|
if(MidiR!=MidiW)
|
||||||
{
|
{
|
||||||
++MidiR;
|
++MidiR;
|
||||||
MidiR&=7;
|
MidiR&=MIDI_STACK_SIZE_MASK;
|
||||||
//Int68kCB(IrqMidi);
|
//Int68kCB(IrqMidi);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -914,8 +921,8 @@ void SCSP_w8(unsigned int addr,unsigned char val)
|
||||||
{
|
{
|
||||||
int slot=addr/0x20;
|
int slot=addr/0x20;
|
||||||
addr&=0x1f;
|
addr&=0x1f;
|
||||||
DebugLog("Slot %02X Reg %02X write byte %04X",slot,addr^1,val);
|
DebugLog("Slot %02X Reg %02X write byte %04X\n",slot,addr^1,val);
|
||||||
printf("Slot %02X Reg %02X write byte %04X\n",slot,addr^1,val);
|
//printf("Slot %02X Reg %02X write byte %04X\n",slot,addr^1,val);
|
||||||
*((unsigned char *) (SCSP->Slots[slot].datab+(addr^1))) = val;
|
*((unsigned char *) (SCSP->Slots[slot].datab+(addr^1))) = val;
|
||||||
SCSP_UpdateSlotReg(slot,(addr^1)&0x1f);
|
SCSP_UpdateSlotReg(slot,(addr^1)&0x1f);
|
||||||
}
|
}
|
||||||
|
@ -954,8 +961,8 @@ void SCSP_w16(unsigned int addr,unsigned short val)
|
||||||
{
|
{
|
||||||
int slot=addr/0x20;
|
int slot=addr/0x20;
|
||||||
addr&=0x1f;
|
addr&=0x1f;
|
||||||
DebugLog("Slot %02X Reg %02X write word %04X",slot,addr,val);
|
DebugLog("Slot %02X Reg %02X write word %04X\n",slot,addr,val);
|
||||||
printf("Slot %02X Reg %02X write word %04X\n",slot,addr,val);
|
//printf("Slot %02X Reg %02X write word %04X\n",slot,addr,val);
|
||||||
*((unsigned short *) (SCSP->Slots[slot].datab+(addr))) = val;
|
*((unsigned short *) (SCSP->Slots[slot].datab+(addr))) = val;
|
||||||
SCSP_UpdateSlotReg(slot,addr&0x1f);
|
SCSP_UpdateSlotReg(slot,addr&0x1f);
|
||||||
}
|
}
|
||||||
|
@ -994,8 +1001,8 @@ void SCSP_w32(unsigned int addr,unsigned int val)
|
||||||
{
|
{
|
||||||
int slot=addr/0x20;
|
int slot=addr/0x20;
|
||||||
addr&=0x1f;
|
addr&=0x1f;
|
||||||
DebugLog("Slot %02X Reg %02X write dword %08X",slot,addr,val);
|
DebugLog("Slot %02X Reg %02X write dword %08X\n",slot,addr,val);
|
||||||
printf("Slot %02X Reg %02X write dword %08X\n",slot,addr,val);
|
//printf("Slot %02X Reg %02X write dword %08X\n",slot,addr,val);
|
||||||
_asm rol val,16
|
_asm rol val,16
|
||||||
*((unsigned int *) (SCSP->Slots[slot].datab+(addr))) = val;
|
*((unsigned int *) (SCSP->Slots[slot].datab+(addr))) = val;
|
||||||
SCSP_UpdateSlotReg(slot,addr&0x1f);
|
SCSP_UpdateSlotReg(slot,addr&0x1f);
|
||||||
|
@ -1857,7 +1864,7 @@ void SCSP_MidiIn(BYTE val)
|
||||||
DebugLog("Midi Buffer push %02X",val);
|
DebugLog("Midi Buffer push %02X",val);
|
||||||
|
|
||||||
MidiStack[MidiW++]=val;
|
MidiStack[MidiW++]=val;
|
||||||
MidiW&=7;
|
MidiW&=MIDI_STACK_SIZE_MASK;
|
||||||
MidiInFill++;
|
MidiInFill++;
|
||||||
//Int68kCB(IrqMidi);
|
//Int68kCB(IrqMidi);
|
||||||
// SCSP.data[0x20/2]|=0x8;
|
// SCSP.data[0x20/2]|=0x8;
|
||||||
|
@ -1865,7 +1872,7 @@ void SCSP_MidiIn(BYTE val)
|
||||||
|
|
||||||
void SCSP_MidiOutW(BYTE val)
|
void SCSP_MidiOutW(BYTE val)
|
||||||
{
|
{
|
||||||
printf("MIDI out\n");
|
printf("68K: MIDI out\n");
|
||||||
DebugLog("Midi Out Buffer push %02X",val);
|
DebugLog("Midi Out Buffer push %02X",val);
|
||||||
MidiStack[MidiOutW++]=val;
|
MidiStack[MidiOutW++]=val;
|
||||||
MidiOutW&=7;
|
MidiOutW&=7;
|
||||||
|
@ -2000,11 +2007,6 @@ unsigned int SCSP_Slave_r32(unsigned int addr)
|
||||||
Extra Supermodel Interface Functions
|
Extra Supermodel Interface Functions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void SCSP_WriteMIDICtrlPort(UINT8 data)
|
|
||||||
{
|
|
||||||
midiCtrlPort = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SCSP_SetBuffers(INT16 *leftBufferPtr, INT16 *rightBufferPtr, int bufferLength)
|
void SCSP_SetBuffers(INT16 *leftBufferPtr, INT16 *rightBufferPtr, int bufferLength)
|
||||||
{
|
{
|
||||||
SysFPS = 60.0; // should this be updated to reflect actual FPS?
|
SysFPS = 60.0; // should this be updated to reflect actual FPS?
|
||||||
|
|
|
@ -63,7 +63,6 @@ unsigned short SCSP_Slave_r16(unsigned int addr);
|
||||||
unsigned int SCSP_Slave_r32(unsigned int addr);
|
unsigned int SCSP_Slave_r32(unsigned int addr);
|
||||||
|
|
||||||
// Supermodel interface functions
|
// Supermodel interface functions
|
||||||
void SCSP_WriteMIDICtrlPort(UINT8 data);
|
|
||||||
void SCSP_SetBuffers(INT16 *leftBufferPtr, INT16 *rightBufferPtr, int bufferLength);
|
void SCSP_SetBuffers(INT16 *leftBufferPtr, INT16 *rightBufferPtr, int bufferLength);
|
||||||
void SCSP_Deinit(void);
|
void SCSP_Deinit(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue