#include <SD.h>
#include <SPI.h>
#include <stdio.h>

// 2400 para uma experiência mais autêntica, 9600 para algo mais agradável
#define BAUD 9600
#include <util/setbaud.h>

#include "cpu.hpp"

File myFile;

const int pinoSS = 53;                                  // Pino 10 para o UNO

void setup() {                                          // Executado uma vez quando o Arduino é ligado

  Serial.begin(BAUD);                                   // Define o BaudRate

  pinMode(pinoSS, OUTPUT);                              // Declara o pinoSS como saída

  if (SD.begin()) {                                     // Inicializa o SD Card
    Serial.println("SD Card pronto para uso");          // Imprime no monitor serial
  }
  else {
    Serial.println("Falha na inicialização do SD Card.");
    return;
  }

  myFile = SD.open("ROMS.txt", FILE_WRITE);             // Cria ou abre arquivo ROM.txt

  if (myFile) {                                         // Se o arquivo abrir imprime:
    Serial.println("Escrevendo no arquivo ROMS.txt");   // Imprime no monitor serial
    myFile.println("Para executar o AppleSoft BASIC");  // Escreve no Arquivo
    myFile.println("Digite: E000R");                    // Escreve e quebra a linha
    myFile.close();                                     // Fecha o Arquivo após escrever
    Serial.println("Concluído!");                       // Imprime no monitor serial
    Serial.println(" ");
  }
  else {                                                // Se o Arquivo não abrir
    Serial.println("Erro ao abrir o arquivo ROMS.txt"); // Imprime no monitor serial
  }

  myFile = SD.open("ROMS.txt");                         // Abre o Arquivo

  if (myFile) {
    Serial.println("Conteúdo do arquivo ROMS.txt:\n");  // Imprime no monitor serial

    while (myFile.available()) {                        // Exibe o conteúdo do Arquivo
      Serial.write(myFile.read());
    }

    myFile.close();                                     // Fecha o Arquivo após ler
  }
  else {
    Serial.println("Erro ao abrir o arquivo ROMS.txt"); // Imprime no monitor serial
  }

  delay(100);

  // Inicial Serial
  UBRR0H = UBRRH_VALUE;
  UBRR0L = UBRRL_VALUE;

#if USE_2X
  UCSR0A |= _BV(U2X0);
#else
  UCSR0A &= ~(_BV(U2X0));
#endif

  UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); // Dados de 8 bits
  UCSR0B = _BV(RXEN0) | _BV(TXEN0);   // Habilita o RX/TX

  // Liga a CPU 6502
  CPU::power();
}

void loop() {
  CPU::run();
}