1.0.5.3

Bugfixes

Intel HEX and TI-83 Plus application output formats now generate the correct address when there are non-contiguous addresses (e.g. after .block).


1.0.5.2

Bugfixes

.branch directive no longer aligns to 3-byte boundaries.


1.0.5.1

Features

defined() function allows you to check whether macros are defined without needing to nest/duplicate .ifdef directives.


1.0.5.0

Features

.appheaderpadding directive to change the application header padding (defaults to 128 bytes, allows you to reduce the size of the header and free up some space on the first page).


1.0.4.11

Bugfixes

Warns you if the parser goes crazy.


1.0.4.0

Bugfixes

Intel hex mode now completely reworked - multipage TI applications now sign.

.branch directive fixed.

Features

.branchrule directive added.

Other

None of the other hex formats are currently available. I need to fix them!

Macro preprocesser sped up a fraction and made slightly less dim.

Warning

The syntax of the .defpage directive has changed.


1.0.3.8

Bugfixes

Single-page applications now seem to sign correctly. Multiple paged applications still don't.

'Casting' to integral types truncates the value (int(-4.3) returns -4 now).

Features

asc type.


1.0.3.7

Bugfixes

Spaces in a page that are not written to are not exported in hex modes.

Features

Applications now get automatically signed (assuming you have the TI SDK installed).

.signkey directive.

.appfield directive.

Other

See the TI Applications 'tutorial'.

Warning

Application support is still wobbly, no small thanks to wildly conflicting information on the headers. Don't expect the signed applications to run on hardware (they appear to sometimes run on PTI, if you hold your breath, cross your fingers and hope).


1.0.3.6

Bugfixes

Addresses no longer output as negative numbers in debug log.

Doesn't incorrectly complain over page origins any more.

Fixed major bugs in hex output.

Features

.tiarchived directive.

.pvar directive.

Other

Deprecated .binaryrange


1.0.3.5

Bugfixes

Sega part and version number now calculated correctly (I hope!) - many thanks to Maxim for pointing out the correct way to do it!

Fixes to 'type' system.

For-loops now can use floating-point.

Features

.echoln directive to complement .echo

Array indexers.

TI-floating point variables.


1.0.3.4

Features

Now uses floating point arithmetic pretty much everywhere.

Various different data types, including fixed-point support.

Warning

Fairly major structural changes (and number handling) is likely to lead to erratic behaviour. Also note that you can only access the first element in an array of variables (no indexing support just yet).


1.0.3.3

Features

Full XML debug log support.

Description for breakpoints.


1.0.3.2

Bugfixes

Certain label and module names do not get mysteriously converted to lowercase in export files when not in case-sensitive mode (default).

In non-local (default) mode, labels added without the local label prefix no longer get added to the noname module.

Filename and line number records no longer mysteriously lost in export files on variables.

Features

NO$GMB and full assembly (exports page number as well) label file export.

Direct export of Emukon patch file support.

.breakpoint directive (for patch files).

.enum directive.


1.0.3.1

Features

'Intelligent' variable placement.

Structures.


1.0.3.0

Bugfixes

#define something (something)+something no longer treated as a macro with arguments (note the spaces).

Single-iteration .for/.repeat statements no longer go into an infinite loop.

Starting a program by redefining page 0 then continuing without issuing a .page 0 statement sticks output on a zombie page, resulting in a blank output. This has been fixed by explicitely rejoining page 0.

Features

Reworked label and module management, allowing for true distinction between global, unnamed and nested module labels. As this would break TASM's simplistic module system, you must manually enable these enhancements using the .global, .global and .nestmodules directives.

Ability to unsquish output bytes (useful, for example, with TI-83 Send9(prgmXXXX) programs).

Other

Broke TASM compatibility to fix weird behaviour with the = 'directive'. You may not use the equals sign as part of a label name, now.


1.0.2.3

Bugfixes

Reworked line splitting and label definition rules; code such as .for y,0,31\.for x,0,31\.if !(x&y)\.echo "##"\.else\.echo " "\.endif\.loop\.echo "\n"\.loop will now assemble and run correctly. If you like that sort of thing (try it!).

Features

.emptyfill (synonym for .binaryfill).

.endasm and .asm directives (multiline comments).

.repeat/.rept directives to repeat a block of code (cleaner than using a for-loop).

.deflong/.enddeflong for multiline macro defintions without having to resort to messy .defcont.

