Fixed device configuration name mistakes in scsi_buslogic.c;
Improvements/fixes for MPU-401 and win-midi.c, NT 3.51 Extended MIDI now works, but Princess Maker 2 is still silent (looking into that as we speak).
This commit is contained in:
@@ -253,7 +253,7 @@ static void MPU401_WriteCommand(mpu_t *mpu, uint8_t val)
|
||||
|
||||
static void MPU401_WriteData(mpu_t *mpu, uint8_t val)
|
||||
{
|
||||
if (mpu->mode==M_UART) {midi_write(val);}
|
||||
if (mpu->mode==M_UART) {midi_write(val); return;}
|
||||
|
||||
switch (mpu->state.command_byte)
|
||||
{ /* 0xe# command data */
|
||||
@@ -638,9 +638,12 @@ void mpu401_init(mpu_t *mpu, uint16_t addr, int irq, int mode)
|
||||
mpu->irq = irq;
|
||||
mpu->queue_used = 0;
|
||||
mpu->queue_pos = 0;
|
||||
mpu->mode = mode;
|
||||
mpu->mode = M_UART;
|
||||
|
||||
mpu->intelligent = (mode == M_INTELLIGENT) ? 1 : 0;
|
||||
|
||||
io_sethandler(addr, 0x0002, mpu401_read, NULL, NULL, mpu401_write, NULL, NULL, mpu);
|
||||
io_sethandler(0x2A20, 0x0010, mpu401_read, NULL, NULL, mpu401_write, NULL, NULL, mpu);
|
||||
timer_add(MPU401_Event, &mpu401_event_callback, &mpu401_event_callback, mpu);
|
||||
|
||||
MPU401_Reset(mpu);
|
||||
|
||||
@@ -2373,7 +2373,7 @@ static device_config_t BuslogicConfig[] = {
|
||||
|
||||
|
||||
device_t buslogic_device = {
|
||||
"Buslogic BT-542B PCI",
|
||||
"Buslogic BT-542B ISA",
|
||||
0,
|
||||
Buslogic_542B_Init,
|
||||
BuslogicClose,
|
||||
@@ -2385,7 +2385,7 @@ device_t buslogic_device = {
|
||||
};
|
||||
|
||||
device_t buslogic_pci_device = {
|
||||
"Buslogic BT-542B PCI",
|
||||
"Buslogic BT-958D PCI",
|
||||
0,
|
||||
Buslogic_958D_Init,
|
||||
BuslogicClose,
|
||||
|
||||
199
src/win-midi.c
199
src/win-midi.c
@@ -10,21 +10,33 @@
|
||||
static int midi_id;
|
||||
static HMIDIOUT midi_out_device = NULL;
|
||||
|
||||
HANDLE m_event;
|
||||
|
||||
void midi_close();
|
||||
|
||||
void midi_init()
|
||||
{
|
||||
MMRESULT hr;
|
||||
MMRESULT hr = MMSYSERR_NOERROR;
|
||||
|
||||
midi_id = config_get_int(NULL, "midi", 0);
|
||||
|
||||
m_event = CreateEvent(NULL, TRUE, TRUE, NULL);
|
||||
|
||||
#if 0
|
||||
hr = midiOutOpen(&midi_out_device, midi_id, 0,
|
||||
0, CALLBACK_NULL);
|
||||
#endif
|
||||
hr = midiOutOpen(&midi_out_device, midi_id, (DWORD) m_event,
|
||||
0, CALLBACK_EVENT);
|
||||
if (hr != MMSYSERR_NOERROR) {
|
||||
printf("midiOutOpen error - %08X\n",hr);
|
||||
midi_id = 0;
|
||||
#if 0
|
||||
hr = midiOutOpen(&midi_out_device, midi_id, 0,
|
||||
0, CALLBACK_NULL);
|
||||
#endif
|
||||
hr = midiOutOpen(&midi_out_device, midi_id, (DWORD) m_event,
|
||||
0, CALLBACK_EVENT);
|
||||
if (hr != MMSYSERR_NOERROR) {
|
||||
printf("midiOutOpen error - %08X\n",hr);
|
||||
return;
|
||||
@@ -41,6 +53,7 @@ void midi_close()
|
||||
midiOutReset(midi_out_device);
|
||||
midiOutClose(midi_out_device);
|
||||
midi_out_device = NULL;
|
||||
CloseHandle(m_event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +94,7 @@ static void midi_send_sysex()
|
||||
midi_insysex = 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void midi_write(uint8_t val)
|
||||
{
|
||||
if ((val & 0x80) && !(val == 0xf7 && midi_insysex))
|
||||
@@ -111,3 +125,186 @@ void midi_write(uint8_t val)
|
||||
midiOutShortMsg(midi_out_device, midi_command);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static uint8_t midi_rt_buf[1024] = { 0, 0, 0, 0 };
|
||||
static uint8_t midi_cmd_buf[1024] = { 0, 0, 0, 0 };
|
||||
static int midi_cmd_pos = 0;
|
||||
static int midi_cmd_len = 0;
|
||||
static uint8_t midi_status = 0;
|
||||
static int midi_sysex_start = 0;
|
||||
static int midi_sysex_delay = 0;
|
||||
|
||||
uint8_t MIDI_evt_len[256] = {
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x00
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x10
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x20
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x30
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x40
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x50
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x60
|
||||
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x70
|
||||
|
||||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0x80
|
||||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0x90
|
||||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xa0
|
||||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xb0
|
||||
|
||||
2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, // 0xc0
|
||||
2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, // 0xd0
|
||||
|
||||
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xe0
|
||||
|
||||
0,2,3,2, 0,0,1,0, 1,0,1,1, 1,0,1,0 // 0xf0
|
||||
};
|
||||
|
||||
void PlayMsg(uint8_t *msg)
|
||||
{
|
||||
midiOutShortMsg(midi_out_device, *(uint32_t *) msg);
|
||||
}
|
||||
|
||||
MIDIHDR m_hdr;
|
||||
|
||||
void PlaySysex(uint8_t *sysex, unsigned int len)
|
||||
{
|
||||
MMRESULT result;
|
||||
|
||||
if (WaitForSingleObject(m_event, 2000) == WAIT_TIMEOUT)
|
||||
{
|
||||
pclog("Can't send MIDI message\n");
|
||||
return;
|
||||
}
|
||||
|
||||
midiOutUnprepareHeader(midi_out_device, &m_hdr, sizeof(m_hdr));
|
||||
|
||||
m_hdr.lpData = (char *) sysex;
|
||||
m_hdr.dwBufferLength = len;
|
||||
m_hdr.dwBytesRecorded = len;
|
||||
m_hdr.dwUser = 0;
|
||||
|
||||
result = midiOutPrepareHeader(midi_out_device, &m_hdr, sizeof(m_hdr));
|
||||
|
||||
if (result != MMSYSERR_NOERROR) return;
|
||||
ResetEvent(m_event);
|
||||
result = midiOutLongMsg(midi_out_device, &m_hdr, sizeof(m_hdr));
|
||||
if (result != MMSYSERR_NOERROR)
|
||||
{
|
||||
SetEvent(m_event);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#define SYSEX_SIZE 1024
|
||||
#define RAWBUF 1024
|
||||
|
||||
int GetTicks()
|
||||
{
|
||||
}
|
||||
|
||||
void midi_write(uint8_t val)
|
||||
{
|
||||
/* Test for a realtime MIDI message */
|
||||
if (val >= 0xf8)
|
||||
{
|
||||
midi_rt_buf[0] = val;
|
||||
PlayMsg(midi_rt_buf);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Test for a active sysex transfer */
|
||||
|
||||
if (midi_status == 0xf0)
|
||||
{
|
||||
if (!(val & 0x80))
|
||||
{
|
||||
if (midi_pos < (SYSEX_SIZE-1)) midi_sysex_data[midi_pos++] = val;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
midi_sysex_data[midi_pos++] = 0xf7;
|
||||
|
||||
if ((midi_sysex_start) && (midi_pos >= 4) && (midi_pos <= 9) && (midi_sysex_data[1] == 0x411) && (midi_sysex_data[3] == 0x16))
|
||||
{
|
||||
/* pclog("MIDI: Skipping invalid MT-32 SysEx MIDI message\n"); */
|
||||
}
|
||||
else
|
||||
{
|
||||
PlaySysex(midi_sysex_data, midi_pos);
|
||||
if (midi_sysex_start)
|
||||
{
|
||||
if (midi_sysex_data[5] == 0x7f)
|
||||
{
|
||||
midi_sysex_delay = 290; /* All parameters reset */
|
||||
}
|
||||
else if ((midi_sysex_data[5] == 0x10) && (midi_sysex_data[6] == 0x00) && (midi_sysex_data[7] == 0x04))
|
||||
{
|
||||
midi_sysex_delay = 145; /* Viking Child */
|
||||
}
|
||||
else if ((midi_sysex_data[5] == 0x10) && (midi_sysex_data[6] == 0x00) && (midi_sysex_data[7] == 0x01))
|
||||
{
|
||||
midi_sysex_delay = 30; /* Dark Sun 1 */
|
||||
}
|
||||
else
|
||||
midi_sysex_delay = (unsigned int) (((float) (midi_pos) * 1.25f) * 1000.0f / 3125.0f) + 2;
|
||||
|
||||
midi_sysex_start = GetTicks();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (val & 0x80)
|
||||
{
|
||||
midi_status = val;
|
||||
midi_cmd_pos = 0;
|
||||
midi_cmd_len = MIDI_evt_len[val];
|
||||
if (midi_status == 0xf0)
|
||||
{
|
||||
midi_sysex_data[0] = 0xf0;
|
||||
midi_pos = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (midi_cmd_len)
|
||||
{
|
||||
midi_cmd_buf[midi_cmd_pos++] = val;
|
||||
if (midi_cmd_pos >= midi_cmd_len)
|
||||
{
|
||||
PlayMsg(midi_cmd_buf);
|
||||
midi_cmd_pos = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void midi_reset()
|
||||
{
|
||||
uint8_t buf[64], used;
|
||||
|
||||
/* Flush buffers */
|
||||
midiOutReset(midi_out_device);
|
||||
|
||||
/* GM1 reset */
|
||||
buf[0] = 0xf0;
|
||||
buf[1] = 0x7e;
|
||||
buf[2] = 0x7f;
|
||||
buf[3] = 0x09;
|
||||
buf[4] = 0x01;
|
||||
buf[5] = 0xf7;
|
||||
PlaySysex((uint8_t *) buf, 6);
|
||||
|
||||
/* GS1 reset */
|
||||
buf[0] = 0xf0;
|
||||
buf[1] = 0x41;
|
||||
buf[2] = 0x10;
|
||||
buf[3] = 0x42;
|
||||
buf[4] = 0x12;
|
||||
buf[5] = 0x40;
|
||||
buf[6] = 0x00;
|
||||
buf[7] = 0x7f;
|
||||
buf[8] = 0x00;
|
||||
buf[9] = 0x41;
|
||||
buf[10] = 0xf7;
|
||||
PlaySysex((uint8_t *) buf, 11);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user