amiga_boottest

annotate src/copper.c @ 1:48093e4bd99a

stuff
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 21 Feb 2018 18:00:45 +0200
parents
children 58ebd84822e7
rev   line source
nuclear@1 1 #include "copper.h"
nuclear@1 2 #include "hwregs.h"
nuclear@1 3
nuclear@1 4 uint32_t *copperlist, *copperlist_end;
nuclear@1 5 static uint32_t *copmem, *curlist;
nuclear@1 6 static int mode, copmem_size;
nuclear@1 7
nuclear@1 8 extern uint32_t _mem_start;
nuclear@1 9
nuclear@1 10 int init_copper(int maxlist, int nlists)
nuclear@1 11 {
nuclear@1 12 /* allocate and set new copper lists */
nuclear@1 13 if(maxlist <= 0) maxlist = 256;
nuclear@1 14 mode = nlists >= COPPER_DOUBLE ? COPPER_DOUBLE : COPPER_SINGLE;
nuclear@1 15
nuclear@1 16 copmem_size = maxlist * 4 * mode;
nuclear@1 17 copmem = (uint32_t*)_mem_start;
nuclear@1 18
nuclear@1 19 curlist = copperlist = copmem;
nuclear@1 20 *curlist = COPPER_END;
nuclear@1 21
nuclear@1 22 if(mode == COPPER_DOUBLE) {
nuclear@1 23 copperlist = curlist + maxlist;
nuclear@1 24 *copperlist = COPPER_END;
nuclear@1 25 }
nuclear@1 26 copperlist_end = copperlist;
nuclear@1 27
nuclear@1 28 REG32_COP1LC = (uint32_t)curlist;
nuclear@1 29 REG_COPJMP1 = 0; /* causes copper to read COP1LC */
nuclear@1 30 return 0;
nuclear@1 31 }
nuclear@1 32
nuclear@1 33 void cleanup_copper(void)
nuclear@1 34 {
nuclear@1 35 }
nuclear@1 36
nuclear@1 37 void enable_copper(void)
nuclear@1 38 {
nuclear@1 39 REG_DMACON = SETBITS(DMA_COPPER);
nuclear@1 40 }
nuclear@1 41
nuclear@1 42 void disable_copper(void)
nuclear@1 43 {
nuclear@1 44 REG_DMACON = CLRBITS(DMA_COPPER);
nuclear@1 45 }
nuclear@1 46
nuclear@1 47 void clear_copper(void)
nuclear@1 48 {
nuclear@1 49 copperlist_end = copperlist;
nuclear@1 50 *copperlist_end = COPPER_END;
nuclear@1 51 }
nuclear@1 52
nuclear@1 53 void add_copper(uint32_t cmd)
nuclear@1 54 {
nuclear@1 55 *copperlist_end++ = cmd;
nuclear@1 56 }
nuclear@1 57
nuclear@1 58 void sort_copper(void)
nuclear@1 59 {
nuclear@1 60 /* TODO */
nuclear@1 61 }
nuclear@1 62
nuclear@1 63 void swap_copper(void)
nuclear@1 64 {
nuclear@1 65 if(mode == COPPER_DOUBLE) {
nuclear@1 66 uint32_t *tmpptr;
nuclear@1 67 tmpptr = curlist;
nuclear@1 68 curlist = copperlist;
nuclear@1 69 copperlist = copperlist_end = tmpptr;
nuclear@1 70
nuclear@1 71 REG32_COP1LC = (uint32_t)curlist;
nuclear@1 72 REG_COPJMP1 = 0;
nuclear@1 73 } else {
nuclear@1 74 copperlist_end = curlist;
nuclear@1 75 }
nuclear@1 76 *copperlist_end = COPPER_END;
nuclear@1 77 }