cc6502 1.0.30

a library for making C compilers for the 6502 8-bits processor
Documentation
v1.0.30 (05/05/2025) :
	  - Added verbosity CLI option

v1.0.29 (01/08/2025) :
    - FIXME: #error is executed only on active code parts instead of ALWAYS yielding an error
    - FIXME: #undef doesn't yield an error when not defined
    - Experimental: Optimization on (pointer >> 8) + offset expression
    - Optimization: Set condition flags in >> 8 operator

v1.0.28 (01/08/2025) :
    - FIXME: Fixed bug of signedness of neg operand

v1.0.27 (12/06/2024) ;
    - Optimization: remove LDA followed by CMP oar STA + LDA

v1.0.26 (10/28/2024) ;
    - Experimental: Better handling of 16 bits complex expressions
    - FIXME: Suscripts were allowed on char and short variables (not just pointers)
    - FIXME: Rust panic on assign to void
    - Added sizeof support in constant expressions

v1.0.25 (07/22/2024) :
    - FIXME: fixed do statement grammar (avoid collision with do_X variables)
    - Take into account EXFIX bankswtiching scheme for Atari 7800
    - Solved bug in optimizer (LDA removed while it sets the flags)
    - Solved bug wrt missing CMP after JSR
    - Removed constant time code in order to be comatible with the latest Rust compiler
    - Local arrays are allocated in the right bank	
    - Corrected optimizer bug with DEC and INC instructions
    - Added ## support in preprocessor

v1.0.24 (04/20/2024) :
    - Corrected a bug wrt carry flags
    - Added function pointers into variables hash table

v1.0.23 (04/12/2024) :
    - Introduced noholeydma keyword

v1.0.22 (03/22/2024) :
    - Bug corrected : bad const propagation in declarations
    - Bug corrected wdt to incorrect flags set when saving Y register 
    - Bug corrected wrt save Y register & deferred plusplus bad order
    - Bug corrected wrt save T register in branching
		- FIXME: Acccept dereferenced variables as pointers in declarations

