r2625 (2021-04-25) ================== The last release got more than a year old now and there were plenty of pending corrections to be released. Some planned features still didn't made it in. Maybe next time. **Fixes** * .fill/.align multi byte pattern fix Broke due to changes in r1845. * Wrong diagnostic for incomplete byte string The missing closing quote was pointed at the wrong place * Incomplete diagnostic message The opcode was not displayed in some cases * Diagnostic locations fixed In some cases the location was wrong * Duplicate diagnostic messages avoided In some cases redundant diagnostics was output * Crash while .function declaration and macro init parameters Found by Pierre * Improved filename portability checks In some cases case insensitive filenames were not recognized * Diagnostics of non-portable filename characters improved Now points at the problematic character. * Functions did not execute as loop and other conditions Now they do. * Can't calculate errors related to functions In some cases these were incorrectly reported * 4510 missed had () instead of (),z addressing mode Now same as 65CE02 in this regard * Improved format() diagnostics It's more strict now * Floating point bitops didn't work as intended Actually in some cases they did work but mostly not * Dot eor operator works again in TASM compatible mode Got broken due to syntax clash with hexadecimal floats * Wrong message text for invalid unary operators Tried to diagnose them like binary by mistake * Improved syntax highlighting In some case it didn't highlight well on vim * Byte string compare didn't work properly In case a byte string was inverted. * In some cases .null failed to detect zeros For example for ~$ff **Changes** * Comment nesting Directives are not recognized now in commented block * Negative size an error now, size extension a warning If an offset reduces a memory area beyond 0 it's a fault now (instead of 0) and extension beyond the original size a warning. Controllable through -Wsize-large. * PC bank wrapping gone now Seemed like a good idea but crossing banks with long data gave unexpected results for many people. * VICE label de-duplication is gone now Was intended to avoid warnings on import but actually breaks symbolic breakpoints if the needed label gets deduplicated... * -Wswitch-case gone now Could cause unexpected side effects which is a no-no for diagnostics * Ident renamed to symbol For less confusing diagnostic messages * Long values not displayed in listing by default They cluttered up the listing. They are still displayed in verbose mode. * Dictionary keys must be identical and not equal Otherwise bit strings can't be matched properly for example. * Hex float format from format() gone now Seemed like it's easy to add without much effort but it was not cross platform. * Bit string extraction operators now return bit string Did return bytes for a long while but now I realized those may not compare as expected in some cases. * Multi line expressions are gone now Seemed like a good idea back then but they cause more problems than they solve. They were never documented due to all the unsolved edge cases anyway. * Duplicated label files do not append automatically It must be done now explicitly with --labels-append * Unnamed values not listed in listing any more There's no label so makes no sense **New** * Immediate operand to branches It's now possible to write 'bne #0' (for self modifying code) * Hexadecimal byte string literal separation with spaces Space is accepted now in hexadecimal byte strings like x'ab cd' * Various byte string functions added Like byte(), word() and friends * New --output-append parameter For appending the output to a file instead of overwriting it * New --no-output option For cases where no output file is needed * Symbol definition syntax May be defined with a dot prefix. Useful as dictionary keys. * New .sfunction directive For defining single line functions which only do calculations * Alternative end directives Bit more verbose but more consistent and easier to remember. E.g. .endpage vs. .endp * Identity operator (===) For exact matching * --no-error and --error-append To not save or append error messages * Broadcasting conditional operator is '??' Sometimes broadcasting is needed but that's not compatible with the regular '?' conditional operator * Diagnostics for interrupted compilation Now it's displayed where it happened for improved infinite loop debugging. * --labels-append For appending to label files. r2200 (2020-04-07) ================== This is a bug fix release to fix the unintended performance degradation on some systems like BSDs. **Fixes** * Revert buffering changes These caused really slow performance on some systems which I forgot to test. * Makefile name escaping It's not the same as for shells and is more limited. So names with spaces should work now but otherwise it's advised to avoid incompatible file naming. * Bold black is not be visible on black background Changed to cyan. * Unicode parameter file names didn't work on some platforms Forgot a conversion so only UTF-8 worked **New** * Coloured output on windows console and DOS. This was available for a while but not for these platforms. Real DOS needs ANSI loaded and TERM set. r2176 (2020-03-23) ================== There were quite many changes in trunk so it's time to release another version. **Changes** * Removed -Wtype-mixing It was a transitional warning just in case someone relied on an undocumented tuple/list mixing which changed earlier. * Floor rounding is used by default now, added -Wfloat-round The old method was to truncate but it was not consistent with the integer division and was problematic when using floating point to represent fixed point numbers. The difference only shows for negative numbers. Just to be on the safe side there's a new warning now for cases where the programmer could use one of the rounding functions explicitly to avoid a rounding ambiguity. * Handling of address space wraps in calculations There are various address space wraps depending on the CPU. As an example the zero page may wrap or may not with indexed addressing. 64tass now tries to wrap when an offset is applied to an address to keep it in the same address space. E.g. a label at $10 in the expression lda label-$20,x results in lda $f0,x for a 6502 but lda $fffff0,x for a 65816. In all cases there are warnings issued for such an ambiguity. If it's intentional it may be suppressed but usually it's not. * -Wmem-wrap and -Wpc-wrap renamed now to -Wwrap-mem and -Wwrap-pc To make them in line with the other bunch of new -Wwrap-something switches. Please update your build scripts. They won't fail just yet but may in future. * Only --export-labels references labels Listing labels incorrectly referenced .proc blocks and so just by doing a label list unused .proc blocks got suddenly compiled in. This is unexpected and should not happen for a simple label list therefore it won't any more. If otherwise unused .proc blocks are needed in the label listing please add the new --export-labels option to get them listed and compiled. * Star is finally a label now Before it was only a number but as the theory goes it should be the memory location at the beginning of the line. This means label = \* + 1 constructs are now correctly referring to memory locations. * Variables are not listed in VICE label list any more They are ambiguous as may be assigned multiple times and usually don't refer to memory locations * Dictionaries are order preserving and iterable now Earlier order was undefined. * I/O error messages or in C locale now As the rest of the messages aren't localized either. **New** * Add -Wmacro-prefix Warns about macro calls without any prefix in front * Add WDM opcode It was requested for 65816 * Added .while and .bwhile Could be done with .for before but it's cleaner this way * Add .breakif and .continueif Simplifies .if .break .fi and .if .continue .fi sequences * Functions got a namespace The function itself can hold symbols now so there's no need for an additional label just to store data across invocations. That is "functionname.stuff := 4" works now. * Lists can be used as keys in dictionaries On query they need to be put into a list of course * CPA alias was added for CMP For consistency with CPX and CPY. * Added --macro-caret-diag Normally the diagnostic message is displayed along with the line causing it. There was an option to suppress the line display for those who don't want this but that makes debugging of macro expansions hard as the source file only contains the unexpanded macro. This option is a middle ground to display faulty lines only for macros. * Added --vice-labels-numeric Normally only memory locations are included to avoid numeric constant definitions in the listing but if you have a lot of label = $3000 style definitions this is for you. * Dictionaries are concatenable now There was hack to add entries by using the splat feature but the simpler {1:2}..{2:3} works now too. * Dictionaries are sortable Now that the order is preserved and they are iterable this makes sense * Multiple output files can be generated now By using multiple "--output" parameters. The output format and the section used may be varied of course. * Broadcast works with format() as well It's now possible to format values in a list and the result is a list of formatted values * Added --make-phony command line option This is useful for automatic dependency generation purposes for Makefiles. * Added .with/.endwith This allows to access symbols of another namespace without changing the current one. Unlike .namespace/.endn which does that. **Fixes** * Now @b and @w works for branches It can be used to prevent automatic long branches where it'd be bad * Fix AHX/SHA mode Wrong addressing mode was used * Leading zeros warning message suppression was corrected Due to a copy mistake it was -Wimmediate instead of -Wleading-zeros * Improve double definition error handling It worked before as well but caused so additional errors * The "Too early to reference" error is gone now Now nothing is to early to reference * Listing now contains returned values The results of function return values are in the listing now * Unused .proc labels not in listing any more If unused technically the don't exists and should not be there * Improved macro diagnostic message position for macros In many cases now the diagnostic messages are issued at the macro invocation instead in the macro body. At least when it seems like the problem is due to wrong parametrization. * Addressing mode and size messages improved They display the opcode now which can't have that addressing mode or size * Diagnostic backtrace now omitted for trivial cases This cuts back on the useless clutter for diagnostic messages in a multi file project * Inverse command line options added for consistency For example there was a --quiet but no --no-quiet. * VICE label lists omit duplicate entries now The monitor can only display one of them * Various diagnostic message location improvements Some diagnostic messages pointed to the directive instead of it's parameter * Functions may be created anywhere There were limitations on where functions may be defined but it's sorted now. * Struct offsets are numbers now Of course they are but they were addresses earlier which caused -Wimmediate to not trigger on them. * In some cases a missing .ends was not reported Now it is r1900 (2019-02-17) ================== Quick bug fix release to sort important regressions for file numbering, label files and \*=/.offs. **Fixes** * File number in line numbered list file was wrong The parent was shown instead (which is not very useful) * Empty data or code lines vs. --no-source Empty data lines are omitted now from the listing file * Undefined symbol messages could be wrong in macros In some special cases it ended up as garbage * Open/close directives shouldn't work across files Still worked with .include and the result was confusing * VICE label file generation crash on unconvertable address In the unlikely case like 0,x and similar * .offs now does what C64 TASM does This fixes a regression for old-school \*=/.offs relocations r1864 (2019-02-03) ================== This release took a while as I wanted to test some of the features in practice first and those projects took a lot of time. Also some parts had to be rewritten as the implementation wasn't quite right. Then in the testing phase I've found a lot of problems and I wanted to solve them before doing a release. Anyway it's finally out now and I think it's a good improvement over r1515. If not then please let me know. **New** * Add -Waltmode to show unavailable addressing mode fallback Data bank addressing may be bad sometimes instead of direct page * Add ".for var in sequence" style iteration loops Looping over lists elements got easier now * Add .namespace/.endn directives Now it's possible to switch to namespaces temporarily * Add -Wno-page Now the .page/.endp error can be turned into a warning or off * Add --output-section Output can be limited to a specific section instead of dumping everything * Add binary() function This enables reading file content as a byte string for easier processing * Add .virtual/.endv For compiling to an address but without producing any output * .align works in structures now It aligns from the start of structure * Folding operator "..." added Summing, minimum, maximum, etc. of list elements is easier now. * @w and @b size override now works with immediate addressing For consistency, this is more useful for 65816 * Hexadecimal representation of byte strings x"1234" More straight forward to type than bytes($3412) and with "proper" ordering * z85 style byte strings representation z"0S\*" More compact than x"1234". For label files and to embed binary data in source as text. * Add .bfor and .brept Scoped variant of .for/.rept which handles non-anonymous labels better * Conditional assignment ":?=" added Creates a new variable when symbol undefined otherwise keeps old value * Lazy fault handling A failed calculation is not a problem if the result is not used * Negative .binary offsets To allow offsets based from end of file **Fixes** * Data directives (.byte) must have at least one argument Confusing behaviour, no argument is likely a mistake * Missing closing directives didn't auto close This resulted in confusing error messages or worse * Improved directive missing messages It's not just "something is expected" but a bit more verbose * Undefined sections could cause too many passes Implementation bug * Optimizer suggestions are not shown for macros How to apply multiple suggestions for a single line? * Exported symbols (-l) were reported as unused They are used for exporting after all... * Compilation failed due to wcwidth Some platform had interesting defines preventing compilation * Improve unused checks Was not reporting correctly in some cases (like macro invocation) * Compilation warning reported by Compyx A static keyword was missing. * Sometimes compilation ended too early In some sections related cases not enough passes were made * Describe the "command line from file" feature better A single paragraph was not enough * Improved missing macro argument message The old one was not verbose enough * Redundant compilation warning (#33) Didn't delete enough ;) * Section end with union Section end was not right in union * Anonymous labels vs. conditional compilation Make clear in documentation how this works * 65CE02 stack relative addressing fix Unlike a 65816 it's signed. * VICE label generation was not generic enough Some members where not listed. * Improved -Wshadow Due to the .namespace directive it was not good enough any more * WIN64 compile fixes Some format strings are unavailable on mingw64 * Incorrect warning about labels not on left Colon suffix was not enough * str()/repr() improvement Some types have better string representations now * Wrong type messages replaced with better conversion messages The old message was not too helpful * 65CE02 long branch fix second try There were still cases where the wrong distance was calculated * Structs and unions didn't instantiate using a dot It was documented but didn't work * Update to Unicode 11 Upgraded tables to the latest version * Suppress repeated caret lines in messages One is enough if all the others are the same * .dstruct/.dunion double message on not defined No additional syntax error message any more * Improve error positions Still some errors were not on the right character in line * Only report file errors once It's enough to know once if a file is missing * Improve syntax error messages Mostly replaced by 'expected' messages now * Some messages lacked spacing at the end Now it's there * Indexing precedence fixed Broke in r1315, oops. * Faster in-place operations Most noticeable for list appending or concatenate * Anonymous labels vs. scopes Now they're truly bound to scope like normal labels * Runaway macro/function recursions are stopped faster now Certain recursion faults were difficult to debug * Wrong negated bit string shifting ~%10 << 1 was ~%100 instead of ~%101 * Wrong negated byte string -x'00' was ~x'ff' instead of x'00' (integer value different) r1515 (2017-05-01) ================== It's about time to release another version as many changes were done and people were waiting for fixes already sitting in trunk for a while now. Some ideas didn't made it into this version as the implementation would have delayed the release even further, maybe next time. Changes since the last version: **Compatibility** I'm not happy about these "annoying" changes and hope it's easy to update the affected code. - Deprecation of '^' operator Code needs to be updated to use the format("%d", value) function for converting values to decimal strings. The reason is that the "standard" use of this operator is to return the bank byte in almost all other 65816 assemblers. This function is available with the grave accent operator currently, as '^' was already taken at the time. Plan is to migrate to the standard variant. Old code with '^' for decimal strings conversion will of course still compile now. - Deprecation of non-string encoding names The original ".enc" directive used symbols for identifying encodings. The problem with this is that it's not parametrizable so the encoding can't be an expression or variable. There was no other way back then as strings were not supported at the time but it would be nice to allow such use. In this version the encoding names may be quoted for future compatibility but no expressions are available yet otherwise not yet updated code wouldn't compile. **New** Please check the manual for further details. - Keys without values in dict (sets) For quicker "in" than in list - Compound assignment also in .for Now "+=" and friends work in ".for" - Add &&= and ||= compound operators For consistency. - Check for file name portability issues (-Wno-portable) On multi platform development file names can cause compilation problems - Find unused labels with -Wunused Some unused labels may remain in code which can be pointed out - Check inconsistent symbol references with -Wcase-symbol For case insensitive but case matching symbols - Add operators (smaller/min, greater/max) New operator for range limiting - Check for double .case values with -Wswitch-case Multiple use of case value does not compile multiple times and may be a problem - Check for missing # with -Wimmediate For checking numeric constant opcodes without a '#' which may be a typos. - Turn on a check with -Werror=xxx too Less options needed as -Werror=xxx assumes -Wxxx. - Command line arguments from file with @file Frequently used options may be stored in a file - Scopes and addresses included in VICE label listing now Now more symbols are available in VICE - Listing of labels of specific scopes only into files (--root-labels=) Exporting of symbols only in a particular scope is possible now. - Dict indexable with lists now For translation uses - Improve some error messages by displaying the invalid values So that there's less guessing what the wrong value was - Keep integers when rounding floor() and friends converted to float unnecessarily - Add sort() to sort lists For sorting - '-' can be a variable as well For consistency. - Optimizer warns about ror/rol which could be lsr/asl C is clear, so there's no point shifting it in. - Warn for float comparison problems -Wfloat-compare Float comparisons may be wrong, especially for equality due to limited precision - format() improvements (integer precision, etc.) Some format() features were missing or wrong. - Predefine pi constant In case rad(180) needs too much typing... - Assign function parameters as variables instead of constants So that they may be modified. - Check for leading zeros -Wleading-zeros There's no octal number support, so this may be an error - Check for aliases with -Walias For consistent use of opcodes. - Improve message of const as variable It was a bit confusing - Improved non-negative message on range errors Make clear that the problem is with negative numbers not with number of bits - Notes for common pitfalls -Wpitfall Tips for some commonly encountered "problems". - Long branch warnings are possible again -Wlong-branch Long time ago this was there but was temporarily removed due to internal changes - Optimizer warns about constant results, duplicate sir/sac Calculations with constant values are pointless - Optimizer proposes use of stz on 65c02 Storing zero, so why may use the specific instruction for that as well - Update to Unicode 9.0 Including width tables this time - Optimizer proposes use of bra For always taken conditional branches - Better out of memory error handling For common cases it shows now where it happened. **Fixes** - Fix a few error positions which were missing Some error messages still didn't point to the cause... - Reduce fault messages for .endu/.ends Too many messages - Fix a possible null pointer crash for unknown address (fuzzed by Pierre) Implementation bug - Fix possible crash root namespace copying (fuzzed by Pierre) Implementation bug - Fix no argument indexing crash (fuzzed by Pierre) Implementation bug - Crash while handling struct values (fuzzed by Pierre) Implementation bug - Some special section nesting is not allowed (fuzzed by Pierre) Implementation bug. The fix caused some regression but it should be fixed as well. - Wrong memory use on long division (fuzzed by Pierre) Implementation bug - Missing type checks at a few places (fuzzed by Pierre) Implementation bug - Fix some return leaks Return where not freed - Compile fixes with VS Compiles now with newer VS without messing with code - Display address without mode correctly Did not display that an address is an address - Some notes were still displayed without warning/errors Some suppressed messages still had their notes displayed - Stdin/stdout not to be listed in makefiles Pointless to do so, they are not files. - Improve operations on addresses Especially needed without mode - Implement code offsets To preserve code reference - More operations on gap For .struct defaults with calculations - Fix integer limit checks It was done wrong. - Correct function call from macro line Didn't work well. - Fixed scoped macro highlighting in vim syntax Was not handled in the syntax file - Fix error messages on undefined section Messages were wrong. - Fix display of colon list with defaults It was wrong. - Unnecessary bytes needed message after another error Duplicate message for something which is not there - .eor was not applied to all fields in listing Listing showed the wrong hex values except for the opcode - label \*=\*+1 works again with warning -Wstar-equal Broke when compound operators were added, now works again. - Unpack code in .text Inconsistent behaviour - Fix some negative truncations/non-negative only values Some negative values didn't supposed to be truncated. - Restore bold output after invalid char inverted output Bold was missing after inversion. - Colours for all messages Command line parameter errors didn't had it yet. r1237 (2016-09-07) ================== Just a quick bug fix release this time. Due to a mistake in the previous version file errors were not reported at all most of the time, which was of course not the intention. This is the main reason for this release. Otherwise only the encoding related error messages were improved to be less confusing. r1229 (2016-07-09) ================== Lot's of changes lately and not just code tidying ;) So it's about time to release another version. ** Changed ** There's a new deprecation warning for the old single '=' equal operator which might hit many as a surprise. If possible please update all instances to '==' as this is how it's written for many years now. If that's not an option then the warning can be disabled with the "-Wno-old-equal" command line option. The recently added "--shadow-check" option was renamed to "-Wshadow" be consistent with the other new warning control options. This needs to be manually updated in build scripts. As it's a warning now by default a "-Werror=shadow" might be needed to make it an error again. ** Fixes ** * Fix highlighting of .sint in syntax files * Memory leak in -M generation * Bool \*\* was wrong due to a typo * Negative integer modulo/division fixes * Possible leak at label file generation * Wrong function compare due to a typo * pow() was wrong due to copy-pasting * Reject overlong UTF-8 sequences * Reduced the identifier set to used scripts * 65CE02 relative long branch calculation corrected now * Error out if the address mode is to complex * .dsection didn't took over PC type * Some calculations didn't work with addresses * Weak variables were included in shadow check * Data bank addressing was accepted incorrectly for some opcodes * Text width of wide characters is correct now * Exit code was wrong if output failed * Disassembly of bit addressing instructions was wrong ** Improved ** * Improved key error message Now displays what key was not found, not just says it's wrong * Improved source portability and documentation Hopefully it's easier to compile it now for some environments. * Some out of memory errors are non-fatal now Now for these few memory errors the diagnostic is a bit better. * Improved floating point highlighting in some syntax files It's including the dot and exponent as well if possible. * Indexing can be subtracted now It was not possible before unless it matched. * Bits and bytes negation preserves size unless on overflow These are not converted to integer any more just because of negation. * Better error message for small address space "bank crossing" and bank 0. Some of those 65816 style messages were not appropriate for small systems. * Improved fault handling strategy (no early exit and false messages) Due to early exit some invalid fault messages were displayed, and sometimes important messages were hidden. This should be better now. * Repeated data lines are shortened now in listing file The listing file will be not overly long now just because there was a .fill 8192,0 ** New ** * "Column indexing" of nested lists This is quite cool but hard to explain here ;) But there's a section called "Slicing and indexing" now in the manual where this is shown as well. * New CPU type for 4510 For the MAP and EOM opcodes, otherwise the same as 65CE02. * Line numbers in listing, column headers (--line-numbers) It's possible to enable an additional column for line numbers and source origin. So that it's easier to find what's coming from where (especially macros). * Strict boolean operations (-Wstrict-bool) New warning for finding implicit boolean calculation * Warning for deprecated operators (-Wdeprecated) It warns about things like using '=' instead of '==' before it's too late... * Colored error messages on some systems Colored diagnostic messages are displayed on some terminals now * Optimizer warnings (-Woptimize) There's an experimental optimizer now, which can generate useful warnings sometimes. * Some additional addressing modes for NOPs for R65C02/W65C02 To be consistent with the NMOS 6502. After all these NOPs are at least defined in the data sheets ;) * Scoped variables are now output in VICE labels Now scoped variables are included in VICE listing, which can help debugging a lot. * Add --cbm-prg command line option just for completeness It's the default, but now it has an option anyway. * Use NOP immediate and relative long for skipping if available New possibilities to skip bytes and words using the "gxx" pseudo opcodes on some CPUs. * Syntax highlighting for VIM It was about time. Not the same what I use normally, for a good reason ;) * Signed immediate addressing mode (lda #-1) After long last it's possible to enter negative numbers for immediate addressing as a proper signed version was introduced. See manual for notes (#- and #+) * Warning for implied addressing instead of accu (-Wimplied-reg) To find code where the "a" was left off "asl". * Diagnostics switchable now and can be made to an error (-Wxxx). There's more control now over what gets warned about and how. See the "Diagnostic options" section in manual for details. * Display command line option at the end of warnings/errors for switchable ones Many warnings are switchable now so it's good to know what switch can be used to manipulate them. These are displayed in brackets after the messages. * Option for jump bug warning (-Wjump-bug) The jmp ($xxff) warning has an option now * Option for address wrap warnings (-Wpc-wrap, -Wmem-wrap) Address wrap warnings have an option now * Option for label not on left warning (-Wlabel-left) The check was improved to have less false positives and has an option now. * Option for branch page crossing (-Wbranch-page) These are quite common and hard to do much against, so it's not enabled by default. * Option for old '=' operator warning (-Wold-equal) This checks for the old single equal operator, which should be changed to '=='. r1050 (2016-04-30) ================== Some time passed again, so here's another release: ** Changed ** * Image file limits depend on format not CPU type So using a 65816 does not imply 16 MiB output image file size any more. See output options if this makes a problem. The earlier behaviour was rather confusing when using several CPU types. * .int renamed to .sint It was a wrong choice to name this directive so as now it conflicts with the int type. Therefore it was renamed. Please update affected sources. ** Fixes ** * Fix invalid addressing mode parsing For example (0),x was degraded to 0,x instead of giving an error. * Improve on duplicate fault messages There were some cases where a single fault resulted in more than one error message. * CPU register symbols only for used CPUs This is important in case --shadow-check is used. * Fix a .logical/.here nesting problem Don't have the test case any more but it caused some weird behaviour * Error buffering fix Could crash due to not updated pointers on realloc * Improve messages for some to many passes cases Now gives can't calculate messages instead of too many passes * Wrong bank0 message instead of dp when dp undefined Wrong error message was displayed * Wrong inverted byte conversion due to missing break Typo resulting in miscalculation * Local label context nesting fixed Underscore labels were not scoped as it was originally planned * Fix zero shifting of bits Wrong result * Avoid non 0 message for .null when encoding is invalid An extra invalid message appeared for unencodable .null texts * Improve error detection when writing to output Redirected output didn't detect errors like disk full ** New ** * Makefile rule generation option (-M) Now it's possible to output all referenced files as a Makefile rule, which helps to write makefiles * Symbol shadowing checking (--shadow-check) Check if symbols are reused in upper scopes and create error if so. * Code page support for DJGPP Code pages are converted to Unicode correctly now under real DOS (if anyone still uses it) * Apply logical not, and, or to lists Instead of error these operations are applied on lists now * Debug label dumping (--dump-labels) Dump all labels with position information for debugging purposes. * Use holes in output files when possible Large but sparse image files take less space now. * Intel hex output (--intel-hex) * Motorola s-record output (--s-record) These two output formats were added for people with EPROM programmers or special download methods * Verbose listing (--verbose-list) Include everything in listing files, even if it does not generate anything * Error file (-E) Errors can be redirected to standard output or file. For better integration with some WIN32 editors. That's all for now. r992 (2015-09-03) ================= No release for a long time, so time for an update. As I'm running out of version numbers this will be probably the last 1.51. ** Fixes ** **Fix missing backslash when displaying filenames** Windows paths displayed incorrectly **Fix float exponential 0.0\*\*0.0 ** Was not 1.0 **Fix local label scoping vs. anonymous labels** +/- should not break the scope of underscore labels **Fix wrong label required message for duplicate .proc** Wrong message **Fix missing comma for zp bit relative in listing** Bad output in listing file **Fix some .for/.rept bugs** Could crash in special cases **Fix long negative bits crash** Could crash in special cases **Fix splat handling in unusual places** Could crash in special cases, now has proper error message **Fix text recursion of string types** Didn't work as expected **Compiles with a recent DJGPP again** For a very important platform ;) ** New ** **Add --no-caret-diag** For editors which can parse and jump to the error messages. **Update to Unicode 8.0** Just because it came out meanwhile. **Add --vice-labels** Because there was a demand for this ;) **Add underscore digit separator (int, bin, hex, float)** Long literal constant digits can be separated as %1010_0111 **Add := as .var** Just a shorthand, like 'v .var 2' as 'v := 2' **Compound .var assignments (+=, -=, etc.)** Another shorthand, like 'v .var v+1' as 'v += 1' **Reuse jumps of nearby long branches** Spare some bytes off if long branches are close and to same place **New column for displaying PC in listing** Easier to debug relocated code when .logical/.here is used **Simple manual page for command line options** For distributions. **Debian packaging directory** To compile .deb packages **For .for condition or assignment can be omitted too** So that '.for ,,' is possible now **Syntax highlight updates** Unicode labels where not always highlighted **Documentation updates** More detailed now ;) **Don't display long values in error messages** It clutters up the error log and probably was not intended **Improved .fill/.align pattern filling** Can do the same as now as .text for a list ** Notes ** If for some reason you had a label in front of a '\*=' assignment in your sources this will clash now with the compound assignment '\*='. To avoid this move the label a line above. The 'v \*= $2' construct is now multiplying the variable 'v' with $2, instead of defining a label 'v' and setting the PC to $2. Sorry for the inconvenience. r943 (2015-04-17) ================= There was a major code restructuring meanwhile, and it seems to work now, so let's release it ;) The plan was to gain more flexibility and to reduce the chances of creating bugs. I found some bugs when I've re-read and rewrote the code and also Pierre Zero uncovered some crashes by fuzzing. So it should be more stable than 1.51.883 was in some edge cases. **Fixes:** * Wrong address on empty .fill/.align in listing * Limit function recursion * Another to early compilation stop case fixed * Proper 65816 PC wrapping * Better position reporting of invalid characters in .shift/.shiftl/.null * Include instructions without result lines in listing * And all those crash bug fixes I better don't list here ;) **New:** * 65816 rep/sep tracking, added .autsiz/.mansiz * Add random() and .seed * mcedit syntax highlight added * .dpage and .databank can be "unset" now * String constant prefixes 'n', 's', 'p', 'l' added * PEI with direct page addressing * PC has type now * .rta and .addr accepts ,k now * Add empty string error message for clarity The manual was improved as well of course. r883 (2014-12-14) ================= Time for another release. Most of the changes were re-factoring as things started to get more complicated than necessary. **Fixed:** * Signed bit concat was wrong * Set binary mode on stdout when needed (win32) * Fix some label listing problems * Fix error position for star * Fix some bit slicing problems * Wrong string length on repeat and multi index * Fix bool to decimal string * Nested structs are not special anymore * Bits and/or length fixes **Improved:** * Improved floating point error messages * Point on invalid format string character * Change Unicode output on win32 * Address of .rta now in current program bank * Improve addressing mode error messages * Give expected type in wrong type message * TBA was missed from documentation * Bits shift was not in documentation * Some operator fixes * Add some missing operations * Avoid duplicate error messages (e.g. in .rept) * Add TOC to documentation **New:** * Add .addr for current program bank address * Apple II DOS 3.3 output format * Option for listing tab-size * Broadcasting for two argument functions * Bit string in .text * Types, more complete conversions r774 (2014-10-13) ================= It's time for a release, I've sit on fixes for too long. **Fixes:** * the manual still had non-ASCII characters at places expected to be copy-pasted * file names where not encoded properly (were always UTF-8) if they were non-ASCII * there was an invalid out of memory error with strings * invalid extra character at end of line message fixed in a special case * labels were deleted when still needed (crash in special cases) * caret was at wrong position of anonymous labels * .ptext was not working properly (wrong length) * compilation finished in some special cases too early * some error objects leaked to unexpected places causing crash * .var was not referencing in some complicated cases * value reuse crash (bug #21 and #22) * numbers should be non-locale dependent (wrong floating point printing) **Improved:** * use locale encoding for 8-bit files instead of fixed ISO-8859-1 * the caret points to the non-encodable character now in the simple literal case, instead showing the beginning of the string. * use "not a one character string" message instead of "string too long" * some general syntax messages were converted to comma expected instead * allow non-ASCII printable character printing * use shell quoting when printing file names with special characters * do real disassembling in list files as some opcode names where still aliases * some special addressing modes were not there as expected * some duplicated error messages are suppressed now * the html manual is better scalable now **New:** * support of Unicode 7.0.0 * registers other than "a" can be used as well. E.g. "inc x" is "inx" * registers can be used for indexing now. E.g. "reg = x" and "lda val, reg" is "lda val,x" r727 (2014-06-08) ================= The r716 version didn't last long ;( There was a regression which caused to miscompile the "pea #" opcode, so here's the fix. The bug was noticed after the .cpu change removed the warning, so I'd like to note again that the .cpu directive now has a string argument and therefore old sources may need to add quotes because of this. The good news is that this version includes the Unicode identifier support, which was planned for a long time. It's based a version 6.3.0 and features: * identifiers composed of XID_Start and XID_Continue only, plus underscore * proper case folding in case insensitive mode (e.g. Straße = strasse) * NFKC normalized, the "same" identifiers represented differently are still equivalent (ligatures field = field, combining marks á = á, similar symbols 𝔸 = A = 𝕬, etc.) It didn't bloat up the binary at all, as the required stuff was included for the NFC source normalization already. Performance is not affected when plain ASCII labels are used, and the difference is not noticeable otherwise. Other changes include further error message and message position improvements and that .binary can load more than the processor address space (in flat mode). r716 (2014-06-07) ================= Lot's of internal changes. The most notable addition was the caret diagnostic error messages. The displayed source line is macro expanded of course, to ease debugging. **Changes:** * fixed unaligned accesses (ARM crash) * nested parentheses bug in compatible mode * .pron/.proff nestable now * some special cases are solved in less passes * use locale for non-ascii character messages * caret diagnostic error messages (macro expanded) * fix some error message positions * improve instruction address mode error messages * jmp is non-data bank also on non-65816 * long branch versions of bbr/bbs (R65C02) * cross bank long automatic jumps on 65816 * improved listing file handling of long jumps * .cpu warning if name is not a quoted string Please note that the ".cpu" directive will require a string argument in the next version, to make it more flexible. This change will allow CPU selection by using a variable as an argument. On r716 and earlier versions CPU name quoting was optional, but now there's a warning for a non-quoted name. Variable arguments will be available in the next version only, as otherwise they conflict with CPU names like "r65c02", which looks like a variable. Please update your sources for future compatibility. r675 (2014-03-06) ================= **Bug fixes:** * PEA # / REA # was missing for 65EL02 * MVP/MVN #,# valid now (MVP/MVN $,$ still there for compatibility) * float() was broken * Some characters were broken in README and were shown as "?" * A few error messages lacked the severity marking * .include/binary used the wrong position for file errors * .if with forward references failed in some special cases * power operator (**) associativity was wrong * list/tuple compare crashed * Some other fixes (hard to decide if they applied to the previous versions or not) **Features:** * Create multiple instructions when using a list of addresses * pair is gone (a:b), instead there's a general colon list (a:b:c...) which is used for dictionaries/slices. * improve argument number error messages and other fault reporting improvements * nested lists are now flattened for .byte/.text and friends * .break and .continue flow control for .rept and .for loops * NFC normalization of source files. This added ~150k to the executable. It'll be used for some not yet implemented Unicode functions sometime later too. * added the splat operator to "inline" lists in place of arguments. (*list) * .weak/.endweak for defining weak symbols **Changed operation:** * the multiple destinations hack for branches is gone now. It was never official, and the same effect can be achieved by using an easy to write function. I better don't tell what it was ;) * addressing modes are applied to list elements and not to the list itself * str()/repr() applies to list elements instead of list * list/tuple mixed membership testing gives per element results in a list/tuple * space between $ or % and numbers is not allowed anymore. This allowed confusion with the modulo operator for "%". * only comma separated elements are processed in .case and not single list/tuple's members. Use the splat operator if lists/tuples are containing the possibilities. * the "format string" % (values) formatting operation is gone now as it was too confusable with modulo, especially when variables were involved. Instead use the new format() function as format("string", some variables). If list elements are the format arguments, use the splat operator to inline them. (e.g. format("%d: %s", *list)) r584 (2014-01-19) ================= **Bug fixes**: - various bug fixes for crashes, leaks, etc. - notes are not incorrectly counted as errors any more - no 32 bit issues with code address calculation anymore, especially when going negative **Features**: - Atari XEX output file format - .fill and .align can use iterable objects as fill byte, this can be used for simple patterns using lists/tuples - it's possible to specify the default value returned for non-existing elements in dictionaries to avoid errors - dictionaries can use externally defined key/value pairs. I'm not sure if this is interesting - object type is displayed in conversion error messages for better understanding of the problem - function context is more similar to it's invocation context now (e.g. address is matching now) - documentation improvements, section for addressing modes some indexes at the end - escape sequences in encodings can generate more than a single byte now - cheap local labels supported now between normal symbols (read the docs) - "starred" function parameter to collect extra parameters into tuple to have functions with unlimited parameters **Changed operation**: - All symbols starting with an underscore are cheap local labels now. This might cause problems in existing sources which ignored the "symbol names start with a letter" rule. Please rename your global symbols which used an underscore. - -W and --word-start option gone, there's -X and --long-address instead, which affects the start address of C64 binaries. It was confusing that the start address depended on the CPU type and it caused internal conflicts. Now the start address size is independent from CPU. When compiling for e.g. 65816 usually the start address is forced to 16 bit start with "-W" option. This options needs to be removed, it's 16 bit by default now, but can be changed to 24 bit with the --long-address option. - built in symbols for true/false, "a" register, and for built in functions. Built in functions were special before and different to user functions. Now they are the same, which means they can be passed around, aliased or can be shadowed. This makes sure that new built in functions can be introduced without breaking existing sources in the future and gives greater flexibility. Unfortunately there might be cases where a normal symbol was shadowing a built-in function and this now results in an error (like size() function vs. size symbol). Please rename the problematic symbol to something else. This also applies to the "a" register symbol. - I've seen that a bug in .if was abused for getting something similar to .ifdef. This was corrected by "mistake", therefore that trick does not work any more. There are no plans for .ifdef/.ifndef at this point, however symbol strengths are planned instead to get "default" values. But that needs further development. There's a possibility to get something similar with shadowing right now as well. r521 (2013-11-30) ================= __Bug fixes:__ - listing could reference unused symbols, this caused a compile failure on code that otherwise compiles - bit string right shifting had a sign problem - bit string zero inversion didn't work - .xl and .al didn't work on 65el02 - Long accu was applied for BRK, COP and MMU instructions incorrectly - some object conversions resulted in an infinite recursion and crash __Features:__ - code objects give access to symbols in situations where it was not possible before, e.g. when member of a list - undefined identifiers are only reported once per scope - address calculations are not limited to 32 bits any more. The code address space is still of course. - Accu and index register lengths (.al, .xl) are independent from current CPU, so 16 bit immediate values are available always - relative jumps are better guessed now (fewer passes in some special cases) - any(), all(), bool() functions - long lists and dictionaries can be split into several line, these lines are implicitly joined __Changed operation:__ - comparison operators compare list by elements and give a list of booleans instead of a single boolean. - lists consisting of more than one element don't have a truth value anymore, any() or all() should be used. An empty list is false and a single element is the truth value of that element. (2013-08-27) ============ The old 32 bit unsigned/signed integers and bit strings are gone now. Instead there are just arbitrary long integers and a bit strings. Therefore calculations won't silently overflow or go floating point any more. Unfortunately in 1.51.493 the branch range check was non-functional by a mistake ;( Next try for the release is 1.51.496 ;) Some things to watch out for: "%c" in format strings now always outputs the Unicode character for the integer value of variable, even if it's a string. Use "%s" with one character strings too. The "^" operator always gives a decimal string for the integer value of variable, even for strings. Before it give back the original string without conversion. The "repr()" function adds quotation marks to strings now, use "str()" if this is not what's needed.