nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "inttypes.h" nuclear@1: #include "copper.h" nuclear@0: #include "mouse.h" nuclear@0: #include "hwregs.h" nuclear@0: nuclear@0: #define WIDTH 480 nuclear@0: #define HEIGHT 128 nuclear@0: nuclear@0: #define BPLSIZE (WIDTH / 8 * HEIGHT) nuclear@0: #define MAX_HSCROLL (WIDTH - 320) nuclear@0: #define HMOD (MAX_HSCROLL / 8) nuclear@0: nuclear@0: static uint16_t prev_intena, prev_intreq, prev_adkcon, prev_dmacon; nuclear@0: nuclear@0: extern uint32_t backdrop; nuclear@2: extern uint32_t grid; nuclear@2: nuclear@2: static uint32_t backdrop_addr = (uint32_t)&backdrop; nuclear@2: static uint32_t grid_addr = (uint32_t)&grid; nuclear@2: nuclear@2: static uint16_t *grid_pal; nuclear@2: nuclear@2: #define MAX_GRID_SHADES 6 nuclear@2: static uint32_t *cplist_pal[MAX_GRID_SHADES]; nuclear@2: nuclear@2: #define MAX_SKY_SHADES 32 nuclear@2: static uint16_t sky_color[] = { nuclear@2: 0x204, nuclear@2: 0x306, nuclear@2: 0x307, nuclear@2: 0x408, 0x408, nuclear@2: 0x509, nuclear@2: 0x50a, nuclear@2: 0x60b, 0x60b, nuclear@2: 0x60c, 0x60c, nuclear@2: 0x70c, 0x70c, nuclear@2: 0x80c, nuclear@2: 0x80d, nuclear@2: 0x90d, 0x90d, nuclear@2: 0xa0d, nuclear@2: 0xb0c, 0xb0c, 0xb0c, nuclear@2: 0xc0c, 0xc0c, nuclear@2: 0xd0c, 0xd0c, nuclear@2: 0xd0b, 0xd0b, 0xd0b, 0xd0b, nuclear@2: 0xe0a, 0xe0a, 0xe0a nuclear@2: }; nuclear@0: nuclear@0: int init(void); nuclear@0: void cleanup(void); nuclear@0: void wait_vpos(int x); nuclear@0: void wait_vblank(void); nuclear@0: nuclear@0: int main(void) nuclear@0: { nuclear@2: int i, j, x, y; nuclear@2: long frameno = 0; nuclear@2: uint16_t tmpcol; nuclear@2: uint16_t *cplptr; nuclear@0: nuclear@0: if(init() == -1) { nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: while(!mouse_state(&x, &y)) { nuclear@0: wait_vblank(); nuclear@2: nuclear@2: if((frameno++ & 1) == 0) { nuclear@2: tmpcol = grid_pal[7]; nuclear@2: for(i=7; i>2; i--) { nuclear@2: grid_pal[i] = grid_pal[i - 1]; nuclear@2: } nuclear@2: grid_pal[2] = tmpcol; nuclear@2: } nuclear@2: nuclear@2: for(i=0; i> 8) * (i + 1) / MAX_GRID_SHADES; nuclear@2: uint16_t g = ((grid_pal[j] & 0xf0) >> 4) * (i + 1) / MAX_GRID_SHADES; nuclear@2: uint16_t b = (grid_pal[j] & 0xf) * (i + 1) / MAX_GRID_SHADES; nuclear@2: nuclear@2: cplptr[1] = (r << 8) | (g << 4) | b; nuclear@2: cplptr += 2; nuclear@2: } nuclear@2: } nuclear@0: } nuclear@0: nuclear@0: cleanup(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int init(void) nuclear@0: { nuclear@2: int i, j, x, y, bit; nuclear@0: unsigned char *fbptr; nuclear@0: unsigned char tmp; nuclear@2: uint32_t grid_bpl0_addr, grid_bpl1_addr, grid_bpl2_addr; nuclear@0: nuclear@0: Forbid(); nuclear@0: nuclear@1: /* initialize copper */ nuclear@1: if(init_copper(0, 0) == -1) { nuclear@1: return -1; nuclear@1: } nuclear@1: nuclear@0: prev_dmacon = REG_DMACONR; nuclear@0: REG_DMACON = CLRBITS(DMA_ALL); nuclear@0: nuclear@0: prev_intena = REG_INTENAR; nuclear@0: REG_INTENA = SETBITS(INTEN_ALL); nuclear@0: nuclear@0: prev_intreq = REG_INTREQR; nuclear@0: prev_adkcon = REG_ADKCONR; nuclear@0: nuclear@0: REG_BPLCON0 = BPLCON0_COUNT(1) | BPLCON0_COLOR; nuclear@0: REG_BPLCON1 = 0; /* h-scroll */ nuclear@0: REG_BPL1MOD = HMOD; nuclear@0: REG_BPL2MOD = HMOD; nuclear@0: REG_DIWSTART = 0x2981; nuclear@0: REG_DIWSTOP = 0x29c1; nuclear@0: REG_DDFSTART = 0x38; nuclear@0: REG_DDFSTOP = 0xd0; nuclear@0: nuclear@2: grid_pal = (uint16_t*)(grid_addr + BPLSIZE * 3); nuclear@2: nuclear@2: grid_bpl0_addr = grid_addr; nuclear@2: grid_bpl1_addr = grid_addr + BPLSIZE; nuclear@2: grid_bpl2_addr = grid_addr + BPLSIZE * 2; nuclear@2: nuclear@2: for(i=0; i<8; i++) { nuclear@2: REG_COLOR_PTR[i] = grid_pal[i]; nuclear@2: } nuclear@0: nuclear@0: wait_vblank(); nuclear@2: add_copper(COPPER_MOVE(REGN_BPLCON0, BPLCON0_COUNT(1) | BPLCON0_COLOR)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL1PTH, backdrop_addr >> 16)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL1PTL, backdrop_addr)); nuclear@0: nuclear@2: add_copper(COPPER_MOVE(REGN_COLOR1, sky_color[0])); nuclear@2: nuclear@2: for(i=0; i> 16)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL1PTL, grid_bpl0_addr)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL2PTH, grid_bpl1_addr >> 16)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL2PTL, grid_bpl1_addr)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL3PTH, grid_bpl2_addr >> 16)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPL3PTL, grid_bpl2_addr)); nuclear@2: nuclear@2: add_copper(COPPER_VWAIT(128)); nuclear@2: add_copper(COPPER_MOVE(REGN_BPLCON0, BPLCON0_COUNT(3) | BPLCON0_COLOR)); nuclear@2: nuclear@2: add_copper(COPPER_MOVE(REGN_COLOR0, grid_pal[0])); nuclear@2: for(i=0; i