Last update:
3 V 2020

== CPU boards ==
* Information
* Downloads
== ELSA ==
* Information
* Change log
* Downloads
== IDE Plus ==
* Information
* Download
== Let's Emu! ==
* Information
* Downloads
== CP/Emu ==
* Information
* Downloads
== Fixes ==
* Downloads
== 65C816 XL OS ==
* Information
* Change log
* Compatibility list
* Download
== Other stuff ==
* Downloads
== U-BASIC ==
* Information
* Downloads
== MultiBASIC ==
* Information
* Change log
* Download
== SysInfo ==
* Information
* Download


ELSA change log


  • in SpartaDOS X the assembler will, while exiting to DOS, write a value to the system variable ERRNO: 0 on success or a non-zero value on error. An I/O error will result in writing the corresponding system error code, an assembly error will cause a positive value greater than 1 to be written there. This will allow to catch assembly errors in batch scripts using the IF ERROR conditional (on SDX later than 4.49-release, that is, because up to 4.49 IF ERROR only reacts to error codes greater than 127).
  • added implied pseudo-addressing-mode to the following instructions: BCC, BCS, BEQ, BNE, BPL, BMI, BVC, BVS, so that they can easily be used to mask the following one-byte instruction. They are one cycle faster than BIT zp in this role and do not generate a spurious read.
  • added implied pseudo-addressing-mode to the BIT instruction so that it can easily be used to mask the following two-byte instruction.
  • the program was freaking out if there was a comment placed next to .zp directive.
  • directives without the leading dot (like org $2000) were accepted, fixed.
  • added the directive .align.
  • added pseudo-instructions JSR (abs) and JSL [abs].


  • forgot to add .hex to the list of directives which should stuff data to the listing.
  • forgot to zero the delta which is to be added/subtracted to/from the data bytes generated by the .byte/.cbyte/.sbyte directives, which in turn caused it to be propagated to subsequent .byte directives (& co.)
  • if one of these directives contain nothing but this delta value, an error will be thrown.
  • removed a duplicated error message from the error list.
  • output of multiplication or division must always be of type "value", not "address" regardless of the input types.
  • fixed a bug that sometimes caused the label type to be clobbered (symptom: "UNDEFINED" error for a label which has been perfectly defined).


  • the procedure looking up the symbol table slightly (5-10%) speeded up.
  • contrary to what was stated in the docs, .lc was able to switch off the listing enabled with the /L command line switch.
  • changed the ELSA.EXE-building procedure to something faster (gave up the old linking script running in MultiBASIC) and more robust (fixes in the relocator).
  • most I/O functions will now handle errors automatically, which allowed to get rid of many status checks all across the code.
  • suggest shortening Jxx on 6502 too.
  • suggest shortening JMP on everything but 6502.
  • warn on JMP/JSR/Jxx instructions which jump to the address located immediately after themselves.
  • fixed typos and other cosmetic changes in messages.
  • deleting now the line buffer contents after returning from .include
  • adjustments made to make the listing more compact and more readable at the same time.
  • .byte, .cbyte, .sbyte, .word, .dbyte, .long, .tbyte, .float now generate actual information to the listing.
  • so does .dc, but this one just displays up to 11 first data bytes of the block being generated.
  • also, .dc's arguments may be now separated with comma (besides space).
  • fixed the phase error bug occurring when DEW/DWA was used with forward declaration.
  • fixed a silly typo in RRA expansion, which resulted in putting $09 (ORA #) into the output buffer instead of $c9 (CMP #).
  • reworked the code expanding ASR, B2H, PHR, PLR, RLA, RRA at the occasion.
  • the arguments to .opt were only recognized when typed in lowercase.
  • added .opt f- to be used before including a binary file (with .bin) from a filesystem which does not provide a reliable information about file's length (such as the AtariDOS FS). Use .opt f+ afterwards.
  • added .opt w- to disable warnings during assembling. w+ is the default, /Q in the command line has a priority over this.
  • changed the operation of .float so that it now accepts both floating point constants and integer expressions.
  • added pseudo-labels __M65C802__ and __M65C816__ as aliases to the existing __M65802__ and __M65816__ (which were misdocumented previously).
  • added the /R command line switch.

0.9 (first public release)

  • implemented pseudo-instructions RCC, RCS, REQ, RGE, RLT, RNE, RMI, RPL, RVC, RVS (Repeat last instruction if Carry clear... and so on), SCC, SCS, SEQ, SGE, SLT, SNE, SMI, SPL, SVC, SVS (Skip next instruction if Carry Clear etc.), INW, DEW, DWA, B2H, ADD, SUB, PHR, PLR, ECC, ECS, EEQ, EGE, ELT, ENE, EMI, EPL, EVC, EVS (Exit subroutine if Carry Clear etc.), ASR, RRA, RLA.
  • changed the syntax of PEA to what some other assemblers :) use, i.e. PEA #$xxxx, PEA ($xx), PEA $xxxx, last two being PEI and PER in MAE.
  • implemented directives .zp, .code, .ifdef, .ifndef, .ll (list just the following line), .el, *** (.else and .endif, respectively, for backward compatibility with MAE), [ and ], .rept, .endr, related pseudo-label __REPT__ and (likewise related) operator #.
  • .ifs can finally be nested.
  • implemented logical AND (&&), logical OR (||) and unary negation (!).
  • cleaned up the implementation of the directive set.
  • implemented pseudo-labels __ASIZE__, __ISIZE__ (size of the A and XY in bits, respectively), __M65C02__, __M65SC02__, __M65802__ indicating 65C02, W65SC02 and 65C802 as targets; and .65c02 (or .c02), .65sc02, .65c802 to enable these targets in source.
  • code identifying a pseudo-label cleaned up.
  • directive .error made better, it is now the same as .print, except that it also aborts the assembling with the "USER-DEFINED" error message.
  • warnings will be produced in second pass only.
  • no more checking CPU hardware: init will now rely solely on the information returned by the OS.
  • when there is no kmalloc() in the OS, or the High RAM is occupied, use base 64k (this leaves about 20k for symbol table).
  • command line options may be now marked also with the slash character, e.g. /D instead of -D.
  • implemented command line option -M to specify the default target CPU (it can be overridden in the source).
  • the object file name may be now specified in the command line.
  • the PRINTF library replaced with a new version, which does not use OS mathpack (thus releasing large portion of zero page) and is able to convert integer values up to 32-bit into decimal or hexadecimal ASCII strings.
  • fixed a bunch of minor bugs here and there.


  • implemented pseudo-labels __M6502__, __M65816__, __RSSIZE__ and entire mechanism to predefine new ones
  • added a warning when a value is truncated by one or two bytes down
  • implemented directives .if/.else/.endif (not nestable for now)
  • fixed bug in .end directive
  • implemented directives: .rsset and .rs
  • fixed bug in expression calculation for .word directive in 1st pass
  • fixed bug in .cbyte: in .cbyte 0,0,0,0,0 and the like it used to set bit 7 on every byte instead of on the last one only
  • implemented directives .rb and .rw © KMK
free counters