Optional width and height parameters on .incbmp directive.

.exportmode for setting export file options.

You can specify the page of a label along with the value in one go; also, label files can store a page number.

Other

Labels can now be in any column - Brass should detect that a label is not assembly code and will not treat it as such. Assembly code itself must still sit at least one column in, though.


1.0.2.2

Bugfixes

Fixed warning on data overlap if last byte of file is overlapped (would only report the last overlap if the last byte was not overlapped).

If there are multiple errors on the same line (for example, in a loop) they will only be displayed once.

= can be used to redefine labels.

.equ without any arguments will no longer destroy the last label.

Features

.align directive. I was getting fed up with typing .org ($ + $FF) & $FF00 every time.

> symbol to allow you to neatly entab your source code.


1.0.2.1

General

Large portions of the code rewritten to take advantage of C♯2 features (chiefly generics). If you notice a feature has been broken, please inform me (my tests show nothing has been adversely affected).

Bugfixes

Will no longer let you use .var unless you have previously used .varloc

List file is faintly less useless.

Features

Better control over exporting: use .export (no arguments) and every label defined - be it normally, through .equ or through .var - is exported automatically.

.fail, .warn, .dbtan and .dwtan directives.


1.0.2.0

General

I've rewritten the main assembler core from scratch to make it a bit more logical, the side effect is a tiny speed boost (from TASM being 6 times faster to being 4 times faster).

Now complains if you try to use the same label across two modules linked via .using.

.inclabels directive speeds up assembling a shedload (as in, from ~1.5 seconds to 600ms!)

Warning if you use parentheses to denote an index where you shouldn't (try ld d,(plotSScreen) now, Timendus).

Removed the manual from the EXE (that was just silly, though there was a genuine, albeit embarrassing, reason for that).


1.0.1.9

Features

Undefine macros through .undef.


1.0.1.8

Features

Relocatable code modules.

General

If no output filename is specified, and a .binarymode directive is issued, the output filename now defaults to a sensible extension (eg .sms for .binarymode SegaMS) rather than plain old .bin.


1.0.1.7

Features

Any externally referenced file is now loaded relative to the current source file, not the current working directory (which is still used as a fallback, should the file not be found elsewhere).


1.0.1.6

Features

rle flag on .incbmp directive.

General

TI variable names now default to the source code name, uppercased.


1.0.1.5

Features

Yet another reusable label (at the request of JoelS): @

Bugfixes

PEBCAK-protection-scheme™ - both on expression parser and assembly-code handler. Previously, if you ignored part of an expression or piece of assembly (for example, ld a,3+ or add a,) Brass's expression parser substituted in zeroes. It now displays an error in the first case, or a warning in the second. This was best demonstrated with the error jp + instead of jp {+}, which would in fact end up jumping to $0000. The problem is that index instructions expect an argument (ld a,(ix+4)) but are commonly ignored (ld a,(ix)) which causes Brass to display a warning, so I've added an (hard-coded) exception to ZIDX instructions, where the first argument is treated as optional.

Other

The label generation/management code was completely rewritten. There are numerous side effect - reusable labels are now (more logically) accessed in the order in which they are assembled, not the total origin. You no longer need your whitespace (_label:ld a,10). The expression parser was rewritten to accomodate this. With such fundamental and dangerous changes, be warned that the likelihood of fresh bugs is far greater, even though some known old bugs/hiccoughs have been remedied.


1.0.1.4

Bugfixes

Labels assigned via = or .equ are now recalculated on the second pass (for example in .for loops).


1.0.1.3

Features

.using and .endmodule directives for better module handling.

.varfree to return the end of the current variable table.

Bugfixes

.defcont is no longer trimmed; multiline macros no longer have spaces/tabs for assembly code stripped.


1.0.1.2

Features

Sega Master System and Game Gear export through standard Sega ROM header and SDSC tag writing.

.incbmp for quick-and-dirty bitmap inclusion.

Integrated manual - just double click the EXE without any command-line parameters.

Bugfixes

Page-related directives shouldn't crash; still not heavily tested so be wary.


1.0.1.1

Features

Multiple page binary output through .defpage and .page directives.

More binary output control through .binaryrange and .binaryfill directives.

Bugfixes

Fixed ability to use escape sequences in character constants.

Parentheses matching on assembly code fixed; ld a,(1&2)^(3&4), for example, now correctly identifies as ld a,* rather than ld a,(*)


