#LyX 1.4.3 created this file. For more info see http://www.lyx.org/
\lyxformat 245
\begin_document
\begin_header
\textclass book
\language english
\inputencoding default
\fontscheme times
\graphics default
\paperfontsize 10
\spacing single
\papersize default
\use_geometry false
\use_amsmath 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\leftmargin -0.5cm
\topmargin 0.5cm
\rightmargin 0.5cm
\bottommargin 0.5cm
\secnumdepth 2
\tocdepth 2
\paragraph_separation skip
\defskip smallskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes true
\end_header
\begin_body
\begin_layout Title
gpsim
\end_layout
\begin_layout Date
$Date: 2006-11-09 08:27:47 -0800 (Thu, 09 Nov 2006) $
\end_layout
\begin_layout Standard
\begin_inset LatexCommand \tableofcontents{}
\end_inset
\end_layout
\begin_layout Chapter*
Introduction
\end_layout
\begin_layout Standard
gpsim is a full-featured software simulator for Microchip PIC microcontrollers
distributed under the GNU General Public License
\begin_inset Note Note
status collapsed
\begin_layout Standard
scott2 Wed Sep 30 13:25:58 1998
\end_layout
\end_inset
(see the COPYING section).
\end_layout
\begin_layout Standard
gpsim has been designed to be as accurate as possible.
Accuracy includes the entire PIC - from the core to the I/O pins and including
ALL of the internal peripherals.
Thus it's possible to create stimuli and tie them to the I/O pins and test
the PIC the same way you would in the real world.
\end_layout
\begin_layout Standard
gpsim has been designed to be as fast as possible.
Real time simulation speeds of 20Mhz pics are possible.
\end_layout
\begin_layout Standard
gpsim can be controlled from either a graphical user interface (GUI), a
command line interface (CLI) or by a remote process.
Typical debugging features like breakpoints, single stepping, disassembling,
memory inspect & change, and so on are all supported.
In addition, complex debugging features like real time tracing, assertions,
conditional breaks, and plugin modules to name a few are also supported.
\end_layout
\begin_layout Chapter
gpsim - An Overview
\end_layout
\begin_layout Standard
If you don't care to wade through details, this chapter should help you
get things up and running.
The INSTALL and README files will provide more up-to-date information than
this document, so please refer to those first.
\end_layout
\begin_layout Section
Making the executable
\end_layout
\begin_layout Standard
gpsim's executable is created in a manner that's consistent with much of
the other open source software:
\end_layout
\begin_layout Standard
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
command
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
description
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
tar -xvzf gpsim-x.y.z.tar.gz
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
expand the compressed tar file
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
./configure
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Create a 'makefile' unique to your system
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
make
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
compile gpsim
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
make install
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
install gpsim
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
The last step will require root privileges.
\end_layout
\begin_layout Subsection
Make Details - ./configure options
\end_layout
\begin_layout Subsubsection*
gui-less
\end_layout
\begin_layout Standard
The default configuration will provide a gui (graphical user interface).
The cli (command line interface) is still available, however many people
prefer just to use the cli.
These hardy souls may build a command-line only interface by configuring
gpsim:
\end_layout
\begin_layout LyX-Code
./configure --disable-gui
\end_layout
\begin_layout Subsubsection*
debugging
\end_layout
\begin_layout Standard
If you want to debug gpsim then you'll probably use gdb.
Consequently, you'll want to disable shared libraries:
\end_layout
\begin_layout LyX-Code
./configure --disable-shared
\end_layout
\begin_layout Standard
This will create one, huge monolithic executable with symbolic information.
\end_layout
\begin_layout Subsection
RPMs
\end_layout
\begin_layout Standard
gpsim is also distributed in RPM form.
In recent versions, there are two RPMs: gpsim-devel and gpsim.
Both of these must be installed.
There is also a RPM for the source code.
This can be used to build a binary RPM unique to your system.
Please see the latest INSTALL and README for the most up to date information.
\end_layout
\begin_layout Subsection
Windows
\end_layout
\begin_layout Standard
gpsim runs on Windows too.
Borut Razem maintains the gpsim Windows web site:
\end_layout
\begin_layout Quote
http://gpsim.sourceforge.net/gpsimWin32/gpsimWin32.html
\end_layout
\begin_layout Standard
You can find detailed instructions there for installing gpsim and its dependenci
es.
Snap shots can be found:
\end_layout
\begin_layout Quote
http://gpsim.sourceforge.net/snap.php
\end_layout
\begin_layout Section
Running
\end_layout
\begin_layout Standard
The executable created above is called: gpsim.
The following command line options may be specified when gpsim is invoked.
\end_layout
\begin_layout LyX-Code
gpsim [-?] [-p []] [-c ]
\end_layout
\begin_layout LyX-Code
-p, --processor= processor (e.g.
-pp16c84 for the 'c84)
\end_layout
\begin_layout LyX-Code
-c, --command=STRING startup command file
\end_layout
\begin_layout LyX-Code
-s .cod symbol file
\end_layout
\begin_layout LyX-Code
-L, -- colon separated list of directories
to
\end_layout
\begin_layout LyX-Code
search.
\end_layout
\begin_layout LyX-Code
-v, --version gpsim version
\end_layout
\begin_layout LyX-Code
-i, --cli command line mode only
\end_layout
\begin_layout LyX-Code
-d, --icd=STRING use ICD (e.g.
-d /dev/ttyS0).
\end_layout
\begin_layout LyX-Code
Help options:
\end_layout
\begin_layout LyX-Code
-?, --help Show this help message
\end_layout
\begin_layout LyX-Code
--usage Display brief usage message
\end_layout
\begin_layout Standard
Typically gpsim will be invoked like:
\end_layout
\begin_layout LyX-Code
[My-Computer]$ gpsim -s mypic-program.cod
\end_layout
\begin_layout Standard
(The
\emph on
[My-Computer]$
\emph default
text is an example of a typical bash command prompt - you'll only type
the text after this prompt).
This loads the .cod file generated by gputils.
\end_layout
\begin_layout Standard
Under Windows, gpsim can also be invoked by navigating through the Start/Progam
menu.
This will open a DOS window to provide access to the command line interface.
It's also possible to open a DOS window (or CygWin bash session) and invoke
gpsim from there.
\end_layout
\begin_layout Section
Requirements
\end_layout
\begin_layout Standard
gpsim has been developed under Linux.
It should build and run just fine under the popular Linux distributions
like Fedora, Ubuntu, etc.
gpsim has also been ported to the MAC, MicroSoft Windows, Solaris, and
BSD.
Two packages gpsim requires that may not be available with all Linux distributi
ons are readline and gtk (the gimp tool kit).
The ./configure script should tell you if these packages are not installed
on your system or if the revisions that are installed are too old.
\end_layout
\begin_layout Standard
There are no minimum hardware requirements to run gpsim.
Faster is better though!
\end_layout
\begin_layout Standard
gputils, the gnupic utilities package, is also very useful.
gpsim will accept straight hex files, but if you want to do any symbolic
debugging then you'll want to use the .cod
\begin_inset Foot
status collapsed
\begin_layout Standard
.cod files are symbol files that were created by ByteCraft and are used by
Microchip.
\end_layout
\end_inset
files that gputils produces.
The .cod files are in the same format as the .cod files MPASM
\begin_inset Foot
status collapsed
\begin_layout Standard
MPASM is Microchip's Assembler.
\end_layout
\end_inset
produces.
\end_layout
\begin_layout Chapter
Command Line Interface
\end_layout
\begin_layout Standard
The command line interface is fairly straight-forward.
The table below summarizes the available commands.
Brief descriptions of these commands can also be displayed by typing
\emph on
help
\emph default
at the command line.
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
command
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
summary
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
attach
\begin_inset LatexCommand \index{attach}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Attach stimuli to nodes
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
break
\begin_inset LatexCommand \index{break}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Set a break point
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
bus
\begin_inset LatexCommand \index{bus}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Add or display node busses
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
clear
\begin_inset LatexCommand \index{clear}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Remove a break point
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
disassemble
\begin_inset LatexCommand \index{disassemble}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Disassemble the current cpu
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
dump
\begin_inset LatexCommand \index{dump}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Display either the RAM or EEPROM
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
frequency
\begin_inset LatexCommand \index{frequency}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Set processor frequency
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
help
\begin_inset LatexCommand \index{help}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Type help "command" for more help on a command
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
icd
\begin_inset LatexCommand \index{icd}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
In Circuit Debugger support.
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
list
\begin_inset LatexCommand \index{list}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Display source and list files
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
load
\begin_inset LatexCommand \index{load}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Load either a hex or command file
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
log
\begin_inset LatexCommand \index{log}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Log/record events to a file
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
node
\begin_inset LatexCommand \index{node}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Add or display stimulus nodes
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
module
\begin_inset LatexCommand \index{module}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\family roman
\series medium
\shape up
\size normal
\emph off
\bar no
\noun off
\color none
Select & Display modules
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
processor
\begin_inset LatexCommand \index{processor}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Add/list processors
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
quit
\begin_inset LatexCommand \index{quit}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Quit gpsim
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
reset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\family roman
\series medium
\shape up
\size normal
\emph off
\bar no
\noun off
\color none
Reset all or parts of the simulation
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
run
\begin_inset LatexCommand \index{run}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Execute the pic program
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
set
\begin_inset LatexCommand \index{set}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\family roman
\series medium
\shape up
\size normal
\emph off
\bar no
\noun off
\color none
display and control gpsim behavior flags
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
step
\begin_inset LatexCommand \index{step}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Execute one or more instructions
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
stimulus
\begin_inset LatexCommand \index{stimulus}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Create a stimulus
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
stopwatch
\begin_inset LatexCommand \index{stopwatch}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\family roman
\series medium
\shape up
\size normal
\emph off
\bar no
\noun off
\color none
Measure time between events
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
symbol
\begin_inset LatexCommand \index{symbol}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Add/list symbols
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
trace
\begin_inset LatexCommand \index{trace}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Dump the trace history
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
version
\begin_inset LatexCommand \index{version}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Display gpsim's version
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
x
\begin_inset LatexCommand \index{x}
\end_inset
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
(deprecated) examine and/or modify memory
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
The built in 'help' command provides additional online information.
\end_layout
\begin_layout Section
attach
\begin_inset LatexCommand \index{attach}
\end_inset
\end_layout
\begin_layout LyX-Code
attach node1 stimulus1 [stimulus2 stimulus_N]
\end_layout
\begin_layout Standard
attach is used to define the connections between stimuli and nodes.
At least one node and one stimulus must be specified.
If more stimuli are specified then they will all be attached to the node
examples:
\end_layout
\begin_layout LyX-Code
gpsim> node n1 # Define a new node.
\end_layout
\begin_layout LyX-Code
gpsim> attach n1 porta4 portb0 # Connect two I/O pins to the node.
\end_layout
\begin_layout LyX-Code
gpsim> node # Display the new "net list".
\end_layout
\begin_layout Section
break
\begin_inset LatexCommand \index{break}
\end_inset
\end_layout
\begin_layout Standard
The break command is used to set and examine break points.
New break points are assigned a unique number.
This number can be used to query or clear the break point.
Break points halt the simulation when the condition associated with them
is true.
Break points are ignored during single stepping.
See chapter
\begin_inset LatexCommand \ref{cha:Assertions-and-Extended}
\end_inset
for more examples of breakpoints.
\end_layout
\begin_layout Subsubsection*
Examining break points
\end_layout
\begin_layout LyX-Code
break [bp_number]
\end_layout
\begin_layout Standard
Break points can be examined by typing the break command without any options.
Specific breaks can be queried by specifying the break point number.
\end_layout
\begin_layout Subsubsection*
Program Memory/Execution breaks
\end_layout
\begin_layout Standard
The most common break point is an execution break point.
This one halts execution whenever the program counter reaches the address
at which the break point is set.
The syntax is:
\end_layout
\begin_layout LyX-Code
break e|r|w ADDRESS [expr]
\end_layout
\begin_layout Standard
The simulation halts when the address is executed, read, or written.
The ADDRESS can be a symbol or a number.
If the optional expression is specified, then it must evaluate to true
before the simulation will halt.
The read and write options only apply to those processors that can manipulate
their own program memory.
\end_layout
\begin_layout Subsubsection*
Register Memory breaks
\end_layout
\begin_layout Standard
gpsim can also associate break points with register accesses.
This is useful for capturing bugs that stomp on RAM.
E.g.
you can say something like
\begin_inset Quotes eld
\end_inset
halt execution whenever bit 4 of register 42 is cleared
\begin_inset Quotes erd
\end_inset
.
The command line syntax is:
\end_layout
\begin_layout LyX-Code
break r|w REGISTER [expr]
\end_layout
\begin_layout Standard
The simulation halts when
\emph on
REGISTER
\emph default
is read or written and the optional expression evaluates to true.
There are two styles of expressions supported.
One involves only expressions of the
\emph on
REGISTER
\emph default
, the other is completely arbitrary.
The examples below illustrate the differences.
\end_layout
\begin_layout Standard
Here's an example of a register write break.
This one will halt the simulation if any value is written to the variable
named
\emph on
temp1
\emph default
.
\end_layout
\begin_layout LyX-Code
break w temp1
\end_layout
\begin_layout Standard
Here the write is conditioned to happen for only a certain value:
\end_layout
\begin_layout LyX-Code
break w temp1==0x22
\end_layout
\begin_layout Standard
Here the condition applies to specific bits:
\end_layout
\begin_layout LyX-Code
break w temp1 & 0b11110000 == 0b11000000
\end_layout
\begin_layout Standard
This one breaks only if the hex digit 'C' is written to the upper nibble
of temp1.
\end_layout
\begin_layout Subsubsection*
Boolean Expressions
\end_layout
\begin_layout Standard
Sometimes it's necessary to specify an auxillary condition with a break
point.
For example, there may be a temporary variable that is shared throughout
the code.
You may wish to trap writes to that variable only while executing a specific
subroutine.
For example, the following break point triggers when temp1 is written and
while the program counter is in between the labels
\emph on
func_start
\emph default
and
\emph on
func_end
\emph default
:
\end_layout
\begin_layout LyX-Code
break w temp1 (pc >= func_start && pc < func_end)
\end_layout
\begin_layout Standard
\emph on
TIP:
\emph default
Use this type of break point if you suspect an interrupt routine is over
writing a variable.
\end_layout
\begin_layout Standard
Another situation is one where you wish to trap writes to a variable only
if some other variable is a certain value:
\end_layout
\begin_layout LyX-Code
break w temp1 (CurTask & 0x0f != 0b101)
\end_layout
\begin_layout Standard
If the firmware writes to the variable temp1 then the simulation will halt
if the lower nibble of CurTask is not equal to 5.
\end_layout
\begin_layout Subsubsection*
Attribute Breakpoints
\end_layout
\begin_layout Standard
gpsim also supports a concept of
\emph on
attribute breakpoints.
\emph default
Attributes are parameters that gpsim and its modules expose to the user
interface.
For example, the simulator stopwatch exposes attributes which support breakpoin
ts.
This feature is intend mainly for module writers to provide a mechanism
for allowing the user to control the module.
\end_layout
\begin_layout Subsubsection*
Cycle counter Breakpoints
\end_layout
\begin_layout LyX-Code
break c
\emph on
cycle_number
\end_layout
\begin_layout Standard
The cycle counter is gpsim's time keeper.
It increments once every instruction cycle.
The 'c' option to the break command allows a break point to be set at a
particular value of the cycle counter.
\end_layout
\begin_layout Section
clear
\begin_inset LatexCommand \index{clear}
\end_inset
\end_layout
\begin_layout LyX-Code
clear bp_number
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
The clear command is used to clear break points.
The break point number must be specified.
The
\emph on
break
\emph default
command without any arguments displays all of the currently defined break
points.
This can be used to ascertain the break point number.
Once cleared, a break point is deleted.
\begin_inset Foot
status collapsed
\begin_layout Standard
A break point disable/enable feature has been discussed and may be added
a future date.
\end_layout
\end_inset
\end_layout
\begin_layout Section
disassemble
\begin_inset LatexCommand \index{disassemble}
\end_inset
\end_layout
\begin_layout LyX-Code
disassemble [[begin:end] | [length]]
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
The disassemble command decodes the program memory opcodes into their standard
mnemonics.
With no options, the
\emph on
disassemble
\emph default
command disassembles instructions surrounding the current program counter:
\end_layout
\begin_layout LyX-Code
gpsim> disassemble
\end_layout
\begin_layout LyX-Code
current pc = 0x1c
\end_layout
\begin_layout LyX-Code
0012 2a03 incf reg3,f,0
\end_layout
\begin_layout LyX-Code
0014 0004 clrwdt
\end_layout
\begin_layout LyX-Code
0016 5000 movf reg,w,0
\end_layout
\begin_layout LyX-Code
0018 1001 iorwf reg1,w,0
\end_layout
\begin_layout LyX-Code
001a 1002 iorwf reg2,w,0
\end_layout
\begin_layout LyX-Code
==> 001c 1003 iorwf reg3,w,0
\end_layout
\begin_layout LyX-Code
001e e1f4 bnz $-0x16 ;(0x8)
\end_layout
\begin_layout LyX-Code
0020 d7ff bra $-0x0 ;(0x00020)
\end_layout
\begin_layout Standard
With a single numeric option, the disassemble command will
\end_layout
\begin_layout Section
dump
\begin_inset LatexCommand \index{dump}
\end_inset
\end_layout
\begin_layout LyX-Code
dump [r | e]
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
dump r or dump with no options will display all of the file registers and
special function registers.
dump e will display the contents of the eeprom (if the pic being simulated
contains any).
\end_layout
\begin_layout Standard
See the 'x' command for examining and modifying individual registers.
\end_layout
\begin_layout Section
echo
\begin_inset LatexCommand \index{echo}
\end_inset
\end_layout
\begin_layout Standard
The echo command is used like a print statement within configuration files.
It just lets you display information about your configuration file.
\end_layout
\begin_layout Section
frequency
\begin_inset LatexCommand \index{frequency}
\end_inset
\end_layout
\begin_layout Standard
This command sets the clock frequency.
By default gpsim uses 20 MHz as clock.
The clock frequency is used to compute time in seconds.
Use this command to adjust this value.
If no value is provided this command prints the current clock.
Note that PICs have an instruction clock that's a forth of the external
clock.
This value is the external clock.
\end_layout
\begin_layout Section
help
\begin_inset LatexCommand \index{help}
\end_inset
\end_layout
\begin_layout Standard
By itself, help will display all of the commands along with a brief description
on how they work.
'help ' provides more extensive online help.
The help command can also display information about attributes.
\end_layout
\begin_layout Section
icd
\begin_inset LatexCommand \index{icd}
\end_inset
\end_layout
\begin_layout Standard
\emph on
icd [open ]
\end_layout
\begin_layout Standard
The open command is used to enable ICD mode and specify the serial port
where the ICD is.
(e.g.
"icd open /dev/ttyS0").
Without options (and after the icd is enabled), it will print some information
about the ICD.
\end_layout
\begin_layout Section
list
\begin_inset LatexCommand \index{list}
\end_inset
\end_layout
\begin_layout LyX-Code
list [[s | l] [*pc] [line_number1 [,line_number2]]]
\end_layout
\begin_layout LyX-Code
Display the contents of source and list files.
\end_layout
\begin_layout LyX-Code
Without any options, list will use the last specified options.
\end_layout
\begin_layout LyX-Code
list s will display lines in the source (or .asm) file.
\end_layout
\begin_layout LyX-Code
list l will display lines in the .lst file
\end_layout
\begin_layout LyX-Code
list *pc will display either .asm or .lst lines around the pc
\end_layout
\begin_layout Standard
The list command allows you to view the source code while you are debugging.
\end_layout
\begin_layout Section
load
\begin_inset LatexCommand \index{load}
\end_inset
\end_layout
\begin_layout Standard
The load command is used to load either hex, configuration, or .cod files.
A hex file is usually used to program the physical part.
Consequently, it provides no symbolic information.
.cod files on the other hand, do provide symbolic information.
The only reason to use a hex file is when there's no .cod file available.
\end_layout
\begin_layout Standard
The syntax for loading source code files is:
\end_layout
\begin_layout LyX-Code
load [processortype] file
\end_layout
\begin_layout Standard
gpsim will automatically determine if the file is a .hex or .cod file.
The optional processortype allows one to override the processor specified
in a .cod file.
\end_layout
\begin_layout Standard
Configuration files are script files containing gpsim commands.
These are extremely useful for creating a debugging enviroment that will
be used repeatedly.
\end_layout
\begin_layout Section
macros
\begin_inset LatexCommand \index{macros}
\end_inset
\end_layout
\begin_layout Standard
Macros are defined like:
\end_layout
\begin_layout LyX-Code
\emph on
name
\emph default
macro [arg1, arg2, ..., argN]
\end_layout
\begin_layout LyX-Code
macro body
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
And they're invoked by:
\end_layout
\begin_layout LyX-Code
\emph on
name
\emph default
param1, param2, ..., paramN
\end_layout
\begin_layout Standard
Macros are a way of collecting several parameterized commands into one short
command.
The first line of a macro definition specifies the macro's name and optional
arguments.
The
\emph on
name
\emph default
is used to invoke the macro.
The arguments are text string place holders.
When a macro is invoked, the parameters are aligned with the arguments.
I.e.
\emph on
param1
\emph default
in the invocation can be thought of being assigned to
\emph on
arg1
\emph default
in the definition.
The parameters replace the arguments in the macro body.
\end_layout
\begin_layout Standard
In the following example, a variable or attribute called
\emph on
mac_flags
\emph default
is being manipulated in an expression.
The arguments
\emph on
add
\emph default
and
\emph on
mask
\emph default
appear in the macro body and provide a parameterized way of manipulating
this expression.
\end_layout
\begin_layout LyX-Code
mac_exp macro add, mask
\end_layout
\begin_layout LyX-Code
mac_flags = (mac_flags+add) & mask
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
Note that the indentation is arbitrary.
The macro is invoked by:
\end_layout
\begin_layout LyX-Code
mac_exp 1, 0b00001111 # increment the lower nibble
\end_layout
\begin_layout Standard
The parameter
\emph on
add
\emph default
is replaced by the number
\emph on
1
\emph default
while
\emph on
mask
\emph default
is replaced with the binary number
\emph on
0b00001111.
\emph default
The invocation turns into the gpsim command:
\end_layout
\begin_layout LyX-Code
mac_flags = (mac_flags+1) & 0b00001111
\end_layout
\begin_layout Subsubsection*
Nested Macros
\end_layout
\begin_layout Standard
The macro body can contain any gpsim command.
Of particular interest are macro invocations within other macros.
Here's another macro that invokes the one defined above.
\end_layout
\begin_layout LyX-Code
# Nested macro example
\end_layout
\begin_layout LyX-Code
mac1 macro p1, p2
\end_layout
\begin_layout LyX-Code
run
\end_layout
\begin_layout LyX-Code
mac_exp p1, p2
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
And it could be used like:
\end_layout
\begin_layout LyX-Code
mac1 1, 0b00001111 # test lower nibble
\end_layout
\begin_layout LyX-Code
mac1 (1<<4), 0b11110000 # test upper nibble
\end_layout
\begin_layout Standard
The first invocation starts the simulator by executing a
\emph on
run
\emph default
command.
When a break point is encountered, control returns to the command line
and the
\emph on
mac_exp
\emph default
macro is invoked.
\end_layout
\begin_layout Subsubsection*
Displaying Defined Macros
\end_layout
\begin_layout Standard
All currently defined macros can be displayed by typing the macro command
without a name or arguments:
\end_layout
\begin_layout LyX-Code
gpsim> macro
\end_layout
\begin_layout LyX-Code
mac1 macro p1 p2
\end_layout
\begin_layout LyX-Code
run
\end_layout
\begin_layout LyX-Code
mac_exp p1, p2
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout LyX-Code
mac_exp macro add mask
\end_layout
\begin_layout LyX-Code
mac_flags = (mac_flags+add) & mask
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Section
module
\begin_inset LatexCommand \index{module}
\end_inset
\end_layout
\begin_layout Standard
The
\emph on
module
\emph default
command is used to load and query external modules (see section
\begin_inset LatexCommand \ref{cha:Modules}
\end_inset
for more information about gpsim modules).
A module is a special piece of software that can extend gpsim in some manner.
LED's and switches are examples of modules.
A module library is collection of modules.
\end_layout
\begin_layout Subsubsection*
Loading module libraries
\end_layout
\begin_layout LyX-Code
module lib
\emph on
lib_name
\end_layout
\begin_layout Standard
The
\emph on
lib
\emph default
option is used to load a module library.
Module libraries are system dependent shared libraries, i.e.
on Windows they're DLL's and UNIX they're shared libraries.
This means that either the libraries should reside in a path where the
OS knows libraries exist or that the full path name must be specified along
with the
\emph on
lib_name
\emph default
.
gpsim provides a module library with a few modules:
\end_layout
\begin_layout LyX-Code
gpsim> module lib libgpsim_modules
\end_layout
\begin_layout Subsubsection*
Displaying available modules
\end_layout
\begin_layout LyX-Code
module list
\end_layout
\begin_layout Standard
The
\emph on
list
\emph default
option will display all of the modules that can be loaded.
Here is an example of gpsim's built-in modules.
\end_layout
\begin_layout LyX-Code
gpsim> module list
\end_layout
\begin_layout LyX-Code
Module Libraries libgpsim_modules.so
\end_layout
\begin_layout LyX-Code
pullup
\end_layout
\begin_layout LyX-Code
pulldown
\end_layout
\begin_layout LyX-Code
usart
\end_layout
\begin_layout LyX-Code
switch
\end_layout
\begin_layout LyX-Code
and2
\end_layout
\begin_layout LyX-Code
or2
\end_layout
\begin_layout LyX-Code
xor2
\end_layout
\begin_layout LyX-Code
not
\end_layout
\begin_layout LyX-Code
led_7segments
\end_layout
\begin_layout LyX-Code
led
\end_layout
\begin_layout LyX-Code
pulsegen
\end_layout
\begin_layout LyX-Code
Encoder
\end_layout
\begin_layout LyX-Code
TTL377
\end_layout
\begin_layout Subsubsection*
Loading a specific module
\end_layout
\begin_layout LyX-Code
module load module_type [module_name]
\end_layout
\begin_layout Standard
Once a library has been loaded, specific modules can be instantiated.
The
\emph on
module_type
\emph default
is what's displayed by the
\emph on
module list
\emph default
command.
The optional module name specifies what the instance is called.
Here's an example
\end_layout
\begin_layout LyX-Code
gpsim> module load led D1
\end_layout
\begin_layout Subsubsection*
Display loaded modules
\end_layout
\begin_layout Subsubsection*
Querying modules
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Section
node
\begin_inset LatexCommand \index{node}
\end_inset
\end_layout
\begin_layout LyX-Code
node [new_node1 new_node2 ...]
\end_layout
\begin_layout Standard
The
\shape italic
node
\shape default
command defines or queries
\begin_inset Quotes eld
\end_inset
nodes
\begin_inset Quotes erd
\end_inset
, used to connect external signals to the simulated PIC.
If no new_node is specified then all of the nodes that have been defined
are displayed.
If a new_node is specified then it will be added to the node list.
See the "attach" and "stimulus" commands to see how stimuli are added to
the nodes.
\end_layout
\begin_layout LyX-Code
examples:
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
node // display the node list
\end_layout
\begin_layout LyX-Code
node n1 n2 n3 // create and add 3 new nodes to the list
\end_layout
\begin_layout Section
processor
\begin_inset LatexCommand \index{processor}
\end_inset
\end_layout
\begin_layout LyX-Code
processor [new_processor_type [new_processor_name]] | [list] | [dump]
\end_layout
\begin_layout Standard
The
\emph on
processor
\emph default
command is used to either define a new processor or to query one that has
already been defined.
Normally there's no need to explicitly define the processor since the symbol
file already contains that information.
The two exceptions are when a) the symbolic information is not available
or b) you wish to override the processor specified in the symbol file.
(See the
\emph on
load
\emph default
command on how the processor in a symbol file can be overridden.)
\end_layout
\begin_layout Standard
To see a list of the processors supported by gpsim, type '
\emph on
processor list
\emph default
'.
To display the state of the I/O processor, type '
\emph on
processor pins
\emph default
'.
For now, this will display the pin numbers and their current state.
\end_layout
\begin_layout LyX-Code
examples:
\end_layout
\begin_layout LyX-Code
processor // Display the processors you've already defined.
\end_layout
\begin_layout LyX-Code
processor list // Display the list of processors supported.
\end_layout
\begin_layout LyX-Code
processor pins // Display the processor package and pin state
\end_layout
\begin_layout LyX-Code
processor p16cr84 fred // Create a new processor.
\end_layout
\begin_layout LyX-Code
processor p16c74 wilma // and another.
\end_layout
\begin_layout LyX-Code
processor p16c65 // Create one with no name.
\end_layout
\begin_layout Section
quit
\begin_inset LatexCommand \index{quit}
\end_inset
\end_layout
\begin_layout Standard
Quit gpsim.
\end_layout
\begin_layout Section
run
\begin_inset LatexCommand \index{run}
\end_inset
\end_layout
\begin_layout Standard
Start (or continue) simulation.
The simulation will continue until the next break point is encountered.
\end_layout
\begin_layout Section
step
\begin_inset LatexCommand \index{step}
\end_inset
\end_layout
\begin_layout Standard
Execute a single instruction, or a specified number of instructions.
\end_layout
\begin_layout LyX-Code
step [over | n]
\end_layout
\begin_layout Standard
With no arguments, the step command executes one instruction of the PIC
code.
If a numeric argument is given, this specifies a fixed number of instructions
to simulate.
The specific word
\begin_inset Quotes eld
\end_inset
over
\begin_inset Quotes erd
\end_inset
as an argument to step tells gpsim to run everything involved in the current
instruction.
This would normally be used on a CALL instruction, in which case the whole
subroutine runs and the simulation stops after it returns.
\end_layout
\begin_layout Section
symbol
\begin_inset LatexCommand \index{symbol}
\end_inset
\end_layout
\begin_layout LyX-Code
symbol [symbol_name [symbol_type value]]
\end_layout
\begin_layout Standard
The
\emph on
symbol
\emph default
command is used to query and define symbols.
If no options are specified, the whole symbol table is displayed.
The creation of user defined symbols is limited at this time (see the online
help for the current state of this command).
\end_layout
\begin_layout Section
stimulus
\begin_inset LatexCommand \index{stimulus}
\end_inset
\end_layout
\begin_layout LyX-Code
stimulus [[type] options]
\end_layout
\begin_layout Standard
The
\emph on
stimulus
\emph default
command creates a signal that can be tied to a node or an attribute.
If no options are specified then all currently defined stimuli are displayed.
\end_layout
\begin_layout Standard
Note that in most cases it is easier to create a stimulus file then to type
the command by hand.
\end_layout
\begin_layout Standard
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
option
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
description
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
initial_state
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
state at the start and at the rollover
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
start_cycle
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
simulation cyle when the stimulus will begin
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
period
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
stimulus period
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
name
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
specifies the stimulus name
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
Here's an example of a stimulus that will generate two pulses and repeat
this in 1000 cycles.
\end_layout
\begin_layout LyX-Code
stimulus asynchronous_stimulus
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
# The initial state AND the state the stimulus is when
\end_layout
\begin_layout LyX-Code
# it rolls over
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
initial_state 0
\end_layout
\begin_layout LyX-Code
start_cycle 0
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
# the asynchronous stimulus will roll over in 'period'
\end_layout
\begin_layout LyX-Code
# cycles.
Delete this line if you don't want a roll over.
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
period 1000
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
{ 100, 1,
\end_layout
\begin_layout LyX-Code
200, 0,
\end_layout
\begin_layout LyX-Code
300, 1,
\end_layout
\begin_layout LyX-Code
400, 0
\end_layout
\begin_layout LyX-Code
}
\end_layout
\begin_layout LyX-Code
# Give the stimulus a name:
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
name two_pulse_repeat
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
end
\end_layout
\begin_layout Standard
A stimulus can be queried by typing its name at the command line:
\end_layout
\begin_layout LyX-Code
gpsim> two_pulse_repeat
\end_layout
\begin_layout LyX-Code
two_pulse_repeat attached to pulse_node
\end_layout
\begin_layout LyX-Code
Vth=0V Zth=250 ohms Cth=0 F nodeVoltage= 7.49998e-07V
\end_layout
\begin_layout LyX-Code
Driving=0 drivingState=0 drivenState=0 bitState=0
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
states = 5
\end_layout
\begin_layout LyX-Code
100 1
\end_layout
\begin_layout LyX-Code
200 0
\end_layout
\begin_layout LyX-Code
300 1
\end_layout
\begin_layout LyX-Code
400 0
\end_layout
\begin_layout LyX-Code
1000 0
\end_layout
\begin_layout LyX-Code
initial=0
\end_layout
\begin_layout LyX-Code
period=1000
\end_layout
\begin_layout LyX-Code
start_cycle=0
\end_layout
\begin_layout LyX-Code
Next break cycle=100
\end_layout
\begin_layout Standard
Even though this example uses 1's and 0's for the data, one can use integers,
floating point numbers, or expressions instead.
Integers are useful for supplying a stimulus to an attribute.
Expressions are useful for abstracting the data.
See Chapter
\begin_inset LatexCommand \ref{cha:Simulating-the-Real}
\end_inset
for more discussion and examples of stimuli.
\end_layout
\begin_layout Section
stopwatch
\begin_inset LatexCommand \index{stopwatch}
\end_inset
\begin_inset Foot
status collapsed
\begin_layout Standard
The stopwatch is really a collection of attributes and not a command.
But the behavior is so similar to a command that it has been included here.
\end_layout
\end_inset
\end_layout
\begin_layout LyX-Code
A timer for monitoring and controlling the simulation.
\end_layout
\begin_layout LyX-Code
The units are in simulation cycles.
\end_layout
\begin_layout LyX-Code
stopwatch.rollover - specifies rollover value.
\end_layout
\begin_layout LyX-Code
stopwatch.direction - specifies count direction.
\end_layout
\begin_layout LyX-Code
stopwatch.enable - enables counting if true.
\end_layout
\begin_layout Standard
Without any options,
\emph on
stopwatch
\emph default
will display the contents of the stopwatch timer.
\emph on
stopwatch
\emph default
is writable, so you may initialize it to whatever value you like.
The
\emph on
\emph default
behavior of the timer may be manipulated via the three attributes.
The
\emph on
.rollover
\emph default
attribute is the number of cycles at which the stopwatch timer rolls over.
The
\emph on
.direction
\emph default
and
\emph on
.enable
\emph default
attributes are boolean types.
When true, the
\emph on
.direction
\emph default
attribute will instruction the stopwatch to count up.
\end_layout
\begin_layout Section
trace
\begin_inset LatexCommand \index{trace}
\end_inset
\end_layout
\begin_layout LyX-Code
trace [dump_amount]
\end_layout
\begin_layout Standard
\emph on
trace
\emph default
will print out the most recent "dump_amount" traces.
If no dump_amount is specified, then the entire trace buffer will be displayed.
\end_layout
\begin_layout Section
version
\end_layout
\begin_layout LyX-Code
version
\end_layout
\begin_layout Standard
Display gpsim's version.
Note, this command will probably get replaced by an attribute with the
same (or similar) name.
\end_layout
\begin_layout Section
x
\begin_inset LatexCommand \index{x}
\end_inset
\end_layout
\begin_layout Standard
The
\emph on
x
\emph default
command is deprecated.
It's former use was to examine and modify memory.
The preferred way to do this now is with expressions.
The help for
\emph on
x
\emph default
now indicates this:
\end_layout
\begin_layout LyX-Code
x examine command -- deprecated
\end_layout
\begin_layout LyX-Code
Instead of the using a special command to examine and modify
\end_layout
\begin_layout LyX-Code
variables, it's possible to directly access them using gpsim's
\end_layout
\begin_layout LyX-Code
expression parsing.
For example, to examine a variable:
\end_layout
\begin_layout LyX-Code
gpsim> my_variable
\end_layout
\begin_layout LyX-Code
my_variable [0x27] = 0x00 = 0b00000000
\end_layout
\begin_layout LyX-Code
To modify a variable
\end_layout
\begin_layout LyX-Code
gpsim> my_variable = 10
\end_layout
\begin_layout LyX-Code
It's also possible to assign the value of register to another
\end_layout
\begin_layout LyX-Code
gpsim> my_variable = porta
\end_layout
\begin_layout LyX-Code
Or to assign the results of an expression:
\end_layout
\begin_layout LyX-Code
gpsim> my_variable = (porta ^ portc) & 0x0f
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Chapter
\begin_inset LatexCommand \label{cha:Graphical-User-Interface}
\end_inset
Graphical User Interface
\end_layout
\begin_layout Standard
FIXME: We could use a few illustrations here!
\end_layout
\begin_layout Standard
gpsim also provides a graphical user interface that simplifies some of the
drudgery associated with the cli.
It's possible to open windows to view all the details about your debug
environment.
To get the most out of your debugging session, you'll want to assemble
your code with gpasm (the gnupic assembler) and use the symbolic .cod files
it produces.
\end_layout
\begin_layout Section
Main window
\end_layout
\begin_layout Subsection
Menus
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
File->Open .stc or .cod files.
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
File->Quit Quit gpsim
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Windows->* Open/Close the windows.
\end_layout
\begin_layout Subsection
Buttons
\end_layout
\begin_layout Standard
(These are also found as keyboard bindings in the source windows.)
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Step Step one instruction
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Over Step until pc is after next instruction
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Finish Run to return address
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Run Run continuously
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Stop Stop execution
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Reset Reset CPU
\end_layout
\begin_layout Subsection
Simulation mode
\end_layout
\begin_layout Standard
This controls how gpsim simulates, and how the gui updates.
\end_layout
\begin_layout List
\labelwidthstring 0000000.00.0000
Never Don't ever update the gui when simulating.
This is the fastest mode.
You'll have to stop simulation by pressing Ctrl-C in the command line interface.
\end_layout
\begin_layout List
\labelwidthstring 0000000.00.0000
x\InsetSpace ~
cycles Update the gui every x cycles simulated.
\end_layout
\begin_layout List
\labelwidthstring 0000000.00.0000
every\InsetSpace ~
cycle Update the gui every cycle.
(you see everything, if you have filled up on coffee :-)
\end_layout
\begin_layout List
\labelwidthstring 0000000.00.0000
x\InsetSpace ~
ms\InsetSpace ~
animate Here you can slow down simulation with a delay between every
cycle.
\end_layout
\begin_layout List
\labelwidthstring 0000000.00.0000
realtime This will make gpsim try to synchronize simulation speed with wall
clock time.
\end_layout
\begin_layout Section
Source Browsers
\end_layout
\begin_layout Standard
gpsim provides two views of your source: '.
\emph on
asm'
\emph default
and '.
\emph on
obj'
\emph default
browsers.
The '.
\emph on
asm'
\emph default
browser is a color coded display of your pic source.
\end_layout
\begin_layout Subsection
.asm Browser
\end_layout
\begin_layout Standard
When a .cod file with source is loaded, there should be something in this
display.
(TODO: add section about high level debugging).
\end_layout
\begin_layout Standard
There is an area to the left of the source, where symbols representing the
program counter, breakpoints, etc are displayed.
Double clicking in this area toggles breakpoints.
You can drag these symbols up or down in order to move them and change
the PC or move a breakpoint.
\end_layout
\begin_layout Standard
A right button click on the source pops up a menu with six items (the word
'here' in some menu items denote the line in source the mouse pointer was
on when right mouse button was clicked.):
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
\series bold
Menu\InsetSpace ~
item Description
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Find\InsetSpace ~
PC This menu item will find the PC and changed page tab and scroll the
source view to the current PC.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Run\InsetSpace ~
here This sets a breakpoint 'here'and starts running until a breakpoint
is hit.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Move\InsetSpace ~
PC\InsetSpace ~
here This simply changes PC to the address that line 'here'in source
has.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Breakpoint\InsetSpace ~
here Set a breakpoint 'here'.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Profile\InsetSpace ~
start\InsetSpace ~
here Set a start marker for routine profiling here.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Profile\InsetSpace ~
stop\InsetSpace ~
here Set a stop marker.
(See the section for the profiling window.)
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Select\InsetSpace ~
symbol.
This menu item is only available when some text is selected in the text
widget.
What it does is search the list of symbols for the selected word, and if
it is found it is selected in the symbol window.
Depending of type of symbol other things are also done, the same thing
as when selecting a symbol in the symbol window:
\end_layout
\begin_deeper
\begin_layout Itemize
If it is an address, then the opcode and source views display the address.
\end_layout
\begin_layout Itemize
If it's a register, the register viewer selects the cell.
\end_layout
\begin_layout Itemize
If it's a constant, address, register or ioport, it is selected in the symbol
window.
\end_layout
\end_deeper
\begin_layout List
\labelwidthstring 00.00.0000.0000
Find\InsetSpace ~
text This opens up a search dialog.
Every time you hit the 'Find' button, the current notebook page is found
and the source in that page is used.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Settings A dialog with which you can change the fonts used.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000.0000
Controls A submenu containing the simulation commands.
(these are also found as keyboard bindings (recommended), or in the main
window.)
\end_layout
\begin_layout Standard
These are the keyboard bindings:
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
\series bold
Key command
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
s,S,F7 Step one instruction.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
o,O,F8 Step over instruction
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
r,R,F9 Run continously.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
Escape Stop simulation.
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
f,F Run to return address
\end_layout
\begin_layout List
\labelwidthstring 00.00.0000
1..9 Step n instructions
\end_layout
\begin_layout Subsection
Opcode view - the .obj Browser
\end_layout
\begin_layout Standard
This window has two tabs.
One with each memory cell on one line and information about address, hexadecima
l value and decoded instruction (i.e.
disassembly), and one with the program memory
\end_layout
\begin_layout Standard
displayed with sixteen memory cells per row and a configurable ascii column.
\end_layout
\begin_layout Subsubsection*
The Assembly tab you can:
\end_layout
\begin_layout Itemize
Double click on a line to toggle breakpoints.
\end_layout
\begin_layout Itemize
Use the same keyboard commands as the in the source browser.
\end_layout
\begin_layout Itemize
Right click to get a menu where you can change the fonts.
\end_layout
\begin_layout Subsubsection*
The Opcode tab.
\end_layout
\begin_layout Standard
Here the program memory is ordered as columns of sixteen memory cells per
column and as many row as needed to contain all memory.
\end_layout
\begin_layout Standard
The seventeenth column contains an ASCII representation of the program memory.
You can configure this column to use one of three different modes:
\end_layout
\begin_layout Itemize
One byte per cell
\end_layout
\begin_layout Itemize
Two bytes per cell, MSB first.
\end_layout
\begin_layout Itemize
Two bytes per cell, LSB first.
\end_layout
\begin_layout Standard
You can change fonts with the menu item 'Settings'.
\end_layout
\begin_layout Standard
You can set breakpoints on one or more (drag the mouse to select more cells)
addresses with the right click menu.
\end_layout
\begin_layout Section
Register views
\end_layout
\begin_layout Standard
There are two similar register windows.
One for the RAM and one for the EEPROM data, when available.
\end_layout
\begin_layout Standard
Here you see all registers in the current processor.
Clicking on a cell displays it's name and value above the sheet of registers.
You can change values by entering it in the entry (or in the spreadsheet
cell).
\end_layout
\begin_layout Standard
The following things can be done on one register, or a range of registers.
(Selecting a range of registers is done by holding down left mouse button,
moving cursor, and releasing button.)
\end_layout
\begin_layout Itemize
Set and clear breakpoints.
Use the right mousebutton menu to pop up a menu where you can select set
read, write, read value and write value breakpoints.
You can also "clear breakpoints", notice the s in "clear breakpoints",
every breakpoint on the registers are cleared.
\end_layout
\begin_layout Itemize
Set and clear logging of registers.
You can log reads, writes, reads/writes of specific values and to bits
selected by a specified mask.
You can select a different file name with 'set log filename...'.
Default is "gpsim.log".
You can choose LXT or ASCII format.
LXT can be read with the program gtkwave.
ASCII is default.
\end_layout
\begin_layout Itemize
Copy cells.
You copy cells by dragging the border of the selected cell(s).
\end_layout
\begin_layout Itemize
Fill cells.
Move mouse to lower right corner of the frame of the selected cell(s),
and drag it.
The one cell's contents will be copied to the other cells.
\end_layout
\begin_layout Itemize
Watch them.
Select the "Add Watch" menu item.
\end_layout
\begin_layout Standard
The cells have different background colors depending on if they represent:
\end_layout
\begin_layout Itemize
File Register (e.g.
RAM): light cyan.
\end_layout
\begin_layout Itemize
Special Function Registers (e.g.
STATUS,TMR0): dark cyan
\end_layout
\begin_layout Itemize
aliased register (e.g.
the INDF located at address 0x80 is the same as the one located at address
0x00): gray
\end_layout
\begin_layout Itemize
invalid register: black.
If all sixteen registers in a row are invalid, then the row is not shown.
\end_layout
\begin_layout Itemize
a register with one or more breakpoints: red.
Logged registers are also red.
\end_layout
\begin_layout Standard
gpsim dynamically updates the registers as the simulation proceeds.
Registers that change value between updates of the window during simulation
are highlighted with a blue foreground color.
\end_layout
\begin_layout Standard
The menu also has a 'settings' item where you can change the font used.
\end_layout
\begin_layout Section
Symbol view
\end_layout
\begin_layout Standard
This window, as its name suggests, displays symbols.
All of the special function registers will have entries in the symbol viewer.
If you're using .cod files then you'll additionally have file registers
(that are defined in cblocks), equates, and address labels.
\end_layout
\begin_layout Standard
You can filter out some symbol types using the buttons in the top of the
window, and you can sort the rows by clicking on the column buttons (the
ones reading 'symbol', 'type' and 'address').
\end_layout
\begin_layout Standard
You can add the symbol to the watch window by right-clicking and selecting
the "Add to watch window" menu item.
This will add the ram register with address equal to the symbols value
to the watch window.
\end_layout
\begin_layout Standard
The symbol viewer is linked to the other windows.
For example, if you click on a symbol and:
\end_layout
\begin_layout Itemize
If it is an address, then the opcode and source views display the address.
\end_layout
\begin_layout Itemize
If it's a register, the register viewer selects the cell.
\end_layout
\begin_layout Section
Watch view
\end_layout
\begin_layout Standard
This is not a output-only window as the name suggests (change name?).
You can both view and change data.
Double-clicking on a bit toggles the bit.
You add variables here by marking them in a register viewer and select
\begin_inset Quotes eld
\end_inset
Add watch
\begin_inset Quotes erd
\end_inset
from menu.
The right-click menu has the following items:
\end_layout
\begin_layout Itemize
Remove watch
\end_layout
\begin_layout Itemize
Set register value
\end_layout
\begin_layout Itemize
Clear Breakpoints
\end_layout
\begin_layout Itemize
Set break on read
\end_layout
\begin_layout Itemize
Set break on write
\end_layout
\begin_layout Itemize
Set break on read value
\end_layout
\begin_layout Itemize
Set break on write value
\end_layout
\begin_layout Itemize
Columns...
\end_layout
\begin_layout Standard
"Columns...
\begin_inset Quotes erd
\end_inset
opens up a window where you can select which of the following data to display:
\end_layout
\begin_layout Itemize
BP
\end_layout
\begin_layout Itemize
Type
\end_layout
\begin_layout Itemize
Name
\end_layout
\begin_layout Itemize
Address
\end_layout
\begin_layout Itemize
Dec
\end_layout
\begin_layout Itemize
Hex
\end_layout
\begin_layout Itemize
Bx (bits of word)
\end_layout
\begin_layout Standard
You can sort the list of watches by clicking on the column buttons.
Clicking twice sorts the list backwards.
\end_layout
\begin_layout Section
Stack viewer
\end_layout
\begin_layout Standard
This window displays current stack.
Selecting an entry makes the code windows display the return address.
Double clicking sets a breakpoint on the return address.
\end_layout
\begin_layout Section
Breadboard
\end_layout
\begin_layout Standard
Here you can create/modify and examine the environment around the pic.
Pins are displayed as an arrow.
The direction of the arrow indicates if its an input or output pin.
The color of the arrow indicates its state (green=low, red=high).
\end_layout
\begin_layout Standard
You can't instantiate pic processors from here, you'll have to do that from
the command line, or from a .stc file.
\end_layout
\begin_layout Standard
Your can create nodes by clicking on the "new node" button.
(A node is 'a piece of wire' to which you can connect stimulus.) You can
see the list of created nodes under the "nodes" item in the upper-left
tree widget.
\end_layout
\begin_layout Standard
You can create connections to nodes by clicking on a pin, and then clicking
on the button "Connect stimulus to node".
This will bring up a list of nodes.
Choose one by double-clicking on the one you like.
\end_layout
\begin_layout Standard
If you click on a pin that is already connected to a node, then you'll see
the node and its connections in the lower left part of the window.
You can disconnect a stimulus by clicking on it and pressing the "remove
stimulus" button.
\end_layout
\begin_layout Standard
When you want to add a module to the simulation, you first have to specify
the library which contains the module you want.
Click on the "add library" button and enter the library name (e.g.
"libgpsim_modules.so").
Now you can click the "add module" button.
Select the module you want from the list by double-clicking on it.
Enter a name for the module (this has to be unique, and not used before).
You now have to position the module.
Move the mouse pointer to where you'd like the module, and left-click.
\end_layout
\begin_layout Standard
If you middle-click on a pin, you'll see how the pin is connected.
Press the "trace all" to see all at
\end_layout
\begin_layout Standard
once, and "clear traces" to remove all (you'll only remove the graphical
trace, not the connection!).
If the tracing doesn't work, try moving the packages so that there are
more space around the pins.
\end_layout
\begin_layout Standard
When you are done, you can save by clicking the "save configuration" button.
You can then load this file from the command line like this (assuming the
.cod file with your source is called "mycode.cod", and the file you just
saved was called "mynets.stc":
\end_layout
\begin_layout LyX-Code
gpsim -s mycode.cod -c mynets.stc
\end_layout
\begin_layout Standard
You can't load only the .stc file since this doesn't contain the processor
type and code.
You can create (with an editor) your own .stc file (e.g.
my_project.stc) and in that file put a command "load c mynets.stc" after
you have loaded the .cod file.
You then only have to load this file (gpsim -c my_project.stc).
\end_layout
\begin_layout Section
Trace viewer
\end_layout
\begin_layout Standard
This window shows the trace of instructions executed.
See
\begin_inset LatexCommand \ref{trace}
\end_inset
.
\end_layout
\begin_layout Section
Profile viewer
\end_layout
\begin_layout Standard
This window show execution count for program memory addresses.
The profile window must be opened before starting simulation, because the
traceing is not enabled by default.
\end_layout
\begin_layout Subsubsection
Instruction profile
\end_layout
\begin_layout Standard
This shows the number of times each instruction are executed.
\end_layout
\begin_layout Subsubsection
Instruction range profile
\end_layout
\begin_layout Standard
Here you can group ranges of instruction into one entry.
\end_layout
\begin_layout Standard
The right click menu contains:
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Remove\InsetSpace ~
range Remove an entry.
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Add\InsetSpace ~
range...
Open a disalog from where you can add a range of instructions as an entry.
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Add\InsetSpace ~
all\InsetSpace ~
labels Add all code labels as ranges.
\end_layout
\begin_layout List
\labelwidthstring 00000000.00.0000
Snapshot\InsetSpace ~
to\InsetSpace ~
plot Open a window containing a graph of the data.
From this new window you can also save (postscript) or print it.
\end_layout
\begin_layout Subsubsection*
Register profile
\end_layout
\begin_layout Standard
This shows the number of reads or writes the simulator does on register.
\end_layout
\begin_layout Subsubsection*
Routine profile
\end_layout
\begin_layout Standard
Here you can see statistics about execution time for a selected routine.
You mark the entry and exit points from the source browser (profile start/stop).
If the routine you want to measure have multiple entry and/or exit points,
then you have to put a marker on every entry point as well as (and especially)
every exit point.
Othervise you will get bad data.
\end_layout
\begin_layout Standard
When you have done that, gpsim will (as simulation goes by) store the execution
times of that routine and calculate min/max/average/etc.
You can also use the menu item 'Plot distribution' to open a window displaying
a histogram of the data.
From this new window you can also save (in postscript) or print it.
\end_layout
\begin_layout Standard
You can also measure call period by switching the 'entry' and 'exit' points.
If also want the time from reset (or some equal point) to the first 'entry',
then you must also put an 'entry' point there.
\end_layout
\begin_layout Section
Stopwatch
\end_layout
\begin_layout Standard
The stopwatch window shows a cycle counter and a re-settable counter.
The cycle counter is the same as the one in the register window.
It basically counts instructions.
\end_layout
\begin_layout Standard
The other counter counts at the same rate as the cycle counter, but can
be cleared by clicking the "clear" button (or preset by entering a number
in the entry box).
\end_layout
\begin_layout Standard
The up/down indicator denotes the direction the counter counts.
\end_layout
\begin_layout Standard
The rollover value specifies the range the cycle counter can be in (a modulo
counter).
For example, if the rollover value is specified to be 0x42, then whenever
the resettable counter reaches 0x42 it will rollover to zero.
If the counter is counting down, then when it reaches 0 the next state
will be 0x41.
If you don't want is like this, then set the rollover value to something
large.
\end_layout
\begin_layout Section
Scope Window
\end_layout
\begin_layout Standard
FIXME: The scope window still needs some work...
\end_layout
\begin_layout Standard
The Scope Window graphs I/O pin states.
It is similar to an oscilloscope or logic analyzer.
It can be controlled either from the command line or from the gui.
Currently only the digital state of I/O pins are supported.
\end_layout
\begin_layout Chapter
Scripting and Configuring
\end_layout
\begin_layout Standard
gpsim does not have a native scripting language per se.
However it is possible to place gpsim commands into a file and load them
later.
This is useful for loading modules and stimuli and connecting various devices
together.
By convention, gpsim's configuration files have the extension
\emph on
.stc
\emph default
, for
\emph on
st
\emph default
artup
\emph on
c
\emph default
onfiguration.
\end_layout
\begin_layout Section
Embedded Commands
\end_layout
\begin_layout Standard
If you're using gputils, it is possible to embed configuration commands
directly into your PIC assembly source.
The gputils supplied include file
\emph on
coff.inc
\emph default
contains several macros that embed simulation command into a COFF and COD
files.
\end_layout
\begin_layout Subsection
.sim macro
\end_layout
\begin_layout LyX-Code
; Simulator Command
\end_layout
\begin_layout LyX-Code
.sim macro x
\end_layout
\begin_layout LyX-Code
.direct "e", x
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
The
\family typewriter
\emph on
.sim
\emph default
macro allows gpsim configuration commands to be embedded in the PIC source.
While gpsim loads a .cod file, the commands in the
\emph on
.sim
\emph default
macros are collected.
After the .cod file is loaded, the commands are redirected to gpsim's command
line interpreter in the order they were received.
\end_layout
\begin_layout Standard
Here's an example of switch module being loaded and configured:
\end_layout
\begin_layout LyX-Code
;# Module libraries:
\end_layout
\begin_layout LyX-Code
.sim "module library libgpsim_modules"
\end_layout
\begin_layout LyX-Code
.sim "module load switch SW1"
\end_layout
\begin_layout LyX-Code
.sim "SW1.state=false"
\end_layout
\begin_layout LyX-Code
.sim "SW1.xpos = 216.0"
\end_layout
\begin_layout LyX-Code
.sim "SW1.ypos = 156.0"
\end_layout
\begin_layout LyX-Code
.sim "SW1.Ropen = 1.0e8"
\end_layout
\begin_layout Standard
This loads gpsim's module library, instantiates a switch module, and configures
the switch's attributes.
\end_layout
\begin_layout Subsection
.command macro
\end_layout
\begin_layout LyX-Code
.command macro x
\end_layout
\begin_layout LyX-Code
.direct "c", x
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
The
\family typewriter
\emph on
.command
\emph default
macro is similar to a
\emph on
.sim
\emph default
macro except that it associates a gpsim command with a particular instruction.
This is useful for changing attribute values at different points of the
program.
\end_layout
\begin_layout Subsection
.assert macro
\end_layout
\begin_layout LyX-Code
; Assertion
\end_layout
\begin_layout LyX-Code
.assert macro x
\end_layout
\begin_layout LyX-Code
.direct "a", x
\end_layout
\begin_layout LyX-Code
endm
\end_layout
\begin_layout Standard
The
\emph on
.assert
\emph default
macro provides a source code mechanism for setting breakpoints (see chapter
\begin_inset LatexCommand \ref{cha:Assertions-and-Extended}
\end_inset
).
An assertion is an expression associated with a specific instruction.
It essential means,
\begin_inset Quotes eld
\end_inset
If the expression at this instruction evaluates to false, then halt the
simulation.
\begin_inset Quotes erd
\end_inset
\end_layout
\begin_layout LyX-Code
; Close the switch because of capacitance portc1 will go high after a
delay:
\end_layout
\begin_layout LyX-Code
; R=145, C=4.2e-6 TC=6.11e-4 or 1527 cycles 0-2 volts requires 0.51 Tc
\end_layout
\begin_layout LyX-Code
.command "SW1.state=true"
\end_layout
\begin_layout LyX-Code
nop
\end_layout
\begin_layout LyX-Code
; portc0 should be same as portc1
\end_layout
\begin_layout LyX-Code
.assert "(portc & 3) == 0,
\backslash
"SW1 closed, cap holds low
\backslash
""
\end_layout
\begin_layout LyX-Code
nop
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
In this example, the
\emph on
.command
\emph default
macro writes to the switch module's
\emph on
.state
\emph default
attribute (see section
\begin_inset LatexCommand \ref{sub:Switches-&-Resistors}
\end_inset
).
Just prior to executing the first nop instruction, the switch will be closed.
The
\emph on
.assert
\emph default
macro at the very next instruction makes sure that the expected state is
seen on PORTC.
\end_layout
\begin_layout Section
Sockets
\end_layout
\begin_layout Standard
gpsim supports a socket interface.
This is inhibited by default.
Advanced users may wish to study code in the
\emph on
examples/scripts
\emph default
subdirectory.
This code not distributed and is only available in the subversion repository.
\end_layout
\begin_layout Chapter
\begin_inset LatexCommand \label{cha:Assertions-and-Extended}
\end_inset
Assertions and Extended Breakpoints
\end_layout
\begin_layout Standard
gpsim supports a wide variety of breakpoints and assertions.
Many of these were described with the break command.
This section will illustrate how to extend the break command even further
and introduce simulation assertions.
\end_layout
\begin_layout Subsection*
Breakpoint Messages
\end_layout
\begin_layout Standard
A breakpoint message is an ASCII string that is displayed whenever a breakpoint
is encountered.
Any break point can have an associated message.
The syntax at the command line is
\end_layout
\begin_layout LyX-Code
break conditions,
\begin_inset Quotes eld
\end_inset
\emph on
This is a breakpoint message
\emph default
\begin_inset Quotes erd
\end_inset
\end_layout
\begin_layout Standard
The conditions are described above in the break command and are the conditions
under which the break occurs.
\end_layout
\begin_layout Standard
Breakpoint messages are useful for distinguishing among many different breakpoin
ts.
\end_layout
\begin_layout LyX-Code
break w counter & 0xf0 == 0x80,
\begin_inset Quotes eld
\end_inset
Counter overflowed!
\begin_inset Quotes erd
\end_inset
\end_layout
\begin_layout Standard
In this example, the user is monitoring the upper nibble of the variable
counter and breaking whenever it is equal to 8.
When the command is entered, gpsim will display:
\end_layout
\begin_layout LyX-Code
break when bit pattern 1000XXXX is written to register counter(0x26).
break #: 0x20
\end_layout
\begin_layout Standard
The breakpoint can be queried with the break command:
\end_layout
\begin_layout LyX-Code
gpsim>
\emph on
break 32
\end_layout
\begin_layout LyX-Code
32: p18f452 register write value: [0x26] & 0xf0 == 0x8
\end_layout
\begin_layout LyX-Code
Message:Counter overflowed!
\end_layout
\begin_layout Standard
When the simulation encounters the break, execution halts and the message
is printed.
\end_layout
\begin_layout Section
Assertions and Embedded Simulation commands
\end_layout
\begin_layout Standard
gpsim's breakpoint design is a powerful tool that can catch many problems.
The assertion design extends this power even further.
An assertion is like a breakpoint that is associated with a particular
instruction.
For example, you may have a routine that requires BANK 0 be selected.
A gpsim assertion can be placed at the entry of the routine to verify that
this is the case.
\end_layout
\begin_layout LyX-Code
.assert
\begin_inset Quotes eld
\end_inset
(status & 0x60) == 0,
\backslash
\begin_inset Quotes erd
\end_inset
Bank 0 must be selected!
\backslash
\begin_inset Quotes erd
\end_inset
\begin_inset Quotes erd
\end_inset
\end_layout
\begin_layout Standard
The syntax is identical to the extended breakpoint command.
The expression is the condition that is checked.
If the expression evaluates to false, then the code halts and prints the
message.
The
\emph on
.assert
\emph default
is a macro that is part of gputils.
It requires a string as its input argument.
Notice that the assertion message is embedded in the argument.
gpasm and MPASM copy C's method of placing a backslash in front of quotations
that are part of a string.
\end_layout
\begin_layout Subsection*
Command Assertions
\end_layout
\begin_layout Standard
A command assertion is a gpsim associated with a particular instruction
in your PIC source code.
These are useful for changing the behavior of the simulation based on where
the code executes.
Almost any gpsim command can be placed in a command assertion.
However, the most useful ones are assignment commands.
For example:
\end_layout
\begin_layout LyX-Code
.command
\begin_inset Quotes eld
\end_inset
SW1.state = false
\begin_inset Quotes erd
\end_inset
\end_layout
\begin_layout Standard
This assignment writes to the state attribute of a switch module named SW1.
\end_layout
\begin_layout Chapter
Trace and Log: What has happen?
\begin_inset LatexCommand \label{trace}
\end_inset
\end_layout
\begin_layout Standard
Inspecting the current state of your program is sometimes insufficient to
determine the cause of a bug.
Often times it's useful to know the conditions that led up to the current
state.
gpsim provides a history or trace of everything that occurs - whether you
want it or not - to help you diagnose these otherwise difficult to analyze
bugs.
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
What's traced
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
notes
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
program counter
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
adresses executed
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
instructions
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
opcode
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
register read
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
value and location
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
register write
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
value and location
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
cycle counter
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
current value
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
skipped instructions
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
addresses skipped
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
status register
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
during implicit modification
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
interrupts
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
break points
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
type
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
resets
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
type
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
The 'trace' command will dump the contents of the trace buffer.
\end_layout
\begin_layout Standard
A large circular buffer (whose size is hard coded) stores the information
for the trace buffer.
When it fills, it will wrap around and write over the old history.
The contents of the trace buffer are parsed into frames, where one frame
corresponds to a simulation cycle.
\end_layout
\begin_layout Standard
Here's an example of a trace output:
\end_layout
\begin_layout LyX-Code
gpsim> trace
\end_layout
\begin_layout LyX-Code
0x00000000000026F6 p18f452 0x001C 0x1003 iorwf reg3,w,0
\end_layout
\begin_layout LyX-Code
Read: 0x00 from reg3(0x0003)
\end_layout
\begin_layout LyX-Code
Wrote: 0xE7 to W(0x0FE8) was 0xE7
\end_layout
\begin_layout LyX-Code
Wrote: 0x18 to status(0x0FD8) was 0x18
\end_layout
\begin_layout LyX-Code
0x00000000000026F7 p18f452 0x001E 0xE1F4 bnz $-0x16 ;(0x8)
\end_layout
\begin_layout LyX-Code
0x00000000000026F8 p18f452 0x0008 0x3E00 incfsz reg,f,0
\end_layout
\begin_layout LyX-Code
Read: 0xE4 from reg(0x0000)
\end_layout
\begin_layout LyX-Code
Wrote: 0xE5 to reg(0x0000) was 0xE4
\end_layout
\begin_layout LyX-Code
0x00000000000026F9 p18f452 0x000A 0xD004 bra $+0xa ;(0x00014) 0x00000000000
026FA p18f452 0x0014 0x0004 clrwdt
\end_layout
\begin_layout LyX-Code
0x00000000000026FB p18f452 0x0016 0x5000 movf reg,w,0
\end_layout
\begin_layout LyX-Code
Read: 0xE5 from reg(0x0000)
\end_layout
\begin_layout LyX-Code
Wrote: 0xE5 to W(0x0FE8) was 0xE7
\end_layout
\begin_layout LyX-Code
Wrote: 0x18 to status(0x0FD8) was 0x18
\end_layout
\begin_layout LyX-Code
0x00000000000026FC p18f452 0x0018 0x1001 iorwf reg1,w,0
\end_layout
\begin_layout LyX-Code
Read: 0x03 from reg1(0x0001)
\end_layout
\begin_layout LyX-Code
Wrote: 0xE7 to W(0x0FE8) was 0xE5
\end_layout
\begin_layout LyX-Code
Wrote: 0x18 to status(0x0FD8) was 0x18
\end_layout
\begin_layout Standard
Each trace frame begins with a new simulation cycle.
Typically this will include a simulated instruction.
Here's each of the fields:
\end_layout
\begin_layout LyX-Code
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
64-bit simulation cycle
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
processor
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
PC
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
opcode
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
instruction
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x00000000000026F6
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
p18f452
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x001C
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x1003
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
iorwf reg3,w,0
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
Other events that occur during the trace frame are indented.
Typically these will be register read or write traces.
The read traces show the value read.
Write traces show the value written and the value that was previously in
the register.
\end_layout
\begin_layout Section*
Saving Trace to a file
\end_layout
\begin_layout Standard
The trace buffer may contain thousands of entries making it difficult to
search.
The trace save feature will allow the trace buffer to be written to a file.
\end_layout
\begin_layout LyX-Code
gpsim> trace save mytrace.log
\end_layout
\begin_layout Standard
The entire contents of the trace buffer are decoded and written to the file.
The format of the trace is the same as it is when displayed at the command
line.
\end_layout
\begin_layout Section*
Raw Traces
\end_layout
\begin_layout Standard
The
\emph on
raw
\emph default
trace buffer is the trace buffer displayed in a minimally decoded form.
This is primarily used for gpsim development.
When saved to a file, the raw trace is not decoded at all.
In addition, the processor's state is written to the file.
Thus third party tools can be written to create custom trace reports
\begin_inset Foot
status collapsed
\begin_layout Standard
FIXME - The dynamically created trace type information needs to be written
to this file too.
Without it, it is difficult to tell what each traced item is.
\end_layout
\end_inset
.
\end_layout
\begin_layout Chapter
\begin_inset LatexCommand \label{cha:Simulating-the-Real}
\end_inset
Simulating the Real World: Stimuli
\begin_inset LatexCommand \index{Stimulus}
\end_inset
\end_layout
\begin_layout Standard
Stimuli are extremely useful, if not necessary, for simulations.
They provides a means for simulating interactions with the real world.
\end_layout
\begin_layout Standard
The gpsim stimuli capability is designed to be accurate, efficient and flexible.
The models for the PIC's I/O pins mimic the real devices.
For example, the open collector output on port A of a PIC16C84 can only
drive low.
Multiple I/O pins may be tied to one another so that the open collector
on port A can get a pull up resistor from port B.
The overhead for stimuli only occurs when a stimulus changes states.
In other words, stimuli are not polled to determine their state.
\end_layout
\begin_layout Standard
Analog stimuli are also available.
It's possible to create voltage references and sources to simulate almost
any kind of real world thing.
For example, it's possible to combine two analog stimuli together to create
signals like DTMF tones.
\end_layout
\begin_layout Section
How They Work
\end_layout
\begin_layout Standard
In the simplest case, a stimulus acts a source for an I/O pin on a PIC.
For example, you may want to simulate a clock and measure its period using
TMR0.
In this case, the stimulus is the source and the TMR0 input pin on the
pic is the load.
In gpsim you would create a stimulus for the clock using the stimulus command
and connect it to the I/O pin using the node command.
\end_layout
\begin_layout Standard
In general, you can have several 'sources' and several 'loads' that are
interconnected with nodes
\begin_inset Foot
status collapsed
\begin_layout Standard
Although, gpsim is currently limited to 'one-port' devices.
In other words, it is assumed that ground serves as a common reference
for the sources and the loads.
\end_layout
\end_inset
.
A good analogy is a spice circuit.
The spice netlist corresponds to a node-list in gpsim and the spice elements
correspond to the stimuli sources and loads.
This general approach makes it possible to create a variety of simulation
environments.
Here's a list of different ways in which stimuli may be connected:
\end_layout
\begin_layout Enumerate
Stimulus connected to one I/O pin
\end_layout
\begin_layout Enumerate
Stimulus connected to several I/O pins
\end_layout
\begin_layout Enumerate
Several stimuli connected to one I/O pin
\end_layout
\begin_layout Enumerate
Several stimuli connected to several I/O pins
\end_layout
\begin_layout Enumerate
I/O pins connected to I/O pins
\end_layout
\begin_layout Standard
The general technique for implementing stimuli is as follows:
\end_layout
\begin_layout Enumerate
Define the stimulus or stimuli.
\end_layout
\begin_layout Enumerate
Define a node.
\end_layout
\begin_layout Enumerate
Attach the stimuli to the node.
\end_layout
\begin_layout Standard
More often than not, the stimulus definition will reside in a file.
\end_layout
\begin_layout Subsection
Contention among stimuli
\end_layout
\begin_layout Standard
One of the problems with this nodal approach to modeling stimuli is that
it's possible for contention to exist.
For example, if two I/O pins are connected to one another and driving in
the opposite directions, there will be contention.
gpsim resolves contention with attribute summing.
Each stimulus - even if it's an input - has an effect on the node.
This effect is characterised by a voltage and an impedance.
When a node is updated, gpsim performs a Thevenin voltage summing of all
the stimuli together.
The resultant voltage is then propagated to all connected stimuli as the
current state of the node.
\end_layout
\begin_layout Standard
For example, in the port A open collector / port B weak pull-up connection
example, gpsim assigns a voltage of 5V with an impedance of 20kohms to
the pull up resistor, and a voltage of 0V with an impedance of 150ohms
to the open collector if it is active, or 100Mohms if it's not driving.
The Thevenin sum will be roughly 0.05V if the output is driving, or 5V otherwise.
Capacitive effects are not currently supported.
\end_layout
\begin_layout Section
I/O Pins
\end_layout
\begin_layout Standard
gpsim models I/O pins as stimuli.
Thus anywhere a stimulus is used, an I/O pin may be substituted.
For example, you may want to tie two I/O pins to one another; like a port
B pull up resistor to a port A open collector.
gpsim automatically creates the I/O pin stimuli whenever a processor is
created.
All you need to do is to specify a node and then attach the stimuli to
it.
The names of these stimuli are formed by concatenating the port name with
the bit position of the I/O pin.
For example, bit 3 in port B is called portb3.
\end_layout
\begin_layout Standard
Here's a list of the types of I/O pin stimuli that are supported:
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
I/O Pin Type
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Function
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
INPUT_ONLY
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Only accepts input (like MCLR)
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
BI_DIRECTIONAL
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Can be a source or a load (most I/O pins)
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
BI_DIRECTIONAL_PU
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
PU=Pullup resistor (PORTB)
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
OPEN_COLLECTOR
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Can only drive low (RA4 on c84)
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
There is no special pin type for analog I/O pins.
All pic analog inputs are multiplexed with digital inputs.
The I/O pin definition will always be for the digital input.
gpsim automatically knows when I/O pin is analog input.
\end_layout
\begin_layout Section
Asynchronous Stimuli
\end_layout
\begin_layout Standard
Asynchronous stimuli are analog or digital stimuli that can change states
at any given instant (limited to the resolution of the cycle counter).
They can be defined to be repetitive too.
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
parameter
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
function
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
start_cycle
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
The # of cycles before the stimulus starts
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
cycles[]
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
An array of cycle #'s
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
data[]
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Stimulus state for a cycle
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
period
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
The # of cycles for one period
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
initial_state
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
The initial state before data[0]
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Standard
\begin_inset VSpace 0.3cm
\end_inset
\end_layout
\begin_layout Standard
When the stimulus is first initialized, it will be driven to the 'initial
state' and will remain there until the cpu's instruction cycle counter
matches the specified 'start' cycle.
After that, the two arrays 'cycles[]' and 'data[]' define the stimulus'
outputs.
The size of the arrays are the same and correspond to the number of events
that are to be created.
So the event number, if you will, serves as the index into these arrays.
The 'cycles[]' array define when the events occur while the 'data[]' array
defines the states the stimulus will enter.
The 'cycles[]' are measured with respect to the 'start' cycle.
The asynchronous stimulus can be made periodic by specifying the number
of cycles in the 'period' parameter.
\end_layout
\begin_layout Standard
Here's an example that generates three pulses and then repeats:
\end_layout
\begin_layout LyX-Code
stimulus asynchronous_stimulus # or we could've used asy
\newline
\end_layout
\begin_layout LyX-Code
# The initial state AND the state the stimulus is when
\end_layout
\begin_layout LyX-Code
# it rolls over
\newline
\end_layout
\begin_layout LyX-Code
initial_state 1
\newline
\end_layout
\begin_layout LyX-Code
# all times are with respect to the cpu's cycle counter
\end_layout
\begin_layout LyX-Code
start_cycle 100
\newline
\end_layout
\begin_layout LyX-Code
# the asynchronous stimulus will roll over in 'period'
\newline
# cycles.
Delete this line if you don't want a roll over.
\end_layout
\begin_layout LyX-Code
period 5000
\newline
\end_layout
\begin_layout LyX-Code
# Now the cycles at which stimulus changes states are
\end_layout
\begin_layout LyX-Code
# specified.
The initial cycle was specified above.
So
\newline
# the first cycle specified below will toggle this state.
\end_layout
\begin_layout LyX-Code
# In this example, the stimulus will start high.
\end_layout
\begin_layout LyX-Code
# At cycle 100 the stimulus 'begins'.
However nothing happens
\end_layout
\begin_layout LyX-Code
# until cycle 200+100.
\end_layout
\begin_layout LyX-Code
{ 200, 0,
\end_layout
\begin_layout LyX-Code
300, 1,
\end_layout
\begin_layout LyX-Code
400, 0,
\end_layout
\begin_layout LyX-Code
600, 1,
\end_layout
\begin_layout LyX-Code
1000, 0,
\end_layout
\begin_layout LyX-Code
3000, 1 }
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
# Give the stimulus a name:
\end_layout
\begin_layout LyX-Code
name asy_test
\newline
\end_layout
\begin_layout LyX-Code
# Finally, tell the command line interface that we're done
\end_layout
\begin_layout LyX-Code
# with the stimulus
\end_layout
\begin_layout LyX-Code
end
\end_layout
\begin_layout Subsection
Analog Asynchronous Stimuli
\end_layout
\begin_layout Standard
Analog Asynchronous Stimuli are identical to Synchronous Stimuli except
the data points are floating point numbers.
\end_layout
\begin_layout Section
Extended Stimuli
\end_layout
\begin_layout Standard
Discuss the extended stimuli in the modules/ directory.
In particular, describe the
\emph on
PulseGen
\emph default
module and how it can complete replace the asynchronous stimuli.
Also describe the
\emph on
PullUp
\emph default
and
\emph on
PullDown
\emph default
modules and how they can be manipulated into being general purpose DC voltage
sources (FIXME, would it make sense to rename these modules?).
\end_layout
\begin_layout Chapter
Modules
\begin_inset LatexCommand \index{Modules}
\end_inset
\begin_inset LatexCommand \label{cha:Modules}
\end_inset
\end_layout
\begin_layout Standard
gpsim has been designed to debug microprocessors.
However, microprocessors are always a part of a system.
And invariably, the bugs one often encounters are those that are a result
of interfacing with a system.
Modules provide users with a way to extend gpsim and simulate a system.
For example, the
\emph on
system
\emph default
may be a processor with a few pull up resistors and switches or it may
be a processor and an LCD display.
gpsim provides a few modules that one may use either for debugging or as
templates for creating new modules.
\end_layout
\begin_layout Standard
Modules reside in a library and are dynamically loaded with the
\emph on
module
\emph default
command.
All modules have I/O pins which can connect to other modules or processors.
Most modules provide
\emph on
attributes
\emph default
that allow the user to control a module's behavior or query its internal
state.
For example, the USART module has transmit and receive baud rate attributes
that may be configured:
\end_layout
\begin_layout LyX-Code
gpsim> U1.txbaud = 9600 # set the transmit rate
\end_layout
\begin_layout LyX-Code
gpsim> U1.rxbaud # query the receiver rate
\end_layout
\begin_layout LyX-Code
9600
\end_layout
\begin_layout Standard
The symbol command can be used to query all attributes of a module.
\end_layout
\begin_layout LyX-Code
gpsim> symbol U1.
# note the period
\end_layout
\begin_layout LyX-Code
U1 = USARTModule
\end_layout
\begin_layout LyX-Code
U1.console = false
\end_layout
\begin_layout LyX-Code
U1.crlf = true
\end_layout
\begin_layout LyX-Code
U1.loop = true
\end_layout
\begin_layout LyX-Code
U1.rx = 0
\end_layout
\begin_layout LyX-Code
U1.rxbaud = 9600
\end_layout
\begin_layout LyX-Code
U1.tx = 0
\end_layout
\begin_layout LyX-Code
U1.txbaud = 9600
\end_layout
\begin_layout LyX-Code
U1.xpos = 72.00000000000000
\end_layout
\begin_layout LyX-Code
U1.ypos = 276.0000000000000
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
Modules may provide only help which can be accessed using the help command:
\end_layout
\begin_layout LyX-Code
gpsim> help U1
\end_layout
\begin_layout LyX-Code
USARTModule
\end_layout
\begin_layout LyX-Code
no description
\end_layout
\begin_layout Standard
Well, the USART module isn't the best example here! However, a better example
is one of the USART attributes.
\end_layout
\begin_layout LyX-Code
gpsim> help U1.txbaud
\end_layout
\begin_layout LyX-Code
9600
\end_layout
\begin_layout LyX-Code
USART Module Transmitter baud rate
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Section
gpsim Modules
\end_layout
\begin_layout Standard
gpsim provides a library of useful modules for simulation.
The current version includes the following modules:
\end_layout
\begin_layout Standard
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
pushbutton
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
pullup
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
A resistor connected (nominally) to Vdd
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
pulldown
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
A resistor connected (nominally) to Vss
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
usart
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
A serial interface with a GUI terminal window
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
pulsegen
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
I2C eeprom
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
switch
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Switch, which connects two nodes together
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
and2
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
2-input logical AND gate
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
or2
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
2-input logical OR gate
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
xor2
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
2-input logical XOR gate
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
not
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Inverter (logical NOT gate)
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
led_7segments
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
A 7-segment LED digit
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
led
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
TTL377
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
A 74HC377 style 8-bit tristate latch
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Encoder
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Subsection
USART
\begin_inset LatexCommand \index{USART module}
\end_inset
\end_layout
\begin_layout Standard
The USART module is a full duplex configurable USART.
In graphics mode, the USART will display its output in a console.
In addition, the console will accept keyboard input.
\end_layout
\begin_layout Subsubsection*
Attributes
\end_layout
\begin_layout Standard
.tx - The
\emph on
.tx
\emph default
attribute is the USART transmit register.
Data written to this attribute will initiate a transmission.
The USART does not support a transmit FIFO.
\end_layout
\begin_layout Standard
.rx - The
\emph on
.rx
\emph default
attribute is the USART receiver register.
Data received by the USART is available for querying through here.
\end_layout
\begin_layout Standard
.txbaud - The
\emph on
.txbaud
\emph default
attribute specifies the transmitter baud rate.
\end_layout
\begin_layout Standard
.rxbaud - The .rxbaud attribute specifies the receiver baud rate.
\end_layout
\begin_layout Standard
.console - When set to
\emph on
true
\emph default
, the console window will display received data and will accept keyboard
entries for the transmitter.
\end_layout
\begin_layout Standard
.crlf - When set to
\emph on
true
\emph default
, carraige returns and line feeds generate new lines in the console window.
\end_layout
\begin_layout Standard
.loop - When set to true, received characters are looped back to the transmitter.
\end_layout
\begin_layout Standard
.xpos - horizontal position in breadboard window.
\end_layout
\begin_layout Standard
.ypos - vertical position in breadboard window.
\end_layout
\begin_layout Subsubsection*
I/O Pins
\end_layout
\begin_layout Standard
.TXPIN - transmit pin
\end_layout
\begin_layout Standard
.RXPIN - receiver pin
\end_layout
\begin_layout Standard
.CTS - Clear to send pin.
This can be left unconnect
\end_layout
\begin_layout Standard
.RTS - Request to send pin.
\end_layout
\begin_layout Subsection
Logic
\begin_inset LatexCommand \index{Logic}
\end_inset
\end_layout
\begin_layout Standard
The only attributes supported be the logic devices are the standard
\emph on
.xpos
\emph default
and
\emph on
.ypos
\emph default
breadboard positions.
\begin_inset Note Greyedout
status collapsed
\begin_layout Standard
FIXME There should be attributes to specify the switching characteristics.
\end_layout
\end_inset
\end_layout
\begin_layout Subsection*
and2
\begin_inset LatexCommand \index{and2}
\end_inset
- Two input AND gate
\end_layout
\begin_layout Subsubsection*
I/O pins
\end_layout
\begin_layout Standard
.in0 - First input
\end_layout
\begin_layout Standard
.in1 - First input
\end_layout
\begin_layout Standard
.out - Output
\end_layout
\begin_layout Subsection*
or2
\begin_inset LatexCommand \index{or2}
\end_inset
- Two input OR gate
\end_layout
\begin_layout Standard
.in0 - First input
\end_layout
\begin_layout Standard
.in1 - First input
\end_layout
\begin_layout Standard
.out - Output
\end_layout
\begin_layout Subsection*
xor2
\begin_inset LatexCommand \index{xor2}
\end_inset
- Two input XOR gate
\end_layout
\begin_layout Standard
.in0 - First input
\end_layout
\begin_layout Standard
.in1 - First input
\end_layout
\begin_layout Standard
.out - Output
\end_layout
\begin_layout Subsection*
not
\begin_inset LatexCommand \index{not}
\end_inset
- Inverter
\end_layout
\begin_layout Standard
.in0 - Input
\end_layout
\begin_layout Standard
.out - Output
\end_layout
\begin_layout Subsection
I2C EEPROM
\begin_inset LatexCommand \index{I2C EEPROM}
\end_inset
\end_layout
\begin_layout Standard
There are currently three I2C EEPROMs supported: I2C-EEPROM2k, I2C-EEPROM16k,
and I2C-EEPROM256K.
\begin_inset Note Greyedout
status open
\begin_layout Standard
FIXME.
Probably should have attributes for configuring the prom size.
Also, there's currently no way to query or modify the prom contents.
\end_layout
\end_inset
\end_layout
\begin_layout Subsubsection*
I/O Pins
\end_layout
\begin_layout Standard
.A0 -
\end_layout
\begin_layout Standard
.A1 -
\end_layout
\begin_layout Standard
.SCL -
\end_layout
\begin_layout Standard
.SDA -
\end_layout
\begin_layout Standard
.WP
\end_layout
\begin_layout Subsection
\begin_inset LatexCommand \label{sub:Switches-&-Resistors}
\end_inset
Switches
\begin_inset LatexCommand \index{Switches}
\end_inset
& Resistors
\begin_inset LatexCommand \index{Resistors}
\end_inset
\end_layout
\begin_layout Standard
The
\emph on
switch
\emph default
module is a model of a simple two terminal switch.
It may be controlled either from the command line or the breadboard gui.
The
\emph on
switch
\emph default
module's open and closed resistance are controlled by attributes.
Thus a two terminal resistor can be modeled as a switch that is always
closed (or open).
\end_layout
\begin_layout Subsubsection*
Attributes
\end_layout
\begin_layout Standard
.Ropen - Switch resistance in ohms when the switch is opened.
\end_layout
\begin_layout Standard
.Rclosed - Switch resistance in ohms when the switch is closed.
\end_layout
\begin_layout Standard
.state - Switch state.
When
\emph on
false
\emph default
the switch is open.
The
\emph on
.state
\emph default
attribute is writable.
\end_layout
\begin_layout Subsubsection*
I/O Pins
\end_layout
\begin_layout Standard
.A - One side
\end_layout
\begin_layout Standard
.B - The other side
\end_layout
\begin_layout Subsection
Voltage Sources
\begin_inset LatexCommand \index{Voltage Sources}
\end_inset
, Resistors
\begin_inset LatexCommand \index{Resistors}
\end_inset
, and Capacitors
\begin_inset LatexCommand \index{Capacitors}
\end_inset
\end_layout
\begin_layout Standard
The
\emph on
pullup
\emph default
and
\emph on
pulldown
\emph default
modules are two terminal devices with one terminal tied to a voltage source.
Their voltage, resistance, and pin capacitance are controllable via attributes.
\end_layout
\begin_layout Subsubsection*
Attributes
\end_layout
\begin_layout Standard
.voltage - DC voltage
\end_layout
\begin_layout Standard
.resistance - resistance in ohms between the I/O pin and the voltage source.
\end_layout
\begin_layout Standard
.capacitance - capacitance in farads between the I/O pin and ground.
\end_layout
\begin_layout Subsubsection*
I/O Pins
\end_layout
\begin_layout Standard
.pin - the only pin exposed.
\end_layout
\begin_layout Section
Third Party Modules
\end_layout
\begin_layout Standard
In addition to the standard modules, third are separately distribute gpsim
modules.
\end_layout
\begin_layout Subsection
Character LCD - HD44780
\begin_inset LatexCommand \index{HD44780}
\end_inset
\end_layout
\begin_layout Standard
This module emulates the ubiquitous HD44780 character LCDs.
\end_layout
\begin_layout Subsection
Graphic LCD - SED1530
\begin_inset LatexCommand \index{SED1530}
\end_inset
\end_layout
\begin_layout Standard
This module emulates a 100X32 pixel graphics LCD based on dual SED1350 controlle
rs.
\end_layout
\begin_layout Section
Writing new modules
\end_layout
\begin_layout Standard
A module is a library of code.
On Windows the library is a .DLL and on Unix a shared library.
There are a few details that a module must adhere to, but in general the
module has full access to gpsim's API.
\end_layout
\begin_layout Standard
The easiest way to write a new module is to start from the source code from
one of the existing modules.
For example, suppose your project produces a serial bit-stream in PPM coding
and you want to display the output during the simulation.
The external module you need is similar to the usart module but not the
same, so start by making a copy of the usart module and then modify it
to work how you need.
\end_layout
\begin_layout Standard
To be able to load your module into gpsim it needs to be in a library.
Usually you will be creating a new library just for one device, but sometimes
you'll have a few devices.
Either way, the library must declare to gpsim what devices it contains.
This is achieved with an array of Module_Types class instances, returned
to gpsim by a function named
\begin_inset Quotes eld
\end_inset
get_mod_list
\begin_inset Quotes erd
\end_inset
.
All gpsim module libraries must declare this function.
You can copy the required template from the gpsim source -- probably one
of the
\begin_inset Quotes eld
\end_inset
extras
\begin_inset Quotes erd
\end_inset
modules is slightly cleaner than the main library.
For our PPM decoder example, we might have a module_manager.cc containing
the following code:
\end_layout
\begin_layout LyX-Code
/* IN_MODULE should be defined for modules */
\end_layout
\begin_layout LyX-Code
#define IN_MODULE
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
#include
\end_layout
\begin_layout LyX-Code
#include
\end_layout
\begin_layout LyX-Code
#include "ppm.h"
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
Module_Types available_modules[] =
\end_layout
\begin_layout LyX-Code
{
\end_layout
\begin_layout LyX-Code
{ "ppm_display", "ppm_rx_iface", PpmDisplay::construct},
\end_layout
\begin_layout LyX-Code
// No more modules
\end_layout
\begin_layout LyX-Code
{ NULL,NULL,NULL}
\end_layout
\begin_layout LyX-Code
};
\end_layout
\begin_layout LyX-Code
#ifdef __cplusplus
\end_layout
\begin_layout LyX-Code
extern "C" {
\end_layout
\begin_layout LyX-Code
#endif /* __cplusplus */
\end_layout
\begin_layout LyX-Code
/*****************************************************************
\end_layout
\begin_layout LyX-Code
* get_mod_list - Report all of the modules in this library.
\end_layout
\begin_layout LyX-Code
*
\end_layout
\begin_layout LyX-Code
* This is a required function for gpsim compliant libraries.
\end_layout
\begin_layout LyX-Code
*/
\end_layout
\begin_layout LyX-Code
Module_Types * get_mod_list(void)
\end_layout
\begin_layout LyX-Code
{
\end_layout
\begin_layout LyX-Code
return available_modules;
\end_layout
\begin_layout LyX-Code
}
\end_layout
\begin_layout LyX-Code
#ifdef __cplusplus
\end_layout
\begin_layout LyX-Code
}
\end_layout
\begin_layout LyX-Code
#endif /* __cplusplus */
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Standard
This declares that this library provides one module, called ppm_display,
implemented by the C++ class PpmDisplay.
The class which implements the module must provide a static method
\begin_inset Quotes eld
\end_inset
construct
\begin_inset Quotes erd
\end_inset
to create a new instance of the class.
For example:
\end_layout
\begin_layout LyX-Code
Module * PpmDisplay::construct(const char *_new_name=0)
\end_layout
\begin_layout LyX-Code
{
\end_layout
\begin_layout LyX-Code
PpmDisplay *ppmd = new PpmDisplay(_new_name);
\end_layout
\begin_layout LyX-Code
ppmd->create_iopin_map();
\end_layout
\begin_layout LyX-Code
ppmd->create_window(_new_name);
\end_layout
\begin_layout LyX-Code
return ppmd;
\end_layout
\begin_layout LyX-Code
}
\end_layout
\begin_layout Standard
Your module will need to include stimuli for its I/O connections.
You can use the standard gpsim stimulus classes: IOPIN, io_bidirectional,
io_bidirectional_pu, io_open_collector.
In many cases, however, you will want to derive your own class from one
of them.
This will allow you to customise the actions when the node state changes.
For example:
\end_layout
\begin_layout LyX-Code
class DecoderPin : public IOPIN
\end_layout
\begin_layout LyX-Code
{
\end_layout
\begin_layout LyX-Code
private:
\end_layout
\begin_layout LyX-Code
PpmDisplay * Parent;
\end_layout
\begin_layout LyX-Code
public:
\end_layout
\begin_layout LyX-Code
DecoderPin ( PpmDisplay * parent, unsigned int b, const char * name=0
);
\end_layout
\begin_layout LyX-Code
virtual void setDrivenState(bool new_state);
\end_layout
\begin_layout LyX-Code
};
\end_layout
\begin_layout Standard
The only methods we provide here are the constructor and an overridden
\begin_inset Quotes eld
\end_inset
setDrivenState
\begin_inset Quotes erd
\end_inset
.
This is because our PPM decoder needs to be told when the input pin changes
state.
\end_layout
\begin_layout Chapter
Symbolic Debugging
\end_layout
\begin_layout Standard
gpsim maintains a symbol table.
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Chapter
Macros
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Chapter
Hex Files
\end_layout
\begin_layout Standard
The target code simulated by gpsim can be supplied by a hex file, or more
specifically an Intel Hex file.
gpsim accepts the format of hex provided by gpasm and mpasm.
The hex file does not provide any symbolic information.
It's recommended that hex files only be used if 1) you suspect there's
a problem with the way .cod files are generated by your assembler or compiler
OR 2) your assembler or compiler doesn't generate .cod files.
Also, you must supply a processor when loading hex files.
See the load command.
\end_layout
\begin_layout Chapter
The ICD- Not Supported in versions 0.21.0 and later
\end_layout
\begin_layout Standard
gpsim supports (partly) the first version of the ICD (as opposed to ICD2
(the round hockey-puck shaped one)).
\end_layout
\begin_layout Subsection*
Special configuration of the code
\end_layout
\begin_layout Standard
Read the MPLAB ICD USER's GUIDE.
\end_layout
\begin_layout Standard
Here's the short version:
\end_layout
\begin_layout Itemize
disable at least: brown out detection, low voltage programming and all code
protection.
It is probably good to turn of the watchdog too.
see the MPLAB ICD USER's GUIDE for more information.
\end_layout
\begin_layout Itemize
have a NOP as the first instruction.
\end_layout
\begin_layout Itemize
Don't touch RB6 or RB7.
\end_layout
\begin_layout Itemize
Don't use the last stack level.
\end_layout
\begin_layout Itemize
Don't use these registers and program words:
\newline
\begin_inset Tabular
\begin_inset Text
\begin_layout Standard
Processor
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Register
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
Program
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
-870/1/2
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x70, 0xBB-0xBF
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x6E0-0x7FF
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
-873/4
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x6D, 0x1fD, 0xEB-0xF0, 0x1Eb-0x1F0
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0xEE0-0xFFF
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
-876/7
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x70, 0x1Eb-0x1Ef
\end_layout
\end_inset
|
\begin_inset Text
\begin_layout Standard
0x1F00-0x1FFF
\end_layout
\end_inset
|
\end_inset
\end_layout
\begin_layout Subsection*
icdprog
\end_layout
\begin_layout Standard
Download and install icdprog.
\end_layout
\begin_layout Standard
Use icdprog to program the target with the hex file (
\emph on
icdprog mycode.hex
\emph default
).
\end_layout
\begin_layout Subsection*
ICD usage
\end_layout
\begin_layout Standard
Start gpsim like this:
\end_layout
\begin_layout Standard
\emph on
gpsim -d /dev/ttyS0 -s mycode.cod
\end_layout
\begin_layout Standard
, assuming the ICD is connected to the first serial port.
\end_layout
\begin_layout Standard
Now you can type 'icd' to see some information:
\end_layout
\begin_layout Standard
\emph on
**gpsim> icd
\newline
ICD version "2.31.00" was found.
\newline
Target controller is 16F877 rev 13.
\newline
Vdd: 5.2 Vpp: 13.3
\newline
Debug module is present
\end_layout
\begin_layout Standard
2.31 is the firmware version.
I have only tried this particular version...
\end_layout
\begin_layout Standard
You can step, reset, run, halt, set the breakpoint and read file registers.
It works both from the gui and the cli.
\end_layout
\begin_layout Subsection*
ICD TODO
\end_layout
\begin_layout Itemize
MPLAB has a setting for target cpu frequency, I have only tried with a 20MHz
crystal, so there may be adjustments to be made to the serial port timeout
settings in gpsim.
\end_layout
\begin_layout Itemize
The source, disassembly, watch, symbol and RAM windows works.
And the rest doesn't.
I guess the breadboard should be able to work at least for the pic, but
it doesn't.
\end_layout
\begin_layout Itemize
eeprom support
\end_layout
\begin_layout Itemize
modifying data
\end_layout
\begin_layout Itemize
Fix the UI to give more feedback about what's happening during long delays.
\end_layout
\begin_layout Itemize
Better error detection.
gpsim doesn't always see that the target is not functional.
\end_layout
\begin_layout Chapter
Examples
\end_layout
\begin_layout Standard
The
\emph on
examples/
\emph default
subdirectory contains several examples.
The
\emph on
examples/projects/
\emph default
subdirectory demonstrate sample projects that can serve as templates for
new projects.
In addition, the
\emph on
examples/modules
\emph default
subdirectory contains several examples illustrating how to use gpsim's
various modules.
Finally, as described in chapter
\begin_inset LatexCommand \ref{cha:Regression-Tests}
\end_inset
, gpsim's regression tests illustrate many powerful debugging techniques
that have not been fully documented.
\end_layout
\begin_layout Subsubsection*
usart_gui example
\end_layout
\begin_layout Standard
Each example contains a brief
\emph on
README
\emph default
explaning its purpose.
For example, the
\emph on
README
\emph default
for the
\emph on
usart_gui
\emph default
example in the
\emph on
examples/modules
\emph default
directory contains
\end_layout
\begin_layout LyX-Code
The tests the USART module with the GUI fix.
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
The code for a 16f628 PIC is used.
The code first transmits a string of
\end_layout
\begin_layout LyX-Code
characters, which are instructions to the user, to the USART module which
\end_layout
\begin_layout LyX-Code
will then be displayed on its GUI.
This verifies that the USART can receive
\end_layout
\begin_layout LyX-Code
serial data.
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
When the focus is on the USART GUI window, characters typed on the keyboard
\end_layout
\begin_layout LyX-Code
are sent from the USART to the PIC and then retransmitted from the PIC back
\end_layout
\begin_layout LyX-Code
to the USART.
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
If all works, the typed characters will be displayed in the GUI text window
\end_layout
\begin_layout LyX-Code
of the USART.
Both transmit and receive must be functioning for this to
\end_layout
\begin_layout LyX-Code
happen.
\end_layout
\begin_layout Standard
\emph on
Fixme
\emph default
- we really need to document all of the examples!
\end_layout
\begin_layout Chapter
Regression Tests
\begin_inset LatexCommand \label{cha:Regression-Tests}
\end_inset
\end_layout
\begin_layout Standard
Starting with version 0.22.0, gpsim distributes regression tests.
The purpose of a regression test is to validate correctness.
The tests are designed to exercise many of the aspects of gpsim and gpsim's
modules.
While designed primarily for developers though, the regression tests also
serve as a rich source of examples.
There are many features gpsim's developers will tuck away into a regression
test and fail to document!
\end_layout
\begin_layout Chapter
Theory of Operation
\end_layout
\begin_layout Standard
This section is only provided for those who may be interested in how gpsim
operates.
The information in here is 'mostly' accurate.
However, as gpsim evolves so do the details of the theory of operation.
Use the information provided here as a high level introduction and use
the (well commented :]) source to learn the details.
\end_layout
\begin_layout Section
Background
\end_layout
\begin_layout Standard
gpsim is written mostly in C++.
Why? Well the main reason is to easily implement a hierarchical model of
a pic.
If you think about a microcontroller, it's really easy to modularize the
various components.
C++ lends itself well to this conceptualization.
Furthermore Microchip, like other microcontroller manufacturers, has created
families of devices that are quite similar to one another.
Again, the C++ provides 'inheritance' that allows the relationships to
be shared among the various models of pics.
\end_layout
\begin_layout Section
Instructions
\begin_inset LatexCommand \index{instructions}
\end_inset
\end_layout
\begin_layout Standard
There's a base class for the 14-bit instructions (I plan to go one step
further and create a base class from which all pic instructions can be
derived).
It primarily serves two purposes: storage that is common for each instruction
and a means for generically accessing virtual functions.
The common information consists of a name - or more specifically the instructio
n mnemonic, the opcode, and a pointer to the processor owning the instruction.
Some of the virtual functions are 'execute' and 'name'.
As the hex file is decoded, instances of the instructions are created and
stored in an array called program_memory.
The index into this array is the address at which the instruction resides.
To execute an instruction the following code sequence is invoked:
\end_layout
\begin_layout Quotation
program_memory[pc.value]->execute();
\end_layout
\begin_layout Standard
which says, get the instruction at the current program counter (pc.value)
and invoke via the virtual function execute().
This approach allows execution break points to be easily set.
A special break point instruction can replace the one residing in the program
memory array.
When 'execute' is called the break point can be invoked.
\end_layout
\begin_layout Section
General File Registers
\begin_inset LatexCommand \index{registers}
\end_inset
\end_layout
\begin_layout Standard
A file register is simulated by the 'file_register' class.
There is one instance of a 'file_register' object for each file register
in the PIC.
All of the registers are collected together into an array called 'registers'
which is indexed by the registers' corresponding PIC addresses.
The array is linear and not banked like it is in the PIC.
(Banking is handled during the simulation.)
\end_layout
\begin_layout Section
Special File Registers
\end_layout
\begin_layout Standard
Special file registers are all of the other registers that are not general
file registers.
This includes the core registers like status and option and also the peripheral
registers like eeadr for the eeprom.
The special file registers are derived from the general file registers
and are also stored in the 'registers' array.
There is one instance for each register - even if the register is accessible
in more than one bank.
So for example, there's only one instance for the 'status' register, however
it may be accessed through the 'registers' array in more than one place.
\end_layout
\begin_layout Standard
All file registers are accessed by the virtual functions 'put' and 'get'.
This is done for two main reasons.
First, it conveniently encapsulates the breakpoint overhead (for register
breakpoints) in the file register and not in the instruction.
Second, and more important, it allows derived classes to implement the
put and get more specifically.
For example, a 'put' to the indf register is a whole lot different than
a put to the intcon register.
In each case, the 'put' initiates an action beyond simply storing a byte
of data in an array.
It also allows the following code sequence to be easily implemented:
\end_layout
\begin_layout LyX-Code
movlw trisa ;Get the address of tris
\end_layout
\begin_layout LyX-Code
movwf fsr
\end_layout
\begin_layout LyX-Code
movf indf,w ;Read trisa indirectly
\end_layout
\begin_layout Section
Example of an instruction
\end_layout
\begin_layout Standard
Here's an example of the code for the movf instruction that illustrates
what has been discussed above.
Somewhere in gpsim the code sequence:
\end_layout
\begin_layout LyX-Code
program_memory[pc.value]->execute();
\end_layout
\begin_layout Standard
is executed.
Let's say that the pc is pointing to a movf instruction.
The ->execute() virtual function will invoke MOVF::execute.
I've added extra comments (that aren't in the main code) to illustrate
in detail what's happening.
\end_layout
\begin_layout LyX-Code
void MOVF::execute(void)
\end_layout
\begin_layout LyX-Code
{
\end_layout
\begin_layout LyX-Code
unsigned int source_value;
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// All instructions are 'traced' (discussed below).
It's sufficient
\end_layout
\begin_layout LyX-Code
//to only store the opcode.
However, even this may be unnecessary since
\end_layout
\begin_layout LyX-Code
//the progam counter is also traced.
Expect this to disappear in the
\end_layout
\begin_layout LyX-Code
//future...
\end_layout
\begin_layout LyX-Code
trace.instruction(opcode);
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// 'source' is a pointer to a 'file_register' object.
It is initialized
\end_layout
\begin_layout LyX-Code
//by reading the 'registers' array.
Note that the index depends on the
\end_layout
\begin_layout LyX-Code
//'rp' bits (actually just one bit) in the status register.
Time is
\end_layout
\begin_layout LyX-Code
// saved by caching rp as opposed to decoding the status register.
\end_layout
\begin_layout LyX-Code
source = cpu->registers[cpu->rp | opcode®_IN_INSTRUCTION_MASK];
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// We have no idea which register we are trying to access and how it
\end_layout
\begin_layout LyX-Code
//should be accessed or if there's a breakpoint set on it.
No problem,
\end_layout
\begin_layout LyX-Code
//the virtual function 'get' will resolve all of those details
\end_layout
\begin_layout LyX-Code
// and 'do the right thing'.
\end_layout
\begin_layout LyX-Code
source_value = source->get();
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// If the destination is W, then the constructor has already initialized
\end_layout
\begin_layout LyX-Code
//'destination'.
Otherwise the destination and source are the same.
\end_layout
\begin_layout LyX-Code
if(opcode&DESTINATION_MASK)
\end_layout
\begin_layout LyX-Code
destination = source; // Result goes to source
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// Write the source value to the destination.
Again, we have no idea
\end_layout
\begin_layout LyX-Code
// where the destination may be or
\end_layout
\begin_layout LyX-Code
// or how the data should be written there.
\end_layout
\begin_layout LyX-Code
destination->put(source_value);
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// The movf instruction will set Z (zero) bit in the status register
\end_layout
\begin_layout LyX-Code
//if the source value was zero.
\end_layout
\begin_layout LyX-Code
cpu->status.put_Z(0==source_value);
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
// Finally, advance the pc by one.
\end_layout
\begin_layout LyX-Code
cpu->pc.increment();
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
}
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout Section
Trace
\end_layout
\begin_layout Standard
Everything that is simulated is traced -
\emph on
all
\emph toggle
of the time.
The trace buffer is one huge circular buffer of integers.
Information is or'ed with a trace token and then is stored in the trace
buffer.
No attempt is made to associate the items in the trace buffer while the
simulator is simulating a PIC.
Thus, if you look at the raw buffer you'll see stuff like: cycle counter
= ..., opcode fetch = ..., register read = ..., register write = ..., etc.
However, this information is post processed to ascertain what happened
and when it happened.
It's also possible to use this information to undo the simulation, or in
other words you can step backwards.
I don't have this implemented yet though.
\end_layout
\begin_layout Section
Breakpoints
\end_layout
\begin_layout Standard
Breakpoints fall into three categories: execution, register, and cycle.
\end_layout
\begin_layout Subsubsection
Execution:
\end_layout
\begin_layout Standard
For execution breakpoints a special instruction appropriately called 'Breakpoint
_Instruction' is created and placed into the program memory array at the
location the break point is desired.
The original instruction is saved in the newly created breapoint instruction.
When the break point is cleared, the original instruction is fetched from
the break point instruction and placed back into the program memory array.
\end_layout
\begin_layout Standard
Note that this scheme has zero overhead.
The simulation is only affected when the breakpoint is encountered.
\end_layout
\begin_layout Subsubsection
Register:
\end_layout
\begin_layout Standard
There are at least four different breakpoint types that can be set on a
register: read any value, write any value, read a specific value, or write
a specific value.
Like the execution breakpoints, there are special breakpoint registers
that replace a register object.
So when the user sets a write breakpoint at register 0x20 for example,
a new breakpoint object is created and insert into the file register array
at location 0x20.
When the simulator attempts to access register location 0x20, the breakpoint
object will be accessed instead.
\end_layout
\begin_layout Standard
Note that this scheme too has zero overhead, accept when a breakpoint is
encountered.
\end_layout
\begin_layout Subsubsection
Cycle:
\end_layout
\begin_layout Standard
Cycle breakpoints allow gpsim to alter execution at a specific instruction
cycle.
This is useful for running your simulation for a very specific amount of
time.
Internally, gpsim makes extensive use of the cycle breakpoints.
For example, the TMR0 object can be programmed to generate a periodic cycle
break point.
\end_layout
\begin_layout Standard
Cycle break points are implemented with a sorted doubly-linked list.
The linked list contains two pieces of information (besides the links):
the cycle at which the break is to occur and the call back function
\begin_inset Foot
status collapsed
\begin_layout Standard
A call back function is a pointer to a function.
In this context, gpsim is given a pointer to the function that's to be
invoked (called) whenever a cycle break occurs.
\end_layout
\end_inset
that's to be invoked when the cycle does occur.
The break logic is extremely simple.
Whenever the cycle counter is advanced (that is, incremented), it's compared
to the next desired cycle break point.
If there's NO match, then we're done.
So the overhead for cycle breaks is the time required to implement a comparison.
If there IS a match, then the call back function associated with this break
point is invoked and the next break point in the doubly-linked list serves
as the reference for the next cycle break.
\end_layout
\begin_layout Chapter*
COPYING
\end_layout
\begin_layout Standard
The document is part of gpsim.
\end_layout
\begin_layout Standard
gpsim is free software; you can redistribute it and/or modify it under the
terms of the
\begin_inset LatexCommand \index{GNU}
\end_inset
GNU General Public
\begin_inset LatexCommand \index{License}
\end_inset
License as published by the Free Software Foundation; either version 2,
or (at your option) any later version.
\end_layout
\begin_layout Standard
gpsim is distributed in the hope that it will be useful, but WITHOUT ANY
\begin_inset LatexCommand \index{NO WARRANTY}
\end_inset
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
\end_layout
\begin_layout Standard
You should have received a copy of the GNU General Public License along
with gpsim; see the file COPYING.
If not, write to the Free Software Foundation, 59 Temple Place - Suite
330, Boston, MA 02111-1307, USA.
\end_layout
\begin_layout Standard
\start_of_appendix
\begin_inset LatexCommand \printindex{}
\end_inset
\end_layout
\end_body
\end_document