| |
Slammer
Registered: Feb 2004 Posts: 416 |
Kick Assembler
I recently did a new 6510 assembler and I hereby make it open to the public so you can use it too.
Kick Assembler is the combination of an assembler for doing 6510 machine code and a high level script language. With the assembler functionalities, you can write your assembler programs, and with the script language, you can write programs that generate data to use in the assembler programs. This could be data such as sine waves, coordinates for a vector object, or graphic converters. In addition, you can combine assembler commands and scripting commands which is a powerful combination. A little example: Where other assemblers can do simple unrolling of loops, Kick Assembler can base the unrolling of a loop on a list generated by the script language and select the content of the loop body based on the content of the list. This makes it more flexible when generating speed code.
The script language can handle values such as Numbers, Booleans, Strings, Lists, Vectors, Hashtables, Matrixes and you can define your own structures if the build in doesnt meet your needs. The assembler contains a replica of the java math library + a special 3d library for doing vector math (Rotation, move and projection matrixes). You can also define your own functions.
Finally, I want to mention that the assembler contains some special objects that makes it easy to import graphics (and convert it into you own spooky format which fits into the part you are working on) and music. Since finding the correct play address for a tune has recently been an issue in the *stupid* ASM Sid Player Example- thread I will here show how its done in kick Assembler. You simply load you PSID file into a variable in the script language and then read the things you need to know from the variable.
// Load the music into an object in the script language
.var music = LoadSid("C:/C64Music/Tel_Jeroen/Closing_In.sid")
// init the music
lda #music.startSong-1
jsr music.init
// play the music
jsr music.play
(The full example is listed in the manual)
Feel free to check out the assembler at http://www.theweb.dk/KickAssembler.htm
|
|
| |
HCL
Registered: Feb 2003 Posts: 728 |
Impressing!! Think i'll try this sometimebutnotnow :). |
| |
WVL
Registered: Mar 2002 Posts: 902 |
w000t :D Have to try this :)) |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
About time! ;) Finally people can compie the source for my last couple of 256b'ers. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
HCL: Thanks for the letter. Always nice with some feedback.
Cruzer: Ahh.. I suspected you had a hidden agenda when you argued for a soon release :-D |
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
Great work, did you get motivated by Cruzers "dont know the routine" demos? Or was it the other way round?
I'm looking forward on the time after my diploma ...
Monte
|
| |
Ghostrider Administrator
Posts: 45 |
OMG this is too good to be true!! I'm halfway through the reference manual, and I don't believe my eyes. Modern compiler technology working in the service of our dear old C64! This could change the way we code - the ease of developing demos - the convenience!! |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
this sounds really promising, but uhm...
inflating: KickAssembler_BetaRelease2/KickAss.jar bad CRC 7e255f76 (should be 70d1f6ab)
|
| |
Danzig
Registered: Jun 2002 Posts: 440 |
@enno: syhte! the same :( |
| |
Moloch
Registered: Jan 2002 Posts: 2928 |
A R G H !
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Sorry guys. Hcl was so kind to point out some typos in the manual. I quickly made a re-release, but the upload resulted in a bad file on the server. It should be fixed now. (Remember to clear your cache so the browser dosnt download the cached old file) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Monte Carlos: Kind of.. The story of Kick Assembler goes something like this. When Cruzer started coding "You know the routine" I thought about getting into c64 coding again, so he send me the Assembler he was using. Unfortunately it contained a bug (a pointer that was referencing an invalid memory location) which did that I couldn't run it on the os I used on my computer. I also develop programs for a living, and at the time I was trying to convince the management that we could easily do a script-language for our product. If I succeded then I had to produce a quick proof of concept. To make sure I could do this, I meade some research and this research project was what became the first version of Kick Assembler. This was however, never realeased. Time passed.. Then at the Retro Concert last year in Copenhagen I kind of got caught by the old c64 spirit. I met some old sceners and especially Drax's enthusiasm was catching. So in the following months i reprogrammed Kick Assembler from scratch with a new architecture that allowed alot of new features. At christmas time I had a running assembler and had programmed my first part in it. |
| |
Krill
Registered: Apr 2002 Posts: 2980 |
What HCL said. :D |
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
Nice Story,
sometimes i have the strange feeling, i'm the only c64 coder not involved in any business software development.
I like especially the features to import sid files, because i have changing the jump adresses always when trieing different musics. 2nd i like all the math function for generating tables, what is not even possible in ca65(the complexest 6510 assembler i know) and the graphics converting option for importing pc painted images without having to convert them again after every little pen strike.
What i dislike a little bit is, that kickass uses its own syntax for macros and recyclelabels, which is not compatible with other assemblers like ca65. If that would be the case one could benefit of the advantages of both assemblers.
Btw.: I already wrote me a library for use with ca65, which makes me a little bit bounded.
But this is a very personal opinion, because other people use dreamass or as64 or some other crossass. They cant all be syntax compatible, but perhaps the commonnesses(english for runaways) could be.
Monte
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Monte: Yep. It would be nice if all assemblers had the same syntax. The recycle lables got to look as the do due to some compilier techincal reasons. Cruzer also complained, but now he has gotten used to it.. (TGD actually talked about doing a converter, but I guess it was only talk..)
However, its kewl with feedback, also the things you miss or dislike. The earlier I get it, the easier it is to change. Btw. I just added a .pseudopc directive which will be in the next release (Thanks to Danzig for pointing out that it was missing)
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Kick Assembler is now supported by Relaunch64, but you will have to use the new release wich can be found on the homepage. I also added a .pseudopc command and a fractal example as a little gimmick:
.pc = $0400
.function toRe(i) .return -2+2.7*[i-floor(i/40)*40]/39
.function toIm(i) .return -1.6+3.2*floor(i/40)/24
.function mandelbroot(re,im) {
.var zr = 0
.var zi = 0
.var iter=0
.for(;[zr*zr+zi*zi]<4 && iter<20;iter++) {
.var newZr = zr*zr-zi*zi + re
.var newZi = 2*zr*zi + im
.eval zr = newZr
.eval zi = newZi
}
.var colors = List().add($20,$0f,$20,$08)
.return colors.get(iter&3)
}
.fill 25*40,mandelbroot(toRe(i),toIm(i))
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi Guys
I decided that the Assembler have been stable long enough to make a offical release which can be found here on CSDB. The imporvements and the latest updates can still be found on www.theweb.dk/KickAssembler.htm |
| |
LordNikon
Registered: Dec 2001 Posts: 42 |
even runs on mac osx =) |
| |
raven Account closed
Registered: Jan 2002 Posts: 137 |
What HCL & Krill said :)
I still use the good old Turbo Assembler on the 64 (with
some mods).
Using a PC to program for the 64 just takes all the fun out
of it.. (yeah I know I'm wierd ;)
|
| |
Style
Registered: Jun 2004 Posts: 498 |
raven: Quetzal/Chrome still uses AR monitor, I believe.
|
| |
Bastet
Registered: Jul 2005 Posts: 88 |
As long as you dont code in fscking screencodes... ;)
For the assembler, how good is that one for games, especialy RPGs? *g*
|
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
@BassetFurry: o_O ?!? :D WTF! |
| |
Bastet
Registered: Jul 2005 Posts: 88 |
Its Bastet, like the pen and paper rpg or the egypt goddes ;)
And i heard from someone from Triad(?) that he coded in screencodes inside the basic editor. A little SYS1024 in the end and the programm ran. *g*
|
| |
Quetzal
Registered: Jul 2002 Posts: 71 |
Yeah, it's true, all of my stuff, including an entire game (Xiom) was coded in the monitor of my AR IV cart. Used an assembler one time only to write a RLE depacker for use in a demo part... Probably goes a long way towards explaining my totally destructured programming style, looks just like something has exploded in the memory :) Never went as far as using screencodes, but an Amiga friend was VERY shocked when watching me code that I remembered the numbers for all the opcodes and was doing stuff like typing 60 to do an RTS and save myself a keystroke....
Having said all that, this new Kick Assembler sounds very nice indeed from what I've read so far. Might even be enough for me to turn over a new leaf and start coding in a more normal fashion?
|
| |
Jetboy
Registered: Jul 2006 Posts: 337 |
what are screencodes?
assembler is assembler - its good to write programs in. There are no assemblers designed especialy to make RPGs... huh!
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: what are screencodes?
assembler is assembler - its good to write programs in. There are no assemblers designed especialy to make RPGs... huh!
You type characters at the top of the screen that you know resembles the right opcodes in ram, then SYS1024.
I once coded a raster interrupt split this way at a museum.
Pretty stupid actually.
I think I had to rewrite it 4 times or so. Pressing restore clears the screen... :P |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
@Quetzal: A lot of demo coders work/used to work this way.
Mastermind of Horizon even made it a point not to save the memory before the demo part actually worked. It has bitten him a number of times, especially at parties where the power was cut at some point. ;)
Kjer of Horizon coded most stuff in a monitor, and so does Crossbow AFAIK. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
@Bastetfurry: Ahh, sorry about the typo. I actually meant your statement: "For the assembler, how good is that one for games, especialy RPGs?". Is that a joke I don't get? :D |
| |
Scout
Registered: Dec 2002 Posts: 1570 |
Quote: You type characters at the top of the screen that you know resembles the right opcodes in ram, then SYS1024.
I once coded a raster interrupt split this way at a museum.
Pretty stupid actually.
I think I had to rewrite it 4 times or so. Pressing restore clears the screen... :P
You just admitted that you're autistic :)
---
8Bit Mayhem - The C64 Scenemusic Podcast
http://8bitmayhem.untergrund.net |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: You just admitted that you're autistic :)
---
8Bit Mayhem - The C64 Scenemusic Podcast
http://8bitmayhem.untergrund.net
Well... we kind of practised doing some simple code one afternoon before going there... ;)
(not that particular code though)
You'd be surprised how few different values you really need to enter to implement it.
You'll need to know the value of the actual opcodes though. |
| |
enthusi
Registered: May 2004 Posts: 677 |
I did some poking into screenram to change a loader-code there but actual petscii is another thing :) way different....
On one c64 I had no $-key working and poked it into screen to load directories. Did that for weeks before I changed kb - hm, that makes me look lazier than I usually am |
| |
Bastet
Registered: Jul 2005 Posts: 88 |
Quote: @Bastetfurry: Ahh, sorry about the typo. I actually meant your statement: "For the assembler, how good is that one for games, especialy RPGs?". Is that a joke I don't get? :D
No, i realy meant it, how good is the assembler to write games especialy _r_ole_p_laying_g_ames(BardsTale, Ultima,...)?
I tryed my luck with Xlang but gave up as he simply ignored a second org directive.
And dont mention cc65 ,ok unfair its a c compiler but, it steals too much power from the programmer. ;)
ATM i am using acme, but i am not that happy with it.
What i realy want is some middlething betwhen assembler and compiler, ok, that would be Slang, but its useless when i want my basic start at $0801, want to insert some music from external file to $1000, some charset at $2000 and my code at $4000. |
| |
MagerValp
Registered: Dec 2001 Posts: |
Slang can do that easily. Read up on how the linker works.
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
@BastetFurry: I believe that Kick Assembler would be extremly well suited for complex games!
It supports all sorts of importing of graphics, generation of tables, ...
I currently use Dasm which is a quite good all purpose assembler, but no specific c64 features.
I haven't used Kick Assembler yet. Mainly because the syntax is a bit different I guess.
@Slammer: Did you implement the .transform directive? :)
(i.e call an external program to transform the enclosed code/data)
A switch to enable support for DTV opcodes would be nice too. (SAC #<imm>/SIR #<imm>/BRA <rel>)
|
| |
Jetboy
Registered: Jul 2006 Posts: 337 |
> A switch to enable support for DTV opcodes would be nice too. (SAC #<imm>/SIR #<imm>/BRA <rel>)
DTV emulator would be cooler :)
Anyway - they sait at the Lipsk game fair, that they intend to do new version of DTV with build in keyboard plug, though they dont intend to add disc drive support. Maybe some kind of flash rom. Atleast that's what my workmate was able to get out of them.
btw. Commodore keychain I got, is so friggin cool! |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
@Jetboy: It already has flashrom you know. 2Mb Flash + 2Mb RAM.
Keyboard connector sounds nice, but no IEC? Pretty daft considering the chip has both keyboard and IEC implemented.
There is some fuzz about it here aswell:
http://jledger.proboards19.com/index.cgi?board=dtvhacking&actio..
|
| |
Bastet
Registered: Jul 2005 Posts: 88 |
Ok, read the manual, nice features and i will give it a try.
But, why for goddes sake fucking java? ;) |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
@BastetFurry: Try nice language, try platform independant, try has lots of stuff, try doesn't depend on zillions of libs... :D
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Agree with JackAsser. I can't see any reason why to make something like this in anything else than Java. It's nice that it automagically works on my PowerBook, even though it's developed on a Windoze box. |
| |
Bastet
Registered: Jul 2005 Posts: 88 |
Cant agree as i dislike OO-Languages, interoperabilty bought with interpreter, good point, depends on rather large download (Java interpreter)....
OTOH, who cares, use what you like and what gets the job done ;)
|
| |
enthusi
Registered: May 2004 Posts: 677 |
though Im not totally fond of Java either this is an amazing example of a perfect java-code/use.
I mean 'compilers' love OOP and actually I love being able to run it on most unix-machines too...
I dont want java in anything that needs performance though but who am I? :)
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
The worst thing about java command line utilities is the terrible command line they require.
java -jar program.jar ...
Sure you could do an alias, but it leaves a bad aftertaste.
That said, Kick Assembler looks very good, and I intend to try it out.
|
| |
Viktor Account closed
Registered: Apr 2002 Posts: 78 |
I have read the documentation too. Is it poosible, to put your macros avaible? :)
Viktor |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Tlr: No, not yet. There where some technical dificulties that made it not that simple to do. But its still on my list :-). DTV opcodes is rather quick to implement so send me a list of the opcodes an they will be in the next release.
Bastet Furry: I selected java because its a nice language :-) Its easy to support multiple operating systems, its guards you against adressing invalid memory and it will be easy for others to write plugins for kickass in java (I have plans of giving the user access to write his own functions in java)
Viktor: I havn't distibuted my macros since I then would have to intensely test/debug them. One exception is the :BasicUpstart(address) macro I guess its will be used alot.
However. If anybody writes a tested library Ill be willing to distribute it with Kick Assembler / Insert it as standard library
|
| |
Danzig
Registered: Jun 2002 Posts: 440 |
I once had to debug/fix/finish a large SWING-Application (for those who don't know, SWING is the "successor" :D to AWT). And it was PAIN IN THE ASS, SLOW, RAM-INTENSIVE...
Later on I had to implement a Webserver-driven huge data-conversion-programm (fyi:running on ColdFusionMX) and JAVA was the way to go to create this MASSIVE amount of "commandline-tools" (non-GUI) triggered by the Webserver to be run in a JVM. And it was fast :)
for me, the only reason JAVA exists is to create CMDline-Tools ;) and its the right choice for KickAssembler.. Check it out and you will NOT encounter any "speedproblems"... Its fast!
|
| |
enthusi
Registered: May 2004 Posts: 677 |
I developed my own view on 'fast' :)
Im ok with waiting - still lovin' tapes.
But when something runs either idling or due to real heavy maths, I'd hate to be inefficient. So Id be ok if Kickasm would run in brainfuck. But due to Java I can run it at work and at home and blabla. First time something of importance used that advantage of java (actually C ist THE language for portable commandline if you keep ansi C99 :).
So Im happy to see this asm being so well designed apparently. Btw, Ophis-asm was in Python and quite fast/nice (simple) too.:) |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
So, people stop being lame.... Since when couldn't you afford to waste 80M on your harddrive when 300Gb costs like 100euro max?!? Just install JRE1.5.x and you have Java whenever you need it for tools like this. |
| |
Shadow Account closed
Registered: Apr 2002 Posts: 355 |
This seems like it could be a damn good assembler, going to give it a try.
Anyone happened to create a syntax-highlight-wordfile for UltraEdit yet? I'm so spoiled nowadays that I have trouble looking at non-highlighted code...
|
| |
Viktor Account closed
Registered: Apr 2002 Posts: 78 |
Yes, it is good, and the documentation is good enough.
Do somebody have a display routine for the Vector section?
Slammmer:
Are the Vector calculations usable on a multicolor picture too?
|
| |
Jetboy
Registered: Jul 2006 Posts: 337 |
@Victor: those are VECTOR calculations. They give you operations over vectors, there is nothing that actualy draws any vectors. That you need to implement yourself. Those Vector objects are only so you can easily prepare precalcs. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Victor: Look in the examples that comes with the assembler. There is a full running vector example :-) |
| |
The Syndrom
Registered: Aug 2005 Posts: 59 |
Hey Mads,
I think you did a great job on kickassembler! I recently used it to reassemble my (lost) sourcecode of "microtracker" (which infact is no tracker but just a very low-rastertime musicplayer), and working on that went very smoothly.
greets,
Matthias |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Matthias: Hey Matthias :-) Nice to hear from you! Please tell me if you release anything made with Kick Assembler :-) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I just uploaded a new bete release that supports DTV commands to the homepage. |
| |
Style
Registered: Jun 2004 Posts: 498 |
when I have the energy to learn new assembler syntax kickass will be my weapon of choice. The scripting rules.
|
| |
Style
Registered: Jun 2004 Posts: 498 |
OK, Im using kickass now - but I have a problem.
Sometimes it refuses to resolve symbols!
I cant quite get the logic of when and how.....
Ill post some simplified code soon |
| |
Style
Registered: Jun 2004 Posts: 498 |
OK, I managed to work around it
Basically if you have a macro with parameters and pass nulls, and in some way operate on those parameters, it throws this error.
How are nulls handled? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I havent seen your code yet, but as written on the Kick Assembler page, I guess you use an .if or some other statements which requires to run in pass 2 together with labels, which are resolved at pass 2 and available after they are resolved + in pass 3.
The cause of this is quite an interesting problem and I guess that no macro assembler can solve it 100% smooth. Why? Well check the following example:
.pc = $1000
.if (trickyLabel<$2000) {
.fill $2000,0
}
trickyLabel:
The program makes no sense because you cannot decide whether the fill command is going to be executed or not. If it is executed then trickyLabel=$3000 so it should not have been executed. If it wasnt executed then trickyLabel=$1000 so then it should have been executed.
Therefore, conditional commands (like .if) needs their arguments to be resolved before executing in pass 2. However, others do not. Kick Assemblers approach to this is to try to assemble as far as possible, and if a problem arises then throw and exception where the problem first arose. So unresolved labels (= what you call null values) generates a special value type called UnresolvedValue which you wont notice in most contexts. For example the following will work:
.var x = labelResolveLater // Assignments works fine
.var y = min(x + 400, pow(x,3)) // Functions etc. work fine
sta $1000+y // Asm commands works fine
labelResolvedLater:
However this will not work:
.var x = labelResolveLater // Assignments works fine
.var y = min(x + 400, pow(x,3)) // Functions etc. work fine
.if (y<100) sta $1000+y // .ifs wont work
labelResolvedLater:
In you example, Kick Assembler has executed your macro and come to a statement that needed its arguments to be resolved, and then thrown an exception where you used it the first time (=the macro call). So why doesnt Kick Assembler give an error at the .if statement? Actually, it did until v2.10, but that was quite confusing in other situations. I guess Ill try to make a better error message so its easier to understand this.
|
| |
Danzig
Registered: Jun 2002 Posts: 440 |
I encountered a problem with local variables in macros. so i checked it with the precalculated vector-example!
and it gave me the same error!
scenario:
In the example there is ONE object and the macro is called ONCE => works!
If I copy the Object and create a second one (changing the coords :) ) and call the macro a second time KickAssembler gives an error (Array index out of bounds:8 ) <= No Smiley ;)
It seems the local variable is not set properly!?
Copying the Macro and renaming it (like: .macro PrecalcObject2(object, animLength, nrOfXrot, nrOfYrot, nrOfZrot) fixes the problem and works...
But copying the Macro dozens of times for dozens of objects makes no sense at all :D
@Mads: Any suggestions?
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Danzig: Thats a bug. I actuallly found it this weekend and released a correction for this yesterday, so my suggestion is to download the newest version :-) |
| |
Style
Registered: Jun 2004 Posts: 498 |
Thanks slammer, indeed I was passing a label that hadnt been resolved yet to a macro with conditional assembly that would affect the value of the unresolved label :)
Anyway, Ive changed my libraries so I no longer rely on that sort of thing.
Thanks again for kickass - it rules.
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
can stand not to poke you guys, although using scripting and macros makes things incredibly easy, if you code a demo you will have to code a speedcode generator at the end of the day, otherwise you will face the problem of loading the huge speedcode... |
| |
Copyfault
Registered: Dec 2001 Posts: |
Quote: can stand not to poke you guys, although using scripting and macros makes things incredibly easy, if you code a demo you will have to code a speedcode generator at the end of the day, otherwise you will face the problem of loading the huge speedcode...
I also didn't get this point... Wondering if there is a function
script_language -> 6510 speedcode_generator ???
As this seems not to be the case ;p, KickAss advantages mainly show when making some proof_of_concept - routines... or am I completely wrong here???
CF |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
huge speedcode packs quite good though (ofcourse not exactly as good as with a speedcode generator)... i've almost never bothered to write a generator for that very reason (although for the stuff i'm working on atm i'm doing it a lot ...) |
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
The speedcodegeneration routine problem ist not so easy to solve. All speedcode generators have in common, that they copy a sequence of code somewhere into memory, then modify the sourcesequenz, copy the modified seq to a following location and so on...
It depends on what you want to do with the speedcode, when, where and how the modifications are done. This makes it difficult to write a generator for a whole class of speedcodes.
I tried it sometime ago, to write a copier for the speedcodesequences which calls a routine at an adress you passed before as parameter.
The called routine then modifies the code and returns into the copy routine.
I made this with cc65 and the result was heavily bloated code.
Then i made an attempt in assembler, but this lead to a similar complicated routine.
Perhaps i did'nt come up with the right idea then.
Monte
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
I agree with Oswald and copyfault. Scripting should be used for proof of concepts, and when you have seen that it works, you can bootstrap your routine by replacing the scripts with code generating assembly code.
Of course, for small pieces of code it doesn't matter, but generally I think it's faster to load a small code generator and have it generate the code than loading and depacking the generated speedcode. |
| |
Copyfault
Registered: Dec 2001 Posts: |
@Monte Carlos: while trying to do a userfriendly version of the ILM-editor, I also did some FLI-speedcode_generator in 6510 asm... I found it by far more comfortable to run the generator_routine in a main loop which calls a "paste_code" subroutine when necessary; is there a reason to do it the other way around? Maybe I didn't really get your point...
@Groepaz&Cruzer: [exaggerationmode=true] what about not packing all the speedcode and streaming new code_fragments from disk *rotfl* ??? |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
Quote:@Groepaz&Cruzer: [exaggerationmode=true] what about not packing all the speedcode and streaming new code_fragments from disk *rotfl* ???
not so terribly rotfl at all :) in mathematica there is a part that does exactly that (inside torus followed by tunnel, one speedcode overloads the next, which results in the crossfade effect you can see) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
Groepaz, lol :) not at all, the speedcode is the same all the time, only it loads the tunel data while the torus is displayed, then simply copies the torus data over the tunel one. Have you ever checked how that routine works ?=)
copyfault, loading speedcode is stupid and will be always slower than generating doesnt matter how you do it.
besides you dont need copy code routine. If you want to do it fast do it all low level: lda #opcode sta (),y iny .... |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
Quote:Groepaz, lol :) not at all, the speedcode is the same all the time, only it loads the tunel data while the torus is displayed, then simply copies the torus data over the tunel one. Have you ever checked how that routine works ?=)
oh? no i've never checked it...thats how i remember how quiss explained it to me, but ofcourse...that was like 10 years ago =) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi Oswald, Nice with a bit of poking, It gives me the opportunity to state some points :-)
First of all it seams to me that you equals Kick Assembler with loop unrolling and nothing else, and ignoring all the other advantages the script language offers.
When you have converted a logo to koala format with p1 and want to reallocate the data, or use only part of the picture, I guess you do the task by hand and do it every time you change the logo. With Kick Assembler you just write a couple of lines to that does this for you.
When you want to convert a charset from a gif picture to a c64 charset, I guess you have to run a 3rd party converter or write one yourself in another programming language which you have to run every time you select another charset. Why not just write the converter directly in your assembler. Its a lot easier and it runs automatically each time you assemble.
Small jobs like generating a sinus table, some random numbers, a bounce table, etc. you would normally do in other languages. But with Kick Assembler you can do it directly in the assembler.
Secondly, it sounds like you are neglecting macros. Well I dont know about you, but I like to write :BasicUpstart($3000), and then get a basic program that starts my program at $3000, but you can ofcause also generate it the old fashioned way. And I guess my move macro does just as good a job as your hand coded one since its decides on making speed code or normal code depending on how many bytes you want to copy:
.macro Move(source, target, size) {
.if (size<=$1000) :FastMove(source,target,size)
.if (size>$1000) :GeneralMove(source,target,size)
}
(Hey style, the above works since the size is given directly, but I guess you got that by now)
And finally, about making speed code. Its correct that if you want a part to load quickly you should probably unroll you your loops by hand. However, rapidly developing the part and then hand-packing the loop afterwards saves a lot of time since you are sure you pack the correct loop the first time
And by the way, there is a couple of directive to support unrolling of loops on my todo-list, but thats another story.
|
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
slammer, for what it's worth (not a lot), if I'd ever get back to coding on 64, this is the assembler I'd be using. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Quote: Groepaz, lol :) not at all, the speedcode is the same all the time, only it loads the tunel data while the torus is displayed, then simply copies the torus data over the tunel one. Have you ever checked how that routine works ?=)
copyfault, loading speedcode is stupid and will be always slower than generating doesnt matter how you do it.
besides you dont need copy code routine. If you want to do it fast do it all low level: lda #opcode sta (),y iny ....
Oswald: When you like lda #opcode sta (),y then you must like the lastest version of Kick Assembler since it has all the opcodes incoperated as constants. So if you want to store an immediate lda command then you do like this:
lda #LDA_IMM
sta ($30),y
which is more readable than
lda #$a9
sta ($30),y
Burglar: Thanks :-) One of the reasons I made the Assembler was to make it easier to make C64 demos, so more coders would return to the scene ;-) |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
Quote:Burglar: Thanks :-) One of the reasons I made the Assembler was to make it easier to make C64 demos, so more coders would return to the scene ;-)
hell, I even tested the whole thing, I was blown away by the ease of the vector example. makes you eager when you dont want to get into (= too stupid) the mathematics of 3d, but still want to use it ;) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
Slammer, right I understand that macros and scripting is very powerful, but being an old fart used to TASM I just had to troll around a bit :) But now you made me really curious, so when I finally will decide to make that damn step for cross coding kick ass will be the first to check out :) |
| |
Style
Registered: Jun 2004 Posts: 498 |
Oswald: Do it now. I thought ca65 was awesome, and kickass...well.... kicks its ass.
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
one thing i always wanted to see in an assembler (and pretty much the only thing i really miss in ca65 :=P) would be the possibility to define a section for linking which is not continues as usual but interupted by various "dont use" areas. image you are coding a FPP style routine... every $400 bytes you would use 40 bytes, but everything else would be free to use (ok, over simplyfying here, but thats not the point). now if you could tell the linker what areas not to use, the linker would skip them (and if its a code section insert a JMP over that area). the linker could also sort data in a way to use the gaps most efficiently. etc. you get the idea :) |
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
@Copyfault:
Perhaps i should try it this way round.
Don't know how its better.
Monte
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
is it possible to have macros for 16 bit addition, with automatic adress type recognition?
so we could write stuff like add16 #56,$fc or add16 $1000,$2003, etc etc :) this would make life so much easyer, I hate all the similar over and over again repeating code patterns for doing stuff thats only one instruction on a modern cpu. |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
@Oswald:
// define macro...
.macro add16 (adr, number) {
lda adr
clc
adc #<number
sta adr
lda adr+1
adc #>number
sta adr+1
}
//use it...
:add16($fe,3)
:add16($2000,$ffff)
You need to define different macros for different address modes though, like immidiate (the version above), absolute (add one address to another), absolute,y etc.
@Slammer: Maybe addressing mode recognition would be an idea, so it could distinguish between :add16(2,2) and :add16(2,#2) ?
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
yeah if adressing mode recognition would be supported then a whole new world opens for pseudo opcodes \o/ :) inc16,add16 etc etc :D |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I agree. A way to make pseudo commands so you could avoid making add16, sbc16, move16 etc, for all addressing modes would be nice. I thought of difference ways of doing this with macros, and I dont think there is any solution that will be satisfactory. However, if we make a special .pseudocommand directive then it would be possible. The biggest difficulty is to make a convenient notation. Lets take a look at the addressing modes:
No argument
Immediate
Indirect zeropage,x
Indirect zeropage,y
Abolute
Absolute,x
Absolute,y
Indirect
(From the above is missing Zeropage, Zeropage,x , Zeropage,y and Relative, but they are automatically derived from the above when needed, so we dont have to consider those.)
Now how should a macro call with parameters in each of these modes look? Since it's not a macro, we can skip the parenthesis around the call so we can use it for the indirect modes, and we must use another separator than comma for separating the argument since its used in some addressing modes. I need some suggestions here because the ones I thought of look like garbage.
However, Using the existing system is not that bad. You can implement the add16 command like this:
.enum {IMM, ABS, ABSX, ABSY}
.macro add16(mode, arg1, arg2) {
clc
:add8_nc(mode,arg1,arg2)
:add8_nc(mode,arg1+1,arg2+1)
}
// Add8 no carry
.macro add8_nc(mode, arg1, arg2) {
lda arg1
.if (mode==IMM) adc #arg2
else .if (mode==ABS) adc arg2
else .if (mode==ABSX) adc arg2,x
else .if (mode==ABSY) adc arg2,y
else .print "Error: Invalid mode!"
sta arg1
}
The usage of the command is like this:
:add16(IMM,point1,$0800)
:add16(ABS,point1,point2)
ldx #27
:add16(ABSX,point1,pointTable)
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
he, i'm disappointed. this can be done perfectly fine in ca65 =P |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
ok, that must mean that they have found a good notation. I will check it out.. Anything special I should look for? Or better, could you write a little example of how you would do in ca65? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I just chekked out the manual for ca65 and I dont think they have the solution to our problems. In the example they give (ldax) they determine the mode using a stringcompare telling if the fist char is a '#' - So the user have to do the detecting by himself.
Secondly they limit themselves to one argument, so they havnt solved the notation issue. How should add16 abs, absy look like? :add a,b,y (<- is y now an argument or telling that its adressmode abs,y?). In the example they only consider immediate and absolute.
Finally, they don't eliminate the use of an if sentence for each supported adressing mode.
If I have missed something then please show me.
|
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
Talk to Ullrich (Author: cc65), as you both did very good assemblers. He appreciates feedback.
Perhaps both of you can get some ideas from the other.
That's what i would do ...
Monte
|
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
I dont know anything about assembler coding, but when you resolve adresses you have to decide wether its absolute, indexed, immediate, etc. couldnt you add a simple new function like adressmode(argument) ?
if adressmode(arg1) = "absolute" then goto 16bit
if adressmode(arg1) = "immediate" then goto fastie
etc... |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I guess I didn't formulate the problem clear :-)
Comma is used in some adressing modes (like ($32),y) so we cant use this to seperate arguments. What should be used instead? Well, I just tried some different possibilities and the best I can come up with is semicolon:
:add16 point ; #2
:add16 point ; point2
:add16 point1,y ; ($32),y
Looks a bit odd, but it will do the trick..
Oswald: The addressmode function is definetely possibility to mode-detection.
|
| |
Monte Carlos
Registered: Jun 2004 Posts: 359 |
Perhaps seperated lda16 sta16 will do.
This would be something intermediate.
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
@slammer: ca65 philosophy is to not implement a certain feature if the problem can be solved with existing features. (because more features means more bugs) so there seem to be few features at first sight, but on a second look they are usually very powerful. (the argument parsing stuff is one of them)
that said, long ago i've implemented the full huc6280 instruction set in macros (and even longer ago gbz80), so parsing whatever you need is definetly possible (can't paste any examples though since i have lost these files :/) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
thats not always the best policy, check brainfuck for a nice example. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
well i prefer having a few features that work 100% as expected than thousends of seemingly nice but halfassed and bugging ones :) just tried too many crossassemblers before i guess, and most of them go into the second cathegory. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
lol, TASM+VICE works like magic I can tell you :) |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
1) its TASS. TASM is a X86 assembler</smartass>
2) it plain sucks for any bigger projects. look at the turrican3 sources. its horrible pain to assemble them with tass |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
sure it is, but for coding a demopart for me its still the best. I have the fastest edit-test cycle with alt+w, and alt+s, alt+l :) |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
once your part takes a lot of memory so you have to assemble to disk i pretty much doubt that :) |
| |
Spinball
Registered: Sep 2002 Posts: 88 |
Quote: once your part takes a lot of memory so you have to assemble to disk i pretty much doubt that :)
and that´s why i love the reu emulation in vice. just like i used to code wth reu+tasm on the real thing.
last crossassembler i tested was AS (http://john.ccac.rwth-aachen.de:8000/as/). i even did some macros that generated sin-tabs and stuff. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
groapaz, as my memory usage is mostly due to speedcode thats not a problem :) I will hang myself sooner then assembling to disk :) |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
so you always save source to disk and reload assembler and source? same crap for me :=P |
| |
WVL
Registered: Mar 2002 Posts: 902 |
Quote: so you always save source to disk and reload assembler and source? same crap for me :=P
no, he uses save+load state.. I did that too when I was working on Arcanum ;) |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
and i still cant see how that would be significantly faster than using crossasm :) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
the edit-test cycle will be faster. |
| |
MagerValp
Registered: Dec 2001 Posts: |
Codenet is even faster.
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
Quote:the edit-test cycle will be faster.
i pretty much doubt that, if anything it will be just as fast, but still be more hazzle. |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
well 1600% speed compiling must be on par with cross assemblers, right ? secondly vice doesnt needs to be started, no kernal memory check, etc. and I can have my fave cartridge instead of sticking to the built in vice one.
codenet = you have to switch between 2 monitors and keyboards |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
vice has a cartridge built in? wtf! o_O |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
can u add a cartridge on the commandline ? |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
-ramcart
+ramcart
-ramcartimage <name>
-ramcartsize <size in KB>
-cartreset
+cartreset
-cartcrt <name>
-cart8 <name>
-cart16 <name>
-cartar <name>
-cartrr <name>
-cartide <name>
-cartap <name>
-cartepyx <name>
-cartss4 <name>
-cartss5 <name>
-cartieee488 <name>
-cartwestermann <name>
-cartstb <name>
-cartexpert
that enough options for you ? :o) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
ok u win & lets stop spamming this topic :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi Guys, I just implemented a pseudocommands which basically are macros that takes Command arguments (#20, ($10),y, ($1000), etc.) as arguments. You can use getType() and getValue() on the command arguments and create new ones with the CmdArgument function. Here a quick example of an add16 command:
.pseudocommand add16 arg1;arg2;arg3 {
// Use first argument as target if none is given
.if (arg3.getType()==AT_NONE)
.eval arg3=arg1
// Arg1
.var arg1a = CmdArgument(arg1.getType(), arg1.getValue())
.var arg1b = CmdArgument(arg1.getType(), arg1.getValue()+1)
// Arg2
.if (arg2.getType()==AT_IMMEDIATE) {
.var arg2a = CmdArgument(arg2.getType(), <arg2.getValue())
.var arg2b = CmdArgument(arg2.getType(), >arg2.getValue())
} else {
.var arg2a = CmdArgument(arg2.getType(), arg2.getValue())
.var arg2b = CmdArgument(arg2.getType(), arg2.getValue()+1)
}
// Arg3 (Destination)
.var arg3a = CmdArgument(arg3.getType(), arg3.getValue())
.var arg3b = CmdArgument(arg3.getType(), arg3.getValue()+1)
clc
lda arg1a
adc arg2a
sta arg3a
lda arg1b
adc arg2b
sta arg3b
}
And you use it like this:
:add16 point1 ; #$1234 // p1=p1+$1234
nop
:add16 point1 ; point2 // p1=p1+p2
nop
:add16 point1 ; point2 ; point3 // p3=p1+p2
nop
:add16 pointTable,x ; pointTable,y ; point3 // p3 = pointTable[x] + pointTable[y]
Which will generate code like this:
.C:1000 18 CLC
.C:1001 AD 00 30 LDA $3000
.C:1004 69 34 ADC #$34
.C:1006 8D 00 30 STA $3000
.C:1009 AD 01 30 LDA $3001
.C:100c 69 12 ADC #$12
.C:100e 8D 01 30 STA $3001
.C:1011 EA NOP
.C:1012 18 CLC
.C:1013 AD 00 30 LDA $3000
.C:1016 6D 02 30 ADC $3002
.C:1019 8D 00 30 STA $3000
.C:101c AD 01 30 LDA $3001
.C:101f 6D 03 30 ADC $3003
.C:1022 8D 01 30 STA $3001
.C:1025 EA NOP
.C:1026 18 CLC
.C:1027 AD 00 30 LDA $3000
.C:102a 6D 02 30 ADC $3002
.C:102d 8D 04 30 STA $3004
.C:1030 AD 01 30 LDA $3001
.C:1033 6D 03 30 ADC $3003
.C:1036 8D 05 30 STA $3005
.C:1039 EA NOP
.C:103a 18 CLC
.C:103b BD 00 20 LDA $2000,X
.C:103e 79 00 20 ADC $2000,Y
.C:1041 8D 04 30 STA $3004
.C:1044 BD 01 20 LDA $2001,X
.C:1047 79 01 20 ADC $2001,Y
.C:104a 8D 05 30 STA $3005
Any comments / suggestions to this? Please comment now because its less likely to change when it has been released (People expect syntax etc. to be backward compatible)
Otherwise I'll make a new beta release as soon as I have tested it a bit more and written some dokumentation.
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
i would prefer if macros wouldnt have to start with a colon... (then again, i havent checked kickass at all yet =P) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Monte C: Don't think lda16, sta16 will do, since it was add16 that brought up the topic. However, now that I got used to the semicolon idear, I think I turned out rather well.
Groepaz: I understand the ca65 philosophy, and respect it. My approach is to make general building blocks instead of alot of special cases, when im programming. When I'm extending the assembler I usually tend to do the blocks more general instead of making a new case. This makes testing easier (since there is less brances to tested), and the assembler more flexible. So you can say that im using the philosophi internally in the assembler.
btw. taking the philosophy to the extreames would mean that we only needed the .byte directive! ;-)
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Groepaz: Due to the flexibility of where to put commands etc. relative to lines (You can put more commands on one line if you like), you have to have something that signals to the assembler that it's a macro. We can change the semicolon into something else, but I guess it wasnt what you ment. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
Quote:
Due to the flexibility of where to put commands etc. relative to lines (You can put more commands on one line if you like), you have to have something that signals to the assembler that it's a macro.
why? if the parser sees a "word", it checks if its a known (pseudo)opcode, and if not checks if its a known macro. if its neither it must be a label or variable assignment. (actually the first two cases are redundant, since internally all known opcodes can be implemented as macros...thats how many assemblers work anyway)
cant see a (technical) reason at all why a macro has to start with a certain character :) (even a label delimiter is not necessary - although i think THAT is a good think to have, since it doesnt delay errors)
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Groepaz: Due to the flexibility of where to put commands etc. relative to lines (You can put more commands on one line if you like), you have to have something that signals to the assembler that it's a macro. We can change the semicolon into something else, but I guess it wasnt what you ment.
I'd like the ';' to be an alternative to '//'.
This very common with assemblers, and will work straight away with the unmodified asm-mode of emacs. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Groepaz: Sorry, but its not that simple. To implement both an assembler and a scriptlanguage, Kick Assembler relies on modern compiler techniques to analyze the source code. The first step is done with a lexical analyzer which is precalculated to fit the language. The analyzer can identify a 6510 command because it knows the mnemonics in advance, but it can't know the macro names in advance.
Tlr: I know what you mean. In the first beta versions of Kick Assembler ';' was used as oneline comments. However, this collides with using ';' in for-loops, so it had to be removed.
(.for(var i=0; i<10; i++) { <-everything after the first ; would be a comment)
But thanks for the feedback. It's appreciated!
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
Quote:Groepaz: Sorry, but its not that simple. To implement both an assembler and a scriptlanguage, Kick Assembler relies on modern compiler techniques to analyze the source code. The first step is done with a lexical analyzer which is precalculated to fit the language. The analyzer can identify a 6510 command because it knows the mnemonics in advance, but it can't know the macro names in advance.
i never said its simple (or even trivial). but its certainly doable :) what you are saying only means that your approach of implementing parsing/preprocessing/macros cant do it :o) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
simple to solve, you have to define macros in separated areas like
.startmacrodefinitions
.endmacrodefinitions
in pass 0 the compiler can resolve the macronames :)
edit: btw _wonderful_ solution to the problem I proposed, slammer for president \o/ :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
No, sorry.. its not the approach. As I wrote in the first explanation its tied together with the fact that you can place commands freely (have more command on the same line), so we need a way to tell that this is the next command. Take a look at the following example:
lsr add16
add16: .byte 1,2,3
.pseudocommand add16 arg1; arg2; arg3 {
...
}
Now tell me, Is the above a lsr with an absolote argument or a lsr with no argument and a call to the add16 pseudo command? There is no way of telling.
Edit: Oswald: thanks :-) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
I'm lost in the syntax, but maybe its not stupid to ask that can add16 be at the same time a label and a name of a pseudocommand ? |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
its pretty easy - labels are the last option, and if a label has the name of a known opcode or macro then error out. thats how most sane assemblers work anyway :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Yes you can. (just like you can have functions of the same name).
But lets end the discussion cos there are other problems involved too. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi, I have been a bit busy lately, but I finally manages to write som dokumentation. So the new beta-release with .pseudocommands are now posted on http://www.theweb.dk/KickAssembler.htm
The manual shows how to define inc16, mov16 and add16 in just a few lines (shorter than the above posted example), so the rest of a 16 bit instructionset should be straight forward to implement. (Check out page 25-26 at http://www.theweb.dk/KickAssembler_Manual.pdf)
I must admit that when the subject of adressmode detection was brought up I thought it was only a matter of cosmetics to the already existing macros. But now that the pseudocommands are implemented I thinks it's a really cool feature with alot of possibilities which I am gonna use alot :-) |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
"use alot" - as in coding demo parts? :D |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
pseudo commands will be really useful, any coder must know that there are a lot of 3-6 line code segments (16 bit stuff, loops, pointer increment,etc) we use over and over and over again, its way much better to write just one statement instead. |
| |
Jammer
Registered: Nov 2002 Posts: 1336 |
a little problem of a person who cannot code nonetheless sticks his fingers into ass (obviously it's me):
.pc=$0801 "Basic"
:BasicUpstart($1000)
.pc=$1000 "Main"
lda #$00
sta $d020
sta $d021
lupek: jmp lupek
why can't i compile such trivial piece of code? i get 'null' in logfile :| don't laugh at me :P |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Quote: a little problem of a person who cannot code nonetheless sticks his fingers into ass (obviously it's me):
.pc=$0801 "Basic"
:BasicUpstart($1000)
.pc=$1000 "Main"
lda #$00
sta $d020
sta $d021
lupek: jmp lupek
why can't i compile such trivial piece of code? i get 'null' in logfile :| don't laugh at me :P
Sounds really strange. I tried to copy paste your program into a file and assemble it and it works fine.
You mention something about getting null in a logfile, so I guess you are using Relaunch64? (Otherwise you don't need to use the logfile option). Remember to use the latest Relaunch version, where you can set up KickAss like shown below.
If you don't use Relauch then check the command line you are using for running KickAss. The error is probably to be found there.
|
| |
Jammer
Registered: Nov 2002 Posts: 1336 |
Quote: Sounds really strange. I tried to copy paste your program into a file and assemble it and it works fine.
You mention something about getting null in a logfile, so I guess you are using Relaunch64? (Otherwise you don't need to use the logfile option). Remember to use the latest Relaunch version, where you can set up KickAss like shown below.
If you don't use Relauch then check the command line you are using for running KickAss. The error is probably to be found there.
err, i only copy kickass.jar to program's dir and use
java -jar kickass.jar programtitle.asm -log log.txt
it works fine with all the examples included in the package. unfortunately it doesn't compile this one from me :| |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
There is nothing wrong with your code, and your command line look ok too.
What editor are you using? Perhaps it saves the sourcefile in a format that isn't supported by the lexical analyzer. You can test if that is the case in the following way.
Open one of my sourcefiles in your editer, make a small change (fx, insert a space) and save it againg. Then try to assemble it. If it won't assemble, then your editor have saved it in an unsuppored format.
To fix this you should look for a format option in your save file dialog. If you have saved it in a perfectly normal format and still can't get it to compile then send me the sourcefile and I'll look into it (The email address is in the introduction). Btw. both unix and windows textfiles works fine, and unicode chars like æøå is also ok.
|
| |
Jammer
Registered: Nov 2002 Posts: 1336 |
i use plain notepad then save as filename.asm, maybe that's the reason. however, i was modyfying examples in the notepad too and it worked. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I don't see why notepad shouldn't work. Try mailing me the sourcefile an I'll look at it. |
| |
cavey
Registered: Jul 2002 Posts: 68 |
Quote: i use plain notepad then save as filename.asm, maybe that's the reason. however, i was modyfying examples in the notepad too and it worked.
hmm
ahem, couple of questions:
a) do you have known-extensions hidden in the explorer display options?
b) are you sure notepad saves it as name.asm, with the asm extension?
c) check the filename.. notepad has a habit of adding .txt when saving (even though you specify it as name.asm), and with known-extensions hidden.. well, you wouldn't notice ;)
d) while you're at it, check for "hide system files" and uncheck that as well. I hate it when windows thinks it needs to hide stuff from me.
e) hit me when I totally misunderstood the problems ;) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
I'd like to throw an axe into bill gates' head every time windows wants to hide something or windows wants to tell me what to do. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
"it looks like you are writing a letter, do you want me to..." =) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
nooooooooooooo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Cavey: I got the files, and they assembled ok. Jammer told me the problem comes when you place the files in a cetain way, but I havn't been able to reconstruct it. |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Just started trying out Kick Assembler and it seems to work OK in most respects.
However, when an error occurs during assembly, the program do not seem to end with an error code (return 1), so my makefile can not detect that a problem occured and goes on to transfer a binary to my c64 memory even though no new binary file was generated by the assembler. Fixable?
Also, I find it very disturbing that Kick Assembler uses another symbol for linecomments than _every other_ assembler I know of. Kinda pointless to be forced to fix this over and over again when grabbing some code from an old project.
Anyway, it seems like a nice assembler, well worth trying out! |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I guess the return of an error code is fixed quite easily. Does anyone know an easy way of displaying the return code of a dos program, so I can test this?
BTW. Have you noticed the execute option that let you execute a program in case the assembling is successfull. I normally use it to run Vice.
The lack of ;-comments is because it would be even more irritating not to use the ; in the for loops (fx: .for(var i=0; i<10; i++) {})
EDIT: Btw. the fixing of old code can be done quite fast with a search/replace ; -> //
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
I for one welcome Slammer's new line comments. About time for some innovation in this area. ;)
Seriously, this is the smallest problem when migrating code from other assemblers. It's a bit more cumbersome to e.g. convert MXass style local variables to KickAss style. But still it's only a matter of like 10-15 mins to get a rather big project converted, and since I usually use several months on one routine, it's not really a big deal.
But it still would be nice with an "import other formats" feature. |
| |
Devia
Registered: Oct 2004 Posts: 401 |
Quoting SlammerDoes anyone know an easy way of displaying the return code of a dos program, so I can test this?
C:\>echo %ERRORLEVEL%
Beware though when implementing it. I seem to remember that there are both a Return Code and an Exit Code and only the Return Code is accessible via the ERRORLEVEL environment variable.
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Devia: Thanks for the tip.
I just implemented ERRORLEVEL=1 on errors. I will upload the new version to the webpage sometime this weekend. |
| |
Style
Registered: Jun 2004 Posts: 498 |
Slammer - why am I suddenly getting syntax errors after upgrading?
eg
:Do_irq (controlirq,$0090,true)
^
Error: Syntax error
Doesnt it like hex anymore? :)
EDIT: Found it, you mustve changed the parser's handling of whitespace, because it no longer accepts a space between a macro call and its parameters.
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Style: You are right, it no longer accepts whitespace.When implementing pseudo commands I had to make this assumptions in order to tell the difference between executing a macro and a pseudo command with an argument that starts with a parantesis (like ($30),y). I understand your confusion - hope it didn't cause too much trouble.
|
| |
Style
Registered: Jun 2004 Posts: 498 |
nope, its fine - took me 5 mins to figure it out. Wish Id spent the 5 mins before posting, really :)
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Now release 2.17 is on the site, including error codes. You can download at http://www.theweb.dk/KickAssembler.htm |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
...and I can confirm that my makefiles work as expected now. Thanks for the fix!
//FTC |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Another feature that would be nice in association with this error code return stuff is to have another kind of print statement (called something like .error) that would not only print strings in the same way as .print, but also make sure Kick Assembler returns a fail errorcode. I guess this would be quite easy to implement?
In effect, this would make it possible to issue user defined errors when some kind of restriction is violated in a function, macro, memoryusage or whatever, and actually halt the assembly process and not just print it on the screen and then go on with loading VICE or sending the code to your C64 via RR-Net or similar.
The .assert statement is there of course, but does not return an error code when failing.
(A similar feature exists in ca65 and DreamAss and...).
Just an idea... ;)
//FTC
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
You are right, that would be nice so I just implemented it. The new version 2.18 can be found on http://www.theweb.dk/KickAssembler.htm
|
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Ah! hehe.. You rule dude!
Thanks a lot for this! (..and for the bugfix I requested too.) Fast service indeed! ;)
|
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
Hmm.. Dunno if it's just me that misunderstands something, or if there is something fishy going on.
.print IEEEremainder(7,4)
.print IEEEremainder(8,3)
Prints -1 and -2 respectively, where I would have expected them to produce 1 and 2.
But it seems not to be the case that it always just produces negative versions of the results, becuase:
.print IEEEremainder(10,3)
Prints 1 nicely on the screen.
Uh.. huhu.. ? :)
Just to be clear: I expect this operation to work like modulo. Perhaps that is wrong?
Of course I can do "modulo" with binary-nice values like 8 and so on, but in this case I want to "divide" by 3...
|
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: Hmm.. Dunno if it's just me that misunderstands something, or if there is something fishy going on.
.print IEEEremainder(7,4)
.print IEEEremainder(8,3)
Prints -1 and -2 respectively, where I would have expected them to produce 1 and 2.
But it seems not to be the case that it always just produces negative versions of the results, becuase:
.print IEEEremainder(10,3)
Prints 1 nicely on the screen.
Uh.. huhu.. ? :)
Just to be clear: I expect this operation to work like modulo. Perhaps that is wrong?
Of course I can do "modulo" with binary-nice values like 8 and so on, but in this case I want to "divide" by 3...
Kickass uses java.Math.IEEERemainder for this operation, see http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#IEE.. for more indepth explanation. I guess is has to do with working with doubles, where you assume integers.
Slammer: May I suggest you add mod or % operator, aswell, which uses java's % operator directly (assuming integers ofcourse). Like:
In cml.kickass.libraries.MathLibrary:
if(name.equals("mod"))
{
nrOfArgs(2, args, a);
return new NumberValue((double)(((int)a[0]) % ((int)a[1])));
}
Or whatever... :D
/Andreas |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Damn I got Hacked :-)
Well you are right, Kick Assembler uses the java math library and IEEERemainer works correct but a bit odd. You can however easily define your own modulo function like this:
.function mod(a,b) .return a-floor(a/b)*b
and used it like this:
.var x = mod(8,3)
I guess I will include a % operator in the next release since it's used rather often.
Btw. If you wanna hack the assembler further, it is possible to insert a the above function in the 'standard library'. In the kickass.jar, find the file called autoinclude.asm and insert '.function mod(a,b) .return a-floor(a/b)*b', then you can use the mod function everywhere in you programs.. .. Or you can just wait for the next release. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I just uploaded a new release including the mod command.
http://www.theweb.dk/KickAssembler.htm
At first I made the % operator, but found out that it collides with the notation for binary numbers.. |
| |
Mace
Registered: May 2002 Posts: 1799 |
Magnificent concept!
In fact, this idea once crossed my mind when I was coding PHP for a webpage. Since it is possible to combine JavaScript, HTML and PHP all in one page, the idea of combining 'languages' for the C64 came to mind.
The exact thought I had, was: "woah, wouldn't it be nice to be able to add script to assembly code for C64?!".
Never said it out loud and I'm not capable of programming an assembler either, so you can guess my interest :-)
I started reading the manual. When I'm done, you'll receive an email with all the glitches and errors I found.
Also, I was wondering how it would be possible to distinguish between ASCII and screencodes in .text. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Thanks, Always nice with some feedback.
I'm not sure I understand what you mean by screen codes. The .text directives put out the chars corrosponding to the letters that would come out with the lower/upper case standard charset (Shifted mode). If you work in unshifted mode remember to write your text with small letters.
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
@slammer: Screencode = what you poke into the screen memory to get the corresponding char.
@ = 0, A = 1, B = 2, etc... |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Ok, then I guess my previos post answered the question: The .text directive always outputs shifted-mode screen codes. Is there a need for a ascii or unshifted-mode option? |
| |
Mace
Registered: May 2002 Posts: 1799 |
(former post deleted)
Ok, so writing in small chars would give 'a' as a $01 in the memory?
Then that's sorted, then :) |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi guys,
My internetprovider's mailserver is highly unreliable these days, so if you want to be sure that your Kick Assembler feedback, bugreports etc. reach me then use private messaging here on CSDB..
|
| |
LordNikon
Registered: Dec 2001 Posts: 42 |
Is there a way to override warnings? ...
I try to import a huge binary and i only want to change some bytes in it with the following source code. When i compile that stuff the assembler gives me a warning and doesn't produce a prg. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi, can't see your source code so I dont know precisely what you are doing.
However, I guess you get a warning because you have reached an address higher than $10000. If you only want to use some of the binary file, then use the LoadBinary command to load it into a variable and the .fill command to dump the selected part to memory:
// Use the first $2000 bytes of a file
.var file = LoadBinary("myFile")
.fill $2000, file.get(i)
Edit: On second thought, perhaps thats not what you are trying to do. Is it that you want to have overlapping memory segments?
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
I think I've had the same problem as LordNikon. Solution: Load the file into a List, modify the bytes there, and dump the content of the List. |
| |
LordNikon
Registered: Dec 2001 Posts: 42 |
Slammer: ... second ;) I want to have overlapping memory segments. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
LordNikon: Here is a little christmas present. Release number 20: http://www.theweb.dk/KickAssembler.htm. The -aom option will do the trick and the -warningsoff option will turn off the warnings if you get tired of looking at them..
Cruzer: I don't think the list solution will work in Nikon's case. It sounds like he will replace bytes with source code, which means that he should assemble the code by hand before storing it into the list.
|
| |
LordNikon
Registered: Dec 2001 Posts: 42 |
THANX!
yeah "replace" was the right word for my case ;) |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
using overlapping memory segments is silly. use one 64k segment and forget about the whole concept if you want to do that. |
| |
Case
Registered: Aug 2002 Posts: 142 |
I have just decided to have a go at coding again after a few years break and would like to use this assembler, however i'm using crimson editor and i cannot get it to assemble anything, not even the example files.
I would be grateful if someone could help me with this. |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
What kinda error do you get? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I suggest that as a start, you try to assemble the example files from a command promt.
|
| |
Case
Registered: Aug 2002 Posts: 142 |
It's ok now, I've switched to ReLaunch64 and started to reformat my source code.
I'm still having some problems assembling my code, getting silly errors:
cannot resolve symbol "anext" but i have defined it. If anyone can help me please contact me.
|
| |
Style
Registered: Jun 2004 Posts: 498 |
post code here (or in a new thread) if you like.
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
My guess would be that you refer to it before you define it, or it could be a case error - KickAss is case sensitive, so "anext" and "aNext" are two different things.
But as Style said - post the code. |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Is there a way to export a lables file with Kickassembler to use in vicemon?
Thanks |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
No, not at the moment. If you need this feature now, then I suggest you use the print command to print out the labels you need and then copy them from the console into a label-file. Something like:
.print "al C:"+toHexString(myLabel1) + " .myLabel1"
.print "al C:"+toHexString(myLabel2) + " .myLabel2"
etc.
I agree that an export of the labels would be nice, so it might be included in one of the future versions
|
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Thank you |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Ok, doing some coding in Kick Assembler now.
Maybe I'm missing something here, but how do I declare uninitialized storage?
In dasm I used to do this:
seg.u zp
org $a0
ptr_zp:
ds.w 1
And this:
seg.u bss
org $a000
var:
ds.b 1
align 256
table:
ds.b 256
This just generates the addresses for the labels in a structured way and outputs no data. ds.[b|w|l] is "define storage", although dasm will accept dc.b's and such and ignore the actual data.
The concept of a segment is an entity with a "pc" and a "uninitialized" flag. You only need to set the origin once for each segment. Everytime a seg <name> is encountered, that segment will be continued upon. (.u's need to be matched)
I'd also love to see some kind of symbol table output/export facility for those multi part code overlay demos. :)
(sure, could probably be done by parsing the ".print" output) |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
.pc= $xxxx
.byte
.word
.text
.pc= $xxxx
.
.
.
from the manual:
there is also
.align $100 //Alignment to the nearest page boundary saves a cycle
.pseudopc <expr>
Assembles code as if it was placed at a different
location.
hope this helps |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
But that generates initialized storage, no?
I'm looking for generating labels _only_ for selected regions. |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
ah ok sorry
Lets see if Slammer shows up... |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
The next version of Kick Assembler is almost ready. In this you can add a virtual flag to your memory block declaration:
.pc = $8000 virtual
label1: .byte 1,2,3,4,5,6,7,8 // This will not be stored in memory since its virtual
.pc = $9000
label2: .byte 1,2,3,4,5,6,7,8 // But this will
I guess this is what you want?
Further more, virtual memory sections can overlap other memory sections..
The new version will be out this weekend |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
@tlr: Not sure what you're trying to do, but is it something with reserving some memory, and then being able to write some data there later? If so, a List in KickAss might do the trick...
.var myList = List()
.eval myList.add(data)
.eval myList.add(moreData)
.pc = whereToStoreIt
.fill myList.size(), myList.get(i)
// this only works for bytes, if it's words then replace the last line with:
.for (var i=0; i<myList.size(); i++) {
.wo myList.get(i)
}
|
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Oh, hi Slammer, hadn't seen your answer. Looking forward to the new version :) |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Slammer don't forget about the label export... =-) |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Basically, yes! :)
I'd very much like the pop in and out of segments concept too though.
You might consider this a named scope of some kind.
For every named scope there should be a different state (pc, and so on). You should be able to end the scope, and then continue on it later by adding an identical scope statement.
Think: namespace in c++ with a twist.
Something like this:
.segment zp {
.pc = $a0 virtual
ptr_zp: .word 0
flag_zp: .byte 0
}
.segment code {
.pc = $1000
sei
... code here ...
}
.segment bss {
.pc = $4000 virtual // or even .pc = segment(code).end or similar
flag: .byte 0
.align 256
tab: .fill 256 // should default to .fill 256,0 if it doesn't already
}
.segment zp {
ptr2_zp: .word 0
}
.segment code {
... more code ...
}
.segment bss {
... more bss ...
}
maybe even:
.segment code {
scope: {
.segment zp {
ptr_zp: .word 0
}
}
}
to allow ptr_zp to be available only in a local scope.
What do you think? |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
A cool thing about segments appart from organizing large code is if the possibility to save segments separately is added in some form.
If overlapping segments are allowed (by segment flag), overloading code (and data) parts of a demo can be conveniently represented. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I'll consider it for future version. However, the features for next version is already done. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Sounds great!
I'll be happy with "virtual" for now. :)
The usefulness of segments really shows when you start splitting your program into many files (which I often do).
With segments you can add stuff to bss and zp locally within each file. No need to keep that in a special place. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: No, not at the moment. If you need this feature now, then I suggest you use the print command to print out the labels you need and then copy them from the console into a label-file. Something like:
.print "al C:"+toHexString(myLabel1) + " .myLabel1"
.print "al C:"+toHexString(myLabel2) + " .myLabel2"
etc.
I agree that an export of the labels would be nice, so it might be included in one of the future versions
Not entierly required but is there a way to do something like this?
(i.e can I get the passed symbol name and or type from within a macro (or other construct))
.macro export(sym) {
.print ".var " + sym.name + "= $" + toHexString(sym)
}
label:
jmp label
:export(label)
Currently I'm just passing the name as a string as well.
BTW, redirecting print output to different files would be cool.
'>>' syntax perhaps, or .open and .print <file> <string>? |
| |
Oswald
Registered: Apr 2002 Posts: 5094 |
tlr, you are getting over the moon with all that stuff imho. so far I have never needed anything more complex than the good ole tasm. when I will switch over finally to crossing that will be solely for the better editing capabilities, and some sutff like +/-, but definitly not for virtual or real segments, label exporting, and 3d matrices in objects... |
| |
Scout
Registered: Dec 2002 Posts: 1570 |
Quote: tlr, you are getting over the moon with all that stuff imho. so far I have never needed anything more complex than the good ole tasm. when I will switch over finally to crossing that will be solely for the better editing capabilities, and some sutff like +/-, but definitly not for virtual or real segments, label exporting, and 3d matrices in objects...
I was thinking the same thing.
Isn't the code going to be bloated with structs, macro's, functions now which make it unreadable?
?too many options error
I think i'll skip using this assembler... |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Oswald, Scout: Sure, but I already use things like the segment feature of dasm extensively in my code and I intend to port much of that to kick assembler.
Besides, Kick Assembler is already about "many options"...
Sure it can be done with pen and paper, but with a small kid at home I need all the timesaving I can get. :)
The main thing I like about kick assembler is to be able to generate stuff like sine tables parametrized directly in the source. No need to generate that externally just to fix some rounding error or thing like that.
That said, I have just started doing one part in it and so far it works out fine and I'll probably be happy with just the forthcoming "virtual".
The other stuff is just suggestions of functionality from other assemblers which I thought might fit.
All of which should ofcourse be optional!
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Many options gives you a choice. You are free to take advantage of them, and if you don't like them just program as you normally would. I don't se how this can be a bad thing.
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Maybe it's not obvious for everyone that you can program basically the normal way if you like, hence the critisism?
e.g this is still a valid program in kick assembler, no need for any frills if you don't need it.
.pc = $1000
sei
loop:
inc $d020
jmp loop
I think kick assembler is a very fresh and flexible way of doing coding.
Just pick and choose the features you like! :)
Slammer, you did a very good job on this! |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Keep up the good job Slammer! |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Thanks guys.
I have just uploaded the new version so now you can user virtual memory blocks. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote: Thanks guys.
I have just uploaded the new version so now you can user virtual memory blocks.
Super, works like a charm! :)
I have another question:
Is it possible to reference the pc/define labels that is not equal to the current pc (like in Tasm/dasm or others)
e.g:
lda #$00
hi_addr = * + 2
sta $1000
or
sintab:
.fill 256, blahblah...
costab = sintab + 64
I tried with .var or .const, but that won't allow forward references which is a bit awkward.
Maybe I missed something in the docs?
EDIT: well, I missed the pc stuff in the docs, it's actually precisely '*'. :) |
| |
Mace
Registered: May 2002 Posts: 1799 |
Just got a weird idea the other day, that might not be usefull in a lot of occasions, but it would be nice if it existed... something to code on a rainy Sunday, so to speak ;)
In a program I'm working on, I want to use as little a memory footprint as possible. So I put code in the bitmap, where there are no visible graphics and make sure the colour codes are black.
However, weaving the monolithic code through the available space is a rather awkward job.
Wouldn't it be nice to have some way to 'reserve' certain spaces of the memory and drop data/code in the gaps between it, automatically splitting it and perhaps add JMPs to link the parts?
Just a thought... and I found it very much in the idea of Kick Assembler :) |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: Just got a weird idea the other day, that might not be usefull in a lot of occasions, but it would be nice if it existed... something to code on a rainy Sunday, so to speak ;)
In a program I'm working on, I want to use as little a memory footprint as possible. So I put code in the bitmap, where there are no visible graphics and make sure the colour codes are black.
However, weaving the monolithic code through the available space is a rather awkward job.
Wouldn't it be nice to have some way to 'reserve' certain spaces of the memory and drop data/code in the gaps between it, automatically splitting it and perhaps add JMPs to link the parts?
Just a thought... and I found it very much in the idea of Kick Assembler :)
I want this feature as well in ca65. Although the cases where it's useful are rather limited. But for example interleave speed code that changes the graphics in an FPP-based effect would be a school book case. =) |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
In ca65 it would be useful in the following case too:
You want a segment with code from 0800 or so to somewhere like $8000, however, you also want a segment "inserted" from $1000 to $xxxx containing a tune. It would be nice if the linker would be able to figure out by itself where to split the contents of the codesegment WITHOUT explicitly having to supply the absolute size of the tune and divide the code segment in two and move code from codesegment_part1 to codesegment_part2 in case the first one overflows or so. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I finally got at litte time to check up on the latest ideas.
- Symbol exports for vice : Can't take long to implement so I guess it will be in the next release. Scoped variables might collide, but I guess we can find a solution.
- Segments / namespaces : The more I think about it, the more I think it's a great idea. Its quite simple, but It will solve alot of problems. Do you prefer brackets {}?. There are both pros and cons and I havn't really made up my mind on heavily indented assembler code. however I don't fancy notations like .namespace_start, .namespace_end.
- Export of symbols (for multi part demos): That is allready on my todolist. Are there any preferences? Should we export all symbols or only ones given by export commands? (If it's combined with a namespace the symbols won't collide)
- Splitted codememoryblocks with jmp instructions to tie them together: This is an interesting idea. Not quite trivial. I guess it requires branch commands (bne, beq, bcc .. ) that can jump to a random address, since your normal branch commands easily could get out of range. It can be done, but I think it will take some time.
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote:- Segments / namespaces : The more I think about it, the more I think it's a great idea. Its quite simple, but It will solve alot of problems. Do you prefer brackets {}?. There are both pros and cons and I havn't really made up my mind on heavily indented assembler code. however I don't fancy notations like .namespace_start, .namespace_end.
The indentation is a concern I haven't resolved either, but I think I still prefer brackets.
Quote:- Export of symbols (for multi part demos): That is allready on my todolist. Are there any preferences? Should we export all symbols or only ones given by export commands? (If it's combined with a namespace the symbols won't collide)
Doesn't matter to much because unless it produces something that can be directly used when assembling another file it still has to be parsed and processed.
All symbols to a file will help me achieve that, others may have higher demands. :)
The process could be streamlined with .print to a custom file + macros though.
A structured export would help if you decide to implement some object-format (as in .o) later.
I'd like all of the above, but if I had to pick one it would be just a symbol table dump.
A couple of others:
- how about defining labels from an expression like in my post above? (i.e allowing forward references to a calculated address)
- toDecString() (so you can print integers)
- some way to resolve a passed parameters "name" when inside a macro/function. I guess it will be kind of a hack as I assume you do call by value. It would be quite useful though. |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
@tlr: Hehe.. nice to see someone request all those things I found KickAssembler to be lacking when I tried it it a year ago or so. ;)
The assembler has some great potential. The biggest reason for me not to use it was the fact that it was not as good as other assemblers in figuring out expressions involving the *, since the script stuff seemed to be resolved long before the value of * is resolved.
Right? |
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Is there problems with files names bigger than 8.3?
I had a big file name and when I tried to run it in vice it would display an error "JAM at $200A", I didn't know how to sort this and asked to some friends about this and couldn't find why it was happening.... today... I renamed my file to just 5 characters plus extension and it worked , no need to recompile just change the file name, now I don't know if this is a problem of Kickassembler, Pucrunch or Vice... 80 |
| |
Mace
Registered: May 2002 Posts: 1799 |
Quote:- Splitted codememoryblocks with jmp instructions to tie them together: This is an interesting idea. Not quite trivial. I guess it requires branch commands (bne, beq, bcc .. ) that can jump to a random address, since your normal branch commands easily could get out of range. It can be done, but I think it will take some time.
Thank you for picking up the idea and thanks JackAsser for the support ;)
The CodeWeave() should have the option to be used OVER existing code/binary/whatever and IN BETWEEN code. What I mean is that it should either weave over a binary (graphics) given a certain mask byte and snap (will get to that later) or it should weave between code blocks that are generated out of the source code.
For binary weaving, like I am doing with graphics, I need to have a recognition byte, over which the code can be inserted. But not on EVERY location where this byte is, I want code. Only if, say, the piece of weaved code is long enough AND if it stays between the margins of a cluster of 8 bytes (for char colour purposes).
So you should be able to set a lower limit of code length and a snap value.
But with code generated from the source, you can't set the byte, so there should be something to tell the compiler that it should put the code in 'virtual empty' memory, if you catch my drift...
Hope this helps :-) |
| |
Frantic
Registered: Mar 2003 Posts: 1648 |
I haven't followed the discussion in detail, but wouldn't a CodeWeave()-function be optimally useful it it could be used both to fill spaces in terms of bytes, but also in terms of cycles.
I mean, if you open the sideborder on every line and want to weave code in the free time in between, rather than filling up a specified number of bytes, then it would be Kick Ass(embler) handy-pandy crazy bikini-nice to be able to weave it in there.. :)
//FTC |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
tlr: I thought abount making constants (const) be visible like labels in the whole scope. I guess that will solve your label definintion problem. toDecString - why not. I thought nobody needed it since you can just write .print "x="+x and get the floating point representation. Resolving a parameters name inside a macro might get a little hard, since variables are dereferenced when parsed as parameters.
Frantic: I don't know your exact problem, but I can tell that I have a new evaluation mechanism on the sketchboard that don't bind a tasks to a specific parse. Insted as much as possible is done in the current parse and if something is missing then another parse is executed. This will eliminate problems occuring because you have defined one memoryblock before another etc. About weaving with cycles. I don't think it will work since the sideborder code will trash the register and statusflags.
Algarbi: I dont think the filename length have anything to do with Kick Assembler. It works on javas String class which has no limitations as far as I am aware of.
Mace: You lost me a bit there. I dont think it's good to make directives so specialized. Its better to keep the simple and flexible. So an approach could be to use a simple loop from the scriptlanguage to search through the graphicsdata to find empty spaces and put them in a list which you can give to the weave directive. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote:tlr: I thought abount making constants (const) be visible like labels in the whole scope. I guess that will solve your label definintion problem. toDecString - why not. I thought nobody needed it since you can just write .print "x="+x and get the floating point representation. Resolving a parameters name inside a macro might get a little hard, since variables are dereferenced when parsed as parameters.
consts visible as labels is perfect for me. Doesn't break the paradigm either as consts cannot be redefined.
About dec, I just though it looked strange when doing prints like this: "(300.0 bytes, 2.0 blocks)" :)
I thought the parameter stuff might get hard. I'll think up some more cool use cases first and maybe you'll get interested. ;)
|
| |
Mace
Registered: May 2002 Posts: 1799 |
Quote:Its better to keep the simple and flexible. So an approach could be to use a simple loop from the scriptlanguage to search through the graphicsdata to find empty spaces and put them in a list which you can give to the weave directive.
Define 'empty'. In bitmaps it should at least stick to a snap of 8 bytes and it should set to a minimum of space in which code will be weaved, otherwise you end up having a lot of small parts...
But hey, I just gave an idea, you work it out ;) |
| |
Sasq
Registered: Apr 2004 Posts: 156 |
I was just wondering if you plan to support other targets than C64 ? I'm considering using KickAssembler for Atari 2600 programming... (allthough I guess it's pretty easy to just ORG it to the right place and strip the first 2 bytes from the file)
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I have never owned an atari, so I don't know which chages are required.
But if all that have to be done is to add a target switch, which outputs to a file without the adressbytes and makes the memory block start at a predefined adress, then sure. But I will have to have someone who can test that it works (and tell me what the predefined adress is). |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
I'm definitely against a cycle based code weaving function, since I just finished coding one in machine code, so I don't want my work to be wasted. :)
|
| |
Barbarossa
Registered: May 2007 Posts: 31 |
Hi all,
A year ago today I picked up 6510 coding again after 14 years of absence. I discovered the wonders of crossassembling and started out to work again on a large project I abandoned back then. I found C64Asm and started to work with that. This was before I discoverd more assemblers and before I discovered forums like this one.
C64Asm was perfectly suited for my needs. It did everything I wanted except for the inability to use variables for zeropage locations (which are converted to absolute as you all probably know). I therefore used the absolute numbers in my sources. But managing the sources (especially in a large project when zeropage locations change frequently) was a pain in the ass.
I then decided after a year (I waited this long, since I saw no other limitations of C64asm and was reluctant to change) to switch to another assembler. After studying CA65 I decided to go with KickAssembler (I read some good reviews here).
I started translated a 1500 line source (which was a lot of work due to the very different syntax) and I finally got it to work.
Some questions remain:
1. When I use :BasicUpstart($7700) it compiles as 10 SYS 30464.0
I don't really need this function and it works like this, but I was wondering why is there a float and not an integer?
2. With C64Asm I could dissamble my old binaries .prg files so I didn't have to start from scratch again. Any chance this will become a feature in KickAssembler? Or should I dissamble with C64Asm and then translate the source to KickAssembler (sigh)?
3. What I really miss in KickAssembler is dissambly output. In C64Asm you could generate a reportfile, with the dissambly and the source in one file. This is, in my opinion, crucial for debugging. Is there a way to do this?
Thanks in advance for your answers and kudos to your great forum.
John |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
1. BasicUpstart is just a macro which is autoincluded when you load kick assembler. It looks like this:
.macro BasicUpstart(address) {
.byte <upstartEnd, >upstartEnd,10,0,$9e
.text ""+address
.byte 0,0,0
upstartEnd:
}
Since we do not yet have a toDecimalString function I just use the normal toString function to write the string of the adress. It will probably be included in the next version since tlr needs it.
NB. I just reverse engineered the basic code. If somebody have better knowlegde of the basic format then tell me.
2. Perhaps it will, but it will not be the first project i will do.
3. Sounds interesting, I'll check it out..
Btw. If any of you need the toDecString now you can just define it in the scriptlanguage like this:
// The function
.function toDecString(value) {
.var strValue = ""+value
.for (var i=0;i<strValue.size(); i++)
.if (strValue.charAt(i)==".") .return strValue.substring(0,i)
.return strValue
}
// Some examples
.print "decString1="+toDecString(15.12324)
.print "decString1="+toDecString(11)
.print "decString1="+toDecString(-3.9)
// Basic upstart macro with decString
.macro BasicUpstart2(address) {
.byte <upstartEnd, >upstartEnd,10,0,$9e
.text ""+toDecString(address)
.byte 0,0,0
upstartEnd:
}
|
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Quote:1. BasicUpstart is just a macro which is autoincluded when you load kick assembler. It looks like this:
.macro BasicUpstart(address) {
.byte <upstartEnd, >upstartEnd,10,0,$9e
.text ""+address
.byte 0,0,0
upstartEnd:
}
Your end pointer is wrong!
Do this:
.macro BasicUpstart(address) {
.word upstartEnd // link address
.word 10 // line num
.byte $9e // sys
.text ""+address
.byte 0
upstartEnd:
.word 0 // empty link signals the end of the program
}
In reality only the MSB of the last link address has to be $00, so upstartEnd can be the start of the program if certain instructions are used. e.g LDA #$00 ($A9 $00), etc... |
| |
Barbarossa
Registered: May 2007 Posts: 31 |
Slammer,
If you need some example output from C64Asm from my source, let me know. It will give you an idea to work with.
How I normally debug on my 2-monitor system (yes I am that spoiled :) ) is to run the C64 emulator in single step trace mode on the left screen, and have the output text file on the right screen.
Then during debugging I would have al the variables, all the comments and everyting from the source available including of course real address info.
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Tlr: Thanks
Barbarossa: That would be nice, I'll pm you an email address to send it to. |
| |
Jammer
Registered: Nov 2002 Posts: 1336 |
help! i got something like this:
;--------------------------------------------------
;--------------------------------------------------
; Kick Assembler v2.15 - (C)2006 Mads Nielsen
;--------------------------------------------------
;--------------------------------------------------
parsing
pass 0
pass 1
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.<init>(Unknown Source)
at cml.kickass.state.StdScope.<init>(StdScope.java:20)
at cml.kickass.state.ForScope.addIteration(ForScope.java:34)
at cml.kickass.directives.ForDirective.doLooping(ForDirective.java:83)
at cml.kickass.directives.ForDirective.parse1(ForDirective.java:36)
at cml.kickass.AssemblerToolbox.runParse1(AssemblerToolbox.java:54)
at cml.kickass.directives.BlockDirective.parse1(BlockDirective.java:30)
at cml.kickass.directives.ForDirective.doLooping(ForDirective.java:90)
at cml.kickass.directives.ForDirective.parse1(ForDirective.java:36)
at cml.kickass.AssemblerToolbox.runParse1(AssemblerToolbox.java:54)
at cml.kickass.directives.BlockDirective.parse1(BlockDirective.java:30)
at cml.kickass.directives.ForDirective.doLooping(ForDirective.java:90)
at cml.kickass.directives.ForDirective.parse1(ForDirective.java:36)
at cml.kickass.AssemblerToolbox.runParse1(AssemblerToolbox.java:54)
at cml.kickass.KickAssembler.main(KickAssembler.java:124)
what could have made it happen and how to solve it? my source is barely 6700 bytes long so i have no clue :/
edit: consider it solved ;) it was just typo in on of the loops filling memory with bytes (x=0; x<blahblah; but here incorrect z++)
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Good to hear you solved it (Endless loops - a classic)
It is possible to make programs that are so large that the default java heapspace is too small. You can raise it with the argument Xms (initial heapspace) and Xmx (maximum heapsize). Eg:
java -Xms800m -Xmx1000m -jar KickAss.jar sourcefile.asm
It don't happend very often.
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
A small update(v2.25) is now on the website with a couple of the things discussed here. |
| |
tlr
Registered: Sep 2003 Posts: 1790 |
Thanks! Will try. |
| |
The Shadow
Registered: Oct 2007 Posts: 304 |
Slammer,
thank you for the info to the Kick Assembler. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
No problem. I'm happy to help |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Hello Slammer,
just been trying out this new cross-assembler for first time... I'm really impressed :) will be using this from now on!
Keep the very impressive work up, sir! |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
finally actually doing something with this kick ass assembler. the only small probs I ran into so far were easily solved as the manual seems quite complete ;) |
| |
TDJ
Registered: Dec 2001 Posts: 1879 |
Quote: finally actually doing something with this kick ass assembler. the only small probs I ran into so far were easily solved as the manual seems quite complete ;)
Dude, you're coding? I expect a new SCS+TRC demo for X2008 then! |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
Quote: Dude, you're coding? I expect a new SCS+TRC demo for X2008 then!
you gotta be kidding me ;) |
| |
TDJ
Registered: Dec 2001 Posts: 1879 |
Quote: you gotta be kidding me ;)
When it comes to a new SCS+TRC demo, I do not kid.
But a new Pain demo is welcome too .. maybe you can get Sonix to do the graphics for it? :) |
| |
Scout
Registered: Dec 2002 Posts: 1570 |
Quote: finally actually doing something with this kick ass assembler. the only small probs I ran into so far were easily solved as the manual seems quite complete ;)
o_O
W00t! |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Dear Slammer (or anyone using kickass),
I'm having some trouble with this particular code to declare a list of strings and read a char from each string to store as a byte in memory. here's the code:
.var InfoList = List(12)
.pc=$0400
.for(var j=0; j<InfoList.size(); j++)
{
.for(var i=0; i<InfoList.get(j).size(); i++)
{
.by [InfoList.get(j).charAt(i)]
}
}
(and yes I've put the .eval stuff in aswell to enter strings, but that's too much to look at right now ;)
But I'm getting this common message:
"Error: Cant get a numeric representation from a value of type string"
Am I missing some function out to read a character and store as byte or is it something wrong in the code? |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
have you tried ".te" instead of ".by"?
|
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Hello Cruzer.
Thank you for your suggestion as now the routine logically works, however it isn't doing exactly what i want it to do...
Basically what I want to do is when writing the list of strings to screen memory, encrypt each character with a certain byte. e.g. "A" character in list string shows "B" character on screen memory if encrypted by +$1.
if i do this:
.te [InfoList.get(j).charAt(i)]+$1
it only concatenates the "1" figure to the string, which is why I thought .by would do it.
Any other methods ? |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi Conrad
Kick Assembler doesnt support char objects (yet), so when you use the charAt(i) function it really just returns a string with the char at position i. Since its a small pretty straight forward job to implement it, it will probably be included in one of the future versions.
Right now im working on Kick Assembler 3.0 which makes major changes the underlying architecture of the assembler (Dont worry, the syntax for the sourceode will be unchanged). This means that their migth go some time before the next Kick Ass version.
However, you can make a charValue routine with a hashtable like this:
.var allChars = "abcdefghijklmnopqrstuvwxyz"
.var charToValueTable = Hashtable()
.var valueToCharTable = Hashtable()
.for (var i=0; i<allChars.size(); i++) {
.eval charToValueTable.put(allChars.charAt(i), i)
.eval valueToCharTable.put(i, allChars.charAt(i))
}
So in your code you write:
.by charToValueTable.get(InfoList.get(j).charAt(i))+1
|
| |
Conrad
Registered: Nov 2006 Posts: 849 |
Hey Mads.
I've managed to get the code working using hashtable as you shown, so thank you so much for your help! :) much appreciated.
Looking forward to your next version, once complete of course. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
@conrad: I've never actually used Kick Assembler, but I suggest you put your encryption scheme directly into the Hashtable also, thus making the Hashtable-hack a little bit less ugly and a bit more justified. ;D
Anyways Slammer, this seems to be a great assembler. As I've stated earlier, I'd like Kick Assembler joined with the linking from CC65... ;D |
| |
Conrad
Registered: Nov 2006 Posts: 849 |
@Ja: Point taken, thanks! - even though the encryption I'm including is nothing more than just a simple addition/subtraction of so many bytes ;) |
| |
Ricky
Registered: Jan 2008 Posts: 3 |
Just converted some source from my old patched a6-assembler to kickass today...
Thanks Mads! Your assembler will be my prime choice from now on!
/Ricky |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Thanks, good to hear.
|
| |
Iapetus/Algarbi/Wood
Registered: Dec 2004 Posts: 71 |
Thx for the export symbol functionality :) |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
I found a small bug in v2.25, when you import a c64 file say ranging from $1000-$1fff, I can't set the .pc to $2000 without causing an overlap warning. seems its off by 1... |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: I found a small bug in v2.25, when you import a c64 file say ranging from $1000-$1fff, I can't set the .pc to $2000 without causing an overlap warning. seems its off by 1...
Sorry for the really really stupid question but isn't a "c64 file" a .prg-file? A .prg-file ranging from $1000-$1fff would take exactly $2002 bytes on disk due to the start address, and thus overlap by 2 bytes.
But then again I'm probably completely wrong since I've never used Kick-Ass. ;D |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
KickAssembler supports imports from source, binary, c64 and text files. So if you write:
.import c64 myfile.prg It will skip the first two bytes. I will check it out if there is an error. |
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
Quote: KickAssembler supports imports from source, binary, c64 and text files. So if you write:
.import c64 myfile.prg It will skip the first two bytes. I will check it out if there is an error.
yes but
.pc = $1000 "Bla"
.import c64 "bla.prg"
.pc = $2000 "Bla 2"
jmp *
will throw a warning if bla.prg is a prg from $1000-$1fff (including $1fff) |
| |
wattie
Registered: Dec 2003 Posts: 57 |
I'm having the same problem here as Burglar
.pc = $0800 "Program"
<code till $080c>
.pc = $080d "Program"
.import c64 "file.bin"
leads me to the same error. |
| |
Cruzer
Registered: Dec 2001 Posts: 1048 |
Quote:leads me to the same error. If you get this as an error you can always give it the "-aom" argument to reduce it to a warning.
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi, I can't reproduce the error. The following works ok:
.pc = $1000 "one byte"
.byte 1
.pc = $1001 "one more"
.byte 1
.pc = $2000 "charset"
.import c64 "endcharset.c64"
.pc = $2800 "byte after charset"
.byte 1
with this result:
Memory Map
----------
$1000-$1000 one byte
$1001-$1001 one more
$2000-$27ff charset
$2800-$2800 byte after charset
Notice that the last byte in the range in the memory block belongs to the block so the one byte from $1000 gives a block from $1000-$1000 which means that you have to start the next block which endrange+1.
Also check the range of your input file
If none of the above explains the warning then send your code and file to me and I will check it out.
|
| |
Burglar
Registered: Dec 2004 Posts: 1101 |
hmmm, odd, maybe indeed my input prgs are 1 byte too long, and I thought I checked it properly... ;)
will check it out later today and thanks for the quick response! |
| |
Barbarossa
Registered: May 2007 Posts: 31 |
I get a strange error in the script language. It looks like it is impossible to uses parenthesis within the arguments of the .if command.
For example:
.if ((i+1)*8<j) results in a syntax error, but
.if (i+1*8<j) compiles okay but obviously results in a wrong argument.
Anybody encountered this before? Is there a workaround? The only thing I can come up with is to put the left argument in a variable and use that in the .if statement. Not very pretty but works if there is no other solution available.
|
| |
Shadow Account closed
Registered: Apr 2002 Posts: 355 |
Use square parenthesis [ ]inside the if:
.if([i+1]*8<j)
At least that's how I recall it. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Quote: I get a strange error in the script language. It looks like it is impossible to uses parenthesis within the arguments of the .if command.
For example:
.if ((i+1)*8<j) results in a syntax error, but
.if (i+1*8<j) compiles okay but obviously results in a wrong argument.
Anybody encountered this before? Is there a workaround? The only thing I can come up with is to put the left argument in a variable and use that in the .if statement. Not very pretty but works if there is no other solution available.
For a more pretty workaround you could:
(i+1)*8 => i*8 + 1*8 => i*8 + 8
:D |
| |
Barbarossa
Registered: May 2007 Posts: 31 |
Of course brackets, that's a good solution. Thanks!
I never thought of that. I use them already in arguments for opcodes (e.g. lda #[3*23]) but I never thought of that for the scriptlanguage. A bit strange though that it doesn't allow for that. Maybe future update!
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Hi Guys
I have started a new series of improvements on Kick Assembler. First of all some major core changes have been made which have resulted in version 3.0. The assembling is now done using a flexible pass algorithm and some techniques have been added to make the assembling more flexible and efficient.
The current version is now version is now 3.1, featuring chars and namespaces. More features will follow. Currently no known errors exist and all old sources are assembling, however a major release will first be uploaded to CSDB when I have seen Kick Assembler 3.x work stable for some time. If you want to use the latest beta you can find it on the website (http://www.theweb.dk/KickAssembler/Main.php)
|
| |
Mix256 Account closed
Registered: Dec 2008 Posts: 26 |
Cool! Seems a bit faster.
But the virtual-stars on the mem-map has disappeared.
|
| |
LOGAN Account closed
Registered: Aug 2003 Posts: |
Hey Slammer, thanks for working on KickAss, it kicks ass. Things like supporting some formats like images and PC formatted SID files is great, innovative and useful as is the import c64 binaries addition. Also macros are useful to create your own libraries. Memory maps generation are also nice.
I switched for compiling MOTAS to KickAss and while it has it's own quirks (ie // as remarks, only lower case opcodes/addressing, specific syntax it's an assembler with advanced options. I hope more and more people will switch to KickAss.
Keep up the good work! |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Mix256: Good observation. I Just upped version 3.2 which takes care of the problem.
Logan: Thanks. |
| |
Mix256 Account closed
Registered: Dec 2008 Posts: 26 |
Great, but their length are now -1... :)
-----
v2.25
-----
$62ac-$6bb5 Object Routines - Common
*$6e00-$7966 Object Routines - World 1
*$6e00-$779e Object Routines - World 2
-----
v3.20
-----
$62ac-$6bb5 Object Routines - Common
*$6e00-$6dff Object Routines - World 1
*$6e00-$6dff Object Routines - World 2
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
I upped a new one.. Try again :-) |
| |
Mix256 Account closed
Registered: Dec 2008 Posts: 26 |
Works like a charm, thanks!
KNG wouldn't (become to) exist if it wasn't for this excellent asm. Great work!
|
| |
assiduous Account closed
Registered: Jun 2007 Posts: 343 |
Quote: Cavey: I got the files, and they assembled ok. Jammer told me the problem comes when you place the files in a cetain way, but I havn't been able to reconstruct it.
i get "parsing,null" using plain kickass.jar prog.asm -log textfile.txt if an exclamation mark is used somewhere in the dir path. |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Could you be a little more specific of how you get this error?
I just tried -log test!test/a!b.txt and it works ok.
Then i tried and an exclamation mark in the Kick!Assembler dir, which works fine too:
C:\Download\Kick!Assembler\Examples\MusicIrq>java -jar ..\..\KickAss.jar MusicIr
q.asm
//------------------------------------------------------
//------------------------------------------------------
// Kick Assembler v3.4 - (C)2006-2009 Mads Nielsen
//------------------------------------------------------
//------------------------------------------------------
parsing
flex pass 1
flex pass 2
Output pass
Writing file: MusicIrq.prg
|
| |
assiduous Account closed
Registered: Jun 2007 Posts: 343 |
test.asm:
.pc= $1000
rts
along with the latest version of KickAss.jar located in D:\kickasstest!\
command prompt:
D:\kickasstest!\KickAss.jar test.asm -log textfile.txt
the content of textfile.txt:
parsing
null
then "!" is removed from the dir name and the following prompt is run:
D:\kickasstest\KickAss.jar test.asm -log textfile.txt
the content of textfile.txt:
parsing
flex pass 1
Output pass
Writing file: test.prg |
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Ok, now I reconstructed it. You found a bug in Java!! It handles resources wrong in jar-files when the the dir-path ends with an !. So C:\KickAssTest! is bad and but C:\KickAssTest!x is ok. Just place the jarfile in a dir that doesnt end with !.
The funny thing is that if you unpack the jar file to KickAss!, set the CLASSPATH and run KickAssembler without the jarfile, then it works ok. So if you want dirs ending with '!' you can have it, but its a bit easier just to rename you dir.
.. unzip to KickAss!, then
C:\KickAssTest!>set CLASSPATH=c:\KickAssTest!\KickAss!
C:\KickAssTest!>java cml.kickass.KickAssembler test.asm
parsing
flex pass 1
Output pass
Writing file: test.prg
C:\KickAssTest!>
|
| |
Slammer
Registered: Feb 2004 Posts: 416 |
Thread is closed, use "Kick Assembler Thread 2" instead. |