Tuesday, July 3, 2012
DEBUG16 - 65816 Disassembler and Trace Utility
Now that my Replica 1 is running with a 65816 processor, I wanted to try a program that was more substantial than the small demo programs I had tried.
The manual Programming the 65816 Including the 6502, 65C02 and 65802 available from The Western Design Center has a chapter describing and giving the source code for a program called DEBUG16. The program can perform disassembly and instruction tracing of 65816 machine code. It is about 1700 lines of assembler code. I thought I would try porting it to my Replica 1 using the CC65 assembler.
The first step was copying and pasting the assembler listings from the PDF file for the manual. That gave me a text file with the assembler listing of the original code.
Then I stripped out the the listing portion of the file to generate an assembler source file. It needed some changes to port it to the CC65 assembler, due to differences in it's assembler directives. After making a number of changes I had a file which would assemble and I could compare to the original listing.
It turns out there are a number of typographical as well as logic errors in the listing in the manual. A Google search shows at least one other person tried getting this code to work (about 10 years ago) and noticed the errors. After some detective work I think I was able to determine what the errors were, and obtained a file which could successfully build and generated the same code as in the original listing.
The original code was intended for running on an Apple //e with a 65816 card. The Apple specific code (e.g. for input and output) was clearly indicated in the source. I made the necessary changes to the input/output code to work on the Replica 1.
Next, I wrote a small main routine to call the LIST routine which disassembles 65816 code (I had it disassemble itself). Somewhat to my surprise, it actually produced reasonable output on the first try. I found a few errors in the code, such as an instruction or two that were disassembled incorrectly. I fixed that, although there may be some issues with a few instructions. It is at least correct enough for 6502 code that I can disassemble my entire JMON program and get the same output as from the 6502 disassembler that I wrote.
A sample of the output is shown here:
00:6013 08 PHP
00:6014 18 CLC
00:6015 FB XCE
00:6016 08 PHP
00:6017 0B PHD
00:6018 F40000 PEA $0000
00:601B 2B PLD
00:601C C220 REP #$20
00:601E E210 SEP #$10
00:6020 649D STZ $9D
00:6022 A580 LDA $80
00:6024 8584 STA $84
00:6026 A682 LDX $82
00:6028 8686 STX $86
00:602A A780 LDA [$80]
00:602C AA TAX
00:602D 8687 STX $87
00:602F 207762 JSR $6277
00:6032 204760 JSR $6047
00:6035 208F60 JSR $608F
00:6038 20CD61 JSR $61CD
00:603B 9005 BCC $6042
00:603D 20D462 JSR $62D4
00:6040 80DA BRA $601C
00:6042 2B PLD
00:6043 28 PLP
00:6044 FB XCE
00:6045 28 PLP
00:6046 60 RTS
00:6047 201D62 JSR $621D
00:604A E230 SEP #$30
00:604C A000 LDY #$00
00:604E A586 LDA $86
00:6050 20F761 JSR $61F7
The other function of DEBUG16 is a trace facility that allows stepping through 65816 code and seeing the current value of registers and disassembled instructions. This code has significantly more dependencies on Apple II functions and is harder to port. I spent some time on it, but it is tricky to debug the code as the 65816 changes in and out of native mode and 8/16 bit data and index register modes, and existing debug tools I have like Krusader's mini-monitor will not work in the 65816's native mode. I set this aside to look at later.
So the current status is that the disassembly routine is working well although it has not been tested exhaustively for all 65816 instructions. The trace function has not yet been tested or debugged. The code is available here.
While I was playing with the 65816, I took the time to make a little 65816 quick reference document. It can be printed on one double-sides page, and lists the register model, new addressing modes and instructions, and some other specifics of the 65816. It is most useful if you are familiar with the 6502 and are looking for a quick summary of what is added by the 65816. You can get it here in both OpenOffice.org and PDF formats.
Nice work! Will you announce on 6502.org?
ReplyDeleteYes, I'll do that.
ReplyDeleteGood job on the porting of the debugger and on the 65C816 reference card. One thing to note: the STP and WAI instructions are also in the WDC version of the 65C02, so they aren't new to the '816.
ReplyDeleteI've updated with a note that the STP and WAI are supported on the WDC 65C02.
ReplyDelete