mirror of https://github.com/nealey/Simon-Says
Update to Arduino v1.0
Updated the code to support Arduino v1.0. Re-arranged the file structure to include PCB layout. New code includes Pete Lewis' addition of battle mode.
This commit is contained in:
parent
3475e99530
commit
1c89338d1b
|
@ -1,43 +1,45 @@
|
|||
/**
|
||||
* 6-19-2007
|
||||
* Copyright 2009, Spark Fun Electronics
|
||||
* Nathan Seidle
|
||||
* nathan at sparkfun.com
|
||||
*
|
||||
* Released under the Creative Commons Attribution Share-Alike 3.0 License
|
||||
* http://creativecommons.org/licenses/by-sa/3.0
|
||||
*
|
||||
* Simon Game ported for the ATmega168
|
||||
*
|
||||
* Fixes and cleanup by Joshua Neal <joshua[at]trochotron.com>
|
||||
*
|
||||
* Generates random sequence, plays music, and displays button lights.
|
||||
*
|
||||
* Simon tones from Wikipedia
|
||||
* - A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse
|
||||
* - a (green, upper right, an octave higher than A) - 880Hz - 1.136ms,
|
||||
* 0.568ms pulse
|
||||
* - D (blue, lower left, a perfect fourth higher than the upper left)
|
||||
* 587.33Hz - 1.702ms - 0.851ms pulse
|
||||
* G (yellow, lower right, a perfect fourth higher than the lower left) -
|
||||
* 784Hz - 1.276ms - 0.638ms pulse
|
||||
*
|
||||
* The tones are close, but probably off a bit, but they sound all right.
|
||||
*
|
||||
* The old version of SparkFun simon used an ATmega8. An ATmega8 ships
|
||||
* with a default internal 1MHz oscillator. You will need to set the
|
||||
* internal fuses to operate at the correct external 16MHz oscillator.
|
||||
*
|
||||
* Original Fuses:
|
||||
* avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m
|
||||
*
|
||||
* Command to set to fuses to use external 16MHz:
|
||||
* avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m
|
||||
*
|
||||
* The current version of Simon uses the ATmega168. The external osciallator
|
||||
* was removed to reduce component count. This version of simon relies on the
|
||||
* internal default 1MHz osciallator. Do not set the external fuses.
|
||||
*/
|
||||
/*
|
||||
Started: 6-19-2007
|
||||
Spark Fun Electronics
|
||||
Nathan Seidle
|
||||
|
||||
Simon Says is a memory game. Start the game by pressing one of the four buttons. When a button lights up,
|
||||
press the button, repeating the sequence. The sequence will get longer and longer. The game is won after
|
||||
13 rounds.
|
||||
|
||||
This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).
|
||||
|
||||
Simon Says game originally written in C for the PIC16F88.
|
||||
Ported for the ATmega168, then ATmega328, then Arduino 1.0.
|
||||
Fixes and cleanup by Joshua Neal <joshua[at]trochotron.com>
|
||||
|
||||
Generates random sequence, plays music, and displays button lights.
|
||||
|
||||
Simon tones from Wikipedia
|
||||
- A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse
|
||||
- a (green, upper right, an octave higher than A) - 880Hz - 1.136ms,
|
||||
0.568ms pulse
|
||||
- D (blue, lower left, a perfect fourth higher than the upper left)
|
||||
587.33Hz - 1.702ms - 0.851ms pulse
|
||||
- G (yellow, lower right, a perfect fourth higher than the lower left) -
|
||||
784Hz - 1.276ms - 0.638ms pulse
|
||||
|
||||
The tones are close, but probably off a bit, but they sound all right.
|
||||
|
||||
The old version of SparkFun simon used an ATmega8. An ATmega8 ships
|
||||
with a default internal 1MHz oscillator. You will need to set the
|
||||
internal fuses to operate at the correct external 16MHz oscillator.
|
||||
|
||||
Original Fuses:
|
||||
avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m
|
||||
|
||||
Command to set to fuses to use external 16MHz:
|
||||
avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m
|
||||
|
||||
The current version of Simon uses the ATmega328. The external osciallator
|
||||
was removed to reduce component count. This version of simon relies on the
|
||||
internal default 1MHz osciallator. Do not set the external fuses.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
|
@ -45,8 +47,7 @@
|
|||
/* Uncomment one of the following, corresponding to the board you have. */
|
||||
//#define BOARD_REV_6_25_08
|
||||
// #define BOARD_REV_4_9_2009
|
||||
//#define BOARD_REV_6_3_2009
|
||||
#define BOARD_REV_PTH
|
||||
#define BOARD_REV_PTH
|
||||
|
||||
#ifdef BOARD_REV_PTH
|
||||
|
||||
|
@ -58,7 +59,7 @@
|
|||
#define LED_YELLOW (1 << 3)
|
||||
|
||||
/* LED pin definitions */
|
||||
#define LED_RED_PIN 2
|
||||
#define LED_RED_PIN 2
|
||||
#define LED_RED_PORT PORTB
|
||||
#define LED_GREEN_PIN 3
|
||||
#define LED_GREEN_PORT PORTD
|
||||
|
@ -124,6 +125,11 @@
|
|||
|
||||
#ifdef BOARD_REV_4_9_2009
|
||||
|
||||
#define LED_RED (1 << 0)
|
||||
#define LED_GREEN (1 << 1)
|
||||
#define LED_BLUE (1 << 2)
|
||||
#define LED_YELLOW (1 << 3)
|
||||
|
||||
#define CHIP_ATMEGA168
|
||||
|
||||
/* LED pin definitions */
|
||||
|
@ -154,44 +160,8 @@
|
|||
|
||||
#endif /* BOARD_REV_4_9_2009 */
|
||||
|
||||
#ifdef BOARD_REV_6_3_2009
|
||||
|
||||
#define CHIP_ATMEGA168
|
||||
|
||||
#define LED_RED (1 << 0)
|
||||
#define LED_GREEN (1 << 1)
|
||||
#define LED_BLUE (1 << 2)
|
||||
#define LED_YELLOW (1 << 3)
|
||||
|
||||
/* LED pin definitions */
|
||||
#define LED_RED_PIN 2
|
||||
#define LED_RED_PORT PORTB
|
||||
#define LED_GREEN_PIN 2
|
||||
#define LED_GREEN_PORT PORTD
|
||||
#define LED_BLUE_PIN 5
|
||||
#define LED_BLUE_PORT PORTB
|
||||
#define LED_YELLOW_PIN 5
|
||||
#define LED_YELLOW_PORT PORTD
|
||||
|
||||
/* Button pin definitions */
|
||||
#define BUTTON_RED_PIN 0
|
||||
#define BUTTON_RED_PORT PINB
|
||||
#define BUTTON_GREEN_PIN 1
|
||||
#define BUTTON_GREEN_PORT PINB
|
||||
#define BUTTON_BLUE_PIN 7
|
||||
#define BUTTON_BLUE_PORT PIND
|
||||
#define BUTTON_YELLOW_PIN 6
|
||||
#define BUTTON_YELLOW_PORT PIND
|
||||
|
||||
/* Buzzer pin definitions */
|
||||
#define BUZZER1 3
|
||||
#define BUZZER1_PORT PORTD
|
||||
#define BUZZER2 4
|
||||
#define BUZZER2_PORT PORTD
|
||||
|
||||
#endif /* BOARD_REV_6_3_2009 */
|
||||
|
||||
/* Define game parameters */
|
||||
|
||||
#define MOVES_TO_WIN 13
|
||||
#define TIME_LIMIT 3000 /* 3000ms = 3 sec */
|
||||
|
||||
|
@ -212,6 +182,13 @@ void play_loser(void);
|
|||
void play_winner(void);
|
||||
void ioinit(void);
|
||||
|
||||
int battle = 0;
|
||||
|
||||
///These ints are for the begees loop funtion to work
|
||||
int counter = 0; // for cycling through the LEDs during the beegees loop
|
||||
int count = 20; // for keeping rhythm straight in the beegees loop
|
||||
//////////////
|
||||
|
||||
/* Game state */
|
||||
uint8_t moves[32];
|
||||
uint8_t nmoves = 0;
|
||||
|
@ -231,8 +208,7 @@ ISR (SIG_OVERFLOW2)
|
|||
|
||||
/* General short delays, using internal timer do a fairly accurate 1us */
|
||||
#ifdef CHIP_ATMEGA168
|
||||
void
|
||||
delay_us(uint16_t delay)
|
||||
void delay_us(uint16_t delay)
|
||||
{
|
||||
while (delay > 256)
|
||||
{
|
||||
|
@ -415,8 +391,7 @@ winner_sound(void)
|
|||
}
|
||||
|
||||
/* Play the winner sound and lights */
|
||||
void
|
||||
play_winner(void)
|
||||
void play_winner(void)
|
||||
{
|
||||
set_leds(LED_GREEN|LED_BLUE);
|
||||
winner_sound();
|
||||
|
@ -429,8 +404,7 @@ play_winner(void)
|
|||
}
|
||||
|
||||
/* Plays the current contents of the game moves */
|
||||
void
|
||||
play_moves(void)
|
||||
void play_moves(void)
|
||||
{
|
||||
uint8_t move;
|
||||
|
||||
|
@ -441,8 +415,7 @@ play_moves(void)
|
|||
}
|
||||
|
||||
/* Adds a new random button to the game sequence, by sampling the timer */
|
||||
void
|
||||
add_to_moves(void)
|
||||
void add_to_moves(void)
|
||||
{
|
||||
uint8_t new_button;
|
||||
|
||||
|
@ -452,9 +425,21 @@ add_to_moves(void)
|
|||
moves[nmoves++] = new_button;
|
||||
}
|
||||
|
||||
/* Adds a user defined button to the game sequence, by waiting for their input */
|
||||
void add_to_moves_battle(void)
|
||||
{
|
||||
uint8_t new_button;
|
||||
|
||||
/* wait for user to input next move */
|
||||
new_button = wait_for_button();
|
||||
|
||||
toner(new_button, 150);
|
||||
|
||||
moves[nmoves++] = new_button;
|
||||
}
|
||||
|
||||
/* Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms. */
|
||||
void
|
||||
buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us)
|
||||
void buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us)
|
||||
{
|
||||
uint32_t buzz_length_us;
|
||||
|
||||
|
@ -473,7 +458,6 @@ buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Light an LED and play tone
|
||||
*
|
||||
|
@ -482,8 +466,7 @@ buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us)
|
|||
* blue, lower left: 587.33Hz - 1.702ms - 0.851ms pulse
|
||||
* yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse
|
||||
*/
|
||||
void
|
||||
toner(uint8_t which, uint16_t buzz_length_ms)
|
||||
void toner(uint8_t which, uint16_t buzz_length_ms)
|
||||
{
|
||||
set_leds(which);
|
||||
switch (which) {
|
||||
|
@ -509,8 +492,7 @@ toner(uint8_t which, uint16_t buzz_length_ms)
|
|||
}
|
||||
|
||||
/* Show an "attract mode" display while waiting for user to press button. */
|
||||
void
|
||||
attract_mode(void)
|
||||
void attract_mode(void)
|
||||
{
|
||||
while (1) {
|
||||
set_leds(LED_RED);
|
||||
|
@ -538,8 +520,7 @@ attract_mode(void)
|
|||
|
||||
/* Wait for a button to be pressed. Returns one of led colors (LED_RED, etc.)
|
||||
* if successful, 0 if timed out */
|
||||
uint8_t
|
||||
wait_for_button(void)
|
||||
uint8_t wait_for_button(void)
|
||||
{
|
||||
uint16_t time_limit = TIME_LIMIT;
|
||||
uint8_t released = 0;
|
||||
|
@ -578,16 +559,20 @@ wait_for_button(void)
|
|||
|
||||
|
||||
/* Play the game. Returns 0 if player loses, or 1 if player wins. */
|
||||
int
|
||||
game_mode(void)
|
||||
int game_mode(void)
|
||||
{
|
||||
nmoves = 0;
|
||||
while (nmoves < MOVES_TO_WIN) {
|
||||
int moves_to_win_var = MOVES_TO_WIN; // If in normal mode, then allow the user to win after a #define varialb up top (default is 13).
|
||||
if(battle) moves_to_win_var = 1000; // If in battle mode, allow the users to go up to 1000 moves! Like anyone could possibly do that :)
|
||||
while (nmoves < moves_to_win_var) {
|
||||
uint8_t move;
|
||||
|
||||
/* Add a button to the current moves, then play them back */
|
||||
add_to_moves();
|
||||
play_moves();
|
||||
if(battle) add_to_moves_battle(); // If in battle mode, then listen for user input to choose the next step
|
||||
else add_to_moves();
|
||||
|
||||
if(battle) ; // If in battle mode, then don't play back the pattern, it's up the the users to remember it - then add on a move.
|
||||
else play_moves();
|
||||
|
||||
/* Then require the player to repeat the sequence. */
|
||||
for (move = 0; move < nmoves; move++) {
|
||||
|
@ -606,7 +591,8 @@ game_mode(void)
|
|||
}
|
||||
|
||||
/* Player was correct, delay before playing moves */
|
||||
delay_ms(1000);
|
||||
if(battle) delay_ms(100); // reduced wait time, because we want to allow the battle to go very fast! plus, if you use the delay(1000), then it may miss capturing the users next input.
|
||||
else delay_ms(1000);
|
||||
}
|
||||
|
||||
/* player wins */
|
||||
|
@ -615,6 +601,7 @@ game_mode(void)
|
|||
|
||||
void setup()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
|
@ -623,6 +610,30 @@ void loop()
|
|||
/* Setup IO pins and defaults */
|
||||
ioinit();
|
||||
|
||||
/* Check to see if LOWER LEFT BUTTON is pressed */
|
||||
if (check_button() == LED_YELLOW){
|
||||
while(1){
|
||||
buzz(5);
|
||||
delay_ms(750);
|
||||
if (check_button() == 0x00){
|
||||
while (1) beegees_loop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check to see if LOWER RIGHT BUTTON is pressed */
|
||||
if (check_button() == LED_GREEN){
|
||||
while(1){
|
||||
buzz(5);
|
||||
delay_ms(750);
|
||||
if (check_button() == 0x00){
|
||||
battle = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
play_winner();
|
||||
|
||||
/* Main loop */
|
||||
|
@ -650,3 +661,139 @@ void loop()
|
|||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
void beegees_loop(){
|
||||
buzz(3);
|
||||
delay(400);
|
||||
buzz(4);
|
||||
rest(1);
|
||||
delay(600);
|
||||
buzz(5);
|
||||
rest(1);
|
||||
rest(1);
|
||||
delay(400);
|
||||
buzz(3);
|
||||
rest(1);
|
||||
rest(1);
|
||||
rest(1);
|
||||
buzz(2);
|
||||
rest(1);
|
||||
buzz(1);
|
||||
buzz(2);
|
||||
buzz(3);
|
||||
rest(1);
|
||||
buzz(1);
|
||||
buzz(2);
|
||||
rest(1);
|
||||
buzz(3);
|
||||
rest(1);
|
||||
rest(1);
|
||||
buzz(1);
|
||||
rest(1);
|
||||
buzz(2);
|
||||
rest(1);
|
||||
buzz(3);
|
||||
rest(1);
|
||||
buzz(4);
|
||||
rest(1);
|
||||
buzz(5);
|
||||
rest(1);
|
||||
delay(700);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
void buzz(int tone){
|
||||
|
||||
///declare an integer, "freq", for frequency of the note to be played.
|
||||
int freq;
|
||||
|
||||
///5 different tones to select. Each tone is a different frequency.
|
||||
if(tone == 1){
|
||||
freq = 2000;
|
||||
}
|
||||
if(tone == 2){
|
||||
freq = 1800;
|
||||
}
|
||||
if(tone == 3){
|
||||
freq = 1500;
|
||||
}
|
||||
if(tone == 4){
|
||||
freq = 1350;
|
||||
}
|
||||
if(tone == 5){
|
||||
freq = 1110;
|
||||
}
|
||||
|
||||
//freq = (freq/2);
|
||||
|
||||
/// Because frequency is determined by the wavelength (the time HIGH and the time LOW),
|
||||
/// you need to have "count" in order to keep a note the same length in time.
|
||||
/// "count" is the number of times this function will repeat the HIGH/LOW pattern - to create the sound of the note.
|
||||
|
||||
count = 40;
|
||||
|
||||
/// In order to keep all 5 notes the same length in time, you must compare them to the longest note (tonic) - aka the "1" note.
|
||||
count = count*(2000/freq);
|
||||
|
||||
/// this next function simply changes the next LED to turn on.
|
||||
change_led();
|
||||
|
||||
/// this next for loop actually makes the buzzer pin move.
|
||||
/// it uses the "count" variable to know how many times to play the frequency.
|
||||
/// -this keeps the timing correct.
|
||||
for(int i = 0; i < count; i++){
|
||||
digitalWrite(BUZZER1, HIGH);
|
||||
digitalWrite(BUZZER2, LOW);
|
||||
delayMicroseconds(freq);
|
||||
digitalWrite(BUZZER1, LOW);
|
||||
digitalWrite(BUZZER2, HIGH);
|
||||
delayMicroseconds(freq);
|
||||
}
|
||||
delay(60);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
void rest(int tone){
|
||||
int freq;
|
||||
if(tone == 1){
|
||||
freq = 2000;
|
||||
}
|
||||
if(tone == 2){
|
||||
freq = 1800;
|
||||
}
|
||||
if(tone == 3){
|
||||
freq = 1500;
|
||||
}
|
||||
if(tone == 4){
|
||||
freq = 1350;
|
||||
}
|
||||
if(tone == 5){
|
||||
freq = 1110;
|
||||
}
|
||||
//freq = (freq/2);
|
||||
count = 40;
|
||||
count = count*(2000/freq);
|
||||
//change_led();
|
||||
for(int i = 0; i < count; i++){
|
||||
digitalWrite(BUZZER1, LOW);
|
||||
delayMicroseconds(freq);
|
||||
digitalWrite(BUZZER1, LOW);
|
||||
delayMicroseconds(freq);
|
||||
}
|
||||
delay(75);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
void change_led(){
|
||||
if(counter > 3){
|
||||
counter = 0;
|
||||
}
|
||||
set_leds(1 << counter);
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
|
@ -1,666 +0,0 @@
|
|||
/**
|
||||
* 6-19-2007
|
||||
* Copyright 2009, Spark Fun Electronics
|
||||
* Nathan Seidle
|
||||
* nathan at sparkfun.com
|
||||
*
|
||||
* Released under the Creative Commons Attribution Share-Alike 3.0 License
|
||||
* http://creativecommons.org/licenses/by-sa/3.0
|
||||
*
|
||||
* Simon Game ported for the ATmega168
|
||||
*
|
||||
* Fixes and cleanup by Joshua Neal <joshua[at]trochotron.com>
|
||||
*
|
||||
* Generates random sequence, plays music, and displays button lights.
|
||||
*
|
||||
* Simon tones from Wikipedia
|
||||
* - A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse
|
||||
* - a (green, upper right, an octave higher than A) - 880Hz - 1.136ms,
|
||||
* 0.568ms pulse
|
||||
* - D (blue, lower left, a perfect fourth higher than the upper left)
|
||||
* 587.33Hz - 1.702ms - 0.851ms pulse
|
||||
* G (yellow, lower right, a perfect fourth higher than the lower left) -
|
||||
* 784Hz - 1.276ms - 0.638ms pulse
|
||||
*
|
||||
* The tones are close, but probably off a bit, but they sound all right.
|
||||
*
|
||||
* The old version of SparkFun simon used an ATmega8. An ATmega8 ships
|
||||
* with a default internal 1MHz oscillator. You will need to set the
|
||||
* internal fuses to operate at the correct external 16MHz oscillator.
|
||||
*
|
||||
* Original Fuses:
|
||||
* avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m
|
||||
*
|
||||
* Command to set to fuses to use external 16MHz:
|
||||
* avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m
|
||||
*
|
||||
* The current version of Simon uses the ATmega168. The external osciallator
|
||||
* was removed to reduce component count. This version of simon relies on the
|
||||
* internal default 1MHz osciallator. Do not set the external fuses.
|
||||
*/
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
/* Uncomment one of the following, corresponding to the board you have. */
|
||||
//#define BOARD_REV_6_25_08
|
||||
// #define BOARD_REV_4_9_2009
|
||||
#define BOARD_REV_PTH
|
||||
|
||||
#ifdef BOARD_REV_PTH
|
||||
|
||||
#define CHIP_ATMEGA168
|
||||
|
||||
#define LED_RED (1 << 0)
|
||||
#define LED_GREEN (1 << 1)
|
||||
#define LED_BLUE (1 << 2)
|
||||
#define LED_YELLOW (1 << 3)
|
||||
|
||||
/* LED pin definitions */
|
||||
#define LED_RED_PIN 2
|
||||
#define LED_RED_PORT PORTB
|
||||
#define LED_GREEN_PIN 3
|
||||
#define LED_GREEN_PORT PORTD
|
||||
#define LED_BLUE_PIN 5
|
||||
#define LED_BLUE_PORT PORTB
|
||||
#define LED_YELLOW_PIN 5
|
||||
#define LED_YELLOW_PORT PORTD
|
||||
|
||||
/* Button pin definitions */
|
||||
#define BUTTON_RED_PIN 1
|
||||
#define BUTTON_RED_PORT PINB
|
||||
#define BUTTON_GREEN_PIN 2
|
||||
#define BUTTON_GREEN_PORT PIND
|
||||
#define BUTTON_BLUE_PIN 4
|
||||
#define BUTTON_BLUE_PORT PINB
|
||||
#define BUTTON_YELLOW_PIN 6
|
||||
#define BUTTON_YELLOW_PORT PIND
|
||||
|
||||
/* Buzzer pin definitions */
|
||||
#define BUZZER1 4
|
||||
#define BUZZER1_PORT PORTD
|
||||
#define BUZZER2 7
|
||||
#define BUZZER2_PORT PORTD
|
||||
|
||||
#endif /* BOARD_REV_PTH */
|
||||
|
||||
#ifdef BOARD_REV_6_25_08
|
||||
|
||||
#define CHIP_ATMEGA168
|
||||
|
||||
#define LED_RED (1 << 0)
|
||||
#define LED_GREEN (1 << 1)
|
||||
#define LED_BLUE (1 << 2)
|
||||
#define LED_YELLOW (1 << 3)
|
||||
|
||||
/* LED pin definitions */
|
||||
#define LED_RED_PIN 3
|
||||
#define LED_RED_PORT PORTC
|
||||
#define LED_GREEN_PIN 2
|
||||
#define LED_GREEN_PORT PORTD
|
||||
#define LED_BLUE_PIN 0
|
||||
#define LED_BLUE_PORT PORTC
|
||||
#define LED_YELLOW_PIN 5
|
||||
#define LED_YELLOW_PORT PORTD
|
||||
|
||||
/* Button pin definitions */
|
||||
#define BUTTON_RED_PIN 2
|
||||
#define BUTTON_RED_PORT PINC
|
||||
#define BUTTON_GREEN_PIN 5
|
||||
#define BUTTON_GREEN_PORT PINC
|
||||
#define BUTTON_BLUE_PIN 1
|
||||
#define BUTTON_BLUE_PORT PINC
|
||||
#define BUTTON_YELLOW_PIN 6
|
||||
#define BUTTON_YELLOW_PORT PIND
|
||||
|
||||
/* Buzzer pin definitions */
|
||||
#define BUZZER1 3
|
||||
#define BUZZER1_PORT PORTD
|
||||
#define BUZZER2 4
|
||||
#define BUZZER2_PORT PORTD
|
||||
|
||||
#endif /* BOARD_REV_6_25_08 */
|
||||
|
||||
#ifdef BOARD_REV_4_9_2009
|
||||
|
||||
#define CHIP_ATMEGA168
|
||||
|
||||
/* LED pin definitions */
|
||||
#define LED_BLUE_PIN 5
|
||||
#define LED_BLUE_PORT PORTB
|
||||
#define LED_YELLOW_PIN 5
|
||||
#define LED_YELLOW_PORT PORTD
|
||||
#define LED_RED_PIN 2
|
||||
#define LED_RED_PORT PORTB
|
||||
#define LED_GREEN_PIN 2
|
||||
#define LED_GREEN_PORT PORTD
|
||||
|
||||
/* Button pin definitions */
|
||||
#define BUTTON_RED_PIN 0
|
||||
#define BUTTON_RED_PORT PINB
|
||||
#define BUTTON_GREEN_PIN 1
|
||||
#define BUTTON_GREEN_PORT PINB
|
||||
#define BUTTON_BLUE_PIN 7
|
||||
#define BUTTON_BLUE_PORT PIND
|
||||
#define BUTTON_YELLOW_PIN 6
|
||||
#define BUTTON_YELLOW_PORT PIND
|
||||
|
||||
/* Buzzer pin definitions */
|
||||
#define BUZZER1 3
|
||||
#define BUZZER1_PORT PORTD
|
||||
#define BUZZER2 4
|
||||
#define BUZZER2_PORT PORTD
|
||||
|
||||
#endif /* BOARD_REV_4_9_2009 */
|
||||
|
||||
/* Define game parameters */
|
||||
#define MOVES_TO_WIN 13
|
||||
#define TIME_LIMIT 3000 /* 3000ms = 3 sec */
|
||||
|
||||
#define sbi(port_name, pin_number) (port_name |= 1<<pin_number)
|
||||
#define cbi(port_name, pin_number) \
|
||||
((port_name) &= (uint8_t)~(1 << pin_number))
|
||||
|
||||
/* Declarations for static functions */
|
||||
#include "WProgram.h"
|
||||
void
|
||||
delay_us(uint16_t delay);
|
||||
void
|
||||
delay_ms(uint16_t x);
|
||||
void
|
||||
set_leds(uint8_t leds);
|
||||
void
|
||||
init_gpio(void);
|
||||
void
|
||||
init_gpio(void);
|
||||
void
|
||||
init_gpio(void);
|
||||
void
|
||||
ioinit(void);
|
||||
uint8_t
|
||||
check_button(void);
|
||||
void
|
||||
play_loser(void);
|
||||
void
|
||||
winner_sound(void);
|
||||
void
|
||||
play_winner(void);
|
||||
void
|
||||
play_moves(void);
|
||||
void
|
||||
add_to_moves(void);
|
||||
void
|
||||
buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us);
|
||||
void
|
||||
toner(uint8_t which, uint16_t buzz_length_ms);
|
||||
void
|
||||
attract_mode(void);
|
||||
uint8_t
|
||||
wait_for_button(void);
|
||||
int
|
||||
game_mode(void);
|
||||
void setup();
|
||||
void loop();
|
||||
void delay_us(uint16_t delay);
|
||||
void delay_ms(uint16_t delay);
|
||||
uint8_t check_button(void);
|
||||
void set_leds(uint8_t leds);
|
||||
void buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay);
|
||||
void toner(uint8_t tone, uint16_t buzz_length_ms);
|
||||
void add_to_moves(void);
|
||||
void play_moves(void);
|
||||
void play_loser(void);
|
||||
void play_winner(void);
|
||||
void ioinit(void);
|
||||
|
||||
/* Game state */
|
||||
uint8_t moves[32];
|
||||
uint8_t nmoves = 0;
|
||||
|
||||
ISR (SIG_OVERFLOW2)
|
||||
{
|
||||
/*
|
||||
* Prescalar of 1024
|
||||
* Clock = 16MHz
|
||||
* 15,625 clicks per second
|
||||
* 64us per click
|
||||
*/
|
||||
|
||||
/* Preload timer 2 for 125 clicks. Should be 8ms per ISR call */
|
||||
TCNT2 = 131; /* 256 - 125 = 131 */
|
||||
}
|
||||
|
||||
/* General short delays, using internal timer do a fairly accurate 1us */
|
||||
#ifdef CHIP_ATMEGA168
|
||||
void
|
||||
delay_us(uint16_t delay)
|
||||
{
|
||||
while (delay > 256)
|
||||
{
|
||||
TIFR0 = (1<<TOV0); /* Clear any interrupt flags on Timer0 */
|
||||
TCNT0 = 0;
|
||||
while ( (TIFR0 & (1<<TOV0)) == 0);
|
||||
|
||||
delay -= 256;
|
||||
}
|
||||
|
||||
TIFR0 = (1<<TOV0); /* Clear any interrupt flags on Timer0 */
|
||||
/*
|
||||
* 256 - 125 = 131 : Preload timer 0 for x clicks.
|
||||
* Should be 1us per click
|
||||
*/
|
||||
TCNT0 = 256 - delay;
|
||||
while ((TIFR0 & (1<<TOV0)) == 0) {
|
||||
/* do nothing */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* General short delays */
|
||||
void
|
||||
delay_ms(uint16_t x)
|
||||
{
|
||||
while (x-- > 0) {
|
||||
delay_us(1000);
|
||||
}
|
||||
}
|
||||
|
||||
/* Light the given set of LEDs */
|
||||
void
|
||||
set_leds(uint8_t leds)
|
||||
{
|
||||
if ((leds & LED_RED) != 0) {
|
||||
sbi(LED_RED_PORT, LED_RED_PIN);
|
||||
}
|
||||
else {
|
||||
cbi(LED_RED_PORT, LED_RED_PIN);
|
||||
}
|
||||
if ((leds & LED_GREEN) != 0) {
|
||||
sbi(LED_GREEN_PORT, LED_GREEN_PIN);
|
||||
}
|
||||
else {
|
||||
cbi(LED_GREEN_PORT, LED_GREEN_PIN);
|
||||
}
|
||||
if ((leds & LED_BLUE) != 0) {
|
||||
sbi(LED_BLUE_PORT, LED_BLUE_PIN);
|
||||
}
|
||||
else {
|
||||
cbi(LED_BLUE_PORT, LED_BLUE_PIN);
|
||||
}
|
||||
if ((leds & LED_YELLOW) != 0) {
|
||||
sbi(LED_YELLOW_PORT, LED_YELLOW_PIN);
|
||||
}
|
||||
else {
|
||||
cbi(LED_YELLOW_PORT, LED_YELLOW_PIN);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef BOARD_REV_6_25_08
|
||||
void
|
||||
init_gpio(void)
|
||||
{
|
||||
/* 1 = output, 0 = input */
|
||||
DDRB = 0b11111111;
|
||||
DDRC = 0b00001001; /* LEDs and Buttons */
|
||||
DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */
|
||||
|
||||
PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */
|
||||
PORTD = 0b01000000; /* Enable pull-up on button 1 */
|
||||
}
|
||||
#endif /* BOARD_REV_6_25_08 */
|
||||
#ifdef BOARD_REV_4_9_2009
|
||||
void
|
||||
init_gpio(void)
|
||||
{
|
||||
/* 1 = output, 0 = input */
|
||||
DDRB = 0b11111100; /* button 2,3 on PB0,1 */
|
||||
DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */
|
||||
|
||||
PORTB = 0b00000011; /* Enable pull-ups on buttons 2,3 */
|
||||
PORTD = 0b11000000; /* Enable pull-up on button 0,1 */
|
||||
}
|
||||
#endif /* BOARD_REV_4_9_2009 */
|
||||
|
||||
#ifdef BOARD_REV_PTH
|
||||
void
|
||||
init_gpio(void)
|
||||
{
|
||||
/* 1 = output, 0 = input */
|
||||
DDRB = 0b11101101; /* LEDs and Buttons */
|
||||
DDRC = 0b11111111; /* LEDs and Buttons */
|
||||
DDRD = 0b10111011; /* LEDs, buttons, buzzer, TX/RX */
|
||||
|
||||
PORTB = 0b00010010; /* Enable pull-ups on buttons 1,4 */
|
||||
//PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */
|
||||
PORTD = 0b01000100; /* Enable pull-up on button 1 */
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
ioinit(void)
|
||||
{
|
||||
init_gpio();
|
||||
|
||||
//Set Timer 0 Registers to Default Setting to over-ride the timer initialization made in the init() function of the Arduino Wiring libary (Wiring.c in the hardware/core/arduino folder)
|
||||
TCCR0A = 0;
|
||||
TIMSK0 = 0;
|
||||
/* Init timer 0 for delay_us timing (1,000,000 / 1 = 1,000,000) */
|
||||
//TCCR0B = (1<<CS00); /* Set Prescaler to 1. CS00=1 */
|
||||
TCCR0B = (1<<CS01); /* Set Prescaler to 1. CS00=1 */
|
||||
|
||||
/* Init timer 2 */
|
||||
ASSR = 0;
|
||||
/* Set Prescaler to 1024. CS22=1, CS21=1,CS20=1 */
|
||||
TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20);
|
||||
TIMSK2 = (1<<TOIE2); /* Enable Timer 2 Interrupt */
|
||||
|
||||
cli(); //We don't use any interrupt functionality. Let's turn it off so Arduino doesn't screw around with it!
|
||||
}
|
||||
|
||||
/* Returns a '1' bit in the position corresponding to LED_RED, etc. */
|
||||
uint8_t
|
||||
check_button(void)
|
||||
{
|
||||
uint8_t button_pressed = 0;
|
||||
|
||||
if ((BUTTON_RED_PORT & (1 << BUTTON_RED_PIN)) == 0)
|
||||
button_pressed |= LED_RED;
|
||||
if ((BUTTON_GREEN_PORT & (1 << BUTTON_GREEN_PIN)) == 0)
|
||||
button_pressed |= LED_GREEN;
|
||||
if ((BUTTON_BLUE_PORT & (1 << BUTTON_BLUE_PIN)) == 0)
|
||||
button_pressed |= LED_BLUE;
|
||||
if ((BUTTON_YELLOW_PORT & (1 << BUTTON_YELLOW_PIN)) == 0)
|
||||
button_pressed |= LED_YELLOW;
|
||||
|
||||
return button_pressed;
|
||||
}
|
||||
|
||||
/* Play the loser sound/lights */
|
||||
void
|
||||
play_loser(void)
|
||||
{
|
||||
set_leds(LED_RED|LED_GREEN);
|
||||
buzz_sound(255, 1500);
|
||||
|
||||
set_leds(LED_BLUE|LED_YELLOW);
|
||||
buzz_sound(255, 1500);
|
||||
|
||||
set_leds(LED_RED|LED_GREEN);
|
||||
buzz_sound(255, 1500);
|
||||
|
||||
set_leds(LED_BLUE|LED_YELLOW);
|
||||
buzz_sound(255, 1500);
|
||||
}
|
||||
|
||||
/* Play the winner sound */
|
||||
void
|
||||
winner_sound(void)
|
||||
{
|
||||
uint8_t x, y;
|
||||
|
||||
/* Toggle the buzzer at various speeds */
|
||||
for (x = 250; x > 70; x--) {
|
||||
for (y = 0; y < 3; y++) {
|
||||
sbi(BUZZER2_PORT, BUZZER2);
|
||||
cbi(BUZZER1_PORT, BUZZER1);
|
||||
|
||||
delay_us(x);
|
||||
|
||||
cbi(BUZZER2_PORT, BUZZER2);
|
||||
sbi(BUZZER1_PORT, BUZZER1);
|
||||
|
||||
delay_us(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Play the winner sound and lights */
|
||||
void
|
||||
play_winner(void)
|
||||
{
|
||||
set_leds(LED_GREEN|LED_BLUE);
|
||||
winner_sound();
|
||||
set_leds(LED_RED|LED_YELLOW);
|
||||
winner_sound();
|
||||
set_leds(LED_GREEN|LED_BLUE);
|
||||
winner_sound();
|
||||
set_leds(LED_RED|LED_YELLOW);
|
||||
winner_sound();
|
||||
}
|
||||
|
||||
/* Plays the current contents of the game moves */
|
||||
void
|
||||
play_moves(void)
|
||||
{
|
||||
uint8_t move;
|
||||
|
||||
for (move = 0; move < nmoves; move++) {
|
||||
toner(moves[move], 150);
|
||||
delay_ms(150);
|
||||
}
|
||||
}
|
||||
|
||||
/* Adds a new random button to the game sequence, by sampling the timer */
|
||||
void
|
||||
add_to_moves(void)
|
||||
{
|
||||
uint8_t new_button;
|
||||
|
||||
/* Use the lower 2 bits of the timer for the random value */
|
||||
new_button = 1 << (TCNT2 & 0x3);
|
||||
|
||||
moves[nmoves++] = new_button;
|
||||
}
|
||||
|
||||
/* Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms. */
|
||||
void
|
||||
buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us)
|
||||
{
|
||||
uint32_t buzz_length_us;
|
||||
|
||||
buzz_length_us = buzz_length_ms * (uint32_t)1000;
|
||||
while (buzz_length_us > buzz_delay_us*2) {
|
||||
buzz_length_us -= buzz_delay_us*2;
|
||||
|
||||
/* toggle the buzzer at various speeds */
|
||||
cbi(BUZZER1_PORT, BUZZER1);
|
||||
sbi(BUZZER2_PORT, BUZZER2);
|
||||
delay_us(buzz_delay_us);
|
||||
|
||||
sbi(BUZZER1_PORT, BUZZER1);
|
||||
cbi(BUZZER2_PORT, BUZZER2);
|
||||
delay_us(buzz_delay_us);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Light an LED and play tone
|
||||
*
|
||||
* red, upper left: 440Hz - 2.272ms - 1.136ms pulse
|
||||
* green, upper right: 880Hz - 1.136ms - 0.568ms pulse
|
||||
* blue, lower left: 587.33Hz - 1.702ms - 0.851ms pulse
|
||||
* yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse
|
||||
*/
|
||||
void
|
||||
toner(uint8_t which, uint16_t buzz_length_ms)
|
||||
{
|
||||
set_leds(which);
|
||||
switch (which) {
|
||||
case LED_RED:
|
||||
buzz_sound(buzz_length_ms, 1136);
|
||||
break;
|
||||
|
||||
case LED_GREEN:
|
||||
buzz_sound(buzz_length_ms, 568);
|
||||
break;
|
||||
|
||||
case LED_BLUE:
|
||||
buzz_sound(buzz_length_ms, 851);
|
||||
break;
|
||||
|
||||
case LED_YELLOW:
|
||||
buzz_sound(buzz_length_ms, 638);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Turn off all LEDs */
|
||||
set_leds(0);
|
||||
}
|
||||
|
||||
/* Show an "attract mode" display while waiting for user to press button. */
|
||||
void
|
||||
attract_mode(void)
|
||||
{
|
||||
while (1) {
|
||||
set_leds(LED_RED);
|
||||
delay_ms(100);
|
||||
if (check_button() != 0x00)
|
||||
return;
|
||||
|
||||
set_leds(LED_BLUE);
|
||||
delay_ms(100);
|
||||
if (check_button() != 0x00)
|
||||
return;
|
||||
|
||||
set_leds(LED_GREEN);
|
||||
delay_ms(100);
|
||||
if (check_button() != 0x00)
|
||||
return;
|
||||
|
||||
set_leds(LED_YELLOW);
|
||||
delay_ms(100);
|
||||
if (check_button() != 0x00)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Wait for a button to be pressed. Returns one of led colors (LED_RED, etc.)
|
||||
* if successful, 0 if timed out */
|
||||
uint8_t
|
||||
wait_for_button(void)
|
||||
{
|
||||
uint16_t time_limit = TIME_LIMIT;
|
||||
uint8_t released = 0;
|
||||
uint8_t old_button;
|
||||
|
||||
while (time_limit > 0) {
|
||||
uint8_t button;
|
||||
|
||||
/* Implement a small bit of debouncing */
|
||||
old_button = button;
|
||||
button = check_button();
|
||||
|
||||
/*
|
||||
* Make sure we've seen the previous button
|
||||
* released before accepting new buttons
|
||||
*/
|
||||
if (button == 0)
|
||||
released = 1;
|
||||
if (button == old_button && released == 1) {
|
||||
/* Make sure just one button is pressed */
|
||||
if (button == LED_RED ||
|
||||
button == LED_BLUE ||
|
||||
button == LED_GREEN ||
|
||||
button == LED_YELLOW) {
|
||||
return button;
|
||||
}
|
||||
}
|
||||
|
||||
delay_ms(1);
|
||||
|
||||
time_limit--;
|
||||
}
|
||||
return 0; /* Timed out */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Play the game. Returns 0 if player loses, or 1 if player wins. */
|
||||
int
|
||||
game_mode(void)
|
||||
{
|
||||
nmoves = 0;
|
||||
while (nmoves < MOVES_TO_WIN) {
|
||||
uint8_t move;
|
||||
|
||||
/* Add a button to the current moves, then play them back */
|
||||
add_to_moves();
|
||||
play_moves();
|
||||
|
||||
/* Then require the player to repeat the sequence. */
|
||||
for (move = 0; move < nmoves; move++) {
|
||||
uint8_t choice = wait_for_button();
|
||||
|
||||
/* If wait timed out, player loses. */
|
||||
if (choice == 0)
|
||||
return 0;
|
||||
|
||||
toner(choice, 150);
|
||||
|
||||
/* If the choice is incorect, player loses. */
|
||||
if (choice != moves[move]) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Player was correct, delay before playing moves */
|
||||
delay_ms(1000);
|
||||
}
|
||||
|
||||
/* player wins */
|
||||
return 1;
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
/* Setup IO pins and defaults */
|
||||
ioinit();
|
||||
|
||||
play_winner();
|
||||
|
||||
/* Main loop */
|
||||
while (1) {
|
||||
/* Wait for user to start game */
|
||||
attract_mode();
|
||||
|
||||
/* Indicate the start of game play */
|
||||
set_leds(LED_RED|LED_GREEN|LED_BLUE|LED_YELLOW);
|
||||
delay_ms(1000);
|
||||
set_leds(0);
|
||||
delay_ms(250);
|
||||
|
||||
/* Play game and handle result */
|
||||
if (game_mode() != 0) {
|
||||
/* Player won, play winner tones */
|
||||
play_winner();
|
||||
}
|
||||
else {
|
||||
/* Player lost, play loser tones */
|
||||
play_loser();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
init();
|
||||
|
||||
setup();
|
||||
|
||||
for (;;)
|
||||
loop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
:00000001FF
|
Binary file not shown.
|
@ -1,101 +0,0 @@
|
|||
:100000000C9434000C9451000C9451000C94510049
|
||||
:100010000C9451000C9451000C9451000C9451001C
|
||||
:100020000C9451000C9453000C9451000C9451000A
|
||||
:100030000C9451000C9451000C9451000C945100FC
|
||||
:100040000C946A020C9451000C9451000C945100D1
|
||||
:100050000C9451000C9451000C9451000C945100DC
|
||||
:100060000C9451000C94510011241FBECFEFD4E02A
|
||||
:10007000DEBFCDBF11E0A0E0B1E0E2E3F6E002C0F8
|
||||
:1000800005900D92A030B107D9F711E0A0E0B1E0E2
|
||||
:1000900001C01D92AA32B107E1F70E9465020C94DB
|
||||
:1000A00017030C9400001F920F920FB60F921124A9
|
||||
:1000B0008F9383E88093B2008F910F900FBE0F90C3
|
||||
:1000C0001F9018959C0181E006C085BB16BCA89BBB
|
||||
:1000D000FECF2050314091E021303907B0F781E068
|
||||
:1000E00085BB822F819586BDA89BFECF0895CF93B7
|
||||
:1000F000DF93EC0105C088EE93E00E946200219737
|
||||
:100100002097C9F7DF91CF91089580FF02C02A9A06
|
||||
:1001100001C02A9881FF02C05B9A01C05B9882FFF0
|
||||
:1001200002C02D9A01C02D9883FF02C05D9A0895E8
|
||||
:100130005D98089583B18695809581704A9B826011
|
||||
:100140001C9B84604E9B886008951F93CF93DF9320
|
||||
:10015000CAEFD0E011C05F9A5C98CE010E946200A5
|
||||
:100160005F985C9ACE010E9462001F5F133099F77E
|
||||
:100170002197C634D10511F010E0EDCFDF91CF917A
|
||||
:100180001F91089586E00E9485000E94A50089E0E5
|
||||
:100190000E9485000E94A50086E00E9485000E94C2
|
||||
:1001A000A50089E00E9485000E94A50008956F9235
|
||||
:1001B0007F928F929F92AF92BF92CF92DF92EF92F7
|
||||
:1001C000FF920F931F93CF93DF93EB01A0E0B0E07A
|
||||
:1001D000BC01CD0128EE33E040E050E00E94F8027F
|
||||
:1001E0007B018C01CE01880F991F5C01CC24DD249A
|
||||
:1001F0006624772443016A187B088C089D080EC08A
|
||||
:10020000E60CF71C081D191D5C985F9ACE010E9430
|
||||
:1002100062005C9A5F98CE010E946200AE14BF0437
|
||||
:10022000C006D10668F3DF91CF911F910F91FF9027
|
||||
:10023000EF90DF90CF90BF90AF909F908F907F9086
|
||||
:100240006F90089583E00E9485008FEF90E06CED41
|
||||
:1002500075E00E94D7008CE00E9485008FEF90E04F
|
||||
:100260006CED75E00E94D70083E00E9485008FEF5F
|
||||
:1002700090E06CED75E00E94D7008CE00E94850054
|
||||
:100280008FEF90E06CED75E00E94D70008951F930A
|
||||
:10029000CF93DF93182FEB010E948500123071F08D
|
||||
:1002A000133018F41130B9F405C0143059F0183077
|
||||
:1002B00091F40CC0CE0160E774E00BC0CE0168E39E
|
||||
:1002C00072E007C0CE0163E573E003C0CE016EE7C4
|
||||
:1002D00072E00E94D70080E00E948500DF91CF91FC
|
||||
:1002E0001F9108951F9310E00EC0E12FF0E0E05041
|
||||
:1002F000FF4F808166E970E00E94470186E990E047
|
||||
:100300000E9477001F5F80912001181770F31F91E2
|
||||
:10031000089581E00E94850084E690E00E947700C5
|
||||
:100320000E949A00882309F584E00E94850084E6F3
|
||||
:1003300090E00E9477000E949A008823B1F482E046
|
||||
:100340000E94850084E690E00E9477000E949A0057
|
||||
:10035000882359F488E00E94850084E690E00E949A
|
||||
:1003600077000E949A008823A1F20895EF92FF92ED
|
||||
:100370000F931F93DF93CF930F92CDB7DEB7198200
|
||||
:1003800038EBE32E3BE0F32E0E949A00182F8823CF
|
||||
:1003900011F481E08983101759F4E981E13041F4C7
|
||||
:1003A000113099F0143089F0123079F0183069F07A
|
||||
:1003B00081E090E00E9477000894E108F108E114E0
|
||||
:1003C000F10411F0012FE0CF10E0812F0F90CF91B9
|
||||
:1003D000DF911F910F91FF90EF9008950F931F935E
|
||||
:1003E000CF93DF9310922001C1E0D0E02EC0809126
|
||||
:1003F000B200E22FF0E0E050FF4F8370AE0102C088
|
||||
:10040000440F551F8A95E2F740832F5F2093200108
|
||||
:100410000E94720100E011C00E94B601182F8823CB
|
||||
:10042000D9F066E970E00E944701E02FF0E0E0506B
|
||||
:10043000FF4F8081181781F40F5F8091200108170A
|
||||
:1004400058F388EE93E00E947700209120012D3030
|
||||
:1004500070F221E030E002C020E030E0C901DF911D
|
||||
:10046000CF911F910F9108958DEE84B98FEF87B9C9
|
||||
:100470008BEB8AB982E185B984E48BB914BC109204
|
||||
:100480006E0082E085BD1092B60087E08093B100D7
|
||||
:1004900081E080937000F8940E94C2000E9489015C
|
||||
:1004A0008FE00E94850088EE93E00E94770080E054
|
||||
:1004B0000E9485008AEF90E00E9477000E94EE0182
|
||||
:1004C000892B51F70E942201E9CF0E94BE020E94AF
|
||||
:1004D0003402FDCF1F920F920FB60F9211242F936B
|
||||
:1004E0003F934F935F936F937F938F939F93AF93BC
|
||||
:1004F000BF93209125013091260140912701509111
|
||||
:10050000280170912901DA01C9010296A11DB11DCE
|
||||
:10051000672F6A5F6D3730F06D57DA01C9010396B6
|
||||
:10052000A11DB11D6093290180932501909326019F
|
||||
:10053000A0932701B093280180912101909122017D
|
||||
:10054000A0912301B09124010196A11DB11D8093BA
|
||||
:10055000210190932201A0932301B0932401BF9124
|
||||
:10056000AF919F918F917F916F915F914F913F914B
|
||||
:100570002F910F900FBE0F901F901895789484B50F
|
||||
:10058000826084BD84B5816084BD85B5826085BD8F
|
||||
:1005900085B5816085BDEEE6F0E080818160808375
|
||||
:1005A000E1E8F0E0808182608083808181608083E7
|
||||
:1005B000E0E8F0E0808181608083E1EBF0E0808121
|
||||
:1005C00084608083E0EBF0E0808181608083EAE7F3
|
||||
:1005D000F0E080818460808380818260808380817C
|
||||
:1005E000816080838081806880831092C10008953B
|
||||
:1005F000629FD001739FF001829FE00DF11D649F07
|
||||
:10060000E00DF11D929FF00D839FF00D749FF00D92
|
||||
:10061000659FF00D9927729FB00DE11DF91F639F33
|
||||
:10062000B00DE11DF91FBD01CF0111240895F8940B
|
||||
:02063000FFCFFA
|
||||
:00000001FF
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue