#pragma GCC optimize ("-O0")
#include "ArduinoTrace.h"

volatile uint8_t a[3] = {2, 3, 4}, b = 6, i = 1, *p; //5 bytes totales para almacenar las 3 variables

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("INICIO");

  i = 2;
  b=0;

  //------------- Proceso en alto nivel -------------------

  //b=a[i-2];
  // asm volatile(
  //   "lds r18,i \n"
  //   "subi r18,2 \n" //r18 <-- (i)-2
  //   "ldi r19,0 \n"  //r19:r18 <-- (i) - 2 en 16 bits
  //   "subi r18, lo8(-(a)) \n"
  //   "sbci r19,hi8(-(a)) \n" //r19:r18 <-- dir de a[i-2]
  //   "movw Zl,  r18 \n" //Z <-- dir de a[i-2]
  //   "ld r18,Z \n" //r18 <-- (a[i-2])
  //   "sts b,r18"
  // );
  
  //Ejemplo 2
  //p=&a[i];
  asm volatile(
    "lds r18,i \n"
    "ldi r19,0 \n" // r19:r18 <-- (i) en 16 bits
    "subi r18, lo8(-(a)) \n"
    "sbci r19, hi8(-(a)) \n" //r19:r18 <-- dir de a[i]
    "sts p,r18 \n"
    "sts p+1,19 \n" // Variable p (2 bytes) <-- dir de a[i]
  );
  //b=*(p-2);
  asm volatile(
    "lds r18, p \n"
    "lds r19, p+1 \n" // r19:r18 dir de a[i]
    "subi r18,lo8(2)\n"
    "sbci r19,hi8(2) \n"  //r19:r18 <-- dir de a[i-2]
    "movw Zl,r18 \n" // Z <-- dir de a[i-2]
    "ld r18, Z \n"   //r18 <-- (a[i-2])
    "sts b,r18"
  );


  //------------------------------------------------------

  //DUMP(a);
  DUMP(b);
  DUMP(i);
}
void loop() {

}

void addressInfo()
{
  Serial.println("DIRECCIONES de VARIABLES (HEX):");
  Serial.print("a: ");
  Serial.println((int)&a,HEX);  //direccion de a
  Serial.print("b: ");
  Serial.println((int)&b,HEX);  //direccion de b
  Serial.print("i: ");
  Serial.println((int)&i,HEX);  //direccion de c
}