amiga_cyberspace

annotate src/copper.c @ 2:b98fa9b135ea

first version which looks good
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 27 Jul 2017 02:34:42 +0300
parents b5d609c7161d
children
rev   line source
nuclear@1 1 #include <stdio.h>
nuclear@1 2 #include <exec/memory.h>
nuclear@1 3 #include <exec/libraries.h>
nuclear@1 4 #include <graphics/gfxbase.h>
nuclear@1 5 #include "copper.h"
nuclear@1 6 #include "hwregs.h"
nuclear@1 7
nuclear@2 8 uint32_t *copperlist, *copperlist_end;
nuclear@1 9 static uint32_t *copmem, *curlist;
nuclear@1 10 static void *savedlist, *savedview;
nuclear@1 11 static int mode, copmem_size;
nuclear@1 12
nuclear@1 13 struct GfxBase *GfxBase;
nuclear@1 14
nuclear@1 15 int init_copper(int maxlist, int nlists)
nuclear@1 16 {
nuclear@1 17 /* save copper list (TODO) */
nuclear@1 18 if((GfxBase = (struct GfxBase*)OpenLibrary("graphics.library", 0))) {
nuclear@1 19 savedlist = GfxBase->copinit;
nuclear@1 20 savedview = GfxBase->ActiView;
nuclear@1 21 LoadView(0);
nuclear@1 22 WaitTOF();
nuclear@1 23 WaitTOF();
nuclear@1 24
nuclear@1 25 CloseLibrary(GfxBase);
nuclear@1 26 GfxBase = 0;
nuclear@1 27 }
nuclear@1 28
nuclear@1 29 /* allocate and set new copper lists */
nuclear@1 30 if(maxlist <= 0) maxlist = 256;
nuclear@1 31 mode = nlists >= COPPER_DOUBLE ? COPPER_DOUBLE : COPPER_SINGLE;
nuclear@1 32
nuclear@1 33 copmem_size = maxlist * 4 * mode;
nuclear@1 34 if(!(copmem = (uint32_t*)AllocMem(copmem_size, MEMF_CHIP))) {
nuclear@1 35 printf("failed to allocate chip memory for %d copper lists of %d instructions\n",
nuclear@1 36 mode, maxlist);
nuclear@1 37 return -1;
nuclear@1 38 }
nuclear@1 39
nuclear@1 40 curlist = copperlist = copmem;
nuclear@1 41 *curlist = COPPER_END;
nuclear@1 42
nuclear@1 43 if(mode == COPPER_DOUBLE) {
nuclear@1 44 copperlist = curlist + maxlist;
nuclear@1 45 *copperlist = COPPER_END;
nuclear@1 46 }
nuclear@1 47 copperlist_end= copperlist;
nuclear@1 48
nuclear@1 49 REG32_COP1LC = (uint32_t)curlist;
nuclear@1 50 REG_COPJMP1 = 0; /* causes copper to read COP1LC */
nuclear@1 51 return 0;
nuclear@1 52 }
nuclear@1 53
nuclear@1 54 void cleanup_copper(void)
nuclear@1 55 {
nuclear@1 56 /* restore copper list */
nuclear@1 57 REG32_COP1LC = (uint32_t)savedlist;
nuclear@1 58
nuclear@1 59 if((GfxBase = (struct GfxBase*)OpenLibrary("graphics.library", 0))) {
nuclear@1 60 GfxBase->copinit = savedlist;
nuclear@1 61 LoadView(savedview);
nuclear@1 62 WaitTOF();
nuclear@1 63 WaitTOF();
nuclear@1 64 CloseLibrary(GfxBase);
nuclear@1 65 GfxBase = 0;
nuclear@1 66 }
nuclear@1 67
nuclear@1 68 if(copmem) {
nuclear@1 69 FreeMem(copmem, copmem_size);
nuclear@1 70 }
nuclear@1 71 }
nuclear@1 72
nuclear@1 73 void enable_copper(void)
nuclear@1 74 {
nuclear@1 75 REG_DMACON = SETBITS(DMA_COPPER);
nuclear@1 76 }
nuclear@1 77
nuclear@1 78 void disable_copper(void)
nuclear@1 79 {
nuclear@1 80 REG_DMACON = CLRBITS(DMA_COPPER);
nuclear@1 81 }
nuclear@1 82
nuclear@1 83 void clear_copper(void)
nuclear@1 84 {
nuclear@1 85 copperlist_end = copperlist;
nuclear@1 86 *copperlist_end = COPPER_END;
nuclear@1 87 }
nuclear@1 88
nuclear@1 89 void add_copper(uint32_t cmd)
nuclear@1 90 {
nuclear@1 91 *copperlist_end++ = cmd;
nuclear@1 92 }
nuclear@1 93
nuclear@1 94 void sort_copper(void)
nuclear@1 95 {
nuclear@1 96 /* TODO */
nuclear@1 97 }
nuclear@1 98
nuclear@1 99 void swap_copper(void)
nuclear@1 100 {
nuclear@1 101 if(mode == COPPER_DOUBLE) {
nuclear@1 102 uint32_t *tmpptr;
nuclear@1 103 tmpptr = curlist;
nuclear@1 104 curlist = copperlist;
nuclear@1 105 copperlist = copperlist_end = tmpptr;
nuclear@1 106
nuclear@1 107 REG32_COP1LC = (uint32_t)curlist;
nuclear@1 108 REG_COPJMP1 = 0;
nuclear@1 109 } else {
nuclear@1 110 copperlist_end = curlist;
nuclear@1 111 }
nuclear@1 112 *copperlist_end = COPPER_END;
nuclear@1 113 }