void Timer::attachInterrupt(isrFunc f) { uint32_t irq = getIRQ(); if (irq > 0) { Interrupt::attachInterrupt(irq, f); Interrupt::enableIRQ(irq); } }
void Timer::detatchInterrupt() { uint32_t irq = getIRQ(); if (irq > 0) { Interrupt::disableIRQ(irq); Interrupt::detatchInterrupt(irq); } }
//****************************************************************************** //****************************************************************************** extern "C" ULONG __cdecl __saveregs OSSIDC_EntryPoint(ULONG cmd, IDC16_PACKET FAR *packet) { BOOL fPciDevice = TRUE; int i; switch(cmd & 0xFFFF) { case IDC16_INIT: break; case IDC16_EXIT: IDCTable.ProtIDCEntry = 0; break; case IDC16_SETIRQ: { IRQ *pIrq = pMakeIRQ((USHORT)packet->irq.irqnr); if(!pIrq) return FALSE; if(pIrq->bAddHandler(OSS_Irq_Handler) == FALSE) { DebugInt3(); return FALSE; } if(pIrq->bEnableHandler(OSS_Irq_Handler) == FALSE) { DebugInt3(); return FALSE; } return TRUE; } case IDC16_FREEIRQ: { IRQ *pIrq = getIRQ((USHORT)packet->irq.irqnr); if(!pIrq) return FALSE; if(pIrq->bDisableHandler(OSS_Irq_Handler) == FALSE) { DebugInt3(); return FALSE; } return TRUE; } case IDC16_FIND_PNPDEVICE: fPciDevice = FALSE; //fall through case IDC16_FIND_PCIDEVICE: { LDev_Resources* pResources; IDC_RESOURCE FAR *idcres = (IDC_RESOURCE FAR *)packet->finddev.pResource; if(!pRM->bIsDevDetected(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice)) { return 0; } pResources = pRM->pGetDevResources(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice); if ((!pResources) || pResources->isEmpty()) { return 0; } // Available device resources identified for(i=0;i<MAX_ISA_Dev_IO;i++) { idcres->io[i] = pResources->uIOBase[i]; idcres->iolength[i] = pResources->uIOLength[i]; } for(i=0;i<MAX_ISA_Dev_IRQ;i++) { idcres->irq[i] = pResources->uIRQLevel[i]; } for(i=0;i<MAX_ISA_Dev_DMA;i++) { idcres->dma[i] = pResources->uDMAChannel[i]; } for(i=0;i<MAX_ISA_Dev_MEM;i++) { idcres->mem[i] = pResources->uMemBase[i]; idcres->memlength[i] = pResources->uMemLength[i]; } delete pResources; return 1; } case IDC16_MALLOC: { LIN linaddr; ULONG near *addr16 = (ULONG near *)malloc((USHORT)packet->malloc.size+4); ULONG far *addr = (ULONG far *)addr16; if(addr16 == NULL) { return 0; } *addr = (ULONG)addr; if(DevHelp_VirtToLin(SELECTOROF(addr), OFFSETOF(addr), &linaddr)) { dprintf(("DevHelp_VirtToLin failed for %x:%x\n", SELECTOROF(addr), OFFSETOF(addr))); DebugInt3(); return 0; } return linaddr; } case IDC16_FREE: free((void __near *)(void far *)packet->free.addr); break; case IDC16_VMALLOC: break; case IDC16_VMFREE: break; case IDC16_PROCESS: { PWAVESTREAM pStream; if(packet->process.type == IDC16_MIDI_IRQ) { MPU_401::processIrq(packet->process.streamid); break; } pStream = (PWAVESTREAM)FindActiveStream((packet->process.type == IDC16_WAVEOUT_IRQ) ? STREAM_WAVE_PLAY : STREAM_WAVE_CAPTURE, packet->process.streamid); if(pStream) { pStream->Process(); return 0; } dprintf(("Stream %lx not found or not active!", packet->process.streamid)); break; } } return 0; }