#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>

#define F_CPU 20000000

#define XOUT PORTD
#define YOUT PORTB
#define YOUT2 PORTC

#define RANKSUM 6
#define TANISUM 8

#define TANI_BUNK 0
#define TANI_MATH 1
#define TANI_CHEM 2
#define TANI_PHYS 3
#define TANI_PHYE 4
#define TANI_CHEE 5
#define TANI_LANG 6
#define TANI_SPOR 7

#define MODE_MENU 0
#define MODE_GAME 1
#define MODE_RANKING 2
#define MODE_RESULT 3
#define MODE_CLEAR 4
#define MODE_SUBMIT 5
#define MODE_GAMEOVER 6
#define MODE_VTEST 7

#define BAT 0
#define BAT_W 18
#define BAT_H 41
#define COOL_0 1
#define COOL_0_W 46
#define COOL_0_H 30
#define COOL_1 2
#define COOL_1_W 46
#define COOL_1_H 30
#define END 3
#define END_W 46
#define END_H 30
#define EXAM 4
#define EXAM_W 98
#define EXAM_H 30
#define FACE 5
#define FACE_W 221
#define FACE_H 204
#define GAMEOVER 6
#define GAMEOVER_W 216
#define GAMEOVER_H 187
#define JUDGE_0 7
#define JUDGE_0_W 17
#define JUDGE_0_H 22
#define JUDGE_1 8
#define JUDGE_1_W 16
#define JUDGE_1_H 24
#define MONTH 9
#define MONTH_W 15
#define MONTH_H 26
#define RESULT 10
#define RESULT_W 99
#define RESULT_H 31
#define TANI 11
#define TANI_W 48
#define TANI_H 30
#define TANI_0 12
#define TANI_0_W 30
#define TANI_0_H 39
#define TANI_1 13
#define TANI_1_W 30
#define TANI_1_H 39
#define TANI_2 14
#define TANI_2_W 30
#define TANI_2_H 40
#define TANI_3 15
#define TANI_3_W 30
#define TANI_3_H 40
#define TANI_4 16
#define TANI_4_W 30
#define TANI_4_H 40
#define TANI_5 17
#define TANI_5_W 30
#define TANI_5_H 40
#define TANI_6 18
#define TANI_6_W 30
#define TANI_6_H 40
#define TANI_7 19
#define TANI_7_W 30
#define TANI_7_H 40
#define TECH_0 20
#define TECH_0_W 37
#define TECH_0_H 100
#define TECH_1 21
#define TECH_1_W 37
#define TECH_1_H 97
#define TECH_2 22
#define TECH_2_W 37
#define TECH_2_H 100
#define TECH_3 23
#define TECH_3_W 37
#define TECH_3_H 97
#define TECH_4 24
#define TECH_4_W 43
#define TECH_4_H 100
#define TITLE 25
#define TITLE_W 256
#define TITLE_H 272
#define TRIANGLE 26
#define TRIANGLE_W 16
#define TRIANGLE_H 21

