/************************************************************************ ********** ********** ********** C O P P E R I N T E R R U P T ********** ********** ------------------------------- ********** ********** ********** ********** Copyright (C) 1988 Sassenrath Research ********** ********** All Rights Reserved. ********** ********** ********** ********** Example from the "Guru's Guide, Meditation #1" ********** ********** ********** ************************************************************************* ** ** ** - NOTICE - ** ** ** ** The "Guru's Guide, Meditation #1" contains detailed information ** ** about Amiga interrupts as well as a complete discussion of this ** ** and other examples. Meditation #1 and all of its examples were ** ** written by Carl Sassenrath, the architect of Amiga's multitasking ** ** operating system. Copies of the "Guru's Guide" may be obtained ** ** from: ** ** GURU'S GUIDE, P.O. BOX 1510, UKIAH, CA 95482 ** ** ** ** Please include a check for $14.95, plus $1.50 shipping ($4.00 if ** ** outside North America). CA residents add 6% sales tax. ** ** ** ** This example may be used for any purposes, commercial, personal, ** ** public, and private, so long as ALL of the above text, copyright, ** ** mailing address, and this notice are retained in their entirety. ** ** ** ** THIS EXAMPLE IS PROVIDED WITHOUT WARRANTY OF ANY KIND. ** ** ** ************************************************************************/ /* ** COMPILATION NOTE: ** ** Compiled under MANX AZTEC C 3.6A. Use the +L compiler option ** and the "c32" library. Link with intrsup.o. */ #include #include #include #include #include #include APTR GfxBase = NULL; APTR IntuitionBase = NULL; struct Task *ATask = NULL; struct Interrupt *Intr = NULL; struct Screen *AScreen = NULL; struct ViewPort *VPort = NULL; struct UCopList *CoprList = NULL; struct UCopList *SaveList = NULL; long ASignal = -1; long Count = 120; /* Intuition Screen Specification */ struct NewScreen ScreenSpec = { 0,0, 320,200,4, 0,0,0, CUSTOMSCREEN, 0, (UBYTE *) "Copper Example", 0 }; /* Interrupt Processing Code */ VOID IntrProc() { int_start(); if (--Count <= 0) Signal(ATask,1 << ASignal); int_end(); } main() { MainInit(); VPort = &AScreen->ViewPort; /* Save old user copper list */ SaveList = VPort->UCopIns; /* Build a Copper List */ CINIT(CoprList,100); CWAIT(CoprList,100, 0); /* Video Line 100 */ CMOVE(CoprList,custom.intreq,INTF_SETCLR | INTF_COPER); CEND(CoprList); /* Insert new user copper list */ VPort->UCopIns = CoprList; MakeScreen(AScreen); RethinkDisplay(); /* Setup copper interrupt */ AddIntServer(INTB_COPER, Intr); /* Something else to do... */ while (Count > 0) printf("%d\n",Count); Wait(1 << ASignal); /* Sync-up */ /* Clean up */ RemIntServer(INTB_COPER, Intr); MainExit(0); } MainInit() { extern APTR OpenLibrary(); extern struct Screen *OpenScreen(); extern struct Interrupt *MakeIntr(); extern long AllocSignal(); extern struct Task *FindTask(); extern void *AllocMem(); extern int Enable_Abort; Enable_Abort = 0; /* prevent a CTRL-C */ GfxBase = OpenLibrary("graphics.library", 30); if (GfxBase == NULL) MainExit(201); IntuitionBase = OpenLibrary("intuition.library", 30); if (GfxBase == NULL) MainExit(202); AScreen = OpenScreen(&ScreenSpec); if (AScreen == NULL) MainExit(210); CoprList = AllocMem(sizeof(*CoprList), MEMF_CLEAR); if (CoprList == NULL) MainExit(220); ASignal = AllocSignal(-1); if (ASignal == -1) MainExit(230); Intr = MakeIntr("copper.example",0,&IntrProc,0); if (Intr == NULL) MainExit(240); ATask = FindTask(NULL); } MainExit(error) int error; { if (AScreen != NULL) { VPort->UCopIns = SaveList; /* restore it */ MakeScreen(AScreen); RethinkDisplay(); CloseScreen(AScreen); } if (CoprList != NULL) { /* Free intermediate copper list */ FreeCopList(CoprList->FirstCopList); FreeMem(CoprList,sizeof(*CoprList)); } FreeIntr(Intr); if (ASignal != -1) FreeSignal(ASignal); if (IntuitionBase != NULL) CloseLibrary(IntuitionBase); if (GfxBase != NULL) CloseLibrary(GfxBase); exit(error); }