amiga_cyberspace

annotate src/main.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 200e512488e4
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <proto/exec.h>
nuclear@0 3 #include <exec/memory.h>
nuclear@0 4 #include "inttypes.h"
nuclear@1 5 #include "copper.h"
nuclear@0 6 #include "mouse.h"
nuclear@0 7 #include "hwregs.h"
nuclear@0 8
nuclear@0 9 #define WIDTH 480
nuclear@0 10 #define HEIGHT 128
nuclear@0 11
nuclear@0 12 #define BPLSIZE (WIDTH / 8 * HEIGHT)
nuclear@0 13 #define MAX_HSCROLL (WIDTH - 320)
nuclear@0 14 #define HMOD (MAX_HSCROLL / 8)
nuclear@0 15
nuclear@0 16 static uint16_t prev_intena, prev_intreq, prev_adkcon, prev_dmacon;
nuclear@0 17
nuclear@0 18 extern uint32_t backdrop;
nuclear@2 19 extern uint32_t grid;
nuclear@2 20
nuclear@2 21 static uint32_t backdrop_addr = (uint32_t)&backdrop;
nuclear@2 22 static uint32_t grid_addr = (uint32_t)&grid;
nuclear@2 23
nuclear@2 24 static uint16_t *grid_pal;
nuclear@2 25
nuclear@2 26 #define MAX_GRID_SHADES 6
nuclear@2 27 static uint32_t *cplist_pal[MAX_GRID_SHADES];
nuclear@2 28
nuclear@2 29 #define MAX_SKY_SHADES 32
nuclear@2 30 static uint16_t sky_color[] = {
nuclear@2 31 0x204,
nuclear@2 32 0x306,
nuclear@2 33 0x307,
nuclear@2 34 0x408, 0x408,
nuclear@2 35 0x509,
nuclear@2 36 0x50a,
nuclear@2 37 0x60b, 0x60b,
nuclear@2 38 0x60c, 0x60c,
nuclear@2 39 0x70c, 0x70c,
nuclear@2 40 0x80c,
nuclear@2 41 0x80d,
nuclear@2 42 0x90d, 0x90d,
nuclear@2 43 0xa0d,
nuclear@2 44 0xb0c, 0xb0c, 0xb0c,
nuclear@2 45 0xc0c, 0xc0c,
nuclear@2 46 0xd0c, 0xd0c,
nuclear@2 47 0xd0b, 0xd0b, 0xd0b, 0xd0b,
nuclear@2 48 0xe0a, 0xe0a, 0xe0a
nuclear@2 49 };
nuclear@0 50
nuclear@0 51 int init(void);
nuclear@0 52 void cleanup(void);
nuclear@0 53 void wait_vpos(int x);
nuclear@0 54 void wait_vblank(void);
nuclear@0 55
nuclear@0 56 int main(void)
nuclear@0 57 {
nuclear@2 58 int i, j, x, y;
nuclear@2 59 long frameno = 0;
nuclear@2 60 uint16_t tmpcol;
nuclear@2 61 uint16_t *cplptr;
nuclear@0 62
nuclear@0 63 if(init() == -1) {
nuclear@0 64 return 1;
nuclear@0 65 }
nuclear@0 66
nuclear@0 67 while(!mouse_state(&x, &y)) {
nuclear@0 68 wait_vblank();
nuclear@2 69
nuclear@2 70 if((frameno++ & 1) == 0) {
nuclear@2 71 tmpcol = grid_pal[7];
nuclear@2 72 for(i=7; i>2; i--) {
nuclear@2 73 grid_pal[i] = grid_pal[i - 1];
nuclear@2 74 }
nuclear@2 75 grid_pal[2] = tmpcol;
nuclear@2 76 }
nuclear@2 77
nuclear@2 78 for(i=0; i<MAX_GRID_SHADES; i++) {
nuclear@2 79 cplptr = (uint16_t*)cplist_pal[i];
nuclear@2 80 for(j=1; j<8; j++) {
nuclear@2 81 /*uint16_t foo = 15 * (i + 1) / MAX_GRID_SHADES;
nuclear@2 82 cplptr[1] = (foo << 8) | (foo << 4) | foo;*/
nuclear@2 83 uint16_t r = ((grid_pal[j] & 0xf00) >> 8) * (i + 1) / MAX_GRID_SHADES;
nuclear@2 84 uint16_t g = ((grid_pal[j] & 0xf0) >> 4) * (i + 1) / MAX_GRID_SHADES;
nuclear@2 85 uint16_t b = (grid_pal[j] & 0xf) * (i + 1) / MAX_GRID_SHADES;
nuclear@2 86
nuclear@2 87 cplptr[1] = (r << 8) | (g << 4) | b;
nuclear@2 88 cplptr += 2;
nuclear@2 89 }
nuclear@2 90 }
nuclear@0 91 }
nuclear@0 92
nuclear@0 93 cleanup();
nuclear@0 94 return 0;
nuclear@0 95 }
nuclear@0 96
nuclear@0 97 int init(void)
nuclear@0 98 {
nuclear@2 99 int i, j, x, y, bit;
nuclear@0 100 unsigned char *fbptr;
nuclear@0 101 unsigned char tmp;
nuclear@2 102 uint32_t grid_bpl0_addr, grid_bpl1_addr, grid_bpl2_addr;
nuclear@0 103
nuclear@0 104 Forbid();
nuclear@0 105
nuclear@1 106 /* initialize copper */
nuclear@1 107 if(init_copper(0, 0) == -1) {
nuclear@1 108 return -1;
nuclear@1 109 }
nuclear@1 110
nuclear@0 111 prev_dmacon = REG_DMACONR;
nuclear@0 112 REG_DMACON = CLRBITS(DMA_ALL);
nuclear@0 113
nuclear@0 114 prev_intena = REG_INTENAR;
nuclear@0 115 REG_INTENA = SETBITS(INTEN_ALL);
nuclear@0 116
nuclear@0 117 prev_intreq = REG_INTREQR;
nuclear@0 118 prev_adkcon = REG_ADKCONR;
nuclear@0 119
nuclear@0 120 REG_BPLCON0 = BPLCON0_COUNT(1) | BPLCON0_COLOR;
nuclear@0 121 REG_BPLCON1 = 0; /* h-scroll */
nuclear@0 122 REG_BPL1MOD = HMOD;
nuclear@0 123 REG_BPL2MOD = HMOD;
nuclear@0 124 REG_DIWSTART = 0x2981;
nuclear@0 125 REG_DIWSTOP = 0x29c1;
nuclear@0 126 REG_DDFSTART = 0x38;
nuclear@0 127 REG_DDFSTOP = 0xd0;
nuclear@0 128
nuclear@2 129 grid_pal = (uint16_t*)(grid_addr + BPLSIZE * 3);
nuclear@2 130
nuclear@2 131 grid_bpl0_addr = grid_addr;
nuclear@2 132 grid_bpl1_addr = grid_addr + BPLSIZE;
nuclear@2 133 grid_bpl2_addr = grid_addr + BPLSIZE * 2;
nuclear@2 134
nuclear@2 135 for(i=0; i<8; i++) {
nuclear@2 136 REG_COLOR_PTR[i] = grid_pal[i];
nuclear@2 137 }
nuclear@0 138
nuclear@0 139 wait_vblank();
nuclear@2 140 add_copper(COPPER_MOVE(REGN_BPLCON0, BPLCON0_COUNT(1) | BPLCON0_COLOR));
nuclear@2 141 add_copper(COPPER_MOVE(REGN_BPL1PTH, backdrop_addr >> 16));
nuclear@2 142 add_copper(COPPER_MOVE(REGN_BPL1PTL, backdrop_addr));
nuclear@0 143
nuclear@2 144 add_copper(COPPER_MOVE(REGN_COLOR1, sky_color[0]));
nuclear@2 145
nuclear@2 146 for(i=0; i<MAX_SKY_SHADES; i++) {
nuclear@2 147 add_copper(COPPER_VWAIT(i * 128 / MAX_SKY_SHADES));
nuclear@2 148 add_copper(COPPER_MOVE(REGN_COLOR1, sky_color[i]));
nuclear@2 149 }
nuclear@2 150
nuclear@2 151 add_copper(COPPER_VWAIT(125));
nuclear@2 152 add_copper(COPPER_MOVE(REGN_BPLCON0, BPLCON0_COLOR));
nuclear@2 153
nuclear@2 154 add_copper(COPPER_MOVE(REGN_BPL1PTH, grid_bpl0_addr >> 16));
nuclear@2 155 add_copper(COPPER_MOVE(REGN_BPL1PTL, grid_bpl0_addr));
nuclear@2 156 add_copper(COPPER_MOVE(REGN_BPL2PTH, grid_bpl1_addr >> 16));
nuclear@2 157 add_copper(COPPER_MOVE(REGN_BPL2PTL, grid_bpl1_addr));
nuclear@2 158 add_copper(COPPER_MOVE(REGN_BPL3PTH, grid_bpl2_addr >> 16));
nuclear@2 159 add_copper(COPPER_MOVE(REGN_BPL3PTL, grid_bpl2_addr));
nuclear@2 160
nuclear@2 161 add_copper(COPPER_VWAIT(128));
nuclear@2 162 add_copper(COPPER_MOVE(REGN_BPLCON0, BPLCON0_COUNT(3) | BPLCON0_COLOR));
nuclear@2 163
nuclear@2 164 add_copper(COPPER_MOVE(REGN_COLOR0, grid_pal[0]));
nuclear@2 165 for(i=0; i<MAX_GRID_SHADES; i++) {
nuclear@2 166 add_copper(COPPER_VWAIT(128 + i * 64 / MAX_GRID_SHADES));
nuclear@2 167 cplist_pal[i] = copperlist_end; /* save this copperlist pointer */
nuclear@2 168 for(j=1; j<8; j++) {
nuclear@2 169 add_copper(COPPER_MOVE(REGN_COLOR(j), 0));
nuclear@2 170 }
nuclear@2 171 }
nuclear@1 172 add_copper(COPPER_END);
nuclear@0 173
nuclear@1 174 REG_DMACON = SETBITS(DMA_BPL | DMA_COPPER | DMA_MASTER);
nuclear@0 175 return 0;
nuclear@0 176 }
nuclear@0 177
nuclear@0 178 void cleanup(void)
nuclear@0 179 {
nuclear@0 180 REG_DMACON = CLRBITS(DMA_ALL);
nuclear@0 181 REG_DMACON = SETBITS(prev_dmacon);
nuclear@0 182
nuclear@0 183 REG_INTREQ = CLRBITS(0x7fff);
nuclear@0 184 REG_INTREQ = SETBITS(prev_intreq);
nuclear@0 185
nuclear@0 186 REG_ADKCON = CLRBITS(0x7fff);
nuclear@0 187 REG_ADKCON = SETBITS(prev_adkcon);
nuclear@0 188
nuclear@0 189 REG_INTENA = CLRBITS(INTEN_ALL);
nuclear@0 190 REG_INTENA = SETBITS(prev_intena);
nuclear@0 191
nuclear@1 192 cleanup_copper();
nuclear@0 193 Permit();
nuclear@0 194 }
nuclear@0 195
nuclear@0 196 void wait_vpos(int x)
nuclear@0 197 {
nuclear@0 198 x <<= 8;
nuclear@0 199 while((REG32_VPOSR & 0x1ff00) < x);
nuclear@0 200 }
nuclear@0 201
nuclear@0 202 void wait_vblank(void)
nuclear@0 203 {
nuclear@0 204 wait_vpos(300);
nuclear@0 205 }