static void write(RomMapperNet* rm, UInt16 address, UInt8 value) { if (address < 0x3ff0 || address >= 0x3ff8) { return; } switch (address & 0x3fff) { case 0x3ff0: ym2151Write(rm->ym2151, 0, value); break; case 0x3ff1: ym2151Write(rm->ym2151, 1, value); break; case 0x3ff2: rm->kbdLatch = value; break; case 0x3ff3: ym2148SetVector(rm->ym2148, value); break; case 0x3ff4: boardSetDataBus(value, value, 1); ym2151SetIrqVector(rm->ym2151, value); break; case 0x3ff5: ym2148WriteData(rm->ym2148, value); break; case 0x3ff6: ym2148WriteCommand(rm->ym2148, value); break; } }
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); }
void ym2151Irq(void* ptr, int irq) { YM2151* ym2151 = (YM2151*)ptr; if (irq) { boardSetDataBus(ym2151->irqVector, 0, 0); boardSetInt(0x40); } else { boardClearInt(0x40); } }
static void onTrans(YM2148* midi, UInt32 time) { midi->timeTrans = 0; if (midi->status & STAT_TXEMPTY) { midi->txPending = 0; } else { midiIoTransmit(midi->midiIo, midi->txBuffer); midi->timeTrans = boardSystemTime() + midi->charTime; boardTimerAdd(midi->timerTrans, midi->timeTrans); midi->status |= STAT_TXEMPTY; if (midi->command & CMD_WRINT) { boardSetDataBus(midi->vector, 0, 0); boardSetInt(0x800); midi->status |= ST_INT; } } }
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 onTrans(YM2148* midi, UInt32 time) { midi->timeTrans = 0; midiIoTransmit(midi->midiIo, midi->sendByte); if (midi->status & STAT_TXRDY) { midi->status |= STAT_TXEMPTY; if (midi->command & CMD_TXINT) { boardSetDataBus(midi->vector, 0, 0); boardSetInt(0x800); midi->status |= ST_INT; } } else { midi->status |= STAT_TXRDY; midi->status &= ~STAT_TXEMPTY; midi->sendByte = midi->sendBuffer; midi->timeTrans = boardSystemTime() + midi->charTime; boardTimerAdd(midi->timerTrans, midi->timeTrans); } }
static void ym2148SetVector(YM2148* midi, UInt8 value) { midi->vector = value; boardSetDataBus(midi->vector, 0, 0); }