static void onRecv(YM2148* midi, UInt32 time) { midi->timeRecv = 0; if (midi->status & STAT_RXRDY) { midi->status |= STAT_OE; if (midi->command & CMD_RSTER) { ym2148Reset(midi); return; } } if (midi->rxPending != 0) { archSemaphoreWait(midi->semaphore, -1); midi->rxData = midi->rxQueue[(midi->rxHead - midi->rxPending) & (RX_QUEUE_SIZE - 1)]; midi->rxPending--; archSemaphoreSignal(midi->semaphore); midi->status |= STAT_RXRDY; if (midi->command & CMD_RDINT) { boardSetDataBus(midi->vector, 0, 0); boardSetInt(0x800); midi->status |= ST_INT; } } midi->timeRecv = boardSystemTime() + midi->charTime; boardTimerAdd(midi->timerRecv, midi->timeRecv); }
static void ym2148WriteCommand(YM2148* midi, UInt8 value) { midi->command = value; if (value & 0x02) { } if (value & CMD_RST) { ym2148Reset(midi); } midi->charTime = (UInt32)((UInt64)144 * boardFrequency() / 500000); }
static YM2148* ym2148Create() { YM2148* midi = (YM2148*)calloc(1, sizeof(YM2148)); midi->midiIo = midiIoCreate(midiInCallback, midi); midi->semaphore = archSemaphoreCreate(1); midi->timerRecv = boardTimerCreate(onRecv, midi); midi->timerTrans = boardTimerCreate(onTrans, midi); ym2148Reset(midi); return midi; }
static void ym2148WriteCommand(YM2148* midi, UInt8 value) { UInt8 oldValue = midi->command; midi->command = value; if (value & CMD_RST) { ym2148Reset(midi); return; } if (value & CMD_TXINT) { if ((midi->status & STAT_TXEMPTY) && (value & CMD_TXEN)) { if (midi->command & CMD_TXINT) { boardSetDataBus(midi->vector, 0, 0); boardSetInt(0x800); midi->status |= ST_INT; } } } }
static void reset(RomMapperNet* rm) { ym2151Reset(rm->ym2151); ym2148Reset(rm->ym2148); rm->kbdLatch = 0; }