jb302@37: #LyX 2.0 created this file. For more info see http://www.lyx.org/ jb302@37: \lyxformat 413 jb302@37: \begin_document jb302@37: \begin_header jb302@37: \textclass article jb302@37: \begin_preamble jb302@37: \usepackage[export]{adjustbox}% http://ctan.org/pkg/adjustbox jb302@37: % Resize figures that are too wide for the page. jb302@37: \let\oldincludegraphics\includegraphics jb302@37: \renewcommand\includegraphics[2][]{% jb302@37: \oldincludegraphics[#1,max width=\linewidth,max height=\textheight]{#2} jb302@37: } jb302@37: \end_preamble jb302@37: \use_default_options true jb302@37: \maintain_unincluded_children false jb302@37: \language english jb302@37: \language_package default jb302@37: \inputencoding auto jb302@37: \fontencoding global jb302@37: \font_roman default jb302@37: \font_sans default jb302@37: \font_typewriter default jb302@37: \font_default_family default jb302@37: \use_non_tex_fonts false jb302@37: \font_sc false jb302@37: \font_osf false jb302@37: \font_sf_scale 100 jb302@37: \font_tt_scale 100 jb302@37: jb302@37: \graphics default jb302@37: \default_output_format default jb302@37: \output_sync 0 jb302@37: \bibtex_command default jb302@37: \index_command default jb302@37: \paperfontsize default jb302@37: \spacing single jb302@37: \use_hyperref false jb302@37: \papersize default jb302@37: \use_geometry false jb302@37: \use_amsmath 1 jb302@37: \use_esint 1 jb302@37: \use_mhchem 1 jb302@37: \use_mathdots 1 jb302@37: \cite_engine basic jb302@37: \use_bibtopic false jb302@37: \use_indices false jb302@37: \paperorientation portrait jb302@37: \suppress_date false jb302@37: \use_refstyle 1 jb302@37: \index Index jb302@37: \shortcut idx jb302@37: \color #008000 jb302@37: \end_index jb302@37: \secnumdepth 3 jb302@37: \tocdepth 3 jb302@37: \paragraph_separation indent jb302@37: \paragraph_indentation default jb302@37: \quotes_language english jb302@37: \papercolumns 1 jb302@37: \papersides 1 jb302@37: \paperpagestyle default jb302@37: \tracking_changes false jb302@37: \output_changes false jb302@37: \html_math_output 0 jb302@37: \html_css_as_file 0 jb302@37: \html_be_strict false jb302@37: \end_header jb302@37: jb302@37: \begin_body jb302@37: jb302@37: \begin_layout Part jb302@37: The Emulator jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Section jb302@37: Emulator Design jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Graphics jb302@37: filename /home/jmz/qm/ede/docs/img/emu/ELB816_system.svg jb302@37: display false jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: Above is a block diagram of a micro-controller with the ELB816 micro-processor jb302@37: at it's core. jb302@37: This is taken from the original ELB816 specification. jb302@37: Implementing a system similar to this as a piece of software is the goal jb302@37: of this section of the project. jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Subsection jb302@37: Memory and Registers jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Graphics jb302@37: filename /home/jmz/qm/ede/docs/img/emu/memory.svg jb302@37: display false jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: The micro-controller is based on a Von Neumann architecture and has: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Itemize jb302@37: A single block of up to 64k byte addressable memory for storing both data jb302@37: and code. jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Itemize jb302@37: Two banks of four 8-bit general purpose registers (R0 to R3). jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Itemize jb302@37: Four 16-bit content specific (PC, SP, DPTR and TMPA) jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Itemize jb302@37: Three 8-bit content specific registers (A, flags and IR) jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: The general purpose 8-bit registers and the 16-bit registers can exist as jb302@37: a single sixteen byte block of memory spaces with the following encoding: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Tabular jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: MSB jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: MSB jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Description jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: LSB jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: User Accessible? jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 000 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R0 bank 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R0 bank 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: General Purpose jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 001 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R1 bank 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R1 bank 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: General Purpose jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 010 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R2 bank 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R2 bank 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: General Purpose jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 011 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R3 bank 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: R3 bank 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: General Purpose jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 100 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: DPH jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: DPL jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Data Pointer jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 101 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: SPH jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: SPL jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Stack Pointer jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Yes jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 110 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: PCH jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: PCL jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Program Counter jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: No jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 111 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: TPH jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: TPL jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Temp Address Register jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: No jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Newpage pagebreak jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: The 8-bit flag register can exist as a single byte with the following format: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Tabular jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Bit jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Flag jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Description jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: BS jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: User Accessible: Select register bank jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: IE jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: User Accessible: Enable Interrupts when 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 2 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: OV jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set to 1 when result of arithmetic operation has even parity jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 3 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: S jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set to 1 when result of arithmetic operation is negative jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 4 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: P jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set to 1 when result of arithmetic operation has even parity jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 5 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: AC jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set to 1 when result of arithmetic operation generates a carry or borrow jb302@37: from bit 3 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 6 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Z jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set to 1 when result of arithmetic operation is Zero jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 7 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: C jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: User Accessible: Set to 1 when result of arithmetic operation generates jb302@37: a carry or borrow from bit 7. jb302@37: Used in rotate through carry operations jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: There is also an 8-bit accumulator register for storing the result of various jb302@37: operations and an 8-bit instruction register for the storing the instruction jb302@37: currently being executed. jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Subsection jb302@37: Control and Execution jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: The emulator needs to be controlled externally. jb302@37: This could be via a serial or a file buffer depending on the platform. jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Graphics jb302@37: filename /home/jmz/qm/ede/docs/img/emu/controller.svg jb302@37: display false jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@38: \begin_inset Newpage pagebreak jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@37: Below is a control protocol which allows and control of the emulators memory jb302@37: and execution. jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset ERT jb302@37: status open jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: jb302@37: jb302@37: \backslash jb302@37: bigskip jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Standard jb302@37: \begin_inset Tabular jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Function jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Arguments jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: CMD byte jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Length jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Description jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: step jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x00 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Execute instruction at PC jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: run jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x01 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Execute instructions from PC until a break point is reached jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: set register jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: register address, value jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x02 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 3 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set a register jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: get register jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: register address jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x03 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 2 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Get the value of a register jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: set flag jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: flag bit, 0 or 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x04 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 3 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Turn a flag bit on or off. jb302@37: LSB = 0, MSB =7 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: get flag jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: flag bit jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x05 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 2 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Get the value of a flag bit jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: write memory block jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: address high, address low, length high, length low, [byte array] jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x06 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 6+ jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set a block of memory of arbitrary length with the bytes in the byte array jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: read memory block jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: address high, address low, length high, length low jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x07 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 5 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Read a block of memory of arbitrary length jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: get A jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x08 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Get value of A jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: get flags jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x09 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Get value of flags jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: get IR jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@38: 0x0A jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Get Value of IR jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: run for length jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: length high, length low jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x0B jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 3 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Run for length number of instruction jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: free run jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: - jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x0C jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 1 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Run forever - Bypass controller jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: set break point jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: break point index, address high, address low jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 0x0D jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: 4 jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \begin_inset Text jb302@37: jb302@37: \begin_layout Plain Layout jb302@37: Set 1 of 8 possible break points jb302@37: \end_layout jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: jb302@37: jb302@37: \end_inset jb302@37: jb302@37: jb302@37: \end_layout jb302@37: jb302@38: \begin_layout Standard jb302@38: \begin_inset ERT jb302@38: status open jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: jb302@38: \backslash jb302@38: bigskip jb302@37: \end_layout jb302@37: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset Newpage pagebreak jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: Here are pseudo-code representations of the execution control functions. jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset ERT jb302@38: status open jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: jb302@38: \backslash jb302@38: bigskip jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset listings jb302@38: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},tabsize=4" jb302@38: inline false jb302@38: status open jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: step ( ) jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@39: get PC jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: IR = byte in memory at PC jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: decode and execute instruction jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@39: end jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: run ( ) jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@41: while PC is not a break point: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: step( ) jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@41: end jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: run for length ( length ) jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: counter = 0 jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@39: while counter != length: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: step( ) jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: free run ( ): jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: loop forever: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: step( ) jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset Newpage pagebreak jb302@38: \end_inset jb302@38: jb302@38: jb302@37: \end_layout jb302@37: jb302@37: \begin_layout Section jb302@37: Emulator Implementation jb302@37: \end_layout jb302@37: jb302@38: \begin_layout Standard jb302@38: The Emulator is written in pure C89 to ensure as much cross compiler compatibili jb302@38: ty as possible. jb302@38: It source code consists of the following files: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset ERT jb302@38: status open jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: jb302@38: jb302@38: \backslash jb302@38: bigskip jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@38: \begin_layout Standard jb302@38: \begin_inset Tabular jb302@38: jb302@38: jb302@38: jb302@39: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: File jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Description jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: main.c jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Initializes the emulator at boot and controls execution jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: iset.h jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Declares a function for each mnemonic in the instruction set. jb302@39: Declares a 256 byte function pointer table jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: iset.c jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Contains a function for each mnemonic in the instruction set jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: mem.h jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Declares variables for the various memory structures. jb302@38: Declares memory access function definitions jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: mem.c jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \begin_inset Text jb302@38: jb302@38: \begin_layout Plain Layout jb302@38: Contains memory access functions jb302@38: \end_layout jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: jb302@38: jb302@38: \end_inset jb302@38: jb302@38: jb302@38: \end_layout jb302@38: jb302@39: \begin_layout Standard jb302@39: \begin_inset ERT jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: jb302@39: \backslash jb302@39: bigskip jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Subsection jb302@39: main.c jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: In this file the 256 byte instruction table is filled with pointers to the jb302@39: functions in iset.c. jb302@39: This file also contains the control interface function and execution control jb302@39: functions. jb302@39: None of these functions take any arguments or return any data. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset ERT jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: jb302@39: \backslash jb302@39: bigskip jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: Below is a list of the functions that appear in this file. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Tabular jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Function jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Description jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: snd jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Puts a character into the serial or file output buffer jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: rcv jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Get a character from the serial or file input buffer jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: step jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Execute the instruction pointed to by PC jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: run jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Execute instructions until a break point is reached jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: controller jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Get character from input buffer and deal with accordingly jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: main jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Make sure free run isn't enabled at boot, call controller function forever jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Newpage pagebreak jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: Below is the format of the instruction pointer table initialized in this jb302@39: file. jb302@39: Each item in the table is a pointer to a function. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset ERT jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: jb302@39: \backslash jb302@39: bigskip jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: According to the program Cdecl, in jb302@39: \begin_inset Quotes eld jb302@39: \end_inset jb302@39: jb302@39: human language jb302@39: \begin_inset Quotes erd jb302@39: \end_inset jb302@39: jb302@39: , it's declaration is: jb302@39: \begin_inset Quotes eld jb302@39: \end_inset jb302@39: jb302@39: declare ops as array 256 of pointer to function (void) returning void jb302@39: \begin_inset Quotes erd jb302@39: \end_inset jb302@39: jb302@39: . jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset ERT jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: jb302@39: \backslash jb302@39: bigskip jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: The number of the pointers position in the table is the opcode for the instructi jb302@39: on that the function being pointed to deals with. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@39: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},tabsize=4" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: void (*ops[256])(void) = { jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: SET, CLR, SET, CLR, SET, CLR, CPL, CPL, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: RL, RLC, RR, RRC, INC, DEC, INC, DEC, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: POP, POP, POP, POP, POP, POP, POP, POP, jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: MUL, DIV, DA, NOP, IN, OUT, INT, HLT jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: }; jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Newpage pagebreak jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Subsection jb302@39: iset.c/h jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: For every mnemonic in the ELB816 instruction set there is a function in jb302@39: these files. jb302@39: These are the functions that are pointed to in the instruction table that jb302@39: is filled in main.c. jb302@39: The functions behave according to their description in the ELB816 specification. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Subsection jb302@39: mem.c/h jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: In mem.h the memory structure of the emulator is defined in accordance with jb302@39: how it was described in the previous section. jb302@39: mem.c contains the following functions to facilitate access to this memory. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset ERT jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: jb302@39: \backslash jb302@39: bigskip jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Tabular jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Function jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Arguments jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Returns jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Description jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: get_flag jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: flag jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 1 byte jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Get the value of a flag (can be 0 or 1) jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: set_flag jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: flag, on jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Set a flag to 0 if on == 0, else set flag to 1 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: set_zp jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: value jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Set zero and parity flags based on value jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: get_wide jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 2 bytes jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Get the value of a 16-bit register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: set_wide jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: register, value jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Set the value of a 16-bit register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: inc_pc jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: n jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Increment the PC by n jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: fetch jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 1 byte jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: return the byte in memory at PC, increment PC jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: fetch_wide jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 2 bytes jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: return the 2 bytes in memory at PC, increment PC by 2 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: get_reg jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 1 byte jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Get the value of an 8-bit register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: set_reg jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: register, value jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: - jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Set the value of an 8-bit register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Newpage pagebreak jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: The various register access functions use different register encoding schemes. jb302@39: These are in the tables below. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Itemize jb302@39: get_wide/set_wide jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Tabular jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Encoding jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: DPTR jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 00 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: SP jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 01 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: PC jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 10 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: TMPA jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 11 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Itemize jb302@39: get_reg/set_reg - These values correspond to the way registers are encoded jb302@39: into the last 3-bits of many of the ELB816 instructions. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Tabular jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Register jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: Encoding jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: R0 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 000 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: R1 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 001 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: R2 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 010 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: R3 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 011 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: DPH jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 100 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: DPL jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 101 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: SPH jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 110 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: SPL jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \begin_inset Text jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: 111 jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Section jb302@39: Porting to Intel MCS-51 jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: In order make this code compile for an 8052 using Keil C51 a few changes jb302@39: to were needed. jb302@39: These are detailed below. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Subsection jb302@39: main.c jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: In the PC version of the emulator, the function table is declared as: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: FUNCTION_TABLE const iset jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: Since the instruction set is 256 bytes long and the 8052 only has 256 bytes jb302@39: of internal RAM, this data structure must be redeclared to exist in code jb302@39: memory space. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: FUNCTION_TABLE const code iset jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Newpage pagebreak jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: The PC version of the emulator uses a file buffer to communicate with the jb302@39: debugger. jb302@39: On the 8052 communication uses a serial interface. jb302@39: Because of this the snd() functions differ. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: On the PC jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: snd(BYTE c) { jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: fp = fopen("out", "a"); jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: fputc(c, fp); jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: fclose(fp); jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: } jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: Becomes on the 8052, simply: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: snd(BYTE c) { jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: putchar(c); jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: } jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: The 8052's serial point also needs to be configures at the start of main jb302@39: execution like this: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@41: SCON = 0x50; * SCON - mode 1, 8-bit UART, enable rcvr jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: TMOD |= 0x20; * TMOD - timer 1, mode 2, 8-bit reload jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: TH1 = 0xE8; * TH1 - reload value for 1200 baud@12MHz jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: TR1 = 1; * TR1 - timer 1 run jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: TI = 1; * TI - set TI to send first char of UART jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Subsection jb302@39: mem.h jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: The 8052 development board available during this project had 32K of external jb302@39: RAM available. jb302@39: This meant the size of the emulators Von Neumann memory space had to be jb302@39: halved and declared to exist in external data memory. jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: On the PC: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: BYTE mem[0x10000]; jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: On the 8052 jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset listings jb302@41: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,keywordstyle={\color{blue}},language=C" jb302@39: inline false jb302@39: status open jb302@39: jb302@39: \begin_layout Plain Layout jb302@39: jb302@39: BYTE xdata mem[0x8000]; jb302@39: \end_layout jb302@39: jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@39: \begin_layout Standard jb302@39: \begin_inset Newpage pagebreak jb302@39: \end_inset jb302@39: jb302@39: jb302@39: \end_layout jb302@39: jb302@37: \begin_layout Section jb302@37: Emulator Testing jb302@37: \end_layout jb302@37: jb302@41: \begin_layout Standard jb302@41: The assemblers memory structures and access functions were tested by using jb302@41: the access function to set the memory structures to know values, and then jb302@41: request the values back and write them to a file. jb302@41: The file was then inspected by hand. jb302@41: The test files and results can be found in the Supporting Material. jb302@42: jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Standard jb302@41: \begin_inset ERT jb302@41: status open jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: jb302@41: \backslash jb302@41: bigskip jb302@41: \end_layout jb302@41: jb302@41: \end_inset jb302@41: jb302@41: jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Standard jb302@42: The emulator could be more rigorously tested in conjunction with the debugger jb302@42: and assembler. jb302@41: Below is a pseudo-code representation of an automated test procedure that jb302@41: could be implemented with the debug class in python. jb302@41: \end_layout jb302@41: jb302@41: \begin_layout Standard jb302@41: \begin_inset ERT jb302@41: status open jb302@41: jb302@41: \begin_layout Plain Layout jb302@41: jb302@41: jb302@41: \backslash jb302@41: bigskip jb302@41: \end_layout jb302@41: jb302@41: \end_inset jb302@41: jb302@41: jb302@41: \end_layout jb302@41: jb302@42: \begin_layout Standard jb302@42: \begin_inset listings jb302@42: lstparams "basicstyle={\ttfamily},frame=tb,framexbottommargin=1em,framextopmargin=1em,language=C" jb302@42: inline false jb302@42: status open jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: for instruction in instruction set: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: reset emulator memory state jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: assemble instruction jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: write instruction to memory jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: execute instruction jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: get all registers jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: get all flags jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: get any affected memory cells jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: if and only if expected register changes occoured: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: register test passed jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: if and only if expected flag changes occoured: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: flag test passed jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: if expected memory modification occoured: jb302@42: \end_layout jb302@42: jb302@42: \begin_layout Plain Layout jb302@42: jb302@42: memory test passed jb302@42: \end_layout jb302@42: jb302@42: \end_inset jb302@42: jb302@42: jb302@42: \end_layout jb302@42: jb302@37: \end_body jb302@37: \end_document