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 setRxReady(MSXRs232* msxRs232, int status) { if (~msxRs232->intmask & INTMASK_RXREADY) { if (status) boardSetInt(1); else boardClearInt(1); } }
void ym2151Irq(void* ptr, int irq) { YM2151* ym2151 = (YM2151*)ptr; if (irq) { boardSetDataBus(ym2151->irqVector, 0, 0); boardSetInt(0x40); } else { boardClearInt(0x40); } }
/* status set and IRQ handling */ void OPL_STATUS_SET(FM_OPL *OPL,int flag) { /* set status flag */ OPL->status |= flag; if(!(OPL->status & 0x80)) { if(OPL->status & OPL->statusmask) { /* IRQ on */ OPL->status |= 0x80; boardSetInt(0x10); } } }
static void setRxRDYIRQ(MSXMidi* msxMidi, int status) { if (msxMidi->rxrdyIRQlatch != status) { msxMidi->rxrdyIRQlatch = status; if (msxMidi->rxrdyIRQenabled) { if (msxMidi->rxrdyIRQlatch) { boardSetInt(INT_RXRDY); } else { boardClearInt(INT_RXRDY); } } } }
static void enableTimerIRQ(MSXMidi* msxMidi, int enabled) { if (msxMidi->timerIRQenabled != enabled) { msxMidi->timerIRQenabled = enabled; if (msxMidi->timerIRQlatch) { if (msxMidi->timerIRQenabled) { boardSetInt(INT_TMR); } else { boardClearInt(INT_TMR); } } i8254SetGate(msxMidi->i8254, 2, msxMidi->timerIRQenabled && !msxMidi->timerIRQlatch); } }
static void setTimerIRQ(MSXMidi* msxMidi, int status) { if (msxMidi->timerIRQlatch != status) { msxMidi->timerIRQlatch = status; if (msxMidi->timerIRQenabled) { if (msxMidi->timerIRQlatch) { boardSetInt(INT_TMR); } else { boardClearInt(INT_TMR); } } i8254SetGate(msxMidi->i8254, 2, msxMidi->timerIRQenabled && !msxMidi->timerIRQlatch); } }
static void onTrans(PhilipsMidi* 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) { boardSetInt(0x400); 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 onRecv(PhilipsMidi* midi, UInt32 time) { midi->timeRecv = 0; if (midi->status & STAT_RXRDY) { midi->status |= STAT_OE; } else 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) { boardSetInt(0x400); midi->status |= ST_INT; } } midi->timeRecv = boardSystemTime() + midi->charTime; boardTimerAdd(midi->timerRecv, midi->timeRecv); }
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); } }