When a programmer writes an assembly language program instead of directly referring to a memory address over and over again they use a symbolic name instead. For example, instead of always directly hard-coding $C000 everywhere to read the keyboard they would instead write:
ORG $300
KEYBOARD EQU $C000
300:AD 00 C0 .1 LDA KEYBOARD
303:10 FB BPL .1
305:8D 00 04 STA $0400
306:60 RTS
Let's try this out in the debugger. Make sure AppleWin is running. Press F2 (to reboot), then Ctrl-F2 (to break), and F7 (to enter the debugger.) If you don't want to type in the following hex code, you can select it, copy it (Ctrl-C), and paste it into the Debugger console (Ctrl-V).
300:AD 00 C0 10 FB 8D 00 04 60
300L
Press F7 to exit the debugger, then type:
HOME:CALL 768
Press Enter. The emulated computer will wait for your to press a key and then echo it in the top left.
When debugging assembly programs since you typically don't have the source file availabe you can tell the debugger how to interpret a memory address as a variable name or symbol. A symbol is the symbolic name and the address assigned to it.
AppleWin supports loading of the assemblers ACME, and Merlin's symbol tables -- a collection of symbols, one per line, organized and collectively called a symbol table. The semi-colon is a comment-till-end-of-line. The file format per line is: ADDRESS SYMBOL
e.g.
; IO Map
C000 KEYBOARD
There are 9 symbol tables to help organize "modules"; each symbol table individually can be turned off/on independently.
MAIN APPLE2E.SYM BASIC A2_BASIC.SYM ASM A2_ASM.SYM User1 A2_USER1.SYM User2 A2_USER2.SYM Src1 A2_SRC1.SYM Src2 A2_SRC2.SYM DOS33 A2_DOS33.SYM PRODOS A2_PRODOS.SYM
On startup the debugger reads 3 symbol tables by default: Main, Basic, User1.
Looking up symbols is easy. If you can't remember an address of a symbol, or the reversse -- can't remember the symbol for an address -- you can use the following symbol commands: (#### referes to either a hex address or a symbolic name)
Command |
Effect |
SYM |
Display the number of symbols in the Main, User, and Source symbol tables. |
SYM #### |
Look-up the Symbol or Address, and display which Symbol Table it is in. |
SYMUSER LOAD |
Reloads the User Symbol Table: A2_USER1.SYM |
SYMUSER CLEAR |
Clears the User Symbol Table from RAM. |
SYMMAIN #### |
Look-up only in the Main symbol table. |
SYMUSER #### |
Look-up only in the User symbol table. |
SYMSRC #### |
Look-up only in the Source symbol table. |
SYM name = #### |
Add (or update) a symbol in the User table with the new Address. |
SYM ! name |
Remove a symbol from the User table. |
MEB symbol ## |
Set memory (at the symbol Address) to the 8-Bit (byte) Value. |
MEW symbol #### |
Set memory (at the symbol Address) to the 16-Bit (word) Value. |
E16 symbol #### |
Alias for EW. |
Examples:
Input |
Effect |
SYM |
Displays number of symbols in the Main, User, and Source tables. |
SYMMAIN CLEAR |
Clears the main symbol table!! |
SYMMAIN LOAD APPLE2E.SYM |
Reloads the main symbol table. |
SYM FA62 |
Look up the Address $FA62 (RESET). |
SYM HOME |
Look up the Symbol Home ($FC58). |
SYM LIFE = 300 |
Define a new user symbol, called “Life” at Address $0300. |
MEB LIFE 64 |
Set 8-Bit variable (@ $0300)“Life” to 100 (decimal). |
MEW LIFE 3E8 |
Set 16-Bit variable (@ $0300)“Life” to $3E8 = 1000 (decimal). |