const uint16_t LC[] PROGMEM = {
56,180,200,100,376,896,672,48,36,36,336,104,48,84,60,44,80,48,128,104,408,408,408,408,408,684,12};
const uint16_t LT[] PROGMEM = {
0,56,236,436,536,912,1808,2480,2528,2564,2600,2936,3040,3088,3172,3232,3276,3356,3404,3532,3636,4044,4452,4860,5268,5676,6360};
const uint8_t DAT[] PROGMEM = {
9,5,35,33,6,2,36,35,0,6,3,36,0,11,3,0,11,6,0,32,15,3,33,32,8,2,29,28,11,0,28,31,10,0,25,28,11,2,28,27,4,4,6,4,15,0,33,37,10,5,38,37,9,0,35,38,34,0,8,14,34,3,23,23,29,0,23,28,29,0,14,18,40,0,18,12,38,2,0,11,34,0,14,18,29,0,18,23,46,0,18,26,40,5,26,26,40,0,26,18,29,5,23,23,34,0,18,23,29,5,18,18,29,5,14,14,46,0,12,18,40,5,18,18,40,5,12,12,5,2,28,24,2,0,13,18,2,7,18,18,9,0,18,13,2,7,13,13,14,8,23,23,14,2,23,28,0,14,23,23,16,3,1,1,19,0,1,19,2,0,0,8,6,2,1,1,9,0,1,8,2,7,8,8,43,2,1,1,46,0,1,12,33,3,6,2,25,4,1,6,29,5,8,8,34,3,8,8,14,0,5,18,25,3,8,8,25,3,23,23,29,0,8,14,9,0,13,8,2,0,8,13,34,0,28,23,6,3,5,11,7,2,24,22,11,0,15,15,11,0,15,15,3,2,16,20,7,4,15,15,10,3,22,19,11,1,15,19,10,3,22,28,10,2,11,15,14,4,4,11,10,8,11,11,0,5,22,27,0,3,12,16,29,0,23,28,29,5,23,23,35,0,28,23,35,0,19,23,29,0,19,23,29,5,19,19,20,1,16,13,29,5,9,9,29,0,9,14,29,5,14,14,35,0,9,14,29,0,14,19,25,3,9,9,25,3,23,23,35,0,14,19,40,5,12,12,40,5,19,19,46,0,12,19,46,0,19,26,40,5,26,26,40,0,26,19,40,0,19,12,38,2,0,11,35,3,9,9,35,3,23,23,12,7,15,16,18,1,20,16,43,2,1,2,46,0,2,12,6,7,0,4,14,7,4,1,26,4,1,6,33,3,6,2,10,4,11,4,3,0,0,16,13,4,19,26,2,2,13,13,0,1,2,9,11,3,23,28,14,3,11,8,9,6,10,16,7,0,9,4,4,3,13,14,8,0,14,12,7,1,17,14,4,0,13,0,11,9,4,0,16,6,16,11,16,4,16,24,12,7,24,24,5,2,19,25,11,4,23,16,9,2,19,23,33,3,1,2,37,0,2,18,37,8,18,25,26,19,25,25,2,2,13,19,1,3,21,19,1,2,21,28,0,2,12,13,68,5,21,21,3,0,14,19,3,0,28,24,0,3,24,24,0,4,1,6,0,3,9,9,3,0,9,14,68,0,28,21,60,8,21,21,63,3,14,14,59,3,14,14,51,6,14,14,51,6,18,18,51,6,26,26,50,8,22,22,15,0,19,26,15,5,26,26,20,0,26,19,9,0,24,28,9,3,24,24,9,0,19,14,12,2,0,12,20,0,19,12,15,5,12,12,15,5,19,19,15,0,12,19,9,0,24,19,36,0,15,22,36,0,29,22,25,11,22,22,27,9,15,15,7,3,6,3,17,2,1,2,20,0,2,12,9,3,9,9,57,0,1,3,57,0,3,9,52,5,9,9,52,0,9,3,59,3,3,4,63,4,4,6,52,0,3,0,52,5,3,3,36,0,0,15,36,10,15,3,9,0,14,9,71,1,1,5,68,2,8,1,68,0,21,8,63,0,4,14,36,9,15,15,36,10,22,22,25,10,3,15,3,5,9,9,3,5,24,24,3,5,19,19,3,5,14,14,82,3,26,26,78,0,17,21,78,3,12,12,78,0,12,17,81,2,1,2,84,1,2,12,82,3,12,12,82,3,17,17,82,3,21,21,82,0,17,12,82,0,21,17,78,0,21,26,78,3,26,26,82,0,21,26,78,3,17,17,78,3,21,21,85,6,19,27,91,7,27,20,88,4,10,10,88,0,10,15,88,4,15,15,88,3,20,20,92,4,10,10,96,0,10,15,92,4,15,15,92,0,15,20,92,3,20,20,92,6,9,1,92,0,9,10,78,0,9,4,76,0,3,9,82,1,9,6,80,0,9,5,86,5,1,9,92,0,15,10,70,2,27,24,3,0,19,24,48,7,48,82,165,9,44,41,167,6,53,41,167,17,53,49,180,4,60,49,180,27,60,60,189,18,77,60,189,24,77,82,199,14,93,82,90,20,180,185,77,13,166,180,56,4,130,139,45,3,64,48,45,0,64,98,45,8,98,120,92,0,25,9,79,12,25,9,79,2,25,6,71,11,19,6,67,3,43,19,63,4,24,43,63,0,24,0,45,2,15,0,45,2,15,48,99,11,178,185,199,21,102,113,204,17,120,113,204,12,120,127,201,15,131,127,201,12,131,147,192,21,145,147,192,8,145,154,184,16,154,154,164,19,172,154,138,26,190,172,122,16,191,190,110,11,185,191,126,8,137,129,134,22,129,92,157,2,92,56,152,7,26,56,152,9,26,38,161,5,38,52,167,2,52,70,170,0,70,88,169,0,94,88,72,24,108,78,96,26,78,60,111,12,76,60,111,15,76,72,105,21,121,72,158,9,125,105,63,19,48,26,73,9,46,26,68,4,64,46,68,0,64,107,122,7,32,41,113,9,33,32,122,7,89,96,122,2,89,89,125,2,89,80,127,0,80,89,127,5,89,94,133,7,94,96,140,6,96,94,147,6,94,86,154,2,86,74,156,0,74,85,153,3,94,85,145,8,99,94,136,8,99,99,130,6,96,99,124,2,97,99,138,3,93,94,134,3,90,93,133,1,84,90,133,0,84,77,133,1,77,71,134,5,71,66,140,4,66,65,144,2,65,66,147,3,66,69,151,2,69,73,151,2,87,80,145,5,93,87,141,4,94,93,143,10,80,73,143,9,80,80,153,0,80,73,111,40,105,100,84,4,83,83,76,7,94,95,70,5,90,94,85,7,79,80,92,7,80,72,92,7,75,72,85,6,75,75,81,4,69,75,81,0,69,61,81,3,61,50,78,6,59,50,78,0,71,59,78,7,71,79,98,2,70,66,95,3,73,70,91,4,74,73,87,3,73,74,85,1,69,73,85,0,69,60,85,1,60,55,87,3,55,49,91,4,49,48,95,4,48,49,100,2,49,54,103,0,54,60,93,8,60,66,93,9,60,60,101,1,66,60,68,8,99,101,130,8,118,118,123,7,112,118,68,1,68,66,70,6,66,57,76,6,57,44,70,1,66,57,71,2,57,47,74,8,47,44,82,1,44,29,83,7,29,24,91,13,24,22,104,16,22,22,121,12,22,28,134,14,28,41,148,11,41,57,168,6,105,108,161,7,149,135,140,21,177,149,110,29,180,177,89,21,172,180,65,24,157,172,60,5,139,157,60,3,139,141,63,10,141,157,74,12,157,164,87,23,164,162,174,5,108,131,169,10,151,131,169,0,151,135,168,0,114,135,168,0,105,114,180,12,102,113,193,3,113,140,178,19,106,140,178,2,106,102,180,0,91,102,168,1,105,94,169,2,94,97,172,3,97,95,175,0,95,88,170,5,82,88,170,5,82,78,170,5,70,78,176,4,78,91,182,25,97,101,197,10,91,101,180,17,91,91,174,3,108,106,96,13,165,173,110,10,173,171,121,20,171,158,141,16,158,137,158,10,137,114,92,19,18,8,39,4,67,67,34,4,62,67,79,3,21,21,42,3,29,29,41,4,45,59,41,0,45,32,41,0,32,29,42,3,29,21,39,6,16,21,33,5,20,16,30,2,28,20,63,6,26,24,30,4,44,62,30,0,44,28,169,2,16,19,171,0,19,28,162,9,38,28,123,9,9,14,132,11,14,16,143,9,16,21,153,0,21,9,153,4,9,0,161,7,27,16,153,8,21,27,141,2,34,29,144,9,29,34,148,5,37,34,151,4,46,42,125,0,12,23,123,10,9,21,133,11,21,29,111,3,8,21,115,7,21,9,108,2,0,8,169,9,16,0,16,14,24,28,1,14,13,24,0,1,21,13,0,2,21,25,2,0,25,30,2,21,30,54,13,10,60,54,13,0,60,72,13,21,72,62,18,8,94,113,18,12,94,109,30,14,109,118,45,22,118,125,54,12,130,125,39,15,125,130,26,13,113,125,79,5,96,96,85,9,96,98,94,13,98,87,108,10,87,64,118,3,64,36,116,5,19,36,111,5,55,19,97,13,75,55,45,14,79,100,60,13,100,96,88,2,73,34,83,7,41,34,83,2,41,28,68,16,71,28,63,3,68,27,60,5,36,27,60,2,36,20,62,13,20,0,58,18,6,0,49,8,18,6,48,1,34,18,41,5,41,23,41,0,41,64,63,6,64,67,90,20,59,50,36,6,31,35,9,26,29,31,9,0,29,26,9,19,26,19,25,3,17,19,25,5,17,15,30,15,15,26,142,4,34,31,146,21,31,26,165,2,23,26,152,12,18,23,144,7,21,18,144,3,21,17,146,2,14,17,136,9,23,14,123,8,38,32,130,7,44,38,145,1,40,36,143,2,32,36,141,2,34,32,138,3,32,34,136,2,24,32,136,1,24,22,134,3,19,22,131,2,19,19,131,0,19,32,131,6,32,39,138,6,39,40,108,4,21,27,87,21,12,21,72,15,17,12,62,10,26,17,62,9,31,38,60,11,46,38,67,6,57,60,57,9,63,57,84,4,21,18,79,4,18,21,94,8,38,46,94,10,38,30,99,6,61,62,92,7,65,61,80,13,102,98,119,5,65,64,125,3,64,64,121,3,48,52,123,1,56,52,120,3,57,56,88,5,106,104,93,17,104,92,110,15,92,69,126,2,69,83,128,3,83,73,128,3,64,73,129,13,59,68,140,1,59,68,129,10,54,59,128,0,64,59,128,6,47,45,135,6,45,51,129,11,51,51,128,0,47,51,129,0,51,54,129,0,59,54,128,0,45,47,122,5,39,45,58,8,100,104,125,0,64,69,133,5,73,66,133,7,73,71,122,18,85,71,122,5,85,87,91,35,107,87,139,0,39,46,139,5,46,45,139,5,58,45,126,13,102,95,139,9,95,83,148,0,83,67,146,2,56,67,142,3,52,56,144,5,46,52,149,3,52,64,153,0,83,64,143,9,97,83,129,14,105,97,152,24,63,65,177,0,65,73,174,3,78,73,153,20,76,78,164,9,45,45,173,0,45,46,164,9,46,46,163,3,50,47,160,2,46,50,160,0,46,42,160,2,42,39,163,3,39,44,146,5,48,46,151,0,46,47,152,11,47,50,144,5,46,44,150,12,43,39,89,18,129,128,107,0,128,129,107,2,129,129,91,0,129,107,68,23,98,107,65,3,127,98,99,7,108,128,99,15,108,95,114,15,95,106,110,19,129,106,110,0,129,149,96,14,149,149,215,1,56,25,189,26,25,25,187,2,51,25,187,28,51,56,96,0,149,176,71,24,176,176,71,0,176,151,71,8,151,151,57,14,151,151,57,0,151,127,57,8,127,127,80,8,129,129,89,0,150,129,80,0,151,129,65,15,127,129,80,15,151,149,36,11,70,79,27,8,54,70,27,23,54,78,21,0,69,44,0,21,44,44,0,0,44,69,0,9,69,69,9,0,69,93,9,23,93,93,32,0,93,69,21,11,69,69,9,11,69,69,0,7,19,10,0,7,1,10,0,1,1,0,1,7,0,9,8,7,9,0,15,1,0,1,9,7,10,1,9,7,10,19,15,1,21,19,8,7,12,21,1,7,21,12,0,1,19,21,11,2,14,19,6,4,0,14,0,6,11,0,0,3,11,12,3,3,12,7,6,4,7,20,10,2,20,23,13,3,23,23,13,3,19,23,15,0,10,0,12,3,0,0,0,4,0,10,4,0,10,24,4,11,24,24,15,0,24,17,15,0,10,17,4,11,10,10,4,11,17,17,36,9,12,12,88,0,24,28,77,11,15,15,80,8,20,20,88,0,15,20,88,4,13,7,83,4,11,13,77,6,7,11,83,0,11,2,78,4,1,2,92,6,7,1,92,4,7,12,88,0,20,24,83,7,2,4,88,11,15,15,88,8,20,20,88,10,24,24,40,7,25,25,40,0,25,28,40,7,18,18,40,0,18,22,40,6,22,22,45,0,8,12,45,0,12,15,36,9,15,15,36,0,15,8,36,0,8,5,36,9,5,5,45,0,5,8,42,5,3,0,65,2,24,20,59,5,17,17,64,0,11,2,64,7,2,2,71,1,2,5,59,5,11,11,51,5,1,4,56,2,4,9,59,0,9,11,59,0,11,17,64,3,17,17,64,0,11,17,40,0,22,25,53,3,23,19,51,5,15,19,56,4,19,27,52,9,27,27,63,2,28,24,51,7,11,11,55,3,17,17,68,4,20,24,65,4,24,28,68,5,20,16,64,8,11,11,4,4,5,6,9,0,6,15,2,6,15,15,13,1,22,8,13,8,22,22,15,4,8,17,8,7,1,8,15,5,8,1,33,0,14,12,32,1,17,14,27,2,13,19,27,3,21,19,27,3,21,28,27,2,13,13,25,2,12,13,26,1,2,10,32,0,10,4,32,5,0,3,30,3,13,14,30,0,0,13,13,0,29,22,30,2,19,25,0,2,1,15,2,0,15,22,2,10,22,22,33,7,18,18,35,5,22,22,34,6,25,25,36,9,8,8,78,9,24,24,41,3,2,18,9,2,28,23,3,7,20,20,3,0,20,11,16,2,22,28,11,7,20,20,32,7,21,21,39,7,21,21,39,0,21,28,34,2,17,5,31,9,2,2,41,6,2,2,11,7,11,11,18,0,11,20,3,7,16,16,11,0,0,6,11,0,11,16,3,7,11,11,11,0,11,6,0,11,6,6,11,11,6,6,11,7,16,16,25,6,13,28,29,0,21,0,11,0,20,16,2,2,28,23,6,9,29,18,24,3,29,29,6,18,29,29,15,0,34,29,0,0,37,0,0,30,0,0,30,0,0,37,0,30,37,37,15,12,18,3,3,12,3,18,15,9,18,29,3,3,29,29,13,2,20,17,0,0,37,0,0,30,0,0,30,0,0,37,0,30,37,37,3,2,31,27,3,3,31,34,7,3,34,33,5,4,19,21,2,3,22,19,2,3,22,27,6,2,27,27,20,2,22,17,20,3,22,22,24,3,22,20,19,3,15,17,17,2,6,15,17,2,6,2,19,3,2,3,23,3,3,11,23,2,17,11,0,0,37,0,0,30,0,0,30,0,0,37,0,30,37,37,25,2,14,27,21,4,12,14,15,2,27,14,17,4,14,12,21,0,12,6,2,0,18,28,2,9,28,28,2,10,7,7,2,0,7,18,2,8,18,18,21,0,12,28,25,3,19,17,22,2,15,19,20,2,21,15,15,4,11,21,10,4,29,11,5,5,2,29,2,3,33,2,0,30,37,37,0,0,37,0,0,30,0,0,30,0,0,37,16,3,25,30,16,6,25,24,6,6,24,25,10,2,30,25,17,5,21,24,12,5,21,21,6,6,24,21,10,4,30,28,14,5,28,30,14,4,32,30,10,4,30,32,23,0,24,6,17,5,3,6,11,5,3,3,6,5,5,3,6,0,24,5,0,30,0,0,30,0,0,37,0,30,37,37,0,0,37,0,0,0,37,0,0,30,0,0,30,0,0,37,0,30,37,37,12,2,16,3,12,2,16,33,14,12,33,18,12,14,16,18,2,12,18,33,2,12,18,3,2,9,18,16,14,12,3,18,15,10,37,37,20,10,18,18,15,5,18,18,15,0,12,18,25,0,37,18,20,0,18,37,15,0,31,18,0,0,31,18,0,0,31,37,0,15,37,37,15,0,0,12,0,15,25,25,0,15,18,18,0,0,18,0,0,30,0,0,0,15,31,31,30,0,12,18,30,0,18,37,25,5,37,37,30,0,0,12,15,15,6,6,15,15,12,12,15,0,37,31,6,0,17,17,3,1,15,12,3,2,15,16,1,1,16,15,1,1,13,15,7,1,15,15,6,1,12,12,6,1,14,14,3,0,15,17,21,4,7,18,7,2,29,24,9,0,24,18,9,0,12,18,7,2,7,12,10,4,18,18,18,0,18,24,19,2,24,29,19,2,11,7,18,0,18,11,18,7,18,18,14,3,18,18,14,7,33,29,21,4,29,18,14,0,18,33,7,7,7,4,14,7,4,7,0,30,0,0,30,0,0,37,0,30,37,37,0,0,37,0,14,0,4,18,3,6,18,18,3,3,18,29,3,3,18,7,7,7,29,33,22,3,19,1,22,4,0,1,18,3,20,0,5,6,3,20,5,4,3,1,10,5,1,20,12,4,57,59,6,6,62,57,6,0,62,66,6,0,66,73,10,7,79,74,20,2,59,61,11,4,88,90,6,2,80,87,5,0,70,80,5,1,70,74,7,0,74,69,8,2,69,81,17,1,81,68,15,3,51,68,15,6,51,62,22,6,62,54,28,0,54,63,28,3,63,58,30,1,71,58,30,2,71,69,28,4,81,69,28,2,81,81,24,6,89,81,19,5,90,89,22,1,62,70,9,2,59,60,21,2,75,69,21,2,75,76,25,0,72,74,24,2,69,67,26,3,67,68,25,4,72,68,25,3,72,71,28,2,71,75,26,5,74,75,24,1,69,72,24,1,76,74,21,0,79,75,15,5,91,79,15,2,91,92,18,4,92,81,23,0,81,76,1,10,94,85,1,8,94,91,9,1,91,86,24,4,76,82,28,0,82,80,26,2,74,80,27,3,42,45,25,1,38,42,25,4,38,35,30,1,35,39,27,4,42,39,30,1,45,39,27,2,56,45,15,0,57,58,20,0,56,58,5,2,42,37,5,4,42,43,1,3,39,42,1,2,39,34,4,2,34,37,7,1,37,43,9,4,43,58,33,1,15,16,31,1,17,15,29,2,23,17,29,0,23,24,34,1,16,18,34,1,21,18,30,4,24,21,28,2,27,24,34,2,16,13,15,5,53,30,20,0,30,32,21,4,32,29,25,0,29,30,23,3,37,30,18,4,53,37,23,1,37,39,20,4,39,39,17,3,37,39,17,2,37,36,22,11,41,23,21,1,47,41,21,0,47,55,19,2,57,55,0,0,24,21,0,32,21,19,33,1,19,23,13,3,56,57,13,0,48,56,11,1,41,48,0,11,24,41,0,34,24,23,12,0,65,73,22,0,17,0,17,4,0,0,17,0,0,17,9,2,0,17,9,4,0,0,14,1,0,17,12,4,55,56,6,6,59,55,6,0,59,63,6,0,63,70,10,7,76,71,20,2,56,58,11,4,85,87,6,2,77,84,5,0,67,77,5,1,67,71,7,0,71,67,8,2,67,78,17,1,78,65,15,3,48,65,15,6,48,59,22,6,59,51,28,0,51,60,28,3,60,56,30,1,68,56,30,2,68,66,28,4,78,66,28,2,78,78,24,6,86,78,19,5,87,86,22,1,59,67,9,2,56,57,21,2,72,67,21,2,72,73,25,0,69,71,24,2,67,64,26,3,64,65,25,4,69,65,25,3,69,68,28,2,68,72,26,5,71,72,24,1,67,69,24,1,73,71,21,0,76,72,15,5,88,76,15,2,88,89,18,4,89,78,23,0,78,73,1,10,91,82,1,8,91,88,9,1,88,84,24,4,73,79,28,0,79,77,26,2,71,77,27,3,39,43,25,1,35,39,25,4,35,32,30,1,32,36,27,4,39,36,30,1,43,36,27,2,53,43,15,0,54,56,20,0,53,55,5,2,39,34,5,4,39,40,1,3,36,39,1,2,36,31,4,2,31,34,7,1,34,40,9,4,40,55,22,11,38,20,21,1,44,38,21,0,44,52,19,2,54,52,0,0,21,18,0,32,18,16,33,1,16,20,13,3,53,54,13,0,45,53,11,1,38,45,0,11,21,38,0,34,21,20,33,1,12,14,31,1,14,12,29,2,20,14,29,0,20,21,34,1,14,15,34,1,18,15,30,4,21,18,28,2,24,21,34,2,14,10,15,0,50,27,16,1,27,28,17,3,28,24,20,1,24,25,19,2,32,25,19,0,50,32,20,1,32,34,18,3,36,34,14,3,35,36,14,1,35,33,12,0,62,70,5,6,3,20,5,4,3,1,10,5,1,20,22,3,19,1,22,4,0,1,18,3,20,0,12,4,57,59,6,6,62,57,6,0,62,66,6,0,66,73,10,7,79,74,20,2,59,61,11,4,88,90,6,2,80,87,5,0,70,80,5,1,70,74,7,0,74,69,8,2,69,81,17,1,81,68,15,3,51,68,15,6,51,62,22,6,62,54,28,0,54,63,28,3,63,58,30,1,71,58,30,2,71,69,28,4,81,69,28,2,81,81,24,6,89,81,19,5,90,89,22,1,62,70,9,2,59,60,21,2,75,69,21,2,75,76,25,0,72,74,24,2,69,67,26,3,67,68,25,4,72,68,25,3,72,71,28,2,71,75,26,5,74,75,24,1,69,72,24,1,76,74,21,0,79,75,15,5,91,79,15,2,91,92,18,4,92,81,23,0,81,76,1,10,94,85,1,8,94,91,9,1,91,86,24,4,76,82,28,0,82,80,26,2,74,80,27,3,42,45,25,1,38,42,25,4,38,35,30,1,35,39,27,4,42,39,30,1,45,39,27,2,56,45,15,0,57,58,20,0,56,58,5,2,42,37,5,4,42,43,1,3,39,42,1,2,39,34,4,2,34,37,7,1,37,43,9,4,43,58,33,1,15,16,31,1,17,15,29,2,23,17,29,0,23,24,34,1,16,18,34,1,21,18,30,4,24,21,28,2,27,24,34,2,16,13,11,4,31,54,11,1,31,33,13,2,33,28,15,1,28,28,16,0,36,28,16,2,36,53,16,1,36,37,15,3,40,37,11,4,40,40,11,1,40,37,22,11,41,23,21,1,47,41,21,0,47,55,19,2,57,55,0,0,24,21,0,32,21,19,33,1,19,23,13,3,56,57,13,0,48,56,11,1,41,48,0,11,24,41,0,34,24,23,12,0,65,73,22,0,17,0,17,4,0,0,17,0,0,17,9,2,0,17,9,4,0,0,14,1,0,17,12,4,55,56,6,6,59,55,6,0,59,63,6,0,63,70,10,7,76,71,20,2,56,58,11,4,85,87,6,2,77,84,5,0,67,77,5,1,67,71,7,0,71,67,8,2,67,78,17,1,78,65,15,3,48,65,15,6,48,59,22,6,59,51,28,0,51,60,28,3,60,56,30,1,68,56,30,2,68,66,28,4,78,66,28,2,78,78,24,6,86,78,19,5,87,86,22,1,59,67,9,2,56,57,21,2,72,67,21,2,72,73,25,0,69,71,24,2,67,64,26,3,64,65,25,4,69,65,25,3,69,68,28,2,68,72,26,5,71,72,24,1,67,69,24,1,73,71,21,0,76,72,15,5,88,76,15,2,88,89,18,4,89,78,23,0,78,73,1,10,91,82,1,8,91,88,9,1,88,84,24,4,73,79,28,0,79,77,26,2,71,77,27,3,39,43,25,1,35,39,25,4,35,32,30,1,32,36,27,4,39,36,30,1,43,36,27,2,53,43,15,0,54,56,20,0,53,55,5,2,39,34,5,4,39,40,1,3,36,39,1,2,36,31,4,2,31,34,7,1,34,40,9,4,40,55,22,11,38,20,21,1,44,38,21,0,44,52,19,2,54,52,0,0,21,18,0,32,18,16,33,1,16,20,13,3,53,54,13,0,45,53,11,1,38,45,0,11,21,38,0,34,21,20,33,1,12,14,31,1,14,12,29,2,20,14,29,0,20,21,34,1,14,15,34,1,18,15,30,4,21,18,28,2,24,21,34,2,14,10,15,0,50,27,16,1,27,28,17,3,28,24,20,1,24,25,19,2,32,25,19,0,50,32,20,1,32,34,18,3,36,34,14,3,35,36,14,1,35,33,12,0,62,70,18,4,56,56,12,5,61,56,12,1,61,65,14,0,65,72,19,6,77,71,26,3,56,57,21,4,86,87,15,3,79,85,13,1,69,79,13,2,69,73,15,0,73,68,15,4,68,79,26,0,64,78,20,5,48,64,20,8,48,58,28,5,58,49,33,1,49,58,35,3,58,52,38,0,65,52,38,1,65,63,37,2,75,63,37,2,75,75,34,5,84,75,29,4,87,84,28,2,58,65,16,2,58,58,29,1,71,65,29,2,71,71,33,0,67,69,31,2,65,62,33,3,62,62,33,3,67,62,33,3,67,66,36,2,66,69,34,5,69,69,31,1,65,67,32,1,71,69,29,0,71,75,26,3,88,75,26,2,88,88,29,3,88,76,32,0,76,71,12,8,94,83,12,8,94,89,20,1,89,84,32,4,71,77,37,0,74,77,34,3,69,74,30,3,37,40,28,2,33,37,28,4,33,30,32,1,30,34,30,3,37,34,34,0,40,34,32,1,51,40,21,0,54,56,26,0,53,55,9,1,42,36,9,4,42,42,5,3,40,42,5,2,40,34,7,3,34,36,10,2,36,42,13,6,42,56,28,11,38,20,27,1,44,38,27,0,44,52,25,2,54,52,5,0,21,18,6,32,18,16,39,1,16,20,19,3,53,54,19,0,45,53,17,1,38,45,5,11,21,38,5,34,21,20,39,1,12,14,37,1,14,12,35,2,20,14,35,0,20,21,40,1,14,15,40,1,18,15,36,4,21,18,34,2,24,21,40,2,14,10,4,16,63,51,4,0,63,60,0,4,59,60,0,0,57,59,0,6,57,56,6,12,56,48,6,0,56,53,6,3,53,56,9,0,56,61,8,2,60,61,15,2,0,17,15,4,0,0,20,1,0,17,28,0,17,0,23,4,0,0,23,0,0,17,19,1,64,71,17,46,0,196,221,9,211,211,218,3,196,211,210,7,196,196,210,9,196,236,220,7,236,236,223,3,220,236,223,9,220,220,231,2,211,220,242,13,219,219,240,15,211,211,237,3,196,211,229,7,196,196,229,9,196,236,239,7,236,236,242,3,219,236,198,14,226,226,192,5,204,226,192,14,204,204,205,1,196,204,183,22,196,196,183,9,196,236,192,22,236,236,212,2,226,236,194,0,172,177,194,5,172,176,204,4,161,166,202,1,170,161,202,6,170,170,208,1,177,170,202,5,170,177,219,1,165,171,219,1,177,171,215,3,175,177,212,3,164,175,212,3,164,162,215,3,162,165,218,0,161,165,220,3,171,185,232,3,180,180,232,4,162,180,240,2,166,161,242,3,161,166,241,4,173,166,241,3,173,177,245,2,177,172,236,4,180,180,229,0,181,184,236,1,180,184,224,3,161,177,153,9,196,236,153,7,196,196,161,9,196,236,162,7,236,236,166,15,211,211,181,2,211,220,168,15,220,220,166,1,211,220,172,15,236,236,185,2,226,236,169,15,226,226,169,2,226,236,149,9,236,236,157,2,226,236,148,8,226,226,141,7,196,226,133,7,196,196,133,9,196,236,149,3,236,255,128,2,226,236,128,9,226,226,138,2,226,236,131,9,236,236,142,7,236,236,142,3,236,255,135,0,161,164,136,2,164,177,132,3,161,164,129,2,164,161,129,3,164,177,149,2,161,173,155,3,162,175,156,2,178,175,152,4,173,178,152,0,173,177,146,0,181,184,142,3,161,177,178,1,196,204,164,15,204,204,162,1,196,204,162,15,196,196,169,1,165,171,170,1,171,177,169,1,177,171,165,3,175,177,162,3,165,175,162,3,165,163,165,3,163,165,168,1,159,165,164,4,155,159,161,2,159,155,182,4,161,164,179,3,166,161,179,3,166,180,183,3,180,183,187,3,183,177,192,2,161,172,100,0,236,229,98,2,226,229,98,6,226,226,105,2,226,236,100,6,236,236,101,9,196,236,101,7,196,196,108,9,196,236,110,7,236,236,70,6,196,226,77,4,226,196,82,7,196,196,90,9,196,236,91,7,236,236,84,7,204,236,80,4,236,204,72,7,236,236,63,9,196,236,84,5,173,173,90,3,173,178,92,1,183,178,87,4,183,183,84,2,173,183,82,2,162,173,102,0,161,164,111,0,173,177,109,2,162,173,102,2,164,177,98,3,161,164,96,2,164,161,96,3,164,177,118,2,166,162,120,3,162,166,119,4,173,166,119,3,173,177,123,2,177,173,111,5,173,176,44,9,220,220,52,1,211,220,42,9,211,211,39,3,196,211,31,7,196,196,31,9,196,236,41,26,236,236,58,9,196,236,50,7,196,196,50,7,196,226,46,11,226,226,44,1,220,226,25,8,226,226,18,6,196,226,10,7,196,196,10,9,196,236,19,16,236,236,34,2,226,236,0,8,236,236,6,9,226,226,16,2,226,236,8,9,236,236,0,6,226,226,6,2,226,236,63,7,196,196,24,46,0,196,240,1,211,219,0,0,0,20,0,16,20,10,0,16,0,10};
#define IMAGESUM 27

