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@3: #define MAX_SKY_SHADES 25 nuclear@3: static uint16_t sky_color[][2] = { nuclear@3: {0, 0x204}, nuclear@3: {2, 0x205}, nuclear@3: {3, 0x305}, nuclear@3: {4, 0x306}, nuclear@3: {8, 0x307}, nuclear@3: {10, 0x407}, nuclear@3: {12, 0x408}, nuclear@3: {18, 0x508}, nuclear@3: {20, 0x509}, nuclear@3: {26, 0x50a}, nuclear@3: {28, 0x60a}, nuclear@3: {30, 0x60b}, nuclear@3: {38, 0x60c}, nuclear@3: {46, 0x70c}, nuclear@3: {52, 0x80c}, nuclear@3: {58, 0x80d}, nuclear@3: {62, 0x90d}, nuclear@3: {68, 0xa0d}, nuclear@3: {72, 0xb0d}, nuclear@3: {74, 0xb0c}, nuclear@3: {86, 0xc0c}, nuclear@3: {94, 0xd0c}, nuclear@3: {102, 0xd0b}, nuclear@3: {116, 0xe0b}, nuclear@3: {118, 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@3: /* XXX +10 hardcoded temporary scroll to see the middle of the grid nuclear@3: * until we implement proper scrolling and parallax nuclear@3: */ nuclear@3: grid_bpl0_addr = grid_addr + 10; nuclear@3: grid_bpl1_addr = grid_addr + BPLSIZE + 10; nuclear@3: grid_bpl2_addr = grid_addr + BPLSIZE * 2 + 10; 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@3: add_copper(COPPER_MOVE(REGN_COLOR1, sky_color[0][1])); 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