forked from totalspectrum/spin2cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Changelog.txt
2061 lines (1806 loc) · 89.1 KB
/
Changelog.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Version 7.0.0
- Added Spin2 structures (basically small objects)
- Added BOOL debug modifier for -g
- Added some of the v44 Spin2 builtin methods like byteswap
- Cleaned up the Spin parser to enable direct access to struct/obj members
- Fixed long relative branches (tjz, djnz, etc.)
- Only use the stack for variables whose address is actually taken (thanks to Ada for this!)
Version 6.9.10
- Fix compilation error when GETWORD is replaced by MOV or MUL
- Fix varargs calls in nucode when no varying arguments present
- Fix an incorrect warning about locals shadowing globals in C
Version 6.9.9
- Fixed `--compress` flag on Windows
- Added `--zip` flag to flexcc
- Improved handling of file names in .zip output
- Improved error message for sizeof(x) when x is undefined
Version 6.9.8
- Fix `#foo+CONST` calculation
Version 6.9.7
- Fixed infinite loop when CORDIC and Read/Write optimizations fight
- Fixed potential crash when compiling empty functions
- Allow `#foo+CONST` for inline assembly when `foo` is a HUB label
Version 6.9.6
- Added a peephole for some address calculations (as suggested by Evan)
- Fixed some built-in functions in spin2cpp
Version 6.9.5
- Fixed immediate ranges for load/store, and made out of range immediates an error (thanks to Ada)
- Fixed an inappropriate memory forwarding with WZ (also thanks to Ada)
- Made sure arrays of bytes are put into memory, even if inside structs or unions
Version 6.9.4
- Fixed a use of uninitialized memory on 32 bit platforms
- Skip running compression & similar passes when there are errors
Version 6.9.3
- Fixed typo in datetime
- Ignore ' style comments in #define definitions
Version 6.9.2
- Fixed $ relative ORGF (thanks, Ada)
- Fixed annoying error spam with bad instructions when -l given
- Fixed a missing type check which caused vfscanf() to fail to compile
- Fixed incorrect conversion of multiplication into shifts in nucode
- Fixed alignment requirements for boolean types
Version 6.9.1
- Fixed initialization of boolean types
- Fixed several bugs around booleans
- Reduced storage size required for boolean types (in most cases)
Version 6.9.0
- Added new optimization to merge duplicate functions (only at -O2, and so far only works for small functions)
- Extract side effects in more cases to avoid errors with ++,-- in complex expressions
- Fixed some nucode compilation problems with the C test suite
- Fixed failure to allocate memory for local variables in some cases
- Fixed incorrect removal of some functions that were not completely inlined
- Fixed sizeof() for boolean types
- Fixed incorrect test for 16 bit multiplies on P2
- Fixed a problem with CASE statements in Spin (thanks again, Ada!)
- Updated SD card code to work better and in more configurations (thanks to Evan and Ada)
Version 6.8.1
- Fixed using new keywords like `bytes` in parameters with default values
Version 6.8.0
- Added support for `%"xyzw"` constants in Spin2
- Added locking for host file system I/O
- Added `--compress` flag to compress binaries (courtesy of Ada)
- Fixed incorrect inline assembly for `#outb` and other hw registers
- Made `@foo.bar` work when `bar` is a label
- Supported PNut v43 `{Spin2_vNN}` version comments
Version 6.7.2
- Added putchar to libc.a
- Added another optimization for more AND x, #255 cases.
Version 6.7.1
- Added a memory read optimization in -O2, courtesy of Ada
- Added a peephole optimization for WRBYTE x,y after AND x,#255
- Fixed a problem in DEBUG() printing functions with multiple return values
- Fixed some 32/64 bit confusion in Spin comparison operators
Version 6.7.0
- Added new Spin2 lstring/bytes/words/longs keywords
- Added versioning for Spin2 language files, controlled by {$ver NN} or {vNN}
- Fixed potential bug in shl/shr peephole optimization
- Made SEND() work in the various bytecode interpreters
- More forceful warning for return without a declared result in Spin2
- Optimized 16 bit multiplications more often
Version 6.6.2
- Added warning (-Warray-index) for constant array indices out of bounds
- Allow warnings and optimizations to be turned off with a `no-` prefix (so `warn(no-init-vars)` is like `warn(!init-vars)`).
- Added some peephole optimizations to remove unnecessary sign extension
- Added peephole optimizations for sequences of shifts/adds/subs
- Parse --optimize= flag (spin2cpp) in a slightly more flexible way
- Some internal changes to make recovering from missing xxd easier
Version 6.6.1
- Changed type of `dat` array in C++ output to `unsigned char`
- Fixed function type usage in -2nu for some Spin method pointers
- Updated copyright notices in COPYING.LIB
Version 6.6.0
- Added pc_key and pc_mouse to -gbrk
- Added missing !! and ! postfix operators for Spin2
- Implemented proper boolean type for C
- Fixed -- operator for floats
- Made the BASIC boolean type a distinct type
- Made BASIC booleans print as "true" and "false"
Version 6.5.4
- Minor optimization improvement (and major documentation improvements) courtesy of Ada
Version 6.5.3
- Fixed an incorrect relocation check that caused spurious internal errors
- Implemented NAN() method for Spin2
- Implemented rename for host (9P) file system
- Improved error message for objects that are not found
- Reduced likelihood of duplicate function definitions in sub-objects
Version 6.5.2
- Really added BASIC date/time functions (inadvertently not checked in)
- Fixed *scanf() for floating point values
- Fixed a problem parsing attributes attached to static functions.
Version 6.5.1
- Changed some warnings about unused wcz flags into errors (when the corresponding instruction requires the flags)
- Fixed some problems with line numbers in errors & warnings after #include
- Fixed a potential bug with fcaching of loops with a branch between them (thanks to Ada)
- Fixed array access in ORG code in nu output
- Improved some error messages
- Various portability improvements for the source code itself
Version 6.5.0
- Added MKDIR function for BASIC
- Added support for NeoYume style ARGv parameters in C
- Added execl() function in C
- Added DATE$, TIME$, and SETTIME functions to BASIC
- Added rewind() function in C
- Allow arguments to be passed in the BASIC CHAIN function
- Fixed `-x` option in flexcc
- Fixed interaction between Parallax FS and stdio FILEs when multiple FILEs are open
- Fixed missing mbrtowc implementation
- Fixed overly agressive type checking on BASIC CPU() for asm code
- Fixed Spin2 issue with variables named `result` in void functions
- Implemented new Spin2 REPEAT n : i syntax (thanks, Ada!), and later added REPEAT n WITH i variant
- Keep a small FCACHE even in -O0, to allow ORG to function as expected
- Made _geterror() clear the error number
- Allow & operator for string concatenation in BASIC
- Re-factored some code to reduce bloat a bit
- Updated Parallax file system to new version from Chip and Stephen
Version 6.4.0
- Added getcrc() builtin for Spin2
- Added VFS layer for Parallax flash file system
- Added recognition for "$" and "%" to __builtin_atoi
- Changed littlefs to not return . and .. entries in path search (so it matches host fs and FATFS)
- Fixed compilation error for object arrays in bytecode
- Fixed some quirks in the space/tab warning code
- Fixed incorrect expansion of field[ptr][n]~~
- Fixed an incompatibility between _tx and debug()
- Fixed timeout in _rxraw() (test was wrong way around)
- Improved range of sin and cos functions
- Improved performance of flash access in littlefs (thanks, Evan!)
- Updated -gbrk code to most recent from Chip, and add support for brk #0 interactive debug (thanks, Ada!)
Version 6.3.0
- Added #pragma exportdef to make defines apply in other files. This
provides another way for top level objects to control sub-objects' behavior.
- Added freopen(), tmpfile(), mktemp(), and some other stdio functions
- Added some missing math functions
- Cleaned up PSRAM access methods and made them more consistent
- Correctly handled casts to void in nucode output
- Fixed some problems with sizeof() used to declare local variables
- Fixed incorrect multiple casting of union initialization
- Fixed incorrect evaluation of unsigned constant expressions
- Fixed an over-eager register rename in the optimizer
- Fixed a bug which caused incorrect type inference for method variables in P1 ROM bytecode
- Several improvements to C locale() related functions
Version 6.2.3
- Added strpbrk(), strcoll(), strspn() functions for the C library
- Fixed a potential crash in Spin2 parsing of @func()
- Fixed taking the difference of a pointer and generic value
Version 6.2.2
- Fixed some 64 bit constant issues with DIR/OUT/IN manipulation
- Make sure garbage collector does not reclaim BASIC I/O wrapper
- Reverted waitatn() change from 6.2.0
Version 6.2.1
- Added a check for i <= 0 in mid$(a, i, j)
- Fixed a bug in calculating fcache size
- Fixed @x-@y expressions in P1 bytecode DAT section
- Fixed some array offset calculations in P1 bytecode (thanks Ada)
- Fixed object arrays in P1 bytecode (thanks again to Ada)
- Fixed returning classes from functions, at least for some common cases
Version 6.2.0
- Changed waitatn() to use a pollatn() loop like the Spin2 interpreter does
- Extended littlefs code to allow multiple instances
- Fixed offset computation when structs have 8 byte subfields
- Fixed a bug in alignment of 64 bit integers
- Implemented new method pointer code for PASM backends that does not require memory allocation.
- Implemented interfaces in BASIC
- Optimized some 64 bit operations on constants (thanks to Ada)
- Various other assembly optimizations, again due to Ada
Version 6.1.8
- Changed maximum number of entries in multiple assignments from 8 to 16
- Fixed multiple uses of LET in BASIC programs
- Made sure class types are resolved when they are used as function returns
- Made UTF-8 the default encoding for FatFS (configurable via FF_LFN_UNICODE)
Version 6.1.7
- Added `DEBUG_DISABLE` constant to disable DEBUG() in Spin2 objects
- Added %b flag for binary output in printf
- Added ubin support for printf debug
- Made `virtual` a reserved keyword in C++
- Reduced memory usage of default printf
Version 6.1.6
- Added ability to double quote to include quotes in literal BASIC strings
- Allowed BASIC string constants to initialize other consts
- Fixed a problem with declaring new types that are arrays of objects
- Fixed a bug with calculating bits in BASIC direction() and output()
- Implemented flush() for FATFS files (thanks to Ada)
- Improved some error messages
- In C++ output, treat unknown types in prints as generic
- Made `interface` and `implements` reserved keywords in BASIC
- Made BASIC use of + operator on strings more consistent
- Optimized a few BASIC string expressions
- Optimized calculating length of string literals
Version 6.1.5
- Added warning about deleting unused user CORDIC instructions
- Fixed a bug in handling of (*X++) ^= N
- Fixed a bug when inlining functions with small local arrays
Version 6.1.4
- Fixed incorrect paths in libc.a
Version 6.1.3
- Allowed -I directives in .fpide files
- Fixed incorrect macro definitions in .fpide files
- Fixed a number of places where incorrect line numbers were used for errors
- Fixed an incorrect partially applied loop optimization
- Fixed language type used for BASIC main program when mixed languages are in use
- Improved handling of .. and . in C library
- Reduced register requirements for inlined functions
- Reduced some C/BASIC file I/O incompatibilities
Version 6.1.2
- Added files included by FILE directive to .zip files
- Fixed an optimizer bug around the P1 PHSx registers
- Fixed incorrect constant optimization of inline assembly (caught by Ada Gottensträter)
- Fixed some missing optimizations when -l was enabled
- Fixed incorrect assembly output for files not ending in newline when -l is on
- Fixed final value of loop variables after loop is transformed to djnz
- Fixed PTRx offsetting in C inline asm
- Fixed bugs in ELSE conditional assembly parsing.
- Implemented __builtin_expect (thanks, Ada!)
- Several additional optimizations contributed by Ada
- Skip symbol resolution when outputting .o files, fixes some output bugs
- Made object constant override expressions be evaluated in the parent object
- Minor optimization for expressions like 2*x
Version 6.1.1
- Added special -D_XTLFREQ=x and -D_XINFREQ=x command line defines
- Fixed IF in assembly debug
- Fixed constant SIGNX evaluation
- Made the preprocessor ignore characters after a line comment start (like ')
- Made jmp relative calculations act more like the official compiler
- Use proper full name for C include files in zip creation
- Remove .zip file on failed creation
Version 6.1.0
- Added basic support for compiling project files (.fpide or .side)
- Implemented ^@ and FIELD[] for Spin2
- Implemented conditional assembly instructions if, elseif, else, and endif
- Merged Ada's improved strlen() function
- Merged some register allocation improvements from Ada
- Provide syntax for C `struct using` to override constants in Spin2 objects
Version 6.0.5
- Fixed an optimizer bug with inlined functions
- Fixed a spurious "use before set" warning in sizeof()
- Improved the error message for try blocks in bytecode output
Version 6.0.4
- Fixed incorrect file name after #include in some rare cases (when the included file's name exactly matches the end of the original file)
Version 6.0.3
- Fix a bug in P1 listing file output
Version 6.0.2
- Fixed an internal error where BASIC array references sometimes look like calls
- Fixed some spurious warnings about 0-0 style operands in inline assembly
- Fixed number of blocks calculation in FatFS stat() function.
- Fixed some "unknown type xx passed to IsArrayType" errors
Version 6.0.1
- Added missing file for LittleFS file system.
Version 6.0.0
- Added interpreter and code size printing if --sizes is given
- Added atof() and strtof() functions
- Added %p format flag to printf
- Allow newlines inside BASIC initializations
- Automatically reset baud rate on _clkset()
- Disabled SIMPLE_IO printf optimization because it was interacting poorly with symbol resolution
- Fixed _ assignment in nucode output
- Fixed calculation of FVAR/FVARS when labels are unknown
- Fixed a problem with unnamed parameters not being counted in code generation
- Fixed _getus() and _getms() in -2nu
- Fixed _waitms and _waitus timing
- Fixed type of `_clkmode` on P2 (it was byte instead of long)
- Fixed compilation error on some signed multiplies
- Fixed calling varargs functions from Spin in bytecode
- Fixed BASIC LINE INPUT when no explicit file handle is given
- Fixed umount of SD card to clear pins in use
- Implemented _muldiv64 for bytecode
- Made Spin2 loop behaviour match that of other languages (like PNut v38)
- Optimized nucode output considerably
- Passing a NULL pointer to mount() now causes an error, rather than unmounting
- Some internal cleanups in the code generators
Version 5.9.28
- Added some simple loop optimizations to transform loops into DJNZ form at level -O1
- Fixed incorrect code generated sometimes for fetching the upper 32 bits of a 64 bit function result.
- Fixed REV operator in nucode output
- Improved performance of nucode generated code
- Optimized P1 multiply code (thanks to Ada for this)
Version 5.9.27
- Added some more missing functions from libc
- Added some additional asm optimizations thanks to Ada
- Fixed an out of memory crash due to nested structs in -O0
- Fixed assembly warnings that were accidentally broken
- Made more fatfs options settable on the command line (thanks, Ada)
- Made P2 signed multiply always generate inline code
- Optimized the 9p filesystem code somewhat
Version 5.9.26
- Added __FLEX_MAJOR__, __FLEX_MINOR__, and __FLEX_REV__ macros
- Added __asm__ alias for __asm in C
- Fixed a bug when __builtin_clz was applied to memory
- Improved performance of symbol resolution in sub-modules (some complicated code was so slow it seemed to hang)
Version 5.9.25
- Added __P1__ macro defined only for P1 compiles
- Added UMOUNT command for BASIC
- Added an `inline` attribute to encourage functions to be inlined
- Added _cogstart_cog and related defines to propeller2.h
- Added a new file libc.spin2 to make calling the C library easier from Spin2
- Fixed ALIGNL in Spin2 VAR blocks
- Improved some error messages
- Made heap corruption code check depend on -g flag
- Made sure variables are properly aligned in Spin2 for P1
- Tweaked file names in zip files to be compatible with more unzippers
Version 5.9.24
- Added --zip flag to create archive of source files
- Allowed __fromfile inside classes, and fixed symbol resolution for this case
- Fixed using local constants for default parameters in methods
- Fixed a compiler bug affecting fscanf
- Handled some more bitfield expressions in nucode & bytecode output
- Improved output of -f, and added #include'd files to that output
- Implemented ungetc function
Version 5.9.23
- Enable DEBUG in inline assembly if -gbrk is active
- Fixed .lbl+n expressions in inline assembly
- Fixed Spin2 loops so that the correct value is in the variable if the loop is quit
- Fixed Nucode evaluation of some bit operations
- Fixed a crash when duplicate names declared in anonymous structs
- Made sure all registers involved in a large data structure are allocated if any of them are used
Version 5.9.22
- Added control over individual warnings
- Define a symbol __DEBUG__ when -g or -gbrk is given
- Fixed indirect method pointer calls in Spin2 (like LONG[x](foo))
- Fixed compiling some boolean expressions involving 64 bit integers
- Fixed QCOS and QSIN when used with angles larger than twopi
- Fixed some signed/unsigned conflicts in Spin constant evaluation
- Made foo.[n] produce the same results on P2 as the usual Spin2 compiler, by having it extract the upper bits to find the range of bits affected
- New optimization to use SUMxx instructions if possible (thanks Ada!)
- New optimizations for memcpy/memmove (again, thanks to Ada)
- Removed <- and -> operators from Spin2 (use ROL and ROR instead)
- Revised P2 frequency calculations to match Chip's latest version
- Some floating point optimizations from Ada
- Several other miscellaneous optimizations from Ada
- Spin2cpp now respects '!cse' optimization flag.
- Warnings about C strings being passed to non-const pointers now only happen with -Wall
Version 5.9.21
- Automatically zero local Spin2 variables
- Fixed loop test for downwards loops with steps > 1.
- Fixed some problems with variable offsets in Spin
- Fixed an incorrect read/write optimization affecting assembly output
- Improved handling of two dimensional arrays in BASIC
- Improved handling of method pointers in Spin2
- Optimized ZEROX (thanks Ada)
- Optimize some "obvious" 64 bit shifts
- Restored generation of all public methods in spin2cpp C and C++ output
Version 5.9.20
- Added a new pass to re-calculate object sizes after symbol resolution (fixes some problems with memory overruns in C code used as Spin object)
- Added STRCOPY Spin2 function
- Fixed a crash when trivial C programs are submitted
- Fixed swapping 64 bit variables
- Fixed failure to change arrays to pointers in some C expressions
- Fixed 64 bit integer preincrement
- Fixed initializing local reference variables
- Fixed += and similar operators when used with references
- Implemented object constant overrides (object parameters) for Spin
- Implemented ... line continuation for Spin
- Inline assembly can now access multiple longs of large local variables.
- More fixes to C struct initialization
- Made debug output and C library output work better together
- Made repeat loops in Spin2 finish with the same value as in PNut
- Optimized initializers of large local variables
- Optimized long fills on P2 with SETQ (thanks to Ada Gottensträter again!)
- Remove unused methods even at -O0 optimization
- Relax type checking in C for pointer/integer conversion
Version 5.9.19
- Added a warning for mixing tabs and spaces in Spin code
- Added strtok() function to C library
- Fixed some incorrect C array declarations
- Fixed precision not being reset in printf
- Fixed incorrect leaf function analysis in Spin functions using floats
- Fixed lut function bug that crept in when memory was reserved at start of LUT
- Fixed padding while initializing structures
- Implemented -E and -H flags for nu bytecode
- Implemented SPR[] in bytecode (thanks to Ada Gottensträter)
- Improved register allocation in leaf functions (thanks Ada)
- Improved optimization for small wait loops (also thanks to Ada)
- Made SPR[] work more like Spin1 (thanks Ada)
- Reduced register usage in local array initialization
- Reimplemented TYPEOF to be more useful
Version 5.9.18
- Fixed missing # on output of jint style inline asm instructions
- Fixed some bugs in the BASIC open wrapper (handling of close and recv were dodgy)
- Fixed use of function aliases in submodules
- Fixed an address calculation bug in bytecode
- Made some nucode code generation improvements
- Minor tweak to preprocessor to better handle files that do not end with a newline
Version 5.9.17
- Added '=' as alternate immediate syntax for use in C macros.
- Added REGISTER keyword to BASIC
- Fixed ++ and -- operators for 64 bit variables
- Fixed signed modulus for 64 bit integers
- Fixed a bug in varargs handling for 64 bit values in bytecode
- Fixed output of C boolean operators in bytecode
- Fixed some problems with 32 to 64 bit casts in ASM output
- Fixed a bad check for immediate values in P1 rdlong/rdbyte/etc.
- Fixed a warning in BASIC about the _timezone variable.
- Made ALIGNW and ALIGNL keywords Spin2 only (some older Spin1 programs used these)
- On P2, allow coginit() of COG and LUT functions.
- Support register variables in C and BASIC
- Renamed LMM pc to __pc to avoid conflict with user code
Version 5.9.16
- Added UNION classes to BASIC
- Fixed a number of problems with 64 bit variables in bytecode
- Fixed an initializer bug in unions
Version 5.9.15
- Added definitions for PR0-PR7 registers in Spin2
- Added ORGH/END inline assembly in Spin2 for non-optimized hub based inline asm.
- Added MUXQ optimization for P2 pinwrite.
- Fixed several missing 64 bit arithmetic operations.
- Fixed evaluation of unary `+`.
- Fixed incorrect optimization around FCACHE.
- Made first 16 LUT registers reserved for user code.
- Prevent REP loop optimization in ORG and volatile asm
Version 5.9.14
- Added check for limit in ORG and ORGH
- Added warning for incompatible types in comparisons
- Fixed an incorrect optimization across calls
- Fixed dpeek/dpoke definitions in BASIC, and added lpeek/lpoke
- Improved support for 64 bit integers
- Increased default heap size on P2 to 6000 bytes
- Removed some bad debug printfs from sdmm.cc
Version 5.9.13
- Added base 4 and base 8 literals to BASIC
- Added __builtin_movbyts() intrinsic
- Added varargs support to bytecode backends
- Added PEEK, POKE, DPEEK, DPOKE, and VARPTR to BASIC
- Allow looking up static member variables and labels
- Fixed incorrect varargs leaf function optimization
- Fixed precedence of '\' in Spin when used for catching
- Fixed missing downcast when 64 bit arguments are passed to 32 bit parameters
- Fixed operator precedence of long @addr[n] in Spin DAT sections
- Make C const arrays always go into DAT, to save space
Version 5.9.12
- Added LINE INPUT to BASIC
- Added definitions for BUFSIZ and L_tmpnam to stdio.h
- Added FREEFILE function to BASIC
- Added new C intrinsics __builtin_bswap16, __builtin_bswap32, __builtin_parity, __builtin_popcount
- Changed the way C global variables are handled in objects; they used to always be shared between variables, but now can be proper member variables in some circumstances
- Fixed "CLASS USING" file name lookups inside CLASS in BASIC
- Fixed incorrect address calculation when AUGD is needed for CALLPA
- Made clkmode_ and similar symbols accessible in submodules
- Modified SD card code to (I hope) support multiple cards
Version 5.9.11
- Added BOOLEAN keyword to BASIC
- Added some additional optimizations (thanks again, Ada!)
- Added -Wextra flag (ignored for now) to flexcc
- Fixed -gbrk bug which crept in last release
- Fixed some problems parsing C function pointer type declarations
- Fixed some optimizations incorrectly happening to ORG/END assembly
- Fixed some other incorrect optimizations
- Fixed "extern" in C function definitions
- Made it so defining a _clkmode enum in C works as intended
- Reserved REDIM and PRESERVE keywords in BASIC
- Some more PASM optimizations from Ada (thanks!)
Version 5.9.10
- Added a LOT of helpful optimizations contributed by Ada Gottensträter
- Added __HAVE_FCACHE__ define if FCACHE is enabled (also contributed by Ada)
- Added --nostdlib flag to suppress default include files
- Added KILL function to delete files in BASIC
- Added ELSE clause to single line IF in BASIC
- Actually fail compilation if a preprocessor #error directive is found in Spin
- Fixed some bugs in time related functions
- Fixed FCACHE not being enabled during system module compilation
- Fixed a nasty condition code printing bug (thanks Ada!)
- Fixed DEBUG with multiple return valued functions
- Merged Ada's change to support Shift-JIS character encoding
- Merged Evan's smartpin SD card reading code for much faster SD card access on P2
- Updated FatFs to newer version
Version 5.9.9
- Added special preprocessor comments {$flexspin ... } for FlexSpin specific code.
- Allow dynamic sign/zero extend on P1 (thanks Ada)
- Fixed variable redeclaration in Basic OPTION IMPLICIT
- Fixed an immediate addressing bug that showed up with DECLARE ALIAS sometimes
- Fixed curdir$() problems in BASIC
- Fixed an issue with += of strings where the rhs is a function call
- Fixed some bugs in PUT/GET processing when the result is read
- Made dir$("*",fbNormal) skip directories
- Preliminary support for anonymous structures and unions in C
- Recognized new Spin2 BYTEFIT and WORDFIT keywords
Version 5.9.8
- Fixed a crash in nucode compilation
- Fixed DECLARE ALIAS in bytecode mode
Version 5.9.7
- Added some more bit-banging optimizations (e.g. bith/bitl -> bitc)
- Added a new optimization for simple FOR loops with constant bounds
- Added special function optimizations for pinread/pinwrite
- Added SIZEOF operator to BASIC
- Added BITREV function to BASIC
- Added ALIAS, DECLARE, EXTERN, LINE, and LIB keywords to BASIC
- Added support for DLY() to default -g debugging
- Added #pragma ignore_case directive
- Added DECLARE ALIAS to BASIC
- Allowed printing of pointers in BASIC
- Changed default runtime tests to use P2 instead of P1
- Fixed a few missing definitions in <propeller.h>
- Fixed a problem with SendRecvDevice() in BASIC
- Fixed an incorrect optimization for loops containing GOSUB
- Fixed multiple args in DEBUG() statements with -gbrk
- Fixed a problem with extern declarations in C not working in .o files
- Fixed in bug in mis-detecting use of result values in bytecode output
- Fixed a nasty bug for functions with more than 99 local registers used
- Fixed a bug in DIR$() in subdirectories of SD cards
- Fixed printing of values passed by reference
- Improved C++ compatibility for class functions, including supporting "static" in classes and declarations of functions outside the class
- Made RESULT no longer a reserved word in Spin2, should fix a number of bugs
- Optimized local variable push/pull (thanks Ada)
- Reduced number of temporary registers needed by the compiler
Version 5.9.6
- Added error for non-constant compile time initializers
- Allow ALIGNL and ALIGNW in VAR sections
- Fixed incorrect error when printing DEBUG expressions containing function calls
- Fixed error in assignment chain processing in Spin1 when one item is a function
- Fixed some bugs in parsing C struct declarations
- Issue an error for redefinition with different type inside a class
Version 5.9.5
- Added CHAIN #n for BASIC, and _fexecve(fd, argv, envp) for C
- Fixed incorrect static function detection when coginit is used (affected reSound)
- Fixed a serious memory overflow bug in fopen()
Version 5.9.4
- Added some error checking for parameters of CPU/coginit/cognew
- Added --charset=C for changing runtime character set
- Fixed Spin2 round(), trunc(), and float() operators for variable expressions
- Fixed multiply by -1 when local variables are on the stack
- Fixed expansion of macros which contain other macros
- Fixed ABORT in Spin functions with no return statements
- Fixed C _clkfreq constant in multiple enums problem
- Implemented subset of try/catch for C++
- Improved Catalina compatibility for spin2cpp
- Various improvements to the nu code backend
Version 5.9.3
- Fixed automatic detection of floats for printf/scanf
- Fixed optimizer errors on SCA, XORO32, and similar instructions
- Fixed a spurious warning about 0-0 in inline assembly
- Implemented new Spin2 floating point operations
- Prevent loops containing BRK from being optimized to REP
- Started to add some optimizations for Nu
Version 5.9.2
- Added internal definition for the BASIC number$ function
- Added experimental flag -2nu for P2 interpreter (not working much yet)
- Fixed some "backwards" repeat loops in Spin
- Fixed wrap around of getus and getms
- Fixed an optimizer bug around non-leaf functions in COG and LUT
- Fixed a problem finding extensions in -Wabs-paths
- Fixed definitions of if_x1 and if_1x condition codes
- Handled '+' and ' ' format characters in builtin printf
- Improved detection of some keywords like ASM in old code
- Improved output of expressions in DEBUG()
- New flag -gbrk for using Chip's BRK based debug output (Thanks Ada!)
Version 5.9.1
- Added support for bool, false, and true to C++
- Added some missing defines in stdint.h
- Added automatic I/O locking for PRINT, __builtin_printf, and DEBUG
- Added ability to have multiple items in BASIC CASE
- Added "ASM_CONST" keyword to Spin
- Added optimization for x==x in integer code
- Added check for re-defining member variables in classes
- Added _SameTypes() and _HasMethod() functions to BASIC to check data types
- Changed "ASM CONST" to "CONST ASM" in BASIC
- Fixed multiple assignments in Spin (a:=b:=c) to have the same semantics as Spin
- Fixed template functions so BASIC "string" type is preserved
- Improved --interp=rom (Spin1 bytecode output) to run more programs
- New optimization: -Oremove-features removes advanced file I/O features if not needed by the program; this can a lot of space. Enabled by default in -O1.
Version 5.5.2
- Added cpustop for BASIC
- Allow relative branches between COG and LUT RAM
- Cleaned up exec() and CHAIN to clear RAM before starting the new program
- Fixed a bug which could cause duplicate struct definitions in C
- Fixed an optimizer bug where reads/writes could be incorrectly re-ordered
- Fixed an error parsing += in BASIC array operations
- Fixed a bug in *s parsing in sscanf()
Version 5.5.1
- Added a warning for ignored second parameter to `org`
- Added -Os option; similar to -O1, but favors smaller size.
- Added #warning directive to C preprocessor
- Fixed Spin startup function (should be first PUB function, not first function)
- Fixed evaluation of @ inside CONSTANT
- Fixed assembly of PTRA++[0] and PTRA++[16]
- Fixed some spurious warnings about uninitialized variables
- Fixed an optimization error for BYTE[] and WORD[]
- Fixed incorrect unary assignment operator behavior in Spin
- Fixed ~x and ~~x at top level in Spin1
- Fixed SIGNX= and ZEROX= in Spin2
- Fixed compilation of MOUNT if there is no OPEN (not a useful case, but still)
- Improved COG memory usage
- Improved conversion of longmove() in Spin to handle labels
- Made objects come after all variables in Spin
- Merged colorized error message changes from Wuerfel21.
- Optimized PRINT CHR$(x) in BASIC
- ALPHA: new bytecode backend from Wuerfel21, accessed by --interp=rom. This is not finished yet but can compile many Spin1 programs.
Version 5.5.0
- Added warning for modifying ptra in inline assembly
- Added throwifcaught command for BASIC
- Allowed '$' in inline assembly in C
- Fixed a problem with large ranges in lookup/lookdown
- Fixed a preprocessor bug which sometimes caused failure to recognize comments
- Fixed a bug in handling multiple return values that are less than long sized
- If -Wall is given, warn about uninitialized local variables
- Implemented "public" and "private" in C++ classes
- Improved listing file output by adding RES and FIT entries
Version 5.4.3
- Clear all errors on successful open
- Fixed path lookup on Windows under cmd.exe
Version 5.4.2
- Added support for range cases (a ... b) to C
- Fixed constant evaluation of some Spin2 operators
- Fixed bitfield access to memory references
- Fixed mixing reads and writes in C stdio
- Fixed mixing fgetc and fread in C stdio
- Fixed a bug in determining types of Spin2 constants in other objects
Version 5.4.1
- Added __DATE__, __TIME__, __FILE__, and __LINE__ macros
- Added documentation for __VERSION__ macro
- Allowed wc and wz on indirect jumps on P2
- Check for gosub commands inside FCACHEd code
- Fixed incorrect common sub-expression elimination after labels
- Implemented some of the missing math functions from propeller2.h
Version 5.4.0
- Added some preliminary support for 64 bit integers (not complete yet)
- Added error for testp or testb used without flags
- Added --tabs=N for specifying amount of indent due to tabs
- Added support for __FUNCTION__ in BASIC and C
- Fix incorrect types in some const initializations.
- Fixed a problem with comments in the preprocessor
- Fixed incorrect line numbers after ASMCLK
- Fixed a bug in counting parameters when some are structs
- Fixed a bug in initializing arrays with modifiers like const
- Fixed parsing of ?: in Spin2
- Fixed some union initializer bugs
- Fixed setnib/setbyte/setword encoding for abbreviated forms
- Fixed an optimizer bug in loop strength reduction
- Handle mixed float/int in C ?: operator by promoting one side as necessary
- Made some low level C functions builtins
- Made FCACHE size settable on P2
- Support debug_baud macro to some degree
- Set default baud rate for C and BASIC based on -D_BAUD=n macro
- Tweaked listing file output slightly to include comments at end of file
Version 5.3.2
- Accept ' as a digit separator as well as '_' (C++14 uses single quote)
- Avoid FCACHE in FCACHE (e.g. for loops with empty org/end)
- Disable inlining for functions explicitly placed in COG or LUT memory
- Cleaned up ABORT handling to be Spin2 compatible
- Improved removal of DEBUG() statements when -g is left out
- Some internal changes for 64 bit support (still a work in progress)
- Support ptrx[N] syntax in inline assembly
Version 5.3.1
- Added aliases for _pinw, _pinl, and _pinh in Spin (to match the documentation).
- Better error messages for some bad C function declarations.
- Cleaned up operator precedence to match Spin2
- Fixed typos in SmartSerial.spin that made it stop working
- Improved accuracy of parsing floating point constants.
- Provided default dummy functions for send() and recv()
Version 5.3.0
- Added SimpleSerial object for P1/P2 compatibility
- Added _lockrel() function for C
- Added header file with smartpin definitions (not strictly necessary in flexspin, but useful for compatibility with other compilers and Visual Studio)
- Adjusted output of floats in PRINT USING
- Allowed pin -1 to mean "no pin" in SmartSerial
- Changed the trivial Spin stub in P1 code to be compatible with openspin
(this allows flexspin to be used to make the PropLoader fastloader)
- Changed handling of ? operator in Spin2 to be compatible with PNut
- Extended DEBUG() capability to include some backtick features
- Fixed argv[0] handling in the command line tools
- Fixed use of FCACHE in inline assembly in LUT and COG functions
- Fixed BASIC input when 127 (DEL) is read (Unix terminals use this for backspace)
- Fixed a problem with parsing floating point numbers with 32 bit compilers
- Fixed use of instructions as operators in DAT section
- Fixed parsing of large floating point numbers
- Ignored DEBUG statements completely unless -g is given
- Really fixed RECV return value
- Even in -O0, remove unused functions in C subclasses (avoids problems with duplicate symbols in stdio)
- Supported pin fields in Spin2 pin control functions
Version 5.2.0
- Added GET as keyword to BASIC
- Added GET and PUT binary I/O to BASIC
- Added _vfs_open_sdcardx() to allow explicit setting of pins for SD card
- Added new option -Wmax-errors=N to allow more errors to be printed in a run
- Added new option -Wabs-paths to print absolute paths in error messages
- Changed Spin2 member variables to be layed out in the order declared
- Fixed QCOS, QSIN
- Fixed a crash with negative ending values in repeat
- Fixed a problem with SEND(func(...)) in Spin2
- Fixed a problem with initializing two dimensional C arrays with strings
- Modified P2 serial receive to use @evanh's suggestion of 28 bit aqsync receive (so it is effectively 3 characters at a time)
Version 5.1.1
- Added QCOS and QSIN to Spin2
- Added _execve() and CHAIN functions to chain programs
- Added mkdir() function for host file system
- Fixed handling of getcwd for subdirectories
- Fixed handling of DEL in fgets() function
- Fixed GOSUB (it had bit-rotted and no longer worked properly)
- Made EXIT LOOP a synonym for EXIT DO
Version 5.1.0
- Added support for Spin2 constants clkmode_ and clkfreq_
- Added built in ASMCLK macro for Spin2
- Added CALL statement in BASIC
- Added improved error handling for BASIC
- Allow semicolons to seperate lines in C inline assembly (this makes it possible to put inline assembly in macros)
- Fixed another optimizer issue affecting C struct returns
- Fixed undefined _basic_print_unsigned error.
- Fixed a bug with pin ranges where the limits are variables and are given in (lo, hi) order
- Fixed bitfields in C structs being multiply defined
- Fixed sscanf() and similar string functions not working
- Fixed type of RECV() pointer in Spin2
- Fixed isprint() function in C
- Implemented FRAC operator for P1
- Implemented new (more accurate) IEEE floating point math routines
- Increased default buffer size for I/O on P2 (speeds up 9p operations)
- Made "append" mode force seeks to end of file before writes
- Made "_waitms" and "_waitus" work for long waits (more than a system counter rollover)
- More improvements to the BASIC strings library, again courtesy of JRoark
- New functions __builtin_frac, __builtin_mulh and __builin_muluh for C
- Put a "nop" at P2 address 0, so NULL pointers will act like empty strings
Version 5.0.8
- Added a warning for casting const pointers to non-const
- Added missing tan function to math.h
- Fixed Spin2 pinread to work correctly with multiple pins
- Fixed an optimizer bug that could cause corruption of small multi-word structs being returned from a C function
- Properly implemented compile time optimization of BASIC ASC("x") function
- New BASIC string functions from JRoark: improved implementations of some existing functions, and added functions CountStr, RemoveChar$, ReplaceChar$, and StrInt$
Version 5.0.7
- Added code to support _ret_ in inline assembly
- Fixed rdlong x, ptra[##BIG] instruction form
- Fixed some bugs in cog_run
- Fixed bit references in arrays like A[x].[y]
- Fixed uhex() bug where it only output 1 bit
- Fixed a serious off-by-one error in garbage collection code
Version 5.0.6
- Added cog_* functions from libsimpletools
- Added get_directions() and get_outputs() functions from simpletools
- Added getms() in Spin2
- Documented _pinstart() function for C
- Fixed an off-by-one in the BASIC INSERT$ function.
- Fixed errors in declarations of C modf() and frexp() functions.
- Fixed read() on terminal to break on newline if applicable
- Improved error messages for type mismatches.
- Made libsimpletext text read use _rxraw() to avoid echo.
Version 5.0.5
- Added the EVENT_* symbols for Spin2
- Added warnings for use of RES memory
- Fixed lseek with SEEK_END on 9p file system
- Fixed error reporting for bad rdxxx/wrxxx pointers
- Improved checks for language when no explicit extension is given in object names
- Updated BASIC documentation to include some built-ins that weren't documented
Version 5.0.4
- Added protection for multiple cogs calling memory allocation
- Added NEWCOG constant for COGSPIN
- Fixed a serious peephole bug in TEST/AND merging
- Fixed printing of NULL strings in BASIC
- Fixed error for wrong variable in BASIC NEXT
Version 5.0.3
- Added new reserved word `private` in BASIC (not used yet)
- Changed Makefile to accept YACCVER=bison2 or YACCVER=bison3
- Fixed off-by-one error in fs9p code
- Fixed an off-by-one error in BASIC numeric formatting
- Fixed a bad calculation in p2_clock.h
- Fixed a problem with assignment operators like += in BASIC
Version 5.0.2
- Added "noinline" attribute
- Added a warning for some non-terminating loops
- Fixed a compiler warning in ff.cc
- Fixed a bug with returning structures in C
- Fixed an optimizer bug with trying to replace ptra++
- Fixed an overly aggressive loop reduction optimization
- Made BASIC open command use "throw" to report errors
Version 5.0.1
- Added getms() and getus() for BASIC
- Allow ptra++ in BASIC assembly
- Allow use of constants from other objects in inline assembly
- Allow access to array member variables in Spin
- Convert "ret" in inline assembly to a jump to the end of it
- Fixed a C parser crash
- Fixed a problem with padding C structs
- Fixed a bug parsing strings in C __pasm
- Provided separate namespace for labels in C
- Removed support for Rev A silicon (it was not working anyway)
Version 5.0.0
- Renamed "fastspin" to "flexspin"
- Added "flexcc" compiler front end
- Added --version flag to fastspin
- Added asin(), acos(), atan(), atan2() to BASIC
- Fixed BASIC ^ operator when used with --fixedreal
- Made sin() and cos() work with --fixedreal
- New atan2() implementation using the CORDIC on P2
Version 4.5.0
- Added a warning for C functions with mismatched parameters (it used to silently accept this)
- Added "." character for PRINT USING in BASIC
- Added support for binary floating point constants in C
- Added __builtin_clz() for C
- Added gettimeofday() / settimeofday()
- Added scanf() family of functions for C
- Allowed empty FOR loops in BASIC
- Fixed a number of problems in C struct initialization
- Fixed printing floats in C when --fixedreal is given
- Fixed BASIC FOR loops with negative floating point steps
- Fixed binary and hex constants in C to be unsigned when appropriate
- Fixed a problem with passing small arrays as parameters in C
- Fixed ^ in BASIC
- Made expf and logf use the CORDIC on P2 and ROM on P1
- Made FIXED a reserved keyword in BASIC (for future expansion)
- Updated time functions to work sensibly.
Version 4.4.0
- Added simplified designated initializers (like { .x=1 }) for structs and arrays
- Added float_t and double_t to math.h
- Added fseek() and ftell() stdio functions
- Added Spin2 RECV pointer
- Fixed a hang due to multiply processing modules
- Fixed djnz out of range on P2
- Fixed \0 inside C strings
- Fixed x[n].method() type calls in Spin2
- Fixed x[n].[a] method reference lookups in Spin2
- Fixed some bugs in structure passing/return
- Fixed incorrect FOR loops using unsigned integers if counting down to 0 or up to MAXINT
- Fixed order of declarations for C enums
- Fixed nested initializers in C
- Improved warnings about missing # in PASM
- Made SEND pointer per-COG
- Made some local Spin arrays be held in registers
- Made SPR keyword be Spin1 only (in Spin2 it is "REG")
- Modified inline assembly to allow for accessing array variables
- Reduced the delay for SD card communication to speed up FatFs
- Save/restore SEND pointer in Spin2 if it is modified by a function
Version 4.3.1
- Added HUBSET(), POLLATN(), WAITATN()
- Fix void function calls in SEND
- Fixed some debug function formatting
Version 4.3.0
- P2 API Change: use call/ret instead of calla/reta
- Added finer-grained control over optimizations
- Added per-function control over optimizations
- Added preliminary implementation of DEBUG() for Spin2
- Fixed some bugs in cse and loop optimizations
- Fixed byref parameters in BASIC template functions
- Improved dead code removal
Version 4.2.8
- Added -Werror flag to turn warnings into errors
- Fixed an optimizer bug which could incorrectly delete some conditional statements
- Fixed inlining of static functions
- Made ORG force long alignment
Version 4.2.7
- Added missing waitvid builtin for P1
- Added some additional language compatibility warnings
- Better warning messages for redefining member variables
- Changed default C preprocessor mode to be GCC compatible
- Fixed some C definitions in propeller2.h
- Fixed BASIC printing of floats
- Fixed some problems with .word[N] assignments
- Fixed unnecessary jmp warning when listing file is output
- Improved heuristic for deciding between if statements and jump tables for case statements
- Optimized mul/div sequences with immediates
- Optimized jump tables on P1
Version 4.2.6
- Added sanity check for removing inlined functions (fixes an optimizer bug)
- Added __andthen__ and __orelse__ operators to Spin/Spin2.
- Fixed an optimizer bug in renaming registers
- Fixed assignments like x.byte[1] := y
- Fixed Spin AND and OR operators to evaluate both sides if they have side effects.
- Improved some error messages
- Merged improved P1 multiply/divide routines from Wuerfel21.
Version 4.2.5
- Added many more peephole optimizations
- Added -Wall flag for more warnings, including about language extensions
- Fixed the #warn preprocessor directive
- Fixed a bug in operator assignment (like +=) when both sides have side effects
- Fixed an optimizer bug where some conditional instructions were overlooked in optimizing cmp #0 cases
- Fixed a typo in TAN causing it to return bad values
- Fixed constant(@x - @y)
- Implemented _FREE and _STACK
- Improved optimization around ORG/END blocks (without touching the code inside)
- Improved FCACHE code to merge loops in some cases
- Improved inlining of functions
- On P2, use constants in the D field when we can
- Optimized special cases like x.byte[1] in Spin
- Optimized case statements with constant expressions
- Various other minor optimizations
Version 4.2.4
- Added FVAR and FVARS for Spin2
- Fixed "-C" option for case sensitivity
- Fixed detection of result variables in inline asm (e.g. polxy builtin)
- Fixed handling of # at start of line in Spin CON blocks
- Fixed handling of some Spin1 only keywords and operators
- Fixed label detection on instructions like djnf
- Fixed Spin2 ENCOD operator