const uint16_t CHAR[] PROGMEM = {
40179,35840,2175,3131,3212,16567,1279,3120,3327,3263,39944,3899,243,3891,255,244,1275,3276,819,3139,49348,195,44224,27840,3315,2300,19699,18684,1215,816,3267,37056,23744,61440,41216,36915,0};

const uint8_t TANITOTAL[] PROGMEM = {4, 9, 9, 9, 1, 2, 6, 4};
const uint8_t TANIMIN[] PROGMEM	 = {2, 0, 0, 0, 0, 0, 3, 1};

const uint16_t OTOIFREQ[] PROGMEM = {0xFFFF, 568<<1,536<<1,506<<1,488<<1,451<<1,426<<1,402<<1,379<<1,358<<1,338<<1,319<<1,301<<1};

#define DO  0x10
#define DOS 0x20
#define RE  0x30
#define RES 0x40
#define MI  0x50
#define FA  0x60
#define FAS 0x70
#define SO  0x80
#define SOS 0x90
#define RA  0xA0
#define RAS 0xB0
#define SI  0xC0
#define ST  0x00

#define OC0 (0<<2)
#define OC1 (1<<2)
#define OC2 (2<<2)
#define OC3 (3<<2)

#define NO0 3
#define NO2 2
#define NO4 1
#define NO8 0

