HC12: Running NoICE for the First Time
In most cases, you will be debugging programs at source level, using symbols rather than addresses.
However, as an introduction to NoICE we recommend that you get some experience with the user interface first.
The first time you run NoICE after installing it, a dialog will appear asking
you to choose a method of communications. For this section of the tutorial, we select
"Simulator". (Some NoICE target processors, such as Z80 and 6502, do not have a
simulator option. For these, you may wish to select "Dummy Target". This will
let you use many NoICE commands, but will not allow you to execute programs.)
- If you need to come back to this dialog, select "Options" from the NoICE
main menu, then select "Target Communications".
- Interface: we have selected "68HC12 simulator"
- Processor Type: whe simulator supports the standard HC12/HCS12 instruction
set, and the extended instruction set of the S12X. In this example, we will
use only HCS12 instructions.
- Use PPAGE: the 68HC12 can use PPAGE memory paging to get beyond 64K. We
won't use this feature in this example
- Use Simulated UART: can't do printf unless you have a UART.
By default, the simulator places the UART at
the addresses appropriate for most non-S 68HC12 parts, such as the A4, DT128 etc.
Our example will be for a MC9S12DP256, using SCI0 as the serial port, so these
are not the correct addresses.
Consulting the datasheet for the MC9S12DP256, we find that SCI0 status register SCISR1
is at address 0xCC and data register SCIDRL is at address 0xCF. Change the addresses
as indicated. The TxReady and RxReady masks are correct as is, since the SCI register
layout is the same regardless of the location of the SCI.
The UART address is important during simulation only insofar as you will need to
make sure that you compile for the correct target in a later section of the tutorial.
Don't worry, we will remind you.
Press "OK" in the Target Communications dialog, and NoICE will show an initial
display like that shown below. If you exit NoICE and come back in, you will
return right here.
Unlike a real 68HC12, the simulator initializes all memory to zeros. Since the
reset vector contains 0000, that is where PC starts out. NoICE disassembles from
the PC, showing a bunch of BGND instructions - op-code zero.
When NoICE starts up, it will disassemble instructions beginning at the initial PC address. If you
are using the serial monitor, PC will be set to whatever value the monitor sets it to. If you are
using BDM or one of the other built-in interfaces, PC may be set to the contents of the reset
vector, or it may contain a garbage value. You can disassemble at any address by selecting View,
Disassemble At..., and entering an address. Or use the "U" command in the command edit box in
the NoICE toolbar. To continue disassembly, just click in the disassembly window and press the
Memory Edit: Click on the "Memory" tab near the bottom of the NoICE screen.
Enter the address 2000 and press the "Read" button or the Enter key.
NoICE will show the contents of memory in hex and ASCII.
To change the contents of memory, click on a byte and type hex characters: 55, 66, 77 in
the screenshot above. Changed bytes are shown in red.
To edit the ASCII, click on a character in the ASCII field and type the desired characters.
Values are written to the target as you change each byte.
Note that the memory window may not be suitable for use on I/O addresses, as extra reads
and writes of I/O locations may cause undesired actions.
In addition to the Memory tab, you can edit memory using the EDIT, IN, and OUT commands.
EDIT is most useful in conjunction with symbols and datatypes. IN and OUT are designed for
access to I/O devices.
NoICE help on the Memory View
NoICE help on EDIT
NoICE help on DUMP
NoICE help on IN and OUT
Disassembly: We can view our changes to memory in the disassembly window by either
Selecting "View", "Disassemble At..." from the menu
Clicking in the edit box on the Toolbar and typing the command "U 2000" and either
pressing the "OK" button or the Enter key.
Either way, the result is some not very useful instructions
You will normally develop your code using an assembler or compiler.
However, NoICE includes a simple assembler so that you can enter assembly programs
directly into RAM. This is useful for patching programs, and for entering short test sequences.
Select "Memory", "Assemble...". Then enter the address and instructions.
Let's try a simple example: a program that increments a register and loops.
You can press "Assemble" after entering each instruction, or just use the Enter key.
Use the disassembly feature to see the results of your handiwork.
The top window of the NoICE screen shows the values of the processor registers.
You can click on a register to change its value. Or select "Processor",
If you would rather type than click, you can avoid the dialog by typing
R PC 2000
in the command edit box in the toolbar.
Note that the disassembly line at address 2000 shows a yellow arrow indicating
that the PC points here.
Press the F11 function key, or click the Step Into button on the toolbar. PC
changes to 2002, A changes to 5, and the PC arrow in the disassembly window moves.
Note that the PC and A are shown in red to
indicate that they have changed.
Press F11 again. PC changes to 2003, and A increments to 6.
You can continue stepping around the loop until you get bored.
Double-click on the address (2005) to the left of the INX instruction. A red target
appears, indicating a breakpoint.
Now press F5, or the "Go" button on the toolbar. The
program stops almost immediately at the breakpoint. A has a value of 0, having
incremented until overflow.
Press F5 or click Go again. The program again stops at the breakpoint, but X has
NoICE help on Breakpoints
Remove the breakpoint by double-clicking on address 2005. Press F5 or click Go to
let the program run free.
Note that the Go button shows as pressed and the title bar shows "running".
Press the Go button again to stop the program. Or use the "Halt" command.
Loading a hex File:
Of course, you would probably prefer to use a C compiler or at least a decent assembler.
Our next step is to load a Motorola S-record file. You can get our sample
Select "File", "Load..." from the menu, or press the "bit funnel" on the toolbar.
Then select the file. Don't worry about any of the other settings in the dialog.
This file contains an S9 record that specifies the starting address.
When NoICE reads this record, it sets PC and disassembles from this location.
Some assemblers and compilers set the S9 address at zero. In this case, you
will need to set PC yourself.
This is a more interesting bit of code to step around in.
NoICE help on loading files
Continue the tutorial with Compiling for Debugging
Continue the tutorial with Connecting to hardware