%% 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.
%%
%% The IO Subsystem
%%

\newcommand{\avrUDR}{%
  \avr@UDR%
}
\newcommand{\avrUDRclear}{%
  \def\avr@UDR{}%
}

\def\avr@io@init{%
  \def\avr@UDR{}%
}

% OUT
\def\avr@instr@OUT#1#2#3{% A, R
  \def\@@A{#2}%
   \avr@bin@msb@del{\@@A}{\@@A}{\@@a}%
   \avr@bin@msb@del{\@@A}{\@@A}{\@@b}%
   \avr@code@set{10111\@@a\@@b#3\@@A}{#1}%
}

\csdef{avr@instr@10111}#1#2#3#4#5#6#7#8\@nnil{%
  \def\@@IOA{#1#2#8}%
  \avr@reg@get{#3#4#5#6#7}{\avr@Rr}%
  \avr@debug{OUT \@@IOA <- \avr@Rr}%
  \avr@io@set{\avr@Rr}{\@@IOA}%
  \avr@pc@inc%
}

% IN
\def\avr@instr@IN#1#2#3{% A, R
  \def\@@A{#2}%
  \avr@bin@msb@del{\@@A}{\@@A}{\@@a}%
  \avr@bin@msb@del{\@@A}{\@@A}{\@@b}%
  \avr@code@set{10110\@@a\@@b#3\@@A}{#1}%
}

\csdef{avr@instr@10110}#1#2#3#4#5#6#7#8\@nnil{%
  \avr@debug{IN #1#2#8 -> #3#4#5#6#7}%
  \edef\@@IOA{#1#2#8}%
  \avr@io@get{\@@IOA}{\avr@Rr}%
  \avr@reg@set{\avr@Rr}{#3#4#5#6#7}%
  \avr@pc@inc%
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% IO Handlers
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% #1=Value, #2=Addr
\def\avr@io@set#1#2{%
  \ifcsdef{avr@io@#2@set}{%
    \csuse{avr@io@#2@set}{#1}%
  }{%
    \avr@io@set@default{#1}{#2}%
  }%
}
% #1=Addr, #2=\result
\def\avr@io@get#1#2{%
  \avr@debug{  IO R #1}%
  \ifcsdef{avr@io@#1@get}{%
    \csuse{avr@io@#1@get}{#2}%
  }{%
    \avr@io@get@default{#1}{#2}%
  }%
}

\def\avr@io@set@default#1#2{%
  \avr@error{IO Port #2 is not defined (OUT <-#1)}%
}

\def\avr@io@get@default#1#2{%
  \avr@error{IO Port #1 is not defined (IN ->#2)}%
}

\csdef{avr@io@111111@set}#1{%
  \avr@debug{  SREG=#1}%
  \avr@sreg@set{#1}%
}
\csdef{avr@io@111111@get}#1{\avr@sreg@get{#1}}

% Stackpointer IO Ports
\csdef{avr@io@111110@set}#1{\avr@stack@SPH@set{#1}}
\csdef{avr@io@111101@set}#1{\avr@stack@SPL@set{#1}}
\csdef{avr@io@111110@get}#1{\avr@stack@SPH@get{#1}}
\csdef{avr@io@111101@get}#1{\avr@stack@SPL@get{#1}}

\csdef{avr@io@001100@set}#1{%
  \avr@bin@tocount{#1}{\avr@count@tmpa}%
  \avr@ascii{\the\avr@count@tmpa}{\@@char}%
  \avr@debug{UDR: \the\avr@count@tmpa}%
  \xdef\avr@UDR{\avr@UDR \@@char}%
}

% SPDR
\csdef{avr@io@001111@set}#1{%
  \csdef{avr@io@001111}{#1}%
}

\csdef{avr@io@001111@get}#1{%
  \xdef#1{\csuse{avr@io@001111}}%
}


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "avr.tex"
%%% End: 