1.0.0.9

Bugfixes

Order of precedence bug fixed; bit-shift operators << and >> work again.

Features

.for and .loop directives.

New label syntax; curly braces can be used to bung expressions into label names. For example, x=3 \_label_{x}: would create the label _label_3.

File operations.


1.0.0.8

Bugfixes

Error in macro preprocessor where definitions without arguments (such as .define SOMETHING) followed with a comment would define a macro that erased itself resolved.


1.0.0.7

Features

Completely rewritten macro preprocessor - fractionally faster (still slower than TASM, though) and comes with the ability to define macros with multiple replacement strings - when a macro is called, the closest matching replacement string is picked. See the manual for more information, or look at the example file to see it in action.

Other

Multiple macros no longer go haywire (macros are not applied to macro definitions themselves, as a side-effect of the new macro preprocessor).


1.0.0.6

Features

New boolean logic operators for expressions: &&, ||, ! and the extremely useful ternary operator ?:.

Included binary files (.incbin) can now have start and end indices to specify which bytes to include, and can have a expression applied to each byte as it is loaded.


1.0.0.5

Features

Integrated RLE compression of files loaded through .incbin if specified in a flag.

More output formats: Intel hex format, Intel hex word address format, MOS Technology hex format and Motorola hex format.

Sensible list file format, unlike the output from the -d switch.

RST no longer uses hard-coded tables, so allows you to use expressions in RST instructions (such as RST rMOV9TOOP1).

Output listing files using the -l <filename> switch.

Load external table files using the -t <filename> switch.


1.0.0.4

Features

.dbsin and .dbcos (plus word variations) to generate trigonometric tables.

Other

Warning on using ambiguous or confusing labels (eg kX-1 having the subtraction operator in the middle of it).


1.0.0.3

Bugfixes

Working binary output for TI85.

String unescape mechanism fixed with basic error check for 0-length strings when escaping double-backslashes.

Features

.var and .varloc to help declaring labels to point to variables in safe RAM locations.

.asc and .asciimap to translate ASCII strings to whatever character encoding the Z80 devices uses.

Ability to pass data into source files through environment variables.


1.0.0.2

Bugfixes

Parser now safely splits lines up (could be thrown off if splitting argument lists up if the argument lists contained a character/string constant containing a comma - eg, .fill $10, ',').

Features

Dummy port access instructions added (in (c), in f,(c) and out (c),0). Jim e's mode7 now assembles.

XML error log export for Latenite.

Optional strict error mode (stops assembling on the first major error).

.dbrnd and .dwrnd directives.

Preliminary support for binaries for the TI82 (working), TI73 (working), TI86 (needs you to specify .tivariabletype $12 else it appears as a complex list), TI85 (totally buggered, doesn't work yet). As such, not mentioned in the manual. When I say working, I mean "I have checked in a hex editor", I do not own the calculators myself so cannot properly test.

Other

Icon fixed for people using the 256-colour modes icon (no more white flecks around the edge).


1.0.0.1

Bugfixes

Fixed typo; .binarymode was wrong, Brass expected .binarytype. Brass has been modified to accept .binarymode as that was what was in the documentation. The real directive is now .binarymode

Bugfix on expression parser; double negatives (such as 10--32 or 10*-4) were not being handled correctly. To save my brain from melting (this is the first time I've written software to parse expressions), I added a new operator, ¬ to denote a negative number (eg ¬100). Double negatives are automatically converted (10--32 becomes 10-¬32) internally, so hopefully this is an invisible fix. The only problem is if you use ¬ as a label name. As a side-effect, the Al 3D Engine demo now assembles correctly, as does anything using Durk's GPP.

Label names no longer butchered in multiple-instruction lines.

Character constants that contain the symbol of an operator (eg '+' or '~') are no longer treated as expressions (eg '&' used to be treated as ' AND-ed with ', causing a parse error).

Fixed other odd bug when defining a character constant as the first part of an instruction's argument - so ld a,'?' would work, but sub '?' would not. It had the side effect that comments weren't stripped correctly, so sub '?' ; Hmm would try to evaluate '?';Hmm as an expression.

Check manual for latest compatibility list.

Features

Reusable labels.

Warns you if you write to the same memory location in the output binary more than once. (.org 0 \ .db 0 \ .org 0 \ .db 0)


1.0.0.0

First public release.