These additions open up a way for the option of generating multiple files from one source, which I've been planning for years. It would be limited to declaring the extensions of the produced files, analogously to the main file.

Nice thing, thanks. I even already have an idea of a project where it is a necessity =)

The addition of format affected the forward referenceability of a format macro I wrote, and while trying to fix it, I realized that a nice solution would be to redirect format? type args& to format?.type args. It seems like this would be a useful feature to have in fasmg natively, similar to how the end directive is implemented, which would make defining custom formats easier.

The addition of format affected the forward referenceability of a format macro I wrote, and while trying to fix it, I realized that a nice solution would be to redirect format? type args& to format?.type args. It seems like this would be a useful feature to have in fasmg natively, similar to how the end directive is implemented, which would make defining custom formats easier.

This is exactly how it works internally, even if I did not document it.

PS. I have update the Windows headers package to use this variant, forward-referenced FORMAT does work correctly there. I guess I need to make this a documented feature then.

I have made another tiny addition to the language, which addresses two separate but similar problems.

First is the problem with defining a variable named like one of the instructions. The trick with a trailing dot often works, but the explanation of why it helps is quite complex, and this does not reliably work in all cases - for example trying to define case-insensitive "irp" as a variable with "irp?." identifier would still fail.

Second, much less important problem is related to the recent addition of a support for numeric names inside identifiers. While this allowed to define such named symbols inside explicitly specified namespaces, there is no way to directly define or access such symbol from inside such namespace unless the parent symbol of the namespace is known.

I have introduced a new syntax variant - with added "?" character right at the start of an identifier - that helps to define symbols with problematic names as mentioned above:

The addition of VIRTUAL AS has also pushed me to enable a feature that was long lurking from under the surface of fasmg engine, but I was postponing its inclusion because I was not sure what syntax should it use.

That feature is the ability to "continue" previously closed VIRTUAL block, allowing to append new data definitions at the end of such block.

I decided to use the simplest possible syntax for it, just VIRTUAL followed by the area label that needs to refer to a previously defined VIRTUAL block:

Not only does it allow to easily build auxiliary files piece after piece, this feature also makes it much easier to implement things like switching back and forth between definitions for code segment and data segment, etc. Multiple program segments can be assembled in parallel in virtual blocks, and only when they are finished they may be copied into an actual output. This is something that was very hard to do in the fasm 1 architecture, but is really easy within the design of fasmg.

I have managed to improve the parsing of fasmg's macros a little bit more. Please try the i0j8x release and let me know how it performs. As far as I know the name-caching changes I made should not break anything, but still I could have introduced some new bugs.

Are you sure there is nothing else interfering? Such a huge difference is unexpected. In all my tests i0jae is slightly faster than i0j8x but these are not large differences, they should be around 5%, 10% at most.

So I tracked down what was causing the regression, and it turns out that every failing match is about 2-4 times slower from hykpg to i0jae, and my test case happened to execute over 140000 unsuccessful matches.
Edit: In comparison, successful matches are only 5% slower.

Interesting, as MATCH should not even be affected by any of the changes made recently. Could be some misalignment in code but then it would be curious that the difference is so large. Or perhaps some memory cache issue. What do these matches look like?

I tried with a few simple ones, but on my machine they work exactly as fast with the i0jae as with hykpg (as expected, because MATCH implementation has not been changed).

The form of the match appears to make no difference, however it was not reproducible on either the mac or windows versions (under wine or vm), but I did reproduce it on three very different linux machines (native and vm).

You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot vote in polls in this forumYou cannot attach files in this forumYou can download files in this forum