__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; } } }