const uint8_t BGM[] PROGMEM = {
//停止
ST|NO0,
//校歌
SO|OC1|NO4,RE|OC1|NO4,SO|OC1|NO4,RE|OC1|NO4,SO|OC1|NO4,RE|OC1|NO4,SO|OC1|NO4,RE|OC1|NO4,
SO|OC1|NO4,RE|OC1|NO4,SO|OC1|NO4,RAS|OC1|NO2,RA|OC1|NO4,RAS|OC1|NO4,RA|OC1|NO4,SO|OC1|NO4,RA|OC1|NO4,RE|OC1|NO4,RE|OC1|NO4,RE|OC1|NO4,ST|NO2,
//クリア
DO|OC2|NO2,DO|OC2|NO2,RE|OC2|NO4,RE|OC2|NO4,RE|OC2|NO8,DO|OC2|NO8,RAS|OC1|NO8,DO|OC2|NO8,DO|OC2|NO0,
//ゲームオーバー
MI|NO2,RE|NO2,DO|NO2,
//選択
DO|OC1|NO8,
//決定
MI|OC1|NO8,
//単位投げあげ
FA|OC1|NO8,
//単位落とす
FA|NO8,RE|NO8,
//電池
RE|OC2|NO8,FA|OC2|NO8,
//終了
SI|OC1|NO4,ST|NO8,SI|OC1|NO0,
//OK
SO|OC1|NO8,MI|OC1|NO8,
//NG
DO|NO8,ST|NO8,DO|NO2
};
#define BGM0 1 
#define BGM1 21
#define BGM2 9
#define BGM3 3
#define BGM4 1
#define BGM5 1
#define BGM6 1
#define BGM7 2
#define BGM8 2
#define BGM9 3
#define BGMA 2
#define BGMB 3

