
                  The XAssembler Compiler - Version History


  3.12 (16.01.2007)
  ------------------
  added:
   - CMPXCHG,CMPXCHG8B,CPUID,RDMSR,RDTSC,RSM and WRMSR instructions (Pentium)
   - BSWAP,INVD,INVLPG,WBINVD and XADD instructions (486)
   - 387+ FPU instruction set
   - instruction set limiting capabilities
   - support for 32/64-bit floating-point numbers
   - change in version numbering (only one dot), encoding method for _ver
     constant remains the same

  fixed:
   - invalid 66h prefixes for string instructions in 32-bit code
   - XLAT instruction argument for default segment override in 32-bit code


  3.1.1 (17.11.2006)
  ------------------
  added:
   - full instruction set for 386 processor (including IMUL extended form
     and immediate arguments for jumps)
   - the SEG directive is removed, its full functionality will be replaced
     with the use of predefined segment constants
   - the "-y" option is removed (not enough old sources around to keep it)
   - so called "middle line comments" are removed (they were an annoying
     problem when commenting-out single lines of code that already had
     comments)

  fixed:
   - message printing (removed some unused code)
   - 16-bit/32-bit compile time calculations (incorrect high byte/word in
     some rare cases)


  3.1.0 (25.02.2006)
  ------------------
  added:
   - Flat mode (limited to 64k)
   - DPMI format for Flat mode (the same limit)
   - the FAR mode is removed

  fixed:
   - invalid relocation table if FILE directive was used in data definition
   - RETN/RETF encoding


  3.0.9 (20.11.2005) - bugfix release
  -----------------------------------
  fixed:
   - "-x" command line option (it is now enabled after several bugfixes)
   - 64k of zeroed data is no longer written to EXE file if global data
     size = 0
   - arrays larger than 64k not reported as errors in 16-bit modes (array
     sizes were silently cut to 16-bit word value)
   - default BYTE type for non-type data definitions wasn't used in certain
     cases (this caused some bytes to be defined as words/dwords)
   - far CALL/JMP instructions with "[mem]" argument (were treated as near)


  3.0.9 (12.08.2005)
  ------------------
  added:
   - SHLD,SHRD instructions
   - included file search in "INC" subdirectory

  fixed:
   - strange bug in displacement calculation routine, caused offsets > 32k
     to be reported as "out of range" if previous displacement was negative
   - "-p" command line option, now works as it should


  3.0.8 (03.08.2005)
  ------------------
  added:
   - full support for 32-bit addressing
   - ARPL,BOUND,LAR,LSL instructions
   - {c+}/{c-} switch for address auto-completion
   - {z+}/{z-} switch for zero displacement removal
   - "_ssize" and "_hsize" predefined constants

  fixed:
   - r/m and sib bytes calculation routine cleaned up (gained some speed)
   - small bug in compilation time calculation
   - incorrect interpretation of some switches located directly after
     data definitions as syntax errors


  3.0.7 (02.07.2005)
  ------------------
  added:
   - ENTER,LGDT,LIDT,LLDT,LMSW,SGDT,SIDT,SLDT,SMSW,VERR,VERW instructions

  fixed:
   - POP CS instruction control (poping CS segment register from stack
     in this way is not possible)
   - removed some 'dead' code
   - renamed option "!" to "i"
   - END directive check when no main unit is present ({j-} switch check)
   - decimal numbers to binary conversion (some ASCII character codes
     were incorrectly interpreted as digits)


  3.0.6 (12.04.2005)
  ------------------
  added:
   - BSF,BSR,BT,BTC,BTR and BTS instructions

  fixed:
   - "mem,imm" argument data type matching problem
   - compilation time calculation (now with 1/100 parts of second)


  3.0.5 (03.04.2005)
  ------------------
  added:
   - IMUL,LEA,LDS,LES,LFS,LGS and LSS instructions

  fixed:
   - near CALL/JMP jump size calculation for jumps longer than 32k
   - incorect global/local symbol identification in forward refs
   - small bug in MEMORY directive processing subrountine



  3.0.4 (30.03.2005)
  ------------------
  added:
   - first 3.x version able to compile itself :)
   - COMMENT and ENDC directives (no need to comment out every
     line of not needed source part)

  fixed:
   - invalid ORG directive parameter value control (bits 31-24
     weren't checked)
   - immediate displacement calculation (incorrect interpretation
     of user constants)


  3.0.3 (28.03.2005)
  ------------------
  added:
   - Small and Near modes (SEG function still doesn't work)
   - new combinations for segment initialization instructions
     (they take less place in output file and don't modify
     any registers - except DS and ES, of course)
   - "sreg,mem"/"mem,sreg" combination for MOV instruction

  fixed:
   - serious bug in EXE header generation code
   - simple bug in displacement range check routine (negative
     offsets were reported as "out of range")
   - simple bug that caused max 16-bit jump range to be incorectly
     limited to 32512 bytes (255 bytes less than it should be)


  3.0.2 (08.03.2005)
  ------------------
  added:
   - "_dtp" predefined constant
   - simple numeric expressions like : a + b - c
   - "mem" argument for SETcc instruction

  fixed:
   - displacement in "[reg + imm]" memory refs (now that
     numeric expressions somehow work I could find a bug)
   - another bug in "[symbol]" memory refs (symbol address
     wasn't loaded into opcode)
   - another "mem,imm" combination bug in MOV instruction
   - incorrect line number when reporting "invalid numeric
     expression" errors (not all)
   - invalid near/far RET encoding while procedure type is
     set to default
   - "mem,imm" combination for MOV instruction (for certain
     values the generated code was 90h, which is NOP)
 

  3.0.1 (03.03.2005)
  ------------------
  added:
   - modified code for symbol table lookup (uses less memory
     refs so it's faster)
   - forward references by symbol name in CALL/JMP/Jcc
   - OFS, SIZEOF and TYPEOF functions
   - ENDI directive (renamed it from ENDIR because "R" is right
     above "F" on the keyboard and someties I mistyped it to 
     ENDIF ... which throwed up an compilation error of course)
   - extra control code for ENDR and ENDI directives (ints
     can't have parameters)
   - {r+}/{r-} switch for automatic RET insertion
   - "reg,mem"/"mem,reg" combination for XCHG (proceed as with
     group $11 instructions)
   - "mem,imm" combination for arithmetic and shift instructions
   - INLINE directive (instead of CODE, I just renamed it)
   - new way to check whether LFN's are supported (this one is
     more reliable)
   - PROGRESS directive (shows current file name and line)
   - adaptive aligning for basic-type variables (saves more space)

  fixed:
   - SET directive scope (now it works everywhere, not only
     in data definition block)
   - debug/control register identification ("unknown symbol
     reference" was reported for certain combinations)
   - bad immediate value calculation in forward jumps/calls
     (caused 0..4 byte long fwd jumps to return "target out
     of range" error)
   - simple but hard to find bug that caused "end of file"
     error where it shouldn't
   - check for comma after data defined from external file
   - removed all source-modifiers from command line options
   - small bug in JMP/Jcc forward references 
   - symbol code speedup (removed some not needed memory refs)
   - symbol name length for local labels (bad length caused
     checksum to be incorrect - symbol couldn't be found and
     "uknown symbol reference" error was reported)
   - compiler mode check in far calls/jumps where argument 
     is a symbol name
   - default jump type (near/far) in CALL/JMP
   - weird bug that caused forced short jumps to throw
     "type mismatch" error
   - range check for 32-bit arguments in CALL/JMP/Jcc
   - compilation time calculation when presenting status
   - automatic detection of sign-extendable constants (negatives
     in range -127..-64 were ignored where they shouldn't be)
   - opcode table pointer preservation
   - [reg + ofs] argument size miscalculation with optimizing
     disabled (default displacement type was not properly set)
   - correct message printing (no unwanted random extra lines)
   - argument parser bug that caused switch directives after
     single-argument instructions to report syntax error (simple
     "{" char check was missing)


  3.0.0 (not released)
  --------------------
  added:
   - 386 instruction set (incomplete ?)
   - compilation modes : com, bin
   - data types : byte, word, dword, qword, tbyte, oword and arrays
   - user-defined constants
   - symbol names up to 90 chars long
   - autofilling
   - unlimited source files size
   - multi-level file including
   - long file names support

  ... and more


  ----------------------------------------------------------------------------


  2.3 PDE (May 2002)
  ------------------
  - as name says : PDE - Public Domain Edition
    I had to 'prepare' sources a bit for this one

  2.3 (Jan 2001)
  --------------
  - the last of 2.x line
  - some small bugfixes

  2.2 (Jul 1998)
  --------------
  - ehem, actually I forgot what was new with 2.2

  2.1 (Mar 1998)
  --------------
  - some minor optimizations, mostly speed-ups

  2.0 (Feb 1998)
  --------------
  - only one but hell of optimization :  program uses memory
    instead of temporary files

  1.0 (Dec 1997)
  -------------------
  - first working version (not available anymore)
  - 8086 instruction set
  - generates only MZ EXE files (max 64k data + 64k code)
