#include "pitches.h"
// Arduino Pins
#define debugLED 13
#define clockLine 2
#define dataLine 4
#define latchLine 7
#define speakerPin 9
// NES Buttons
#define BTN_A 0
#define BTN_B 1
#define BTN_SELECT 2
#define BTN_START 3
#define BTN_UP 4
#define BTN_DOWN 5
#define BTN_LEFT 6
#define BTN_RIGHT 7
int* getNESButtonState()
{
int* button_state = (int*) malloc(sizeof(int)*8);
memset(button_state, 0, sizeof(int)*8);
digitalWrite(latchLine, HIGH);
delay(2);
digitalWrite(latchLine, LOW);
delay(2);
for(int i = 0; i < 8; i++)
{
if(digitalRead(dataLine) == LOW)
{
button_state[i] = 1;
}
else
{
button_state[i] = 0;
}
digitalWrite(clockLine, HIGH);
delay(2);
digitalWrite(clockLine, LOW);
delay(2);
}
return button_state;
}
void setup()
{
pinMode(debugLED, OUTPUT);
pinMode(clockLine, OUTPUT);
pinMode(dataLine, INPUT);
pinMode(latchLine, OUTPUT);
}
void loop()
{
int* button_state = getNESButtonState();
if(button_state[BTN_LEFT] == 1) tone(8, NOTE_C4);
else if(button_state[BTN_UP] == 1) tone(8, NOTE_D4);
else if(button_state[BTN_RIGHT] == 1) tone(8, NOTE_E4);
else if(button_state[BTN_DOWN] == 1) tone(8, NOTE_F4);
else if(button_state[BTN_SELECT] == 1) tone(8, NOTE_G4);
else if(button_state[BTN_START] == 1) tone(8, NOTE_G5);
else if(button_state[BTN_B] == 1) tone(8, NOTE_A5);
else if(button_state[BTN_A] == 1) tone(8, NOTE_B5);
else noTone(8);
free(button_state);
}