v1.0.21 (03/11/2024) :
    - Bug corrected (cc2600 couldn't compile anymore)

v1.0.20 (02/29/2024) :
    - Optimized away useless loads
    - Implemented 16 bits shifting
    - Implemented warnings for constants not fitting in 8 bits
    - Implemented new "nopagecross" keyword
    - Corrected a bug in grammar (>= was forbidden in calc_expr)

v1.0.19 (02/16/2024) :
    - Added protection to clseep nops 

v1.0.18 (02/16/2024) :
    - Bug corrected wrt indexed by X variables increment
    - Added line numbers in inserted code (easier debugging)
    - Implemented warnings for constants not fitting in 8 bits

v1.0.17 (02/01/2024) :
    - Bug correction : 16 bits inc produces incorrect core for ramchip
    - Bug correction : panic when statement missing at the end of source code
    - Added support for comparison with immediate on left hand side
    - Indicate error line when compiler error not implemented

v1.0.16 (01/15/2024) :
    - Optimized out JMP followed by JMP 

v1.0.15 (01/07/2024) :
    - Corrected bug when returning values with inline functions
    - Added support for constant address in array of pointers

v1.0.14 (12/18/2023) :
    - Corrected bug wrt prototypes declarations with parameters
    - Swap CLC/SEC and LDA to optimize out ADC #0
    - Optimize out AND #255
    - Corrected errors in ASM bytes counting

v1.0.13 (12/02/2023) :
    - Added support for bracketed bank declaration

v1.0.12 (11/10/2023) :
    - Initialized global data should be const
    - Added support for pointer offsets in global array declarations
    - Implemented ptr = X << 8
    - Added support for (X = 0; X < 10;) { X++ } expression
    - Optimized ptr |= 16 * 256
    - Optimized ptr = Y | (X << 8)
    - Corrected Bug ptr = Y | (X++ << 8)
    - Corrected bug with embedded assembly of less than 4 lines

v1.0.11 (10/27/2023) :
    - Bug fix: Accepts >> 8 on char**

v1.0.10 (10/17/2023) :
    - Bug fix : Already defined local functions in blocks 
    - Bug fix : Forbid complex 16 bits operations with 8 bits shifts
    - Bug fix : corrected (short >> 8) >> 4 
    - Bug fix : corrected 16 bits +X, +Y

v1.0.9 (10/09/2023) :
    - Removed a debug println 

v1.0.8 (10/08/2023) :
    - Fixed a bug on win32 with CR/LF included asm files

v1.0.7 (10/05/2023) :
    - Fixed bankswtiching issue with SuperGames 

v1.0.6 (10/02/2023) :
    - Added bank header to asm files 

v1.0.5 (09/25/2023) :
    - Corrected a bug wrt parameter passing (and comma operator) 

v1.0.4 (09/18/2023) :
    - Corrected a bug wrt whitespace management in grammar (charz = 1 was accepted as a z variable declaration)

v1.0.3 (09/04/2023) :
    - Corrected a bug wrt to double use of Y register when assigning to Y while using Y as an index

v1.0.2 (08/28/2023) :
    - Corrected a small bug in assemble.rs in optimizer, the sometimes results in a Rust panic during compilation

v1.0.1 (08/14/2023) : 
    - Corrected bug wrt cc2600 compatibility with v1.0.0

v1.0.0 (07/13/2023) :
    - Accept *ptr with ptr not const (allows char* params)
    - Generate performance warning for *ptr ("hidden" Y indirect access)
    - Added W (warnings) compile flag
    - Corrected ptr[0] error

v0.9.2 (07/12/2023) :
    - Corrected bug with variables beginning with char or int

v0.9.1 (07/12/2023) :
    - Added sizeof(type) support
    - Added preliminary support for function parameters
    - Added support for bytes hint in asm statment

v0.9.0 (07/09/2023) :
    - Added support for local variables
    - Corrected a small bug wrt ++/-- in subscript of 16-bits instructions
    - Optimized out ORA #0 instructions
    - Added support for references (pointers) in arrays of char definition (not just immediate values)

v0.8.1 (06/28/2023) :
    - Small bug correction for char * pointers references
    - Added optimization : optimized TXA/TAX & TAY/TYA pairs
    - Corrected a bug with line numbering with included assembler code
    - Added comparison between Acc & Tmp

v0.8.0 (06/19/2023) :
    - Better integration of assembler code (with codesize comment)
    - Corrected a big bug with assembler code inclusion (preprocessing of strings)

v0.7.4 (06/14/2023) :
    - Added recursion in preprocessor
    - Changed regex of #define to cope with () expressions (up to 3 levels of depth) 
    - Corrected a bug in carry propagartion error
    - Experimental: now accepts any subscript expression (not only X and Y)

v0.7.3 (06/12/2023) :
    - Detect carry propagation errors in 16 bits arithmetics code
    - Implmented function return in accumulator
    - Added support for & 0xff to extract lower byte of short

v0.7.2 (06/08/2023) :
    - Refactoring: Split huge generate.rs file into multiple source files
    - Added optimized implementation of 16 bits increment and decrement
    - Added optimization : removed first LDA followed by a second LDA  
    - Added optimization : removed LDA followed by STA with same mnemonic
    - Bug correction: avoided panic when inline function is not defined before use
    - Bug correction: removed optimization around JSR

v0.7.1 (06/05/2023) :
    - Bug correction : big bug in switch/case...
    - Bug correction : tmp was sometimes not released during 16-bits compare
    - Bug correction : registers out of zeropage are set to ramchip memory (instead of zeropage)
    - Corrected a bug: return Y didn't work 

v0.7.0 (06/02/2023) :
    - Changed interface to actually compute call tree (for linker) 

v0.6.0 (05/28/2023) :
    - Mark functions actually in use (for linker) 
    - Implemented 16-bis comparisons (partial)
    - Corrected a bug in 16-bits negation
    - Added function return values (in cctmp)
    - Added NMI interrupt routine support

v0.5.3 (5/25/2023) :
    - Moved processing of literal strings to preprocessor, in order to avoid troubles with comments inside strings

v0.5.2 (5/22/2023) :
    - Corrected a bug with mutiple string literals
    - Added missing cases for conditions on X or Y

v0.5.1 (5/15/2023) :
    - Added support for function macros without parameters
    - Solved an issue with for statement
    - Fixed ++/-- with 16 bits operations
    - Fixed -- prefix operator
    - Fixed sizeof operator
    - Added support for ternary expressions in declarations
    - Added quoted character support
    - Corrected a bug with carry flag
    - Added better support for immediate expression results 
    - Added int type (short int)

v0.5.0 (4/29/2023) :
    - Added -g debug flag

v0.4.1 (4/24/2023) :
    - Corrected a bug with splices processing under windows

v0.4.0 (4/24/2023) :
    - Changed out.a default output file name to classical a.out
    - Added -S option for assembler output only
    - Enhanced error reporting in case of syntax error in array definitions

v0.3.5 (4/16/2023) :
    - Shortened included C comments
    - Even better optimization for branching (added carry_flag_ok flag)

v0.3.4 (4/13/2023) :
    - Added better optimization for branching (to be fully tested)
    - Added better support for macros with parameters (accepts spaces after comma, substitutes words only)

v0.3.3 (4/6/2023) :
    - Removed strange MemoryOnChip flag in compile_var_decl for constants out of zeropage...
    - Added SuperGame bankswitching (for Atari 7800)
    - Added a default 3 bytes for inline asm (for code size estimation)

v0.3.2 (4/4/2023) :
    - Added screencode support for constant strings declarations
    - Added support for comma operator

v0.3.1 (4/3/2023) :
    - Added function size_bytes() to generated code
    - Checked scattering validity for atari 7800 (8 or 16 lines)

v0.3.0 (4/2/2023) :
    - Added "atari2600" and "atari7800" cargo features
    - Corrected missing acc in use flags
    - Corrected bug with respect to definition of multiple arrays on the same line