Ancient | All the Same | ATOFont | Drawings | Flash | Lecherous Gnomes | Me | Nintendo DS | PPM | PSP | Rumor Engine | S3TC-BOXEN | SameSameC | Tests | Tile Driller | VSOFont | WLA DX | Wzonka-Lad

WLA DX - Yet Another GB-Z80/Z80/Z80N/6502/65C02/65CE02/65816/68000/6800/6801/6809/8008/8080/HUC6280/SPC-700/SuperFX Multi Platform Cross Assembler Package
Originally written by Ville Helin in 1998-2008

Sexy Mofo!

  • Fast
  • SNES support
  • SMS/GG support
  • Gameboy support
  • Megadrive support
  • PC-Engine support
  • Support for object and library files
  • You can patch ROM images with code
  • Multilevel macros (actually, functions)
  • Numerous ways to comment code away
  • ROM image and program file assembling
  • NO$GMB/NO$SNES symbol file writing

  • Assembles code for the following CPUs:
  • 6502 (NES, C64, etc.)
  • 65C02 (VIC-20, etc.)
  • 65CE02 (C65, etc.)
  • 65816 (SNES, etc.)
  • 68000 (Megadrive, etc.)
  • 6800 (APF-MP1000, etc.)
  • 6801 (???)
  • 6809 (Vectrex, etc.)
  • 8008 (Mark-8, etc.)
  • 8080 (Altair 8800, etc.)
  • GB-Z80 (Game Boy)
  • HuC6280 (PC-Engine)
  • SPC-700 (SNES sound chip)
  • SuperFX (SNES accelerator chip)
  • Z80 (GG, SMS, MSX, Spectrum, Ti86, etc.)
  • Z80N (ZX Spectrum Next)

  • ... on the following platforms:
  • AmigaOS 1-3 (680x0)
  • AmigaOS 4 (PPC)
  • Linux
  • macOS
  • Un*x
  • Win32

  • Sources (it's best to grab the latest):

    GitHub repository! The development continues there...

    WLA DX 10.6 (.tar.gz)
    WLA DX 10.5 (.tar.gz)
    WLA DX 10.4 (.tar.gz)
    WLA DX 10.3 (.tar.gz)
    WLA DX 10.2 (.tar.gz)
    WLA DX 10.1 (.tar.gz)
    WLA DX 10.0 (.tar.gz)
    WLA DX 9.12 (.tar.gz)
    WLA DX 9.11 (.tar.gz)
    WLA DX 9.10 (.tar.gz)
    WLA DX 9.9 (.tar.gz)
    WLA DX 9.8 (.tar.gz)
    WLA DX 9.7 (.tar.gz)
    WLA DX 9.6 (.tar.gz)
    WLA DX 9.5 (.tar.gz)
    WLA DX 9.4 (.tar.gz)
    WLA DX 9.3 (.tar.gz)
    WLA DX 9.2 (.tar.gz)
    WLA DX 9.1 (.tar.gz)
    WLA DX 8.9 (.rar)
    WLA DX 7.8 (.tar.gz) Unsupported 7.x -tree
    Ancient WLA DX 1.6 - 4.4 (.rar)

    Binaries (UNSUPPORTED):

    Amiga/Win32 (link)


    README (19-Nov-2023)
    WLA File Formats

    Mnemonic lists:

    6502 (alphabetical, opcode)
    65C02 (alphabetical, opcode)
    65CE02 (alphabetical, opcode)
    65816 (alphabetical, opcode)
    68000 (alphabetical, opcode)
    6800 (alphabetical, opcode)
    6801 (alphabetical, opcode)
    6809 (alphabetical, opcode)
    8008 (alphabetical, opcode)
    8080 (alphabetical, opcode)
    GB-Z80 (alphabetical, opcode)
    HuC6280 (alphabetical, opcode)
    SPC-700 (alphabetical, opcode)
    SuperFX (alphabetical, opcode)
    Z80 (alphabetical, opcode)
    Z80N (alphabetical, opcode)

    Example sourcefiles (GB-Z80):

    A simple scroller (.tar.gz)
    A simple parallax scroller (.tar.gz)

    Useful sourcefiles (GB-Z80):

    GBComp (.zip) by Sam Nova
    PacBoy (.tar.gz) by Aleksi Eeben
    PacGirl (.tar.gz) by Aleksi Eeben
    Many useful GBC routines (.tar.gz) by Ville Helin
    M4x4 (C2P/GBC) (.tar.gz) by Ville Helin
    SM4x4 (Static C2P/GBC) (.tar.gz) by Ville Helin
    C4x4 (288 Color C2P/GBC) (.tar.gz) by Ville Helin

    Related links:

    NesDev @ Parodius
    SMS Power S8-Dev
    Jeff Frohwein's Gameboy Dev'rs
    Martin Konrad's GGT, the coolest thing ever written using WLA DX!

    WLA history:

    v10.6 (19-Nov-2023)
  • [ALL] Conditions (e.g., "(A > 1 || B < 3)") can now be used everywhere, outside .IFs.
  • [ALL] It's not any more possible to create labels and definitions called "_b" and "_f" as they are reserved names.
  • [ALL] A definition and a label cannot any more share the same name inside a source file for the sake of clarity.
  • [ALL] Added -MP for generating phony targets with -M.
  • [ALL] Added -MF for specifying a file to write the dependencies to with -M.
  • [ALL] Added -c for continuing parsing after encountering an unknown symbol or a mistyped instruction.
  • [ALL] Added -w for disallowing labels without a colon terminator.
  • [ALL] Namespace was added in some instances to a local label.
  • [ALL] Removed namespace propagation to unnamespaced .MACROs.
  • [ALL] Labels generated by a .MACRO inside an .INCLUDEd and namespaced file have now namespace added to them.
  • [ALL] Added .WHILE.
  • [ALL] Added .CONTINUE and .BREAK that work with .REPEAT/.REPT/.WHILE.
  • [ALL] Changed tmpfile creation on WIN32.
  • [ALL] It's now possible to put multiple instructions on the the same line by separating them with " \ " (whitespace here is important).
  • [ALL] WLA would crash calculating A-B if A was function(L) where L is a label.
  • [ALL] .STRINGMAP and .STRINGMAPTABLE handle now special characters like "\n" properly.
  • [ALL] WLA assembles now "WLAl" object files.
  • [ALL] The assembler has now a limited ability to find the address of a label if the label is outside .SECTIONs or inside FORCE and OVERWRITE .SECTIONs and the label is defined lexically before it is referenced.
  • [ALL] Added -p (and -SX and -SY) for pausing the assembler after a screen full of text has been printed to output.
  • [Z8N] Added support for Z80N.
  • (with the following changes to WLALINK)
  • WLALINK writes now version 3 WLA symbol files.
  • Symbol files created with -S contain now [sections] and [ramsections] and "wlasymbol true" under [information].
  • If -d is used we don't give a .SECTION discarded message for .SECTIONs that were APPENDTO other .SECTIONs.
  • Added -p (and -SX and -SY) for pausing the linker after a screen full of text has been printed to output.

  • v10.5 (23-Jun-2023)
  • [ALL] .DSB, .DSW, .DSL and .DSD produced only one pending calculation struct when encountered a pending calculation thus the result was wrong.
  • [ALL] Added .ALIGN.
  • [ALL] Added .ASSERT.
  • [ALL] Added BASE to .RAMSECTION.
  • [ALL] Added a new .SECTION type: SEMISUPERFREE
  • [ALL] References inside a .MACRO inside a namespaced file have now the namespace added to them.
  • [ALL] .MACRO's named ARGS now only replace existing definitions while the .MACRO is running.
  • [68K] Added support for MC68000.
  • [658] Added support for "MVN $xxyy" and "MVP $xxyy".
  • (with the following changes to WLALINK)
  • Added [sectionwriteorder] and [ramsectionwriteorder] to linkfile.
  • Added -pS and -pR that make WLALINK to ignore .SECTION types when writing the .SECTIONs to output, only .SECTION's PRIORITY (and size) will affect the order.
  • Negative definitions have now 8 characters in a symbol file written with -S.
  • By default WLALINK doesn't allow duplicate labels or or .DEFINEs. Use now -c to allow them.

  • v10.4 (24-Nov-2022)
  • [ALL] If a value is .DEFINEd later in the same source file than used in a pending calculation, WLA can now solve the pending calculation before exporting it to WLALINK.
  • [ALL] Added .SEEDRANDOM (seeds random number generator with current time -> random).
  • [ALL] Added built-in functions min(a,b), max(a,b), random(min,max), sqrt(a), abs(a), cos(a), sin(a), tan(a), acos(a), asin(a), atan(a), atan2(a,b), cosh(a), sinh(a), tanh(a), log(a), log10(a), pow(a,b), sign(a) and clamp(value,min,max).
  • [ALL] When a built-in function was called with a negative sign the sign was ignored sometimes.
  • [ALL] Floating point values can be given to a .MACRO as arguments and accessed via \1 etc., they are not rounded to integers any more. Previously only named args would work without rounding.
  • [ALL] When using a .FUNCTION the result was rounded to an integer - not any more.
  • [ALL] .FUNCTION body can now be a single argument.
  • [ALL] Built-in (and .FUNCTION) arguments can now be put on multiple lines.
  • [ALL] We now use ANSI C's tmpfile() to create tmp files. This should allow multiple concurrent instances of WLA to run in the same directory at the same time.
  • [ALL] When using -M, if you specify -o or -l later on the command line you can output an object or a library file at the same time. Disable file generation with -t.
  • [ALL] A calculation can be split into multiple lines if the last symbol on the line is a '+', '-', '*'. etc.
  • [ALL] Unnamed .STRUCTs inside other .STRUCTs don't generate _paddingof_* definitions any more.
  • [ALL] Pending calculations work now as macro arguments.
  • [ALL] Fixed INSTANCEOF in .ENUM when .STRUCT used SIZE (WLA doesn't generate bytes in that case any more).
  • [ALL] Negating pending calculations inside parentheses inside pending calculations ignored the sign.
  • [ALL] Negating calculations inside parentheses should now work in every case.
  • [ALL] Dotted .INSTANCEOF works now in .ENUMs.
  • (with the following changes to WLALINK)
  • WLALINK turned doubles into ints too early in computing pending calculations on some cases thus losing precision.

  • v10.3 (02-Oct-2022)
  • [ALL] Improved parser for .HEX, and added BLOCK to .HEX.
  • [ALL] "\\" should now work inside strings.
  • [ALL] .MACRO calling another .MACRO, inside a namespaced file, should now work.
  • [ALL] .MACRO arguments can now be put inside parentheses when calling a .MACRO (e.g., "MyMacro(1, 2)").
  • [ALL] defined() can now process strings with substitution.
  • [ALL] Added an alternative way of defining a .MACRO (e.g., ".macro SUM(value1,value2) isolated").
  • [ALL] Added .FUNCTION (for things like ".DB SUM(1, 2)").
  • [ALL] Multibyte .DEFINEs (e.g., "MB = $01 $00 $02") were broken in v10.2.
  • [ALL] Multibyte .DEFINEs work now better inside other multibyte .DEFINEs.
  • [ALL] Calculations like ">-VAR" and "2--1" work now, only ">(-VAR)" and "2-(-1)" used to work before.
  • [ALL] Added -v1 and -v2 (shorter verbose levels).
  • [ALL] Changed the license to GPL-2.0-or-later.
  • [ALL] Parameters (SKIP, READ, SWAP, FSIZE and FILTER) to .INCBIN can now be given in any order.
  • [ALL] Parameters (ONCE and NAMESPACE) to .INCLUDE can now be given in any order.
  • [ALL] Parameters (NAME and SIZE) to .ARRAYDEFINE can now be given in any order.
  • [ALL] Negative READ parameter to .INCBIN means that many bytes are not read from the end of the file.
  • [ALL] WLA's ability to calculate A-B would break the execution of the app if A was a definition.
  • [ALL] Added optional keywords COUNT, MIN and MAX to .DBRND and .DWRND.
  • [GB ] Sometimes WLA-GB would generate unused pending calculations when parsing the code, and namespaces would not work in them thus breaking the linking phase.
  • [SPC] Structs should work now better with SPC-700's instructions.
  • [GB ] Added flag aliases (C -> LSS and LST, NC -> GTE and GEQ, NZ -> NEQ, Z -> EQU) to CALL, JP, JR and RET.
  • [Z80] Added flag aliases (C -> LSS and LST, M -> NEG, NC -> GTE and GEQ, NZ -> NEQ, P -> POS, Z -> EQU) to CALL, JP, JR and RET.
  • (with the following changes to WLALINK)
  • Added -v1 and -v2 (shorter verbose levels).
  • Pending calculations that were marked negative inside pending calculations should now work.
  • Pending calculations that contain pending calculations that are defined in other files should work now.
  • Big optimizations that should help linking projects with lots of sections, pending calculations and/or files.

  • v10.2 (24-Jun-2022)
  • [ALL] Added SIZE to .RAMSECTION.
  • [ALL] Added -d to disable WLA's ability to calculate A-B where A and B are labels.
  • [ALL] If SIZE is used with a .SECTION or .RAMSECTION and the section doesn't fit into it, we now issue an error instead of a warning.
  • [ALL] .FOPEN should now work with makefile generation.
  • [ALL] WLA's summary is now printed to stdout instead of stderr.
  • [ALL] Added support for UTF-8 source files (meaning labels, macro names, definitions, etc. can all be UTF-8).
  • [ALL] When .ROMBANKMAP had ROM banks of different sizes, the verbose summary's ROM information was not fully working.
  • [ALL] Memory overwrite messages should now have working line numbers in all cases.
  • [ALL] WLA assembles now "WLAI" library files and "WLAk" object files.
  • [ALL] Labels without ':' can now be used right on the next line after a .MACRO call.
  • [ALL] Added keywords ISOLATED, ISOLATELOCAL and ISOLATEUNNAMED to .MACRO. These make the local and unnamed labels inside a .MACRO to stay inside and not affect the outside world. The same goes for child label stack.
  • [ALL] We now don't do substitution in code that is skipped using .IFs.
  • [ALL] If padding is put to a .DSTRUCT or INSTANCEOF in .RAMSECTION or .ENUM, _paddingof_* definition is created unless -s is given.
  • [ALL] Added optional COUNT to INSTANCEOF in .RAMSECTION and .ENUM.
  • [ALL] Added round(), floor() and ceil().
  • [Z80] Added "EX HL,DE" (an alias for "EX DE,HL").
  • [Z80] Added "EX HL,(SP)" (an alias for "EX (SP),HL").
  • [Z80] Added "EX IX,(SP)" (an alias for "EX (SP),IX").
  • [Z80] Added "EX IY,(SP)" (an alias for "EX (SP),IY").
  • [658] WDM takes now a byte (i.e., "WDM $12").
  • [651] Removed wla-6510 as wla-6502 can be used for 6510.
  • [650] Added undocumented opcodes to wla-6502.
  • [GB ] It's now possible to set the number of ROM banks to any value larger than 0.
  • [GB ] WARNING: .ROMBANKS / .ROMBANKMAP don't write the ROM size to $0148 any more, use .ROMSIZE for that.
  • [GB ] Added ROMSIZE to .GBHEADER.
  • (with the following changes to WLALINK)
  • Added SIZE to [sections] and [ramsections].
  • Added -R (file paths inside link file are relative to linkfile's location).
  • WLALINK's summary is now printed to stdout instead of stderr.
  • WLALINK didn't print verbose mode's summary at the end if listfile writing was enabled, but there was no listfile data.
  • Bankheader sections now have listfile data.
  • Sections that were appended to other sections have now listfile data.
  • Included file in the middle of a source file doesn't kill the listfile data before it in the source file any more.
  • Code outside .SECTIONs has now listfile data.
  • Listfiles contain now line number, base (65816 only), bank, slot, PC and offset in addition to hexadecimal bytes.
  • If .SECTION "A" is using "AFTER "B"", .SECTION "A" will now inherit .SECTION "B"'s .BASE as well.
  • We now skip the generated RAM_USAGE_SLOT_* labels when trying to automatically find load address for a CBMPRG.

  • v10.1 (19-Feb-2022)
  • [ALL] Arguments to .SECTION and .RAMSECTION can be now given in any order, only the first argument must be the section's name.
  • [ALL] A definition can be substituted with its value in labels (e.g., label_{COUNTER}) and in quoted strings (e.g., {"ID={COUNTER}"}). Note that also label_{COUNTER+1} works.
  • [ALL] Strings can be split to multiple lines using '\'.
  • [ALL] Added WINDOW and BITWINDOW to .SECTION and .RAMSECTION. These can be used to limit where .SECTIONs and .RAMSECTIONs are placed.
  • [ALL] The assembler is now able to calculate A-B where A and B are labels in the same section. Only the linker used to be able to do this.
  • [ALL] WLA assembles now "WLAG" library files and "WLAi" object files.
  • [ALL] Fixed multiple memory leaks. Should now work better on an Amiga.
  • [ALL] .STRINGMAPTABLE works now with makefile generation.
  • [ALL] We don't try to process special characters in filenames in .INCDIR, .INCLUDE, .INCBIN, .FOPEN, .BACKGROUND and .STRINGMAPTABLE.
  • [ALL] .IFs like ".if MINUS_ONE == -1" (negative value on the right side) didn't use to work.
  • [ALL] "JR -" (similar direct jumps to local labels) should work again.
  • [ALL] Sharing a namespace between sections should not make WLA to crash at exit.
  • [ALL] MAX_NAME_LENGTH is now 2047 instead of 255. This change allows longer strings/labels (NOTE: On Amiga and MSDOS the limit is 511, due to limited stack).
  • [ALL] Turned some huge stack allocations into heap allocations.
  • [ALL] \@ should now work in .IFs.
  • [ALL] __label__ should now work better in calculations.
  • [658] The maximum SRAMSIZE in SNES ROM header is now 7 instead of 3.
  • [SFX] Fixed "MOVE (xx),Rn" macro instruction parsing. And even currently WLA cannot create a SMS instruction if WLA postpones the argument's handling to WLALINK...
  • (with the following changes to WLALINK)
  • Added support for WINDOW and BITWINDOW in .SECTION and .RAMSECTION.
  • Fixed multiple memory leaks. Should now work better on an Amiga.
  • On Windows it was possible that -s actually wrote a WLA symbol file instead of a NOCA$H symbol file.
  • Removed warnings that begin with "COMPUTE_STACK: The passed on SLOT/BANK/BASE changed..." as they were kind of pointless.

  • v10.0 (21-Jun-2021)
  • [ALL] WARNING: Precedence of operators in calculations that WLA calculates is now more fine grained and C like.
  • [ALL] WARNING: .ASC didn't map \0 and \x inside a string, but now all bytes given to .ASC are mapped. Consider using .ASCSTR if you don't want to map special characters.
  • [ALL] All strings (inside "") now support \n, \r, \t, \0, \x, \< and \>.
  • [ALL] '\n', '\r', '\t' and '\0' are now supported.
  • [ALL] ASC() has now wider input support: e.g., ASC('\n') and ASC($D) work.
  • [ALL] It's possible to feed a definition's name to a .MACRO by prefixing it with '&', e.g. &definition.
  • [ALL] Use ?1 inside a .MACRO to get the value of the definition given as argument 1 (and prefixed with '&').
  • [ALL] Added support for nameless INSTANCEOFs in .ENUMs, .STRUCTs and .RAMSECTIONs.
  • [ALL] Computations with 32-bit binary values with all 32 bits defined work now.
  • [ALL] It's possible to use binary values in command line definitions (e.g., -D VALUE1=%10101010).
  • [ALL] Hexadecimal values can now also be given as 0xABCD, binary values as 0b11110000.
  • [ALL] .FAIL defaults now to exit code 1, and takes an optional exit code (e.g., ".FAIL 2").
  • [ALL] It's now possible to create, read and write into own arrays using .ARRAYDEFINE/.ARRAYDEF/.ARRAYIN/.ARRAYOUT.
  • [ALL] Added .BITS (like .DB but for bits) and .ENDBITS.
  • [ALL] WLA assembles now "WLAF" library files and "WLAg" object files.
  • [ALL] Added .FILTER (same as .DBM, but doesn't define any bytes).
  • [ALL] Pending calculations inside bankheader sections should work again.
  • [ALL] If an empty .SECTION/.RAMSECTION uses keyword KEEP it is no longer discarded.
  • [ALL] The source section of APPENDTO operation is now linked with its ID, not name, so multiple sources with the same name work now.
  • [ALL] defined(DEF_A) can be used in conditions to ask if DEF_A is defined.
  • [ALL] exists("file.bin") can be used in conditions to ask if "file.bin" exists.
  • [ALL] .IF takes now complex conditions, e.g., ".IF !defined(ZERO) && defined(ONE) && (ONE > 0)" works.
  • [ALL] Added .ELIF.
  • [ALL] Added ARG_IMMEDIATE to the types of an argument of a .MACRO (asked using e.g., '\?1').
  • [ALL] Added a flag "-k" that forces WLA to keep all empty sections.
  • [ALL] Added AFTER keyword to .SECTION and .RAMSECTION, which makes sections to be placed OFFSET bytes apart.
  • [ALL] Added .FTELL (get the file position).
  • [ALL] Added .FSEEK (set the file position).
  • [ALL] -v prints now more information about the RAM/ROM usage.
  • [ALL] Data generated by .MACROs and .REPEATs is now visible in listfiles.
  • [ALL] Added support for LOBYTE() (get the low byte, bits 0-7), HIBYTE() (get the high byte, bits 8-15), LOWORD() (get the low word, bits 0-15), HIWORD() (get the high word, bits 16-31), BANKBYTE() (get the bank byte, bits 16-23) and BANK() (get the bank).
  • [ALL] Unix file paths in assembly files (.INCDIR...) should now work Amiga.
  • [SFX] Added Super FX support.
  • [GB ] Added alias "CPL A" (of "CPL").
  • [GB ] Added support for "STOP $01" - "STOP" with extra byte.
  • [Z80] Added SL1 (alias for SLL).
  • [Z80] Added "RES 0,(IX+d),A", "RES 0,(IY+d),A", "RL (IX+d),A", "RL (IY+d),A", "RLC (IX+d),A", "RLC (IY+d),A", "RR (IX+d),A", "RR (IY+d),A", "RRC (IX+d),A", "RRC (IY+d),A", "SET 0,(IX+d),A", "SET 0,(IY+d),A", "SLA (IX+d),A", "SLA (IY+d)",A", "SLL (IX+d),A", "SLL (IY+d),A", "SRA (IX+d),A", "SRA (IY+d),A", "SRL (IX+d),A", "SRL (IY+d),A" and variants.
  • (with the following changes to WLALINK)
  • Fixed listfile writing when there is no listfile data in object files.
  • It's possible to give binary values in [definitions].
  • Pending 32-bit calculations work now in bankheader sections.
  • Errors should print now properly if it happened in a source file with file ID > 255.
  • If a .SECTION/.RAMSECTION "B" is merged with section "A" using APPENDTO keyword, "SECTIONEND_A" label is moved to the end of the new, bigger section "A" and labels "SECTIONEND_B" and "SECTIONSTART_B" are deleted.
  • Duplicate SECTIONEND_* and SECTIONSTART_* labels (for sections with same names) are no longer renamed.
  • Chaining APPENDTO sections works now, rewrote the APPENDTO/AFTER section sorter.
  • WLALINK now creates symbols RAM_USAGE_SLOT_x_BANK_y_START and RAM_USAGE_SLOT_x_BANK_y_END that contain the addresses of the first and last used bytes in RAM slots/banks. Information is calculated using .RAMSECTIONs.
  • -v prints now more information about the RAM/ROM usage.
  • WLALINK writes now version 2 WLA symbol files.
  • Symbol files created with -S (and -A) contain now object file IDs for entries in [source files v2] and [addr-to-line mapping v2].
  • Listfiles contain now information about .MACROs and .REPEATs.

  • v9.12 (20-Mar-2021)
  • [ALL] Added support for ADDR and FARADDR to .TABLE.
  • [ALL] Multiple include directories (via multiple -I) are now supported.
  • [ALL] Use LABEL_{\@+1} instead of LABEL_\@+1 inside a macro, if you want to reference the next label instead of the label's address + 1.
  • [ALL] Missing .INCBIN/.INCLUDE files don't break makefile rules generation (-M) any more.
  • [ALL] Fixed .DBM, .DWM and .DLM, and \2 in .DWM and .DWL.
  • [ALL] .MACRO string expansion (e.g., "\1") now uses parsed arguments instead of just copying the plain text of the argument.
  • [ALL] Object and library files support more than 256 source file IDs.
  • [ALL] WLA assembles now "WLAA" library files and "WLAb" object files.
  • [ALL] Fixed listfile writer, now opcode data stays better on the lines without spillovers. Affects 65816, Z80, SPC-700, 65C02, 65CE02 and HuC6280.
  • [ALL] Added support for ASC('?') (.ASC for individual characters), e.g., "LD A, ASC('A')".
  • [ALL] Source code line can be split to multiple lines using '\' between elements, in many places.
  • [ALL] .FAIL takes now an optional string.
  • [ALL] .DL, .DSL, .DLM etc. work also on other targets than 65816.
  • [ALL] Added support for .DD, .DSD, .DDM, the same as .DB etc., but double word (32-bit).
  • [ALL] Added a flag "-h" to make all label references 16-bit by default (size hints still work).
  • [ALL] Added support for .HEX (yet another way of defining bytes).
  • [ALL] Added support for __label__ (last defined parent label).
  • [ALL] Added .ASCSTR that maps (like .ASC) only supplied strings, not loose bytes.
  • [658] SECTIONEND labels that overflowed from a bank had wrong address in symbol files.
  • [Z80] Fixed the broken (broke in v9.11) regioncode in .SMSHEADER.
  • [SPC] It's now possible to used e.g., defines with mnemonics like BBC and SET1, not just raw numbers.
  • [SPC] In many mnemonics where a dot was required you can now also use commas instead (e.g., BBC and SET1).
  • (with the following changes to WLALINK)
  • Fixed buggy symbol file name generation.
  • Fixed SMS checksum calculation if .SMSHEADER is not used.
  • Fixed a couple of bugs in listfile generation.
  • Added -D (don't create _sizeof_* definitions).
  • Defines are no longer written into NO$CASH symbol files.

  • v9.11 (17-Jul-2020)
  • [ALL] Stack calculator's string checker handled only 63 characters long strings.
  • [ALL] A directive with the first argument being negative wasn't parsed properly.
  • [ALL] Added an alias for .INCLUDE (.INC).
  • [ALL] Using a .RAMSECTION without RETURNORG doesn't mess up the .ORG any more.
  • [ALL] Macro names can now start with a '.'.
  • [ALL] Getting the ROM bank number using ':' can now be used also with ROM addresses and their calculations.
  • [ALL] When using .MACROs, use '\.' to get the macro's name.
  • [ALL] SLOTs can now be given names.
  • [ALL] SLOTs can now be referenced by their name, ID or address.
  • [ALL] .PRINT & .PRINTT can now print address labels.
  • [ALL] Simple additions and subtractions can be used with "\@" in macros when creating/referencing a label.
  • [ALL] Plain "OFFSET = 10" is now also accepted as a define. No .DEFINE/.DEF is required.
  • [ALL] .INCDIR, .INCBIN, .FOPEN, .INCLUDE, .OUTNAME, .IFEXISTS and .BACKGROUND now also take strings without quotation marks.
  • [ALL] Integrated's snprintf(), changed all sprintf() calls to snprintf().
  • [ALL] It's possible to skip bytes in .RAMSECTIONs using "." as the label.
  • [ALL] The type of the argument for a .MACRO can now be asked in an .IF using e.g., '\?1'.
  • [ALL] Added a flag "-s" to disable _sizeof_* definition creation.
  • [ALL] .DSTRUCT can now create child labels (e.g., ".DSTRUCT @Instance INSTANCEOF MyStruct VALUES").
  • [ALL] WLA assembles now "WLA9" library files and "WLAa" object files.
  • [ALL] .ENDST should be case insensitive in all cases.
  • [ALL] .INCLUDE/.INC can now be used inside .MACROs.
  • [ALL] .INCLUDE/.INC can now be given the filename in pieces, e.g. ".INC ROOTDIR, SUBDIR, "filename.s"".
  • [ALL] Added ONCE to .INCLUDE/.INC.
  • [ALL] Macro calls can now be made from the very beginning of a new line (where labels are).
  • [ALL] Improved WLA's string.length parsing capabilities.
  • [ALL] Sections can avoid WLALINK's discard mechanism with a keyword "KEEP" ('!' at the beginning of a .SECTION's name works still also).
  • [ALL] Un-named labels (like "-", "+" and "__") don't need to be defined at the very beginning of the line either.
  • [ALL] Removed some redundant definitions from .RAMSECTION (.STRUCT) INSTANCEOF when the number of instances > 1.
  • [ALL] Added support for optional STARTFROM to .RAMSECTION (.STRUCT) INSTANCEOF (starting index other than 1).
  • [Z80] Removed warnings for "JP (HL)", "JP (IX)" and "JP (IY)".
  • [Z80] Added ROMSIZE to .SMSHEADER. Fixed automatic ROMSIZE calculation.
  • [6CE] Added support for CSG65CE02.
  • [65C] Added support for W65C02S's "WAI" and "STP".
  • [658] Added support for WDC standard mnemonics via .WDC and .NOWDC.
  • [658] Added support for .DLM (24-bit version of .DBM).
  • (with the following changes to WLALINK)
  • Added CMB PRG header writing (with flags -t and -a).
  • Added support for ORG/ORGA to [ramsections].
  • Added support for [sections] in linkfile.
  • Added support for section type and priority changing to [ramsections] and [sections].
  • Added -bS and -bE (start and end addresses of the program).
  • Added -nS (don't sort the sections).

  • v9.10 (22-Dec-2019)
  • [808] Added support for I8080.
  • [658] Fixed SNES ROM checksum calculation.
  • [658] Fixed 24-bit non-label symbols in NO$SNES symbol file generator.
  • [Z80] Added aliases for ADC, ADD, AND, CP, OR, SBC, SUB and XOR.
  • [Z80] Added aliases "LD PC,HL", "LD PC,IX", "LD PC,IY", "JP HL", "JP IX" and "JP IY".
  • [Z80] WLA will now issue a warning if "JP (HL)", "JP (IX)" or "JP (IY)" are used as they are semantically wrong.
  • [Z80] Added register aliases HX (IXH), LX (IXL), HY (IYH) and LY (IYL).
  • [GB ] Added aliases for ADC, ADD, AND, CP, OR, SBC, SUB and XOR.
  • [GB ] Added alias "JP (HL)", but WLA will also issue a warning if it's used as it's semantically wrong.
  • [ALL] Unary XOR (e.g., "~$FF") is now calculated as NOT.
  • [ALL] Added support for 24-bit and 32-bit XORs in calculations.
  • [ALL] RST can now be used with a label/pending calculation.
  • [ALL] ".DEFINE INDEX \@" inside a macro works now.
  • [ALL] Added a fflush() to print_error() - now all error messages should be printed on screen no matter what.
  • [ALL] .BLOCK name can now contain spaces.
  • [ALL] WLA assembles now "WLA6" library files and "WLAW" object files.
  • (with the following changes to WLALINK)
  • Relaxed the checks regarding misc bits (e.g., SNES ROM mode, GB checksum...) when loading the object files.
  • Fixed pending, relative 16-bit and 24-bit calculations.

  • v9.9 (15-Aug-2019)
  • [ALL] Added unions: .UNION (and .NEXTU and .ENDU).
  • [ALL] Added a new syntax to .DSTRUCT (old works, too).
  • [ALL] Changed the way ".ENUM xyz DESC" works.
  • [ALL] .ROW and .DATA should now work better with 16-bit and 24-bit values.
  • [ALL] Defines with negative values are now parsed better.
  • [ALL] .BLOCK (and .ENDB) prints the block size once again.
  • [ALL] Added support for C++ style comments (//).
  • [ALL] WLA assembles now "WLA4" library files and "WLAV" object files.
  • [ALL] References to a pending computation from inside a define from inside a pending computation should work now.
  • [ALL] WLA can now be given string definitions from the command line.
  • [680] Added support for MC6800.
  • [680] Added support for MC6801.
  • [680] Added support for MC6809.
  • [800] Added support for I8008.
  • [658] 24-bit addresses of .RAMSECTION labels should work now when using .LOROM / .HIROM. / .EXHIROM.
  • [GB ] Fixed Pocket Camera cartridge type, added support for 64Mbit ROM and 512kbit RAM types.
  • (with the following changes to WLALINK)
  • Defines that contain computations that are issued inside libraries are now handled correctly.

  • v9.8 (21-Jun-2019)
  • [ALL] Deprecated and removed section's size giving inside section's name string.
  • [ALL] Getting bank number with :CADDR works again.
  • [ALL] WLA assembles now "WLA3" library files and "WLAU" object files.
  • [ALL] .REPEATs, .DBs, .DWs, .DLs and macro calls don't mess up listfiles any more.
  • [ALL] Added support for prioritizing sections when placing them to the output ROM/PRG.
  • [ALL] The _sizeof_[label]s for labels that are followed by a dotted .DSB etc. are now calculated correctly.
  • [ALL] The maximum allowed number of digits for floats is now 24 instead of the old 8.
  • [ALL] _sizeof_[label]s are now calculated correctly for .STRUCTs in .RAMSECTIONs.
  • [ALL] WLA's -x flag now creates SECTIONSTART_[section name] and SECTIONEND_[section name] labels for each section.
  • [ALL] The assembler and the linker now display examples about how to run them when run with incorrect parameters.
  • [ALL] .RAMSECTIONs can now be used inside libraries but BANK and SLOT must be defined for the RAMSECTIONs under [ramsections] in WLALINK's linkfile.
  • [ALL] WLA (WLALINK did this already) assumes that there are 256 RAM banks for each SLOT. The number of ROM banks doesn't affect the number of RAM banks any more.
  • [ALL] Added .TABLE, .ROW and .DATA - an alternative to .DB, .DW and .DL.
  • [ALL] When allocating a new unknown reference, we'll set its base to 0 instead of not initializing base at all.
  • [ALL] When inserting padding to a section (for example for an unsolved 8-bit reference) we now set the padding to be $CD instead of letting it be uninitialized.
  • [ALL] References from bank header sections are now found when we discard unreferenced sections.
  • [ALL] Fix buffer overflow for \xXX strings.
  • [ALL] Fixed a possible crash bug when printing opcodes in DEBUG executable.
  • [ALL] Allow .BACKGROUND file to be smaller than the output ROM.
  • [ALL] Fixed a couple possible buffer overflows.
  • [ALL] Fixed CRC calculating on some 64-bit platforms.
  • [ALL] Macros rounded all floating point arguments to integers - not any more.
  • [ALL] Added support for "string".length.
  • [ALL] The documentation is now compatible.
  • [ALL] Running the assembler/linker without arguments shows now also the version's date.
  • [ALL] Added -A to WLALINK - Add address-to-line mapping data to WLA symbol file.
  • [ALL] WLA and WLALINK give now more information about the cause when a memory overwrite/overflow occurs.
  • [ALL] Added .ADDR (alias of .DW).
  • [ALL] Updated the dotted to-be-skipped directives list in .ENUM and .RAMSECTION to contain missing items.
  • [ALL] .DEFINE now supports keyword EXPORT (auto export).
  • [ALL] Added .PRINT - a combination and more usable version of .PRINTT and .PRINTV.
  • [ALL] .PRINTV's HEX/DEC are optional. Default is DEC.
  • [ALL] Added .ENUMID - creates definitions with an auto-incrementing value. Can autoexport as well.
  • [GB ] Added support for .VERSION (Mask ROM version number).
  • [GB ] Fixed the handling of RAMSIZE inside of .GBHEADER.
  • [GB ] New licensee code is set to $0000 if old licensee code is used.
  • [GB ] Added VERSION ($014C) to .GBHEADER.
  • [GB ] Added the following mnemonic aliases: 1. LDH A,(C) --> LD A,($FF00+C) 2. LDH (C),A --> LD ($FF00+C),A
  • [658] Added .DSL.
  • [658] Added .FARADDR (alias of .DL).
  • [658] Added support for DL/LONG/DSL to .STRUCT and .RAMSECTION.
  • [658] Added support for .EXHIROM.
  • [658] MVN and MVP had source and destination in wrong order in the output binary.
  • [SPC] Fixed a typo, RET1 is now RETI.
  • [SPC] Fixed a typo, "AND1 mem.bit, C" ($CA) is now "MOV1 mem.bit, C"
  • [SPC] Fixed AND1, EOR1, MOV1, NOT1 and OR1 (used to take two 8-bit arguments, now 13-bit address and 3-bit value.
  • [SPC] Fixed many 8-bit PC relative label references to be direct references.
  • [Z80] Added shadow register aliases of opcodes that use registers A, F, BC, DE and HL. For example, "AND A'" assembles to the same (0xA7) as "AND A". The aliases are meant for programmers who want to explicitly show when they are using the shadow registers.
  • (with the following changes to WLALINK)
  • Added support for NO$SNES symbol files.
  • -d discards now also SUPERFREE sections.
  • Added support for prioritizing sections.
  • Fixed the absolute 24bit addresses of .RAMSECTION labels.

  • v9.7 (17-Apr-2018)
  • [ALL] We now use CMake instead of plain Makefiles.
  • [ALL] Added INSTANCEOF support to .STRUCT.
  • [ALL] Removed DEBUG opcode from GB-Z80.
  • [ALL] WLALINK now reserves the bytes the checksummer uses if WLA is used to calculate a checksum.
  • [ALL] Added ALIGN to .RAMSECTIONs.
  • [ALL] .RANSECTIONs now use the BANK when placing sections.
  • [ALL] .BLOCK needs to be now terminated with .ENDB.
  • [ALL] Fixed some typos in error messages.
  • [ALL] Added a directory called "bug_exhibition" for bug reports.
  • [ALL] When parsing "\1.w" the parser now associates the ".w" part with the "\1" part.
  • [ALL] Recursive macro calls with recursive argument references should work now.
  • [ALL] .ASC can now map also byte data.
  • [ALL] Rewrote the macro argument expander.
  • [ALL] Fixed .INCDIR/.INCBIN cache bug.
  • [ALL] Added support for -I [include directory].
  • [ALL] Added ASCII commands to strings.
  • [ALL] Added support for local labels with @ prefix.
  • [ALL] "historical" contains now old. depcerated files.
  • [ALL] Updated WLA/WLALINK argument parser.
  • [ALL] Sphnix is now used to generate the documents.
  • [ALL] Various bug, crash and error message fixes.
  • [ALL] Labels can now be 255 characters long instead of 63.
  • [ALL] Various fixes to negative range for 8-bit two's complement.
  • [ALL] Power operator supports fractional values.
  • [ALL] Expressions are allowed to be outside 16bit range.
  • [ALL] Added support for _sizeof_[label] automatic definitions to WLALINK, these measure the distance between two consecutive labels in bytes.
  • [ALL] Unreferenced section discarding now handles also RAM sections.
  • [ALL] It's possible to append to a section using APPENDTO.
  • [ALL] .IFDEFs can be used in .ENUMs and .RAMSECTIONs.
  • [ALL] .BASE is now universal, not just 65816 specific.
  • [ALL] Speeded up label handling in WLALINK.
  • [Z80] Added .SMSHEADER.
  • [Z80] Added support for "SUB IXH" and "SUB IXL", and kept the old aliases "SUB A, IXH" and "SUB A, IXL".
  • [Z80] Fixed .SDSCTAG parsing.
  • [658] Added support for .DL.
  • [GB ] Added support for .COUNTRYCODE.
  • [GB ] Added support for .GBHEADER.
  • [GB ] NO$GMB symbol files are now BGB (emulator) compatible.
  • [GB ] Added support for .NINTENDOLOGO.
  • [GB ] Added DESTINATIONCODE as an alias for COUNTRYCODE.
  • [GB ] Added support for .ROMGBCONLY.

  • v9.6 (27-Jan-2015)
  • [ALL] Fixed usage info (was missing -i).
  • [ALL] Moved the project to GitHub:
  • [ALL] Renamed local variables in a lot of functions to make the code easier to understand.
  • [ALL] Moved LDFLAGS to end of GCC invocation to fix builds.
  • [ALL] Changed "-pedantic" to "-pedantic-errors -Wextras" in WLA's and WLALINK's makefiles.
  • [ALL] Add ability to compile using Microsoft CL, LINK, and NMAKE / Added makefile generator m4 scripts.
  • [ALL] Fixed .ROMBANKMAP and .BANKS allocation to prevent heap corruption when .BANKS allocated exceeds .BANKSTOTAL
  • [ALL] Added support for more than 255 sections per file.
  • [ALL] WLA assembles now "WLAW" library files and "WLAL" object files.
  • [ALL] Added optional running index definition to .REPEAT / .REPT.
  • [ALL] The calculation parser in WLA DX is now smarter - it knows more places when to stop parsing.
  • [ALL] Feeding address labels via named ARGS to a .MACRO failed before, because they were interpreted as strings, not address labels.
  • [ALL] Changed all references to bash to sh in scripts.
  • [ALL] Added support for SEMISUBFREE sections.
  • [Z80] .SDSCTAG & .SMSTAG & .COMPUTESMSCHECKSUM now work with 8KB & 16KB ROMs.
  • [Z80] .SDSCTAG's minor version number is now parsed correctly.

  • v9.5 (14-Aug-2008)
  • [ALL] The now takes the number of jobs make commands should create, speeding up the compiling on CPUs with more than one core.
  • [ALL] .DSTRUCTs can now be issued without passing values to all struct members (will be init to $00 or .EMPTYFILL).

  • v9.4 (02-Mar-2008)
  • [ALL] Enhanced the documentation.
  • [ALL] .DEFINE without a definition value, and a .DEFINE that would have an address label as the definition value would make WLA count the linenumbers afterwards wrong.
  • [ALL] Issuing a loose .ENDM will give an error.
  • [ALL] All macros must have at least a name.
  • [ALL] Added .DBM (define bytes through a filter macro) and .DWM (define words through a filter macro).
  • [ALL] Added FILTER to .INCBIN (circulate all the data through a filter macro).
  • [ALL] Fixed overflow checks in .INCBIN's SKIP and READ.
  • [ALL] Integrated Mersenne Twister by Takuji Nishimura and Makoto Matsumoto (.SEED, .DBRND and .DWRND use that now instead of the stdlib's srand() and rand()).
  • [ALL] It's possible to use '\!' to get the name of the currently parsed source file (works like '\@').
  • [Z80] If a pending computation follows "JR" or "DJNZ", all the label references inside are relative.
  • [GB ] If a pending computation follows "JR", all the label references inside are relative.
  • [65?] If a pending computation follows "BCC", "BCS", "BEQ", "BMI", "BNE", "BPL", "BVC", "BVS", all the label references inside are relative.
  • [65C] If a pending computation follows "BCC", "BCS", "BEQ", "BMI", "BNE", "BPL", "BVC", "BVS", "BRA", "BBR*", "BBS*", all the label references inside are relative.
  • [658] If a pending computation follows "BCC", "BCS", "BEQ", "BMI", "BNE", "BPL", "BVC", "BVS", "BRA", "BRL", "PER", all the label references inside are relative.
  • [HuC] If a pending computation follows "BCC", "BCS", "BEQ", "BMI", "BNE", "BPL", "BVC", "BVS", "BSR", "BBR*", "BBS*", "BRA", all the label references inside are relative.
  • [SPC] If a pending computation follows "BCC", "BCS", "BEQ", "BMI", "BNE", "BPL", "BVC", "BVS", "BRA", "BBS", "BBC", "CBNE *", "DBNZ *", all the label references inside are relative.

  • v9.3 (09-Sep-2006)
  • [ALL] Updated makefiles (by Tobias Pflug).
  • [ALL] Added 'memorymaps'-directory, where you can find default .MEMORYMAPs for various machines.
  • [ALL] Enhanced .MEMORYMAP defining.
  • [ALL] .DEFINE works also without a definition value (defaults to 0).
  • [ALL] Added .BLOCK and .ENDB.
  • [ALL] Added .SYM (and alias .SYMBOL).
  • [ALL] Added .BR (and alias .BREAKPOINT).
  • [ALL] Added .SHIFT.
  • [ALL] Relaxed the MACRO argument counting. Any MACRO can now be called with varying number of arguments.
  • [ALL] .DEFINE can now handle definitions where lone address labels appear (e.g., only "MAIN+0" used to work).
  • [ALL] Added AmigaOS4 makefiles (by Ventzislav Tzvetkov).
  • [ALL] Some code cleanups.
  • [ALL] Fixed the WIN32 makefiles (by Daniel Horchner).
  • [650] Fixed class 4 opcodes to work again.

  • v9.2 (22-Aug-2004)
  • [ALL] WLA can generate makefile rules (flag 'M') describing the dependencies of the main source file.
  • [ALL] Added flag 'q' to suppress .PRINT* -directives.
  • [ALL] Hexadecimal values can now be given using the suffix 'h' (e.g., 10h and 0abh).
  • [ALL] Fixed the preprocessor to handle cases like "-: jr -".
  • [ALL] Sections did affect the .ORG outside of them, in some special cases.
  • [ALL] Added "RETURNORG" to .SECTION to (hopefully) fix this thing once and for all.

  • v9.1 (26-Jun-2004)
  • [ALL] Sections do not affect the .ORG outside of them.
  • [ALL] Code cleanups.
  • [ALL] .IFs can compare string definitions.
  • [ALL] WLA assembles now "WLAV" library files and "WLAK" object files.
  • [ALL] Added preliminary support for list files.
  • [ALL] Added aliases .DEF (.DEFINE), .REDEF (.REDEFINE), .UNDEF (.UNDEFINE), .WORD (.DW), .BYT (.DB), .BYTE (.DB), .ASC (.DB), .EQU (.DEFINE) and .REPEAT (.REPT).
  • [ALL] Added .FOPEN, .FCLOSE, .FREAD and .FSIZE.
  • [ALL] Increased the case insensitivity in many directives.
  • [ALL] It's possible to use "=" in .DEFINE and .REDEFINE.
  • [ALL] The initial size of a section can now be given with the keyword "SIZE" (take a look at the README).
  • [ALL] .FAIL exits nicer.
  • [ALL] .ENUM can do descending enumeration.
  • [ALL] Added operators '>' (get the high byte) and '<' (get the low byte).
  • [ALL] FREE, SEMIFREE and SUPERFREE sections can be aligned.
  • [ALL] Added "FSIZE" to .INCBIN.
  • [ALL] .STRUCT creates more definitions.
  • [ALL] Structure members can now be used in computations.
  • [ALL] Relaxed the handling of '.' in stack calculator. Now for example "AND1 C,1+2+3.3-2-1" works (SPC-700).
  • [Z80] Fixed opcodes in group 7 to work again. A new feature in 9.0 broke these.
  • [658] .SNESHEADER, .SNESNATIVEVECTOR and .SNESEMUVECTOR don't work with libraries any more.
  • [658] .SNESNATIVEVECTOR and .SNESEMUVECTOR don't change .ORG anymore.
  • [658] All the vectors of .SNESNATIVEVECTOR and .SNESEMUVECTOR are optional and default to $0000.
  • [658] Added .SMC, .INDEX and .ACCU.
  • [658] Operand hinting overrides SEP/REP/.INDEX/.ACCU when dealing with immediate value opcodes (now when did this break?), and .8BIT/.16BIT/.24BIT affect only the rest of the opcodes. WARNING! Check your code as this fix may break it.
  • [658] "LDY.W #?" works now.
  • [658] Added 24bit operand hint .l.
  • [65x] Added more operand size checks to opcode parsers.