#define B_STOP			0
#define B_KOUKA		1
#define B_CLEAR		2
#define B_GAMEOVER	3
#define B_CHOOSE		4
#define B_ENTER		5
#define B_NAGEAGE		6
#define B_FAIL			7
#define B_DENTI		8
#define B_END			9
#define B_OK			10
#define B_NG			11

const uint8_t BGMLENGTH[] PROGMEM = {BGM0, BGM1, BGM2,BGM3,BGM4,BGM5,BGM6,BGM7,BGM8,BGM9,BGMA,BGMB};
const uint8_t BGMOFFSET[] PROGMEM = {
0,
BGM0,
BGM0+BGM1,
BGM0+BGM1+BGM2,
BGM0+BGM1+BGM2+BGM3,
BGM0+BGM1+BGM2+BGM3+BGM4,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6+BGM7,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6+BGM7+BGM8,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6+BGM7+BGM8+BGM9,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6+BGM7+BGM8+BGM9+BGMA,
BGM0+BGM1+BGM2+BGM3+BGM4+BGM5+BGM6+BGM7+BGM8+BGM9+BGMA+BGMB
};

uint8_t i, ii, iii;
uint8_t processTimer;
uint16_t fpsTimer;

//general
uint8_t mode;
uint8_t sw, swOne, swPre;

//menu
uint8_t choose;

//game
uint8_t techx, techf, techmuki, techatk;
uint8_t systani, sysap, syshp, sysevent, syseventTimer, sysmonth, sysmonthtani;
uint8_t systanitype[9], systanirest[9], systanipointer;
uint8_t taniid[16], tanix[16], taniy[16], tanihp[16];
uint8_t batx[16], baty[16];
int8_t tanixv[16], taniyv[16];
uint8_t taninow;
uint8_t endTimer, backTimer;

//ranking
uint8_t rankname[RANKSUM][8];
uint8_t ranktani[RANKSUM];

uint8_t inputname[8];

//sound
uint8_t youtp;
uint8_t nowse;
uint8_t bgmposition, bgmtimer, bgmtotal, bgmlength, bgmoffset, bgmdata, bgmno;
uint16_t bgmfreq;
uint8_t  seposition,  setimer,  setotal,  selength,  seoffset,  sedata,  seno;

