| |
Slammer
Registered: Feb 2004 Posts: 416 |
Kick Assembler Thread 2
The previous thread took a little long to load, so this is a new fresh one.. |
|
... 592 posts hidden. Click here to view all posts.... |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I Just tried it and it works fine here. My guess is that you define the macro+constant inside one scope and execute your macro outside the scope. Eg. if you start you system.asm file with a .filenamespace directive.
|
| |
McKrackeN
Registered: Feb 2011 Posts: 20 |
Yes!! That's it!! Thanks for your help and for this amazing compiler!! |
| |
TWW
Registered: Jul 2009 Posts: 543 |
How would I go about doing a:
.fill 256,invert(data.get(i))
i.e. invert the data filled into memory on the fly? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Suppose by invert you mean exclusive or you can:
.fill 256,data.get(i)^$ff |
| |
chatGPZ
Registered: Dec 2001 Posts: 11293 |
i found this bug:
test1.asm:
.if (1 == 1) {
.import source "test2.asm"
}
test2.asm can be whatever (even empty file)
assembling results in the following error:
.if (1 == 1) {
.import source "test2.asm"
^
Error: Unknown import type 'source'
at line 3, column 5 in test1.asm
additional question: if there are labels defined in test2.asm, then how do i export them outside the scope of the if statement? (i find it really super useless and annoying that if statements have their own scope to be honest, it effectively prevents me from being able to use them properly :/)
eg i am used to do stuff like this:
.if testing = 1
screen = $0400
chars = $0800
.else
screen = $e400
chars = $e800
.endif
how do you do this in kickass? (assuming there are many more such labels, replacing them all by a function is really not an option)
|
| |
TWW
Registered: Jul 2009 Posts: 543 |
Yepp, that's exactly what I ment. Thanx Slammer! |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I see your problem. You can't use the .import source directive this way, it can't be nested inside a .for or an .if. The reason is that the .import source directive is evaluated in a pre parse that collects pseudocommands, macros, functions, etc so you can use them in the evaluation, but the error message is wrong. Should be something like 'Cant use an import source directive here'.
If you are importing libraries and only want to import them once, then use the .importonce directive instead.
btw. booleans are implemented so you can do: .if (true) { ..}
----
About labels/Constants/Variables:
Constants: Is defined like '.const myConst=25' and can only be accessed after they are defined. Constants can't change values.
Variables: Is defined like '.var myVar=true' and works like constants. The only difference is that you can change the value of a variable. e.g.: '.eval myVar=false'
Labels: Is defined like 'myLabel1:' or '.label myLabel2="HelloWorld" and can be accessed before they are declared (Note that they don't necessarily have to be numbers). Labels can't change values.
Now back to your question. To do a test setup like the one you describe you can do it in two ways. The first way defines your constants in a really compact way:
// Define Mode
.const TEST = true
// Define Data
.const screen = TEST ? $0400 : $e400
.const chars = TEST ? $0800 : $e800
Another way, that keeps the test setup more separated from the normal setup, is to define the datafields as variables and assign them insides ifs:
// Define Mode
.const TEST = true
// Define Data
.var screen .var chars
.if (TEST) {
.eval screen = $0400
.eval chars = $0800
} else {
.eval screen = $e400
.eval chars = $e800
} |
| |
chatGPZ
Registered: Dec 2001 Posts: 11293 |
Quote:I see your problem. You can't use the .import source directive this way, it can't be nested inside a .for or an .if. The reason is that the .import source directive is evaluated in a pre parse that collects pseudocommands, macros, functions, etc so you can use them in the evaluation, but the error message is wrong. Should be something like 'Cant use an import source directive here'.
If you are importing libraries and only want to import them once, then use the .importonce directive instead.
urks :( i am selectively including other sourcefiles there, depending on some other settings (ie, its not an include-guard). bummer, that will be tricky to solve :/ |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I once considered making a set preprocessing commands so you could do things like this, but I guess it will be really confusing to have two if commands, two var commands, etc. And I guess the .importonce directive covers 99% of the needs.
Dependent on how complex you includes are, there might be a hack. Since normal directives aren't evaluated during the preprossing pass, you can't create normal .var's or .const's to use in the '.import source' directive.. However, you can give variables to the assembler by the command line and use these as the include filename. Create an empty file to include, if you don't want to include anything..
Eg:
--- Commandline ---
java -jar KickAss.jar mySource.asm :loader="irqloader.asm"
--- mySource.asm ----
.import source cmdLineVars.get("loader")
NB. Its only the .import source directive that is effects by this issue. Other imports can be placed inside if's |
| |
Norrland
Registered: Aug 2011 Posts: 14 |
I'm trying to convert from 64tass-religion to KickAss-religion. When using 64tass, I've been using command line option -L alot. From 64tass docs:
Quote:
-L <file> List into <file>
Dumps source code and compiled code into file. Useful for debugging code, it's much easier to identify the code in memory within the source files.
Example
64tass -L list.txt a.asm
*=$1000
ldx #0
loop dex
bne loop
rts
result (list.txt):
;6502/65C02/65816/CPU64/DTV Turbo Assembler V1.4x listing file of "a.asm"
;done on Fri Dec 9 19:08:55 2005
.1000 a2 00 ldx #$00 ldx #0
.1002 ca dex loop dex
.1003 d0 fd bne $1002 bne loop
.1005 60 rts rts
;****** end of code
I can't seem to find a similar command line option in Kick Assembler docs. Does that exists? |
Previous - 1 | ... | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | ... | 61 - Next |