Fixed FDI stream parameters passed to the 86F handler, FDI stream images now read correctly again; The National Semiconductors PC87306 SuperI/O chip now supports enhanced FDC mode.
58 lines
1.5 KiB
C
58 lines
1.5 KiB
C
#include "ibm.h"
|
|
#include "io.h"
|
|
#include "sound_mpu401_uart.h"
|
|
|
|
enum
|
|
{
|
|
STATUS_OUTPUT_NOT_READY = 0x40,
|
|
STATUS_INPUT_NOT_READY = 0x80
|
|
};
|
|
|
|
static void mpu401_uart_write(uint16_t addr, uint8_t val, void *p)
|
|
{
|
|
mpu401_uart_t *mpu = (mpu401_uart_t *)p;
|
|
|
|
if (addr & 1) /*Command*/
|
|
{
|
|
switch (val)
|
|
{
|
|
case 0xff: /*Reset*/
|
|
mpu->rx_data = 0xfe; /*Acknowledge*/
|
|
mpu->status = 0;
|
|
mpu->uart_mode = 0;
|
|
break;
|
|
|
|
case 0x3f: /*Enter UART mode*/
|
|
mpu->rx_data = 0xfe; /*Acknowledge*/
|
|
mpu->status = 0;
|
|
mpu->uart_mode = 1;
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*Data*/
|
|
if (mpu->uart_mode)
|
|
midi_write(val);
|
|
}
|
|
|
|
static uint8_t mpu401_uart_read(uint16_t addr, void *p)
|
|
{
|
|
mpu401_uart_t *mpu = (mpu401_uart_t *)p;
|
|
|
|
if (addr & 1) /*Status*/
|
|
return mpu->status;
|
|
|
|
/*Data*/
|
|
mpu->status |= STATUS_INPUT_NOT_READY;
|
|
return mpu->rx_data;
|
|
}
|
|
|
|
void mpu401_uart_init(mpu401_uart_t *mpu, uint16_t addr)
|
|
{
|
|
mpu->status = STATUS_INPUT_NOT_READY;
|
|
mpu->uart_mode = 0;
|
|
|
|
io_sethandler(addr, 0x0002, mpu401_uart_read, NULL, NULL, mpu401_uart_write, NULL, NULL, mpu);
|
|
}
|