void delay(void) {
	_delay_loop_2(1);
}
void drawSprite(uint8_t _id, uint8_t _x, uint8_t _y) {
	uint16_t _lc, _lt;
	uint8_t _i;
	uint16_t _xi;
	uint8_t _xf, _yf;
	uint8_t _yt;
	uint8_t _ym;
	uint16_t _xd, _yd;
	uint16_t _xds, _yds;
	uint8_t _len, _lenp;

	_lc = pgm_read_word(&LC[_id]);
	_lt = pgm_read_word(&LT[_id])+((uint16_t) &DAT[0]);
	for(_xi = 0; _xi < _lc; _lt += 4, _xi += 4) {
		_xf = pgm_read_byte(_lt);
		_xd = pgm_read_byte(_lt+1);
		_yf = pgm_read_byte(_lt+2);
		_yt = pgm_read_byte(_lt+3);
		_ym = (_yt > _yf);
		if(_ym) _yd = _yt-_yf;
		else _yd = _yf-_yt;
		_len = 3-((_xd+_yd)>>5);
		_lenp = 1<<_len;
		_xd <<= _len;
		_yd <<= _len;
		_i = 0;
		_xds = _yds = 0;
		_xf += _x;
		_yf += _y;
		if(_ym) {
			while(_i += _lenp) {
				_xds += _xd;
				_yds += _yd;
				XOUT = _xf+(_xds>>8);
				YOUT2 = ((YOUT = _yf+(_yds>>8))>>6) | youtp;
			}
		} else {
			while(_i += _lenp) {
				_xds += _xd;
				_yds += _yd;
				XOUT = _xf+(_xds>>8);
				YOUT2 = ((YOUT = _yf-(_yds>>8))>>6) | youtp;
			}
		}
	}
}
void drawSpriteRev(uint8_t _id, uint8_t _x, uint8_t _y) {
	uint16_t _lc, _lt;
	uint8_t _i;
	uint16_t _xi;
	uint8_t _xf, _yf;
	uint8_t _yt;
	uint8_t _ym;
	uint16_t _xd, _yd;
	uint16_t _xds, _yds;
	uint8_t _len, _lenp;

	_lc = pgm_read_word(&LC[_id]);
	_lt = pgm_read_word(&LT[_id])+((uint16_t) &DAT[0]);
	for(_xi = 0; _xi < _lc; _lt += 4, _xi += 4) {
		_xf = pgm_read_byte(_lt);
		_xd = pgm_read_byte(_lt+1);
		_yf = pgm_read_byte(_lt+2);
		_yt = pgm_read_byte(_lt+3);
		_ym = (_yt > _yf);
		if(_ym) _yd = _yt-_yf;
		else _yd = _yf-_yt;
		_len = 3-((_xd+_yd)>>5);
		_lenp = 1<<_len;
		_xd <<= _len;
		_yd <<= _len;
		_i = 0;
		_xds = _yds = 0;
		_xf = _x-_xf;
		_yf += _y;
		if(_ym) {
			while(_i += _lenp) {
				_xds += _xd;
				_yds += _yd;
				XOUT = _xf-(_xds>>8);
				YOUT2 = ((YOUT = _yf+(_yds>>8))>>6) | youtp;
			}
		} else {
			while(_i += _lenp) {
				_xds += _xd;
				_yds += _yd;
				XOUT = _xf-(_xds>>8);
				YOUT2 = ((YOUT = _yf-(_yds>>8))>>6) | youtp;
			}
		}
	}
}
void drawTri(uint8_t _x, uint8_t _y) {
	drawSprite(TRIANGLE, _x-TRIANGLE_W-4, _y+16-(TRIANGLE_H>>1));
}
void drawHLine(uint8_t _x, uint8_t _y, uint8_t _w) {
	uint8_t _i;
	YOUT2 = ((YOUT = _y)>>6) | youtp;
	for(_i = 0; _i < _w; _i++) {
		XOUT = _x+_i;
		delay();
	}
}
void drawChar(uint8_t _id, uint8_t _x, uint8_t _y) {
	uint8_t _i, _ii, _ix, _iy;
	uint16_t _iii;
	
	_iii = pgm_read_word(&CHAR[_id]);
	for(_ii = 0; _ii < 6; _ii++) {
		if(_iii&(1<<_ii)) {
			YOUT2 = ((YOUT = _y+((_ii&6)<<3))>>6) | youtp;
			for(_i = 0; _i < 8; _i++) XOUT = _x+_i+((_ii&1)<<3),delay();
		}
	}
	for(_ii = 0; _ii < 6; _ii++) {
		if(_iii&(1<<(_ii+6))) {
			XOUT = _x+((_ii&6)<<2);
			for(_i = 0; _i < 16; _i++) {
				YOUT2 = ((YOUT = _y+_i+((_ii&1)<<4))>>6) | youtp;
				delay();
			}
		}
	}
	for(_ii = 0; _ii < 4; _ii++) {
		if(_iii&(1<<(_ii+12))) {
			for(_i = 0; _i < 16; _i++) {
				_ix = _x+((_ii&2)<<2)+(_i>>1);
				_iy = _y+((_ii&1)<<4);
				if(_ii == 0 || _ii == 3) {
					_iy += _i;
				} else {
					_iy += -_i+16;
				}
				XOUT = _ix;
				YOUT2 = ((YOUT = _iy)>>6) | youtp;
				delay();
			}
		}
	}
}
void drawWord(char _word[], uint8_t _x, uint8_t _y) {
	uint8_t _i, _ii, _iii;
	_ii = strlen(_word);
	_iii = _x;
	for(_i = 0; _i < _ii; _i++) {
		if(_word[_i] >= 97)			drawChar(_word[_i]-97+10, _iii, _y);
		else if(_word[_i] != 32)	drawChar(_word[_i]-48, _iii, _y);
		_iii += 20;
	}
}
void drawWordBinary(uint8_t _word[], uint8_t _x, uint8_t _y, uint8_t _len) {
	uint8_t _i, _ii;
	_ii = _x;
	for(_i = 0; _i < _len; _i++) {
		drawChar(_word[_i], _ii, _y);
		_ii += 20;
	}
}
void drawFloat(uint8_t _num, uint8_t _x, uint8_t _y) {
	uint8_t _i, _ii;
	
	_x -= 20;
	_i = _num&1;
	_ii = _num>>1;
	drawChar(_ii%10, _x-30*_i, _y);
	if(_ii >= 10) drawChar(_ii/10, _x-20-30*_i, _y);
	if(_i) {
		drawChar(5, _x, _y);
		drawHLine(_x-12, _y, 6);
	}
}
void rankRead() {
	uint8_t _i, _ii;
	cli();
	//_delay_ms(100);
	for(_i = 0; _i < RANKSUM; _i++) {
		for(_ii = 0; _ii < 8; _ii++) {
			eeprom_busy_wait();
			rankname[_i][_ii] = eeprom_read_byte((uint8_t *)((_i<<3)+_ii));
		}
		ranktani[_i] = rankname[_i][7];
	}
	sei();
}
void rankWrite() {
	uint8_t _i, _ii;
	cli();
	for(_i = 0; _i < RANKSUM; _i++) {
		rankname[_i][7] = ranktani[_i];
		for(_ii = 0; _ii < 8; _ii++) {
			eeprom_busy_wait();
			eeprom_write_byte((uint8_t *)((_i<<3)+_ii), rankname[_i][_ii]);
		}
	}
	sei();
}
void rankClear() {
	uint8_t _i, _ii;
	for(_i = 0; _i < RANKSUM; _i++) {
		for(_ii = 0; _ii < 7; _ii++) {
			rankname[_i][_ii] = 10+26;
		}
		ranktani[_i] = 0;
	}
}
uint8_t randSeed = 0;
uint8_t rand8() {
	return randSeed = randSeed*17+73;
}

void startbgm(uint8_t _no) {
	bgmlength = bgmtimer = bgmdata = 0;
	bgmtotal = pgm_read_byte(&BGMLENGTH[_no]);
	bgmoffset = pgm_read_byte(&BGMOFFSET[_no]);
	bgmposition = bgmtotal-1;
	bgmno = _no;
	nowse = 0;
	TCNT1 = 0;
}
void startse(uint8_t _no) {
	selength = setimer = sedata = 0;
	setotal = pgm_read_byte(&BGMLENGTH[_no]);
	seoffset = pgm_read_byte(&BGMOFFSET[_no]);
	seposition = -1;
	seno = _no;
	nowse = 1;
	TCNT1 = 0;
}

ISR(TIMER1_COMPA_vect) {
	//20000000/256/freq=7812.5Hz
	if(nowse) {
		if(sedata&0xF0) {
			youtp = (~youtp)&(1<<5);
			YOUT2 = (YOUT2&~(1<<5)) | youtp;
		}
	} else {
		if(bgmtimer <= 6 && (bgmdata&0xF0)) {
			youtp = (~youtp)&(1<<5);
			YOUT2 = (YOUT2&~(1<<5)) | youtp;
		}
	}
}

