nuclear@1: #include nuclear@1: #include nuclear@1: #include nuclear@1: #include nuclear@1: #include "copper.h" nuclear@1: #include "hwregs.h" nuclear@1: nuclear@2: uint32_t *copperlist, *copperlist_end; nuclear@1: static uint32_t *copmem, *curlist; nuclear@1: static void *savedlist, *savedview; nuclear@1: static int mode, copmem_size; nuclear@1: nuclear@1: struct GfxBase *GfxBase; nuclear@1: nuclear@1: int init_copper(int maxlist, int nlists) nuclear@1: { nuclear@1: /* save copper list (TODO) */ nuclear@1: if((GfxBase = (struct GfxBase*)OpenLibrary("graphics.library", 0))) { nuclear@1: savedlist = GfxBase->copinit; nuclear@1: savedview = GfxBase->ActiView; nuclear@1: LoadView(0); nuclear@1: WaitTOF(); nuclear@1: WaitTOF(); nuclear@1: nuclear@1: CloseLibrary(GfxBase); nuclear@1: GfxBase = 0; nuclear@1: } nuclear@1: nuclear@1: /* allocate and set new copper lists */ nuclear@1: if(maxlist <= 0) maxlist = 256; nuclear@1: mode = nlists >= COPPER_DOUBLE ? COPPER_DOUBLE : COPPER_SINGLE; nuclear@1: nuclear@1: copmem_size = maxlist * 4 * mode; nuclear@1: if(!(copmem = (uint32_t*)AllocMem(copmem_size, MEMF_CHIP))) { nuclear@1: printf("failed to allocate chip memory for %d copper lists of %d instructions\n", nuclear@1: mode, maxlist); nuclear@1: return -1; nuclear@1: } nuclear@1: nuclear@1: curlist = copperlist = copmem; nuclear@1: *curlist = COPPER_END; nuclear@1: nuclear@1: if(mode == COPPER_DOUBLE) { nuclear@1: copperlist = curlist + maxlist; nuclear@1: *copperlist = COPPER_END; nuclear@1: } nuclear@1: copperlist_end= copperlist; nuclear@1: nuclear@1: REG32_COP1LC = (uint32_t)curlist; nuclear@1: REG_COPJMP1 = 0; /* causes copper to read COP1LC */ nuclear@1: return 0; nuclear@1: } nuclear@1: nuclear@1: void cleanup_copper(void) nuclear@1: { nuclear@1: /* restore copper list */ nuclear@1: REG32_COP1LC = (uint32_t)savedlist; nuclear@1: nuclear@1: if((GfxBase = (struct GfxBase*)OpenLibrary("graphics.library", 0))) { nuclear@1: GfxBase->copinit = savedlist; nuclear@1: LoadView(savedview); nuclear@1: WaitTOF(); nuclear@1: WaitTOF(); nuclear@1: CloseLibrary(GfxBase); nuclear@1: GfxBase = 0; nuclear@1: } nuclear@1: nuclear@1: if(copmem) { nuclear@1: FreeMem(copmem, copmem_size); nuclear@1: } nuclear@1: } nuclear@1: nuclear@1: void enable_copper(void) nuclear@1: { nuclear@1: REG_DMACON = SETBITS(DMA_COPPER); nuclear@1: } nuclear@1: nuclear@1: void disable_copper(void) nuclear@1: { nuclear@1: REG_DMACON = CLRBITS(DMA_COPPER); nuclear@1: } nuclear@1: nuclear@1: void clear_copper(void) nuclear@1: { nuclear@1: copperlist_end = copperlist; nuclear@1: *copperlist_end = COPPER_END; nuclear@1: } nuclear@1: nuclear@1: void add_copper(uint32_t cmd) nuclear@1: { nuclear@1: *copperlist_end++ = cmd; nuclear@1: } nuclear@1: nuclear@1: void sort_copper(void) nuclear@1: { nuclear@1: /* TODO */ nuclear@1: } nuclear@1: nuclear@1: void swap_copper(void) nuclear@1: { nuclear@1: if(mode == COPPER_DOUBLE) { nuclear@1: uint32_t *tmpptr; nuclear@1: tmpptr = curlist; nuclear@1: curlist = copperlist; nuclear@1: copperlist = copperlist_end = tmpptr; nuclear@1: nuclear@1: REG32_COP1LC = (uint32_t)curlist; nuclear@1: REG_COPJMP1 = 0; nuclear@1: } else { nuclear@1: copperlist_end = curlist; nuclear@1: } nuclear@1: *copperlist_end = COPPER_END; nuclear@1: }