avr-game
diff avrgame.c @ 2:363acf3e61d4
wha?
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 20 Mar 2015 21:03:38 +0200 |
parents | 872e425f0e7f |
children |
line diff
1.1 --- a/avrgame.c Tue Sep 09 06:49:28 2014 +0300 1.2 +++ b/avrgame.c Fri Mar 20 21:03:38 2015 +0200 1.3 @@ -1,3 +1,4 @@ 1.4 +#include <string.h> 1.5 #include <avr/io.h> 1.6 #include <avr/interrupt.h> 1.7 #include <util/delay.h> 1.8 @@ -21,17 +22,25 @@ 1.9 }; 1.10 1.11 void redraw(void); 1.12 +void draw_field(void); 1.13 +void putpixel(int x, int y, int c); 1.14 /*int lcd_stream_write(char c, FILE *fp);*/ 1.15 /*FILE stream_lcd = FDEV_SETUP_STREAM(lcd_stream_write, NULL, _FDEV_SETUP_WRITE);*/ 1.16 1.17 -static int bx, by, brot; 1.18 -static unsigned char fb[DM_WIDTH * DM_HEIGHT / 8]; 1.19 +#define FB_SIZE (DM_WIDTH * DM_HEIGHT / 8) 1.20 +static unsigned char fb[FB_SIZE]; 1.21 + 1.22 +/* gameplay */ 1.23 +static int bx = DM_WIDTH / 2, by = DM_HEIGHT / 2, brot; 1.24 +#define FIELD_WIDTH 10 1.25 +#define FIELD_HEIGHT 20 1.26 +static unsigned char field[FIELD_WIDTH][FIELD_HEIGHT]; 1.27 1.28 int main(void) 1.29 { 1.30 /* stdout = stderr = &stream_lcd; */ 1.31 - DDRC = 0; /* input */ 1.32 - PORTC = 0; /* disable pull-ups */ 1.33 + DDRD = 0xf0; /* lower nibble input */ 1.34 + PORTD = 0xf0; /* disable 4 lower pull-ups */ 1.35 1.36 /* enable pin change interrupts (PCINT2) */ 1.37 PCICR = (1 << PCIE2); 1.38 @@ -39,11 +48,14 @@ 1.39 PCMSK2 = 0xf; 1.40 1.41 dm_init(); 1.42 + dm_test(); 1.43 + for(;;); 1.44 1.45 sei(); 1.46 1.47 for(;;) { 1.48 redraw(); 1.49 + _delay_ms(1); 1.50 } 1.51 1.52 return 0; 1.53 @@ -51,34 +63,86 @@ 1.54 1.55 void redraw(void) 1.56 { 1.57 + memset(fb, 0, FB_SIZE); 1.58 + draw_field(); 1.59 + 1.60 + dm_copy(0, 0, fb, FB_SIZE); 1.61 } 1.62 1.63 +#define HSPANS 6 1.64 +void draw_field(void) 1.65 +{ 1.66 + int i, j; 1.67 + unsigned char *fbptr = fb; 1.68 + 1.69 + /* draw borders */ 1.70 + memset(fbptr, 0xff, HSPANS * 2); /* fill 2 full lines */ 1.71 + fbptr += HSPANS * 2; 1.72 + fbptr[0] = 0x03; fbptr[HSPANS - 1] = 0xc0; 1.73 + fbptr += HSPANS; 1.74 + *fbptr++ = 0xfb; 1.75 + for(i=0; i<HSPANS - 2; i++) { 1.76 + *fbptr++ = 0xff; 1.77 + } 1.78 + *fbptr++ = 0xdf; 1.79 + 1.80 + 1.81 + for(i=0; i<DM_HEIGHT - 4; i++) { 1.82 + fbptr[0] = 0x0b; /* left border flipped(11010000) */ 1.83 + fbptr[HSPANS - 1] = 0xd0; /* right border flipped(00001011) */ 1.84 + fbptr += DM_WIDTH / 8; 1.85 + } 1.86 + return; 1.87 + 1.88 + fbptr = fb; 1.89 + for(i=0; i<FIELD_HEIGHT * 4; i++) { 1.90 + int y = i / 4; 1.91 + 1.92 + for(j=0; j<FIELD_WIDTH / 2; j++) { 1.93 + int x = j * 2; 1.94 + unsigned char span; 1.95 + if(field[x][y]) span |= 0xf0; 1.96 + if(field[x + 1][y]) span |= 0xf; 1.97 + fbptr[j] = span; 1.98 + } 1.99 + fbptr += DM_WIDTH / 8; 1.100 + } 1.101 +} 1.102 + 1.103 +void putpixel(int x, int y, int c) 1.104 +{ 1.105 + unsigned char *pptr = fb + y * DM_WIDTH / 8 + x / 8; 1.106 + int bit = x % 8; 1.107 + *pptr = (*pptr & ~bit) | ((c & 1) << bit); 1.108 +} 1.109 + 1.110 + 1.111 ISR(PCINT2_vect) 1.112 { 1.113 - static unsigned char prev_st = 0xff; 1.114 - unsigned char st = PINC; 1.115 - unsigned char diff = st ^ prev_st; 1.116 + static unsigned char prev_st; 1.117 + unsigned char st, diff; 1.118 1.119 - if((diff & (1 << BN_LEFT)) & ~st) { 1.120 + st = PIND & 0xf; 1.121 + diff = st ^ prev_st; 1.122 + prev_st = st; 1.123 + 1.124 + if(diff & (1 << BN_LEFT) & st) { 1.125 bx -= 1; 1.126 } 1.127 - if((diff & (1 << BN_RIGHT)) & ~st) { 1.128 + if(diff & (1 << BN_RIGHT) & st) { 1.129 bx += 1; 1.130 } 1.131 - if((diff & (1 << BN_ROT)) & ~st) { 1.132 + if(diff & (1 << BN_ROT) & st) { 1.133 brot = (brot + 1) % 4; 1.134 } 1.135 - if((diff & (1 << BN_DROP)) & ~st) { 1.136 - /* TODO */ 1.137 + if(diff & (1 << BN_DROP) & st) { 1.138 + by -= 1; 1.139 } 1.140 - 1.141 - prev_st = st; 1.142 } 1.143 1.144 #if 0 1.145 int lcd_stream_write(char c, FILE *fp) 1.146 { 1.147 - /* TODO terminal shit handling */ 1.148 return 0; 1.149 } 1.150 #endif