ISR(TIMER0_COMPA_vect) {
	//20000000/256/2604=30Hz
	
	PORTC |= 0b11100;
	if(++processTimer == 21) {
		processTimer = 0;
		
		if(nowse) {
			if(++setimer >= selength) {
				setimer = 0;
				if(++seposition != setotal) {
					sedata = pgm_read_byte(&BGM[seposition+seoffset]);
					OCR1A = pgm_read_word(&OTOIFREQ[sedata>>4])>>((uint16_t)((sedata>>2)&0b11));
					selength = 4<<(sedata&0b11);
					TCNT1 = 0;
				} else {
					nowse = 0;
					TCNT1 = 0;
					OCR1A = bgmfreq;
				}
			}
		} else {
			if(++bgmtimer >= bgmlength) {
				bgmtimer = 0;
				bgmposition = (bgmposition+1)%bgmtotal;
				bgmdata = pgm_read_byte(&BGM[bgmposition+bgmoffset]);
				OCR1A = bgmfreq = pgm_read_word(&OTOIFREQ[bgmdata>>4])>>((uint16_t)((bgmdata>>2)&0b11));
				bgmlength = 8<<(bgmdata&0b11);
				TCNT1 = 0;
			}
		}
		
		fpsTimer++;
		
		swOne = 0;
		swPre = sw;
		for(i = 0; i < 3; i++) {
			if((PINC&(1<<(2+i))) == 0) {
				sw |= 1<<i;
				if((swPre&(1<<i)) == 0) swOne |= 1<<i;
			} else {
				sw &= ~(1<<i);
			}
		}
		
		//メイン処理
		if(mode == MODE_MENU) {
			if(swOne&(1<<0)) {
				if(choose != 0) choose--;
				else choose = 2;
				startse(B_CHOOSE);
			} else if(swOne&(1<<2)) {
				choose = (choose+1)%3;
				startse(B_CHOOSE);
			} else if(swOne&(1<<1)) {
				startse(B_ENTER);
				if(choose == 0) {
					mode = MODE_GAME;
					fpsTimer = 0;
					techx = 128-TECH_0_W/2;
					techf = 1;
					techmuki = 1;
					techatk = 0;
					systani = 0;
					sysap = 10;
					syshp = 99;
					sysevent = syseventTimer = 0;
					sysmonth = 4;
					sysmonthtani = 0;
					systanipointer = TANISUM-1;
					taninow = 0;
					endTimer = 0;
					for(i = 0; i < 16; i++) taniy[i] = baty[i] = 0xFF;
					for(i = 0; i < 8; i++) {
						systanitype[i] = 0;
						systanirest[i] = pgm_read_byte(&TANITOTAL[i]);
					}
					startbgm(B_KOUKA);
				} else if(choose == 1) {
					mode = MODE_RANKING;
					techx = 0xFF;
				} else {
					mode = MODE_VTEST;
					techx = 0;
				}
			}
		} else if(mode == MODE_GAME) {
			if(!techatk) {
				if(sw&5) {
					if(fpsTimer%6 == 0) {
						techf = ((techf+1)&3);
					}
					if(syshp && (fpsTimer%20) == 0) syshp--;
					i = (syshp>>4)+2;
					if(sw&(1<<0)) {
						if(techx < i) techx = 0;
						else techx -= i;
						techmuki = 0;
					} else {
						techx += i;
						if(techx > 255-TECH_0_W) techx = 255-TECH_0_W;
						techmuki = 1;
					}
				} else {
					techf = 1;
				}
				if(swOne&2) {
					if(syshp >= 4) syshp -= 4;
					else syshp = 0;
					techatk = 6;
					startse(B_NAGEAGE);
				}
			} else {
				for(i = 0; i < 16; i++) {
					if(((tanix[i] >= techx-TANI_0_W && tanix[i] <= techx+TECH_0_W) || (taniid[i] == TANI_SPOR && 0xFF-tanix[i]+techx <= TANI_0_W)) && taniy[i] <= TECH_0_H && (tanihp[i]&0xE0) == 0 && taniyv[i] <= 0) {
						taniyv[i] = -taniyv[i];
						if(techmuki) {
							tanixv[i] += 5;
						} else {
							tanixv[i] -= 5;
						}
						ii = sysap;
						if(taniid[i] == TANI_PHYE) ii >>= 2;
						if((tanihp[i]&31)+ii >= 32) {
							systani += 4;
							if(taniid[i] == TANI_CHEE) {
								systani--;
							} else if(taniid[i] == TANI_SPOR) {
								systani -= 2;
							}
							systanitype[taniid[i]]++;
							taniy[i] = 0xFF;
							taninow--;
						} else {
							tanihp[i] += ii;
						}
					}
				}
				techatk--;
				techf = 4;
			}
			if(((fpsTimer%170) == 0 || (sysevent != 0 && (fpsTimer%30) == 0))&& taninow != 16 && endTimer == 0) {
				for(i = 0; i < 16; i++) {
					if(taniy[i] == 0xFF) {
						taninow++;
						sysmonthtani++;
						if(sysmonthtani == 3) {
							sysmonth++;
							sysmonthtani = 0;
							if(sysmonth == 3) {
								taninow--;
								endTimer = 1;
								break;
							}
						}
						if(sysmonth == 8) {
							sysevent = 1;
						} else if(sysmonth == 2) {
							sysevent = 2;
						} else if(sysmonth == 13) {
							sysmonth = 1;
						}
						tanix[i] = rand8();
						taniy[i] = 0xFE;
						tanixv[i] = taniyv[i] = tanihp[i] = 0;
						do {
							if(systanipointer != 0) systanipointer--;
							else systanipointer = TANISUM-1;
						} while (systanirest[systanipointer] == 0);
						taniid[i] = systanipointer;
						systanirest[systanipointer]--;
						break;
					}
				}
			}
			if((fpsTimer%130) == 0) {
				for(i = 0; i < 16; i++) {
					if(baty[i] == 0xFF) {
						batx[i] = rand8()%(256-BAT_W);
						baty[i] = 254-BAT_H;
						break;
					}
				}
			}
			for(i = 0; i < 16; i++) {
				if(taniy[i] != 0xFF) {
					if(tanihp[i] & 0xE0) {
						if(((fpsTimer+i)%10) == 0) {
							tanihp[i] += (1<<5);
							if((tanihp[i]&0xE0) == 0) {
								taninow--;
								taniy[i] = 0xFF;
							}
						}	
					} else {
						if(taniy[i]&(1<<7) && taniid[i] == TANI_CHEM && ((rand8()&31) == 0)) tanix[i] = rand8();
						if(taniy[i]+taniyv[i] < 0) {
							taniy[i] = tanixv[i] = taniyv[i] = 0;
							tanihp[i] |= (1<<5);
							startse(B_FAIL);
						}
						if(taniid[i] == TANI_PHYS && (fpsTimer&(1<<3))) {
							if(fpsTimer&(1<<2)) tanixv[i]++;
							else tanixv[i]--;
						}
						if(taniid[i] == TANI_MATH && (fpsTimer&(1<<4))) {
							if(fpsTimer&(1<<3)) {
								if(tanixv[i] > 0) tanixv[i]--;
								else if(tanixv[i] < 0) tanixv[i]++;
								if(taniyv[i] < 0) taniyv[i]++;
							}
						}
						if(tanix[i] < -tanixv[i] && taniid[i] != TANI_SPOR) {
							tanix[i] = 0;
							tanixv[i] *= -1;
						}
						tanix[i] += tanixv[i];
						taniy[i] += taniyv[i];
						if((fpsTimer&7) == 0) {
							if(tanixv[i] > 1) tanixv[i]--;
							else if(tanixv[i] < -1) tanixv[i]++;
						}
						if((fpsTimer%12) == 0) taniyv[i]--;
						if(taniyv[i] < -5) taniyv[i] = -5;
						if(tanix[i] > 255-TANI_0_W && taniid[i] != TANI_SPOR) {
							tanix[i] = 255-TANI_0_W;
							tanixv[i] *= -1;
						}
						if(taniy[i] > 255-TANI_0_H-9) {
							taniy[i] = 255-TANI_0_H-9;
							taniyv[i] /= -2;
						}
					}
				}
				if(baty[i] != 0xFF) {
					baty[i] -= 2;
					if(batx[i] >= techx-BAT_W && batx[i] <= techx+TECH_0_W && baty[i] <= TECH_0_H) {
						baty[i] = 0xFF;
						syshp += 15;
						if(syshp > 99) syshp = 99;
						startse(B_DENTI);
					}
				}
			}
			if(endTimer && taninow == 0) {
				if(endTimer == 1) {
					startbgm(0);
					startse(B_END);
				}
				endTimer++;
				if(endTimer == 150) {
					mode = MODE_RESULT;
					endTimer = sysevent = 0;
				}
			}
			if(sysevent) {
				syseventTimer++;
				if(syseventTimer == 140) {
					sysevent = 0;
					syseventTimer = 0;
				}
			}
			if((sw&(1<<0)) && (sw&(1<<2))) {
				if(++backTimer == 90) {
					mode = MODE_MENU;
					startbgm(0);
				}
			} else {
				backTimer = 0;
			}
		} else if(mode == MODE_RANKING) {
			if(swOne&(1<<1)) {
				mode = MODE_MENU;
				startse(B_ENTER);
			}
			techf++;
			if((sw&(1<<0)) && (sw&(1<<2))) {
				systani++;
				if(systani == 150) {
					rankClear();
					rankWrite();
					startse(B_FAIL);
				}
			} else {
				systani = 0;
			}
		} else if(mode == MODE_RESULT) {
			
			syseventTimer++;
			if(syseventTimer == 38) {
				syseventTimer = 0;
				sysevent++;
				if(sysevent&1) {
					techx = systanitype[sysevent>>1] >= pgm_read_byte(&TANIMIN[sysevent>>1]);
					startse(techx ? B_OK : B_NG);
				} else if(techx == 0) {
					mode = MODE_GAMEOVER;
					startse(B_GAMEOVER);
				} else if((sysevent>>1) == TANISUM) {
					mode = MODE_CLEAR;
					syseventTimer = 0;
					startse(B_CLEAR);
				}
			}
		} else if(mode == MODE_CLEAR) {
			if(syseventTimer++ >= 150 || swOne&(1<<1)) {
				mode = MODE_SUBMIT;
				techx = techf = 0;
				for(i = 0; i< 8; i++) inputname[i] = 0;
			}
		} else if(mode == MODE_SUBMIT) {
			if(swOne&(1<<2)) {
				techx = (techx+1)%28;
				startse(B_CHOOSE);
			} else if(swOne&(1<<0)) {
				techx = (techx+27)%28;
				startse(B_CHOOSE);
			} else if(swOne&(1<<1)) {
				startse(B_ENTER);
				if(techx <= 25) {
					if(techf != 7) {
						inputname[techf] = techx+10;
						techf++;
					}
				} else if(techx == 26) {
					if(techf != 0) {
						techf--;
					}
				} else {
					while(techf < 7) {
						inputname[techf] = 10+26;
						techf++;
					}
					for(i = 0; i < RANKSUM; i++) {
						if(systani >= ranktani[i]) {
							for(ii = RANKSUM-1; ii > i; ii--) {
								for(iii = 0; iii < 7; iii++) {
									rankname[ii][iii] = rankname[ii-1][iii];
								}
								ranktani[ii] = ranktani[ii-1];
							}
							for(iii = 0; iii < 7; iii++) {
								rankname[i][iii] = inputname[iii];
							}
							ranktani[i] = systani;
							break;
						}
					}
					if(i != RANKSUM) {
						rankWrite();
						techx = i;
					} else {
						techx = 0xFF;
					}
					mode = MODE_RANKING;
				}
			}
		} else if(mode == MODE_GAMEOVER) {
			if(swOne&(1<<1)) {
				mode = MODE_MENU;
				startse(B_ENTER);
			}
		} else if(mode == MODE_VTEST) {
			if(swOne&(1<<0)) techx = (techx+IMAGESUM)%(IMAGESUM+1);
			if(swOne&(1<<1)) mode = MODE_MENU;
			if(swOne&(1<<2)) techx = (techx+1)%(IMAGESUM+1);
		}
	}
}

