%% Copyright (C) 2014 Christian Dietrich <stettberger@dokucode.de>
%% -------------------------------------------------------
%% 
%% This package may be distributed and/or modified under the conditions
%% of the LaTeX Project Public License, either version 1.3c of this
%% license or (at your option) any later version.  The latest version of
%% this license is in
%% 
%%    http://www.latex-project.org/lppl.txt
%% 
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2008/05/04 or later.
%
% This interacts with the avr-gcc and provides a loader for ihex files
%

\def\avr@ihex@parse@line:#1#2#3#4#5#6#7#8#9;{%
  \avr@hex@tobin{#1#2}{\avr@ihex@bytes}%
  \avr@hex@tobin{#3#4#5#6}{\avr@ihex@address}%
  \def\avr@ihex@type{#7#8}%
  \def\avr@ihex@data{#9}%
}

\def\avr@ihex@readop#1#2#3{%
  \def\avr@ihex@readop@helper##1##2##3##4##5\@nnil{%
    \avr@hex@tobin{##3##4##1##2}{#2}%
    \xdef#3{##5}%
  }%
  \edef\@tempa{#1}%
  \expandafter\avr@ihex@readop@helper\@tempa\@nnil%
}


\newcount\avr@ihex@addr
\newcount\avr@ihex@count
\newcount\avr@ihex@instrs

\def\avr@ihex@load#1{%
  \newread\avr@input%
  \avr@ihex@instrs=0\relax%
  \openin\avr@input=#1\relax%
  \@whilesw\unless\ifeof\avr@input\fi{%
    \endlinechar59% 59==;
    \readline\avr@input to \avr@line \relax%
    \endlinechar=-1%
    \expandafter\ifstrequal\expandafter{\avr@line}{;}{}{%
      \expandafter\avr@ihex@parse@line \avr@line%
      \ifdefstring{\avr@ihex@type}{00}{%
        \avr@bin@tocount{\avr@ihex@bytes}{\avr@ihex@count}%
        \avr@bin@tocount{\avr@ihex@address}{\avr@ihex@addr}%
        \divide\avr@ihex@addr by 2\relax%
        \divide\avr@ihex@count by 2\relax%
        \loop \ifnum \avr@ihex@count > 0%
          \avr@ihex@readop{\avr@ihex@data}{\avr@ihex@opcode}{\avr@ihex@data}%
          \avr@code@set{\avr@ihex@opcode}{\the\avr@ihex@addr}%
          %\avr@debug{=\avr@ihex@opcode}%
          \advance \avr@ihex@count by -1\relax%
          \advance \avr@ihex@addr by 1\relax%
        \repeat%
      }{}%
    }%
  }%
  \closein\avr@input%
}


\def\avr@compile#1#2{%
  \ifnum\pdfshellescape=1%
     \immediate\write18{rm #1.hex #1.elf}%
     \immediate\write18{avr-gcc -o #1.elf #1 #2}%
     \immediate\write18{avr-objcopy -O ihex -R .eeprom #1.elf #1.hex}%
     \IfFileExists{#1.hex}{}{%
       \errmessage{avremu: Compilation of Source code failed (#1)}%
     }%
  \else%
     \errmessage{avremu: --shell-escape is disabled; cannot compile}%
  \fi%
}

\newcommand{\avrloadc}[2][-Os -mmcu=atmega8]{%
  \avr@init%
  \avr@compile{#2}{#1}%
  \avr@ihex@load{#2.hex}%
}

\newcommand{\avrcompile}[2][-Os -mmcu=atmega8]{%
  \avr@compile{#2}{#1}%
}

\newcommand{\avrloadihex}[1]{%
  \avr@init%
  \avr@ihex@load{#1}%
}