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