int main(void) {
	uint8_t mi, mii;
	DDRB = 0b111111;
	DDRC = 0b100011;
	DDRD = 0xFF;
	TCCR0A = 0b00000010;
	TCCR0B = 0b00000101;
	TIMSK0 = 0b00000010;
	OCR0A = 31;
	TCCR1A = 0b00000000;
	TCCR1B = 0b00001011;
	TIMSK1 = 0b00000010;
	OCR1A = 0xFFFF;
	sei();
	
	_delay_ms(100);
	
	rankRead();
	startbgm(B_STOP);
	
	mode = MODE_MENU;
	
	while(1) {
		if(mode == MODE_MENU) {
			drawSprite(TITLE, 0, 0);
			drawWord("new game", 98, 40*2);
			drawWord(" ranking", 98, 40);
			drawWord("img test", 98, 0);
			drawTri(98, (2-choose)*40);
		} else if(mode == MODE_GAME) {
			if(techmuki)	drawSpriteRev(TECH_0+techf, techx+TECH_0_W, 0);
			else					drawSprite(TECH_0+techf, techx, 0);
			drawSprite(TANI, 255-TANI_W, 255-4-32/2-TANI_H/2);
			drawSprite(MONTH, 255-MONTH_W, 255-36-4-32/2-MONTH_H/2);
			drawFloat(systani, 0xFF-TANI_W, 0xFF-36);
			drawChar(sysmonth%10, 255-MONTH_W-20, 255-36-36);
			if(sysmonth >= 10) drawChar(sysmonth/10, 255-MONTH_W-40, 255-36-36);
			for(mi = 0; mi < 16; mi++) {
				if(taniy[mi] != 0xFF && (tanihp[mi]&(1<<5)) == 0) {
					drawSprite(TANI_0+taniid[mi], tanix[mi], taniy[mi]);
					if(tanihp[mi]&31) {
						drawHLine(tanix[mi], taniy[mi]+TANI_0_H+8, (((tanihp[mi]&31)*TANI_0_W)>>5));
					}
				}
			}
			for(mi = 0; mi < 16; mi++) {
				if(baty[mi] != 0xFF) {
					drawSprite(BAT, batx[mi], baty[mi]);
				}
			}
			if(sysevent) {
				drawSprite(COOL_0+sysevent-1, (0xFF-EXAM_W-COOL_0_W)/2, 100);
				drawSprite(EXAM, (0xFF-EXAM_W-COOL_0_W)/2+COOL_0_W, 100);
			}
			if(endTimer && taninow == 0) drawSprite(END, (0xFF-END_W)/2, 100);
			
			drawSprite(BAT, 0, 0xFF-BAT_H);
			drawChar((syshp/10)%10, BAT_W, 255-36);
			drawChar(syshp%10, BAT_W+20, 255-36);
		} else if(mode == MODE_RANKING) {
			drawWord("back", 178, 0);
			drawTri(178, 0);
			for(mi = 0; mi < RANKSUM; mi++) {
				if(mi != techx || techf&(1<<4)) {
					drawWordBinary(rankname[mi], 0, 0xFF-(mi+1)*36, 7);
					drawFloat(ranktani[mi], 0xFF, 0xFF-(mi+1)*36);
				}
			}
		} else if(mode == MODE_RESULT) {
			drawSprite(RESULT, (0xFF-RESULT_W)/2, 0xFF-RESULT_H-1);
			drawSprite(TANI_0+(sysevent>>1), (0xFF-TANI_0_W)/2, (0xFF-TANI_0_H)/2);
			mi = sysevent>>1;
			if(mi == TANI_CHEE) mii = systanitype[mi]*3;
			else if(mi == TANI_SPOR) mii = systanitype[mi]<<1;
			else mii = systanitype[mi]<<2;
			drawFloat(mii, (0xFF-JUDGE_0_W-60)/2+40, (0xFF-TANI_0_H)/2-36-10);
			drawSprite(TANI, (0xFF-JUDGE_0-TANI_W-60)/2+60, (0xFF-TANI_0_H)/2-36-10+(32-TANI_H)/2);
			if(sysevent&1) drawSprite(JUDGE_0+techx, (0xFF-JUDGE_0-TANI_W-60)/2+60+TANI_W, (0xFF-TANI_0_H)/2-36-10+(32-JUDGE_0_H)/2);
		} else if(mode == MODE_CLEAR) {
			drawWord("game clear", (0xFF-20*10)/2, 0xff-50);
			drawSprite(FACE, (0xFF-FACE_W)/2, 0);
		} else if(mode == MODE_SUBMIT) {
			for(mi = 0; mi < 26; mi++) {
				drawChar(mi+10, (mi%7)*(TRIANGLE_W+20)+TRIANGLE_W, 0xFF-70-(mi/7)*40);
			}
			drawWord("delete", TRIANGLE_W+2, 0);
			drawWord("ok", 0xFF-40, 0);
			if(techx <= 25) drawTri((techx%7)*(TRIANGLE_W+20)+TRIANGLE_W+2, 0xFF-70-(techx/7)*40);
			else if(techx == 26) drawTri(TRIANGLE_W+2, 0);
			else drawTri(0xFF-40, 0);
			for(mi = 0; mi < techf; mi++) {
				drawChar(inputname[mi], mi*20+0xFF/2-techf*10, 0xFF-34);
			}
		} else if(mode == MODE_GAMEOVER) {
			drawWord("game over", (0xFF-20*9)/2, 0xff-50);
			drawSprite(GAMEOVER, (0xFF-GAMEOVER_W)/2, 0);
		} else if(mode == MODE_VTEST) {
			if(techx != 0) {
				drawSprite(techx-1, 0, 0);
				drawFloat((techx-1)<<1, 0xFF, 0);
			} else {
				for(mi = 0; mi < 36; mi++) {
					drawChar(mi, (mi%12)*20, (mi/12)*36);
				}
			}
		}
	}
}