69 lines
5.0 KiB
TeX
69 lines
5.0 KiB
TeX
\chapter{Introduction}
|
|
This is an attempt to distill what I know about how computers work into some kind of emulator / simulator. I'm curious to see if what I know at the moment is enough to allow me too emulate a general purpose computer. It turns out that it take quite a different skill set compared to writing web or desktop applications. But I realize that, while I understand the concepts that underpin what I do day to day, I don't have an intuitive understanding of the hardware. This has become painfully evident pretty much immediately after I started this project. An ISA should be simple, add, subtract, copy, etc., but then you have to consider the state that the processor will be in after each instruction.
|
|
\section{Registers}
|
|
Thirty-two general purpose registers are available for program code to use however it wishes. The base name for the general purpose registers is \quotes{r} follows by an unpadded number, such as \quotes{r8}. These numbers do not follow a zero-based index scheme, \quotes{r29} is the twenty-ninth register. Using the base name implies full width, a \quotes{word}, when reading or writing from or to the register respectively.
|
|
|
|
In addition to the general purpose registers there is also a base pointer (bp), stack pointer (sp) and an instruction pointer (ip). The base pointer and the stack pointer may be set directly using the \hyperref[sec:mov]{mov} instruction, which allows the programmer to set up a stack frame. The instruction pointer can only be set with a branching operation like \hyperref[sec:jmp]{jmp} or a call to a subroutine with the \hyperref[sec:call]{call} instruction. One final register that can only be indirectly set is the \quotes{flags} register. This register, like the others, is one word wide meaning it can store thirty-two flags. Currently only three flags are present, the Zero, Underflow and Overflow flags. These flags are only affected by arithmetic operations and generally read by branching instructions like \hyperref[sec:jmp]{jmp}.
|
|
|
|
\begin{figure}[h]
|
|
\begin{tikzpicture}
|
|
%\draw[help lines] (-8,-3) grid (8,3);
|
|
\node [draw, fit={(-6, 0) (-1, -0.5)}, label=center:r1] (r1) {};
|
|
\node [draw=none, fit={(-6, -1) (-1, -1.5)}, label=center:...] (ellipsis) {};
|
|
\node [draw, fit={(-6, -2) (-1, -2.5)}, label=center:r32] (r32) {};
|
|
|
|
\node [draw, fit={(-3.0, 1.5) (2.0, 1.0)}, label=center:Flags Register] (flags) {};
|
|
\node [draw, fit={(0, 0) (5, -0.5)}, label=center:Instruction Pointer (ip)] (ip) {};
|
|
\node [draw, fit={(0, -1.0) (5, -1.5)}, label=center:Base Pointer (ip)] (bp) {};
|
|
\node [draw, fit={(0, -2.0) (5, -2.5)}, label=center:Stack Pointer (ip)] (sp) {};
|
|
|
|
\draw (r1);
|
|
\node at (r1.north) [above] {General Purpose};
|
|
\node at (r1.north west) [above] {31};
|
|
\node at (r1.north east) [above] {0};
|
|
|
|
\draw (ellipsis);
|
|
\draw (r32);
|
|
|
|
\draw (flags);
|
|
\node at (flags.north) [above] {Status Register};
|
|
\node at (flags.north west) [above] {31};
|
|
\node at (flags.north east) [above] {0};
|
|
|
|
\draw (ip);
|
|
\node at (ip.north) [above] {Program Status};
|
|
\node at (ip.north west) [above] {31};
|
|
\node at (ip.north east) [above] {0};
|
|
|
|
\draw (bp);
|
|
\draw (sp);
|
|
\end{tikzpicture}
|
|
\caption{Bit Ordering}
|
|
\label{fig:registerbitlayout} % https://www.overleaf.com/learn/latex/Referencing_Figures
|
|
\end{figure}
|
|
|
|
\begin{description}
|
|
\item In summary, the available registers are as follows:
|
|
\item[General Purpose] Thirty-two general purpose registers that are the width of a \textit{word} and numbered \quotes{r1} through \quotes{r32}
|
|
\item[Base Pointer (bp)] Points to the call location when a function call is made
|
|
\item[Stack Pointer (sp)] points to the end of the last argument after a function call is executed, which may be the return address of the stack
|
|
\item[Instruction Pointer (ip)] Points to the next instruction to execute and advanced by the width of an instruction. Set by jump or call instructions to the location specified by the instruction.
|
|
\end{description}
|
|
|
|
\section{Memory}
|
|
The memory layout is quite simple, much like many modern machines it is a linear memory map. The address bus is thirty-two bits wide, the same width of the data bus, meaning at most there is 2\textsuperscript{32} of addressable memory. Like contemporary machines the top of memory starts at address 0x00000000 and grows downward toward 0xFFFFFFFF. By default the memory is mapped as shown in Figure \ref{fig:memorylayout}.
|
|
|
|
\begin{figure}
|
|
\begin{tikzpicture}
|
|
\node [draw, fit={(0,0) (3, 6)}] (memory) {};
|
|
|
|
\draw (memory);
|
|
\node (top) at (memory.north east)[right] {0x00000000};
|
|
\node at (memory.south east)[right] {0xFFFFFFFF};
|
|
|
|
\draw[dashed] ($(memory.north west)-(0,0.5)$) node[left] {0x200000} -- ($(memory.north east)-(0,0.5)$) node[midway, above] {Firmware};
|
|
\draw[dashed] ($(memory.north west)-(0,1.25)$) -- ($(memory.north east)-(0,1.25)$) node[right] {0x275300 (800x600)} node[midway, above] {VRAM};
|
|
\end{tikzpicture}
|
|
\caption{Memory Map \& Layout}
|
|
\label{fig:memorylayout} % https://www.overleaf.com/learn/latex/Referencing_Figures
|
|
\end{figure} |