\documentclass{book}
\usepackage{tikz}

\title{Unnamed Machine}
\author{A Very Terrible 16-bit Machine}

\begin{document}
	\maketitle
	\tableofcontents
	\chapter{Overview}
	\section{Introduction}
	This is a very poorly thought out 16-bit machine, but you've got to start somewhere. Currently debating between a CPU status register, 80x86 style, or just placing arithmetic results into a predetermined register.
	\section{Registers}
	The following are the general purpose registers that can be used.
	\begin{itemize}
		\item[] R1
		\item[] ...
		\item[] R8
	\end{itemize}
	\section{Memory Model}
	Memory will be implicitly mapped I/O. The bottom 3201 bytes of memory will be reserved for the keyboard input and graphics.
	A single byte is reserved for the keyboard's input. The current key will be stored in byte 0xF37E, with the most significant bit being a flag indicating that the keyboard 
	is ready to be read from. This means that the character encoding is actually 7 bits.
	Video memory starts at 0xF37F (62335 decimal), and every byte represents an ASCII character in monochrome.
	\begin{figure}
		\centering
		\begin{tikzpicture}
			\fill[gray!5] (0,0)rectangle(5,10);
			%\draw (0,10) .. controls (-2,6) and (-2,4) .. (0,1);
			%\draw (0,10) arc (0:180:3cm);
			\draw (0,10) -- (5,10);
			\draw (0,1) --  node[above] {Video 0xF37F} (5,1);
			\draw (0,0) -- (5,0);
			\node[label=right:Top 0x0000] at (5,10) {};
			\node[label=right:Bottom 0xFFFF] at (5,0) {};
		\end{tikzpicture}
		\caption{Memory Layout}
	\end{figure}
	\chapter{ISA}
	\section{Instruction Encoding}
	Instructions are fixed to one byte in length. For instructions that can take a register as their first or second operand the 3 least significant bits are set 
	to indicate the register file to use. So an instruction with format XXXX X000 will use Register 1 and so forth all the way to the pattern XXXX X111, which will be Register 8.
	In instances where the second operand may be one of three options bits 4 and 5 are set as shown below:\\\\
	\begin{tabular}{ c c }
		\hline
		Bit Pattern & Type \\
		\hline
		XXX0 0XXX & Register \\
		XXX0 1XXX & Constant \\
		XXX1 0XXX & Address \\
		\hline
	\end{tabular}
	\section{COPY}
	\begin{tabular}{ c c c c }
		\hline
		Opcode & Mnemonic & Operand 1 & Operand 2 \\
		\hline\hline
		0x20 & COPY & Register & Immediate 16 / Address, Register \\
		0xA0 & COPY & Address & Immediate 16 / Address, Register \\
		\hline
	\end{tabular}\\[6pt]
	Copies 2 bytes of data from either a memory address, a runtime constant or a CPU register into either another CPU register or a memory location.
	\section{CMP}
	\begin{tabular}{ c c c c }
		\hline
		Opcode & Mnemonic & Operand 1 & Operand 2 \\
		\hline\hline
		0x80 & CMP & Register & Register, Immediate 16 / Address \\
		\hline
	\end{tabular}\\[6pt]
	Compares two values and sets a CPU status flag (maybe...).
	\section{ADD}
		\begin{tabular}{ c c c c }
		\hline
		Opcode & Mnemonic & Operand 1 & Operand 2 \\
		\hline\hline
		0x40 & ADD & Register & Register, Immediate 16 \\
		\hline
	\end{tabular}\\[6pt]
	Performs addition on a register with a value from another (or the same) register or a runtime constant.
	\section{SUB}
	\begin{tabular}{ c c c c }
		\hline
		Opcode & Mnemonic & Operand 1 & Operand 2 \\
		\hline\hline
		0x60 & SUB & Register & Register, Immediate 16 \\
		\hline
	\end{tabular}\\[6pt]
	Performs subtraction on a register with a value from another (or the same) register or a runtime constant.

\end{document}
