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:
OBattler
2017-05-10 14:52:38 +02:00
parent feb2846018
commit 53317aed28
3 changed files with 214 additions and 14 deletions

View File

@@ -253,7 +253,7 @@ static void MPU401_WriteCommand(mpu_t *mpu, uint8_t val)
static void MPU401_WriteData(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) switch (mpu->state.command_byte)
{ /* 0xe# command data */ { /* 0xe# command data */
@@ -634,14 +634,17 @@ next_event:
void mpu401_init(mpu_t *mpu, uint16_t addr, int irq, int mode) void mpu401_init(mpu_t *mpu, uint16_t addr, int irq, int mode)
{ {
mpu->status = STATUS_INPUT_NOT_READY; mpu->status = STATUS_INPUT_NOT_READY;
mpu->irq = irq; mpu->irq = irq;
mpu->queue_used = 0; mpu->queue_used = 0;
mpu->queue_pos = 0; mpu->queue_pos = 0;
mpu->mode = mode; mpu->mode = M_UART;
io_sethandler(addr, 0x0002, mpu401_read, NULL, NULL, mpu401_write, NULL, NULL, mpu); mpu->intelligent = (mode == M_INTELLIGENT) ? 1 : 0;
timer_add(MPU401_Event, &mpu401_event_callback, &mpu401_event_callback, mpu);
MPU401_Reset(mpu); 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);
} }

View File

@@ -2373,7 +2373,7 @@ static device_config_t BuslogicConfig[] = {
device_t buslogic_device = { device_t buslogic_device = {
"Buslogic BT-542B PCI", "Buslogic BT-542B ISA",
0, 0,
Buslogic_542B_Init, Buslogic_542B_Init,
BuslogicClose, BuslogicClose,
@@ -2385,7 +2385,7 @@ device_t buslogic_device = {
}; };
device_t buslogic_pci_device = { device_t buslogic_pci_device = {
"Buslogic BT-542B PCI", "Buslogic BT-958D PCI",
0, 0,
Buslogic_958D_Init, Buslogic_958D_Init,
BuslogicClose, BuslogicClose,

View File

@@ -10,21 +10,33 @@
static int midi_id; static int midi_id;
static HMIDIOUT midi_out_device = NULL; static HMIDIOUT midi_out_device = NULL;
HANDLE m_event;
void midi_close(); void midi_close();
void midi_init() void midi_init()
{ {
MMRESULT hr; MMRESULT hr = MMSYSERR_NOERROR;
midi_id = config_get_int(NULL, "midi", 0); 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, hr = midiOutOpen(&midi_out_device, midi_id, 0,
0, CALLBACK_NULL); 0, CALLBACK_NULL);
#endif
hr = midiOutOpen(&midi_out_device, midi_id, (DWORD) m_event,
0, CALLBACK_EVENT);
if (hr != MMSYSERR_NOERROR) { if (hr != MMSYSERR_NOERROR) {
printf("midiOutOpen error - %08X\n",hr); printf("midiOutOpen error - %08X\n",hr);
midi_id = 0; midi_id = 0;
#if 0
hr = midiOutOpen(&midi_out_device, midi_id, 0, hr = midiOutOpen(&midi_out_device, midi_id, 0,
0, CALLBACK_NULL); 0, CALLBACK_NULL);
#endif
hr = midiOutOpen(&midi_out_device, midi_id, (DWORD) m_event,
0, CALLBACK_EVENT);
if (hr != MMSYSERR_NOERROR) { if (hr != MMSYSERR_NOERROR) {
printf("midiOutOpen error - %08X\n",hr); printf("midiOutOpen error - %08X\n",hr);
return; return;
@@ -41,6 +53,7 @@ void midi_close()
midiOutReset(midi_out_device); midiOutReset(midi_out_device);
midiOutClose(midi_out_device); midiOutClose(midi_out_device);
midi_out_device = NULL; midi_out_device = NULL;
CloseHandle(m_event);
} }
} }
@@ -81,6 +94,7 @@ static void midi_send_sysex()
midi_insysex = 0; midi_insysex = 0;
} }
#if 0
void midi_write(uint8_t val) void midi_write(uint8_t val)
{ {
if ((val & 0x80) && !(val == 0xf7 && midi_insysex)) if ((val & 0x80) && !(val == 0xf7 && midi_insysex))
@@ -111,3 +125,186 @@ void midi_write(uint8_t val)
midiOutShortMsg(midi_out_device, midi_command); 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);
}