| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Code based breakpoints using ca65 and VICE
Recent discussions about debugging etc made me do this, much like Doynax's stuff:
Macro for ca65:
.macro breakpoint name
.ident (.concat("br_", .string(name))):
.export .ident(.concat("br_", .string(name)))
.endmacro
Link line in your Makefile:
ca65 -C link -m map -Ln symbols $(OBJS) && sed 's/al [0-9A-F]* \.br_\([a-z]*\)/\0\nbreak \.br_\1/' < symbols > symbols2
Basically it tells ca65 to emit all labels into a file called symbols. The sed-script then locates all symbols starting with br_ and adds a breakpoint command after it.
To run in VICE:
x64 -moncommands symbols2 whateva.d64
This enables you to add breakpoints directly into your sourcecode like:
breakpoint flashcolors
inc $d020
jmp *-3
Have fun with future debugging! :)
|
|
... 27 posts hidden. Click here to view all posts.... |
| |
doynax Account closed
Registered: Oct 2004 Posts: 212 |
Quote: Well, not if I want to "inject" values into the KickAss script/macro code from the environment/command line - the problem is merely how to reference such values from within KickAss, e.g. using a getCommandLineArgument function or something of the like...
/Dragnet
As I understand it KickAss exposes a full Java VM, so you should be able to SET a variable in your batch script just call System.getenv().get("BREAKPOINTS").
Or something along those lines anyway, though to be honest I have as little experience with Java as with KickAss. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
No, Kick Assembler has a script language that is working much like java (but it isn't java). So Dragnet is right, a getCommandLineArgument function would be nice. I will put it on the todo list. However, a getEnvironmentVar() would also do the trick. |
| |
Dragnet
Registered: Nov 2006 Posts: 16 |
Quote: No, Kick Assembler has a script language that is working much like java (but it isn't java). So Dragnet is right, a getCommandLineArgument function would be nice. I will put it on the todo list. However, a getEnvironmentVar() would also do the trick.
I'm probably opening up a can of worms here and being *very* nit-picking, I know, but using environment variables like this is in my humble view something not to do in the general case; here, however, the effect is arguably the same since the environment var can be set from the .bat script as well, but you are in effect forcing use of the Singleton pattern (blah blah...) instead of letting the user decide which instance (= values) to use (blah blah)... 8^)
So, to make a long boring story short, Slammer: do the getCommandLineArgument method first, then and only then consider the environment thing... How many lines of code will it take to implement in KickAss/Java - 10, max? :)
Regards /Dragnet |
| |
Mr. SID
Registered: Jan 2003 Posts: 424 |
You could just use k2asm:
ldx #$00
{
lda text,x
beq _break
sta $0400,x
inx
bne _cont
}
rts
text:
.encoding "screencodes.enc"
#pybegin
import os
print '.enc "ASSEMBLED BY USER ' + os.getenv('USER').upper() + '",0'
#pyend
It also allows access to the commandline options, but you need to run the preprocess manually for that, I guess.
The possibilities are endless, if you actually have a full language available. There's a python library for everything... |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Then again... Any script language could easily make some sort of pre parsing of any text file, before this text file is sent to an assembler. What is so great about having it "in" the assembler itself? It is still executed in a completely separate pass, before any labels are resolved and so on, isn't it? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I thinks it's a great advantage to be able to write sine curves and small graphic converters in the middle of your sourcefile.
I guess k2asm does it by a prepass (but im only guessing) while Kick Assembler assembles both the script and the Assembler commands together. The strength of the ladder is that the script and the asm code can interact both ways.
Notice that Mr. Sid didn't solve the original problem (generating breakpoints). In the Kick Assembler example it was done by:
.eval file.writeln("break " + toHexString(*))
where the * refers to the current memory position, this couldn't have been done in a prepass.
However, Including a preparse script in an assembler is a cool thing, relative to no script, since it makes people aware of the of the advantages of scripting.
|
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
@Slamsky: Just to clarify, I was referring to k2asm in my post..
...and now I just implemented some shit so I can just write ".bpc("if .A == $83")" in my code, and the VICE monitor will break on this line, if the specified condition holds true (if register A is equal to $83 at that point in the program). Very nice. :) If I just write ".bp", it will break unconditionally on this line.
I am using DreamAss for the current project. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Dragnet: KickAssembler now supports setting variables from the commandline. The are available from the script through the cmdLineVars hashtable. |
| |
Digger
Registered: Mar 2005 Posts: 437 |
That macro would be super handy:
.bpc("if .A == $83")
Is is possible to do it with Vice and KickAss?
As far as I got up to, I was able to generate the breakpoints file and then manually type in the monitor:
break 8800 if .A == $83
But that's lame ;-)
I have this complex routine that fails at one point and I need to track exactly that condition have you got any other suggestions?
I want to use the condition to stop and step the code exactly when it happens. |
| |
Digger
Registered: Mar 2005 Posts: 437 |
Here's the macro for KickAss and VICE (thx Frantic):
.macro bpc(condarg) {
.eval brkFile.writeln("break " + toHexString(*) + " " + condarg)
}
Example:
.var brkFile = createFile("breakpoints.txt")
:bpc("if .A == $83")
Will stop but only if A is $83.
Of course VICE has to be launched with:
-moncommands breakpoints.txt
Happy debugging :) |
Previous - 1 | 2 | 3 | 4 - Next |