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/
mbedgc.cpp@0:31cd577d85a4, 2011-07-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |