262 lines
6.8 KiB
TeX
262 lines
6.8 KiB
TeX
\makeatletter
|
|
|
|
%% Bootup
|
|
\def\avr@init{%
|
|
\avr@flag@init%
|
|
\avr@reg@init%
|
|
\avr@pc@init%
|
|
\avr@stack@init%
|
|
}
|
|
|
|
\newcount\avr@accA
|
|
\newcount\avr@accB
|
|
|
|
|
|
\def\avr@dump@totex{%
|
|
SREG:\avr@sreg@get{\@tempa}:='\@tempa' (ITHS VNZC)
|
|
|
|
\ttfamily
|
|
\begin{tabular}{llllllll}
|
|
r0 :\avr@reg@get{00000}{\@tempa}:= '\@tempa' &
|
|
r1 :\avr@reg@get{00001}{\@tempa}:= '\@tempa' &
|
|
r2 :\avr@reg@get{00010}{\@tempa}:= '\@tempa' &
|
|
r3 :\avr@reg@get{00011}{\@tempa}:= '\@tempa' \\
|
|
r4 :\avr@reg@get{00100}{\@tempa}:= '\@tempa' &
|
|
r5 :\avr@reg@get{00101}{\@tempa}:= '\@tempa' &
|
|
r6 :\avr@reg@get{00110}{\@tempa}:= '\@tempa' &
|
|
r7 :\avr@reg@get{00111}{\@tempa}:= '\@tempa' \\
|
|
r8 :\avr@reg@get{01000}{\@tempa}:= '\@tempa' &
|
|
r9 :\avr@reg@get{01001}{\@tempa}:= '\@tempa' &
|
|
r10:\avr@reg@get{01010}{\@tempa}:= '\@tempa' &
|
|
r11:\avr@reg@get{01011}{\@tempa}:= '\@tempa' \\
|
|
r12:\avr@reg@get{01100}{\@tempa}:= '\@tempa' &
|
|
r13:\avr@reg@get{01101}{\@tempa}:= '\@tempa' &
|
|
r14:\avr@reg@get{01110}{\@tempa}:= '\@tempa' &
|
|
r15:\avr@reg@get{01111}{\@tempa}:= '\@tempa' \\
|
|
r16:\avr@reg@get{10000}{\@tempa}:= '\@tempa' &
|
|
r17:\avr@reg@get{10001}{\@tempa}:= '\@tempa' &
|
|
r18:\avr@reg@get{10010}{\@tempa}:= '\@tempa' &
|
|
r19:\avr@reg@get{10011}{\@tempa}:= '\@tempa' \\
|
|
r20:\avr@reg@get{10100}{\@tempa}:= '\@tempa' &
|
|
r21:\avr@reg@get{10101}{\@tempa}:= '\@tempa' &
|
|
r22:\avr@reg@get{10110}{\@tempa}:= '\@tempa' &
|
|
r23:\avr@reg@get{10111}{\@tempa}:= '\@tempa' \\
|
|
r24:\avr@reg@get{11000}{\@tempa}:= '\@tempa' &
|
|
r25:\avr@reg@get{11001}{\@tempa}:= '\@tempa' &
|
|
r26:\avr@reg@get{11010}{\@tempa}:= '\@tempa' &
|
|
r27:\avr@reg@get{11011}{\@tempa}:= '\@tempa' \\
|
|
r28:\avr@reg@get{11100}{\@tempa}:= '\@tempa' &
|
|
r29:\avr@reg@get{11101}{\@tempa}:= '\@tempa' &
|
|
r30:\avr@reg@get{11110}{\@tempa}:= '\@tempa' &
|
|
r31:\avr@reg@get{11111}{\@tempa}:= '\@tempa' \\
|
|
\end{tabular}
|
|
}
|
|
|
|
%% Status Register && Flags
|
|
\def\avr@flag@set#1#2{% Register Name, Value \in 0,1
|
|
\csxdef{avr@flag@#1}{#2}\relax%
|
|
}
|
|
|
|
\def\avr@flag@get#1#2{% Register Name, Target Macro
|
|
\edef#2{\csuse{avr@flag@#1}}%
|
|
}
|
|
|
|
\def\avr@flag@init{%
|
|
\avr@sreg@set{00000000}%
|
|
}
|
|
|
|
\def\avr@sreg@set#1{% Bitstring
|
|
\def\avr@sreg@helper##1##2##3##4##5##6##7##8\@nnil{%
|
|
\avr@flag@set{C}{##8} % Carry
|
|
\avr@flag@set{Z}{##7} % Zero
|
|
\avr@flag@set{N}{##6} % Negative
|
|
\avr@flag@set{V}{##5} % Two's complement overflow indicator
|
|
\avr@flag@set{S}{##4} % N \xor V, For Signed Tests
|
|
\avr@flag@set{H}{##3} % Half Carry Flag
|
|
\avr@flag@set{T}{##2} % Transfer bit
|
|
\avr@flag@set{I}{##1} % Global Interrupt Enable
|
|
}%
|
|
\edef\@tempa{#1}%
|
|
\expandafter \avr@sreg@helper \@tempa \@nnil%
|
|
}
|
|
|
|
\def\avr@sreg@get#1{% Target Macro
|
|
\edef#1{%
|
|
\csuse{avr@flag@I}%
|
|
\csuse{avr@flag@T}%
|
|
\csuse{avr@flag@H}%
|
|
\csuse{avr@flag@S}%
|
|
\csuse{avr@flag@V}%
|
|
\csuse{avr@flag@N}%
|
|
\csuse{avr@flag@Z}%
|
|
\csuse{avr@flag@C}%
|
|
}%
|
|
}
|
|
|
|
\def\avr@flags@update#1{%
|
|
% Negate Flag
|
|
\avr@bin@msb@get{#1}{\@@N}%
|
|
\avr@flag@set N \@@N%
|
|
% Zero Flag
|
|
\avr@bin@tocount{#1}{\avr@count@tmpa}%
|
|
\ifnum \avr@count@tmpa = 0%
|
|
\avr@flag@set Z 1%
|
|
\else%
|
|
\avr@flag@set Z 0%
|
|
\fi%
|
|
% Signed Flag
|
|
\avr@flag@get V \@@V%
|
|
\edef\@@tmp{\avr@bit@xor \@@N \@@V}%
|
|
\avr@flag@set S \@@tmp%
|
|
}
|
|
|
|
%% Registers
|
|
\def\avr@reg@set#1#2{% Bitstring, Register Bitstring
|
|
\csxdef{avr@reg@#2}{#1}%
|
|
}
|
|
|
|
\def\avr@reg@get#1#2{% Register Bitstring, Target Macro
|
|
\edef#2{\csuse{avr@reg@#1}}%
|
|
}
|
|
|
|
\def\avr@reg@init{%
|
|
\avr@reg@set{\avr@zeroes}{00000}%
|
|
\avr@reg@set{\avr@zeroes}{00001}%
|
|
\avr@reg@set{\avr@zeroes}{00010}%
|
|
\avr@reg@set{\avr@zeroes}{00011}%
|
|
\avr@reg@set{\avr@zeroes}{00100}%
|
|
\avr@reg@set{\avr@zeroes}{00101}%
|
|
\avr@reg@set{\avr@zeroes}{00110}%
|
|
\avr@reg@set{\avr@zeroes}{00111}%
|
|
\avr@reg@set{\avr@zeroes}{01000}%
|
|
\avr@reg@set{\avr@zeroes}{01001}%
|
|
\avr@reg@set{\avr@zeroes}{01010}%
|
|
\avr@reg@set{\avr@zeroes}{01011}%
|
|
\avr@reg@set{\avr@zeroes}{01100}%
|
|
\avr@reg@set{\avr@zeroes}{01101}%
|
|
\avr@reg@set{\avr@zeroes}{01110}%
|
|
\avr@reg@set{\avr@zeroes}{01111}%
|
|
\avr@reg@set{\avr@zeroes}{10000}%
|
|
\avr@reg@set{\avr@zeroes}{10001}%
|
|
\avr@reg@set{\avr@zeroes}{10010}%
|
|
\avr@reg@set{\avr@zeroes}{10011}%
|
|
\avr@reg@set{\avr@zeroes}{10100}%
|
|
\avr@reg@set{\avr@zeroes}{10101}%
|
|
\avr@reg@set{\avr@zeroes}{10110}%
|
|
\avr@reg@set{\avr@zeroes}{10111}%
|
|
\avr@reg@set{\avr@zeroes}{11000}%
|
|
\avr@reg@set{\avr@zeroes}{11001}%
|
|
\avr@reg@set{\avr@zeroes}{11010}%
|
|
\avr@reg@set{\avr@zeroes}{11011}%
|
|
\avr@reg@set{\avr@zeroes}{11100}%
|
|
\avr@reg@set{\avr@zeroes}{11101}%
|
|
\avr@reg@set{\avr@zeroes}{11110}%
|
|
\avr@reg@set{\avr@zeroes}{11111}%
|
|
}
|
|
|
|
\csdef{avr@r0}{00000}
|
|
\csdef{avr@r1}{00001}
|
|
\csdef{avr@r2}{00010}
|
|
\csdef{avr@r3}{00011}
|
|
\csdef{avr@r4}{00100}
|
|
\csdef{avr@r5}{00101}
|
|
\csdef{avr@r6}{00110}
|
|
\csdef{avr@r7}{00111}
|
|
\csdef{avr@r8}{01000}
|
|
\csdef{avr@r9}{01001}
|
|
\csdef{avr@r10}{01010}
|
|
\csdef{avr@r11}{01011}
|
|
\csdef{avr@r12}{01100}
|
|
\csdef{avr@r13}{01101}
|
|
\csdef{avr@r14}{01110}
|
|
\csdef{avr@r15}{01111}
|
|
\csdef{avr@r16}{10000}
|
|
\csdef{avr@r17}{10001}
|
|
\csdef{avr@r18}{10010}
|
|
\csdef{avr@r19}{10011}
|
|
\csdef{avr@r20}{10100}
|
|
\csdef{avr@r21}{10101}
|
|
\csdef{avr@r22}{10110}
|
|
\csdef{avr@r23}{10111}
|
|
\csdef{avr@r24}{11000}
|
|
\csdef{avr@r25}{11001}
|
|
\csdef{avr@r26}{11010}
|
|
\csdef{avr@r27}{11011}
|
|
\csdef{avr@r28}{11100}
|
|
\csdef{avr@r29}{11101}
|
|
\csdef{avr@r30}{11110}
|
|
\csdef{avr@r31}{11111}
|
|
|
|
%% Code
|
|
\newcount\avr@pc
|
|
\def\avr@pc@init{%
|
|
\avr@pc=0%
|
|
}
|
|
|
|
\def\avr@pc@inc{% Increment by one
|
|
\advance \avr@pc by 1\relax%
|
|
\avr@count@overflow{\avr@pc}%
|
|
}
|
|
|
|
\def\avr@pc@add#1{% Increment by N
|
|
\advance \avr@pc by #1\relax%
|
|
\avr@count@overflow{\avr@pc}%
|
|
}
|
|
|
|
|
|
\def\avr@code@get#1{% Result Macro
|
|
\edef#1{\csuse{avr@code@\the\avr@pc}}%
|
|
}
|
|
|
|
\def\avr@code@set#1#2{% OpString (16 Bit), Number
|
|
\csxdef{avr@code@#2}{#1}%
|
|
}
|
|
%% RAM
|
|
\newcount\avr@stackptr
|
|
\def\avr@stack@init{
|
|
\avr@stackptr=0%
|
|
}
|
|
|
|
\def\avr@stack@SPL@get#1{%
|
|
\avr@count@tobin@w{\avr@stackptr}{\@@stack}%
|
|
\avr@bin@word@low{\@@stack}{#1}%
|
|
}
|
|
\def\avr@stack@SPH@get#1{%
|
|
\avr@count@tobin@w{\avr@stackptr}{\@@stack}%
|
|
\avr@bin@word@high{\@@stack}{#1}%
|
|
}
|
|
|
|
\def\avr@stack@SPL@set#1{%
|
|
\avr@count@tobin@w{\avr@stackptr}{\@@stack}%
|
|
\avr@bin@word@high{\@@stack}{\@@high}%
|
|
\avr@bin@tocount{\@@high #1}{\avr@stackptr}%
|
|
\avr@debug{ SP=\the\avr@stackptr}
|
|
}
|
|
|
|
\def\avr@stack@SPH@set#1{%
|
|
\avr@count@tobin@w{\avr@stackptr}{\@@stack}%
|
|
\avr@bin@word@low{\@@stack}{\@@low}%
|
|
\avr@bin@tocount{#1\@@low}{\avr@stackptr}%
|
|
\avr@debug{ SP=\the\avr@stackptr}
|
|
}
|
|
|
|
\def\avr@mem@set#1#2{% Bitstring, Address (as number)
|
|
\avr@debug{ MEM W *#2=#1}%
|
|
\csxdef{avr@mem@#2}{#1}%
|
|
}
|
|
|
|
\def\avr@mem@get#1#2{% Address (as number), Target Macro
|
|
\ifcsdef{avr@mem@#1}{%
|
|
\edef#2{\csuse{avr@mem@#1}}%
|
|
}{%
|
|
\edef#2{00000000}%
|
|
}%
|
|
\avr@debug{ MEM R *#1==#2}%
|
|
}
|
|
|
|
|
|
%%% Local Variables:
|
|
%%% mode: latex
|
|
%%% TeX-master: "avr.tex"
|
|
%%% End:
|