The first video game for the mbed video game console. The code utilizes the SimpleLib package developed by thomas@soete.org. For more information about the project and if you'd like to download the schematics and PCB design visit http://www.mbedgc.com/

Dependencies:   mbed

Committer:
jp
Date:
Sat Jul 09 15:47:27 2011 +0000
Revision:
0:31cd577d85a4
Initial release of Snake for the mbed Game Console.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jp 0:31cd577d85a4 1 #include "mbed.h"
jp 0:31cd577d85a4 2 #include "colors.h"
jp 0:31cd577d85a4 3 #include "timers.h"
jp 0:31cd577d85a4 4
jp 0:31cd577d85a4 5 #define fbW 53
jp 0:31cd577d85a4 6 #define fbH 242
jp 0:31cd577d85a4 7
jp 0:31cd577d85a4 8 DigitalOut vSync(p29);
jp 0:31cd577d85a4 9 DigitalOut hSync(p30);
jp 0:31cd577d85a4 10
jp 0:31cd577d85a4 11 DigitalOut myled(LED1);
jp 0:31cd577d85a4 12
jp 0:31cd577d85a4 13
jp 0:31cd577d85a4 14 void vsync();
jp 0:31cd577d85a4 15 void hsync();
jp 0:31cd577d85a4 16 void setup();
jp 0:31cd577d85a4 17 void loop();
jp 0:31cd577d85a4 18 void blankFB();
jp 0:31cd577d85a4 19 void fill();
jp 0:31cd577d85a4 20
jp 0:31cd577d85a4 21 unsigned int frame = 0;
jp 0:31cd577d85a4 22 unsigned char framebuffer[fbH][fbW];
jp 0:31cd577d85a4 23
jp 0:31cd577d85a4 24 int snake_x = 5;
jp 0:31cd577d85a4 25 int snake_y = 50;
jp 0:31cd577d85a4 26 int snake_direction = 0;
jp 0:31cd577d85a4 27 unsigned char snake_color = 1;
jp 0:31cd577d85a4 28
jp 0:31cd577d85a4 29
jp 0:31cd577d85a4 30 TIMER0_INTERRUPT_HANDLER(void)
jp 0:31cd577d85a4 31 {
jp 0:31cd577d85a4 32 TIMER0_CLEAR_INTERRUPT(MR0_INT);
jp 0:31cd577d85a4 33
jp 0:31cd577d85a4 34 myled = 1;
jp 0:31cd577d85a4 35
jp 0:31cd577d85a4 36 vsync();
jp 0:31cd577d85a4 37 for( int i = 0; i < fbH; i++ )
jp 0:31cd577d85a4 38 {
jp 0:31cd577d85a4 39 hsync();
jp 0:31cd577d85a4 40 for( int j = 0; j < fbW; j++ )
jp 0:31cd577d85a4 41 {
jp 0:31cd577d85a4 42 unsigned char bp = framebuffer[ i ][ j ];
jp 0:31cd577d85a4 43 COLOR_SET(bp);
jp 0:31cd577d85a4 44 }
jp 0:31cd577d85a4 45 }
jp 0:31cd577d85a4 46 COLOR_SET(0);
jp 0:31cd577d85a4 47 myled = 0;
jp 0:31cd577d85a4 48 }
jp 0:31cd577d85a4 49
jp 0:31cd577d85a4 50 int main() {
jp 0:31cd577d85a4 51 fill();
jp 0:31cd577d85a4 52 NVIC_SetPriority(TIMER0_IRQn, 0);
jp 0:31cd577d85a4 53
jp 0:31cd577d85a4 54 COLOR_INIT();
jp 0:31cd577d85a4 55 TIMER0_INIT();
jp 0:31cd577d85a4 56 TIMER0_SETPCLK(CCLK4);
jp 0:31cd577d85a4 57 TIMER0_SETPRESCALE(96000); // 1ms = 96000 : 1
jp 0:31cd577d85a4 58 TIMER0_SETMATCH(0, 1);
jp 0:31cd577d85a4 59 TIMER0_SETMATCHCONTROL(0, MATCH_RESET | MATCH_INTERRUPT); // Reset and Interrupt each 100ms
jp 0:31cd577d85a4 60 TIMER0_ENABLE_INTERRUPT();
jp 0:31cd577d85a4 61 TIMER0_START();
jp 0:31cd577d85a4 62
jp 0:31cd577d85a4 63 setup();
jp 0:31cd577d85a4 64
jp 0:31cd577d85a4 65 while (1)
jp 0:31cd577d85a4 66 loop();
jp 0:31cd577d85a4 67 }
jp 0:31cd577d85a4 68
jp 0:31cd577d85a4 69 void setup() {
jp 0:31cd577d85a4 70
jp 0:31cd577d85a4 71 }
jp 0:31cd577d85a4 72
jp 0:31cd577d85a4 73 void drawRectangle(int x, int y, int width, int height, unsigned char color) {
jp 0:31cd577d85a4 74
jp 0:31cd577d85a4 75 if (x < 0 || y < 0)
jp 0:31cd577d85a4 76 return;
jp 0:31cd577d85a4 77
jp 0:31cd577d85a4 78 for (int i = 0; i < height; i++) {
jp 0:31cd577d85a4 79
jp 0:31cd577d85a4 80 for (int j = 0; j < width; j++) {
jp 0:31cd577d85a4 81
jp 0:31cd577d85a4 82 framebuffer[ (y + i) % fbH ][ (x + j) % fbW ] = color;
jp 0:31cd577d85a4 83
jp 0:31cd577d85a4 84 }
jp 0:31cd577d85a4 85 }
jp 0:31cd577d85a4 86 }
jp 0:31cd577d85a4 87
jp 0:31cd577d85a4 88
jp 0:31cd577d85a4 89 void loop() {
jp 0:31cd577d85a4 90
jp 0:31cd577d85a4 91 if (snake_y <= 0)
jp 0:31cd577d85a4 92 snake_y = fbH - 1;
jp 0:31cd577d85a4 93
jp 0:31cd577d85a4 94 if (snake_x <= 0)
jp 0:31cd577d85a4 95 snake_x = fbW - 1;
jp 0:31cd577d85a4 96
jp 0:31cd577d85a4 97 snake_y %= fbH;
jp 0:31cd577d85a4 98 snake_x %= fbW;
jp 0:31cd577d85a4 99
jp 0:31cd577d85a4 100 if (frame % (10 + rand() % 20) == 0) {
jp 0:31cd577d85a4 101 snake_direction++;
jp 0:31cd577d85a4 102 snake_direction %= 4;
jp 0:31cd577d85a4 103
jp 0:31cd577d85a4 104 snake_color++;
jp 0:31cd577d85a4 105 }
jp 0:31cd577d85a4 106
jp 0:31cd577d85a4 107
jp 0:31cd577d85a4 108 switch (snake_direction) {
jp 0:31cd577d85a4 109 case 0:
jp 0:31cd577d85a4 110 snake_y += 4;
jp 0:31cd577d85a4 111 break;
jp 0:31cd577d85a4 112 case 2:
jp 0:31cd577d85a4 113 snake_y -= 4;
jp 0:31cd577d85a4 114 break;
jp 0:31cd577d85a4 115 case 1:
jp 0:31cd577d85a4 116 snake_x += 1;
jp 0:31cd577d85a4 117 break;
jp 0:31cd577d85a4 118 case 3:
jp 0:31cd577d85a4 119 snake_x -= 1;
jp 0:31cd577d85a4 120 break;
jp 0:31cd577d85a4 121 }
jp 0:31cd577d85a4 122
jp 0:31cd577d85a4 123 drawRectangle(snake_x, snake_y, 1, 4, snake_color);
jp 0:31cd577d85a4 124 wait_us(10000);
jp 0:31cd577d85a4 125 }
jp 0:31cd577d85a4 126
jp 0:31cd577d85a4 127 void draw()
jp 0:31cd577d85a4 128 {
jp 0:31cd577d85a4 129
jp 0:31cd577d85a4 130 }
jp 0:31cd577d85a4 131
jp 0:31cd577d85a4 132
jp 0:31cd577d85a4 133 void hsync()
jp 0:31cd577d85a4 134 {
jp 0:31cd577d85a4 135
jp 0:31cd577d85a4 136 COLOR_SET(0);
jp 0:31cd577d85a4 137 hSync = 1;
jp 0:31cd577d85a4 138 wait_us(4.8);
jp 0:31cd577d85a4 139 hSync = 0;
jp 0:31cd577d85a4 140 wait_us(4);
jp 0:31cd577d85a4 141 }
jp 0:31cd577d85a4 142
jp 0:31cd577d85a4 143 void vsync()
jp 0:31cd577d85a4 144 {
jp 0:31cd577d85a4 145 vSync = 1;
jp 0:31cd577d85a4 146 wait_us(1300);//650
jp 0:31cd577d85a4 147 vSync = 0;
jp 0:31cd577d85a4 148 frame++;
jp 0:31cd577d85a4 149
jp 0:31cd577d85a4 150 if (frame == 65535)
jp 0:31cd577d85a4 151 frame = 0;
jp 0:31cd577d85a4 152 }
jp 0:31cd577d85a4 153
jp 0:31cd577d85a4 154
jp 0:31cd577d85a4 155
jp 0:31cd577d85a4 156 void fill() {
jp 0:31cd577d85a4 157
jp 0:31cd577d85a4 158 for (int i = 0; i < fbH; i++) {
jp 0:31cd577d85a4 159
jp 0:31cd577d85a4 160 for (int j = 0; j < fbW; j++) {
jp 0:31cd577d85a4 161
jp 0:31cd577d85a4 162 if ( (i / 5) % 2 == 0 ) {
jp 0:31cd577d85a4 163
jp 0:31cd577d85a4 164 if ( (j / 2) % 2 == 0 )
jp 0:31cd577d85a4 165 framebuffer[i][j] = 3;
jp 0:31cd577d85a4 166 else
jp 0:31cd577d85a4 167 framebuffer[i][j] = 0;
jp 0:31cd577d85a4 168 }
jp 0:31cd577d85a4 169 else {
jp 0:31cd577d85a4 170 if ( (j / 2) % 2 == 0 )
jp 0:31cd577d85a4 171 framebuffer[i][j] = 0;
jp 0:31cd577d85a4 172 else
jp 0:31cd577d85a4 173 framebuffer[i][j] = 28;
jp 0:31cd577d85a4 174 }
jp 0:31cd577d85a4 175 }
jp 0:31cd577d85a4 176 }
jp 0:31cd577d85a4 177
jp 0:31cd577d85a4 178 }
jp 0:31cd577d85a4 179
jp 0:31cd577d85a4 180 void blankFB() {
jp 0:31cd577d85a4 181 for (int i = 0; i < fbH; i++) {
jp 0:31cd577d85a4 182 for (int j = 0; j < fbW; j++) {
jp 0:31cd577d85a4 183 framebuffer[i][j] = 0;
jp 0:31cd577d85a4 184 }
jp 0:31cd577d85a4 185 }
jp 0:31cd577d85a4 186
jp 0:31cd577d85a4 187 }