| |
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.. |
|
... 590 posts hidden. Click here to view all posts.... |
| |
TWW
Registered: Jul 2009 Posts: 541 |
Hello,
When passing an argument to a pseudo:
:pseudo_test 1234
would result in that the figgure "1234" is enterpreted as AT_ABSOLUTE (in decimal). Why not AT_NONE (as no addressing mode is really defined)? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Well a number in Kick Assembler indicates an absolute adressing mode: nothing - no argument
number - absolute (or abs zeropage)
# - immediate
(number),y - indirect zeropage,y
etc. How would you indicate absolute mode?
(AT_NONE is what you use in nop, sei, cli, etc. while commands like lsr can both use the argument types AT_NONE and AT_ABSOLUTE with different results) |
| |
TWW
Registered: Jul 2009 Posts: 541 |
I was thinking a prefixed with "$" ($02 or $1234) indicating absolute. However i see Your point With the othe OPcodes (LSR etc.).
How about AT_NONE for no addressing mode ("1234") and AT_NULL for no argument ("")? Labels or const/var's would have to be prefixed somehow internally then I Guess.
I'm just trying in a pseudocommand to differentiate between an argument not being passed at all (which may result in an assertion error) and an argument passed without a prefix (which would result in an assertion warning) but it's nitpick.
Brgds! |
| |
Agemixer
Registered: Dec 2002 Posts: 38 |
What a nice feature... I'd also like to know, so perhaps an example would do? I would have required that years before but never tested (Whadda lazy bustard!!! :)) Can they be defined by mnemonic extensions?
Also is it possible to pass a function inside a function to be called anyhow with kickasm scripting? Because i think that's more comfy than passing by arguments like if(a==1) {.eval Arg=Num*ber .eval x=blabla(Arg)} if (a==2) {.eval Arg=Num*bah .eval x=blabla_2(Arg)}
Thinking about something like .function DoSomething(NumMultiplier,MyFunction()) but that doesn't work... so if that's already possible i'm with love to :)
3rd question... Can i exit a .for loop? Or a .goto style of directive. How you would do that in kickasm? |
| |
Agemixer
Registered: Dec 2002 Posts: 38 |
Also some days ago, i think i found a bug in kickassembler: If i changed .var i value in .for (i....) loop (sorry i don't have this code which failed anymore..) ...it hangs kickassembler (and halts relaunch64) but ends with some Java heap overflow (if i remember correctly). Is this a bug or did i just mess up some internal counter? And should i just NOT skip or touch .var i inside a for loop? :D (My lameness, but it was necessary to skip certain values from a huge set which i simply knew those would fail anyway.)
Any help appreciated :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
TWW: $ means the number is written in hexadecimal, just like % means its in binary. So the following 3 executions gives the same result: :pseudo_test $1234
:pesudo_test 4660
:pesudo_test %1001000110100 just as this is the same: lda $1234
lda 4660
lda %1001000110100 On the inside of the pseudocommand all arguments are filled with pairs of (argumenttype, value). If no argument is given, the argumenttype is AT_NONE. If you want to test if no argument is given you could do something like this.pseudocommand pseudo_test arg1 {
.if (arg1.getType()==AT_NONE) .print "No argument is given"
else .if (arg1.getType()==AT_ABSOLUTE) .print "the argument is absolute: "+ arg1.getValue()
else .print "the argument is something else!"
}
:pseudo_test
:pseudo_test 4660
:pseudo_test $1234
:pseudo_test ($30),y This will give: No argument is given
the argument is absolute: 4660
the argument is absolute: 4660
the argument is something else!
So by testing for AT_NONE you can see if an argument is given or not. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Agemixer: Currently there are no 'break', 'goto' or 'continue' directives to modify the flow of loops. Also, there are no lamdaexpression. This migth change, especially with 'break' and 'continue' and perhaps with lambda expressions (just for the fun of implementing it :-) ) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Agemixer: If you can reconstruct the error, then send it to me and i will look at it. It might be that the loop is not terminating? |
| |
Agemixer
Registered: Dec 2002 Posts: 38 |
I couldn't just reproduce it same way but this does the same:
.for (var i=0; i<=10; i=i+0.1) { .if (i>5) .eval i=5 .print "i="+i }
...and the error:
parsing
flex pass 1
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
...
Anyway, not sure if this helps, but something like this triggered it, and IIRC the pow[] was in .for loop comparison though. But that example is gone. (perhaps integer .var comparison vs float .var failed? Even if i<=x, just an assumption..)
.var x = pow(2,fractionbits) // generate some LUT...
.var diffi .var wanha=0
.for(var i=0;i<=x;i++)
{.eval freq = round(Base_Freq * pow(2,[i/x/12]))
.eval diffi = myfreq - wanha .eval wanha = freq
// ..sorry not everything revealed here.. =)
}
Anyway i think it could just have been human error :) |
| |
Agemixer
Registered: Dec 2002 Posts: 38 |
Then an another little puzzle, which could ease up the programming a bit for sure... (atleast if you branch a lot =)
When a relative branch exceeds its short branch limits in multiple places in the code, it could get annoying to replace it with long jumps, but optimize back a bit later if not needed... So i wanted to automate some long branch generation a bit, instead of several compile time complaints. BUT! Is this possible to do properly in kickassembler? As i know kick can do multiple passes depending on your code, until all variables are known and all code generated properly? :)
What do you think? How this should be done? My idea is this (and it halfway works already!)
.const BEQ=$f0 .const BNE=BEQ^$20
.const BMI=$30 .const BPL=BMI^$20
.const BCC=$90 .const BCS=BCC^$20
.pseudocommand far OPCODE;OPERAND {
.var PC = *
.var branch = OPERAND.getValue()-PC
//.if (branch ?? InvalidNumber) { .print "label not found yet" } //...should this work?
.if ( branch < -126 || branch > 129 ) {
.byte OPCODE.getValue()^$20, 3 // [BEQ] *+5, jmp long_branch
jmp OPERAND
.print"FAR BRANCH at location $"+toHexString(PC)
} else {
.byte OPCODE.getValue(), branch-2 // [BNE] short_branch
// For the above .byte code, is there possible to feed OPCODE for pseudocommand like those argument types for operand?
}
}
.pc=$2000 // some testing...
before:
.fill 127,[NOP]
:far BNE; before // this branch works
:far BCC; after // this branch gives "Error: the condition must be able to evaluate in first parse)"
.fill 128,[NOP]
after:
|
Previous - 1 | ... | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | ... | 61 - Next |