__amigainterrupt void blitManagerHandler(__reg("a0") struct Custom *cstm, __reg("a1") tBlitManager *pBlitManager)cstm->color[0] = 0x0F00; ++pBlitManager->uwBlitPos;
g_sBlitManager.pInt->is_Node.ln_Succ = 0; g_sBlitManager.pInt->is_Node.ln_Pred = 0; g_sBlitManager.pInt->is_Node.ln_Type = NT_INTERRUPT; g_sBlitManager.pInt->is_Node.ln_Pri = 10; g_sBlitManager.pInt->is_Node.ln_Name = g_sBlitManager.szHandlerName; g_sBlitManager.pInt->is_Data = &g_sBlitManager; g_sBlitManager.pInt->is_Code = blitManagerHandler; g_sBlitManager.pPrevInt = SetIntVector(INTB_BLIT, g_sBlitManager.pInt);
@asman, post #2
g_sBlitManager.pPrevInt = SetIntVector(INTB_BLIT, g_sBlitManager.pInt);
logWrite("Interrupt handler set to %p, fn: %p\n", g_sBlitManager.pInt, blitManagerHandler);
custom.dmacon = DMAF_SETCLR | DMAF_BLITTER;
logWrite("DMACON set\n");
custom.intena = INTF_SETCLR | INTF_BLIT;
logWrite("INTENA set\n");
custom.intreq = INTF_SETCLR | INTF_BLIT;
logWrite("INTREQ set\n");@Hexmage960, post #6
WaitBlit(); custom.dmacon = DMAF_BLITTER; custom.intreq = INTF_BLIT; custom.intena = INTF_BLIT; SetIntVector(INTB_BLIT, g_sBlitManager.pPrevInt);
@teh_KaiN, post #7
//store hardware registers custom = ((struct Custom*)0xDFF000); oldIntena = custom->intenar; oldDma = custom->dmaconr;
void EnableOS(void)
{
//stop ints and dma
stopIntsDma();
//restore hardware registers
custom->intena = oldIntena | 0xC000;
custom->dmacon = oldDma | 0x8000;
//dalsza częśćstatic void stopIntsDma(void)
{
UWORD t = 0x7fff;
custom->intena = t;
custom->dmacon = t;
custom->intreq = t;
}move.w #$7fff,intena(a5) move.w #$7fff,dmacon(a5) move.w #$7fff,intreq(a5)
move.w #$7fff,d0 move.w d0,intena(a5) move.w d0,dmacon(a5) move.w d0,intreq(a5)
void ScreenWaitForFrame(void)
{
while(TRUE)
{
ULONG line = (*((ULONG*)0xDFF004)) & 0x1ff00;
if (line == (303 << 8))
{
break;
}
}
}