Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > Code based breakpoints using ca65 and VICE
2009-08-06 07:54
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....
 
2009-08-13 13:19
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.
2009-08-13 14:40
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.
2009-08-13 18:16
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
2009-08-14 06:14
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...
2009-08-14 07:13
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?
2009-08-14 10:18
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.
2009-08-14 11:03
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.
2009-09-16 06:21
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.
2014-02-15 21:45
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.
2014-02-23 18:25
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
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
zscs
macx
leonofsgr/Singular C..
LordCrass
Guests online: 90
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 No Listen  (9.6)
2 Layers  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top Organizers
1 Burglar  (9.9)
2 Sixx  (9.8)
3 hedning  (9.7)
4 Irata  (9.7)
5 Tim  (9.7)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.043 sec.