Browse Source

* synchronized with trunk

git-svn-id: branches/unicodekvm@49078 -
nickysn 4 years ago
parent
commit
7371e7c105
76 changed files with 3681 additions and 709 deletions
  1. 9 0
      .gitattributes
  2. 1 1
      Makefile
  3. 1 1
      Makefile.fpc
  4. 6 0
      compiler/arm/cpuinfo.pas
  5. 1 1
      compiler/assemble.pas
  6. 4 4
      compiler/cgutils.pas
  7. 48 40
      compiler/dbgdwarf.pas
  8. 28 2
      compiler/i386/n386flw.pas
  9. 1 1
      compiler/link.pas
  10. 105 24
      compiler/nbas.pas
  11. 16 6
      compiler/nflw.pas
  12. 17 7
      compiler/ninl.pas
  13. 2 0
      compiler/nld.pas
  14. 5 0
      compiler/raatt.pas
  15. 185 214
      compiler/systems/t_darwin.pas
  16. 2 0
      compiler/systems/t_embed.pas
  17. 5 0
      compiler/x86/rax86int.pas
  18. 117 77
      installer/install.dat
  19. 11 7
      packages/chm/src/chmfilewriter.pas
  20. 4 0
      packages/fcl-db/src/sqldb/odbc/odbcconn.pas
  21. 31 1
      packages/fcl-js/src/jstree.pp
  22. 61 26
      packages/fcl-js/src/jswriter.pp
  23. 61 5
      packages/fcl-js/tests/tcsrcmap.pas
  24. 48 0
      packages/fcl-passrc/src/pasresolveeval.pas
  25. 99 7
      packages/fcl-passrc/src/pasresolver.pp
  26. 26 3
      packages/fcl-passrc/src/pastree.pp
  27. 25 2
      packages/fcl-passrc/src/pasuseanalyzer.pas
  28. 1 0
      packages/fcl-process/src/win/process.inc
  29. 5 0
      packages/odbc/src/odbcsql.inc
  30. 278 96
      packages/pastojs/src/fppas2js.pp
  31. 1 1
      packages/pastojs/src/pas2jsfiler.pp
  32. 1 1
      packages/pastojs/tests/tcgenerics.pas
  33. 84 13
      packages/pastojs/tests/tcmodules.pas
  34. 42 0
      packages/pastojs/tests/tcprecompile.pas
  35. 1 1
      packages/qlunits/fpmake.pp
  36. 5 5
      packages/qlunits/src/qlfloat.pas
  37. 34 9
      packages/regexpr/src/regexpr.pas
  38. 3 3
      packages/rtl-generics/src/generics.defaults.pas
  39. 6 6
      packages/rtl-objpas/src/inc/strutils.pp
  40. 2 2
      packages/rtl-objpas/src/inc/variants.pp
  41. 1 1
      rtl/amicommon/paramhandling.inc
  42. 2 1
      rtl/embedded/Makefile
  43. 2 1
      rtl/embedded/Makefile.fpc
  44. 2093 0
      rtl/embedded/arm/samd51p19a.pp
  45. 0 4
      rtl/inc/compproc.inc
  46. 7 7
      rtl/inc/dynlib.inc
  47. 1 1
      rtl/inc/filerec.inc
  48. 0 12
      rtl/inc/generic.inc
  49. 0 27
      rtl/inc/rtti.inc
  50. 0 7
      rtl/inc/rttidecl.inc
  51. 1 2
      rtl/inc/system.inc
  52. 2 14
      rtl/inc/systemh.inc
  53. 1 1
      rtl/inc/textrec.inc
  54. 1 1
      rtl/java/jsystemh.inc
  55. 3 4
      rtl/objpas/character.pas
  56. 1 1
      rtl/objpas/classes/classesh.inc
  57. 1 1
      rtl/objpas/classes/lists.inc
  58. 12 22
      rtl/objpas/fgl.pp
  59. 1 1
      rtl/objpas/objpas.pp
  60. 0 3
      rtl/objpas/sysutils/sysencoding.inc
  61. 0 2
      rtl/objpas/sysutils/sysencodingh.inc
  62. 0 5
      rtl/objpas/sysutils/sysstr.inc
  63. 6 18
      rtl/win/systhrd.inc
  64. 2 2
      tests/Makefile
  65. 2 2
      tests/Makefile.fpc
  66. 26 0
      tests/test/trtti21.pp
  67. 17 0
      tests/test/trtti22.pp
  68. 27 0
      tests/test/trtti23.pp
  69. 15 0
      tests/webtbs/tw28640.pp
  70. 14 0
      tests/webtbs/tw28640a.pp
  71. 16 0
      tests/webtbs/tw34232.pp
  72. 21 0
      tests/webtbs/tw38636.pp
  73. 14 0
      tests/webtbs/tw38642.pp
  74. 1 1
      utils/fpmake.pp
  75. 8 0
      utils/pas2js/dist/rtl.js
  76. 1 2
      utils/pas2js/httpcompiler.pp

+ 9 - 0
.gitattributes

@@ -10650,6 +10650,7 @@ rtl/embedded/arm/nrf51.pp svneol=native#text/pascal
 rtl/embedded/arm/nrf52.pp svneol=native#text/pascal
 rtl/embedded/arm/nrf52.pp svneol=native#text/pascal
 rtl/embedded/arm/raspi2.pp svneol=native#text/pascal
 rtl/embedded/arm/raspi2.pp svneol=native#text/pascal
 rtl/embedded/arm/sam3x8e.pp svneol=native#text/pascal
 rtl/embedded/arm/sam3x8e.pp svneol=native#text/pascal
+rtl/embedded/arm/samd51p19a.pp svneol=native#text/pascal
 rtl/embedded/arm/sc32442b.pp svneol=native#text/pascal
 rtl/embedded/arm/sc32442b.pp svneol=native#text/pascal
 rtl/embedded/arm/stm32f0xx.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f0xx.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f10x_cl.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f10x_cl.pp svneol=native#text/plain
@@ -15915,6 +15916,9 @@ tests/test/trtti18b.pp svneol=native#text/pascal
 tests/test/trtti19.pp svneol=native#text/pascal
 tests/test/trtti19.pp svneol=native#text/pascal
 tests/test/trtti2.pp svneol=native#text/plain
 tests/test/trtti2.pp svneol=native#text/plain
 tests/test/trtti20.pp svneol=native#text/pascal
 tests/test/trtti20.pp svneol=native#text/pascal
+tests/test/trtti21.pp svneol=native#text/pascal
+tests/test/trtti22.pp svneol=native#text/pascal
+tests/test/trtti23.pp svneol=native#text/pascal
 tests/test/trtti3.pp svneol=native#text/plain
 tests/test/trtti3.pp svneol=native#text/plain
 tests/test/trtti4.pp svneol=native#text/plain
 tests/test/trtti4.pp svneol=native#text/plain
 tests/test/trtti5.pp svneol=native#text/plain
 tests/test/trtti5.pp svneol=native#text/plain
@@ -18211,6 +18215,8 @@ tests/webtbs/tw2853e.pp svneol=native#text/plain
 tests/webtbs/tw2859.pp svneol=native#text/plain
 tests/webtbs/tw2859.pp svneol=native#text/plain
 tests/webtbs/tw28593.pp svneol=native#text/plain
 tests/webtbs/tw28593.pp svneol=native#text/plain
 tests/webtbs/tw28632.pp -text svneol=native#text/plain
 tests/webtbs/tw28632.pp -text svneol=native#text/plain
+tests/webtbs/tw28640.pp svneol=native#text/pascal
+tests/webtbs/tw28640a.pp svneol=native#text/pascal
 tests/webtbs/tw28641.pp svneol=native#text/plain
 tests/webtbs/tw28641.pp svneol=native#text/plain
 tests/webtbs/tw2865.pp svneol=native#text/plain
 tests/webtbs/tw2865.pp svneol=native#text/plain
 tests/webtbs/tw28650.pp svneol=native#text/pascal
 tests/webtbs/tw28650.pp svneol=native#text/pascal
@@ -18560,6 +18566,7 @@ tests/webtbs/tw3411.pp svneol=native#text/plain
 tests/webtbs/tw34124.pp svneol=native#text/pascal
 tests/webtbs/tw34124.pp svneol=native#text/pascal
 tests/webtbs/tw3418.pp svneol=native#text/plain
 tests/webtbs/tw3418.pp svneol=native#text/plain
 tests/webtbs/tw3423.pp svneol=native#text/plain
 tests/webtbs/tw3423.pp svneol=native#text/plain
+tests/webtbs/tw34232.pp svneol=native#text/pascal
 tests/webtbs/tw34239.pp svneol=native#text/pascal
 tests/webtbs/tw34239.pp svneol=native#text/pascal
 tests/webtbs/tw34287.pp svneol=native#text/pascal
 tests/webtbs/tw34287.pp svneol=native#text/pascal
 tests/webtbs/tw3429.pp svneol=native#text/plain
 tests/webtbs/tw3429.pp svneol=native#text/plain
@@ -18824,7 +18831,9 @@ tests/webtbs/tw38549b.pp svneol=native#text/plain
 tests/webtbs/tw38549c.pp svneol=native#text/plain
 tests/webtbs/tw38549c.pp svneol=native#text/plain
 tests/webtbs/tw38549d.pp svneol=native#text/plain
 tests/webtbs/tw38549d.pp svneol=native#text/plain
 tests/webtbs/tw3863.pp svneol=native#text/plain
 tests/webtbs/tw3863.pp svneol=native#text/plain
+tests/webtbs/tw38636.pp svneol=native#text/plain
 tests/webtbs/tw3864.pp svneol=native#text/plain
 tests/webtbs/tw3864.pp svneol=native#text/plain
+tests/webtbs/tw38642.pp svneol=native#text/pascal
 tests/webtbs/tw3865.pp svneol=native#text/plain
 tests/webtbs/tw3865.pp svneol=native#text/plain
 tests/webtbs/tw3870.pp svneol=native#text/plain
 tests/webtbs/tw3870.pp svneol=native#text/plain
 tests/webtbs/tw3893.pp svneol=native#text/plain
 tests/webtbs/tw3893.pp svneol=native#text/plain

+ 1 - 1
Makefile

@@ -350,7 +350,7 @@ endif
 override PACKAGE_NAME=fpc
 override PACKAGE_NAME=fpc
 override PACKAGE_VERSION=3.3.1
 override PACKAGE_VERSION=3.3.1
 REQUIREDVERSION=3.2.0
 REQUIREDVERSION=3.2.0
-REQUIREDVERSION2=3.0.4
+REQUIREDVERSION2=3.2.2
 ifndef inOS2
 ifndef inOS2
 override FPCDIR:=$(BASEDIR)
 override FPCDIR:=$(BASEDIR)
 export FPCDIR
 export FPCDIR

+ 1 - 1
Makefile.fpc

@@ -21,7 +21,7 @@ rule=help
 
 
 [prerules]
 [prerules]
 REQUIREDVERSION=3.2.0
 REQUIREDVERSION=3.2.0
-REQUIREDVERSION2=3.0.4
+REQUIREDVERSION2=3.2.2
 
 
 
 
 # make versions < 3.77 (OS2 version) are buggy
 # make versions < 3.77 (OS2 version) are buggy

+ 6 - 0
compiler/arm/cpuinfo.pas

@@ -496,8 +496,10 @@ Type
 
 
       { Atmel }
       { Atmel }
       ct_sam3x8e,
       ct_sam3x8e,
+      ct_samd51p19a,
       ct_arduino_due,
       ct_arduino_due,
       ct_flip_n_click,
       ct_flip_n_click,
+      ct_wio_terminal,
       
       
       { Nordic Semiconductor }
       { Nordic Semiconductor }
       ct_nrf51422_xxaa,
       ct_nrf51422_xxaa,
@@ -1019,8 +1021,12 @@ Const
 
 
       { Atmel }
       { Atmel }
       (controllertypestr:'ATSAM3X8E';     controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
       (controllertypestr:'ATSAM3X8E';     controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
+
+      (controllertypestr:'SAMD51P19A';    controllerunitstr:'SAMD51P19A'; cputype:cpu_armv7em; fputype:fpu_fpv4_sp_d16; flashbase:$00000000; flashsize:$00080000; srambase:$20000000; sramsize:$00030000),
+      
       (controllertypestr:'ARDUINO_DUE';   controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
       (controllertypestr:'ARDUINO_DUE';   controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
       (controllertypestr:'FLIP_N_CLICK';  controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
       (controllertypestr:'FLIP_N_CLICK';  controllerunitstr:'SAM3X8E'; cputype:cpu_armv7m; fputype:fpu_soft; flashbase:$00080000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
+      (controllertypestr:'WIO_TERMINAL'; controllerunitstr:'SAMD51P19A'   ; cputype:cpu_armv7em; fputype:fpu_fpv4_sp_d16; flashbase:$00004000; flashsize:$0007C000; srambase:$20000000; sramsize:$00030000),
       
       
       { Nordic Semiconductor }
       { Nordic Semiconductor }
       (controllertypestr:'NRF51422_XXAA'; controllerunitstr:'NRF51'; cputype:cpu_armv6m; fputype:fpu_soft; flashbase:$00000000; flashsize:$00040000;      srambase:$20000000; sramsize:$00004000),
       (controllertypestr:'NRF51422_XXAA'; controllerunitstr:'NRF51'; cputype:cpu_armv6m; fputype:fpu_soft; flashbase:$00000000; flashsize:$00040000;      srambase:$20000000; sramsize:$00004000),

+ 1 - 1
compiler/assemble.pas

@@ -750,7 +750,7 @@ Implementation
 {$ifdef hasunix}
 {$ifdef hasunix}
         DoPipe:=(cs_asm_pipe in current_settings.globalswitches) and
         DoPipe:=(cs_asm_pipe in current_settings.globalswitches) and
                 (([cs_asm_extern,cs_asm_leave,cs_assemble_on_target] * current_settings.globalswitches) = []) and
                 (([cs_asm_extern,cs_asm_leave,cs_assemble_on_target] * current_settings.globalswitches) = []) and
-                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_solaris_as]));
+                ((asminfo^.id in [as_gas,as_ggas,as_darwin,as_powerpc_xcoff,as_clang_gas,as_clang_llvm,as_solaris_as,as_clang_asdarwin]));
 {$else hasunix}
 {$else hasunix}
         DoPipe:=false;
         DoPipe:=false;
 {$endif}
 {$endif}

+ 4 - 4
compiler/cgutils.pas

@@ -192,8 +192,8 @@ unit cgutils;
     {# Clear to zero a treference, and set is base address
     {# Clear to zero a treference, and set is base address
        to base register.
        to base register.
     }
     }
-    procedure reference_reset_base(var ref : treference;base : tregister;offset : longint; temppos : treftemppos; alignment : longint; volatility: tvolatilityset);
-    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref: treference; base: tregister; offset: asizeint; temppos: treftemppos; alignment: longint; volatility: tvolatilityset);
+    procedure reference_reset_symbol(var ref: treference;sym: tasmsymbol; offset: asizeint; alignment : longint; volatility: tvolatilityset);
     { This routine verifies if two references are the same, and
     { This routine verifies if two references are the same, and
        if so, returns TRUE, otherwise returns false.
        if so, returns TRUE, otherwise returns false.
     }
     }
@@ -244,7 +244,7 @@ uses
       end;
       end;
 
 
 
 
-    procedure reference_reset_base(var ref: treference; base: tregister; offset : longint; temppos : treftemppos ; alignment : longint; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref: treference; base: tregister; offset: asizeint; temppos: treftemppos ; alignment: longint; volatility: tvolatilityset);
       begin
       begin
         reference_reset(ref,alignment,volatility);
         reference_reset(ref,alignment,volatility);
         ref.base:=base;
         ref.base:=base;
@@ -253,7 +253,7 @@ uses
       end;
       end;
 
 
 
 
-    procedure reference_reset_symbol(var ref: treference; sym: tasmsymbol; offset, alignment: longint; volatility: tvolatilityset);
+    procedure reference_reset_symbol(var ref: treference; sym: tasmsymbol; offset: asizeint; alignment: longint; volatility: tvolatilityset);
       begin
       begin
         reference_reset(ref,alignment,volatility);
         reference_reset(ref,alignment,volatility);
         ref.symbol:=sym;
         ref.symbol:=sym;

+ 48 - 40
compiler/dbgdwarf.pas

@@ -4609,34 +4609,39 @@ implementation
 
 
     procedure TDebugInfoDwarf3.appenddef_variant(list:TAsmList;def: tvariantdef);
     procedure TDebugInfoDwarf3.appenddef_variant(list:TAsmList;def: tvariantdef);
       const
       const
-        VARIANTS: array[1..27] of record Value: Word; Name: String end = (
-          (value:0;     name:''),
-          (value:1;     name:''),
-          (value:2;     name:'VSMALLINT'),
-          (value:3;     name:'VINTEGER'),
-          (value:4;     name:'VSINGLE'),
-          (value:5;     name:'VDOUBLE'),
-          (value:6;     name:'VCURRENCY'),
-          (value:7;     name:'VDATE'),
-          (value:8;     name:'VOLESTR'),
-          (value:9;     name:'VDISPATCH'),
-          (value:10;    name:'VERROR'),
-          (value:11;    name:'VBOOLEAN'),
-          (value:12;    name:''),
-          (value:13;    name:'VUNKNOWN'),
-          (value:14;    name:''),
-          (value:16;    name:'VSHORTINT'),
-          (value:17;    name:'VBYTE'),
-          (value:18;    name:'VWORD'),
-          (value:19;    name:'VLONGWORD'),
-          (value:20;    name:'VINT64'),
-          (value:21;    name:'VQWORD'),
-          (value:36;    name:'VRECORD'),
-          (value:$48;   name:''),
-          (value:$100;  name:'VSTRING'),
-          (value:$101;  name:'VANY'),
-          (value:$2000; name:'VARRAY'),
-          (value:$4000; name:'VPOINTER')
+        VARIANTS: array[1..27] of record
+          Value: Word;
+          Name: String;
+          { some fields are only supported by some features }
+          features : tfeatures
+        end = (
+          (value:0;     name:'';features: []),
+          (value:1;     name:'';features: []),
+          (value:2;     name:'VSMALLINT';features: []),
+          (value:3;     name:'VINTEGER';features: []),
+          (value:4;     name:'VSINGLE';features: [f_softfpu]),
+          (value:5;     name:'VDOUBLE';features: [f_softfpu]),
+          (value:6;     name:'VCURRENCY';features: [f_softfpu]),
+          (value:7;     name:'VDATE';features: [f_softfpu]),
+          (value:8;     name:'VOLESTR';features: []),
+          (value:9;     name:'VDISPATCH';features: []),
+          (value:10;    name:'VERROR';features: []),
+          (value:11;    name:'VBOOLEAN';features: []),
+          (value:12;    name:'';features: []),
+          (value:13;    name:'VUNKNOWN';features: []),
+          (value:14;    name:'';features: []),
+          (value:16;    name:'VSHORTINT';features: []),
+          (value:17;    name:'VBYTE';features: []),
+          (value:18;    name:'VWORD';features: []),
+          (value:19;    name:'VLONGWORD';features: []),
+          (value:20;    name:'VINT64';features: []),
+          (value:21;    name:'VQWORD';features: []),
+          (value:36;    name:'VRECORD';features: []),
+          (value:$48;   name:'';features: []),
+          (value:$100;  name:'VSTRING';features: []),
+          (value:$101;  name:'VANY';features: []),
+          (value:$2000; name:'VARRAY';features: []),
+          (value:$4000; name:'VPOINTER';features: [])
         );
         );
       var
       var
         fs: tfieldvarsym;
         fs: tfieldvarsym;
@@ -4669,20 +4674,23 @@ implementation
         { variants }
         { variants }
         for idx := Low(VARIANTS) to High(VARIANTS) do
         for idx := Low(VARIANTS) to High(VARIANTS) do
           begin
           begin
-            append_entry(DW_TAG_variant,true,[
-              DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value
-              ]);
-            finish_entry;
-
-            if VARIANTS[idx].name <> '' then
+            if (features*VARIANTS[idx].features)=VARIANTS[idx].features then
               begin
               begin
-                fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name));
-                if (fs = nil) or (fs.typ <> fieldvarsym) then
-                  internalerror(20060927200+idx);
-                appendsym_fieldvar(list,fs);
-              end;
+                append_entry(DW_TAG_variant,true,[
+                  DW_AT_discr_value,DW_FORM_udata,VARIANTS[idx].value
+                  ]);
+                finish_entry;
 
 
-            finish_children; { variant }
+                if VARIANTS[idx].name <> '' then
+                  begin
+                    fs := tfieldvarsym(vardatadef.symtable.Find(VARIANTS[idx].name));
+                    if (fs = nil) or (fs.typ <> fieldvarsym) then
+                      internalerror(2006092702+idx);
+                    appendsym_fieldvar(list,fs);
+                  end;
+
+                finish_children; { variant }
+              end;
           end;
           end;
 
 
 
 

+ 28 - 2
compiler/i386/n386flw.pas

@@ -46,6 +46,7 @@ interface
       constructor create(l,r:TNode);override;
       constructor create(l,r:TNode);override;
       constructor create_implicit(l,r:TNode);override;
       constructor create_implicit(l,r:TNode);override;
       function pass_1: tnode;override;
       function pass_1: tnode;override;
+	  function dogetcopy : tnode;override;
       function simplify(forinline: boolean): tnode;override;
       function simplify(forinline: boolean): tnode;override;
       procedure pass_generate_code;override;
       procedure pass_generate_code;override;
     end;
     end;
@@ -59,7 +60,7 @@ implementation
     cgbase,cgobj,cgcpu,cgutils,tgobj,
     cgbase,cgobj,cgcpu,cgutils,tgobj,
     cpubase,htypechk,
     cpubase,htypechk,
     parabase,paramgr,pass_1,pass_2,ncgutil,cga,
     parabase,paramgr,pass_1,pass_2,ncgutil,cga,
-    aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi;
+    aasmbase,aasmtai,aasmdata,aasmcpu,procinfo,cpupi,procdefutil;
 
 
   var
   var
     endexceptlabel: tasmlabel;
     endexceptlabel: tasmlabel;
@@ -215,6 +216,30 @@ function ti386tryfinallynode.pass_1: tnode;
       end;
       end;
   end;
   end;
 
 
+function ti386tryfinallynode.dogetcopy: tnode;
+  var
+    n: ti386tryfinallynode;
+  begin
+	n:=ti386tryfinallynode(inherited dogetcopy);
+	if target_info.system=system_i386_win32 then
+	  begin
+	    n.finalizepi:=tcgprocinfo(cprocinfo.create(finalizepi.parent));
+		n.finalizepi.force_nested;
+		n.finalizepi.procdef:=create_outline_procdef('$fin$',current_procinfo.procdef.struct,potype_exceptfilter,voidtype);
+		n.finalizepi.entrypos:=finalizepi.entrypos;
+		n.finalizepi.entryswitches:=finalizepi.entryswitches;
+		n.finalizepi.exitpos:=finalizepi.exitpos;
+		n.finalizepi.exitswitches:=finalizepi.exitswitches;
+		n.finalizepi.flags:=finalizepi.flags;
+		{ node already transformed? }
+		if assigned(finalizepi.code) then
+		  begin
+			n.finalizepi.code:=finalizepi.code.getcopy;
+			n.right:=ccallnode.create(nil,tprocsym(n.finalizepi.procdef.procsym),nil,nil,[],nil);
+		  end;
+	  end;
+	result:=n;
+  end;
 
 
 function ti386tryfinallynode.simplify(forinline: boolean): tnode;
 function ti386tryfinallynode.simplify(forinline: boolean): tnode;
   begin
   begin
@@ -222,7 +247,8 @@ function ti386tryfinallynode.simplify(forinline: boolean): tnode;
     if (target_info.system<>system_i386_win32) then
     if (target_info.system<>system_i386_win32) then
       exit;
       exit;
 
 
-    if (result=nil) and assigned(finalizepi) then
+    { actually, this is not really the right place to do a node transformation like this }
+    if (result=nil) and assigned(finalizepi) and (not(assigned(finalizepi.code))) then
       begin
       begin
         finalizepi.code:=right;
         finalizepi.code:=right;
         foreachnodestatic(right,@copy_parasize,finalizepi);
         foreachnodestatic(right,@copy_parasize,finalizepi);

+ 1 - 1
compiler/link.pas

@@ -662,7 +662,7 @@ Implementation
         if (OrderedSymbols.Empty) or
         if (OrderedSymbols.Empty) or
            not(tf_supports_symbolorderfile in target_info.flags) then
            not(tf_supports_symbolorderfile in target_info.flags) then
           exit;
           exit;
-        symfile:=TScript.Create(outputexedir+'symbol_order.fpc');
+        symfile:=TScript.Create(outputexedir+UniqueName('symbol_order')+'.fpc');
         item:=TCmdStrListItem(OrderedSymbols.First);
         item:=TCmdStrListItem(OrderedSymbols.First);
         while assigned(item) do
         while assigned(item) do
           begin
           begin

+ 105 - 24
compiler/nbas.pas

@@ -706,10 +706,31 @@ implementation
 
 
 
 
     function tblocknode.simplify(forinline : boolean): tnode;
     function tblocknode.simplify(forinline : boolean): tnode;
-{$ifdef break_inlining}
       var
       var
+        hp, nextp: TStatementNode;
+        lastp: TNode;
+{$ifdef break_inlining}
         a : array[0..3] of tstatementnode;
         a : array[0..3] of tstatementnode;
 {$endif break_inlining}
 {$endif break_inlining}
+
+        procedure EraseCurrentStatement;
+          begin
+            { make sure the nf_block_with_exit and nf_usercode_entry flags are safeguarded }
+            if Assigned(nextp) then
+              nextp.flags := nextp.flags + (hp.left.flags * [nf_block_with_exit, nf_usercode_entry]);
+
+            hp.right := nil;
+            hp.Free;
+            hp := nextp;
+            if not Assigned(lastp) then
+              Exit;
+
+            if lastp = Self then
+              TBlockNode(lastp).left := nextp
+            else
+              TStatementNode(lastp).right := nextp;
+          end;
+
       begin
       begin
         result := nil;
         result := nil;
         { Warning: never replace a blocknode with another node type,
         { Warning: never replace a blocknode with another node type,
@@ -717,33 +738,93 @@ implementation
           main program body, and those nodes should always be blocknodes
           main program body, and those nodes should always be blocknodes
           since that's what the compiler expects elsewhere. }
           since that's what the compiler expects elsewhere. }
 
 
-        if assigned(left) and
-           not assigned(tstatementnode(left).right) then
+        lastp := Self;
+        hp := TStatementNode(left);
+
+        if Assigned(hp) then
           begin
           begin
-            case tstatementnode(left).left.nodetype of
-              blockn:
-                begin
-                  { if the current block contains only one statement, and
-                    this one statement only contains another block, replace
-                    this block with that other block.                       }
-                  result:=tstatementnode(left).left;
-                  tstatementnode(left).left:=nil;
-                  { make sure the nf_block_with_exit flag is safeguarded }
-                  result.flags:=result.flags+(flags*[nf_block_with_exit,nf_usercode_entry]);
-                  exit;
+            if not assigned(tstatementnode(left).right) then
+              begin
+                { Simplify single-statement blocks }
+                case tstatementnode(left).left.nodetype of
+                  blockn:
+                    begin
+                      { if the current block contains only one statement, and
+                        this one statement only contains another block, replace
+                        this block with that other block.                       }
+                      result:=tstatementnode(left).left;
+                      tstatementnode(left).left:=nil;
+                      { make sure the nf_block_with_exit and nf_usercode_entry flags are safeguarded }
+                      result.flags:=result.flags+(flags*[nf_block_with_exit,nf_usercode_entry]);
+                      exit;
+                    end;
+                  nothingn:
+                    begin
+                      { if the block contains only a statement with a nothing node,
+                        get rid of the statement }
+                      left.Free;
+                      left:=nil;
+                      exit;
+                    end;
+                  else
+                    ;
                 end;
                 end;
-              nothingn:
-                begin
-                  { if the block contains only a statement with a nothing node,
-                    get rid of the statement }
-                  left.Free;
-                  left:=nil;
-                  exit;
+              end
+            else
+              repeat
+                nextp := TStatementNode(hp.Right);
+                case hp.left.nodetype of
+                  blockn:
+                    if not Assigned(TBlockNode(hp.left).left) then
+                      begin
+                        { Empty block - delete statement (and block within),
+                          but only if the nf_usercode_entry flag is not set}
+                        if hp.left.flags * [nf_usercode_entry] = [] then
+                          begin
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+                      end
+                    else
+                      begin
+                        if (TStatementNode(TBlockNode(hp.left).left).left.nodetype = nothingn) and
+                          not Assigned(TStatementNode(TBlockNode(hp.left).left).right) then
+                          begin
+                            { Block contains only a statement->nothingn branch }
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+
+                        if not Assigned(nextp) then
+                          begin
+                            { If the last statement contains a block, Merge them
+                              (statements within will already be simplified) }
+
+                            { Internal error is triggered if the calling block only
+                              had one statement - code flow should have exited
+                              earlier. }
+                            nextp := TStatementNode(TBlockNode(hp.left).left);
+                            TBlockNode(hp.left).left := nil;
+                            EraseCurrentStatement;
+                            Continue;
+                          end;
+                      end;
+                  nothingn:
+                    { Make sure it's not the only node left }
+                      begin
+                        { Delete statement (and nothing node within) }
+                        EraseCurrentStatement;
+                        Continue;
+                      end;
+                  else
+                    ;
                 end;
                 end;
-              else
-                ;
-            end;
+
+                lastp := hp;
+                hp := nextp;
+              until not Assigned(hp);
           end;
           end;
+
 {$ifdef break_inlining}
 {$ifdef break_inlining}
         { simple sequence of tempcreate, assign and return temp.? }
         { simple sequence of tempcreate, assign and return temp.? }
         if GetStatements(left,a) and
         if GetStatements(left,a) and

+ 16 - 6
compiler/nflw.pas

@@ -1896,7 +1896,7 @@ implementation
         needsifblock : Boolean;
         needsifblock : Boolean;
         cond : tnodetype;
         cond : tnodetype;
         fromexpr : tnode;
         fromexpr : tnode;
-        toexpr : tnode;
+        toexpr, leftcopy: tnode;
         { if the upper bound is not constant, it must be store in a temp initially }
         { if the upper bound is not constant, it must be store in a temp initially }
         usetotemp : boolean;
         usetotemp : boolean;
         { if the lower bound is not constant, it must be store in a temp before calculating the upper bound }
         { if the lower bound is not constant, it must be store in a temp before calculating the upper bound }
@@ -1905,13 +1905,19 @@ implementation
         countermin, countermax: Tconstexprint;
         countermin, countermax: Tconstexprint;
 
 
       procedure iterate_counter(var s : tstatementnode;fw : boolean);
       procedure iterate_counter(var s : tstatementnode;fw : boolean);
+        var
+          leftcopy: tnode;
         begin
         begin
+          { get rid of nf_write etc. as the left node is now only read }
+          leftcopy:=left.getcopy;
+          node_reset_flags(leftcopy,[nf_pass1_done,nf_modify,nf_write]);
+
           if fw then
           if fw then
             addstatement(s,
             addstatement(s,
-              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_succ_x,false,left.getcopy)))
+              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_succ_x,false,leftcopy)))
           else
           else
             addstatement(s,
             addstatement(s,
-              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_pred_x,false,left.getcopy)));
+              cassignmentnode.create_internal(left.getcopy,cinlinenode.createintern(in_pred_x,false,leftcopy)));
         end;
         end;
 
 
       function iterate_counter_func(arg : tnode;fw : boolean) : tnode;
       function iterate_counter_func(arg : tnode;fw : boolean) : tnode;
@@ -2056,6 +2062,10 @@ implementation
               cond:=gten;
               cond:=gten;
           end;
           end;
 
 
+        { get rid of nf_write etc. as the left node is now only read }
+        leftcopy:=left.getcopy;
+        node_reset_flags(leftcopy,[nf_pass1_done,nf_modify,nf_write]);
+
         if needsifblock then
         if needsifblock then
           begin
           begin
             if usetotemp then
             if usetotemp then
@@ -2063,7 +2073,7 @@ implementation
             else
             else
               toexpr:=t1.getcopy;
               toexpr:=t1.getcopy;
 
 
-            addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,left.getcopy,toexpr),loopblock,false,true));
+            addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,leftcopy,toexpr),loopblock,false,true));
 
 
             if usefromtemp then
             if usefromtemp then
               fromexpr:=ctemprefnode.create(fromtemp)
               fromexpr:=ctemprefnode.create(fromtemp)
@@ -2091,10 +2101,10 @@ implementation
           begin
           begin
             { is a simple comparision for equality sufficient? }
             { is a simple comparision for equality sufficient? }
             if do_loopvar_at_end and (lnf_backward in loopflags) and (lnf_counter_not_used in loopflags) then
             if do_loopvar_at_end and (lnf_backward in loopflags) and (lnf_counter_not_used in loopflags) then
-              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(equaln,left.getcopy,
+              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(equaln,leftcopy,
                 caddnode.create_internal(subn,t1.getcopy,cordconstnode.create(1,t1.resultdef,false))),loopblock,false,true))
                 caddnode.create_internal(subn,t1.getcopy,cordconstnode.create(1,t1.resultdef,false))),loopblock,false,true))
             else
             else
-              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,left.getcopy,t1.getcopy),loopblock,false,true));
+              addstatement(ifstatements,cwhilerepeatnode.create(caddnode.create_internal(cond,leftcopy,t1.getcopy),loopblock,false,true));
             addstatement(statements,ifblock);
             addstatement(statements,ifblock);
           end;
           end;
         current_filepos:=storefilepos;
         current_filepos:=storefilepos;

+ 17 - 7
compiler/ninl.pas

@@ -3209,7 +3209,11 @@ implementation
                   if target_info.system in systems_managed_vm then
                   if target_info.system in systems_managed_vm then
                     message(parser_e_feature_unsupported_for_vm);
                     message(parser_e_feature_unsupported_for_vm);
                    if (left.resultdef.typ=enumdef) and
                    if (left.resultdef.typ=enumdef) and
-                      (tenumdef(left.resultdef).has_jumps) then
+                      (tenumdef(left.resultdef).has_jumps) and
+                      (
+                        (left.nodetype<>typen) or
+                        not (sp_generic_para in ttypenode(left).typesym.symoptions)
+                      ) then
                      CGMessage(type_e_no_type_info);
                      CGMessage(type_e_no_type_info);
                    set_varstate(left,vs_read,[vsf_must_be_valid]);
                    set_varstate(left,vs_read,[vsf_must_be_valid]);
                    resultdef:=voidpointertype;
                    resultdef:=voidpointertype;
@@ -3219,9 +3223,6 @@ implementation
                 begin
                 begin
                   if target_info.system in systems_managed_vm then
                   if target_info.system in systems_managed_vm then
                     message(parser_e_feature_unsupported_for_vm);
                     message(parser_e_feature_unsupported_for_vm);
-                  if (left.resultdef.typ=enumdef) and
-                     (tenumdef(left.resultdef).has_jumps) then
-                    CGMessage(type_e_no_type_info);
                   set_varstate(left,vs_read,[vsf_must_be_valid]);
                   set_varstate(left,vs_read,[vsf_must_be_valid]);
                   resultdef:=typekindtype;
                   resultdef:=typekindtype;
                 end;
                 end;
@@ -3935,9 +3936,18 @@ implementation
 
 
           in_typeinfo_x:
           in_typeinfo_x:
             begin
             begin
-              result:=caddrnode.create_internal(
-                crttinode.create(tstoreddef(left.resultdef),fullrtti,rdt_normal)
-              );
+              if (left.resultdef.typ=enumdef) and
+                 (tenumdef(left.resultdef).has_jumps) then
+                begin
+                  if (left.nodetype=typen) and (sp_generic_para in ttypenode(left).typesym.symoptions) then
+                    result:=cnilnode.create
+                  else
+                    internalerror(2021032601);
+                end
+              else
+                result:=caddrnode.create_internal(
+                  crttinode.create(tstoreddef(left.resultdef),fullrtti,rdt_normal)
+                );
             end;
             end;
 
 
           in_gettypekind_x:
           in_gettypekind_x:

+ 2 - 0
compiler/nld.pas

@@ -1372,6 +1372,7 @@ implementation
          n:=ttypenode(inherited dogetcopy);
          n:=ttypenode(inherited dogetcopy);
          n.allowed:=allowed;
          n.allowed:=allowed;
          n.typedef:=typedef;
          n.typedef:=typedef;
+         n.typesym:=typesym;
          n.helperallowed:=helperallowed;
          n.helperallowed:=helperallowed;
          result:=n;
          result:=n;
       end;
       end;
@@ -1382,6 +1383,7 @@ implementation
         docompare :=
         docompare :=
           inherited docompare(p) and
           inherited docompare(p) and
           (typedef=ttypenode(p).typedef) and
           (typedef=ttypenode(p).typedef) and
+          (typesym=ttypenode(p).typesym) and
           (allowed=ttypenode(p).allowed) and
           (allowed=ttypenode(p).allowed) and
           (helperallowed=ttypenode(p).helperallowed);
           (helperallowed=ttypenode(p).helperallowed);
       end;
       end;

+ 5 - 0
compiler/raatt.pas

@@ -1594,6 +1594,11 @@ unit raatt;
                  4 :
                  4 :
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
+                 8 :
+                  begin
+                    move(actasmpattern[1],l,8);
+                    l:=SwapEndian(l);
+                  end;
                 else
                 else
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                 end;
                 end;

+ 185 - 214
compiler/systems/t_darwin.pas

@@ -51,11 +51,15 @@ implementation
 
 
     tlinkerdarwin=class(texternallinker)
     tlinkerdarwin=class(texternallinker)
     private
     private
-      LinkFilesFileName,
       LinkSymsFileName   : TCmdStr;
       LinkSymsFileName   : TCmdStr;
-      Function  WriteResponseFile(isdll:boolean) : Boolean;
+      function WriteFileList: TCmdStr;
       function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
       function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
       Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
       Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      function GetLinkArch: TCmdStr;
+      function GetLinkVersion: TCmdStr;
+      function GetSysroot: TCmdStr;
+      function GetLibSearchPath: TCmdStr;
+      function GetLibraries: TCmdStr;
     public
     public
       constructor Create;override;
       constructor Create;override;
       procedure SetDefaultInfo;override;
       procedure SetDefaultInfo;override;
@@ -123,16 +127,16 @@ implementation
              programs with problems that require Valgrind will have more
              programs with problems that require Valgrind will have more
              than 60KB of data (first 4KB of address space is always invalid)
              than 60KB of data (first 4KB of address space is always invalid)
            }
            }
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            if not(cs_gdb_valgrind in current_settings.globalswitches) then
            if not(cs_gdb_valgrind in current_settings.globalswitches) then
              ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
              ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
   {$else ndef cpu64bitaddr}
   {$else ndef cpu64bitaddr}
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
   {$endif ndef cpu64bitaddr}
   {$endif ndef cpu64bitaddr}
            if (apptype<>app_bundle) then
            if (apptype<>app_bundle) then
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES'
            else
            else
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -L. -o $EXE $ARCH $VERSION $SYRSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            DllCmd[2]:='strip -x $EXE';
            DllCmd[2]:='strip -x $EXE';
            DynamicLinker:='';
            DynamicLinker:='';
          end;
          end;
@@ -298,106 +302,152 @@ implementation
       end;
       end;
 
 
 
 
-    Function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
-    var
-      startupfile: TCmdStr;
-    begin
-      result:='';
+    function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      var
+        startupfile: TCmdStr;
+      begin
+        result:='';
 
 
-      startupfile:=GetDarwinCrt1ObjName(isdll);
-      if startupfile<>'' then
-        begin
-         if not librarysearchpath.FindFile(startupfile,false,result) then
-           result:='/usr/lib/'+startupfile;
-        end;
-      result:=maybequoted(result);
-    end;
+        startupfile:=GetDarwinCrt1ObjName(isdll);
+        if startupfile<>'' then
+          begin
+           if not librarysearchpath.FindFile(startupfile,false,result) then
+             result:='/usr/lib/'+startupfile;
+          end;
+        result:=maybequoted(result);
+      end;
 
 
 
 
-    Function tlinkerdarwin.WriteResponseFile(isdll:boolean) : Boolean;
-    Var
-      linkres      : TLinkRes;
-      FilesList    : TLinkRes;
-      i            : longint;
-      HPath        : TCmdStrListItem;
-      s            : TCmdStr;
-    begin
-      WriteResponseFile:=False;
-      if ReOrderEntries Then
-         ExpandAndApplyOrder(SharedLibFiles);
+    function tlinkerdarwin.GetLinkArch: TCmdStr;
+      begin
+        case target_info.system of
+          system_powerpc_darwin:
+            result:='-arch ppc';
+          system_i386_darwin,
+          system_i386_iphonesim:
+            result:='-arch i386';
+          system_powerpc64_darwin:
+            result:='-arch ppc64';
+          system_x86_64_darwin,
+          system_x86_64_iphonesim:
+            result:='-arch x86_64';
+          system_arm_ios:
+            { current versions of the linker require the sub-architecture type
+              to be specified }
+            result:='-arch '+lower(cputypestr[current_settings.cputype]);
+          system_aarch64_ios,
+          system_aarch64_darwin:
+            result:='-arch arm64';
+          else
+            internalerror(2014121801);
+        end;
+      end;
 
 
-      { Open link.res file }
-      LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,false);
 
 
-      if sysrootpath<>'' then
-        begin
-          LinkRes.Add('-syslibroot');
-          LinkRes.Add(sysrootpath);
-        end;
+    function tlinkerdarwin.GetLinkVersion: TCmdStr;
+      begin
+        if MacOSXVersionMin<>'' then
+          begin
+            result:='-macosx_version_min '+MacOSXVersionMin;
+          end
+        else if iPhoneOSVersionMin<>'' then
+          begin
+            result:='-iphoneos_version_min '+iPhoneOSVersionMin;
+          end
+        else
+          begin
+            result:='';
+          end;
+      end;
+
 
 
-      LinkRes.Add('-arch');
-      case target_info.system of
-        system_powerpc_darwin:
-          LinkRes.Add('ppc');
-        system_i386_darwin,
-        system_i386_iphonesim:
-          LinkRes.Add('i386');
-        system_powerpc64_darwin:
-          LinkRes.Add('ppc64');
-        system_x86_64_darwin,
-        system_x86_64_iphonesim:
-          LinkRes.Add('x86_64');
-        system_arm_ios:
-          { current versions of the linker require the sub-architecture type
-            to be specified }
-          LinkRes.Add(lower(cputypestr[current_settings.cputype]));
-        system_aarch64_ios,
-        system_aarch64_darwin:
-          LinkRes.Add('arm64');
+    function tlinkerdarwin.GetSysroot: TCmdStr;
+      begin
+        if sysrootpath<>'' then
+          begin
+            result:='-syslibroot '+maybequoted(sysrootpath);
+          end
         else
         else
-          internalerror(2014121801);
+          begin
+            result:='';
+          end;
       end;
       end;
-      if MacOSXVersionMin<>'' then
-        begin
-          LinkRes.Add('-macosx_version_min');
-          LinkRes.Add(MacOSXVersionMin);
-        end
-      else if iPhoneOSVersionMin<>'' then
-        begin
-          LinkRes.Add('-iphoneos_version_min');
-          LinkRes.Add(iPhoneOSVersionMin);
-        end;
 
 
-      { Write path to search libraries }
-      HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(LibrarySearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
 
 
-      HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(FrameworkSearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
+    function tlinkerdarwin.GetLibSearchPath: TCmdStr;
+      var
+        HPath: TCmdStrListItem;
+      begin
+        result:='';
+        HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(LibrarySearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+
+        HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(FrameworkSearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+      end;
+
+
+    function tlinkerdarwin.GetLibraries: TCmdStr;
+      var
+        s: TCmdStr;
+        i: longint;
+      begin
+        result:='';
+        while not SharedLibFiles.Empty do
+          begin
+            s:=SharedLibFiles.GetFirst;
+            if (s<>'c') or ReOrderEntries then
+              begin
+                i:=Pos(target_info.sharedlibext,s);
+                if i>0 then
+                  Delete(s,i,length(s));
+                result:=result+' '+maybequoted('-l'+s);
+              end;
+           { be sure that libc is the last lib }
+           if not ReOrderEntries then
+             begin
+               result:=result+' -lc'
+             end;
+         end;
+
+        while not FrameworkFiles.empty do
+          begin
+            result:=result+' -framework '+maybequoted(FrameworkFiles.GetFirst);
+          end;
+      end;
 
 
-      { main objectfiles }
-      LinkFilesFileName:=UniqueName('linkfiles')+'.res';
-      FilesList:=TLinkRes.Create(outputexedir+LinkFilesFileName,false);
+
+    Function tlinkerdarwin.WriteFileList: TCmdStr;
+    Var
+      FilesList    : TScript;
+      s            : TCmdStr;
+    begin
+      if ReOrderEntries Then
+         ExpandAndApplyOrder(SharedLibFiles);
+
+      { main objectfiles and static libraries: in filelist file to avoid overflowing command line limit }
+      result:=UniqueName(outputexedir+'linkfiles')+'.res';
+      FilesList:=TScript.Create(result);
       while not ObjectFiles.Empty do
       while not ObjectFiles.Empty do
         begin
         begin
           s:=ObjectFiles.GetFirst;
           s:=ObjectFiles.GetFirst;
@@ -406,46 +456,15 @@ implementation
               s:=TargetFixFileName(s);
               s:=TargetFixFileName(s);
               FilesList.Add(s);
               FilesList.Add(s);
             end;
             end;
-        end;
-      FilesList.writetodisk;
-      FilesList.Free;
-
-      { Write staticlibraries }
-      while not StaticLibFiles.Empty do
-        begin
-          S:=StaticLibFiles.GetFirst;
-          LinkRes.AddFileName(s)
-        end;
-
-      { Write sharedlibraries like -l<lib> }
-      while not SharedLibFiles.Empty do
-        begin
-          S:=SharedLibFiles.GetFirst;
-          if (s<>'c') or ReOrderEntries then
+          { Write staticlibraries }
+          while not StaticLibFiles.Empty do
             begin
             begin
-              i:=Pos(target_info.sharedlibext,S);
-              if i>0 then
-                Delete(S,i,255);
-              LinkRes.Add('-l'+s);
+              s:=StaticLibFiles.GetFirst;
+              FilesList.Add(s)
             end;
             end;
-         { be sure that libc is the last lib }
-         if not ReOrderEntries then
-           begin
-             LinkRes.Add('-lc')
-           end;
-       end;
-
-      while not FrameworkFiles.empty do
-        begin
-          LinkRes.Add('-framework');
-          LinkRes.Add(FrameworkFiles.GetFirst);
         end;
         end;
-
-    { Write and Close response }
-      linkres.writetodisk;
-      linkres.Free;
-
-      WriteResponseFile:=True;
+      FilesList.writetodisk;
+      FilesList.Free;
     end;
     end;
 
 
 
 
@@ -455,16 +474,14 @@ implementation
       cmdstr,
       cmdstr,
       mapstr,
       mapstr,
       targetstr,
       targetstr,
-      emulstr,
       extdbgbinstr,
       extdbgbinstr,
       extdbgcmdstr,
       extdbgcmdstr,
       ltostr,
       ltostr,
-      ordersymfile: TCmdStr;
-      linkscript: TAsmScript;
-      DynLinkStr : string[60];
+      ordersymfile,
+      linkfiles: TCmdStr;
       GCSectionsStr,
       GCSectionsStr,
       StaticStr,
       StaticStr,
-      StripStr   : string[63];
+      StripStr   : TCmdStr;
       success : boolean;
       success : boolean;
     begin
     begin
       if not(cs_link_nolink in current_settings.globalswitches) then
       if not(cs_link_nolink in current_settings.globalswitches) then
@@ -473,13 +490,11 @@ implementation
     { Create some replacements }
     { Create some replacements }
       StaticStr:='';
       StaticStr:='';
       StripStr:='';
       StripStr:='';
-      DynLinkStr:='';
       GCSectionsStr:='';
       GCSectionsStr:='';
-      linkscript:=nil;
       mapstr:='';
       mapstr:='';
       targetstr:='';
       targetstr:='';
-      emulstr:='';
       ltostr:='';
       ltostr:='';
+
       if (cs_link_map in current_settings.globalswitches) then
       if (cs_link_map in current_settings.globalswitches) then
         mapstr:='-map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
         mapstr:='-map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
 
 
@@ -491,11 +506,6 @@ implementation
       if (cs_link_smart in current_settings.globalswitches) then
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
 
-      if CShared Then
-       begin
-         DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
-       end;
-
       { add custom LTO library if using custom clang }
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
       if (cs_lto in current_settings.moduleswitches) and
          not(cs_link_on_target in current_settings.globalswitches) and
          not(cs_link_on_target in current_settings.globalswitches) and
@@ -505,10 +515,10 @@ implementation
           ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
           ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
         end;
         end;
 
 
-    { Write used files and libraries }
-      WriteResponseFile(false);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
       ordersymfile:=WriteSymbolOrderFile;
 
 
     { Call linker }
     { Call linker }
@@ -516,9 +526,7 @@ implementation
       Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
       Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$MAP',mapstr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$LTO',ltostr);
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
       if ordersymfile<>'' then
@@ -526,12 +534,16 @@ implementation
       else
       else
         Replace(cmdstr,'$ORDERSYMS','');
         Replace(cmdstr,'$ORDERSYMS','');
 
 
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$STATIC',StaticStr);
       Replace(cmdstr,'$STATIC',StaticStr);
       Replace(cmdstr,'$STRIP',StripStr);
       Replace(cmdstr,'$STRIP',StripStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$DYNLINK',DynLinkStr);
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
 
       { create dsym file? }
       { create dsym file? }
@@ -544,28 +556,11 @@ implementation
           extdbgcmdstr:=maybequoted(current_module.exefilename);
           extdbgcmdstr:=maybequoted(current_module.exefilename);
         end;
         end;
 
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgcmdstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,CmdStr,true,true);
+      success:=DoExec(BinStr,CmdStr,true,false);
       if (success and
       if (success and
           (extdbgbinstr<>'') and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
 
     { Remove ReponseFile }
     { Remove ReponseFile }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
@@ -573,9 +568,7 @@ implementation
          DeleteFile(outputexedir+Info.ResName);
          DeleteFile(outputexedir+Info.ResName);
          if ordersymfile<>'' then
          if ordersymfile<>'' then
            DeleteFile(ordersymfile);
            DeleteFile(ordersymfile);
-         DeleteFile(linkscript.fn);
-         linkscript.free;
-         DeleteFile(outputexedir+LinkFilesFileName);
+         DeleteFile(linkfiles);
        end;
        end;
 
 
       MakeExecutable:=success;   { otherwise a recursive call to link method }
       MakeExecutable:=success;   { otherwise a recursive call to link method }
@@ -586,18 +579,16 @@ implementation
     var
     var
       InitStr,
       InitStr,
       FiniStr,
       FiniStr,
-      SoNameStr : string[80];
-      linkscript: TAsmScript;
       binstr,
       binstr,
       cmdstr,
       cmdstr,
       mapstr,
       mapstr,
       ltostr,
       ltostr,
       ordersymfile,
       ordersymfile,
       targetstr,
       targetstr,
-      emulstr,
       extdbgbinstr,
       extdbgbinstr,
-      extdbgcmdstr  : TCmdStr;
-      GCSectionsStr : string[63];
+      extdbgcmdstr,
+      linkfiles,
+      GCSectionsStr : TCmdStr;
       exportedsyms: text;
       exportedsyms: text;
       success : boolean;
       success : boolean;
     begin
     begin
@@ -605,21 +596,20 @@ implementation
       GCSectionsStr:='';
       GCSectionsStr:='';
       mapstr:='';
       mapstr:='';
       ltostr:='';
       ltostr:='';
-      linkscript:=nil;
       if not(cs_link_nolink in current_settings.globalswitches) then
       if not(cs_link_nolink in current_settings.globalswitches) then
        Message1(exec_i_linking,current_module.sharedlibfilename);
        Message1(exec_i_linking,current_module.sharedlibfilename);
 
 
-    { Write used files and libraries }
-      WriteResponseFile(true);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
       ordersymfile:=WriteSymbolOrderFile;
 
 
       if (cs_link_smart in current_settings.globalswitches) then
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
 
       if (cs_link_map in current_settings.globalswitches) then
       if (cs_link_map in current_settings.globalswitches) then
-        mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
+        mapstr:='-map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
 
 
       { add custom LTO library if using custom clang }
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
       if (cs_lto in current_settings.moduleswitches) and
@@ -631,25 +621,19 @@ implementation
         end;
         end;
 
 
       targetstr:='';
       targetstr:='';
-      emulstr:='';
 
 
       InitStr:='-init FPC_LIB_START';
       InitStr:='-init FPC_LIB_START';
       FiniStr:='-fini FPC_LIB_EXIT';
       FiniStr:='-fini FPC_LIB_EXIT';
-      SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename);
 
 
       { Call linker }
       { Call linker }
       SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
       SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
       Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
       Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$INIT',InitStr);
       Replace(cmdstr,'$INIT',InitStr);
       Replace(cmdstr,'$FINI',FiniStr);
       Replace(cmdstr,'$FINI',FiniStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$SONAME',SoNameStr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$LTO',ltostr);
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
       if ordersymfile<>'' then
@@ -657,6 +641,12 @@ implementation
       else
       else
         Replace(cmdstr,'$ORDERSYMS','');
         Replace(cmdstr,'$ORDERSYMS','');
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
 
       { create dsym file? }
       { create dsym file? }
@@ -679,31 +669,14 @@ implementation
             writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
             writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
           until texportlibunix(exportlib).exportedsymnames.empty;
           until texportlibunix(exportlib).exportedsymnames.empty;
           close(exportedsyms);
           close(exportedsyms);
-          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+LinkSymsFileName;
+          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir+LinkSymsFileName);
         end;
         end;
 
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgbinstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,cmdstr,true,true);
+      success:=DoExec(BinStr,cmdstr,true,false);
       if (success and
       if (success and
           (extdbgbinstr<>'') and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
 
     { Strip the library ? }
     { Strip the library ? }
       if success and (cs_link_strip in current_settings.globalswitches) then
       if success and (cs_link_strip in current_settings.globalswitches) then
@@ -713,17 +686,15 @@ implementation
          success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
          success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
        end;
        end;
 
 
-    { Remove ReponseFile }
+    { Remove temporary files }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
         begin
         begin
           DeleteFile(outputexedir+Info.ResName);
           DeleteFile(outputexedir+Info.ResName);
           if ordersymfile<>'' then
           if ordersymfile<>'' then
             DeleteFile(ordersymfile);
             DeleteFile(ordersymfile);
-          DeleteFile(linkscript.fn);
-          linkscript.free;
            if LinkSymsFileName<>'' then
            if LinkSymsFileName<>'' then
              DeleteFile(outputexedir+LinkSymsFileName);
              DeleteFile(outputexedir+LinkSymsFileName);
-           DeleteFile(outputexedir+LinkFilesFileName);
+           DeleteFile(linkfiles);
         end;
         end;
 
 
       MakeSharedLibrary:=success;   { otherwise a recursive call to link method }
       MakeSharedLibrary:=success;   { otherwise a recursive call to link method }

+ 2 - 0
compiler/systems/t_embed.pas

@@ -634,8 +634,10 @@ begin
  
  
       { Atmel }
       { Atmel }
       ct_sam3x8e,
       ct_sam3x8e,
+      ct_samd51p19a,
       ct_arduino_due,
       ct_arduino_due,
       ct_flip_n_click,
       ct_flip_n_click,
+      ct_wio_terminal,
       
       
       { Nordic Semiconductor }
       { Nordic Semiconductor }
       ct_nrf51422_xxaa,
       ct_nrf51422_xxaa,

+ 5 - 0
compiler/x86/rax86int.pas

@@ -1494,6 +1494,11 @@ Unit Rax86int;
                  4 :
                  4 :
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                   l:=ord(actasmpattern[4]) + ord(actasmpattern[3]) shl 8 +
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
                      Ord(actasmpattern[2]) shl 16 + ord(actasmpattern[1]) shl 24;
+                 8 :
+                  begin
+                    move(actasmpattern[1],l,8);
+                    l:=SwapEndian(l);
+                  end;
                 else
                 else
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                   Message1(asmr_e_invalid_string_as_opcode_operand,actasmpattern);
                 end;
                 end;

+ 117 - 77
installer/install.dat

@@ -33,7 +33,7 @@ package=basedos.zip[basedos.zip],~B~asic system for Go32v2 (required)
 # Dos 2
 # Dos 2
 package=aslddos.zip[aslddos.zip],GNU ~L~inker and GNU Assembler for Go32v2 (required)
 package=aslddos.zip[aslddos.zip],GNU ~L~inker and GNU Assembler for Go32v2 (required)
 # Dos 3
 # Dos 3
-package=idedos.zip[idedos.zip],~I~DE with integrated debugger/compiler (BETA)
+package=units-idedos.zip[uidedos.zip],~I~DE with integrated debugger/compiler (BETA)
 # Dos 4
 # Dos 4
 package=utilsdos.zip[utilsdos.zip],~E~xtra Utilities
 package=utilsdos.zip[utilsdos.zip],~E~xtra Utilities
 # Dos 5
 # Dos 5
@@ -115,41 +115,52 @@ package=units-rtl-extrados.zip[urtledos.zip],RTL-additional units not needed for
 package=units-rtl-objpasdos.zip[urtlodos.zip],RTL-Object Pascal units (e.g. Delphi compatibility)
 package=units-rtl-objpasdos.zip[urtlodos.zip],RTL-Object Pascal units (e.g. Delphi compatibility)
 # Dos-2 10
 # Dos-2 10
 package=units-rtl-unicodedos.zip[urtludos.zip],RTL-miscellaneous Unicode support units
 package=units-rtl-unicodedos.zip[urtludos.zip],RTL-miscellaneous Unicode support units
-# Dos-2 11
-package=utils-fpcmkcfgdos.zip[ufpckdos.zip],Creation of Free Pascal configuration files
-# Dos-2 12
-package=utils-fpcmdos.zip[ufpcmdos.zip],Generate Makefiles out of Makefile.fpc files
-# Dos-2 13
-package=utils-fprcpdos.zip[ufprcdos.zip],Free Pascal Resource Compiler Preprocessor
-# Dos-2 14
-package=utils-h2pasdos.zip[uh2pados.zip],Create Pascal interface units from C headers
-# Dos-2 15
-package=utils-pas2fpmdos.zip[up2fpdos.zip],Generate fpmake.pp for Pascal source
-# Dos-2 16
-package=utils-pas2utdos.zip[up2utdos.zip],Pascal source to FPC Unit test generator
-# Dos-2 17
-package=utils-rmwaitdos.zip[urmwdos.zip],Remove (delete) file(s) with optional retries
-# Dos-2 18
-package=utils-lexyaccdos.zip[ulexydos.zip],Compiler generator for TP and compatibles
 # Dos-2 19
 # Dos-2 19
 package=units-ptcdos.zip[uptcdos.zip],Free portable framebuffer library
 package=units-ptcdos.zip[uptcdos.zip],Free portable framebuffer library
-# Dos-2 20
-package=utils-dxegendos.zip[udxegdos.zip],Generation of D~X~E modules loadable at runtime
 # Dos-2 21
 # Dos-2 21
 package=units-fcl-pdfdos.zip[ufcpddos.zip],PDF generating and TTF file info library
 package=units-fcl-pdfdos.zip[ufcpddos.zip],PDF generating and TTF file info library
 # Dos-2 22
 # Dos-2 22
 package=units-rtl-genericsdos.zip[urtlgdos.zip],RTL-generic collection library
 package=units-rtl-genericsdos.zip[urtlgdos.zip],RTL-generic collection library
 # Dos-2 23
 # Dos-2 23
 package=units-webidldos.zip[uwidldos.zip],WEB IDL parser and converter to Object Pascal classes
 package=units-webidldos.zip[uwidldos.zip],WEB IDL parser and converter to Object Pascal classes
-# Dos-2 24
-package=utils-fpcresdos.zip[ufprsdos.zip],Free Pascal Resource Converter
-# Dos-2 25
-package=utils-fpcreslipodos.zip[ufprldos.zip],Free Pascal External Resource Thinner
-# Dos-2 26
-package=utils-json2pasdos.zip[ujs2pdos.zip],A utility to create Object Pascal classes files from sample JSON files
 # Dos-2 27
 # Dos-2 27
-# Dos-2 28
-# Dos-2 29
+package=units-tplylibdos.zip[utplldos.zip],Units for sources created with the compiler generator
+
+#
+# Go32v2 utils packages 3rd part
+#
+pack=Dos/Go32v2-~U~tils
+filecheck=*dos.zip
+# Dos-3 1
+package=utils-fpcmkcfgdos.zip[fpckdos.zip],Creation of Free Pascal configuration files
+# Dos-3 2
+package=utils-fpcmdos.zip[fpcmdos.zip],Generate Makefiles out of Makefile.fpc files
+# Dos-3 3
+package=utils-fprcpdos.zip[fprcdos.zip],Free Pascal Resource Compiler Preprocessor
+# Dos-3 4
+package=utils-h2pasdos.zip[h2pados.zip],Create Pascal interface units from C headers
+# Dos-3 5
+package=utils-pas2fpmdos.zip[p2fmdos.zip],Generate fpmake.pp for Pascal source
+# Dos-3 6
+package=utils-pas2utdos.zip[p2utdos.zip],Pascal source to FPC Unit test generator
+# Dos-3 7
+package=utils-rmwaitdos.zip[rmwdos.zip],Remove (delete) file(s) with optional retries
+# Dos-3 8
+package=utils-dxegendos.zip[dxegdos.zip],Generation of D~X~E modules loadable at runtime
+# Dos-3 9
+package=utils-fpcresdos.zip[fprsdos.zip],Free Pascal Resource Converter
+# Dos-3 10
+package=utils-fpcreslipodos.zip[fprldos.zip],Free Pascal External Resource Thinner
+# Dos-3 11
+package=utils-json2pasdos.zip[jsnpdos.zip],A utility to create Object Pascal classes files from sample JSON files
+# Dos-3 12
+package=utils-unicodedos.zip[ucddos.zip],Transformation of Unicode consortium data for FPC
+# Dos-3 13
+package=utils-ihxutildos.zip[ihxudos.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# Dos-3 14
+package=utils-lexyaccdos.zip[tplydos.zip],A compiler generator for Turbo Pascal and compatibles
+# Dos-3 15
+package=utils-fpcmkcfgdos.zip[fcmkdos.zip],A utility to create the Free Pascal configuration files
 
 
 #
 #
 # Win32 packages
 # Win32 packages
@@ -168,7 +179,7 @@ package=base.i386-win32.zip,~B~asic system for Win32 (required)
 # Win32 2
 # Win32 2
 package=asld.i386-win32.zip,GNU ~L~inker and GNU Assembler for Win32 (required)
 package=asld.i386-win32.zip,GNU ~L~inker and GNU Assembler for Win32 (required)
 # Win32 3
 # Win32 3
-package=ide.i386-win32.zip,~I~DE with integrated debugger/compiler (BETA)
+package=units-ide.i386-win32.zip,~I~DE with integrated debugger/compiler (BETA)
 # Win32 4
 # Win32 4
 package=utils.i386-win32.zip,~E~xtra Utilities
 package=utils.i386-win32.zip,~E~xtra Utilities
 # Win32 5
 # Win32 5
@@ -311,9 +322,9 @@ package=baseos2.zip,~B~asic system for OS/2 (required)
 # OS/2 2
 # OS/2 2
 package=asldos2.zip,GNU ~L~inker and GNU assembler for OS/2 (required)
 package=asldos2.zip,GNU ~L~inker and GNU assembler for OS/2 (required)
 # OS/2 3
 # OS/2 3
-package=ideos2.zip,~I~DE with integrated compiler (BETA - no debugger)
+package=uideos2.zip,~I~DE with integrated compiler (BETA - no debugger)
 # OS/2 4
 # OS/2 4
-package=utilsos2.zip[utilos2.zip],~E~xtra Utilities
+package=utilsos2.zip[utilsos2.zip],~E~xtra Utilities
 # OS/2 5
 # OS/2 5
 package=makeos2.zip,GNU ~U~tilities (needed for Makefile usage)
 package=makeos2.zip,GNU ~U~tilities (needed for Makefile usage)
 # OS/2 6
 # OS/2 6
@@ -323,7 +334,7 @@ package=ufvos2.zip,Free ~V~ision (FV)
 # OS/2 8
 # OS/2 8
 package=uos2unitsos2.zip[uos2os2.zip],Units interfacing libraries delivered with OS/2/eCS
 package=uos2unitsos2.zip[uos2os2.zip],Units interfacing libraries delivered with OS/2/eCS
 # OS/2 9
 # OS/2 9
-package=utils-h2pasos2.zip[uh2paos2.zip],Create Pascal interface units from C headers
+package=utils-h2pasos2.zip[h2paos2.zip],Create Pascal interface units from C headers
 # OS/2 10
 # OS/2 10
 package=upasjpegos2.zip[upjpos2.zip],Pas~J~PEG units
 package=upasjpegos2.zip[upjpos2.zip],Pas~J~PEG units
 # OS/2 11
 # OS/2 11
@@ -359,11 +370,11 @@ package=utils-fpmcos2.zip[fpmcos2.zip],Free Pascal Message Compiler
 # OS/2 26
 # OS/2 26
 package=utils-fppkgos2.zip[fppkgos2.zip],Free Pascal package repository utility
 package=utils-fppkgos2.zip[fppkgos2.zip],Free Pascal package repository utility
 # OS/2 27
 # OS/2 27
-package=utils-fprcpos2.zip[ufprcos2.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcpos2.zip[fprcos2.zip],Free Pascal Resource Compiler Preprocessor
 # OS/2 28
 # OS/2 28
-package=utils-fpcresos2.zip[fpresos2.zip],Free Pascal Resource Converter
+package=utils-fpcresos2.zip[fprsos2.zip],Free Pascal Resource Converter
 # OS/2 29
 # OS/2 29
-package=utils-pas2fpmos2.zip[up2fpos2.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpmos2.zip[p2fmos2.zip],Generate fpmake.pp for Pascal source
 # OS/2 30
 # OS/2 30
 package=utils-pas2jnios2.zip[p2jnos2.zip],Generate JNI bridge for Pascal code
 package=utils-pas2jnios2.zip[p2jnos2.zip],Generate JNI bridge for Pascal code
 # OS/2 31
 # OS/2 31
@@ -433,7 +444,7 @@ package=urtl-unicodeos2.zip[urtluos2.zip],RTL-miscellaneous Unicode support unit
 # OS/2-2 29
 # OS/2-2 29
 package=utils-rmwaitos2.zip[rmwos2.zip],Remove (delete) file(s) with optional retries
 package=utils-rmwaitos2.zip[rmwos2.zip],Remove (delete) file(s) with optional retries
 # OS/2-2 30
 # OS/2-2 30
-package=utils-lexyaccos2.zip[lexyos2.zip],Compiler generator for TP and compatibles
+package=utils-lexyaccos2.zip[tplyos2.zip],A compiler generator for Turbo Pascal and compatibles
 # OS/2-2 31
 # OS/2-2 31
 package=utils-fpcmos2.zip[fpcmos2.zip],Generate Makefiles out of Makefile.fpc files
 package=utils-fpcmos2.zip[fpcmos2.zip],Generate Makefiles out of Makefile.fpc files
 
 
@@ -456,9 +467,21 @@ package=utils-json2pasos2.zip[js2pos2.zip],Create Object Pascal classes from JSO
 # OS/2-3 5
 # OS/2-3 5
 package=ufcl-pdfos2.zip[ufcpdos2.zip],PDF generating and TTF file info library
 package=ufcl-pdfos2.zip[ufcpdos2.zip],PDF generating and TTF file info library
 # OS/2-2 6
 # OS/2-2 6
-package=utils-unicodeos2.zip[ucodeos2.zip],Transformation of Unicode consortium data for FPC
+package=utils-unicodeos2.zip[ucdos2.zip],Transformation of Unicode consortium data for FPC
 # OS/2-3 7
 # OS/2-3 7
 package=utplylibos2.zip[utpllos2.zip],Units for sources created with the compiler generator
 package=utplylibos2.zip[utpllos2.zip],Units for sources created with the compiler generator
+# OS/2-3 8
+package=units-webidlos2.zip[uwidlos2.zip],WEB IDL parser and converter to Object Pascal classes
+# OS/2-3 9
+package=utils-fpdocos2.zip[fpdcos2.zip],Free Pascal documentation generation utility
+# OS/2-3 10
+package=utils-fppkgos2.zip[fpkgos2.zip],Free Pascal package repository utility
+# OS/2-3 11
+package=utils-fpcreslipoos2.zip[fprlos2.zip],Free Pascal External Resource Thinner
+# OS/2-3 13
+package=utils-ihxutilos2.zip[ihxuos2.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# OS/2-3 14
+package=utils-json2pasos2.zip[jsnpos2.zip],A utility to create Object Pascal classes files from sample JSON files
 
 
 #
 #
 # EMX packages
 # EMX packages
@@ -476,9 +499,9 @@ package=baseemx.zip,~B~asic system for EMX (required)
 # EMX 2
 # EMX 2
 package=asldemx.zip,GNU ~L~inker and GNU assembler for EMX (required)
 package=asldemx.zip,GNU ~L~inker and GNU assembler for EMX (required)
 # EMX 3
 # EMX 3
-package=ideemx.zip,~I~DE with integrated compiler (BETA - no debugger)
+package=uideemx.zip,~I~DE with integrated compiler (BETA - no debugger)
 # EMX 4
 # EMX 4
-package=utilsemx.zip[utilemx.zip],~E~xtra Utilities
+package=utilsemx.zip[utilsemx.zip],~E~xtra Utilities
 # EMX 5
 # EMX 5
 package=makeemx.zip,GNU ~U~tilities (needed for Makefile usage)
 package=makeemx.zip,GNU ~U~tilities (needed for Makefile usage)
 # EMX 6
 # EMX 6
@@ -516,19 +539,19 @@ package=uopensslemx.zip[uosslemx.zip],OpenSSL interface units
 # EMX 22
 # EMX 22
 package=utils-fpcmkcfgemx.zip[fcmkemx.zip],Creation of Free Pascal configuration files
 package=utils-fpcmkcfgemx.zip[fcmkemx.zip],Creation of Free Pascal configuration files
 # EMX 23
 # EMX 23
-package=utils-fpdocemx.zip[fpdocemx.zip],Free Pascal documentation generation utility.
+package=utils-fpdocemx.zip[fpdocemx.zip],Free Pascal documentation generation utility
 # EMX 24
 # EMX 24
-package=utils-fpmcemx.zip[fpmcemx.zip],Free Pascal Message Compiler.
+package=utils-fpmcemx.zip[fpmcemx.zip],Free Pascal Message Compiler
 # EMX 25
 # EMX 25
-package=utils-fppkgemx.zip[fppkgemx.zip],Free Pascal package repository utility.
+package=utils-fppkgemx.zip[fppkgemx.zip],Free Pascal package repository utility
 # EMX 26
 # EMX 26
-package=utils-fprcpemx.zip[ufprcemx.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcpemx.zip[fprcemx.zip],Free Pascal Resource Compiler Preprocessor
 # EMX 27
 # EMX 27
-package=utils-fpcresemx.zip[fpresemx.zip],Free Pascal Resource Converter
+package=utils-fpcresemx.zip[fprsemx.zip],Free Pascal Resource Converter
 # EMX 28
 # EMX 28
-package=utils-h2pasemx.zip[uh2paemx.zip],Create Pascal interface units from C headers
+package=utils-h2pasemx.zip[h2paemx.zip],Create Pascal interface units from C headers
 # EMX 29
 # EMX 29
-package=utils-pas2fpmemx.zip[up2fpemx.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpmemx.zip[p2fmemx.zip],Generate fpmake.pp for Pascal source
 # EMX 30
 # EMX 30
 package=utils-pas2jniemx.zip[p2jnemx.zip],Generate JNI bridge for Pascal code
 package=utils-pas2jniemx.zip[p2jnemx.zip],Generate JNI bridge for Pascal code
 # EMX 31
 # EMX 31
@@ -596,12 +619,7 @@ package=urtl-objpasemx.zip[urtloemx.zip],RTL-Object Pascal units (e.g. Delphi co
 # EMX-2 28
 # EMX-2 28
 package=urtl-unicodeemx.zip[urtluemx.zip],RTL-miscellaneous Unicode support units
 package=urtl-unicodeemx.zip[urtluemx.zip],RTL-miscellaneous Unicode support units
 # EMX-2 29
 # EMX-2 29
-package=utils-rmwaitemx.zip[rmwemx.zip],Remove (delete) file(s) with optional retries
-# EMX-2 30
-package=utils-lexyaccemx.zip[ulexyemx.zip],Compiler generator for TP and compatibles
-# EMX-2 31
-package=utils-fpcmemx.zip[fpcmemx.zip],Generate Makefiles out of Makefile.fpc files
-
+package=units-webidlemx.zip[uwidlemx.zip],WEB IDL parser and converter to Object Pascal classes
 
 
 #
 #
 # EMX packages 3rd part
 # EMX packages 3rd part
@@ -618,11 +636,26 @@ package=utils-webidlemx.zip[widlemx.zip],Web IDL parser and converter to Object
 package=utils-json2pasemx.zip[js2pemx.zip],Create Object Pascal classes from JSON files
 package=utils-json2pasemx.zip[js2pemx.zip],Create Object Pascal classes from JSON files
 # EMX-3 5
 # EMX-3 5
 package=ufcl-pdfemx.zip[ufcpdemx.zip],PDF generating and TTF file info library
 package=ufcl-pdfemx.zip[ufcpdemx.zip],PDF generating and TTF file info library
-# EMX-2 6
-package=utils-unicodeemx.zip[ucodeemx.zip],Transformation of Unicode consortium data for FPC
+# EMX-3 6
+package=utils-unicodeemx.zip[ucdemx.zip],Transformation of Unicode consortium data for FPC
 # EMX-3 7
 # EMX-3 7
 package=utplylibemx.zip[utpllemx.zip],Units for sources created with the compiler generator
 package=utplylibemx.zip[utpllemx.zip],Units for sources created with the compiler generator
-
+# EMX-3 8
+package=utils-fpdocemx.zip[fpdcemx.zip],Free Pascal documentation generation utility
+# EMX-3 9
+package=utils-fppkgemx.zip[fpkgemx.zip],Free Pascal package repository utility
+# EMX-3 10
+package=utils-fpcreslipoemx.zip[fprlemx.zip],Free Pascal External Resource Thinner
+# EMX-3 11
+package=utils-ihxutilemx.zip[ihxuemx.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+# EMX-3 12
+package=utils-json2pasemx.zip[jsnpemx.zip],A utility to create Object Pascal classes fil|es from sample JSON files
+# EMX-3 13
+package=utils-lexyaccemx.zip[tplyemx.zip],A compiler generator for Turbo Pascal and compatibles
+# EMX-3 14
+package=utils-rmwaitemx.zip[rmwemx.zip],Remove (delete) file(s) with optional retries
+# EMX-3 15
+package=utils-fpcmemx.zip[fpcmemx.zip],Generate Makefiles out of Makefile.fpc files
 
 
 #
 #
 # Common packages
 # Common packages
@@ -652,7 +685,7 @@ package=compiler.source.zip[compsrc.zip],~C~ompiler sources
 # Source 3
 # Source 3
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 package=rtl.source.zip[rtlsrc.zip],Run time library sources
 # Source 4
 # Source 4
-package=ide-3.3.1.source.zip[idesrc.zip],IDE sources
+package=units-ide-3.3.1.source.zip[uidesrc.zip],IDE sources
 # Source 5
 # Source 5
 package=utils-3.3.1.source.zip[utilssrc.zip],~U~tils sources
 package=utils-3.3.1.source.zip[utilssrc.zip],~U~tils sources
 # Source 6
 # Source 6
@@ -681,8 +714,10 @@ package=units-graph-3.3.1.source.zip[ugrphsrc.zip],Unit Graph sources
 package=units-hermes-3.3.1.source.zip[uhermsrc.zip],Port of Hermes graphics library
 package=units-hermes-3.3.1.source.zip[uhermsrc.zip],Port of Hermes graphics library
 # Source 18
 # Source 18
 package=units-fppkg-3.3.1.source.zip[ufppksrc.zip],Units for FPPkg packaging support
 package=units-fppkg-3.3.1.source.zip[ufppksrc.zip],Units for FPPkg packaging support
-
-
+# Source 19
+package=units-fpc-all.source.zip[ufpcasrc.zip],uninitialized function result in function TPa|ckage.GetDescription:AnsiString(0);
+# Source 20
+package=units-webidl.source.zip[uwidlsrc.zip],WEB IDL parser and converter to Object Pascal classes
 #
 #
 # Source packages 2nd part
 # Source packages 2nd part
 #
 #
@@ -699,9 +734,9 @@ package=units-ibase-3.3.1.source.zip[uibassrc.zip],Interbase interface units sou
 # Source-2 5
 # Source-2 5
 package=units-mysql-3.3.1.source.zip[umysqsrc.zip],MySQL interface units sources
 package=units-mysql-3.3.1.source.zip[umysqsrc.zip],MySQL interface units sources
 # Source-2 6
 # Source-2 6
-package=utils-lexyacc-3.3.1.source.zip[ulexysrc.zip],Compiler generator for TP and compatibles
+package=utils-lexyacc-3.3.1.source.zip[tplysrc.zip],A compiler generator for Turbo Pascal and compatibles
 # Source-2 7
 # Source-2 7
-package=utils-unicode-3.3.1.source.zip[uucdsrc.zip],Transformation of Unicode consortium data for FPC
+package=utils-unicode-3.3.1.source.zip[ucdsrc.zip],Transformation of Unicode consortium data for FPC
 # Source-2 8
 # Source-2 8
 package=units-os2units-3.3.1.source.zip[uos2src.zip],Units interfacing libraries delivered with OS/2/eCS
 package=units-os2units-3.3.1.source.zip[uos2src.zip],Units interfacing libraries delivered with OS/2/eCS
 # Source-2 9
 # Source-2 9
@@ -823,41 +858,46 @@ package=units-rtl-generics-3.3.1.source.zip[urtlgsrc.zip],RTL-generic collection
 pack=~U~tils sources
 pack=~U~tils sources
 filecheck=*.source.zip[*src.zip]
 filecheck=*.source.zip[*src.zip]
 # Source 1
 # Source 1
-package=utils-dxegen-3.3.1.source.zip[udxegsrc.zip],Generation of D~X~E modules loadable at runtime
+package=utils-dxegen-3.3.1.source.zip[dxegsrc.zip],Generation of D~X~E modules loadable at runtime
 # Source 2
 # Source 2
-package=utils-fpcmkcfg-3.3.1.source.zip[ufpcksrc.zip],Creation of Free Pascal configuration files
+package=utils-fpcmkcfg-3.3.1.source.zip[fpcksrc.zip],Creation of Free Pascal configuration files
 # Source 3
 # Source 3
-package=utils-fpcm-3.3.1.source.zip[ufpcmsrc.zip],Generate Makefiles out of Makefile.fpc files
+package=utils-fpcm-3.3.1.source.zip[fpcmsrc.zip],Generate Makefiles out of Makefile.fpc files
 # Source 4
 # Source 4
-package=utils-fpdoc-3.3.1.source.zip[ufpdcsrc.zip],Free Pascal documentation generation utility
+package=utils-fpdoc-3.3.1.source.zip[fpdcsrc.zip],Free Pascal documentation generation utility
 # Source 5
 # Source 5
-package=utils-fpmc-3.3.1.source.zip[ufpmcsrc.zip],Free Pascal Message Compiler
+package=utils-fpmc-3.3.1.source.zip[fpmcsrc.zip],Free Pascal Message Compiler
 # Source 6
 # Source 6
-package=utils-fppkg-3.3.1.source.zip[ufpkgsrc.zip],Free Pascal package repository utility
+package=utils-fppkg-3.3.1.source.zip[fpkgsrc.zip],Free Pascal package repository utility
 # Source 7
 # Source 7
-package=utils-fprcp-3.3.1.source.zip[ufprcsrc.zip],Free Pascal Resource Compiler Preprocessor
+package=utils-fprcp-3.3.1.source.zip[fprcsrc.zip],Free Pascal Resource Compiler Preprocessor
 # Source 8
 # Source 8
-package=utils-fpcres-3.3.1.source.zip[ufprssrc.zip],Free Pascal Resource Converter
+package=utils-fpcres-3.3.1.source.zip[fprssrc.zip],Free Pascal Resource Converter
 # Source 9
 # Source 9
-package=utils-fpcreslipo-3.3.1.source.zip[ufprlsrc.zip],Free Pascal External Resource Thinner
+package=utils-fpcreslipo-3.3.1.source.zip[fprlsrc.zip],Free Pascal External Resource Thinner
 # Source 10
 # Source 10
-package=utils-h2pas-3.3.1.source.zip[uh2pasrc.zip],Create Pascal interface units from C headers
+package=utils-h2pas-3.3.1.source.zip[h2pasrc.zip],Create Pascal interface units from C headers
 # Source 11
 # Source 11
-package=utils-json2pas-3.3.1.source.zip[ujs2psrc.zip],A utility to create Object Pascal classes files from sample JSON files
+package=utils-json2pas-3.3.1.source.zip[jsnpsrc.zip],A utility to create Object Pascal classes files from sample JSON files
 # Source 12
 # Source 12
-package=utils-importtl-3.3.1.source.zip[uimptsrc.zip],
+package=utils-importtl-3.3.1.source.zip[imptsrc.zip],
 # Source 13
 # Source 13
-package=utils-instantfpc-3.3.1.source.zip[uifpcsrc.zip],Instantaneous Free Pascal source executer
+package=utils-instantfpc-3.3.1.source.zip[ifpcsrc.zip],Instantaneous Free Pascal source executer
 # Source 14
 # Source 14
-package=utils-pas2js-3.3.1.source.zip[up2jssrc.zip],Pascal to JavaScript converter
+package=utils-pas2js-3.3.1.source.zip[p2jssrc.zip],Pascal to JavaScript converter
 # Source 15
 # Source 15
-package=utils-pas2fpm-3.3.1.source.zip[up2fpsrc.zip],Generate fpmake.pp for Pascal source
+package=utils-pas2fpm-3.3.1.source.zip[p2fmsrc.zip],Generate fpmake.pp for Pascal source
 # Source 16
 # Source 16
-package=utils-pas2jni-3.3.1.source.zip[up2jnsrc.zip],Generate JNI bridge for Pascal code
+package=utils-pas2jni-3.3.1.source.zip[p2jnsrc.zip],Generate JNI bridge for Pascal code
 # Source 17
 # Source 17
-package=utils-pas2ut-3.3.1.source.zip[up2utsrc.zip],Pascal source to FPC Unit test generator
+package=utils-pas2ut-3.3.1.source.zip[p2utsrc.zip],Pascal source to FPC Unit test generator
 # Source 18
 # Source 18
-package=utils-rmwait-3.3.1.source.zip[urmwsrc.zip],Remove (delete) file(s) with optional retries
+package=utils-rmwait-3.3.1.source.zip[rmwsrc.zip],Remove (delete) file(s) with optional retries
+# Source 19
+package=utils-fpcmkcfg-3.3.1.source.zip[fcmksrc.zip],A utility to create the Free Pascal configuration files
+# Source 20
+package=utils-ihxutil-3.3.1.source.zip[ihxusrc.zip],A tool to convert Intel HEX Format files different formats used on various Z80 systems
+
 
 
 defaultcfg=
 defaultcfg=
 #
 #

+ 11 - 7
packages/chm/src/chmfilewriter.pas

@@ -1190,8 +1190,8 @@ begin
   Writer.FullTextSearch := MakeSearchable;
   Writer.FullTextSearch := MakeSearchable;
   Writer.HasBinaryTOC := MakeBinaryTOC;
   Writer.HasBinaryTOC := MakeBinaryTOC;
   Writer.HasBinaryIndex := MakeBinaryIndex;
   Writer.HasBinaryIndex := MakeBinaryIndex;
-  Writer.IndexName := ExtractFileName(IndexFileName);
-  Writer.TocName   := ExtractFileName(TableOfContentsFileName);
+  Writer.IndexName := IndexFileName;
+  Writer.TocName   := TableOfContentsFileName;
   Writer.ReadmeMessage := ReadmeMessage;
   Writer.ReadmeMessage := ReadmeMessage;
   Writer.DefaultWindow := FDefaultWindow;
   Writer.DefaultWindow := FDefaultWindow;
   Writer.LocaleID := FLocaleID;
   Writer.LocaleID := FLocaleID;
@@ -1231,16 +1231,19 @@ begin
 end;
 end;
 
 
 procedure TChmProject.LoadSitemaps;
 procedure TChmProject.LoadSitemaps;
+var
+  FullFileName: string;
 // #IDXHDR (merged files) goes into the system file, and need to keep  TOC sitemap around
 // #IDXHDR (merged files) goes into the system file, and need to keep  TOC sitemap around
 begin
 begin
    if FTableOfContentsFileName<>'' then
    if FTableOfContentsFileName<>'' then
    begin
    begin
-     if fileexists(FTableOfContentsFileName) then
+     FullFileName := IncludeTrailingPathDelimiter(ProjectDir()) + ExtractFileName(FTableOfContentsFileName);
+     if FileExists(FullFileName) then
        begin
        begin
          FreeAndNil(FTocStream);
          FreeAndNil(FTocStream);
          FTocStream:=TMemoryStream.Create;
          FTocStream:=TMemoryStream.Create;
          try
          try
-           FTocStream.loadfromfile(FTableOfContentsFilename);
+           FTocStream.loadfromfile(FullFileName);
            //writeln(ftableofcontentsfilename, ' ' ,ftocstream.size);
            //writeln(ftableofcontentsfilename, ' ' ,ftocstream.size);
            FTocStream.Position:=0;
            FTocStream.Position:=0;
            FreeAndNil(FToc);
            FreeAndNil(FToc);
@@ -1257,18 +1260,19 @@ begin
      else
      else
        error(chmerror,'Can''t find TOC file'+FTableOfContentsFileName);
        error(chmerror,'Can''t find TOC file'+FTableOfContentsFileName);
    end;
    end;
-   if FIndexFileName<>'' then
+   FullFileName := IncludeTrailingPathDelimiter(ProjectDir()) + ExtractFileName(FIndexFileName);
+   if FileExists(FullFileName) then
    begin
    begin
      if fileexists(FIndexFileName) then
      if fileexists(FIndexFileName) then
        begin
        begin
         FreeAndNil(FIndexStream);
         FreeAndNil(FIndexStream);
         FIndexStream:=TMemoryStream.Create;
         FIndexStream:=TMemoryStream.Create;
         try
         try
-          FIndexStream.LoadFromFile(FIndexFileName);
+          FIndexStream.LoadFromFile(FullFileName);
           FIndexStream.Position:=0;
           FIndexStream.Position:=0;
           FreeAndNil(FIndex);
           FreeAndNil(FIndex);
           FIndex:=TChmSiteMap.Create(stindex);
           FIndex:=TChmSiteMap.Create(stindex);
-          FIndex.loadfromfile(FIndexFileName);
+          FIndex.loadfromfile(FullFileName);
           Error(chmnote,'Index items:'+inttostr(findex.Items.count));
           Error(chmnote,'Index items:'+inttostr(findex.Items.count));
         except
         except
           on e: Exception do
           on e: Exception do

+ 4 - 0
packages/fcl-db/src/sqldb/odbc/odbcconn.pas

@@ -32,6 +32,8 @@ type
     FParamIndex:TParamBinding; // maps the i-th parameter in the query to the TParams passed to PrepareStatement
     FParamIndex:TParamBinding; // maps the i-th parameter in the query to the TParams passed to PrepareStatement
     FParamBuf:array of pointer; // buffers that can be used to bind the i-th parameter in the query
     FParamBuf:array of pointer; // buffers that can be used to bind the i-th parameter in the query
   public
   public
+    property STMTHandle:SQLHSTMT read FSTMTHandle;
+
     constructor Create(Connection:TODBCConnection);
     constructor Create(Connection:TODBCConnection);
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
@@ -142,6 +144,8 @@ type
     Class Function Description : String; override;
     Class Function Description : String; override;
   end;
   end;
 
 
+function ODBCSuccess(const Res:SQLRETURN):boolean;
+
 implementation
 implementation
 
 
 uses
 uses

+ 31 - 1
packages/fcl-js/src/jstree.pp

@@ -158,6 +158,7 @@ Type
     Property Flags : TJSElementFlags Read FFlags Write FFlags;
     Property Flags : TJSElementFlags Read FFlags Write FFlags;
   end;
   end;
   TJSElementClass = Class of TJSElement;
   TJSElementClass = Class of TJSElement;
+  TJSElementArray = array of TJSElement;
 
 
   { TJSEmptyBlockStatement - empty curly brackets }
   { TJSEmptyBlockStatement - empty curly brackets }
 
 
@@ -1758,9 +1759,38 @@ end;
 { TJSBinary }
 { TJSBinary }
 
 
 destructor TJSBinary.Destroy;
 destructor TJSBinary.Destroy;
+var
+  El: TJSElement;
+  BinCnt: Integer;
+  Bins: TJSElementArray;
+  SubBin: TJSBinary;
 begin
 begin
-  FreeAndNil(FB);
+  if FA is TJSBinary then
+    begin
+    // free El binary chains without stack
+    El:=FA;
+    SetLength(Bins{%H-},8);
+    BinCnt:=0;
+    while El is TJSBinary do
+      begin
+      SubBin:=TJSBinary(El);
+      if BinCnt=length(Bins) then
+        SetLength(Bins,BinCnt*2);
+      Bins[BinCnt]:=SubBin;
+      inc(BinCnt);
+      El:=SubBin.FA;
+      end;
+    while BinCnt>0 do
+      begin
+      dec(BinCnt);
+      SubBin:=TJSBinary(Bins[BinCnt]);
+      FreeAndNil(SubBin.FA);
+      FreeAndNil(SubBin.FB);
+      end;
+    end;
+
   FreeAndNil(FA);
   FreeAndNil(FA);
+  FreeAndNil(FB);
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 

+ 61 - 26
packages/fcl-js/src/jswriter.pp

@@ -1372,11 +1372,26 @@ begin
 end;
 end;
 
 
 procedure TJSWriter.WriteBinary(El: TJSBinary);
 procedure TJSWriter.WriteBinary(El: TJSBinary);
+var
+  ElC: TClass;
+  S : String;
+
+  procedure WriteRight(Bin: TJSBinary);
+  begin
+    FSkipRoundBrackets:=(Bin.B.ClassType=ElC)
+          and ((ElC=TJSLogicalOrExpression)
+            or (ElC=TJSLogicalAndExpression));
+    Write(S);
+    WriteJS(Bin.B);
+    Writer.CurElement:=Bin;
+  end;
 
 
 Var
 Var
-  S : String;
   AllowCompact, WithBrackets: Boolean;
   AllowCompact, WithBrackets: Boolean;
-  ElC: TClass;
+  Left: TJSElement;
+  SubBin: TJSBinaryExpression;
+  Binaries: TJSElementArray;
+  BinariesCnt: integer;
 begin
 begin
   {$IFDEF VerboseJSWriter}
   {$IFDEF VerboseJSWriter}
   System.writeln('TJSWriter.WriteBinary SkipRoundBrackets=',FSkipRoundBrackets);
   System.writeln('TJSWriter.WriteBinary SkipRoundBrackets=',FSkipRoundBrackets);
@@ -1386,20 +1401,10 @@ begin
     Write('(');
     Write('(');
   FSkipRoundBrackets:=false;
   FSkipRoundBrackets:=false;
   ElC:=El.ClassType;
   ElC:=El.ClassType;
-  if El.A is TJSBinaryExpression then
-    if (El.A.ClassType=ElC)
-        and ((ElC=TJSLogicalOrExpression)
-        or (ElC=TJSLogicalAndExpression)
-        or (ElC=TJSBitwiseAndExpression)
-        or (ElC=TJSBitwiseOrExpression)
-        or (ElC=TJSBitwiseXOrExpression)
-        or (ElC=TJSAdditiveExpressionPlus)
-        or (ElC=TJSAdditiveExpressionMinus)
-        or (ElC=TJSMultiplicativeExpressionMul)) then
-      FSkipRoundBrackets:=true;
-  WriteJS(El.A);
-  Writer.CurElement:=El;
+  Left:=El.A;
   AllowCompact:=False;
   AllowCompact:=False;
+
+  S:='';
   if (El is TJSBinaryExpression) then
   if (El is TJSBinaryExpression) then
     begin
     begin
     S:=TJSBinaryExpression(El).OperatorString;
     S:=TJSBinaryExpression(El).OperatorString;
@@ -1412,17 +1417,47 @@ begin
     else
     else
       S:=' '+S+' ';
       S:=' '+S+' ';
     end;
     end;
-  FSkipRoundBrackets:=false;
-  ElC:=El.ClassType;
-  if El.B is TJSBinaryExpression then
-    if (El.B.ClassType=ElC)
-        and ((ElC=TJSLogicalOrExpression)
-        or (ElC=TJSLogicalAndExpression)) then
-      FSkipRoundBrackets:=true;
-  // Note: a+(b+c) <> a+b+c  e.g. floats, 0+string
-  Write(S);
-  WriteJS(El.B);
-  Writer.CurElement:=El;
+
+  if (Left is TJSBinaryExpression)
+      and (Left.ClassType=ElC)
+      and ((ElC=TJSLogicalOrExpression)
+        or (ElC=TJSLogicalAndExpression)
+        or (ElC=TJSBitwiseAndExpression)
+        or (ElC=TJSBitwiseOrExpression)
+        or (ElC=TJSBitwiseXOrExpression)
+        or (ElC=TJSAdditiveExpressionPlus)
+        or (ElC=TJSAdditiveExpressionMinus)
+        or (ElC=TJSMultiplicativeExpressionMul)) then
+    begin
+    // handle left handed multi add without stack
+    SetLength(Binaries{%H-},8);
+    BinariesCnt:=0;
+    while Left is TJSBinaryExpression do
+      begin
+      SubBin:=TJSBinaryExpression(Left);
+      if SubBin.ClassType<>ElC then break;
+      if BinariesCnt=length(Binaries) then
+        SetLength(Binaries,BinariesCnt*2);
+      Binaries[BinariesCnt]:=SubBin;
+      inc(BinariesCnt);
+      Left:=SubBin.A;
+      end;
+
+    WriteJS(Left);
+    Writer.CurElement:=El;
+
+    while BinariesCnt>0 do
+      begin
+      dec(BinariesCnt);
+      WriteRight(TJSBinaryExpression(Binaries[BinariesCnt]));
+      end;
+    end
+  else
+    begin;
+    WriteJS(Left);
+    Writer.CurElement:=El;
+    end;
+  WriteRight(El);
   if WithBrackets then
   if WithBrackets then
     Write(')');
     Write(')');
 end;
 end;

+ 61 - 5
packages/fcl-js/tests/tcsrcmap.pas

@@ -24,6 +24,7 @@ type
     procedure Test_Base64VLQ;
     procedure Test_Base64VLQ;
     procedure TestSrcMapIgnoreDuplicate;
     procedure TestSrcMapIgnoreDuplicate;
     procedure TestSrcMapNames;
     procedure TestSrcMapNames;
+    procedure TestSrcMapLoad;
   end;
   end;
 
 
 implementation
 implementation
@@ -127,7 +128,9 @@ begin
   try
   try
     sm.AddMapping(1,1,'a.js',2,2,'foo');
     sm.AddMapping(1,1,'a.js',2,2,'foo');
     sm.AddMapping(3,3,'a.js',4,4,'foo');
     sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
     writeln(sm.ToString);
     writeln(sm.ToString);
+    {$ENDIF}
     {
     {
       version: 3,
       version: 3,
       file: 'generated.js',
       file: 'generated.js',
@@ -139,33 +142,86 @@ begin
 
 
     // version
     // version
     El:=GetEl(Obj,'version',TJSONIntegerNumber);
     El:=GetEl(Obj,'version',TJSONIntegerNumber);
-    AssertEquals('json "version" value',El.AsInt64,3);
+    AssertEquals('json "version" value',3,El.AsInt64);
 
 
     // file
     // file
     El:=GetEl(Obj,'file',TJSONString);
     El:=GetEl(Obj,'file',TJSONString);
-    AssertEquals('json "file" value',El.AsString,'generated.js');
+    AssertEquals('json "file" value','generated.js',El.AsString);
 
 
     // sources
     // sources
     Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
     Arr:=TJSONArray(GetEl(Obj,'sources',TJSONArray));
     AssertEquals('json "sources".count',Arr.Count,1);
     AssertEquals('json "sources".count',Arr.Count,1);
     El:=Arr[0];
     El:=Arr[0];
     CheckEl('sources[0]',El,TJSONString);
     CheckEl('sources[0]',El,TJSONString);
-    AssertEquals('json "sources[0]" value',El.AsString,'a.js');
+    AssertEquals('json "sources[0]" value','a.js',El.AsString);
 
 
     // names
     // names
     Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
     Arr:=TJSONArray(GetEl(Obj,'names',TJSONArray));
     AssertEquals('json "names".count',Arr.Count,1);
     AssertEquals('json "names".count',Arr.Count,1);
     El:=Arr[0];
     El:=Arr[0];
     CheckEl('names[0]',El,TJSONString);
     CheckEl('names[0]',El,TJSONString);
-    AssertEquals('json "names[0]" value',El.AsString,'foo');
+    AssertEquals('json "names[0]" value','foo',El.AsString);
 
 
     // mappings
     // mappings
     El:=GetEl(Obj,'mappings',TJSONString);
     El:=GetEl(Obj,'mappings',TJSONString);
-    AssertEquals('json "mappings" value',El.AsString,'CACEA;;GAEEA');
+    AssertEquals('json "mappings" value','CACEA;;GAEEA',El.AsString);
+
+  finally
+    Obj.Free;
+    sm.Free;
+  end;
+end;
+
+procedure TTestSrcMap.TestSrcMapLoad;
+var
+  sm, sm2: TSourceMap;
+  Obj: TJSONObject;
+  i: Integer;
+begin
+  Obj:=nil;
+  sm2:=nil;
+  sm:=TSourceMap.Create('generated.js');
+  try
+    sm.AddMapping(1,1,'a.js',2,2,'foo');
+    sm.AddMapping(3,3,'a.js',4,4,'foo');
+    {$IFDEF VerboseSrcMap}
+    writeln(sm.ToString);
+    {$ENDIF}
+    {
+      version: 3,
+      file: 'generated.js',
+      sources: ['a.js'],
+      names: ['foo'],
+      mappings: 'CACEA;;GAEEA'
+    }
+    Obj:=sm.ToJSON;
+
+    sm2:=TSourceMap.Create('(not set)');
+    sm2.LoadFromJSON(Obj);
+
+    AssertEquals('same GeneratedFilename',sm.GeneratedFilename,sm2.GeneratedFilename);
+    AssertEquals('same SourceCount',sm.SourceCount,sm2.SourceCount);
+    for i:=0 to sm.SourceCount-1 do
+      AssertEquals('same SourceFiles['+IntToStr(i)+']',sm.SourceFiles[i],sm2.SourceFiles[i]);
+    AssertEquals('same NameCount',sm.NameCount,sm2.NameCount);
+    for i:=0 to sm.NameCount-1 do
+      AssertEquals('same Names['+IntToStr(i)+']',sm.Names[i],sm2.Names[i]);
+    AssertEquals('same Count',sm.Count,sm2.Count);
+    for i:=0 to sm.Count-1 do
+      begin
+      AssertEquals('same Items['+IntToStr(i)+'].Index',sm[i].Index,sm2[i].Index);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedLine',sm[i].GeneratedLine,sm2[i].GeneratedLine);
+      AssertEquals('same Items['+IntToStr(i)+'].GeneratedColumn',sm[i].GeneratedColumn,sm2[i].GeneratedColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcFileIndex',sm[i].SrcFileIndex,sm2[i].SrcFileIndex);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcLine',sm[i].SrcLine,sm2[i].SrcLine);
+      AssertEquals('same Items['+IntToStr(i)+'].SrcColumn',sm[i].SrcColumn,sm2[i].SrcColumn);
+      AssertEquals('same Items['+IntToStr(i)+'].NameIndex',sm[i].NameIndex,sm2[i].NameIndex);
+      end;
 
 
   finally
   finally
     Obj.Free;
     Obj.Free;
     sm.Free;
     sm.Free;
+    sm2.Free;
   end;
   end;
 end;
 end;
 
 

+ 48 - 0
packages/fcl-passrc/src/pasresolveeval.pas

@@ -1524,6 +1524,8 @@ function TResExprEvaluator.EvalBinaryExpr(Expr: TBinaryExpr;
   Flags: TResEvalFlags): TResEvalValue;
   Flags: TResEvalFlags): TResEvalValue;
 var
 var
   LeftValue, RightValue: TResEvalValue;
   LeftValue, RightValue: TResEvalValue;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
 begin
   Result:=nil;
   Result:=nil;
   if (Expr.Kind=pekBinary) and (Expr.OpCode=eopSubIdent) then
   if (Expr.Kind=pekBinary) and (Expr.OpCode=eopSubIdent) then
@@ -1534,6 +1536,52 @@ begin
   LeftValue:=nil;
   LeftValue:=nil;
   RightValue:=nil;
   RightValue:=nil;
   try
   try
+    if Expr.OpCode=eopAdd then
+      begin
+      // handle multi adds without stack
+      Left:=Expr.left;
+      while Left.ClassType=TBinaryExpr do
+        begin
+        SubBin:=TBinaryExpr(Left);
+        if SubBin.OpCode<>eopAdd then break;
+        Left:=SubBin.left;
+        end;
+      LeftValue:=Eval(Left,Flags);
+      while LeftValue<>nil do
+        begin
+        SubBin:=TBinaryExpr(Left.Parent);
+        RightValue:=Eval(SubBin.right,Flags);
+        if RightValue=nil then exit;
+
+        if LeftValue.Kind=revkExternal then
+          begin
+          if [refConst,refConstExt]*Flags=[refConst] then
+            RaiseConstantExprExp(20210321205928,Expr.left);
+          Result:=LeftValue;
+          LeftValue:=nil;
+          exit;
+          end;
+        if RightValue.Kind=revkExternal then
+          begin
+          if [refConst,refConstExt]*Flags=[refConst] then
+            RaiseConstantExprExp(20210321205948,Expr.right);
+          Result:=RightValue;
+          RightValue:=nil;
+          exit;
+          end;
+
+        Result:=EvalBinaryAddExpr(SubBin,LeftValue,RightValue);
+        ReleaseEvalValue(LeftValue);
+        if SubBin=Expr then exit;
+
+        LeftValue:=Result;
+        Result:=nil;
+        Left:=SubBin;
+        end;
+
+      exit;
+      end;
+
     LeftValue:=Eval(Expr.left,Flags);
     LeftValue:=Eval(Expr.left,Flags);
     if LeftValue=nil then exit;
     if LeftValue=nil then exit;
     RightValue:=Eval(Expr.right,Flags);
     RightValue:=Eval(Expr.right,Flags);

+ 99 - 7
packages/fcl-passrc/src/pasresolver.pp

@@ -2387,6 +2387,7 @@ type
       EvalLow: boolean; ErrorEl: TPasElement): TResEvalValue; virtual; // compute low() or high()
       EvalLow: boolean; ErrorEl: TPasElement): TResEvalValue; virtual; // compute low() or high()
     function EvalTypeRange(Decl: TPasType; Flags: TResEvalFlags): TResEvalValue; virtual; // compute low() and high()
     function EvalTypeRange(Decl: TPasType; Flags: TResEvalFlags): TResEvalValue; virtual; // compute low() and high()
     function HasTypeInfo(El: TPasType): boolean; virtual;
     function HasTypeInfo(El: TPasType): boolean; virtual;
+    function IsAnonymousElType(El: TPasType): boolean; virtual;
     function GetActualBaseType(bt: TResolverBaseType): TResolverBaseType; virtual;
     function GetActualBaseType(bt: TResolverBaseType): TResolverBaseType; virtual;
     function GetCombinedBoolean(Bool1, Bool2: TResolverBaseType; ErrorEl: TPasElement): TResolverBaseType; virtual;
     function GetCombinedBoolean(Bool1, Bool2: TResolverBaseType; ErrorEl: TPasElement): TResolverBaseType; virtual;
     function GetCombinedInt(const Int1, Int2: TPasResolverResult; ErrorEl: TPasElement): TResolverBaseType; virtual;
     function GetCombinedInt(const Int1, Int2: TPasResolverResult; ErrorEl: TPasElement): TResolverBaseType; virtual;
@@ -6236,15 +6237,26 @@ procedure TPasResolver.FinishSubElementType(Parent: TPasElement; El: TPasType);
     {$IFDEF CheckPasTreeRefCount};const aId: string{$ENDIF});
     {$IFDEF CheckPasTreeRefCount};const aId: string{$ENDIF});
   var
   var
     i: Integer;
     i: Integer;
-    p: TPasElement;
+    p, Prev: TPasElement;
   begin
   begin
     p:=El.Parent;
     p:=El.Parent;
     if NewParent=p.Parent then
     if NewParent=p.Parent then
       begin
       begin
-      // e.g. a:array of longint; -> insert a$a in front of a
+      // e.g. m,n:array of longint; -> insert n$a in front of m
       i:=List.Count-1;
       i:=List.Count-1;
       while (i>=0) and (List[i]<>Pointer(p)) do
       while (i>=0) and (List[i]<>Pointer(p)) do
         dec(i);
         dec(i);
+      if P is TPasVariable then
+        begin
+        while (i>0) do
+          begin
+          Prev:=TPasElement(List[i-1]);
+          if (Prev.ClassType=P.ClassType) and (TPasVariable(Prev).VarType=TPasVariable(P).VarType) then
+            dec(i) // e.g. m,n: array of longint
+          else
+            break;
+          end;
+        end;
       if i<0 then
       if i<0 then
         List.Add(El)
         List.Add(El)
       else
       else
@@ -10585,6 +10597,9 @@ end;
 
 
 procedure TPasResolver.ResolveBinaryExpr(El: TBinaryExpr;
 procedure TPasResolver.ResolveBinaryExpr(El: TBinaryExpr;
   Access: TResolvedRefAccess);
   Access: TResolvedRefAccess);
+var
+  Left, Next: TPasExpr;
+  Bin: TBinaryExpr;
 begin
 begin
   {$IFDEF VerbosePasResolver}
   {$IFDEF VerbosePasResolver}
   //writeln('TPasResolver.ResolveBinaryExpr left=',GetObjName(El.left),' right=',GetObjName(El.right),' opcode=',OpcodeStrings[El.OpCode]);
   //writeln('TPasResolver.ResolveBinaryExpr left=',GetObjName(El.left),' right=',GetObjName(El.right),' opcode=',OpcodeStrings[El.OpCode]);
@@ -10611,7 +10626,26 @@ begin
         RaiseNotYetImplemented(20160922163456,El);
         RaiseNotYetImplemented(20160922163456,El);
         end;
         end;
     end;
     end;
-  eopAdd,
+  eopAdd:
+    begin
+    Left:=El.left;
+    while (Left.ClassType=TBinaryExpr) do
+      begin
+      Bin:=TBinaryExpr(Left);
+      if Bin.OpCode<>eopAdd then break;
+      Next:=TBinaryExpr(Left).left;
+      if Next.Parent<>Left then
+        RaiseNotYetImplemented(20210321201257,Left);
+      Left:=Next;
+      end;
+    ResolveExpr(Left,rraRead);
+    repeat
+      Bin:=TBinaryExpr(Left.Parent);
+      if Bin.right<>nil then
+        ResolveExpr(Bin.right,rraRead);
+      Left:=Bin;
+    until Left=El;
+    end;
   eopSubtract,
   eopSubtract,
   eopMultiply,
   eopMultiply,
   eopDivide,
   eopDivide,
@@ -12939,6 +12973,8 @@ procedure TPasResolver.ComputeBinaryExpr(Bin: TBinaryExpr; out
   StartEl: TPasElement);
   StartEl: TPasElement);
 var
 var
   LeftResolved, RightResolved: TPasResolverResult;
   LeftResolved, RightResolved: TPasResolverResult;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
 begin
   if (Bin.OpCode=eopSubIdent)
   if (Bin.OpCode=eopSubIdent)
   or ((Bin.OpCode=eopNone) and (Bin.left is TInheritedExpr)) then
   or ((Bin.OpCode=eopNone) and (Bin.left is TInheritedExpr)) then
@@ -12958,11 +12994,36 @@ begin
     exit;
     exit;
     end;
     end;
 
 
-  ComputeElement(Bin.left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
-  ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
-  // ToDo: check operator overloading
+  if Bin.OpCode=eopAdd then
+    begin
+    // handle multi-adds without stack
+    Left:=Bin.left;
+    while Left.ClassType=TBinaryExpr do
+      begin
+      SubBin:=TBinaryExpr(Left);
+      if SubBin.OpCode<>eopAdd then break;
+      Left:=SubBin.left;
+      end;
+    // Left is now left-most of multi add
+    ComputeElement(Left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
+    repeat
+      SubBin:=TBinaryExpr(Left.Parent);
+      ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
 
 
-  ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
+      // ToDo: check operator overloading
+      ComputeBinaryExprRes(SubBin,ResolvedEl,Flags,LeftResolved,RightResolved);
+      LeftResolved:=ResolvedEl;
+      Left:=SubBin;
+    until Left=Bin;
+    end
+  else
+    begin
+    ComputeElement(Bin.left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
+    ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
+
+    // ToDo: check operator overloading
+    ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
+    end;
 end;
 end;
 
 
 procedure TPasResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
 procedure TPasResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
@@ -29623,6 +29684,37 @@ begin
   Result:=true;
   Result:=true;
 end;
 end;
 
 
+function TPasResolver.IsAnonymousElType(El: TPasType): boolean;
+// e.g. b$a$a
+var
+  aName: String;
+  i, l: SizeInt;
+  j: Integer;
+begin
+  Result:=false;
+  if AnonymousElTypePostfix='' then exit;
+  aName:=El.Name;
+  l:=length(AnonymousElTypePostfix);
+  i:=length(aName);
+  repeat
+    dec(i,l);
+    if i>0 then
+      begin
+      j:=i;
+      while (j<=l) and (aName[i+j]=AnonymousElTypePostfix[j]) do inc(j);
+      if j>l then
+        begin
+        Result:=true;
+        continue;
+        end;
+      end;
+    if not Result then exit; // no postfix
+    // at least one anonymous eltype postfix
+    Result:=IsValidIdent(LeftStr(aName,i+l));
+    exit;
+  until false;
+end;
+
 function TPasResolver.GetActualBaseType(bt: TResolverBaseType
 function TPasResolver.GetActualBaseType(bt: TResolverBaseType
   ): TResolverBaseType;
   ): TResolverBaseType;
 begin
 begin

+ 26 - 3
packages/fcl-passrc/src/pastree.pp

@@ -5873,7 +5873,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-
 constructor TBinaryExpr.Create(AParent : TPasElement; xleft,xright:TPasExpr; AOpCode:TExprOpCode);
 constructor TBinaryExpr.Create(AParent : TPasElement; xleft,xright:TPasExpr; AOpCode:TExprOpCode);
 begin
 begin
   inherited Create(AParent,pekBinary, AOpCode);
   inherited Create(AParent,pekBinary, AOpCode);
@@ -5893,9 +5892,33 @@ begin
 end;
 end;
 
 
 destructor TBinaryExpr.Destroy;
 destructor TBinaryExpr.Destroy;
+var
+  El: TPasExpr;
+  SubBin: TBinaryExpr;
 begin
 begin
-  ReleaseAndNil(TPasElement(left){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
-  ReleaseAndNil(TPasElement(right){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.right'{$ENDIF});
+  // handle left of binary chains without stack
+  El:=Left;
+  while El is TBinaryExpr do
+    begin
+    SubBin:=TBinaryExpr(El);
+    El:=SubBin.left;
+    if (El=nil) or (El.Parent<>SubBin) then
+      begin
+      El:=SubBin;
+      break;
+      end;
+    end;
+
+  repeat
+    if El=left then
+      SubBin:=Self
+    else
+      SubBin:=TBinaryExpr(El.Parent);
+    ReleaseAndNil(TPasElement(SubBin.left){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
+    ReleaseAndNil(TPasElement(SubBin.right){$IFDEF CheckPasTreeRefCount},'TBinaryExpr.left'{$ENDIF});
+    El:=SubBin;
+  until El=Self;
+
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 

+ 25 - 2
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1711,6 +1711,8 @@ var
   Decl: TPasElement;
   Decl: TPasElement;
   ModScope: TPasModuleScope;
   ModScope: TPasModuleScope;
   Access: TResolvedRefAccess;
   Access: TResolvedRefAccess;
+  Bin: TBinaryExpr;
+  Left: TPasExpr;
 begin
 begin
   if El=nil then exit;
   if El=nil then exit;
   // Note: expression itself is not marked, but it can reference identifiers
   // Note: expression itself is not marked, but it can reference identifiers
@@ -1792,8 +1794,29 @@ begin
     // ok
     // ok
   else if C=TBinaryExpr then
   else if C=TBinaryExpr then
     begin
     begin
-    UseExpr(TBinaryExpr(El).left);
-    UseExpr(TBinaryExpr(El).right);
+    Bin:=TBinaryExpr(El);
+    if Bin.OpCode=eopAdd then
+      begin
+      // handle multi add expressions without stack
+      Left:=Bin;
+      while Left.ClassType=TBinaryExpr do
+        begin
+        Bin:=TBinaryExpr(Left);
+        if Bin.OpCode<>eopAdd then break;
+        Left:=Bin.left;
+        end;
+      UseExpr(Left);
+      repeat
+        Bin:=TBinaryExpr(Left.Parent);
+        UseExpr(Bin.right);
+        Left:=Bin;
+      until Left=El;
+      end
+    else
+      begin
+      UseExpr(Bin.left);
+      UseExpr(Bin.right);
+      end;
     end
     end
   else if C=TUnaryExpr then
   else if C=TUnaryExpr then
     UseExpr(TUnaryExpr(El).Operand)
     UseExpr(TUnaryExpr(El).Operand)

+ 1 - 0
packages/fcl-process/src/win/process.inc

@@ -285,6 +285,7 @@ Var
         Raise EProcess.CreateFmt(SErrCannotExecute,[FCommandLine,GetLastError]);
         Raise EProcess.CreateFmt(SErrCannotExecute,[FCommandLine,GetLastError]);
       FProcessHandle:=FProcessInformation.hProcess;
       FProcessHandle:=FProcessInformation.hProcess;
       FThreadHandle:=FProcessInformation.hThread;
       FThreadHandle:=FProcessInformation.hThread;
+      FThreadId:=FProcessInformation.dwThreadId;  
       FProcessID:=FProcessINformation.dwProcessID;
       FProcessID:=FProcessINformation.dwProcessID;
     Finally
     Finally
       if POUsePipes in Options then
       if POUsePipes in Options then

+ 5 - 0
packages/odbc/src/odbcsql.inc

@@ -1217,6 +1217,7 @@ type   TSQLFetch=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extd
 
 
 type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
 type   TSQLNumResultCols=function (StatementHandle:SQLHSTMT;
            var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
            var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
+type   TSQLMoreResults=function (StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};
 
 
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
 type   TSQLDescribeCol=function (StatementHandle:SQLHSTMT;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
            ColumnNumber:SQLUSMALLINT;ColumnName:PSQLCHAR;
@@ -1444,6 +1445,7 @@ var    SQLCloseCursor:TSQLCloseCursor;
 var    SQLExecute:TSQLExecute;
 var    SQLExecute:TSQLExecute;
 var    SQLFetch:TSQLFetch;
 var    SQLFetch:TSQLFetch;
 var    SQLNumResultCols:TSQLNumResultCols;
 var    SQLNumResultCols:TSQLNumResultCols;
+var    SQLMoreResults:TSQLMoreResults;
 var    SQLDescribeColA:TSQLDescribeCol;
 var    SQLDescribeColA:TSQLDescribeCol;
        SQLDescribeColW:TSQLDescribeColW;
        SQLDescribeColW:TSQLDescribeColW;
 var    SQLFetchScroll:TSQLFetchScroll;
 var    SQLFetchScroll:TSQLFetchScroll;
@@ -1608,6 +1610,8 @@ var
    function SQLNumResultCols(
    function SQLNumResultCols(
                StatementHandle:SQLHSTMT;
                StatementHandle:SQLHSTMT;
                var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
                var ColumnCount:SQLSMALLINT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
+   function SQLMoreResults(
+               StatementHandle:SQLHSTMT):SQLRETURN;{$ifdef fpc} extdecl {$else} stdcall {$endif};external odbclib;
    function SQLDescribeCol(
    function SQLDescribeCol(
                StatementHandle:SQLHSTMT;
                StatementHandle:SQLHSTMT;
                ColumnNumber:SQLUSMALLINT;
                ColumnNumber:SQLUSMALLINT;
@@ -1918,6 +1922,7 @@ begin
     pointer(SQLExecute) := GetProcedureAddress(ODBCLibraryHandle,'SQLExecute');
     pointer(SQLExecute) := GetProcedureAddress(ODBCLibraryHandle,'SQLExecute');
     pointer(SQLFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetch');
     pointer(SQLFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetch');
     pointer(SQLNumResultCols) := GetProcedureAddress(ODBCLibraryHandle,'SQLNumResultCols');
     pointer(SQLNumResultCols) := GetProcedureAddress(ODBCLibraryHandle,'SQLNumResultCols');
+    pointer(SQLMoreResults) := GetProcedureAddress(ODBCLibraryHandle,'SQLMoreResults');
     pointer(SQLFetchScroll) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetchScroll');
     pointer(SQLFetchScroll) := GetProcedureAddress(ODBCLibraryHandle,'SQLFetchScroll');
     pointer(SQLExtendedFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLExtendedFetch');
     pointer(SQLExtendedFetch) := GetProcedureAddress(ODBCLibraryHandle,'SQLExtendedFetch');
     pointer(SQLGetData) := GetProcedureAddress(ODBCLibraryHandle,'SQLGetData');
     pointer(SQLGetData) := GetProcedureAddress(ODBCLibraryHandle,'SQLGetData');

+ 278 - 96
packages/pastojs/src/fppas2js.pp

@@ -555,6 +555,7 @@ type
     pbifnArray_ConcatN,
     pbifnArray_ConcatN,
     pbifnArray_Copy,
     pbifnArray_Copy,
     pbifnArray_Equal,
     pbifnArray_Equal,
+    pbifnArray_Insert,
     pbifnArray_Length,
     pbifnArray_Length,
     pbifnArray_Reference,
     pbifnArray_Reference,
     pbifnArray_SetLength,
     pbifnArray_SetLength,
@@ -743,6 +744,7 @@ const
     'arrayConcatN', // rtl.arrayConcatN   pbifnArray_ConcatN
     'arrayConcatN', // rtl.arrayConcatN   pbifnArray_ConcatN
     'arrayCopy', // rtl.arrayCopy      pbifnArray_Copy
     'arrayCopy', // rtl.arrayCopy      pbifnArray_Copy
     'arrayEq', // rtl.arrayEq          pbifnArray_Equal
     'arrayEq', // rtl.arrayEq          pbifnArray_Equal
+    'arrayInsert', // rtl.arrayCopy      pbifnArray_Insert
     'length', // rtl.length    pbifnArray_Length
     'length', // rtl.length    pbifnArray_Length
     'arrayRef', // rtl.arrayRef  pbifnArray_Reference
     'arrayRef', // rtl.arrayRef  pbifnArray_Reference
     'arraySetLength', // rtl.arraySetLength  pbifnArray_SetLength
     'arraySetLength', // rtl.arraySetLength  pbifnArray_SetLength
@@ -2160,6 +2162,7 @@ type
     Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
     Function CreateRTTIMemberProperty(Members: TFPList; Index: integer;
       AContext: TConvertContext): TJSElement; virtual;
       AContext: TConvertContext): TJSElement; virtual;
     Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual; // needed by precompiled files from 2.0.0
     Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual; // needed by precompiled files from 2.0.0
+    Function CreateRTTIAnonymousArray(El: TPasArrayType; AContext: TConvertContext): TJSCallExpression; virtual;
     Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
     Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements;
       FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
       FuncContext: TFunctionContext; MembersSrc: TJSSourceElements;
       MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
       MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement;
@@ -2261,6 +2264,7 @@ type
     Function ConvertBinaryExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertBinaryExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertBinaryExpressionRes(El: TBinaryExpr; AContext: TConvertContext;
     Function ConvertBinaryExpressionRes(El: TBinaryExpr; AContext: TConvertContext;
       const LeftResolved, RightResolved: TPasResolverResult; var A,B: TJSElement): TJSElement; virtual;
       const LeftResolved, RightResolved: TPasResolverResult; var A,B: TJSElement): TJSElement; virtual;
+    function ConvertBinaryExpressionMultiAdd(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertSubIdentExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertSubIdentExpression(El: TBinaryExpr; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertSubIdentExprCustom(El: TBinaryExpr; AContext: TConvertContext;
     Function ConvertSubIdentExprCustom(El: TBinaryExpr; AContext: TConvertContext;
       const OnConvertRight: TConvertJSEvent = nil; Data: Pointer = nil): TJSElement; virtual;
       const OnConvertRight: TConvertJSEvent = nil; Data: Pointer = nil): TJSElement; virtual;
@@ -7575,8 +7579,11 @@ var
   i: Integer;
   i: Integer;
 begin
 begin
   for i:=0 to length(PrecompiledVars)-1 do
   for i:=0 to length(PrecompiledVars)-1 do
-    if PrecompiledVars[i].Name=aName then
-      exit(PrecompiledVars[i]);
+    begin
+    Result:=PrecompiledVars[i];
+    if Result.Name=aName then
+      exit;
+    end;
   if not WithParents then
   if not WithParents then
     exit(nil);
     exit(nil);
   Result:=inherited FindPrecompiledVar(aName,WithParents);
   Result:=inherited FindPrecompiledVar(aName,WithParents);
@@ -7588,8 +7595,11 @@ var
   i: Integer;
   i: Integer;
 begin
 begin
   for i:=0 to length(PrecompiledVars)-1 do
   for i:=0 to length(PrecompiledVars)-1 do
-    if PrecompiledVars[i].Element=El then
-      exit(PrecompiledVars[i]);
+    begin
+    Result:=PrecompiledVars[i];
+    if Result.Element=El then
+      exit;
+    end;
   if not WithParents then
   if not WithParents then
     exit(nil);
     exit(nil);
   Result:=inherited FindPrecompiledVar(El, WithParents);
   Result:=inherited FindPrecompiledVar(El, WithParents);
@@ -7622,6 +7632,7 @@ function TFunctionContext.AddLocalVar(aName: string; El: TPasElement;
 var
 var
   l: Integer;
   l: Integer;
   Ident, V: TFCLocalIdentifier;
   Ident, V: TFCLocalIdentifier;
+  PV: TPas2JSStoredLocalVar;
 begin
 begin
   Ident:=FindLocalVar(aName,true);
   Ident:=FindLocalVar(aName,true);
   if Ident<>nil then
   if Ident<>nil then
@@ -7643,7 +7654,15 @@ begin
         raise EPas2JS.Create('[20200608131330] "'+aName+'" El='+GetObjPath(El));
         raise EPas2JS.Create('[20200608131330] "'+aName+'" El='+GetObjPath(El));
         end;
         end;
       end;
       end;
+    end
+  else if aKind=cvkGlobal then
+    begin
+    // check precompiled names
+    PV:=FindPrecompiledVar(El,true);
+    if PV<>nil then
+      aName:=PV.Name;
     end;
     end;
+  // add
   l:=length(LocalVars);
   l:=length(LocalVars);
   SetLength(LocalVars,l+1);
   SetLength(LocalVars,l+1);
   Result:=TFCLocalIdentifier.Create(aName,El,aKind);
   Result:=TFCLocalIdentifier.Create(aName,El,aKind);
@@ -8787,6 +8806,11 @@ begin
   aResolver:=AContext.Resolver;
   aResolver:=AContext.Resolver;
 
 
   case El.OpCode of
   case El.OpCode of
+  eopAdd:
+    begin
+    Result:=ConvertBinaryExpressionMultiAdd(El,aContext);
+    exit;
+    end;
   eopSubIdent:
   eopSubIdent:
     begin
     begin
     Result:=ConvertSubIdentExpression(El,AContext);
     Result:=ConvertSubIdentExpression(El,AContext);
@@ -8803,9 +8827,10 @@ begin
   OldAccess:=AContext.Access;
   OldAccess:=AContext.Access;
   AContext.Access:=caRead;
   AContext.Access:=caRead;
   Call:=nil;
   Call:=nil;
-  A:=ConvertExpression(El.left,AContext);
+  A:=nil;
   B:=nil;
   B:=nil;
   try
   try
+    A:=ConvertExpression(El.left,AContext);
     B:=ConvertExpression(El.right,AContext);
     B:=ConvertExpression(El.right,AContext);
 
 
     if aResolver<>nil then
     if aResolver<>nil then
@@ -9677,6 +9702,103 @@ begin
     end;
     end;
 end;
 end;
 
 
+function TPasToJSConverter.ConvertBinaryExpressionMultiAdd(El: TBinaryExpr;
+  AContext: TConvertContext): TJSElement;
+// handle multi add without stack
+// Note: The parser generates a list of TBinaryExpr.Lefts
+var
+  aResolver: TPas2JSResolver;
+  Left: TPasExpr;
+  SubBin: TBinaryExpr;
+  A, B: TJSElement;
+  LeftResolved, RightResolved, ResultResolved: TPasResolverResult;
+  Flags: TPasResolverComputeFlags;
+  R: TJSBinary;
+  OldAccess: TCtxAccess;
+begin
+  Result:=nil;
+  aResolver:=AContext.Resolver;
+  Left:=El;
+  while Left.ClassType=TBinaryExpr do
+    begin
+    SubBin:=TBinaryExpr(Left);
+    if SubBin.OpCode<>eopAdd then break;
+    Left:=SubBin.left;
+    if Left.Parent<>SubBin then
+      begin
+      if aResolver<>nil then
+        RaiseNotSupported(SubBin,AContext,20210321220458)
+      else if Left.Parent=nil then
+        Left.Parent:=SubBin
+      else
+        RaiseNotSupported(SubBin,AContext,20210321221135);
+      end;
+    end;
+  if Left=El then
+    RaiseNotSupported(El,AContext,20210321221047);
+  OldAccess:=AContext.Access;
+  AContext.Access:=caRead;
+  A:=nil;
+  B:=nil;
+  try
+    A:=ConvertExpression(Left,AContext);
+    Flags:=[];
+    if aResolver<>nil then
+      aResolver.ComputeElement(Left,LeftResolved,Flags);
+    repeat
+      SubBin:=TBinaryExpr(Left.Parent);
+      B:=ConvertExpression(SubBin.right,AContext);
+      if aResolver<>nil then
+        begin
+        aResolver.ComputeElement(El.right,RightResolved,Flags);
+        Result:=ConvertBinaryExpressionRes(SubBin,AContext,LeftResolved,RightResolved,A,B);
+        if (Result<>nil) then
+          begin
+          A:=nil;
+          B:=nil;
+          if SubBin=El then exit;
+          end;
+        aResolver.ComputeBinaryExprRes(SubBin,ResultResolved,Flags,LeftResolved,RightResolved);
+        end;
+      if Result=nil then
+        begin
+        // +
+        R:=TJSBinary(CreateElement(TJSAdditiveExpressionPlus,El));
+        R.A:=A; A:=nil;
+        R.B:=B; B:=nil;
+        Result:=R;
+
+        if (bsOverflowChecks in AContext.ScannerBoolSwitches) and (aResolver<>nil) then
+          case El.OpCode of
+          eopAdd,eopSubtract:
+            if (LeftResolved.BaseType in btAllJSOverflowAddSubType)
+                or (RightResolved.BaseType in btAllJSOverflowAddSubType) then
+              Result:=CreateOverflowCheckCall(Result,SubBin);
+          eopMultiply:
+            if (LeftResolved.BaseType in btAllJSOverflowMultType)
+                or (RightResolved.BaseType in btAllJSOverflowMultType) then
+              Result:=CreateOverflowCheckCall(Result,SubBin);
+          end;
+
+        if SubBin=El then exit;
+        end;
+      // next
+      A:=Result;
+      Result:=nil;
+      if aResolver<>nil then
+        LeftResolved:=ResultResolved;
+      Left:=SubBin;
+    until false;
+  finally
+    AContext.Access:=OldAccess;
+    if Result=nil then
+      begin
+      A.Free;
+      B.Free;
+      end;
+  end;
+end;
+
 function TPasToJSConverter.ConvertSubIdentExpression(El: TBinaryExpr;
 function TPasToJSConverter.ConvertSubIdentExpression(El: TBinaryExpr;
   AContext: TConvertContext): TJSElement;
   AContext: TConvertContext): TJSElement;
 // connect El.left and El.right with a dot.
 // connect El.left and El.right with a dot.
@@ -14260,6 +14382,8 @@ end;
 
 
 function TPasToJSConverter.ConvertBuiltIn_CopyArray(El: TParamsExpr;
 function TPasToJSConverter.ConvertBuiltIn_CopyArray(El: TParamsExpr;
   AContext: TConvertContext): TJSElement;
   AContext: TConvertContext): TJSElement;
+// convert  copy(Arr,Start,Count)
+//   ->  rtl.arrayCopy(type,Arr,Start,Count)
 var
 var
   Param: TPasExpr;
   Param: TPasExpr;
   ParamResolved, ElTypeResolved: TPasResolverResult;
   ParamResolved, ElTypeResolved: TPasResolverResult;
@@ -14328,25 +14452,32 @@ end;
 
 
 function TPasToJSConverter.ConvertBuiltIn_InsertArray(El: TParamsExpr;
 function TPasToJSConverter.ConvertBuiltIn_InsertArray(El: TParamsExpr;
   AContext: TConvertContext): TJSElement;
   AContext: TConvertContext): TJSElement;
-// procedure insert(item,var array,const position)
-// ->  array.splice(position,0,item);
+// procedure insert(item,var AnArray,const position)
+// ->  AnArray=rtl.arrayInsert(item,AnArray,position);
 var
 var
-  ArrEl: TJSElement;
   Call: TJSCallExpression;
   Call: TJSCallExpression;
+  AssignSt: TJSSimpleAssignStatement;
 begin
 begin
   Result:=nil;
   Result:=nil;
-  Call:=nil;
+  AssignSt:=nil;
   try
   try
+    // AnArray=
+    AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
+    AssignSt.LHS:=ConvertExpression(El.Params[1],AContext);
     Call:=CreateCallExpression(El);
     Call:=CreateCallExpression(El);
-    ArrEl:=ConvertExpression(El.Params[1],AContext);
-    Call.Expr:=CreateDotNameExpr(El,ArrEl,'splice');
-    Call.AddArg(ConvertExpression(El.Params[2],AContext));
-    Call.AddArg(CreateLiteralNumber(El,0));
+    AssignSt.Expr:=Call;
+    // rtl.arrayInsert
+    Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnArray_Insert)]);
+    // param: item
     Call.AddArg(ConvertExpression(El.Params[0],AContext));
     Call.AddArg(ConvertExpression(El.Params[0],AContext));
-    Result:=Call;
+    // param: AnArray
+    Call.AddArg(ConvertExpression(El.Params[1],AContext));
+    // param: position
+    Call.AddArg(ConvertExpression(El.Params[2],AContext));
+    Result:=AssignSt;
   finally
   finally
     if Result=nil then
     if Result=nil then
-      Call.Free;
+      AssignSt.Free;
   end;
   end;
 end;
 end;
 
 
@@ -16501,19 +16632,13 @@ var
 
 
 var
 var
   aResolver: TPas2JSResolver;
   aResolver: TPas2JSResolver;
-  Scope: TPas2JSArrayScope;
-  SpecializeDelay: Boolean;
   AssignSt: TJSSimpleAssignStatement;
   AssignSt: TJSSimpleAssignStatement;
-  CallName, ArrName: String;
-  Obj: TJSObjectLiteral;
-  Prop: TJSObjectLiteralElement;
-  ArrLit: TJSArrayLiteral;
-  Arr: TPasArrayType;
+  ArrName: String;
   Index: Integer;
   Index: Integer;
-  ElTypeHi, ElTypeLo: TPasType;
+  ElTypeLo: TPasType;
   RangeEl: TPasExpr;
   RangeEl: TPasExpr;
   Call: TJSCallExpression;
   Call: TJSCallExpression;
-  RgLen, RangeEnd: TMaxPrecInt;
+  RangeEnd: TMaxPrecInt;
   List: TJSStatementList;
   List: TJSStatementList;
   Func: TJSFunctionDeclarationStatement;
   Func: TJSFunctionDeclarationStatement;
   BodySrc: TJSSourceElements;
   BodySrc: TJSSourceElements;
@@ -16536,9 +16661,6 @@ begin
   writeln('TPasToJSConverter.ConvertArrayType ',GetObjName(El));
   writeln('TPasToJSConverter.ConvertArrayType ',GetObjName(El));
   {$ENDIF}
   {$ENDIF}
 
 
-  Scope:=El.CustomData as TPas2JSArrayScope;
-  SpecializeDelay:=(Scope<>nil) and (SpecializeNeedsDelay(El,AContext));
-
   ProcScope:=nil;
   ProcScope:=nil;
   Src:=nil;
   Src:=nil;
   if AContext.JSElement is TJSSourceElements then
   if AContext.JSElement is TJSSourceElements then
@@ -16636,7 +16758,7 @@ begin
       else
       else
         Result:=ArraySt;
         Result:=ArraySt;
 
 
-      // store precompiled enum type in proc
+      // store precompiled array type in proc
       StorePrecompiledJS(ArraySt);
       StorePrecompiledJS(ArraySt);
 
 
       ArraySt:=nil;
       ArraySt:=nil;
@@ -16648,52 +16770,12 @@ begin
     end;
     end;
     end;
     end;
 
 
-  if HasTypeInfo(El,AContext) then
+  if (not (AContext.PasElement is TPasMembersType)) // rtti of members is added separate
+      and HasTypeInfo(El,AContext) then
     begin
     begin
-    // module.$rtti.$DynArray("name",{...})
-    if length(El.Ranges)>0 then
-      CallName:=GetBIName(pbifnRTTINewStaticArray)
-    else
-      CallName:=GetBIName(pbifnRTTINewDynArray);
-    Call:=CreateRTTINewType(El,CallName,false,AContext,Obj);
+    Call:=nil;
     try
     try
-      ElTypeHi:=aResolver.ResolveAliasType(El.ElType,false);
-      ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
-      if length(El.Ranges)>0 then
-        begin
-        // static array
-        // dims: [dimsize1,dimsize2,...]
-        Prop:=Obj.Elements.AddElement;
-        Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_Dims));
-        ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
-        Prop.Expr:=ArrLit;
-        Arr:=El;
-        Index:=0;
-        repeat
-          RangeEl:=Arr.Ranges[Index];
-          RgLen:=aResolver.GetRangeLength(RangeEl);
-          ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
-          inc(Index);
-          if Index=length(Arr.Ranges) then
-            begin
-            if ElTypeLo.ClassType<>TPasArrayType then
-              break;
-            Arr:=TPasArrayType(ElTypeLo);
-            if length(Arr.Ranges)=0 then
-              RaiseNotSupported(Arr,AContext,20170411222315,'static array of anonymous array');
-            ElTypeHi:=aResolver.ResolveAliasType(Arr.ElType,false);
-            ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
-            Index:=0;
-            end;
-        until false;
-        end;
-      // eltype: ref
-      if not SpecializeDelay then
-        begin
-        Prop:=Obj.Elements.AddElement;
-        Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_ElType));
-        Prop.Expr:=CreateTypeInfoRef(ElTypeHi,AContext,El);
-        end;
+      Call:=CreateRTTIAnonymousArray(El,AContext);
 
 
       if Src<>nil then
       if Src<>nil then
         begin
         begin
@@ -16912,6 +16994,7 @@ begin
         AddToSourceElements(ConstSrcElems,Lit);
         AddToSourceElements(ConstSrcElems,Lit);
         end;
         end;
       end;
       end;
+
     if coShortRefGlobals in Options then
     if coShortRefGlobals in Options then
       CreateGlobalAlias_List(ImplJS.ShortRefs,AContext);
       CreateGlobalAlias_List(ImplJS.ShortRefs,AContext);
     // precompiled body
     // precompiled body
@@ -20001,6 +20084,7 @@ begin
 
 
   JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
   JSTypeInfo:=CreateTypeInfoRef(VarType,AContext,V);
   OptionsEl:=nil;
   OptionsEl:=nil;
+
   // Note: create JSTypeInfo first, it may raise an exception
   // Note: create JSTypeInfo first, it may raise an exception
   Call:=CreateCallExpression(V);
   Call:=CreateCallExpression(V);
   try
   try
@@ -20346,6 +20430,80 @@ begin
     end;
     end;
 end;
 end;
 
 
+function TPasToJSConverter.CreateRTTIAnonymousArray(El: TPasArrayType;
+  AContext: TConvertContext): TJSCallExpression;
+var
+  Scope: TPas2JSArrayScope;
+  SpecializeDelay: Boolean;
+  CallName: String;
+  Call: TJSCallExpression;
+  Obj: TJSObjectLiteral;
+  aResolver: TPas2JSResolver;
+  ElTypeHi, ElTypeLo: TPasType;
+  Prop: TJSObjectLiteralElement;
+  ArrLit: TJSArrayLiteral;
+  Arr: TPasArrayType;
+  Index: Integer;
+  RangeEl: TPasExpr;
+  RgLen: TMaxPrecInt;
+begin
+  Result:=nil;
+  aResolver:=AContext.Resolver;
+
+  Scope:=El.CustomData as TPas2JSArrayScope;
+  SpecializeDelay:=(Scope<>nil) and (SpecializeNeedsDelay(El,AContext));
+
+  // module.$rtti.$DynArray("name",{...})
+  if length(El.Ranges)>0 then
+    CallName:=GetBIName(pbifnRTTINewStaticArray)
+  else
+    CallName:=GetBIName(pbifnRTTINewDynArray);
+  Call:=CreateRTTINewType(El,CallName,false,AContext,Obj);
+  try
+    ElTypeHi:=aResolver.ResolveAliasType(El.ElType,false);
+    ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
+    if length(El.Ranges)>0 then
+      begin
+      // static array
+      // dims: [dimsize1,dimsize2,...]
+      Prop:=Obj.Elements.AddElement;
+      Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_Dims));
+      ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
+      Prop.Expr:=ArrLit;
+      Arr:=El;
+      Index:=0;
+      repeat
+        RangeEl:=Arr.Ranges[Index];
+        RgLen:=aResolver.GetRangeLength(RangeEl);
+        ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
+        inc(Index);
+        if Index=length(Arr.Ranges) then
+          begin
+          if ElTypeLo.ClassType<>TPasArrayType then
+            break;
+          Arr:=TPasArrayType(ElTypeLo);
+          if length(Arr.Ranges)=0 then
+            RaiseNotSupported(Arr,AContext,20170411222315,'static array of anonymous array');
+          ElTypeHi:=aResolver.ResolveAliasType(Arr.ElType,false);
+          ElTypeLo:=aResolver.ResolveAliasType(ElTypeHi);
+          Index:=0;
+          end;
+      until false;
+      end;
+    // eltype: ref
+    if not SpecializeDelay then
+      begin
+      Prop:=Obj.Elements.AddElement;
+      Prop.Name:=TJSString(GetBIName(pbivnRTTIArray_ElType));
+      Prop.Expr:=CreateTypeInfoRef(ElTypeHi,AContext,El);
+      end;
+    Result:=Call;
+  finally
+    if Result=nil then
+      Call.Free;
+  end;
+end;
+
 function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
 function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType;
   Src: TJSSourceElements; FuncContext: TFunctionContext;
   Src: TJSSourceElements; FuncContext: TFunctionContext;
   MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
   MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext;
@@ -20401,35 +20559,51 @@ begin
   Members:=El.Members;
   Members:=El.Members;
   For i:=0 to Members.Count-1 do
   For i:=0 to Members.Count-1 do
     begin
     begin
+    NewEl:=nil;
     P:=TPasElement(Members[i]);
     P:=TPasElement(Members[i]);
     C:=P.ClassType;
     C:=P.ClassType;
-    // check visibility
-    case mt of
-    mtClass:
-      if P.Visibility<>visPublished then continue;
-    mtInterface: ; // all members of an interface are published
-    mtRecord:
-      // a published record publishes all non private members
-      if P.Visibility in [visPrivate,visStrictPrivate] then
-        continue;
-    end;
-    if not IsElementUsed(P) then continue;
-
-    NewEl:=nil;
-    if C=TPasVariable then
-      NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext)
-    else if C.InheritsFrom(TPasProcedure) then
+    writeln('AAA1 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+    if C.InheritsFrom(TPasType) and HasTypeInfo(TPasType(P),MembersFuncContext) then
       begin
       begin
-      if aResolver.GetProcTemplateTypes(TPasProcedure(P))<>nil then
-        continue; // parametrized functions cannot be published
-      NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext);
+        writeln('AAA2 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+      // published subtype
+      if aResolver.IsAnonymousElType(TPasType(P)) then
+        begin
+        // published anonymous eltype
+          writeln('AAA3 TPasToJSConverter.CreateRTTIMembers ',GetObjPath(P));
+        if C.InheritsFrom(TPasArrayType) then
+          NewEl:=CreateRTTIAnonymousArray(TPasArrayType(P),MembersFuncContext);
+        end;
       end
       end
-    else if C=TPasProperty then
-      NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext)
-    else if C.InheritsFrom(TPasType)
-        or (C=TPasAttributes) then
     else
     else
-      DoError(20190105142236,nSymbolCannotBePublished,sSymbolCannotBePublished,[],P);
+      begin
+      // check visibility
+      case mt of
+      mtClass:
+        if P.Visibility<>visPublished then continue;
+      mtInterface: ; // all members of an interface are published
+      mtRecord:
+        // a published record publishes all non private members
+        if P.Visibility in [visPrivate,visStrictPrivate] then
+          continue;
+      end;
+      if not IsElementUsed(P) then continue;
+
+      if C=TPasVariable then
+        NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext)
+      else if C.InheritsFrom(TPasProcedure) then
+        begin
+        if aResolver.GetProcTemplateTypes(TPasProcedure(P))<>nil then
+          continue; // parametrized functions cannot be published
+        NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext);
+        end
+      else if C=TPasProperty then
+        NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext)
+      else if C.InheritsFrom(TPasType)
+          or (C=TPasAttributes) then
+      else
+        DoError(20190105142236,nSymbolCannotBePublished,sSymbolCannotBePublished,[],P);
+      end;
     if NewEl=nil then
     if NewEl=nil then
       continue; // e.g. abstract or external proc
       continue; // e.g. abstract or external proc
     // add RTTI element
     // add RTTI element
@@ -25054,7 +25228,9 @@ var
   Parent: TPasElement;
   Parent: TPasElement;
   CurModule: TPasModule;
   CurModule: TPasModule;
   ElClass: TClass;
   ElClass: TClass;
+  aResolver: TPas2JSResolver;
 begin
 begin
+  aResolver:=AContext.Resolver;
   Result:=AContext.GetLocalName(El,[cvkGlobal]);
   Result:=AContext.GetLocalName(El,[cvkGlobal]);
   if Result<>'' then
   if Result<>'' then
     begin
     begin
@@ -25091,6 +25267,12 @@ begin
         Result:=TransformModuleName(TPasModule(Parent),true,AContext)
         Result:=TransformModuleName(TPasModule(Parent),true,AContext)
       else
       else
         RaiseNotSupported(El,AContext,20200609230526,GetObjPath(El));
         RaiseNotSupported(El,AContext,20200609230526,GetObjPath(El));
+      end
+    else
+      begin
+      // parent has local var
+      if (coStoreImplJS in Options) and (aResolver.GetParentProcBody(Parent)=nil) then
+        StoreImplJSLocal(Parent,AContext);
       end;
       end;
     Result:=Result+'.'+TransformElToJSName(El,AContext);
     Result:=Result+'.'+TransformElToJSName(El,AContext);
     end
     end

+ 1 - 1
packages/pastojs/src/pas2jsfiler.pp

@@ -3806,7 +3806,7 @@ begin
     else if C=TPasDestructor then
     else if C=TPasDestructor then
       Obj.Add('Type','Destructor')
       Obj.Add('Type','Destructor')
     else if C=TPasClassDestructor then
     else if C=TPasClassDestructor then
-      Obj.Add('Type','Class Destructor')
+      Obj.Add('Type','ClassDestructor')
     else if C=TPasAnonymousProcedure then
     else if C=TPasAnonymousProcedure then
       Obj.Add('Type','AnonymousProcedure')
       Obj.Add('Type','AnonymousProcedure')
     else if C=TPasAnonymousFunction then
     else if C=TPasAnonymousFunction then

+ 1 - 1
packages/pastojs/tests/tcgenerics.pas

@@ -486,7 +486,7 @@ begin
     '  };',
     '  };',
     '  this.Alter = function (w) {',
     '  this.Alter = function (w) {',
     '    this.FItems = rtl.arraySetLength(this.FItems, 0, rtl.length(this.FItems) + 1);',
     '    this.FItems = rtl.arraySetLength(this.FItems, 0, rtl.length(this.FItems) + 1);',
-    '    this.FItems.splice(2, 0, w);',
+    '    this.FItems = rtl.arrayInsert(w, this.FItems, 2);',
     '    this.FItems.splice(2, 3);',
     '    this.FItems.splice(2, 3);',
     '  };',
     '  };',
     '}, "TList<System.Word>");',
     '}, "TList<System.Word>");',

+ 84 - 13
packages/pastojs/tests/tcmodules.pas

@@ -406,6 +406,7 @@ type
     Procedure TestLoHiDelphiMode;
     Procedure TestLoHiDelphiMode;
     Procedure TestAssignments;
     Procedure TestAssignments;
     Procedure TestArithmeticOperators1;
     Procedure TestArithmeticOperators1;
+    Procedure TestMultiAdd;
     Procedure TestLogicalOperators;
     Procedure TestLogicalOperators;
     Procedure TestBitwiseOperators;
     Procedure TestBitwiseOperators;
     Procedure TestBitwiseOperatorsLongword;
     Procedure TestBitwiseOperatorsLongword;
@@ -828,6 +829,7 @@ type
     Procedure TestRTTI_Class_PropertyParams;
     Procedure TestRTTI_Class_PropertyParams;
     Procedure TestRTTI_Class_OtherUnit_TypeAlias;
     Procedure TestRTTI_Class_OtherUnit_TypeAlias;
     Procedure TestRTTI_Class_OmitRTTI;
     Procedure TestRTTI_Class_OmitRTTI;
+    Procedure TestRTTI_Class_Field_AnonymousArrayOfSelfClass;
     Procedure TestRTTI_IndexModifier;
     Procedure TestRTTI_IndexModifier;
     Procedure TestRTTI_StoredModifier;
     Procedure TestRTTI_StoredModifier;
     Procedure TestRTTI_DefaultValue;
     Procedure TestRTTI_DefaultValue;
@@ -3308,6 +3310,38 @@ begin
     ]));
     ]));
 end;
 end;
 
 
+procedure TTestModule.TestMultiAdd;
+begin
+  StartProgram(false);
+  Add([
+  'function TryEncodeDate(Year, Month, Day: Word): Boolean;',
+  'var Date: double;',
+  'begin',
+  '  Result:=(Year>0) and (Year<10000) and',
+  '          (Month >= 1) and (Month<=12) and',
+  '          (Day>0) and (Day<=31);',
+  '  Date := (146097*Year) SHR 2 + (1461*Year) SHR 2 + (153*LongWord(Month)+2) DIV 5 + LongWord(Day);',
+  'end;',
+  'var s: string;',
+  'begin',
+  '  s:=''a''+''b''+''c''+''d'';']);
+  ConvertProgram;
+  CheckSource('TestMultiAdd',
+    LinesToStr([ // statements
+    'this.TryEncodeDate = function (Year, Month, Day) {',
+    '  var Result = false;',
+    '  var date = 0.0;',
+    '  Result = (Year > 0) && (Year < 10000) && (Month >= 1) && (Month <= 12) && (Day > 0) && (Day <= 31);',
+    '  date = ((146097 * Year) >>> 2) + ((1461 * Year) >>> 2) + rtl.trunc(((153 * Month) + 2) / 5) + Day;',
+    '  return Result;',
+    '};',
+    'this.s = "";',
+    '']),
+    LinesToStr([ // this.$main
+    '$mod.s = "a" + "b" + "c" + "d";',
+    '']));
+end;
+
 procedure TTestModule.TestLogicalOperators;
 procedure TTestModule.TestLogicalOperators;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -10500,13 +10534,13 @@ begin
     'this.ArrArrInt = [];',
     'this.ArrArrInt = [];',
     '']),
     '']),
     LinesToStr([ // $mod.$main
     LinesToStr([ // $mod.$main
-    '$mod.ArrInt.splice(2, 0, 1);',
-    '$mod.ArrInt.splice(4, 0, $mod.ArrInt[3]);',
-    '$mod.ArrRec.splice(6, 0, $mod.ArrRec[5]);',
-    '$mod.ArrSet.splice(7, 0, $mod.ArrSet[7]);',
-    '$mod.ArrJSValue.splice(9, 0, $mod.ArrJSValue[8]);',
-    '$mod.ArrJSValue.splice(11, 0, 10);',
-    '$mod.ArrArrInt.splice(22, 0, [23]);',
+    '$mod.ArrInt = rtl.arrayInsert(1, $mod.ArrInt, 2);',
+    '$mod.ArrInt = rtl.arrayInsert($mod.ArrInt[3], $mod.ArrInt, 4);',
+    '$mod.ArrRec = rtl.arrayInsert($mod.ArrRec[5], $mod.ArrRec, 6);',
+    '$mod.ArrSet = rtl.arrayInsert($mod.ArrSet[7], $mod.ArrSet, 7);',
+    '$mod.ArrJSValue = rtl.arrayInsert($mod.ArrJSValue[8], $mod.ArrJSValue, 9);',
+    '$mod.ArrJSValue = rtl.arrayInsert(10, $mod.ArrJSValue, 11);',
+    '$mod.ArrArrInt = rtl.arrayInsert([23], $mod.ArrArrInt, 22);',
     '$mod.ArrInt.splice(12, 13);',
     '$mod.ArrInt.splice(12, 13);',
     '$mod.ArrRec.splice(14, 15);',
     '$mod.ArrRec.splice(14, 15);',
     '$mod.ArrSet.splice(17, 18);',
     '$mod.ArrSet.splice(17, 18);',
@@ -29646,9 +29680,6 @@ begin
   CheckSource('TestRTTI_Class_Field',
   CheckSource('TestRTTI_Class_Field',
     LinesToStr([ // statements
     LinesToStr([ // statements
     'rtl.createClass(this, "TObject", null, function () {',
     'rtl.createClass(this, "TObject", null, function () {',
-    '  $mod.$rtti.$DynArray("TObject.ArrB$a", {',
-    '    eltype: rtl.byte',
-    '  });',
     '  this.$init = function () {',
     '  this.$init = function () {',
     '    this.FPropA = "";',
     '    this.FPropA = "";',
     '    this.VarLI = 0;',
     '    this.VarLI = 0;',
@@ -29680,6 +29711,9 @@ begin
     '  $r.addField("VarShI", rtl.shortint);',
     '  $r.addField("VarShI", rtl.shortint);',
     '  $r.addField("VarBy", rtl.byte);',
     '  $r.addField("VarBy", rtl.byte);',
     '  $r.addField("VarExt", rtl.longint);',
     '  $r.addField("VarExt", rtl.longint);',
+    '  $mod.$rtti.$DynArray("TObject.ArrB$a", {',
+    '    eltype: rtl.byte',
+    '  });',
     '  $r.addField("ArrA", $mod.$rtti["TObject.ArrB$a"]);',
     '  $r.addField("ArrA", $mod.$rtti["TObject.ArrB$a"]);',
     '  $r.addField("ArrB", $mod.$rtti["TObject.ArrB$a"]);',
     '  $r.addField("ArrB", $mod.$rtti["TObject.ArrB$a"]);',
     '});',
     '});',
@@ -29949,6 +29983,43 @@ begin
     '']));
     '']));
 end;
 end;
 
 
+procedure TTestModule.TestRTTI_Class_Field_AnonymousArrayOfSelfClass;
+begin
+  WithTypeInfo:=true;
+  StartUnit(true,[supTObject]);
+  Add([
+  'interface',
+  'type',
+  '  {$M+1}',
+  '  TBird = class',
+  '  published',
+  '    Swarm: array of TBird;',
+  '  end;',
+  'implementation',
+  '']);
+  ConvertUnit;
+  CheckSource('TestRTTI_Class_Field_AnonymousArrayOfSelfClass',
+    LinesToStr([ // statements
+    'rtl.createClass(this, "TBird", pas.system.TObject, function () {',
+    '  this.$init = function () {',
+    '    pas.system.TObject.$init.call(this);',
+    '    this.Swarm = [];',
+    '  };',
+    '  this.$final = function () {',
+    '    this.Swarm = undefined;',
+    '    pas.system.TObject.$final.call(this);',
+    '  };',
+    '  var $r = this.$rtti;',
+    '  $mod.$rtti.$DynArray("TBird.Swarm$a", {',
+    '    eltype: $r',
+    '  });',
+    '  $r.addField("Swarm", $mod.$rtti["TBird.Swarm$a"]);',
+    '});',
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
 procedure TTestModule.TestRTTI_IndexModifier;
 procedure TTestModule.TestRTTI_IndexModifier;
 begin
 begin
   WithTypeInfo:=true;
   WithTypeInfo:=true;
@@ -30714,9 +30785,6 @@ begin
   CheckSource('TestRTTI_Record',
   CheckSource('TestRTTI_Record',
     LinesToStr([ // statements
     LinesToStr([ // statements
     'rtl.recNewT(this, "TFloatRec", function () {',
     'rtl.recNewT(this, "TFloatRec", function () {',
-    '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
-    '    eltype: rtl.char',
-    '  });',
     '  this.$new = function () {',
     '  this.$new = function () {',
     '    var r = Object.create(this);',
     '    var r = Object.create(this);',
     '    r.c = [];',
     '    r.c = [];',
@@ -30732,6 +30800,9 @@ begin
     '    return this;',
     '    return this;',
     '  };',
     '  };',
     '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
     '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
+    '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
+    '    eltype: rtl.char',
+    '  });',
     '  $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("c", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
     '  $r.addField("d", $mod.$rtti["TFloatRec.d$a"]);',
     '});',
     '});',

+ 42 - 0
packages/pastojs/tests/tcprecompile.pas

@@ -64,6 +64,7 @@ type
     procedure TestPCU_Class_Constructor;
     procedure TestPCU_Class_Constructor;
     procedure TestPCU_Class_ClassConstructor;
     procedure TestPCU_Class_ClassConstructor;
     procedure TestPCU_ClassInterface;
     procedure TestPCU_ClassInterface;
+    procedure TestPCU_EnumNames;
     procedure TestPCU_Namespace;
     procedure TestPCU_Namespace;
     procedure TestPCU_CheckVersionMain;
     procedure TestPCU_CheckVersionMain;
     procedure TestPCU_CheckVersionMain2;
     procedure TestPCU_CheckVersionMain2;
@@ -135,6 +136,7 @@ begin
     if ExpExitCode=0 then
     if ExpExitCode=0 then
       begin
       begin
       NewSrc:=JSFile.Source;
       NewSrc:=JSFile.Source;
+      //writeln('TCustomTestCLI_Precompile.CheckPrecompile ',NewSrc);
       if not CheckSrcDiff(OrigSrc,NewSrc,s) then
       if not CheckSrcDiff(OrigSrc,NewSrc,s) then
         begin
         begin
         WriteSources;
         WriteSources;
@@ -510,6 +512,46 @@ begin
   CheckPrecompile('test1.pas','src');
   CheckPrecompile('test1.pas','src');
 end;
 end;
 
 
+procedure TTestCLI_Precompile.TestPCU_EnumNames;
+var
+  SharedParams: TStringList;
+begin
+  AddUnit('src/system.pp',[
+    'type integer = longint;',
+    '  TObject = class end;',
+    'procedure Writeln; varargs;'],
+    ['procedure Writeln; begin end;']);
+  AddUnit('src/unit1.pp',
+  ['type',
+  '  TEnum = (red,green,blue);',
+   '  TBird = class ',
+   '  private',
+   '    Color: TEnum;',
+   '  public',
+   '    procedure Fly;',
+   '    procedure Run;',
+   '  end;',
+   ''],
+  ['procedure TBird.Fly;',
+   'begin',
+   '  Color:=blue;',
+   'end;',
+   'procedure TBird.Run;',
+   'begin',
+   '  Color:=green;',
+   'end;']);
+  AddFile('test1.pas',[
+    'uses unit1;',
+    'var b: TBird;',
+    'begin',
+    '  b.Fly();',
+    '  b.Run();',
+    'end.']);
+  SharedParams:=TStringList.Create;
+  SharedParams.Add('-OoEnumNumbers-');
+  CheckPrecompile('test1.pas','src',SharedParams);
+end;
+
 procedure TTestCLI_Precompile.TestPCU_Namespace;
 procedure TTestCLI_Precompile.TestPCU_Namespace;
 begin
 begin
   AddUnit('src/system.pp',[
   AddUnit('src/system.pp',[

+ 1 - 1
packages/qlunits/fpmake.pp

@@ -13,7 +13,7 @@ begin
 {$endif ALLPACKAGES}
 {$endif ALLPACKAGES}
 
 
     P:=AddPackage('qlunits');
     P:=AddPackage('qlunits');
-    P.ShortName := 'qlunits';
+    P.ShortName := 'qlun';
 
 
     P.Author := 'FPC core team';
     P.Author := 'FPC core team';
     P.License := 'LGPL with modification';
     P.License := 'LGPL with modification';

+ 5 - 5
packages/qlunits/src/qlfloat.pas

@@ -104,16 +104,16 @@ asm
 
 
 @setmant:
 @setmant:
   move.l  d1,(a0)         { copy into mantissa }
   move.l  d1,(a0)         { copy into mantissa }
-@fin:
-  movem.l (sp)+,d2-d4/a0  { reset register variables and return value }
-  rts
+  bra     @fin
 
 
 { quick exit if zero }
 { quick exit if zero }
-
 @zeroval:
 @zeroval:
   move.w  d2,(a0)+        { zero exponent }
   move.w  d2,(a0)+        { zero exponent }
   move.l  d2,(a0)         { zero mantissa }
   move.l  d2,(a0)         { zero mantissa }
-  bra     @fin
+
+@fin:
+  movem.l (sp)+,d2-d4/a0  { reset register variables and return value }
+  move.l  a0,d0           { copy return value into d0 as well }
 end;
 end;
 
 
 
 

+ 34 - 9
packages/regexpr/src/regexpr.pas

@@ -1615,40 +1615,65 @@ end; { of function TRegExpr.GetModifierStr
 
 
 procedure TRegExpr.SetModifierG(AValue: boolean);
 procedure TRegExpr.SetModifierG(AValue: boolean);
 begin
 begin
-  fModifiers.G := AValue;
+  if fModifiers.G <> AValue then
+  begin
+    fModifiers.G := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierI(AValue: boolean);
 procedure TRegExpr.SetModifierI(AValue: boolean);
 begin
 begin
-  fModifiers.I := AValue;
+  if fModifiers.I <> AValue then
+  begin
+    fModifiers.I := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierM(AValue: boolean);
 procedure TRegExpr.SetModifierM(AValue: boolean);
 begin
 begin
-  fModifiers.M := AValue;
+  if fModifiers.M <> AValue then
+  begin
+    fModifiers.M := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierR(AValue: boolean);
 procedure TRegExpr.SetModifierR(AValue: boolean);
 begin
 begin
-  fModifiers.R := AValue;
+  if fModifiers.R <> AValue then
+  begin
+    fModifiers.R := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierS(AValue: boolean);
 procedure TRegExpr.SetModifierS(AValue: boolean);
 begin
 begin
-  fModifiers.S := AValue;
+  if fModifiers.S <> AValue then
+  begin
+    fModifiers.S := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierX(AValue: boolean);
 procedure TRegExpr.SetModifierX(AValue: boolean);
 begin
 begin
-  fModifiers.X := AValue;
+  if fModifiers.X <> AValue then
+  begin
+    fModifiers.X := AValue;
+    InvalidateProgramm;
+  end;
 end;
 end;
 
 
 procedure TRegExpr.SetModifierStr(const AStr: RegExprString);
 procedure TRegExpr.SetModifierStr(const AStr: RegExprString);
 begin
 begin
-  if not ParseModifiers(PRegExprChar(AStr), Length(AStr), fModifiers) then
+  if ParseModifiers(PRegExprChar(AStr), Length(AStr), fModifiers) then
+    InvalidateProgramm
+  else
     Error(reeModifierUnsupported);
     Error(reeModifierUnsupported);
-end; { of procedure TRegExpr.SetModifierStr
-  -------------------------------------------------------------- }
+end;
 
 
 { ============================================================= }
 { ============================================================= }
 { ==================== Compiler section ======================= }
 { ==================== Compiler section ======================= }

+ 3 - 3
packages/rtl-generics/src/generics.defaults.pas

@@ -2163,7 +2163,7 @@ var
   LInstance: PInstance;
   LInstance: PInstance;
 begin
 begin
   if ATypeInfo = nil then
   if ATypeInfo = nil then
-    Exit(SelectBinaryComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryComparer(Nil, ASize))
   else
   else
   begin
   begin
     LInstance := @ComparerInstances[ATypeInfo.Kind];
     LInstance := @ComparerInstances[ATypeInfo.Kind];
@@ -2279,7 +2279,7 @@ var
   LSelectMethod: TSelectMethod;
   LSelectMethod: TSelectMethod;
 begin
 begin
   if ATypeInfo = nil then
   if ATypeInfo = nil then
-    Exit(SelectBinaryEqualityComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryEqualityComparer(Nil, ASize))
   else
   else
   begin
   begin
     LInstance := @FEqualityComparerInstances[ATypeInfo.Kind];
     LInstance := @FEqualityComparerInstances[ATypeInfo.Kind];
@@ -2492,7 +2492,7 @@ var
   LSelectMethod: TSelectMethod;
   LSelectMethod: TSelectMethod;
 begin
 begin
   if ATypeInfo = nil then
   if ATypeInfo = nil then
-    Exit(SelectBinaryEqualityComparer(GetTypeData(ATypeInfo), ASize))
+    Exit(SelectBinaryEqualityComparer(Nil, ASize))
   else
   else
   begin
   begin
     LInstance := @FExtendedEqualityComparerInstances[ATypeInfo.Kind];
     LInstance := @FExtendedEqualityComparerInstances[ATypeInfo.Kind];

+ 6 - 6
packages/rtl-objpas/src/inc/strutils.pp

@@ -177,14 +177,14 @@ function DelSpace1(const S: string): string;
 function Tab2Space(const S: string; Numb: Byte): string;
 function Tab2Space(const S: string; Numb: Byte): string;
 function NPos(const C: string; S: string; N: Integer): SizeInt;
 function NPos(const C: string; S: string; N: Integer): SizeInt;
 
 
-Function RPosEX(C:char;const S : AnsiString;offs:cardinal):SizeInt; overload;
-Function RPosex (Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : SizeInt; overload;
+Function RPosEx(C:char;const S : AnsiString;offs:cardinal):SizeInt; overload;
+Function RPosEx(C:Unicodechar;const S : UnicodeString;offs:cardinal):SizeInt; overload;
+Function RPosEx(Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : SizeInt; overload;
+Function RPosEx(Const Substr : UnicodeString; Const Source : UnicodeString;offs:cardinal) : SizeInt; overload;
 Function RPos(c:char;const S : AnsiString):SizeInt; overload;
 Function RPos(c:char;const S : AnsiString):SizeInt; overload;
-Function RPos (Const Substr : AnsiString; Const Source : AnsiString) : SizeInt; overload;
-Function RPosEX(C:Unicodechar;const S : UnicodeString;offs:cardinal):SizeInt; overload;
-Function RPosex (Const Substr : UnicodeString; Const Source : UnicodeString;offs:cardinal) : SizeInt; overload;
 Function RPos(c:Unicodechar;const S : UnicodeString):SizeInt; overload;
 Function RPos(c:Unicodechar;const S : UnicodeString):SizeInt; overload;
-Function RPos (Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt; overload;
+Function RPos(Const Substr : AnsiString; Const Source : AnsiString) : SizeInt; overload;
+Function RPos(Const Substr : UnicodeString; Const Source : UnicodeString) : SizeInt; overload;
 
 
 function AddChar(C: Char; const S: string; N: Integer): string;
 function AddChar(C: Char; const S: string; N: Integer): string;
 function AddCharR(C: Char; const S: string; N: Integer): string;
 function AddCharR(C: Char; const S: string; N: Integer): string;

+ 2 - 2
packages/rtl-objpas/src/inc/variants.pp

@@ -4129,7 +4129,7 @@ begin
         if not DoProcedure(Source,method_name,args) then
         if not DoProcedure(Source,method_name,args) then
         // may be function?
         // may be function?
         try
         try
-          variant(dummy_data) := Unassigned;
+          dummy_data.VType := varEmpty;
           if not DoFunction(dummy_data,Source,method_name,args) then
           if not DoFunction(dummy_data,Source,method_name,args) then
             RaiseDispError;
             RaiseDispError;
         finally
         finally
@@ -4482,7 +4482,7 @@ Var
 begin
 begin
   case (PropInfo^.PropProcs shr 2) and 3 of
   case (PropInfo^.PropProcs shr 2) and 3 of
     ptfield:
     ptfield:
-      PVariant(Pointer(Instance)+PtrUInt(PropInfo^.SetProc))^:=Value;	
+      PVariant(Pointer(Instance)+PtrUInt(PropInfo^.SetProc))^:=Value;
     ptVirtual,ptStatic:
     ptVirtual,ptStatic:
       begin
       begin
         if ((PropInfo^.PropProcs shr 2) and 3)=ptStatic then
         if ((PropInfo^.PropProcs shr 2) and 3)=ptStatic then

+ 1 - 1
rtl/amicommon/paramhandling.inc

@@ -116,7 +116,7 @@ begin
   Count := 0;
   Count := 0;
   { first index is one }
   { first index is one }
   LocalIndex := 1;
   LocalIndex := 1;
-  while (P[Count] <> #0) do
+  while assigned(P) and (P[Count] <> #0) do
   begin
   begin
     while (p[count]=' ') or (p[count]=#9) or (p[count]=LineEnding) do
     while (p[count]=' ') or (p[count]=#9) or (p[count]=LineEnding) do
       Inc(count);
       Inc(count);

+ 2 - 1
rtl/embedded/Makefile

@@ -378,7 +378,8 @@ CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl
 CPU_UNITS_DEFINED=1
 CPU_UNITS_DEFINED=1
 endif
 endif
 ifeq ($(SUBARCH),armv7em)
 ifeq ($(SUBARCH),armv7em)
-CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 \
+samd51p19a # thumb2_bare
 CPU_UNITS_DEFINED=1
 CPU_UNITS_DEFINED=1
 endif
 endif
 ifeq ($(SUBARCH),armv4t)
 ifeq ($(SUBARCH),armv4t)

+ 2 - 1
rtl/embedded/Makefile.fpc

@@ -75,7 +75,8 @@ CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl
 CPU_UNITS_DEFINED=1
 CPU_UNITS_DEFINED=1
 endif
 endif
 ifeq ($(SUBARCH),armv7em)
 ifeq ($(SUBARCH),armv7em)
-CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 # thumb2_bare
+CPU_UNITS=lm4f120 xmc4500 mk20d5 mk20d7 mk22f51212 mk64f12 stm32f401xx stm32f407xx stm32f411xe stm32f429xx stm32f446xx stm32f745 stm32f746 stm32f756 nrf52 cortexm3 cortexm4 cortexm7 \
+samd51p19a # thumb2_bare
 CPU_UNITS_DEFINED=1
 CPU_UNITS_DEFINED=1
 endif
 endif
 ifeq ($(SUBARCH),armv4t)
 ifeq ($(SUBARCH),armv4t)

+ 2093 - 0
rtl/embedded/arm/samd51p19a.pp

@@ -0,0 +1,2093 @@
+unit samd51p19a;
+(*
+  Copyright (c) 2020 Microchip Technology Inc.
+                   
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the Licence at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*)
+
+interface
+{$PACKRECORDS C}
+{$GOTO ON}
+{$SCOPEDENUMS ON}
+{$DEFINE INTERFACE}
+{$UNDEF IMPLEMENTATION}
+{$DEFINE __CORTEXM4}
+{$DEFINE __NVIC_PRIO_BITS3 }
+
+const
+  __FPU_PRESENT=1;
+  __MPU_PRESENT=1;
+  __NVIC_PRIO_BITS=3;
+
+type
+  TIRQn_Enum = (
+    NonMaskableInt_IRQn       = -14,
+    HardFault_IRQn            = -13,
+    MemoryManagement_IRQn     = -12,
+    BusFault_IRQn             = -11,
+    UsageFault_IRQn           = -10,
+    SVCall_IRQn               = -5,
+    DebugMonitor_IRQn         = -4,
+    PendSV_IRQn               = -2,
+    SysTick_IRQn              = -1,
+    PM_IRQn                   = 0,
+    MCLK_IRQn                 = 1,
+    OSCCTRL_0_IRQn            = 2,
+    OSCCTRL_1_IRQn            = 3,
+    OSCCTRL_2_IRQn            = 4,
+    OSCCTRL_3_IRQn            = 5,
+    OSCCTRL_4_IRQn            = 6,
+    OSC32KCTRL_IRQn           = 7,
+    SUPC_0_IRQn               = 8,
+    SUPC_1_IRQn               = 9,
+    WDT_IRQn                  = 10,
+    RTC_IRQn                  = 11,
+    EIC_0_IRQn                = 12,
+    EIC_1_IRQn                = 13,
+    EIC_2_IRQn                = 14,
+    EIC_3_IRQn                = 15,
+    EIC_4_IRQn                = 16,
+    EIC_5_IRQn                = 17,
+    EIC_6_IRQn                = 18,
+    EIC_7_IRQn                = 19,
+    EIC_8_IRQn                = 20,
+    EIC_9_IRQn                = 21,
+    EIC_10_IRQn               = 22,
+    EIC_11_IRQn               = 23,
+    EIC_12_IRQn               = 24,
+    EIC_13_IRQn               = 25,
+    EIC_14_IRQn               = 26,
+    EIC_15_IRQn               = 27,
+    FREQM_IRQn                = 28,
+    NVMCTRL_0_IRQn            = 29,
+    NVMCTRL_1_IRQn            = 30,
+    DMAC_0_IRQn               = 31,
+    DMAC_1_IRQn               = 32,
+    DMAC_2_IRQn               = 33,
+    DMAC_3_IRQn               = 34,
+    DMAC_4_IRQn               = 35,
+    EVSYS_0_IRQn              = 36,
+    EVSYS_1_IRQn              = 37,
+    EVSYS_2_IRQn              = 38,
+    EVSYS_3_IRQn              = 39,
+    EVSYS_4_IRQn              = 40,
+    PAC_IRQn                  = 41,
+    RAMECC_IRQn               = 45,
+    SERCOM0_0_IRQn            = 46,
+    SERCOM0_1_IRQn            = 47,
+    SERCOM0_2_IRQn            = 48,
+    SERCOM0_3_IRQn            = 49,
+    SERCOM1_0_IRQn            = 50,
+    SERCOM1_1_IRQn            = 51,
+    SERCOM1_2_IRQn            = 52,
+    SERCOM1_3_IRQn            = 53,
+    SERCOM2_0_IRQn            = 54,
+    SERCOM2_1_IRQn            = 55,
+    SERCOM2_2_IRQn            = 56,
+    SERCOM2_3_IRQn            = 57,
+    SERCOM3_0_IRQn            = 58,
+    SERCOM3_1_IRQn            = 59,
+    SERCOM3_2_IRQn            = 60,
+    SERCOM3_3_IRQn            = 61,
+    SERCOM4_0_IRQn            = 62,
+    SERCOM4_1_IRQn            = 63,
+    SERCOM4_2_IRQn            = 64,
+    SERCOM4_3_IRQn            = 65,
+    SERCOM5_0_IRQn            = 66,
+    SERCOM5_1_IRQn            = 67,
+    SERCOM5_2_IRQn            = 68,
+    SERCOM5_3_IRQn            = 69,
+    SERCOM6_0_IRQn            = 70,
+    SERCOM6_1_IRQn            = 71,
+    SERCOM6_2_IRQn            = 72,
+    SERCOM6_3_IRQn            = 73,
+    SERCOM7_0_IRQn            = 74,
+    SERCOM7_1_IRQn            = 75,
+    SERCOM7_2_IRQn            = 76,
+    SERCOM7_3_IRQn            = 77,
+    USB_0_IRQn                = 80,
+    USB_1_IRQn                = 81,
+    USB_2_IRQn                = 82,
+    USB_3_IRQn                = 83,
+    TCC0_0_IRQn               = 85,
+    TCC0_1_IRQn               = 86,
+    TCC0_2_IRQn               = 87,
+    TCC0_3_IRQn               = 88,
+    TCC0_4_IRQn               = 89,
+    TCC0_5_IRQn               = 90,
+    TCC0_6_IRQn               = 91,
+    TCC1_0_IRQn               = 92,
+    TCC1_1_IRQn               = 93,
+    TCC1_2_IRQn               = 94,
+    TCC1_3_IRQn               = 95,
+    TCC1_4_IRQn               = 96,
+    TCC2_0_IRQn               = 97,
+    TCC2_1_IRQn               = 98,
+    TCC2_2_IRQn               = 99,
+    TCC2_3_IRQn               = 100,
+    TCC3_0_IRQn               = 101,
+    TCC3_1_IRQn               = 102,
+    TCC3_2_IRQn               = 103,
+    TCC4_0_IRQn               = 104,
+    TCC4_1_IRQn               = 105,
+    TCC4_2_IRQn               = 106,
+    TC0_IRQn                  = 107,
+    TC1_IRQn                  = 108,
+    TC2_IRQn                  = 109,
+    TC3_IRQn                  = 110,
+    TC4_IRQn                  = 111,
+    TC5_IRQn                  = 112,
+    TC6_IRQn                  = 113,
+    TC7_IRQn                  = 114,
+    PDEC_0_IRQn               = 115,
+    PDEC_1_IRQn               = 116,
+    PDEC_2_IRQn               = 117,
+    ADC0_0_IRQn               = 118,
+    ADC0_1_IRQn               = 119,
+    ADC1_0_IRQn               = 120,
+    ADC1_1_IRQn               = 121,
+    AC_IRQn                   = 122,
+    DAC_0_IRQn                = 123,
+    DAC_1_IRQn                = 124,
+    DAC_2_IRQn                = 125,
+    DAC_3_IRQn                = 126,
+    DAC_4_IRQn                = 127,
+    I2S_IRQn                  = 128,
+    PCC_IRQn                  = 129,
+    AES_IRQn                  = 130,
+    TRNG_IRQn                 = 131,
+    ICM_IRQn                  = 132,
+    PUKCC_IRQn                = 133,
+    QSPI_IRQn                 = 134,
+    SDHC0_IRQn                = 135,
+    SDHC1_IRQn                = 136
+  );
+
+  TAC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    CTRLB        : byte;                 //0001 Control B
+    EVCTRL       : word;                 //0002 Event Control
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    STATUSA      : byte;                 //0007 Status A
+    STATUSB      : byte;                 //0008 Status B
+    DBGCTRL      : byte;                 //0009 Debug Control
+    WINCTRL      : byte;                 //000A Window Control
+    RESERVED0    : byte;
+    SCALER       : array[0..1] of byte;  //000C Scaler n
+    RESERVED1    : word;
+    COMPCTRL     : array[0..1] of longWord; //0010 Comparator Control n
+    RESERVED2    : array[1..8] of byte;
+    SYNCBUSY     : longWord;             //0020 Synchronization Busy
+    CALIB        : word;                 //0024 Calibration
+  end;
+
+  TADC_Registers = record
+    CTRLA        : word;                 //0000 Control A
+    EVCTRL       : byte;                 //0002 Event Control
+    DBGCTRL      : byte;                 //0003 Debug Control
+    INPUTCTRL    : word;                 //0004 Input Control
+    CTRLB        : word;                 //0006 Control B
+    REFCTRL      : byte;                 //0008 Reference Control
+    RESERVED0    : byte;
+    AVGCTRL      : byte;                 //000A Average Control
+    SAMPCTRL     : byte;                 //000B Sample Time Control
+    WINLT        : word;                 //000C Window Monitor Lower Threshold
+    WINUT        : word;                 //000E Window Monitor Upper Threshold
+    GAINCORR     : word;                 //0010 Gain Correction
+    OFFSETCORR   : word;                 //0012 Offset Correction
+    SWTRIG       : byte;                 //0014 Software Trigger
+    RESERVED1    : array[1..23] of byte;
+    INTENCLR     : byte;                 //002C Interrupt Enable Clear
+    INTENSET     : byte;                 //002D Interrupt Enable Set
+    INTFLAG      : byte;                 //002E Interrupt Flag Status and Clear
+    STATUS       : byte;                 //002F Status
+    SYNCBUSY     : longWord;             //0030 Synchronization Busy
+    DSEQDATA     : longWord;             //0034 DMA Sequencial Data
+    DSEQCTRL     : longWord;             //0038 DMA Sequential Control
+    DSEQSTAT     : longWord;             //003C DMA Sequencial Status
+    RESULT       : word;                 //0040 Result Conversion Value
+    RESERVED2    : word;
+    RESS         : word;                 //0044 Last Sample Result
+    RESERVED3    : word;
+    CALIB        : word;                 //0048 Calibration
+  end;
+
+  TAES_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLB        : byte;                 //0004 Control B
+    INTENCLR     : byte;                 //0005 Interrupt Enable Clear
+    INTENSET     : byte;                 //0006 Interrupt Enable Set
+    INTFLAG      : byte;                 //0007 Interrupt Flag Status
+    DATABUFPTR   : byte;                 //0008 Data buffer pointer
+    DBGCTRL      : byte;                 //0009 Debug control
+    RESERVED0    : word;
+    KEYWORD      : array[0..7] of longWord; //000C Keyword n
+    RESERVED1    : array[1..12] of byte;
+    INDATA       : longWord;             //0038 Indata
+    INTVECTV     : array[0..3] of longWord; //003C Initialisation Vector n
+    RESERVED2    : array[1..16] of byte;
+    HASHKEY      : array[0..3] of longWord; //005C Hash key n
+    GHASH        : array[0..3] of longWord; //006C Galois Hash n
+    RESERVED3    : longWord;
+    CIPLEN       : longWord;             //0080 Cipher Length
+    RANDSEED     : longWord;             //0084 Random Seed
+  end;
+
+  TCCL_Registers = record
+    CTRL         : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SEQCTRL      : array[0..1] of byte;  //0004 SEQ Control x
+    RESERVED1    : word;
+    LUTCTRL      : array[0..3] of longWord; //0008 LUT Control x
+  end;
+
+  TCMCC_Registers = record
+    &TYPE        : longWord;             //0000 Cache Type Register
+    CFG          : longWord;             //0004 Cache Configuration Register
+    CTRL         : longWord;             //0008 Cache Control Register
+    SR           : longWord;             //000C Cache Status Register
+    LCKWAY       : longWord;             //0010 Cache Lock per Way Register
+    RESERVED0    : array[1..12] of byte;
+    MAINT0       : longWord;             //0020 Cache Maintenance Register 0
+    MAINT1       : longWord;             //0024 Cache Maintenance Register 1
+    MCFG         : longWord;             //0028 Cache Monitor Configuration Register
+    MEN          : longWord;             //002C Cache Monitor Enable Register
+    MCTRL        : longWord;             //0030 Cache Monitor Control Register
+    MSR          : longWord;             //0034 Cache Monitor Status Register
+  end;
+
+  TDAC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    CTRLB        : byte;                 //0001 Control B
+    EVCTRL       : byte;                 //0002 Event Control
+    RESERVED0    : byte;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    STATUS       : byte;                 //0007 Status
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    DACCTRL      : array[0..1] of word;  //000C DAC n Control
+    DATA         : array[0..1] of word;  //0010 DAC n Data
+    DATABUF      : array[0..1] of word;  //0014 DAC n Data Buffer
+    DBGCTRL      : byte;                 //0018 Debug Control
+    RESERVED1    : array[1..3] of byte;
+    RESULT       : array[0..1] of word;  //001C Filter Result
+  end;
+
+  TDMAC_CHANNEL_Registers = record
+    CHCTRLA      : longWord;             //0000 Channel n Control A
+    CHCTRLB      : byte;                 //0004 Channel n Control B
+    CHPRILVL     : byte;                 //0005 Channel n Priority Level
+    CHEVCTRL     : byte;                 //0006 Channel n Event Control
+    RESERVED0    : array[1..5] of byte;
+    CHINTENCLR   : byte;                 //000C Channel n Interrupt Enable Clear
+    CHINTENSET   : byte;                 //000D Channel n Interrupt Enable Set
+    CHINTFLAG    : byte;                 //000E Channel n Interrupt Flag Status and Clear
+    CHSTATUS     : byte;                 //000F Channel n Status
+  end;
+
+  TDMAC_Registers = record
+    CTRL         : word;                 //0000 Control
+    CRCCTRL      : word;                 //0002 CRC Control
+    CRCDATAIN    : longWord;             //0004 CRC Data Input
+    CRCCHKSUM    : longWord;             //0008 CRC Checksum
+    CRCSTATUS    : byte;                 //000C CRC Status
+    DBGCTRL      : byte;                 //000D Debug Control
+    RESERVED0    : word;
+    SWTRIGCTRL   : longWord;             //0010 Software Trigger Control
+    PRICTRL0     : longWord;             //0014 Priority Control 0
+    RESERVED1    : array[1..8] of byte;
+    INTPEND      : word;                 //0020 Interrupt Pending
+    RESERVED2    : word;
+    INTSTATUS    : longWord;             //0024 Interrupt Status
+    BUSYCH       : longWord;             //0028 Busy Channels
+    PENDCH       : longWord;             //002C Pending Channels
+    ACTIVE       : longWord;             //0030 Active Channel and Levels
+    BASEADDR     : longWord;             //0034 Descriptor Memory Section Base Address
+    WRBADDR      : longWord;             //0038 Write-Back Memory Section Base Address
+    RESERVED3    : longWord;
+    CHANNEL      : array[0..31] of TDMAC_CHANNEL_Registers;  //0040 
+  end;
+
+  TDMAC_DESCRIPTOR_Registers = record
+    BTCTRL       : word;                 //0000 Block Transfer Control
+    BTCNT        : word;                 //0002 Block Transfer Count
+    SRCADDR      : longWord;             //0004 Block Transfer Source Address
+    DSTADDR      : longWord;             //0008 Block Transfer Destination Address
+    DESCADDR     : longWord;             //000C Next Descriptor Address
+  end;
+
+  TDSU_Registers = record
+    CTRL         : byte;                 //0000 Control
+    STATUSA      : byte;                 //0001 Status A
+    STATUSB      : byte;                 //0002 Status B
+    RESERVED0    : byte;
+    ADDR         : longWord;             //0004 Address
+    LENGTH       : longWord;             //0008 Length
+    DATA         : longWord;             //000C Data
+    DCC          : array[0..1] of longWord; //0010 Debug Communication Channel n
+    DID          : longWord;             //0018 Device Identification
+    CFG          : longWord;             //001C Configuration
+    RESERVED1    : array[1..208] of byte;
+    DCFG         : array[0..1] of longWord; //00F0 Device Configuration
+    RESERVED2    : array[1..3848] of byte;
+    ENTRY0       : longWord;             //1000 CoreSight ROM Table Entry 0
+    ENTRY1       : longWord;             //1004 CoreSight ROM Table Entry 1
+    &END         : longWord;             //1008 CoreSight ROM Table End
+    RESERVED3    : array[1..4032] of byte;
+    MEMTYPE      : longWord;             //1FCC CoreSight ROM Table Memory Type
+    PID4         : longWord;             //1FD0 Peripheral Identification 4
+    PID5         : longWord;             //1FD4 Peripheral Identification 5
+    PID6         : longWord;             //1FD8 Peripheral Identification 6
+    PID7         : longWord;             //1FDC Peripheral Identification 7
+    PID0         : longWord;             //1FE0 Peripheral Identification 0
+    PID1         : longWord;             //1FE4 Peripheral Identification 1
+    PID2         : longWord;             //1FE8 Peripheral Identification 2
+    PID3         : longWord;             //1FEC Peripheral Identification 3
+    CID0         : longWord;             //1FF0 Component Identification 0
+    CID1         : longWord;             //1FF4 Component Identification 1
+    CID2         : longWord;             //1FF8 Component Identification 2
+    CID3         : longWord;             //1FFC Component Identification 3
+  end;
+
+  TEIC_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    NMICTRL      : byte;                 //0001 Non-Maskable Interrupt Control
+    NMIFLAG      : word;                 //0002 Non-Maskable Interrupt Flag Status and Clear
+    SYNCBUSY     : longWord;             //0004 Synchronization Busy
+    EVCTRL       : longWord;             //0008 Event Control
+    INTENCLR     : longWord;             //000C Interrupt Enable Clear
+    INTENSET     : longWord;             //0010 Interrupt Enable Set
+    INTFLAG      : longWord;             //0014 Interrupt Flag Status and Clear
+    ASYNCH       : longWord;             //0018 External Interrupt Asynchronous Mode
+    CONFIG       : array[0..1] of longWord; //001C External Interrupt Sense Configuration
+    RESERVED0    : array[1..12] of byte;
+    DEBOUNCEN    : longWord;             //0030 Debouncer Enable
+    DPRESCALER   : longWord;             //0034 Debouncer Prescaler
+    PINSTATE     : longWord;             //0038 Pin State
+  end;
+
+  TEVSYS_CHANNEL_Registers = record
+    CHANNEL      : longWord;             //0000 Channel n Control
+    CHINTENCLR   : byte;                 //0004 Channel n Interrupt Enable Clear
+    CHINTENSET   : byte;                 //0005 Channel n Interrupt Enable Set
+    CHINTFLAG    : byte;                 //0006 Channel n Interrupt Flag Status and Clear
+    CHSTATUS     : byte;                 //0007 Channel n Status
+  end;
+
+  TEVSYS_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SWEVT        : longWord;             //0004 Software Event
+    PRICTRL      : byte;                 //0008 Priority Control
+    RESERVED1    : array[1..7] of byte;
+    INTPEND      : word;                 //0010 Channel Pending Interrupt
+    RESERVED2    : word;
+    INTSTATUS    : longWord;             //0014 Interrupt Status
+    BUSYCH       : longWord;             //0018 Busy Channels
+    READYUSR     : longWord;             //001C Ready Users
+    CHANNEL      : array[0..31] of TEVSYS_CHANNEL_Registers;  //0020 
+    USER         : array[0..66] of longWord; //0120 User Multiplexer n
+  end;
+
+  TFREQM_Registers = record
+    CTRLA        : byte;                 //0000 Control A Register
+    CTRLB        : byte;                 //0001 Control B Register
+    CFGA         : word;                 //0002 Config A register
+    RESERVED0    : longWord;
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear Register
+    INTENSET     : byte;                 //0009 Interrupt Enable Set Register
+    INTFLAG      : byte;                 //000A Interrupt Flag Register
+    STATUS       : byte;                 //000B Status Register
+    SYNCBUSY     : longWord;             //000C Synchronization Busy Register
+    VALUE        : longWord;             //0010 Count Value Register
+  end;
+
+  TGCLK_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    RESERVED0    : array[1..3] of byte;
+    SYNCBUSY     : longWord;             //0004 Synchronization Busy
+    RESERVED1    : array[1..24] of byte;
+    GENCTRL      : array[0..11] of longWord; //0020 Generic Clock Generator Control
+    RESERVED2    : array[1..48] of byte;
+    PCHCTRL      : array[0..47] of longWord; //0080 Peripheral Clock Control
+  end;
+
+  THMATRIXB_PRS_Registers = record
+    PRAS         : longWord;             //0000 Priority A for Slave
+    PRBS         : longWord;             //0004 Priority B for Slave
+  end;
+
+  THMATRIXB_Registers = record
+    PRS          : array[0..15] of THMATRIXB_PRS_Registers;  //0080 
+  end;
+
+  TICM_Registers = record
+    CFG          : longWord;             //0000 Configuration
+    CTRL         : longWord;             //0004 Control
+    SR           : longWord;             //0008 Status
+    RESERVED0    : longWord;
+    IER          : longWord;             //0010 Interrupt Enable
+    IDR          : longWord;             //0014 Interrupt Disable
+    IMR          : longWord;             //0018 Interrupt Mask
+    ISR          : longWord;             //001C Interrupt Status
+    UASR         : longWord;             //0020 Undefined Access Status
+    RESERVED1    : array[1..12] of byte;
+    DSCR         : longWord;             //0030 Region Descriptor Area Start Address
+    HASH         : longWord;             //0034 Region Hash Area Start Address
+    UIHVAL       : array[0..7] of longWord; //0038 User Initial Hash Value n
+  end;
+
+  TICM_DESCRIPTOR_Registers = record
+    RADDR        : longWord;             //0000 Region Start Address
+    RCFG         : longWord;             //0004 Region Configuration
+    RCTRL        : longWord;             //0008 Region Control
+    RNEXT        : longWord;             //000C Region Next Address
+  end;
+
+  TI2S_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : array[1..3] of byte;
+    CLKCTRL      : array[0..1] of longWord; //0004 Clock Unit n Control
+    INTENCLR     : word;                 //000C Interrupt Enable Clear
+    RESERVED1    : word;
+    INTENSET     : word;                 //0010 Interrupt Enable Set
+    RESERVED2    : word;
+    INTFLAG      : word;                 //0014 Interrupt Flag Status and Clear
+    RESERVED3    : word;
+    SYNCBUSY     : word;                 //0018 Synchronization Status
+    RESERVED4    : array[1..6] of byte;
+    TXCTRL       : longWord;             //0020 Tx Serializer Control
+    RXCTRL       : longWord;             //0024 Rx Serializer Control
+    RESERVED5    : array[1..8] of byte;
+    TXDATA       : longWord;             //0030 Tx Data
+    RXDATA       : longWord;             //0034 Rx Data
+  end;
+
+  TMCLK_Registers = record
+    INTENCLR     : byte;                 //0001 Interrupt Enable Clear
+    INTENSET     : byte;                 //0002 Interrupt Enable Set
+    INTFLAG      : byte;                 //0003 Interrupt Flag Status and Clear
+    HSDIV        : byte;                 //0004 HS Clock Division
+    CPUDIV       : byte;                 //0005 CPU Clock Division
+    RESERVED0    : array[1..10] of byte;
+    AHBMASK      : longWord;             //0010 AHB Mask
+    APBAMASK     : longWord;             //0014 APBA Mask
+    APBBMASK     : longWord;             //0018 APBB Mask
+    APBCMASK     : longWord;             //001C APBC Mask
+    APBDMASK     : longWord;             //0020 APBD Mask
+  end;
+
+  TNVMCTRL_Registers = record
+    CTRLA        : word;                 //0000 Control A
+    RESERVED0    : word;
+    CTRLB        : word;                 //0004 Control B
+    RESERVED1    : word;
+    PARAM        : longWord;             //0008 NVM Parameter
+    INTENCLR     : word;                 //000C Interrupt Enable Clear
+    INTENSET     : word;                 //000E Interrupt Enable Set
+    INTFLAG      : word;                 //0010 Interrupt Flag Status and Clear
+    STATUS       : word;                 //0012 Status
+    ADDR         : longWord;             //0014 Address
+    RUNLOCK      : longWord;             //0018 Lock Section
+    PBLDATA      : array[0..1] of longWord; //001C Page Buffer Load Data x
+    ECCERR       : longWord;             //0024 ECC Error Status Register
+    DBGCTRL      : byte;                 //0028 Debug Control
+    RESERVED2    : byte;
+    SEECFG       : byte;                 //002A SmartEEPROM Configuration Register
+    RESERVED3    : byte;
+    SEESTAT      : longWord;             //002C SmartEEPROM Status Register
+  end;
+
+  TSW0_FUSES_Registers = record
+    SW0_WORD_0   : longWord;             //0000 SW0 Page Word 0
+    SW0_WORD_1   : longWord;             //0004 SW0 Page Word 1
+  end;
+
+  TTEMP_LOG_FUSES_Registers = record
+    TEMP_LOG_WORD_0 : longWord;             //0000 TEMP_LOG Page Word 0
+    TEMP_LOG_WORD_1 : longWord;             //0004 TEMP_LOG Page Word 1
+    TEMP_LOG_WORD_2 : longWord;             //0008 TEMP_LOG Page Word 2
+  end;
+
+  TUSER_FUSES_Registers = record
+    USER_WORD_0  : longWord;             //0000 USER Page Word 0
+    USER_WORD_1  : longWord;             //0004 USER Page Word 1
+    USER_WORD_2  : longWord;             //0008 USER Page Word 2
+  end;
+
+  TOSCCTRL_DPLL_Registers = record
+    DPLLCTRLA    : byte;                 //0000 DPLL Control A
+    RESERVED0    : array[1..3] of byte;
+    DPLLRATIO    : longWord;             //0004 DPLL Ratio Control
+    DPLLCTRLB    : longWord;             //0008 DPLL Control B
+    DPLLSYNCBUSY : longWord;             //000C DPLL Synchronization Busy
+    DPLLSTATUS   : longWord;             //0010 DPLL Status
+  end;
+
+  TOSCCTRL_Registers = record
+    EVCTRL       : byte;                 //0000 Event Control
+    RESERVED0    : array[1..3] of byte;
+    INTENCLR     : longWord;             //0004 Interrupt Enable Clear
+    INTENSET     : longWord;             //0008 Interrupt Enable Set
+    INTFLAG      : longWord;             //000C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0010 Status
+    XOSCCTRL     : array[0..1] of longWord; //0014 External Multipurpose Crystal Oscillator Control
+    DFLLCTRLA    : byte;                 //001C DFLL48M Control A
+    RESERVED1    : array[1..3] of byte;
+    DFLLCTRLB    : byte;                 //0020 DFLL48M Control B
+    RESERVED2    : array[1..3] of byte;
+    DFLLVAL      : longWord;             //0024 DFLL48M Value
+    DFLLMUL      : longWord;             //0028 DFLL48M Multiplier
+    DFLLSYNC     : byte;                 //002C DFLL48M Synchronization
+    RESERVED3    : array[1..3] of byte;
+    DPLL         : array[0..1] of TOSCCTRL_DPLL_Registers;  //0030 
+  end;
+
+  TOSC32KCTRL_Registers = record
+    INTENCLR     : longWord;             //0000 Interrupt Enable Clear
+    INTENSET     : longWord;             //0004 Interrupt Enable Set
+    INTFLAG      : longWord;             //0008 Interrupt Flag Status and Clear
+    STATUS       : longWord;             //000C Power and Clocks Status
+    RTCCTRL      : byte;                 //0010 RTC Clock Selection
+    RESERVED0    : array[1..3] of byte;
+    XOSC32K      : word;                 //0014 32kHz External Crystal Oscillator (XOSC32K) Control
+    CFDCTRL      : byte;                 //0016 Clock Failure Detector Control
+    EVCTRL       : byte;                 //0017 Event Control
+    RESERVED1    : longWord;
+    OSCULP32K    : longWord;             //001C 32kHz Ultra Low Power Internal Oscillator (OSCULP32K) Control
+  end;
+
+  TPAC_Registers = record
+    WRCTRL       : longWord;             //0000 Write control
+    EVCTRL       : byte;                 //0004 Event control
+    RESERVED0    : array[1..3] of byte;
+    INTENCLR     : byte;                 //0008 Interrupt enable clear
+    INTENSET     : byte;                 //0009 Interrupt enable set
+    RESERVED1    : array[1..6] of byte;
+    INTFLAGAHB   : longWord;             //0010 Bridge interrupt flag status
+    INTFLAGA     : longWord;             //0014 Peripheral interrupt flag status - Bridge A
+    INTFLAGB     : longWord;             //0018 Peripheral interrupt flag status - Bridge B
+    INTFLAGC     : longWord;             //001C Peripheral interrupt flag status - Bridge C
+    INTFLAGD     : longWord;             //0020 Peripheral interrupt flag status - Bridge D
+    RESERVED2    : array[1..16] of byte;
+    STATUSA      : longWord;             //0034 Peripheral write protection status - Bridge A
+    STATUSB      : longWord;             //0038 Peripheral write protection status - Bridge B
+    STATUSC      : longWord;             //003C Peripheral write protection status - Bridge C
+    STATUSD      : longWord;             //0040 Peripheral write protection status - Bridge D
+  end;
+
+  TPCC_Registers = record
+    MR           : longWord;             //0000 Mode Register
+    IER          : longWord;             //0004 Interrupt Enable Register
+    IDR          : longWord;             //0008 Interrupt Disable Register
+    IMR          : longWord;             //000C Interrupt Mask Register
+    ISR          : longWord;             //0010 Interrupt Status Register
+    RHR          : longWord;             //0014 Reception Holding Register
+    RESERVED0    : array[1..200] of byte;
+    WPMR         : longWord;             //00E0 Write Protection Mode Register
+    WPSR         : longWord;             //00E4 Write Protection Status Register
+  end;
+
+  TPDEC_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    RESERVED0    : byte;
+    STATUS       : word;                 //000C Status
+    RESERVED1    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    PRESC        : byte;                 //0014 Prescaler Value
+    FILTER       : byte;                 //0015 Filter Value
+    RESERVED2    : word;
+    PRESCBUF     : byte;                 //0018 Prescaler Buffer Value
+    FILTERBUF    : byte;                 //0019 Filter Buffer Value
+    RESERVED3    : word;
+    COUNT        : longWord;             //001C Counter Value
+    CC           : array[0..1] of longWord; //0020 Channel n Compare Value
+    RESERVED4    : array[1..8] of byte;
+    CCBUF        : array[0..1] of longWord; //0030 Channel Compare Buffer Value
+  end;
+
+  TPM_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    SLEEPCFG     : byte;                 //0001 Sleep Configuration
+    RESERVED0    : word;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    RESERVED1    : byte;
+    STDBYCFG     : byte;                 //0008 Standby Configuration
+    HIBCFG       : byte;                 //0009 Hibernate Configuration
+    BKUPCFG      : byte;                 //000A Backup Configuration
+    RESERVED2    : array[1..7] of byte;
+    PWSAKDLY     : byte;                 //0012 Power Switch Acknowledge Delay
+  end;
+
+  TPORT_GROUP_Registers = record
+    DIR          : longWord;             //0000 Data Direction
+    DIRCLR       : longWord;             //0004 Data Direction Clear
+    DIRSET       : longWord;             //0008 Data Direction Set
+    DIRTGL       : longWord;             //000C Data Direction Toggle
+    &OUT         : longWord;             //0010 Data Output Value
+    OUTCLR       : longWord;             //0014 Data Output Value Clear
+    OUTSET       : longWord;             //0018 Data Output Value Set
+    OUTTGL       : longWord;             //001C Data Output Value Toggle
+    &IN          : longWord;             //0020 Data Input Value
+    CTRL         : longWord;             //0024 Control
+    WRCONFIG     : longWord;             //0028 Write Configuration
+    EVCTRL       : longWord;             //002C Event Input Control
+    PMUX         : array[0..15] of byte;  //0030 Peripheral Multiplexing
+    PINCFG       : array[0..31] of byte;  //0040 Pin Configuration
+    Res          : array[$60..$7F] of byte;
+  end;
+
+  TPORT_Registers = record
+    GROUP        : array[0..3] of TPORT_GROUP_Registers;  //0000 
+  end;
+
+  TPUKCC_Registers = record
+  end;
+
+  TQSPI_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLB        : longWord;             //0004 Control B
+    BAUD         : longWord;             //0008 Baud Rate
+    RXDATA       : longWord;             //000C Receive Data
+    TXDATA       : longWord;             //0010 Transmit Data
+    INTENCLR     : longWord;             //0014 Interrupt Enable Clear
+    INTENSET     : longWord;             //0018 Interrupt Enable Set
+    INTFLAG      : longWord;             //001C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0020 Status Register
+    RESERVED0    : array[1..12] of byte;
+    INSTRADDR    : longWord;             //0030 Instruction Address
+    INSTRCTRL    : longWord;             //0034 Instruction Code
+    INSTRFRAME   : longWord;             //0038 Instruction Frame
+    RESERVED1    : longWord;
+    SCRAMBCTRL   : longWord;             //0040 Scrambling Mode
+    SCRAMBKEY    : longWord;             //0044 Scrambling Key
+  end;
+
+  TRAMECC_Registers = record
+    INTENCLR     : byte;                 //0000 Interrupt Enable Clear
+    INTENSET     : byte;                 //0001 Interrupt Enable Set
+    INTFLAG      : byte;                 //0002 Interrupt Flag
+    STATUS       : byte;                 //0003 Status
+    ERRADDR      : longWord;             //0004 Error Address
+    RESERVED0    : array[1..7] of byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+  end;
+
+  TRSTC_Registers = record
+    RCAUSE       : byte;                 //0000 Reset Cause
+    RESERVED0    : byte;
+    BKUPEXIT     : byte;                 //0002 Backup Exit Source
+  end;
+
+  TRTCMODE0_Registers = record
+    CTRLA        : word;                 //0000 MODE0 Control A
+    CTRLB        : word;                 //0002 MODE0 Control B
+    EVCTRL       : longWord;             //0004 MODE0 Event Control
+    INTENCLR     : word;                 //0008 MODE0 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE0 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE0 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE0 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    COUNT        : longWord;             //0018 MODE0 Counter Value
+    RESERVED2    : longWord;
+    COMP         : array[0..1] of longWord; //0020 MODE0 Compare n Value
+    RESERVED3    : array[1..24] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED4    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE0 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED5    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TRTCMODE1_Registers = record
+    CTRLA        : word;                 //0000 MODE1 Control A
+    CTRLB        : word;                 //0002 MODE1 Control B
+    EVCTRL       : longWord;             //0004 MODE1 Event Control
+    INTENCLR     : word;                 //0008 MODE1 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE1 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE1 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE1 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    COUNT        : word;                 //0018 MODE1 Counter Value
+    RESERVED2    : word;
+    PER          : word;                 //001C MODE1 Counter Period
+    RESERVED3    : word;
+    COMP         : array[0..3] of word;  //0020 MODE1 Compare n Value
+    RESERVED4    : array[1..24] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED5    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE1 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED6    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TRTCMODE2_Registers = record
+    CTRLA        : word;                 //0000 MODE2 Control A
+    CTRLB        : word;                 //0002 MODE2 Control B
+    EVCTRL       : longWord;             //0004 MODE2 Event Control
+    INTENCLR     : word;                 //0008 MODE2 Interrupt Enable Clear
+    INTENSET     : word;                 //000A MODE2 Interrupt Enable Set
+    INTFLAG      : word;                 //000C MODE2 Interrupt Flag Status and Clear
+    DBGCTRL      : byte;                 //000E Debug Control
+    RESERVED0    : byte;
+    SYNCBUSY     : longWord;             //0010 MODE2 Synchronization Busy Status
+    FREQCORR     : byte;                 //0014 Frequency Correction
+    RESERVED1    : array[1..3] of byte;
+    CLOCK        : longWord;             //0018 MODE2 Clock Value
+    RESERVED2    : longWord;
+    ALARM0       : longWord;             //0020 MODE2_ALARM Alarm n Value
+    MASK0        : byte;                 //0024 MODE2_ALARM Alarm n Mask
+    RESERVED3    : array[1..3] of byte;
+    ALARM1       : longWord;             //0028 MODE2_ALARM Alarm n Value
+    MASK1        : byte;                 //002C MODE2_ALARM Alarm n Mask
+    RESERVED4    : array[1..19] of byte;
+    GP           : array[0..3] of longWord; //0040 General Purpose
+    RESERVED5    : array[1..16] of byte;
+    TAMPCTRL     : longWord;             //0060 Tamper Control
+    TIMESTAMP    : longWord;             //0064 MODE2 Timestamp
+    TAMPID       : longWord;             //0068 Tamper ID
+    RESERVED6    : array[1..20] of byte;
+    BKUP         : array[0..7] of longWord; //0080 Backup
+  end;
+
+  TSDHC_Registers = record
+    SSAR         : longWord;             //0000 SDMA System Address / Argument 2
+    BSR          : word;                 //0004 Block Size
+    BCR          : word;                 //0006 Block Count
+    ARG1R        : longWord;             //0008 Argument 1
+    TMR          : word;                 //000C Transfer Mode
+    CR           : word;                 //000E Command
+    RR           : array[0..3] of longWord; //0010 Response
+    BDPR         : longWord;             //0020 Buffer Data Port
+    PSR          : longWord;             //0024 Present State
+    HC1R         : byte;                 //0028 Host Control 1
+    PCR          : byte;                 //0029 Power Control
+    BGCR         : byte;                 //002A Block Gap Control
+    WCR          : byte;                 //002B Wakeup Control
+    CCR          : word;                 //002C Clock Control
+    TCR          : byte;                 //002E Timeout Control
+    SRR          : byte;                 //002F Software Reset
+    NISTR        : word;                 //0030 Normal Interrupt Status
+    EISTR        : word;                 //0032 Error Interrupt Status
+    NISTER       : word;                 //0034 Normal Interrupt Status Enable
+    EISTER       : word;                 //0036 Error Interrupt Status Enable
+    NISIER       : word;                 //0038 Normal Interrupt Signal Enable
+    EISIER       : word;                 //003A Error Interrupt Signal Enable
+    ACESR        : word;                 //003C Auto CMD Error Status
+    HC2R         : word;                 //003E Host Control 2
+    CA0R         : longWord;             //0040 Capabilities 0
+    CA1R         : longWord;             //0044 Capabilities 1
+    MCCAR        : longWord;             //0048 Maximum Current Capabilities
+    RESERVED0    : longWord;
+    FERACES      : word;                 //0050 Force Event for Auto CMD Error Status
+    FEREIS       : word;                 //0052 Force Event for Error Interrupt Status
+    AESR         : byte;                 //0054 ADMA Error Status
+    RESERVED1    : array[1..3] of byte;
+    ASAR         : longWord;             //0058 ADMA System Address n
+    RESERVED2    : longWord;
+    PVR          : array[0..7] of word;  //0060 Preset Value n
+    RESERVED3    : array[1..140] of byte;
+    SISR         : word;                 //00FC Slot Interrupt Status
+    HCVR         : word;                 //00FE Host Controller Version
+    RESERVED4    : array[1..260] of byte;
+    MC1R         : byte;                 //0204 MMC Control 1
+    MC2R         : byte;                 //0205 MMC Control 2
+    RESERVED5    : word;
+    ACR          : longWord;             //0208 AHB Control
+    CC2R         : longWord;             //020C Clock Control 2
+    RESERVED6    : array[1..32] of byte;
+    CACR         : longWord;             //0230 Capabilities Control
+    DBGR         : byte;                 //0234 Debug
+  end;
+
+  TSERCOMI2CM_Registers = record
+    CTRLA        : longWord;             //0000 I2CM Control A
+    CTRLB        : longWord;             //0004 I2CM Control B
+    CTRLC        : longWord;             //0008 I2CM Control C
+    BAUD         : longWord;             //000C I2CM Baud Rate
+    RESERVED0    : longWord;
+    INTENCLR     : byte;                 //0014 I2CM Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 I2CM Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 I2CM Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A I2CM Status
+    SYNCBUSY     : longWord;             //001C I2CM Synchronization Busy
+    RESERVED4    : longWord;
+    ADDR         : longWord;             //0024 I2CM Address
+    DATA         : longWord;             //0028 I2CM Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 I2CM Debug Control
+  end;
+
+  TSERCOMI2CS_Registers = record
+    CTRLA        : longWord;             //0000 I2CS Control A
+    CTRLB        : longWord;             //0004 I2CS Control B
+    CTRLC        : longWord;             //0008 I2CS Control C
+    RESERVED0    : array[1..8] of byte;
+    INTENCLR     : byte;                 //0014 I2CS Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 I2CS Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 I2CS Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A I2CS Status
+    SYNCBUSY     : longWord;             //001C I2CS Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 I2CS Length
+    ADDR         : longWord;             //0024 I2CS Address
+    DATA         : longWord;             //0028 I2CS Data
+  end;
+
+  TSERCOMSPIS_Registers = record
+    CTRLA        : longWord;             //0000 SPIS Control A
+    CTRLB        : longWord;             //0004 SPIS Control B
+    CTRLC        : longWord;             //0008 SPIS Control C
+    BAUD         : byte;                 //000C SPIS Baud Rate
+    RESERVED0    : array[1..7] of byte;
+    INTENCLR     : byte;                 //0014 SPIS Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 SPIS Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 SPIS Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A SPIS Status
+    SYNCBUSY     : longWord;             //001C SPIS Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 SPIS Length
+    ADDR         : longWord;             //0024 SPIS Address
+    DATA         : longWord;             //0028 SPIS Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 SPIS Debug Control
+  end;
+
+  TSERCOMSPIM_Registers = record
+    CTRLA        : longWord;             //0000 SPIM Control A
+    CTRLB        : longWord;             //0004 SPIM Control B
+    CTRLC        : longWord;             //0008 SPIM Control C
+    BAUD         : byte;                 //000C SPIM Baud Rate
+    RESERVED0    : array[1..7] of byte;
+    INTENCLR     : byte;                 //0014 SPIM Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 SPIM Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 SPIM Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A SPIM Status
+    SYNCBUSY     : longWord;             //001C SPIM Synchronization Busy
+    RESERVED4    : word;
+    LENGTH       : word;                 //0022 SPIM Length
+    ADDR         : longWord;             //0024 SPIM Address
+    DATA         : longWord;             //0028 SPIM Data
+    RESERVED5    : longWord;
+    DBGCTRL      : byte;                 //0030 SPIM Debug Control
+  end;
+
+  TSERCOMUSART_EXT_Registers = record
+    CTRLA        : longWord;             //0000 USART_EXT Control A
+    CTRLB        : longWord;             //0004 USART_EXT Control B
+    CTRLC        : longWord;             //0008 USART_EXT Control C
+    BAUD         : word;                 //000C USART_EXT Baud Rate
+    RXPL         : byte;                 //000E USART_EXT Receive Pulse Length
+    RESERVED0    : array[1..5] of byte;
+    INTENCLR     : byte;                 //0014 USART_EXT Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 USART_EXT Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 USART_EXT Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A USART_EXT Status
+    SYNCBUSY     : longWord;             //001C USART_EXT Synchronization Busy
+    RXERRCNT     : byte;                 //0020 USART_EXT Receive Error Count
+    RESERVED4    : byte;
+    LENGTH       : word;                 //0022 USART_EXT Length
+    RESERVED5    : longWord;
+    DATA         : longWord;             //0028 USART_EXT Data
+    RESERVED6    : longWord;
+    DBGCTRL      : byte;                 //0030 USART_EXT Debug Control
+  end;
+
+  TSERCOMUSART_INT_Registers = record
+    CTRLA        : longWord;             //0000 USART_INT Control A
+    CTRLB        : longWord;             //0004 USART_INT Control B
+    CTRLC        : longWord;             //0008 USART_INT Control C
+    BAUD         : word;                 //000C USART_INT Baud Rate
+    RXPL         : byte;                 //000E USART_INT Receive Pulse Length
+    RESERVED0    : array[1..5] of byte;
+    INTENCLR     : byte;                 //0014 USART_INT Interrupt Enable Clear
+    RESERVED1    : byte;
+    INTENSET     : byte;                 //0016 USART_INT Interrupt Enable Set
+    RESERVED2    : byte;
+    INTFLAG      : byte;                 //0018 USART_INT Interrupt Flag Status and Clear
+    RESERVED3    : byte;
+    STATUS       : word;                 //001A USART_INT Status
+    SYNCBUSY     : longWord;             //001C USART_INT Synchronization Busy
+    RXERRCNT     : byte;                 //0020 USART_INT Receive Error Count
+    RESERVED4    : byte;
+    LENGTH       : word;                 //0022 USART_INT Length
+    RESERVED5    : longWord;
+    DATA         : longWord;             //0028 USART_INT Data
+    RESERVED6    : longWord;
+    DBGCTRL      : byte;                 //0030 USART_INT Debug Control
+  end;
+
+  TSUPC_Registers = record
+    INTENCLR     : longWord;             //0000 Interrupt Enable Clear
+    INTENSET     : longWord;             //0004 Interrupt Enable Set
+    INTFLAG      : longWord;             //0008 Interrupt Flag Status and Clear
+    STATUS       : longWord;             //000C Power and Clocks Status
+    BOD33        : longWord;             //0010 BOD33 Control
+    RESERVED0    : longWord;
+    VREG         : longWord;             //0018 VREG Control
+    VREF         : longWord;             //001C VREF Control
+    BBPS         : longWord;             //0020 Battery Backup Power Switch
+    BKOUT        : longWord;             //0024 Backup Output Control
+    BKIN         : longWord;             //0028 Backup Input Control
+  end;
+
+  TTCCOUNT8_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : byte;                 //0014 COUNT8 Count
+    RESERVED1    : array[1..6] of byte;
+    PER          : byte;                 //001B COUNT8 Period
+    CC           : array[0..1] of byte;  //001C COUNT8 Compare and Capture
+    RESERVED2    : array[1..17] of byte;
+    PERBUF       : byte;                 //002F COUNT8 Period Buffer
+    CCBUF        : array[0..1] of byte;  //0030 COUNT8 Compare and Capture Buffer
+  end;
+
+  TTCCOUNT16_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : word;                 //0014 COUNT16 Count
+    RESERVED1    : array[1..6] of byte;
+    CC           : array[0..1] of word;  //001C COUNT16 Compare and Capture
+    RESERVED2    : array[1..16] of byte;
+    CCBUF        : array[0..1] of word;  //0030 COUNT16 Compare and Capture Buffer
+  end;
+
+  TTCCOUNT32_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    EVCTRL       : word;                 //0006 Event Control
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    STATUS       : byte;                 //000B Status
+    WAVE         : byte;                 //000C Waveform Generation Control
+    DRVCTRL      : byte;                 //000D Control C
+    RESERVED0    : byte;
+    DBGCTRL      : byte;                 //000F Debug Control
+    SYNCBUSY     : longWord;             //0010 Synchronization Status
+    COUNT        : longWord;             //0014 COUNT32 Count
+    RESERVED1    : longWord;
+    CC           : array[0..1] of longWord; //001C COUNT32 Compare and Capture
+    RESERVED2    : array[1..12] of byte;
+    CCBUF        : array[0..1] of longWord; //0030 COUNT32 Compare and Capture Buffer
+  end;
+
+  TTCC_Registers = record
+    CTRLA        : longWord;             //0000 Control A
+    CTRLBCLR     : byte;                 //0004 Control B Clear
+    CTRLBSET     : byte;                 //0005 Control B Set
+    RESERVED0    : word;
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    FCTRLA       : longWord;             //000C Recoverable Fault A Configuration
+    FCTRLB       : longWord;             //0010 Recoverable Fault B Configuration
+    WEXCTRL      : longWord;             //0014 Waveform Extension Configuration
+    DRVCTRL      : longWord;             //0018 Driver Control
+    RESERVED1    : word;
+    DBGCTRL      : byte;                 //001E Debug Control
+    RESERVED2    : byte;
+    EVCTRL       : longWord;             //0020 Event Control
+    INTENCLR     : longWord;             //0024 Interrupt Enable Clear
+    INTENSET     : longWord;             //0028 Interrupt Enable Set
+    INTFLAG      : longWord;             //002C Interrupt Flag Status and Clear
+    STATUS       : longWord;             //0030 Status
+    COUNT        : longWord;             //0034 Count
+    PATT         : word;                 //0038 Pattern
+    RESERVED3    : word;
+    WAVE         : longWord;             //003C Waveform Control
+    PER          : longWord;             //0040 Period
+    CC           : array[0..5] of longWord; //0044 Compare and Capture
+    RESERVED4    : array[1..8] of byte;
+    PATTBUF      : word;                 //0064 Pattern Buffer
+    RESERVED5    : array[1..6] of byte;
+    PERBUF       : longWord;             //006C Period Buffer
+    CCBUF        : array[0..5] of longWord; //0070 Compare and Capture Buffer
+  end;
+
+  TTRNG_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : array[1..3] of byte;
+    EVCTRL       : byte;                 //0004 Event Control
+    RESERVED1    : array[1..3] of byte;
+    INTENCLR     : byte;                 //0008 Interrupt Enable Clear
+    INTENSET     : byte;                 //0009 Interrupt Enable Set
+    INTFLAG      : byte;                 //000A Interrupt Flag Status and Clear
+    RESERVED2    : array[1..21] of byte;
+    DATA         : longWord;             //0020 Output Data
+  end;
+
+  TUSB_DEVICE_DESC_BANK_Registers = record
+    ADDR         : longWord;             //0000 DEVICE_DESC_BANK Endpoint Bank, Adress of Data Buffer
+    PCKSIZE      : longWord;             //0004 DEVICE_DESC_BANK Endpoint Bank, Packet Size
+    EXTREG       : word;                 //0008 DEVICE_DESC_BANK Endpoint Bank, Extended
+    STATUS_BK    : byte;                 //000A DEVICE_DESC_BANK Enpoint Bank, Status of Bank
+  end;
+
+  TUSB_HOST_DESC_BANK_Registers = record
+    ADDR         : longWord;             //0000 HOST_DESC_BANK Host Bank, Adress of Data Buffer
+    PCKSIZE      : longWord;             //0004 HOST_DESC_BANK Host Bank, Packet Size
+    EXTREG       : word;                 //0008 HOST_DESC_BANK Host Bank, Extended
+    STATUS_BK    : byte;                 //000A HOST_DESC_BANK Host Bank, Status of Bank
+    RESERVED0    : byte;
+    CTRL_PIPE    : word;                 //000C HOST_DESC_BANK Host Bank, Host Control Pipe
+    STATUS_PIPE  : word;                 //000E HOST_DESC_BANK Host Bank, Host Status Pipe
+  end;
+
+  TUSB_DEVICE_ENDPOINT_Registers = record
+    EPCFG        : byte;                 //0000 DEVICE_ENDPOINT End Point Configuration
+    RESERVED0    : array[1..3] of byte;
+    EPSTATUSCLR  : byte;                 //0004 DEVICE_ENDPOINT End Point Pipe Status Clear
+    EPSTATUSSET  : byte;                 //0005 DEVICE_ENDPOINT End Point Pipe Status Set
+    EPSTATUS     : byte;                 //0006 DEVICE_ENDPOINT End Point Pipe Status
+    EPINTFLAG    : byte;                 //0007 DEVICE_ENDPOINT End Point Interrupt Flag
+    EPINTENCLR   : byte;                 //0008 DEVICE_ENDPOINT End Point Interrupt Clear Flag
+    EPINTENSET   : byte;                 //0009 DEVICE_ENDPOINT End Point Interrupt Set Flag
+  end;
+
+  TUSB_HOST_PIPE_Registers = record
+    PCFG         : byte;                 //0000 HOST_PIPE End Point Configuration
+    RESERVED0    : word;
+    BINTERVAL    : byte;                 //0003 HOST_PIPE Bus Access Period of Pipe
+    PSTATUSCLR   : byte;                 //0004 HOST_PIPE End Point Pipe Status Clear
+    PSTATUSSET   : byte;                 //0005 HOST_PIPE End Point Pipe Status Set
+    PSTATUS      : byte;                 //0006 HOST_PIPE End Point Pipe Status
+    PINTFLAG     : byte;                 //0007 HOST_PIPE Pipe Interrupt Flag
+    PINTENCLR    : byte;                 //0008 HOST_PIPE Pipe Interrupt Flag Clear
+    PINTENSET    : byte;                 //0009 HOST_PIPE Pipe Interrupt Flag Set
+  end;
+
+  TUSBDEVICE_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : byte;
+    SYNCBUSY     : byte;                 //0002 Synchronization Busy
+    QOSCTRL      : byte;                 //0003 USB Quality Of Service
+    RESERVED1    : longWord;
+    CTRLB        : word;                 //0008 DEVICE Control B
+    DADD         : byte;                 //000A DEVICE Device Address
+    RESERVED2    : byte;
+    STATUS       : byte;                 //000C DEVICE Status
+    FSMSTATUS    : byte;                 //000D Finite State Machine Status
+    RESERVED3    : word;
+    FNUM         : word;                 //0010 DEVICE Device Frame Number
+    RESERVED4    : word;
+    INTENCLR     : word;                 //0014 DEVICE Device Interrupt Enable Clear
+    RESERVED5    : word;
+    INTENSET     : word;                 //0018 DEVICE Device Interrupt Enable Set
+    RESERVED6    : word;
+    INTFLAG      : word;                 //001C DEVICE Device Interrupt Flag
+    RESERVED7    : word;
+    EPINTSMRY    : word;                 //0020 DEVICE End Point Interrupt Summary
+    RESERVED8    : word;
+    DESCADD      : longWord;             //0024 Descriptor Address
+    PADCAL       : word;                 //0028 USB PAD Calibration
+    RESERVED9    : array[1..214] of byte;
+    HOST_PIPE    : array[0..7] of TUSB_HOST_PIPE_Registers;  //0100 
+  end;
+
+  TUSBHOST_Registers = record
+    CTRLA        : byte;                 //0000 Control A
+    RESERVED0    : byte;
+    SYNCBUSY     : byte;                 //0002 Synchronization Busy
+    QOSCTRL      : byte;                 //0003 USB Quality Of Service
+    RESERVED1    : longWord;
+    CTRLB        : word;                 //0008 HOST Control B
+    HSOFC        : byte;                 //000A HOST Host Start Of Frame Control
+    RESERVED2    : byte;
+    STATUS       : byte;                 //000C HOST Status
+    FSMSTATUS    : byte;                 //000D Finite State Machine Status
+    RESERVED3    : word;
+    FNUM         : word;                 //0010 HOST Host Frame Number
+    FLENHIGH     : byte;                 //0012 HOST Host Frame Length
+    RESERVED4    : byte;
+    INTENCLR     : word;                 //0014 HOST Host Interrupt Enable Clear
+    RESERVED5    : word;
+    INTENSET     : word;                 //0018 HOST Host Interrupt Enable Set
+    RESERVED6    : word;
+    INTFLAG      : word;                 //001C HOST Host Interrupt Flag
+    RESERVED7    : word;
+    PINTSMRY     : word;                 //0020 HOST Pipe Interrupt Summary
+    RESERVED8    : word;
+    DESCADD      : longWord;             //0024 Descriptor Address
+    PADCAL       : word;                 //0028 USB PAD Calibration
+    RESERVED9    : array[1..214] of byte;
+    HOST_PIPE    : array[0..7] of TUSB_HOST_PIPE_Registers;  //0100 
+  end;
+
+  TUSB_DESCRIPTORDEVICE_Registers = record
+    HOST_DESC_BANK : array[0..1] of TUSB_HOST_DESC_BANK_Registers;  //0000 
+  end;
+
+  TUSB_DESCRIPTORHOST_Registers = record
+    HOST_DESC_BANK : array[0..1] of TUSB_HOST_DESC_BANK_Registers;  //0000 
+  end;
+
+  TWDT_Registers = record
+    CTRLA        : byte;                 //0000 Control
+    CONFIG       : byte;                 //0001 Configuration
+    EWCTRL       : byte;                 //0002 Early Warning Interrupt Control
+    RESERVED0    : byte;
+    INTENCLR     : byte;                 //0004 Interrupt Enable Clear
+    INTENSET     : byte;                 //0005 Interrupt Enable Set
+    INTFLAG      : byte;                 //0006 Interrupt Flag Status and Clear
+    RESERVED1    : byte;
+    SYNCBUSY     : longWord;             //0008 Synchronization Busy
+    CLEAR        : byte;                 //000C Clear
+  end;
+
+  TETM_Registers = record
+    CR           : longWord;             //0000 ETM Main Control Register
+    CCR          : longWord;             //0004 ETM Configuration Code Register
+    TRIGGER      : longWord;             //0008 ETM Trigger Event Register
+    RESERVED0    : longWord;
+    SR           : longWord;             //0010 ETM Status Register
+    SCR          : longWord;             //0014 ETM System Configuration Register
+    RESERVED1    : array[1..8] of byte;
+    TEEVR        : longWord;             //0020 ETM TraceEnable Event Register
+    TECR1        : longWord;             //0024 ETM TraceEnable Control 1 Register
+    FFLR         : longWord;             //0028 ETM FIFO Full Level Register
+    RESERVED2    : array[1..276] of byte;
+    CNTRLDVR1    : longWord;             //0140 ETM Free-running Counter Reload Value
+    RESERVED3    : array[1..156] of byte;
+    SYNCFR       : longWord;             //01E0 ETM Synchronization Frequency Register
+    IDR          : longWord;             //01E4 ETM ID Register
+    CCER         : longWord;             //01E8 ETM Configuration Code Extension Register
+    RESERVED4    : longWord;
+    TESSEICR     : longWord;             //01F0 ETM TraceEnable Start/Stop EmbeddedICE Control Register
+    RESERVED5    : longWord;
+    TSEVT        : longWord;             //01F8 ETM TimeStamp Event Register
+    RESERVED6    : longWord;
+    TRACEIDR     : longWord;             //0200 ETM CoreSight Trace ID Register
+    RESERVED7    : longWord;
+    IDR2         : longWord;             //0208 ETM ID Register 2
+    RESERVED8    : array[1..264] of byte;
+    PDSR         : longWord;             //0314 ETM Device Power-Down Status Register
+    RESERVED9    : array[1..3016] of byte;
+    ITMISCIN     : longWord;             //0EE0 ETM Integration Test Miscellaneous Inputs
+    RESERVED10   : longWord;
+    ITTRIGOUT    : longWord;             //0EE8 ETM Integration Test Trigger Out
+    RESERVED11   : longWord;
+    ITATBCTR2    : longWord;             //0EF0 ETM Integration Test ATB Control 2
+    RESERVED12   : longWord;
+    ITATBCTR0    : longWord;             //0EF8 ETM Integration Test ATB Control 0
+    RESERVED13   : longWord;
+    ITCTRL       : longWord;             //0F00 ETM Integration Mode Control Register
+    RESERVED14   : array[1..156] of byte;
+    CLAIMSET     : longWord;             //0FA0 ETM Claim Tag Set Register
+    CLAIMCLR     : longWord;             //0FA4 ETM Claim Tag Clear Register
+    RESERVED15   : array[1..8] of byte;
+    LAR          : longWord;             //0FB0 ETM Lock Access Register
+    LSR          : longWord;             //0FB4 ETM Lock Status Register
+    AUTHSTATUS   : longWord;             //0FB8 ETM Authentication Status Register
+    RESERVED16   : array[1..16] of byte;
+    DEVTYPE      : longWord;             //0FCC ETM CoreSight Device Type Register
+    PIDR4        : longWord;             //0FD0 ETM Peripheral Identification Register #4
+    PIDR5        : longWord;             //0FD4 ETM Peripheral Identification Register #5
+    PIDR6        : longWord;             //0FD8 ETM Peripheral Identification Register #6
+    PIDR7        : longWord;             //0FDC ETM Peripheral Identification Register #7
+    PIDR0        : longWord;             //0FE0 ETM Peripheral Identification Register #0
+    PIDR1        : longWord;             //0FE4 ETM Peripheral Identification Register #1
+    PIDR2        : longWord;             //0FE8 ETM Peripheral Identification Register #2
+    PIDR3        : longWord;             //0FEC ETM Peripheral Identification Register #3
+    CIDR0        : longWord;             //0FF0 ETM Component  Identification Register #0
+    CIDR1        : longWord;             //0FF4 ETM Component  Identification Register #1
+    CIDR2        : longWord;             //0FF8 ETM Component  Identification Register #2
+    CIDR3        : longWord;             //0FFC ETM Component  Identification Register #3
+  end;
+
+  TMPU_Registers = record
+    &TYPE        : longWord;             //0000 MPU Type Register
+    CTRL         : longWord;             //0004 MPU Control Register
+    RNR          : longWord;             //0008 MPU Region Number Register
+    RBAR         : longWord;             //000C MPU Region Base Address Register
+    RASR         : longWord;             //0010 MPU Region Attribute and Size Register
+    RBAR_A1      : longWord;             //0014 MPU Alias 1 Region Base Address Register
+    RASR_A1      : longWord;             //0018 MPU Alias 1 Region Attribute and Size Register
+    RBAR_A2      : longWord;             //001C MPU Alias 2 Region Base Address Register
+    RASR_A2      : longWord;             //0020 MPU Alias 2 Region Attribute and Size Register
+    RBAR_A3      : longWord;             //0024 MPU Alias 3 Region Base Address Register
+    RASR_A3      : longWord;             //0028 MPU Alias 3 Region Attribute and Size Register
+  end;
+
+  TSystemControl_Registers = record
+    ICTR         : longWord;             //0004 Interrupt Controller Type Register
+    ACTLR        : longWord;             //0008 Auxiliary Control Register
+    RESERVED0    : array[1..3316] of byte;
+    CPUID        : longWord;             //0D00 CPUID Base Register
+    ICSR         : longWord;             //0D04 Interrupt Control and State Register
+    VTOR         : longWord;             //0D08 Vector Table Offset Register
+    AIRCR        : longWord;             //0D0C Application Interrupt and Reset Control Register
+    SCR          : longWord;             //0D10 System Control Register
+    CCR          : longWord;             //0D14 Configuration and Control Register
+    SHPR1        : longWord;             //0D18 System Handler Priority Register 1
+    SHPR2        : longWord;             //0D1C System Handler Priority Register 2
+    SHPR3        : longWord;             //0D20 System Handler Priority Register 3
+    SHCSR        : longWord;             //0D24 System Handler Control and State Register
+    CFSR         : longWord;             //0D28 Configurable Fault Status Register
+    HFSR         : longWord;             //0D2C HardFault Status Register
+    DFSR         : longWord;             //0D30 Debug Fault Status Register
+    MMFAR        : longWord;             //0D34 MemManage Fault Address Register
+    BFAR         : longWord;             //0D38 BusFault Address Register
+    AFSR         : longWord;             //0D3C Auxiliary Fault Status Register
+    PFR          : array[0..1] of longWord; //0D40 Processor Feature Register
+    DFR          : longWord;             //0D48 Debug Feature Register
+    ADR          : longWord;             //0D4C Auxiliary Feature Register
+    MMFR         : array[0..3] of longWord; //0D50 Memory Model Feature Register
+    ISAR         : array[0..4] of longWord; //0D60 Instruction Set Attributes Register
+    RESERVED1    : array[1..20] of byte;
+    CPACR        : longWord;             //0D88 Coprocessor Access Control Register
+  end;
+
+  TTPIU_Registers = record
+    SSPSR        : longWord;             //0000 Supported Parallel Port Size Register
+    CSPSR        : longWord;             //0004 Current Parallel Port Size Register
+    RESERVED0    : array[1..8] of byte;
+    ACPR         : longWord;             //0010 Asynchronous Clock Prescaler Register
+    RESERVED1    : array[1..220] of byte;
+    SPPR         : longWord;             //00F0 Selected Pin Protocol Register
+    RESERVED2    : array[1..524] of byte;
+    FFSR         : longWord;             //0300 Formatter and Flush Status Register
+    FFCR         : longWord;             //0304 Formatter and Flush Control Register
+    FSCR         : longWord;             //0308 Formatter Synchronization Counter Register
+    RESERVED3    : array[1..3036] of byte;
+    TRIGGER      : longWord;             //0EE8 TRIGGER
+    FIFO0        : longWord;             //0EEC Integration ETM Data
+    ITATBCTR2    : longWord;             //0EF0 ITATBCTR2
+    RESERVED4    : longWord;
+    ITATBCTR0    : longWord;             //0EF8 ITATBCTR0
+    FIFO1        : longWord;             //0EFC Integration ITM Data
+    ITCTRL       : longWord;             //0F00 Integration Mode Control
+    RESERVED5    : array[1..156] of byte;
+    CLAIMSET     : longWord;             //0FA0 Claim tag set
+    CLAIMCLR     : longWord;             //0FA4 Claim tag clear
+    RESERVED6    : array[1..32] of byte;
+    DEVID        : longWord;             //0FC8 TPIU_DEVID
+    DEVTYPE      : longWord;             //0FCC TPIU_DEVTYPE
+  end;
+
+  TRTC_Registers = record
+  case byte of
+    0: ( MODE0 : TRTCMODE0_Registers );
+    1: ( MODE1 : TRTCMODE1_Registers );
+    2: ( MODE2 : TRTCMODE2_Registers );
+    end;
+
+  TSERCOM_Registers = record
+  case byte of
+    0: ( I2CM : TSERCOMI2CM_Registers );
+    1: ( I2CS : TSERCOMI2CS_Registers );
+    2: ( SPIS : TSERCOMSPIS_Registers );
+    3: ( SPIM : TSERCOMSPIM_Registers );
+    4: ( USART_EXT : TSERCOMUSART_EXT_Registers );
+    5: ( USART_INT : TSERCOMUSART_INT_Registers );
+    end;
+
+  TTC_Registers = record
+  case byte of
+    0: ( COUNT8 : TTCCOUNT8_Registers );
+    1: ( COUNT16 : TTCCOUNT16_Registers );
+    2: ( COUNT32 : TTCCOUNT32_Registers );
+    end;
+
+  TUSB_Registers = record
+  case byte of
+    0: ( DEVICE : TUSBDEVICE_Registers );
+    1: ( HOST : TUSBHOST_Registers );
+    end;
+
+  TUSB_DESCRIPTOR_Registers = record
+  case byte of
+    0: ( DEVICE : TUSB_DESCRIPTORDEVICE_Registers );
+    1: ( HOST : TUSB_DESCRIPTORHOST_Registers );
+    end;
+
+const
+  AC_BASE             = $42002000;
+  ADC0_BASE           = $43001c00;
+  ADC1_BASE           = $43002000;
+  AES_BASE            = $42002400;
+  CCL_BASE            = $42003800;
+  CMCC_BASE           = $41006000;
+  DAC_BASE            = $43002400;
+  DMAC_BASE           = $4100a000;
+  DSU_BASE            = $41002000;
+  EIC_BASE            = $40002800;
+  ETM_BASE            = $e0041000;
+  EVSYS_BASE          = $4100e000;
+  FREQM_BASE          = $40002c00;
+  GCLK_BASE           = $40001c00;
+  HMATRIX_BASE        = $4100c000;
+  I2S_BASE            = $43002800;
+  ICM_BASE            = $42002c00;
+  MCLK_BASE           = $40000800;
+  MPU_BASE            = $e000ed90;
+  NVMCTRL_BASE        = $41004000;
+  OSC32KCTRL_BASE     = $40001400;
+  OSCCTRL_BASE        = $40001000;
+  PAC_BASE            = $40000000;
+  PCC_BASE            = $43002c00;
+  PDEC_BASE           = $42001c00;
+  PM_BASE             = $40000400;
+  PORT_BASE           = $41008000;
+  QSPI_BASE           = $42003400;
+  RAMECC_BASE         = $41020000;
+  RSTC_BASE           = $40000c00;
+  RTC_BASE            = $40002400;
+  SDHC0_BASE          = $45000000;
+  SDHC1_BASE          = $46000000;
+  SERCOM0_BASE        = $40003000;
+  SERCOM1_BASE        = $40003400;
+  SERCOM2_BASE        = $41012000;
+  SERCOM3_BASE        = $41014000;
+  SERCOM4_BASE        = $43000000;
+  SERCOM5_BASE        = $43000400;
+  SERCOM6_BASE        = $43000800;
+  SERCOM7_BASE        = $43000c00;
+  SUPC_BASE           = $40001800;
+  SW0_FUSES_BASE      = $00800080;
+  SystemControl_BASE  = $e000e000;
+  TC0_BASE            = $40003800;
+  TC1_BASE            = $40003c00;
+  TC2_BASE            = $4101a000;
+  TC3_BASE            = $4101c000;
+  TC4_BASE            = $42001400;
+  TC5_BASE            = $42001800;
+  TC6_BASE            = $43001400;
+  TC7_BASE            = $43001800;
+  TCC0_BASE           = $41016000;
+  TCC1_BASE           = $41018000;
+  TCC2_BASE           = $42000c00;
+  TCC3_BASE           = $42001000;
+  TCC4_BASE           = $43001000;
+  TEMP_LOG_FUSES_BASE = $00800100;
+  TPIU_BASE           = $e0040000;
+  TRNG_BASE           = $42002800;
+  USB_BASE            = $41000000;
+  USER_FUSES_BASE     = $00804000;
+  WDT_BASE            = $40002000;
+
+var
+  AC                  : TAC_Registers        absolute AC_BASE;
+  ADC0                : TADC_Registers       absolute ADC0_BASE;
+  ADC1                : TADC_Registers       absolute ADC1_BASE;
+  AES                 : TAES_Registers       absolute AES_BASE;
+  CCL                 : TCCL_Registers       absolute CCL_BASE;
+  CMCC                : TCMCC_Registers      absolute CMCC_BASE;
+  DAC                 : TDAC_Registers       absolute DAC_BASE;
+  DMAC                : TDMAC_Registers      absolute DMAC_BASE;
+  DSU                 : TDSU_Registers       absolute DSU_BASE;
+  EIC                 : TEIC_Registers       absolute EIC_BASE;
+  ETM                 : TETM_Registers       absolute ETM_BASE;
+  EVSYS               : TEVSYS_Registers     absolute EVSYS_BASE;
+  FREQM               : TFREQM_Registers     absolute FREQM_BASE;
+  GCLK                : TGCLK_Registers      absolute GCLK_BASE;
+  HMATRIX             : THMATRIXB_Registers  absolute HMATRIX_BASE;
+  I2S                 : TI2S_Registers       absolute I2S_BASE;
+  ICM                 : TICM_Registers       absolute ICM_BASE;
+  MCLK                : TMCLK_Registers      absolute MCLK_BASE;
+  MPU                 : TMPU_Registers       absolute MPU_BASE;
+  NVMCTRL             : TNVMCTRL_Registers   absolute NVMCTRL_BASE;
+  OSC32KCTRL          : TOSC32KCTRL_Registers absolute OSC32KCTRL_BASE;
+  OSCCTRL             : TOSCCTRL_Registers   absolute OSCCTRL_BASE;
+  PAC                 : TPAC_Registers       absolute PAC_BASE;
+  PCC                 : TPCC_Registers       absolute PCC_BASE;
+  PDEC                : TPDEC_Registers      absolute PDEC_BASE;
+  PM                  : TPM_Registers        absolute PM_BASE;
+  PORT                : TPORT_Registers      absolute PORT_BASE;
+  QSPI                : TQSPI_Registers      absolute QSPI_BASE;
+  RAMECC              : TRAMECC_Registers    absolute RAMECC_BASE;
+  RSTC                : TRSTC_Registers      absolute RSTC_BASE;
+  RTC                 : TRTC_Registers       absolute RTC_BASE;
+  SDHC0               : TSDHC_Registers      absolute SDHC0_BASE;
+  SDHC1               : TSDHC_Registers      absolute SDHC1_BASE;
+  SERCOM0             : TSERCOM_Registers    absolute SERCOM0_BASE;
+  SERCOM1             : TSERCOM_Registers    absolute SERCOM1_BASE;
+  SERCOM2             : TSERCOM_Registers    absolute SERCOM2_BASE;
+  SERCOM3             : TSERCOM_Registers    absolute SERCOM3_BASE;
+  SERCOM4             : TSERCOM_Registers    absolute SERCOM4_BASE;
+  SERCOM5             : TSERCOM_Registers    absolute SERCOM5_BASE;
+  SERCOM6             : TSERCOM_Registers    absolute SERCOM6_BASE;
+  SERCOM7             : TSERCOM_Registers    absolute SERCOM7_BASE;
+  SUPC                : TSUPC_Registers      absolute SUPC_BASE;
+  SW0_FUSES           : TSW0_FUSES_Registers absolute SW0_FUSES_BASE;
+  SystemControl       : TSystemControl_Registers absolute SystemControl_BASE;
+  TC0                 : TTC_Registers        absolute TC0_BASE;
+  TC1                 : TTC_Registers        absolute TC1_BASE;
+  TC2                 : TTC_Registers        absolute TC2_BASE;
+  TC3                 : TTC_Registers        absolute TC3_BASE;
+  TC4                 : TTC_Registers        absolute TC4_BASE;
+  TC5                 : TTC_Registers        absolute TC5_BASE;
+  TC6                 : TTC_Registers        absolute TC6_BASE;
+  TC7                 : TTC_Registers        absolute TC7_BASE;
+  TCC0                : TTCC_Registers       absolute TCC0_BASE;
+  TCC1                : TTCC_Registers       absolute TCC1_BASE;
+  TCC2                : TTCC_Registers       absolute TCC2_BASE;
+  TCC3                : TTCC_Registers       absolute TCC3_BASE;
+  TCC4                : TTCC_Registers       absolute TCC4_BASE;
+  TEMP_LOG_FUSES      : TTEMP_LOG_FUSES_Registers absolute TEMP_LOG_FUSES_BASE;
+  TPIU                : TTPIU_Registers      absolute TPIU_BASE;
+  TRNG                : TTRNG_Registers      absolute TRNG_BASE;
+  USB                 : TUSB_Registers       absolute USB_BASE;
+  USER_FUSES          : TUSER_FUSES_Registers absolute USER_FUSES_BASE;
+  WDT                 : TWDT_Registers       absolute WDT_BASE;
+
+implementation
+
+{$DEFINE IMPLEMENTATION}
+{$UNDEF INTERFACE}
+
+procedure NonMaskableInt_interrupt;   external name 'NonMaskableInt_interrupt';
+procedure HardFault_interrupt;        external name 'HardFault_interrupt';
+procedure MemoryManagement_interrupt; external name 'MemoryManagement_interrupt';
+procedure BusFault_interrupt;         external name 'BusFault_interrupt';
+procedure UsageFault_interrupt;       external name 'UsageFault_interrupt';
+procedure SVCall_interrupt;           external name 'SVCall_interrupt';
+procedure DebugMonitor_interrupt;     external name 'DebugMonitor_interrupt';
+procedure PendSV_interrupt;           external name 'PendSV_interrupt';
+procedure SysTick_interrupt;          external name 'SysTick_interrupt';
+procedure PM_interrupt;               external name 'PM_interrupt';
+procedure MCLK_interrupt;             external name 'MCLK_interrupt';
+procedure OSCCTRL_0_interrupt;        external name 'OSCCTRL_0_interrupt';
+procedure OSCCTRL_1_interrupt;        external name 'OSCCTRL_1_interrupt';
+procedure OSCCTRL_2_interrupt;        external name 'OSCCTRL_2_interrupt';
+procedure OSCCTRL_3_interrupt;        external name 'OSCCTRL_3_interrupt';
+procedure OSCCTRL_4_interrupt;        external name 'OSCCTRL_4_interrupt';
+procedure OSC32KCTRL_interrupt;       external name 'OSC32KCTRL_interrupt';
+procedure SUPC_0_interrupt;           external name 'SUPC_0_interrupt';
+procedure SUPC_1_interrupt;           external name 'SUPC_1_interrupt';
+procedure WDT_interrupt;              external name 'WDT_interrupt';
+procedure RTC_interrupt;              external name 'RTC_interrupt';
+procedure EIC_0_interrupt;            external name 'EIC_0_interrupt';
+procedure EIC_1_interrupt;            external name 'EIC_1_interrupt';
+procedure EIC_2_interrupt;            external name 'EIC_2_interrupt';
+procedure EIC_3_interrupt;            external name 'EIC_3_interrupt';
+procedure EIC_4_interrupt;            external name 'EIC_4_interrupt';
+procedure EIC_5_interrupt;            external name 'EIC_5_interrupt';
+procedure EIC_6_interrupt;            external name 'EIC_6_interrupt';
+procedure EIC_7_interrupt;            external name 'EIC_7_interrupt';
+procedure EIC_8_interrupt;            external name 'EIC_8_interrupt';
+procedure EIC_9_interrupt;            external name 'EIC_9_interrupt';
+procedure EIC_10_interrupt;           external name 'EIC_10_interrupt';
+procedure EIC_11_interrupt;           external name 'EIC_11_interrupt';
+procedure EIC_12_interrupt;           external name 'EIC_12_interrupt';
+procedure EIC_13_interrupt;           external name 'EIC_13_interrupt';
+procedure EIC_14_interrupt;           external name 'EIC_14_interrupt';
+procedure EIC_15_interrupt;           external name 'EIC_15_interrupt';
+procedure FREQM_interrupt;            external name 'FREQM_interrupt';
+procedure NVMCTRL_0_interrupt;        external name 'NVMCTRL_0_interrupt';
+procedure NVMCTRL_1_interrupt;        external name 'NVMCTRL_1_interrupt';
+procedure DMAC_0_interrupt;           external name 'DMAC_0_interrupt';
+procedure DMAC_1_interrupt;           external name 'DMAC_1_interrupt';
+procedure DMAC_2_interrupt;           external name 'DMAC_2_interrupt';
+procedure DMAC_3_interrupt;           external name 'DMAC_3_interrupt';
+procedure DMAC_4_interrupt;           external name 'DMAC_4_interrupt';
+procedure EVSYS_0_interrupt;          external name 'EVSYS_0_interrupt';
+procedure EVSYS_1_interrupt;          external name 'EVSYS_1_interrupt';
+procedure EVSYS_2_interrupt;          external name 'EVSYS_2_interrupt';
+procedure EVSYS_3_interrupt;          external name 'EVSYS_3_interrupt';
+procedure EVSYS_4_interrupt;          external name 'EVSYS_4_interrupt';
+procedure PAC_interrupt;              external name 'PAC_interrupt';
+procedure RAMECC_interrupt;           external name 'RAMECC_interrupt';
+procedure SERCOM0_0_interrupt;        external name 'SERCOM0_0_interrupt';
+procedure SERCOM0_1_interrupt;        external name 'SERCOM0_1_interrupt';
+procedure SERCOM0_2_interrupt;        external name 'SERCOM0_2_interrupt';
+procedure SERCOM0_3_interrupt;        external name 'SERCOM0_3_interrupt';
+procedure SERCOM1_0_interrupt;        external name 'SERCOM1_0_interrupt';
+procedure SERCOM1_1_interrupt;        external name 'SERCOM1_1_interrupt';
+procedure SERCOM1_2_interrupt;        external name 'SERCOM1_2_interrupt';
+procedure SERCOM1_3_interrupt;        external name 'SERCOM1_3_interrupt';
+procedure SERCOM2_0_interrupt;        external name 'SERCOM2_0_interrupt';
+procedure SERCOM2_1_interrupt;        external name 'SERCOM2_1_interrupt';
+procedure SERCOM2_2_interrupt;        external name 'SERCOM2_2_interrupt';
+procedure SERCOM2_3_interrupt;        external name 'SERCOM2_3_interrupt';
+procedure SERCOM3_0_interrupt;        external name 'SERCOM3_0_interrupt';
+procedure SERCOM3_1_interrupt;        external name 'SERCOM3_1_interrupt';
+procedure SERCOM3_2_interrupt;        external name 'SERCOM3_2_interrupt';
+procedure SERCOM3_3_interrupt;        external name 'SERCOM3_3_interrupt';
+procedure SERCOM4_0_interrupt;        external name 'SERCOM4_0_interrupt';
+procedure SERCOM4_1_interrupt;        external name 'SERCOM4_1_interrupt';
+procedure SERCOM4_2_interrupt;        external name 'SERCOM4_2_interrupt';
+procedure SERCOM4_3_interrupt;        external name 'SERCOM4_3_interrupt';
+procedure SERCOM5_0_interrupt;        external name 'SERCOM5_0_interrupt';
+procedure SERCOM5_1_interrupt;        external name 'SERCOM5_1_interrupt';
+procedure SERCOM5_2_interrupt;        external name 'SERCOM5_2_interrupt';
+procedure SERCOM5_3_interrupt;        external name 'SERCOM5_3_interrupt';
+procedure SERCOM6_0_interrupt;        external name 'SERCOM6_0_interrupt';
+procedure SERCOM6_1_interrupt;        external name 'SERCOM6_1_interrupt';
+procedure SERCOM6_2_interrupt;        external name 'SERCOM6_2_interrupt';
+procedure SERCOM6_3_interrupt;        external name 'SERCOM6_3_interrupt';
+procedure SERCOM7_0_interrupt;        external name 'SERCOM7_0_interrupt';
+procedure SERCOM7_1_interrupt;        external name 'SERCOM7_1_interrupt';
+procedure SERCOM7_2_interrupt;        external name 'SERCOM7_2_interrupt';
+procedure SERCOM7_3_interrupt;        external name 'SERCOM7_3_interrupt';
+procedure USB_0_interrupt;            external name 'USB_0_interrupt';
+procedure USB_1_interrupt;            external name 'USB_1_interrupt';
+procedure USB_2_interrupt;            external name 'USB_2_interrupt';
+procedure USB_3_interrupt;            external name 'USB_3_interrupt';
+procedure TCC0_0_interrupt;           external name 'TCC0_0_interrupt';
+procedure TCC0_1_interrupt;           external name 'TCC0_1_interrupt';
+procedure TCC0_2_interrupt;           external name 'TCC0_2_interrupt';
+procedure TCC0_3_interrupt;           external name 'TCC0_3_interrupt';
+procedure TCC0_4_interrupt;           external name 'TCC0_4_interrupt';
+procedure TCC0_5_interrupt;           external name 'TCC0_5_interrupt';
+procedure TCC0_6_interrupt;           external name 'TCC0_6_interrupt';
+procedure TCC1_0_interrupt;           external name 'TCC1_0_interrupt';
+procedure TCC1_1_interrupt;           external name 'TCC1_1_interrupt';
+procedure TCC1_2_interrupt;           external name 'TCC1_2_interrupt';
+procedure TCC1_3_interrupt;           external name 'TCC1_3_interrupt';
+procedure TCC1_4_interrupt;           external name 'TCC1_4_interrupt';
+procedure TCC2_0_interrupt;           external name 'TCC2_0_interrupt';
+procedure TCC2_1_interrupt;           external name 'TCC2_1_interrupt';
+procedure TCC2_2_interrupt;           external name 'TCC2_2_interrupt';
+procedure TCC2_3_interrupt;           external name 'TCC2_3_interrupt';
+procedure TCC3_0_interrupt;           external name 'TCC3_0_interrupt';
+procedure TCC3_1_interrupt;           external name 'TCC3_1_interrupt';
+procedure TCC3_2_interrupt;           external name 'TCC3_2_interrupt';
+procedure TCC4_0_interrupt;           external name 'TCC4_0_interrupt';
+procedure TCC4_1_interrupt;           external name 'TCC4_1_interrupt';
+procedure TCC4_2_interrupt;           external name 'TCC4_2_interrupt';
+procedure TC0_interrupt;              external name 'TC0_interrupt';
+procedure TC1_interrupt;              external name 'TC1_interrupt';
+procedure TC2_interrupt;              external name 'TC2_interrupt';
+procedure TC3_interrupt;              external name 'TC3_interrupt';
+procedure TC4_interrupt;              external name 'TC4_interrupt';
+procedure TC5_interrupt;              external name 'TC5_interrupt';
+procedure TC6_interrupt;              external name 'TC6_interrupt';
+procedure TC7_interrupt;              external name 'TC7_interrupt';
+procedure PDEC_0_interrupt;           external name 'PDEC_0_interrupt';
+procedure PDEC_1_interrupt;           external name 'PDEC_1_interrupt';
+procedure PDEC_2_interrupt;           external name 'PDEC_2_interrupt';
+procedure ADC0_0_interrupt;           external name 'ADC0_0_interrupt';
+procedure ADC0_1_interrupt;           external name 'ADC0_1_interrupt';
+procedure ADC1_0_interrupt;           external name 'ADC1_0_interrupt';
+procedure ADC1_1_interrupt;           external name 'ADC1_1_interrupt';
+procedure AC_interrupt;               external name 'AC_interrupt';
+procedure DAC_0_interrupt;            external name 'DAC_0_interrupt';
+procedure DAC_1_interrupt;            external name 'DAC_1_interrupt';
+procedure DAC_2_interrupt;            external name 'DAC_2_interrupt';
+procedure DAC_3_interrupt;            external name 'DAC_3_interrupt';
+procedure DAC_4_interrupt;            external name 'DAC_4_interrupt';
+procedure I2S_interrupt;              external name 'I2S_interrupt';
+procedure PCC_interrupt;              external name 'PCC_interrupt';
+procedure AES_interrupt;              external name 'AES_interrupt';
+procedure TRNG_interrupt;             external name 'TRNG_interrupt';
+procedure ICM_interrupt;              external name 'ICM_interrupt';
+procedure PUKCC_interrupt;            external name 'PUKCC_interrupt';
+procedure QSPI_interrupt;             external name 'QSPI_interrupt';
+procedure SDHC0_interrupt;            external name 'SDHC0_interrupt';
+procedure SDHC1_interrupt;            external name 'SDHC1_interrupt';
+
+{$i    cortexm4f_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+  .section ".init.interrupt_vectors"
+  interrupt_vectors:
+  .long _stack_top
+  .long Startup
+  .long NonMaskableInt_interrupt;
+  .long HardFault_interrupt;
+  .long MemoryManagement_interrupt;
+  .long BusFault_interrupt;
+  .long UsageFault_interrupt;
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long SVCall_interrupt;
+  .long DebugMonitor_interrupt;
+  .long 0
+  .long PendSV_interrupt;
+  .long SysTick_interrupt;
+  .long PM_interrupt;
+  .long MCLK_interrupt;
+  .long OSCCTRL_0_interrupt;
+  .long OSCCTRL_1_interrupt;
+  .long OSCCTRL_2_interrupt;
+  .long OSCCTRL_3_interrupt;
+  .long OSCCTRL_4_interrupt;
+  .long OSC32KCTRL_interrupt;
+  .long SUPC_0_interrupt;
+  .long SUPC_1_interrupt;
+  .long WDT_interrupt;
+  .long RTC_interrupt;
+  .long EIC_0_interrupt;
+  .long EIC_1_interrupt;
+  .long EIC_2_interrupt;
+  .long EIC_3_interrupt;
+  .long EIC_4_interrupt;
+  .long EIC_5_interrupt;
+  .long EIC_6_interrupt;
+  .long EIC_7_interrupt;
+  .long EIC_8_interrupt;
+  .long EIC_9_interrupt;
+  .long EIC_10_interrupt;
+  .long EIC_11_interrupt;
+  .long EIC_12_interrupt;
+  .long EIC_13_interrupt;
+  .long EIC_14_interrupt;
+  .long EIC_15_interrupt;
+  .long FREQM_interrupt;
+  .long NVMCTRL_0_interrupt;
+  .long NVMCTRL_1_interrupt;
+  .long DMAC_0_interrupt;
+  .long DMAC_1_interrupt;
+  .long DMAC_2_interrupt;
+  .long DMAC_3_interrupt;
+  .long DMAC_4_interrupt;
+  .long EVSYS_0_interrupt;
+  .long EVSYS_1_interrupt;
+  .long EVSYS_2_interrupt;
+  .long EVSYS_3_interrupt;
+  .long EVSYS_4_interrupt;
+  .long PAC_interrupt;
+  .long 0
+  .long 0
+  .long 0
+  .long RAMECC_interrupt;
+  .long SERCOM0_0_interrupt;
+  .long SERCOM0_1_interrupt;
+  .long SERCOM0_2_interrupt;
+  .long SERCOM0_3_interrupt;
+  .long SERCOM1_0_interrupt;
+  .long SERCOM1_1_interrupt;
+  .long SERCOM1_2_interrupt;
+  .long SERCOM1_3_interrupt;
+  .long SERCOM2_0_interrupt;
+  .long SERCOM2_1_interrupt;
+  .long SERCOM2_2_interrupt;
+  .long SERCOM2_3_interrupt;
+  .long SERCOM3_0_interrupt;
+  .long SERCOM3_1_interrupt;
+  .long SERCOM3_2_interrupt;
+  .long SERCOM3_3_interrupt;
+  .long SERCOM4_0_interrupt;
+  .long SERCOM4_1_interrupt;
+  .long SERCOM4_2_interrupt;
+  .long SERCOM4_3_interrupt;
+  .long SERCOM5_0_interrupt;
+  .long SERCOM5_1_interrupt;
+  .long SERCOM5_2_interrupt;
+  .long SERCOM5_3_interrupt;
+  .long SERCOM6_0_interrupt;
+  .long SERCOM6_1_interrupt;
+  .long SERCOM6_2_interrupt;
+  .long SERCOM6_3_interrupt;
+  .long SERCOM7_0_interrupt;
+  .long SERCOM7_1_interrupt;
+  .long SERCOM7_2_interrupt;
+  .long SERCOM7_3_interrupt;
+  .long 0
+  .long 0
+  .long USB_0_interrupt;
+  .long USB_1_interrupt;
+  .long USB_2_interrupt;
+  .long USB_3_interrupt;
+  .long 0
+  .long TCC0_0_interrupt;
+  .long TCC0_1_interrupt;
+  .long TCC0_2_interrupt;
+  .long TCC0_3_interrupt;
+  .long TCC0_4_interrupt;
+  .long TCC0_5_interrupt;
+  .long TCC0_6_interrupt;
+  .long TCC1_0_interrupt;
+  .long TCC1_1_interrupt;
+  .long TCC1_2_interrupt;
+  .long TCC1_3_interrupt;
+  .long TCC1_4_interrupt;
+  .long TCC2_0_interrupt;
+  .long TCC2_1_interrupt;
+  .long TCC2_2_interrupt;
+  .long TCC2_3_interrupt;
+  .long TCC3_0_interrupt;
+  .long TCC3_1_interrupt;
+  .long TCC3_2_interrupt;
+  .long TCC4_0_interrupt;
+  .long TCC4_1_interrupt;
+  .long TCC4_2_interrupt;
+  .long TC0_interrupt;
+  .long TC1_interrupt;
+  .long TC2_interrupt;
+  .long TC3_interrupt;
+  .long TC4_interrupt;
+  .long TC5_interrupt;
+  .long TC6_interrupt;
+  .long TC7_interrupt;
+  .long PDEC_0_interrupt;
+  .long PDEC_1_interrupt;
+  .long PDEC_2_interrupt;
+  .long ADC0_0_interrupt;
+  .long ADC0_1_interrupt;
+  .long ADC1_0_interrupt;
+  .long ADC1_1_interrupt;
+  .long AC_interrupt;
+  .long DAC_0_interrupt;
+  .long DAC_1_interrupt;
+  .long DAC_2_interrupt;
+  .long DAC_3_interrupt;
+  .long DAC_4_interrupt;
+  .long I2S_interrupt;
+  .long PCC_interrupt;
+  .long AES_interrupt;
+  .long TRNG_interrupt;
+  .long ICM_interrupt;
+  .long PUKCC_interrupt;
+  .long QSPI_interrupt;
+  .long SDHC0_interrupt;
+  .long SDHC1_interrupt;
+
+  .weak NonMaskableInt_interrupt;
+  .weak HardFault_interrupt;
+  .weak MemoryManagement_interrupt;
+  .weak BusFault_interrupt;
+  .weak UsageFault_interrupt;
+  .weak SVCall_interrupt;
+  .weak DebugMonitor_interrupt;
+  .weak PendSV_interrupt;
+  .weak SysTick_interrupt;
+  .weak PM_interrupt;
+  .weak MCLK_interrupt;
+  .weak OSCCTRL_0_interrupt;
+  .weak OSCCTRL_1_interrupt;
+  .weak OSCCTRL_2_interrupt;
+  .weak OSCCTRL_3_interrupt;
+  .weak OSCCTRL_4_interrupt;
+  .weak OSC32KCTRL_interrupt;
+  .weak SUPC_0_interrupt;
+  .weak SUPC_1_interrupt;
+  .weak WDT_interrupt;
+  .weak RTC_interrupt;
+  .weak EIC_0_interrupt;
+  .weak EIC_1_interrupt;
+  .weak EIC_2_interrupt;
+  .weak EIC_3_interrupt;
+  .weak EIC_4_interrupt;
+  .weak EIC_5_interrupt;
+  .weak EIC_6_interrupt;
+  .weak EIC_7_interrupt;
+  .weak EIC_8_interrupt;
+  .weak EIC_9_interrupt;
+  .weak EIC_10_interrupt;
+  .weak EIC_11_interrupt;
+  .weak EIC_12_interrupt;
+  .weak EIC_13_interrupt;
+  .weak EIC_14_interrupt;
+  .weak EIC_15_interrupt;
+  .weak FREQM_interrupt;
+  .weak NVMCTRL_0_interrupt;
+  .weak NVMCTRL_1_interrupt;
+  .weak DMAC_0_interrupt;
+  .weak DMAC_1_interrupt;
+  .weak DMAC_2_interrupt;
+  .weak DMAC_3_interrupt;
+  .weak DMAC_4_interrupt;
+  .weak EVSYS_0_interrupt;
+  .weak EVSYS_1_interrupt;
+  .weak EVSYS_2_interrupt;
+  .weak EVSYS_3_interrupt;
+  .weak EVSYS_4_interrupt;
+  .weak PAC_interrupt;
+  .weak RAMECC_interrupt;
+  .weak SERCOM0_0_interrupt;
+  .weak SERCOM0_1_interrupt;
+  .weak SERCOM0_2_interrupt;
+  .weak SERCOM0_3_interrupt;
+  .weak SERCOM1_0_interrupt;
+  .weak SERCOM1_1_interrupt;
+  .weak SERCOM1_2_interrupt;
+  .weak SERCOM1_3_interrupt;
+  .weak SERCOM2_0_interrupt;
+  .weak SERCOM2_1_interrupt;
+  .weak SERCOM2_2_interrupt;
+  .weak SERCOM2_3_interrupt;
+  .weak SERCOM3_0_interrupt;
+  .weak SERCOM3_1_interrupt;
+  .weak SERCOM3_2_interrupt;
+  .weak SERCOM3_3_interrupt;
+  .weak SERCOM4_0_interrupt;
+  .weak SERCOM4_1_interrupt;
+  .weak SERCOM4_2_interrupt;
+  .weak SERCOM4_3_interrupt;
+  .weak SERCOM5_0_interrupt;
+  .weak SERCOM5_1_interrupt;
+  .weak SERCOM5_2_interrupt;
+  .weak SERCOM5_3_interrupt;
+  .weak SERCOM6_0_interrupt;
+  .weak SERCOM6_1_interrupt;
+  .weak SERCOM6_2_interrupt;
+  .weak SERCOM6_3_interrupt;
+  .weak SERCOM7_0_interrupt;
+  .weak SERCOM7_1_interrupt;
+  .weak SERCOM7_2_interrupt;
+  .weak SERCOM7_3_interrupt;
+  .weak USB_0_interrupt;
+  .weak USB_1_interrupt;
+  .weak USB_2_interrupt;
+  .weak USB_3_interrupt;
+  .weak TCC0_0_interrupt;
+  .weak TCC0_1_interrupt;
+  .weak TCC0_2_interrupt;
+  .weak TCC0_3_interrupt;
+  .weak TCC0_4_interrupt;
+  .weak TCC0_5_interrupt;
+  .weak TCC0_6_interrupt;
+  .weak TCC1_0_interrupt;
+  .weak TCC1_1_interrupt;
+  .weak TCC1_2_interrupt;
+  .weak TCC1_3_interrupt;
+  .weak TCC1_4_interrupt;
+  .weak TCC2_0_interrupt;
+  .weak TCC2_1_interrupt;
+  .weak TCC2_2_interrupt;
+  .weak TCC2_3_interrupt;
+  .weak TCC3_0_interrupt;
+  .weak TCC3_1_interrupt;
+  .weak TCC3_2_interrupt;
+  .weak TCC4_0_interrupt;
+  .weak TCC4_1_interrupt;
+  .weak TCC4_2_interrupt;
+  .weak TC0_interrupt;
+  .weak TC1_interrupt;
+  .weak TC2_interrupt;
+  .weak TC3_interrupt;
+  .weak TC4_interrupt;
+  .weak TC5_interrupt;
+  .weak TC6_interrupt;
+  .weak TC7_interrupt;
+  .weak PDEC_0_interrupt;
+  .weak PDEC_1_interrupt;
+  .weak PDEC_2_interrupt;
+  .weak ADC0_0_interrupt;
+  .weak ADC0_1_interrupt;
+  .weak ADC1_0_interrupt;
+  .weak ADC1_1_interrupt;
+  .weak AC_interrupt;
+  .weak DAC_0_interrupt;
+  .weak DAC_1_interrupt;
+  .weak DAC_2_interrupt;
+  .weak DAC_3_interrupt;
+  .weak DAC_4_interrupt;
+  .weak I2S_interrupt;
+  .weak PCC_interrupt;
+  .weak AES_interrupt;
+  .weak TRNG_interrupt;
+  .weak ICM_interrupt;
+  .weak PUKCC_interrupt;
+  .weak QSPI_interrupt;
+  .weak SDHC0_interrupt;
+  .weak SDHC1_interrupt;
+
+  .set NonMaskableInt_interrupt,  Haltproc
+  .set HardFault_interrupt,       Haltproc
+  .set MemoryManagement_interrupt,Haltproc
+  .set BusFault_interrupt,        Haltproc
+  .set UsageFault_interrupt,      Haltproc
+  .set SVCall_interrupt,          Haltproc
+  .set DebugMonitor_interrupt,    Haltproc
+  .set PendSV_interrupt,          Haltproc
+  .set SysTick_interrupt,         Haltproc
+  .set PM_interrupt,              Haltproc
+  .set MCLK_interrupt,            Haltproc
+  .set OSCCTRL_0_interrupt,       Haltproc
+  .set OSCCTRL_1_interrupt,       Haltproc
+  .set OSCCTRL_2_interrupt,       Haltproc
+  .set OSCCTRL_3_interrupt,       Haltproc
+  .set OSCCTRL_4_interrupt,       Haltproc
+  .set OSC32KCTRL_interrupt,      Haltproc
+  .set SUPC_0_interrupt,          Haltproc
+  .set SUPC_1_interrupt,          Haltproc
+  .set WDT_interrupt,             Haltproc
+  .set RTC_interrupt,             Haltproc
+  .set EIC_0_interrupt,           Haltproc
+  .set EIC_1_interrupt,           Haltproc
+  .set EIC_2_interrupt,           Haltproc
+  .set EIC_3_interrupt,           Haltproc
+  .set EIC_4_interrupt,           Haltproc
+  .set EIC_5_interrupt,           Haltproc
+  .set EIC_6_interrupt,           Haltproc
+  .set EIC_7_interrupt,           Haltproc
+  .set EIC_8_interrupt,           Haltproc
+  .set EIC_9_interrupt,           Haltproc
+  .set EIC_10_interrupt,          Haltproc
+  .set EIC_11_interrupt,          Haltproc
+  .set EIC_12_interrupt,          Haltproc
+  .set EIC_13_interrupt,          Haltproc
+  .set EIC_14_interrupt,          Haltproc
+  .set EIC_15_interrupt,          Haltproc
+  .set FREQM_interrupt,           Haltproc
+  .set NVMCTRL_0_interrupt,       Haltproc
+  .set NVMCTRL_1_interrupt,       Haltproc
+  .set DMAC_0_interrupt,          Haltproc
+  .set DMAC_1_interrupt,          Haltproc
+  .set DMAC_2_interrupt,          Haltproc
+  .set DMAC_3_interrupt,          Haltproc
+  .set DMAC_4_interrupt,          Haltproc
+  .set EVSYS_0_interrupt,         Haltproc
+  .set EVSYS_1_interrupt,         Haltproc
+  .set EVSYS_2_interrupt,         Haltproc
+  .set EVSYS_3_interrupt,         Haltproc
+  .set EVSYS_4_interrupt,         Haltproc
+  .set PAC_interrupt,             Haltproc
+  .set RAMECC_interrupt,          Haltproc
+  .set SERCOM0_0_interrupt,       Haltproc
+  .set SERCOM0_1_interrupt,       Haltproc
+  .set SERCOM0_2_interrupt,       Haltproc
+  .set SERCOM0_3_interrupt,       Haltproc
+  .set SERCOM1_0_interrupt,       Haltproc
+  .set SERCOM1_1_interrupt,       Haltproc
+  .set SERCOM1_2_interrupt,       Haltproc
+  .set SERCOM1_3_interrupt,       Haltproc
+  .set SERCOM2_0_interrupt,       Haltproc
+  .set SERCOM2_1_interrupt,       Haltproc
+  .set SERCOM2_2_interrupt,       Haltproc
+  .set SERCOM2_3_interrupt,       Haltproc
+  .set SERCOM3_0_interrupt,       Haltproc
+  .set SERCOM3_1_interrupt,       Haltproc
+  .set SERCOM3_2_interrupt,       Haltproc
+  .set SERCOM3_3_interrupt,       Haltproc
+  .set SERCOM4_0_interrupt,       Haltproc
+  .set SERCOM4_1_interrupt,       Haltproc
+  .set SERCOM4_2_interrupt,       Haltproc
+  .set SERCOM4_3_interrupt,       Haltproc
+  .set SERCOM5_0_interrupt,       Haltproc
+  .set SERCOM5_1_interrupt,       Haltproc
+  .set SERCOM5_2_interrupt,       Haltproc
+  .set SERCOM5_3_interrupt,       Haltproc
+  .set SERCOM6_0_interrupt,       Haltproc
+  .set SERCOM6_1_interrupt,       Haltproc
+  .set SERCOM6_2_interrupt,       Haltproc
+  .set SERCOM6_3_interrupt,       Haltproc
+  .set SERCOM7_0_interrupt,       Haltproc
+  .set SERCOM7_1_interrupt,       Haltproc
+  .set SERCOM7_2_interrupt,       Haltproc
+  .set SERCOM7_3_interrupt,       Haltproc
+  .set USB_0_interrupt,           Haltproc
+  .set USB_1_interrupt,           Haltproc
+  .set USB_2_interrupt,           Haltproc
+  .set USB_3_interrupt,           Haltproc
+  .set TCC0_0_interrupt,          Haltproc
+  .set TCC0_1_interrupt,          Haltproc
+  .set TCC0_2_interrupt,          Haltproc
+  .set TCC0_3_interrupt,          Haltproc
+  .set TCC0_4_interrupt,          Haltproc
+  .set TCC0_5_interrupt,          Haltproc
+  .set TCC0_6_interrupt,          Haltproc
+  .set TCC1_0_interrupt,          Haltproc
+  .set TCC1_1_interrupt,          Haltproc
+  .set TCC1_2_interrupt,          Haltproc
+  .set TCC1_3_interrupt,          Haltproc
+  .set TCC1_4_interrupt,          Haltproc
+  .set TCC2_0_interrupt,          Haltproc
+  .set TCC2_1_interrupt,          Haltproc
+  .set TCC2_2_interrupt,          Haltproc
+  .set TCC2_3_interrupt,          Haltproc
+  .set TCC3_0_interrupt,          Haltproc
+  .set TCC3_1_interrupt,          Haltproc
+  .set TCC3_2_interrupt,          Haltproc
+  .set TCC4_0_interrupt,          Haltproc
+  .set TCC4_1_interrupt,          Haltproc
+  .set TCC4_2_interrupt,          Haltproc
+  .set TC0_interrupt,             Haltproc
+  .set TC1_interrupt,             Haltproc
+  .set TC2_interrupt,             Haltproc
+  .set TC3_interrupt,             Haltproc
+  .set TC4_interrupt,             Haltproc
+  .set TC5_interrupt,             Haltproc
+  .set TC6_interrupt,             Haltproc
+  .set TC7_interrupt,             Haltproc
+  .set PDEC_0_interrupt,          Haltproc
+  .set PDEC_1_interrupt,          Haltproc
+  .set PDEC_2_interrupt,          Haltproc
+  .set ADC0_0_interrupt,          Haltproc
+  .set ADC0_1_interrupt,          Haltproc
+  .set ADC1_0_interrupt,          Haltproc
+  .set ADC1_1_interrupt,          Haltproc
+  .set AC_interrupt,              Haltproc
+  .set DAC_0_interrupt,           Haltproc
+  .set DAC_1_interrupt,           Haltproc
+  .set DAC_2_interrupt,           Haltproc
+  .set DAC_3_interrupt,           Haltproc
+  .set DAC_4_interrupt,           Haltproc
+  .set I2S_interrupt,             Haltproc
+  .set PCC_interrupt,             Haltproc
+  .set AES_interrupt,             Haltproc
+  .set TRNG_interrupt,            Haltproc
+  .set ICM_interrupt,             Haltproc
+  .set PUKCC_interrupt,           Haltproc
+  .set QSPI_interrupt,            Haltproc
+  .set SDHC0_interrupt,           Haltproc
+  .set SDHC1_interrupt,           Haltproc
+  .text
+  end;
+end.

+ 0 - 4
rtl/inc/compproc.inc

@@ -422,11 +422,7 @@ Function fpc_Char_To_UChar(const c : Char): UnicodeChar; compilerproc;
 Function fpc_UChar_To_Char(const c : UnicodeChar): Char; compilerproc;
 Function fpc_UChar_To_Char(const c : UnicodeChar): Char; compilerproc;
 Function fpc_UChar_To_UnicodeStr(const c : UnicodeChar): UnicodeString; compilerproc;
 Function fpc_UChar_To_UnicodeStr(const c : UnicodeChar): UnicodeString; compilerproc;
 Function fpc_UChar_To_AnsiStr(const c : UnicodeChar{$ifdef FPC_HAS_CPSTRING};cp : TSystemCodePage{$endif FPC_HAS_CPSTRING}): AnsiString; compilerproc;
 Function fpc_UChar_To_AnsiStr(const c : UnicodeChar{$ifdef FPC_HAS_CPSTRING};cp : TSystemCodePage{$endif FPC_HAS_CPSTRING}): AnsiString; compilerproc;
-{$ifdef VER2_6}
-procedure fpc_UChar_To_ShortStr(out result : shortstring;const c : WideChar) compilerproc;
-{$else}
 function fpc_UChar_To_ShortStr(const c : WideChar): shortstring; compilerproc;
 function fpc_UChar_To_ShortStr(const c : WideChar): shortstring; compilerproc;
-{$endif}
 
 
 Function fpc_PWideChar_To_UnicodeStr(const p : pwidechar): unicodestring; compilerproc;
 Function fpc_PWideChar_To_UnicodeStr(const p : pwidechar): unicodestring; compilerproc;
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}

+ 7 - 7
rtl/inc/dynlib.inc

@@ -156,7 +156,7 @@ const
   SNoDynLibs = 'This binary has no dynamic library support compiled in.';
   SNoDynLibs = 'This binary has no dynamic library support compiled in.';
   SRecompileWithDynLibs = 'Recompile the application with a dynamic-library-driver in the program uses clause before other units using dynamic libraries.';
   SRecompileWithDynLibs = 'Recompile the application with a dynamic-library-driver in the program uses clause before other units using dynamic libraries.';
 
 
-Procedure NoDynLibsError; {$ifndef ver2_6}noreturn;{$endif}
+Procedure NoDynLibsError; noreturn;
 begin
 begin
 {$ifndef EMBEDDED}
 {$ifndef EMBEDDED}
 {$ifdef FPC_HAS_FEATURE_CONSOLEIO}
 {$ifdef FPC_HAS_FEATURE_CONSOLEIO}
@@ -170,32 +170,32 @@ begin
   RunError(235)
   RunError(235)
 end;
 end;
 
 
-Function NoLoadLibraryU(const Name: UnicodeString): TLibHandle; {$ifndef ver2_6}noreturn;{$endif}
+Function NoLoadLibraryU(const Name: UnicodeString): TLibHandle; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;
 
 
-Function NoLoadLibraryA(const Name: RawByteString): TLibHandle; {$ifndef ver2_6}noreturn;{$endif}
+Function NoLoadLibraryA(const Name: RawByteString): TLibHandle; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;
 
 
-function NoGetProcAddress(Lib: TLibHandle; const Proc: AnsiString): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetProcAddress(Lib: TLibHandle; const Proc: AnsiString): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;
 
 
-function NoGetProcAddressOrdinal(Lib: TLibHandle; Ordinal: TOrdinalEntry): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetProcAddressOrdinal(Lib: TLibHandle; Ordinal: TOrdinalEntry): {$ifdef cpui8086}FarPointer{$else}Pointer{$endif}; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;
 
 
-function NoGetLoadErrorStr: String; {$ifndef ver2_6}noreturn;{$endif}
+function NoGetLoadErrorStr: String; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;
 
 
-function NoUnloadLibrary(Lib: TLibHandle): Boolean; {$ifndef ver2_6}noreturn;{$endif}
+function NoUnloadLibrary(Lib: TLibHandle): Boolean; noreturn;
 begin
 begin
   NoDynLibsError;
   NoDynLibsError;
 end;
 end;

+ 1 - 1
rtl/inc/filerec.inc

@@ -29,7 +29,7 @@ const
 type
 type
  { using packed makes the compiler to generate ugly code on some CPUs, further
  { using packed makes the compiler to generate ugly code on some CPUs, further
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
-  FileRec = {$ifdef VER2_6} packed {$endif} Record
+  FileRec = Record
     Handle    : THandle;
     Handle    : THandle;
 {$if defined(CPU8) or defined(CPU16)}
 {$if defined(CPU8) or defined(CPU16)}
     Mode      : Word;
     Mode      : Word;

+ 0 - 12
rtl/inc/generic.inc

@@ -3341,20 +3341,8 @@ function fpc_PopCnt_dword(AValue : DWord): DWord;[Public,Alias:'FPC_POPCNT_DWORD
 
 
 {$ifndef FPC_SYSTEM_HAS_POPCNT_QWORD}
 {$ifndef FPC_SYSTEM_HAS_POPCNT_QWORD}
 function fpc_PopCnt_qword(AValue : QWord): QWord;[Public,Alias:'FPC_POPCNT_QWORD'];compilerproc;
 function fpc_PopCnt_qword(AValue : QWord): QWord;[Public,Alias:'FPC_POPCNT_QWORD'];compilerproc;
-{$ifdef VER2_6}
-  var
-    i : SizeInt;
-  begin
-    Result:=0;
-    for i:=0 to 15 do
-      begin
-        inc(Result,PopCntData[AValue and $f]);
-        AValue:=AValue shr 4;
-      end;
-{$else VER2_6}
   begin
   begin
     Result:=PopCnt(lo(AValue))+PopCnt(hi(AValue))
     Result:=PopCnt(lo(AValue))+PopCnt(hi(AValue))
-{$endif VER2_6}
   end;
   end;
 {$endif}
 {$endif}
 
 

+ 0 - 27
rtl/inc/rtti.inc

@@ -21,11 +21,7 @@ begin
 {$else VER3_0}
 {$else VER3_0}
   typeInfo:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
   typeInfo:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
 {$endif VER3_0}
 {$endif VER3_0}
-  {$ifdef VER2_6}
-  result:=PArrayInfo(typeInfo)^.Size*PArrayInfo(typeInfo)^.ElCount;
-  {$else}
   result:=PArrayInfo(typeInfo)^.Size;
   result:=PArrayInfo(typeInfo)^.Size;
-  {$endif}
 end;
 end;
 
 
 function RTTIRecordSize(typeInfo: Pointer): SizeInt;
 function RTTIRecordSize(typeInfo: Pointer): SizeInt;
@@ -148,23 +144,8 @@ end;
 
 
 
 
 { if you modify this procedure, fpc_copy must be probably modified as well }
 { if you modify this procedure, fpc_copy must be probably modified as well }
-{$ifdef VER2_6}
 procedure ArrayRTTI(Data,TypeInfo:Pointer;rttiproc:TRTTIProc);
 procedure ArrayRTTI(Data,TypeInfo:Pointer;rttiproc:TRTTIProc);
 var
 var
-  i: SizeInt;
-begin
-{$ifdef VER3_0}
-  typeInfo:=aligntoptr(typeInfo+2+PByte(typeInfo)[1]);
-{$else VER3_0}
-  typeInfo:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
-{$endif VER3_0}
-  { Process elements }
-  for I:=0 to PArrayInfo(typeInfo)^.ElCount-1 do
-    rttiproc(Data+(I*PArrayInfo(typeInfo)^.Size),PArrayInfo(typeInfo)^.ElInfo);
-end;
-{$else}
-procedure ArrayRTTI(Data,TypeInfo:Pointer;rttiproc:TRTTIProc);
-var  
   i,Count,ElSize: SizeInt;
   i,Count,ElSize: SizeInt;
   Info: Pointer;
   Info: Pointer;
 begin
 begin
@@ -183,7 +164,6 @@ begin
   for I:=0 to Count-1 do
   for I:=0 to Count-1 do
     rttiproc(Data+(I*ElSize),Info);
     rttiproc(Data+(I*ElSize),Info);
 end;
 end;
-{$endif}
 
 
 Procedure fpc_Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE'];  compilerproc;
 Procedure fpc_Initialize (Data,TypeInfo : pointer);[Public,Alias : 'FPC_INITIALIZE'];  compilerproc;
 begin
 begin
@@ -363,12 +343,6 @@ begin
 {$else VER3_0}
 {$else VER3_0}
         Temp:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
         Temp:=aligntoqword(typeInfo+2+PByte(typeInfo)[1]);
 {$endif VER3_0}
 {$endif VER3_0}
-      {$ifdef VER2_6}
-        { Process elements }
-        for I:=0 to PArrayInfo(Temp)^.ElCount-1 do
-          fpc_Copy_internal(Src+(I*PArrayInfo(Temp)^.Size),Dest+(I*PArrayInfo(Temp)^.Size),PArrayInfo(Temp)^.ElInfo);
-        Result:=PArrayInfo(Temp)^.Size*PArrayInfo(Temp)^.ElCount;
-      {$else}
         Result:=PArrayInfo(Temp)^.Size;
         Result:=PArrayInfo(Temp)^.Size;
         EleCount:=PArrayInfo(Temp)^.ElCount;
         EleCount:=PArrayInfo(Temp)^.ElCount;
         { no elements to process => exit }
         { no elements to process => exit }
@@ -383,7 +357,6 @@ begin
             fpc_Copy_internal(Src+Offset,Dest+Offset,Info);
             fpc_Copy_internal(Src+Offset,Dest+Offset,Info);
             inc(Offset,copiedsize);
             inc(Offset,copiedsize);
           end;
           end;
-      {$endif}
       end;
       end;
 {$ifdef FPC_HAS_FEATURE_OBJECTS}
 {$ifdef FPC_HAS_FEATURE_OBJECTS}
     tkobject,
     tkobject,

+ 0 - 7
rtl/inc/rttidecl.inc

@@ -19,9 +19,6 @@
 {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
 {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
   {$define USE_PACKED}
   {$define USE_PACKED}
 {$endif}
 {$endif}
-{$ifdef VER2_6}
-  {$define USE_PACKED}
-{$endif}
 
 
 {$ifndef VER3_0}
 {$ifndef VER3_0}
 { 3.1.1 and newer also (re)stores $MinEnumSize and $PackSet upon $Push/$Pop }
 { 3.1.1 and newer also (re)stores $MinEnumSize and $PackSet upon $Push/$Pop }
@@ -54,11 +51,7 @@ type
     {$else}
     {$else}
     TypeInfo: PPointer;
     TypeInfo: PPointer;
     {$endif}
     {$endif}
-    {$ifdef VER2_6}
-    Offset: Longint;
-    {$else}
     Offset: SizeInt;
     Offset: SizeInt;
-    {$endif}
   end;
   end;
 
 
   PRecordInfoFull=^TRecordInfoFull;
   PRecordInfoFull=^TRecordInfoFull;

+ 1 - 2
rtl/inc/system.inc

@@ -1066,8 +1066,7 @@ type
   end;
   end;
   TInitFinalTable = record
   TInitFinalTable = record
     TableCount,
     TableCount,
-    InitCount  : {$if defined(VER2)}longint
-                 {$elseif defined(VER3_0)}sizeint
+    InitCount  : {$if defined(VER3_0)}sizeint
                  {$else}ALUUInt{$endif}
                  {$else}ALUUInt{$endif}
                  ;
                  ;
     Procs      : array[1..maxunits] of TInitFinalRec;
     Procs      : array[1..maxunits] of TInitFinalRec;

+ 2 - 14
rtl/inc/systemh.inc

@@ -82,11 +82,6 @@
 {$define FPC_HAS_FEATURE_UNICODESTRINGS}
 {$define FPC_HAS_FEATURE_UNICODESTRINGS}
 {$endif FPC_HAS_FEATURE_SUPPORT}
 {$endif FPC_HAS_FEATURE_SUPPORT}
 
 
-{ bootstrapping, the starting compiler cannot be a downstripped compiler without unicodestring support }
-{$ifdef VER2_6}
-{$define FPC_HAS_FEATURE_UNICODESTRINGS}
-{$endif VER2_6}
-
 { for now, the presence of unicode strings is just an approximation,
 { for now, the presence of unicode strings is just an approximation,
   USE_FILEREC_FULLNAME can be also enabled for other targets if
   USE_FILEREC_FULLNAME can be also enabled for other targets if
   they need file names longer than 255 chars }
   they need file names longer than 255 chars }
@@ -140,9 +135,7 @@ Type
     ValReal = Extended;
     ValReal = Extended;
   {$endif}
   {$endif}
 
 
-  {$ifndef VER2_6}
   FarPointer = NearFsPointer;
   FarPointer = NearFsPointer;
-  {$endif}
 {$endif CPUI386}
 {$endif CPUI386}
 
 
 {$ifdef CPUI8086}
 {$ifdef CPUI8086}
@@ -472,7 +465,7 @@ Type
   TExitCode = Word;
   TExitCode = Word;
 {$endif CPU16}
 {$endif CPU16}
 
 
-{$if defined(VER2) or defined(VER3_0)}
+{$if defined(VER3_0)}
 {$if defined(CPU16)}
 {$if defined(CPU16)}
 {$define CPUINT16}
 {$define CPUINT16}
 {$elseif defined(CPU32)}
 {$elseif defined(CPU32)}
@@ -480,7 +473,7 @@ Type
 {$elseif defined(CPU64)}
 {$elseif defined(CPU64)}
 {$define CPUINT64}
 {$define CPUINT64}
 {$endif defined(CPU64)}
 {$endif defined(CPU64)}
-{$endif defined(VER2) or defined(VER3_0)}
+{$endif defined(VER3_0)}
 
 
 {$if defined(CPUINT8)}
 {$if defined(CPUINT8)}
   ALUSInt = ShortInt;
   ALUSInt = ShortInt;
@@ -667,11 +660,6 @@ Type
 
 
   TSystemCodePage     = Word;
   TSystemCodePage     = Word;
 
 
-{$ifdef VER2_6}
-  { the size of textrec/filerec is hardcoded in the 2.6 compiler binary }
-  {$define FPC_ANSI_TEXTFILEREC}
-{$endif}
-
   TFileTextRecChar    = {$if defined(FPC_ANSI_TEXTFILEREC) or not(defined(FPC_HAS_FEATURE_WIDESTRINGS))}AnsiChar{$else}UnicodeChar{$endif};
   TFileTextRecChar    = {$if defined(FPC_ANSI_TEXTFILEREC) or not(defined(FPC_HAS_FEATURE_WIDESTRINGS))}AnsiChar{$else}UnicodeChar{$endif};
   PFileTextRecChar    = ^TFileTextRecChar;
   PFileTextRecChar    = ^TFileTextRecChar;
 
 

+ 1 - 1
rtl/inc/textrec.inc

@@ -34,7 +34,7 @@ type
 
 
   { using packed makes the compiler to generate ugly code on some CPUs, further
   { using packed makes the compiler to generate ugly code on some CPUs, further
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
     using packed causes the compiler to handle arrays of text wrongly, see  see tw0754 e.g. on arm  }
-  TextRec = {$ifdef VER2_6} packed {$endif} Record
+  TextRec = Record
     Handle    : THandle;
     Handle    : THandle;
 {$if defined(CPU8) or defined(CPU16)}
 {$if defined(CPU8) or defined(CPU16)}
     Mode      : Word;
     Mode      : Word;

+ 1 - 1
rtl/java/jsystemh.inc

@@ -512,7 +512,7 @@ function  pos(const substr : shortstring;c:char; Offset : Sizeint=1): SizeInt;
 ****************************************************************************}
 ****************************************************************************}
 
 
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
 {$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
-Procedure UniqueString(var S : RawByteString);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}external name 'FPC_ANSISTR_UNIQUE';
+Procedure UniqueString(var S : RawByteString);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}{$ifdef SYSTEMINLINE}inline;{$endif}
 Function  Pos (const Substr : RawByteString; const Source : RawByteString; Offset: Sizeint = 1) : SizeInt;
 Function  Pos (const Substr : RawByteString; const Source : RawByteString; Offset: Sizeint = 1) : SizeInt;
 Function  Pos (c : AnsiChar; const s : RawByteString; Offset: Sizeint = 1) : SizeInt;
 Function  Pos (c : AnsiChar; const s : RawByteString; Offset: Sizeint = 1) : SizeInt;
 {$ifdef VER3_0}
 {$ifdef VER3_0}

+ 3 - 4
rtl/objpas/character.pas

@@ -20,7 +20,7 @@
 unit Character;
 unit Character;
 
 
 interface
 interface
-{$ifndef VER2_4}
+
 {$mode objfpc}
 {$mode objfpc}
 {$H+}
 {$H+}
 {$PACKENUM 1}
 {$PACKENUM 1}
@@ -187,10 +187,10 @@ type
   function ToLower(const AString : UnicodeString) : UnicodeString; overload;
   function ToLower(const AString : UnicodeString) : UnicodeString; overload;
   function ToUpper(AChar : UnicodeChar) : UnicodeChar; overload;
   function ToUpper(AChar : UnicodeChar) : UnicodeChar; overload;
   function ToUpper(const AString : UnicodeString) : UnicodeString; overload;
   function ToUpper(const AString : UnicodeString) : UnicodeString; overload;
-{$endif VER2_4}
+
 
 
 implementation
 implementation
-{$ifndef VER2_4}
+
 uses
 uses
   SysUtils,
   SysUtils,
   RtlConsts;
   RtlConsts;
@@ -851,5 +851,4 @@ begin
     raise EArgumentException.Create(SInvalidUnicodeCodePointSequence);
     raise EArgumentException.Create(SInvalidUnicodeCodePointSequence);
 end;
 end;
 
 
-{$endif VER2_4}
 end.
 end.

+ 1 - 1
rtl/objpas/classes/classesh.inc

@@ -2466,7 +2466,7 @@ procedure ObjectTextToResource(Input, Output: TStream);
 { Utility routines }
 { Utility routines }
 
 
 function LineStart(Buffer, BufPos: PChar): PChar;
 function LineStart(Buffer, BufPos: PChar): PChar;
-procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer);
+procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer); deprecated 'use procedures from unit StrUtils';
 function HexToBin(HexValue, BinValue: PChar; BinBufSize: Integer): Integer;
 function HexToBin(HexValue, BinValue: PChar; BinBufSize: Integer): Integer;
 function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings; AddEmptyStrings : Boolean = False): Integer;
 function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings; AddEmptyStrings : Boolean = False): Integer;
 
 

+ 1 - 1
rtl/objpas/classes/lists.inc

@@ -11,7 +11,7 @@
 
 
  **********************************************************************}
  **********************************************************************}
 
 
-{$if defined(VER2_0) or not defined(FPC_TESTGENERICS)}
+{$if not defined(FPC_TESTGENERICS)}
 
 
 {****************************************************************************}
 {****************************************************************************}
 {*                           TFPListEnumerator                              *}
 {*                           TFPListEnumerator                              *}

+ 12 - 22
rtl/objpas/fgl.pp

@@ -28,10 +28,6 @@ interface
 uses
 uses
   types, sysutils, sortbase;
   types, sysutils, sortbase;
 
 
-{$IF defined(VER2_4)}
-  {$DEFINE OldSyntax}
-{$IFEND}
-
 const
 const
   MaxListSize = Maxint div 16;
   MaxListSize = Maxint div 16;
 
 
@@ -127,7 +123,8 @@ type
       PT = ^T;
       PT = ^T;
       TTypeList = PT;
       TTypeList = PT;
       PTypeList = ^TTypeList;
       PTypeList = ^TTypeList;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
       FOnCompare: TCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure Deref(Item: Pointer); override;
     procedure Deref(Item: Pointer); override;
@@ -152,10 +149,8 @@ type
     function IndexOf(const Item: T): Integer;
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure Assign(Source: TFPGList);
     procedure Assign(Source: TFPGList);
     procedure AddList(Source: TFPGList);
     procedure AddList(Source: TFPGList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -171,7 +166,8 @@ type
       TTypeList = PT;
       TTypeList = PT;
       PTypeList = ^TTypeList;
       PTypeList = ^TTypeList;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
       FOnCompare: TCompareFunc;
       FFreeObjects: Boolean;
       FFreeObjects: Boolean;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -193,10 +189,8 @@ type
     function IndexOf(const Item: T): Integer;
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure AddList(Source: TFPGObjectList);
     procedure AddList(Source: TFPGObjectList);
     procedure Assign(Source: TFPGObjectList);
     procedure Assign(Source: TFPGObjectList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -213,7 +207,8 @@ type
       TTypeList = PT;
       TTypeList = PT;
       PTypeList = ^TTypeList;
       PTypeList = ^TTypeList;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
       TFPGListEnumeratorSpec = specialize TFPGListEnumerator<T>;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnCompare: TCompareFunc;
       FOnCompare: TCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure Deref(Item: Pointer); override;
     procedure Deref(Item: Pointer); override;
@@ -234,10 +229,8 @@ type
     function IndexOf(const Item: T): Integer;
     function IndexOf(const Item: T): Integer;
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     procedure Insert(Index: Integer; const Item: T); {$ifdef FGLINLINE} inline; {$endif}
     property Last: T read GetLast write SetLast;
     property Last: T read GetLast write SetLast;
-{$ifndef VER2_4}
     procedure Assign(Source: TFPGInterfacedObjectList);
     procedure Assign(Source: TFPGInterfacedObjectList);
     procedure AddList(Source: TFPGInterfacedObjectList);
     procedure AddList(Source: TFPGInterfacedObjectList);
-{$endif VER2_4}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     function Remove(const Item: T): Integer; {$ifdef FGLINLINE} inline; {$endif}
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
     procedure Sort(Compare: TCompareFunc; SortingAlgorithm: PSortingAlgorithm);
@@ -303,7 +296,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
       PKey = ^TKey;
 // unsed      PData = ^TData;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
       FOnDataCompare: TDataCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -350,7 +344,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
       PKey = ^TKey;
 // unsed      PData = ^TData;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
       FOnDataCompare: TDataCompareFunc;
       FFreeObjects: Boolean;
       FFreeObjects: Boolean;
@@ -399,7 +394,8 @@ type
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       TDataCompareFunc = function(const Data1, Data2: TData): Integer;
       PKey = ^TKey;
       PKey = ^TKey;
 // unsed      PData = ^TData;
 // unsed      PData = ^TData;
-  {$ifndef OldSyntax}protected var{$else}var protected{$endif}
+  protected
+    var
       FOnKeyCompare: TKeyCompareFunc;
       FOnKeyCompare: TKeyCompareFunc;
       FOnDataCompare: TDataCompareFunc;
       FOnDataCompare: TDataCompareFunc;
     procedure CopyItem(Src, Dest: Pointer); override;
     procedure CopyItem(Src, Dest: Pointer); override;
@@ -1009,7 +1005,6 @@ begin
   inherited SetLast(@Value);
   inherited SetLast(@Value);
 end;
 end;
 
 
-{$ifndef VER2_4}
 procedure TFPGList.AddList(Source: TFPGList);
 procedure TFPGList.AddList(Source: TFPGList);
 
 
 var
 var
@@ -1036,7 +1031,6 @@ begin
   else
   else
     Inherited Assign(TFPSList(source))
     Inherited Assign(TFPSList(source))
 end;
 end;
-{$endif VER2_4}
 
 
 function TFPGList.Remove(const Item: T): Integer;
 function TFPGList.Remove(const Item: T): Integer;
 begin
 begin
@@ -1149,7 +1143,6 @@ begin
   inherited SetLast(@Value);
   inherited SetLast(@Value);
 end;
 end;
 
 
-{$ifndef VER2_4}
 procedure TFPGObjectList.AddList(Source: TFPGObjectList);
 procedure TFPGObjectList.AddList(Source: TFPGObjectList);
 var
 var
   i: Integer;
   i: Integer;
@@ -1163,7 +1156,6 @@ begin
   Clear;
   Clear;
   AddList(Source);
   AddList(Source);
 end;
 end;
-{$endif VER2_4}
 
 
 function TFPGObjectList.Remove(const Item: T): Integer;
 function TFPGObjectList.Remove(const Item: T): Integer;
 begin
 begin
@@ -1279,7 +1271,6 @@ begin
   inherited SetLast(@Value);
   inherited SetLast(@Value);
 end;
 end;
 
 
-{$ifndef VER2_4}
 procedure TFPGInterfacedObjectList.Assign(Source: TFPGInterfacedObjectList);
 procedure TFPGInterfacedObjectList.Assign(Source: TFPGInterfacedObjectList);
 
 
 begin
 begin
@@ -1294,7 +1285,6 @@ begin
   for I := 0 to Source.Count - 1 do
   for I := 0 to Source.Count - 1 do
     Add(Source[i]);
     Add(Source[i]);
 end;
 end;
-{$endif VER2_4}
 
 
 function TFPGInterfacedObjectList.Remove(const Item: T): Integer;
 function TFPGInterfacedObjectList.Remove(const Item: T): Integer;
 begin
 begin

+ 1 - 1
rtl/objpas/objpas.pp

@@ -370,7 +370,7 @@ Type
    end;
    end;
 
 
    TResStrInitTable = packed record
    TResStrInitTable = packed record
-     Count: {$ifdef VER2_6}longint{$else}sizeint{$endif};
+     Count: sizeint;
      Tables: packed array[1..{$ifdef cpu16}8191{$else cpu16}32767{$endif cpu16}] of PResStrInitEntry;
      Tables: packed array[1..{$ifdef cpu16}8191{$else cpu16}32767{$endif cpu16}] of PResStrInitEntry;
    end;
    end;
    PResStrInitTable = ^TResStrInitTable;
    PResStrInitTable = ^TResStrInitTable;

+ 0 - 3
rtl/objpas/sysutils/sysencoding.inc

@@ -12,7 +12,6 @@
     *********************************************************************
     *********************************************************************
 }
 }
 
 
-{$ifndef VER2_4}
 { TEncoding }
 { TEncoding }
 
 
 class function TEncoding.GetANSI: TEncoding;
 class function TEncoding.GetANSI: TEncoding;
@@ -856,5 +855,3 @@ begin
       Inc(I, 2);
       Inc(I, 2);
     end;
     end;
 end;
 end;
-
-{$endif VER2_4}

+ 0 - 2
rtl/objpas/sysutils/sysencodingh.inc

@@ -12,7 +12,6 @@
     *********************************************************************
     *********************************************************************
 }
 }
 
 
-{$ifndef VER2_4}
 type
 type
   EEncodingError = class(Exception);
   EEncodingError = class(Exception);
 
 
@@ -189,4 +188,3 @@ type
     function Clone: TEncoding; override;
     function Clone: TEncoding; override;
     function GetPreamble: TBytes; override;
     function GetPreamble: TBytes; override;
   end;
   end;
-{$endif VER2_4}

+ 0 - 5
rtl/objpas/sysutils/sysstr.inc

@@ -1394,11 +1394,6 @@ const
   maxdigits = 15;
   maxdigits = 15;
 {$endif}
 {$endif}
 
 
-{ deactive aligned function for 2.6 }
-{$ifdef VER2_6}
-{$macro on}
-{$define aligned:= }
-{$endif VER2_6}
 Function FloatToStrFIntl(const Value; format: TFloatFormat; Precision, Digits: Integer; ValueType: TFloatValue; Const FormatSettings: TFormatSettings): String;
 Function FloatToStrFIntl(const Value; format: TFloatFormat; Precision, Digits: Integer; ValueType: TFloatValue; Const FormatSettings: TFormatSettings): String;
 Var
 Var
   P, PE, Q, Exponent: Integer;
   P, PE, Q, Exponent: Integer;

+ 6 - 18
rtl/win/systhrd.inc

@@ -509,56 +509,44 @@ Const
   wrAbandoned= 2;
   wrAbandoned= 2;
   wrError    = 3;
   wrError    = 3;
 
 
-type Tbasiceventstate=record
-                        fhandle    : THandle;
-                        flasterror : longint;
-                       end;
-     plocaleventrec= ^tbasiceventstate;
-
 function intBasicEventCreate(EventAttributes : Pointer;
 function intBasicEventCreate(EventAttributes : Pointer;
 AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
 AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
 var
 var
   n : PChar;
   n : PChar;
 begin
 begin
-  new(plocaleventrec(result));
   if Length(Name) = 0 then
   if Length(Name) = 0 then
     n := Nil
     n := Nil
   else
   else
     n := PChar(Name);
     n := PChar(Name);
-  plocaleventrec(result)^.FHandle := CreateEvent(EventAttributes, AManualReset, InitialState,n);
+  Result := PEventState(CreateEvent(EventAttributes, AManualReset, InitialState,n));
 end;
 end;
 
 
 procedure intbasiceventdestroy(state:peventstate);
 procedure intbasiceventdestroy(state:peventstate);
 
 
 begin
 begin
-  closehandle(plocaleventrec(state)^.fhandle);
-  dispose(plocaleventrec(state));
+  closehandle(THandle(state));
 end;
 end;
 
 
 procedure intbasiceventResetEvent(state:peventstate);
 procedure intbasiceventResetEvent(state:peventstate);
 
 
 begin
 begin
-  ResetEvent(plocaleventrec(state)^.FHandle)
+  ResetEvent(THandle(state))
 end;
 end;
 
 
 procedure intbasiceventSetEvent(state:peventstate);
 procedure intbasiceventSetEvent(state:peventstate);
 
 
 begin
 begin
-  SetEvent(plocaleventrec(state)^.FHandle);
+  SetEvent(THandle(state));
 end;
 end;
 
 
 function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
 function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
 
 
 begin
 begin
-  case WaitForSingleObject(plocaleventrec(state)^.fHandle, Timeout) of
+  case WaitForSingleObject(THandle(state), Timeout) of
     WAIT_ABANDONED: Result := wrAbandoned;
     WAIT_ABANDONED: Result := wrAbandoned;
     WAIT_OBJECT_0: Result := wrSignaled;
     WAIT_OBJECT_0: Result := wrSignaled;
     WAIT_TIMEOUT: Result := wrTimeout;
     WAIT_TIMEOUT: Result := wrTimeout;
-    WAIT_FAILED:
-        begin
-        Result := wrError;
-        plocaleventrec(state)^.FLastError := GetLastError;
-       end;
+    WAIT_FAILED: Result := wrError;
   else
   else
     Result := wrError;
     Result := wrError;
   end;
   end;

+ 2 - 2
tests/Makefile

@@ -2468,13 +2468,13 @@ ifndef CONCAT
 CONCAT=utils/concat
 CONCAT=utils/concat
 endif
 endif
 ifndef GPARMAKE
 ifndef GPARMAKE
-GPARMAKE=./gparmake$(EXEEXT)
+GPARMAKE=./gparmake$(SRCEXEEXT)
 endif
 endif
 ifndef PREPUP
 ifndef PREPUP
 PREPUP=utils/prepup
 PREPUP=utils/prepup
 endif
 endif
 ifndef CREATELST
 ifndef CREATELST
-CREATELST=./createlst$(EXEEXT)
+CREATELST=./createlst$(SRCEXEEXT)
 endif
 endif
 tstunits:
 tstunits:
 ifdef inOS2
 ifdef inOS2

+ 2 - 2
tests/Makefile.fpc

@@ -210,7 +210,7 @@ CONCAT=utils/concat
 endif
 endif
 
 
 ifndef GPARMAKE
 ifndef GPARMAKE
-GPARMAKE=./gparmake$(EXEEXT)
+GPARMAKE=./gparmake$(SRCEXEEXT)
 endif
 endif
 
 
 ifndef PREPUP
 ifndef PREPUP
@@ -218,7 +218,7 @@ PREPUP=utils/prepup
 endif
 endif
 
 
 ifndef CREATELST
 ifndef CREATELST
-CREATELST=./createlst$(EXEEXT)
+CREATELST=./createlst$(SRCEXEEXT)
 endif
 endif
 
 
 
 

+ 26 - 0
tests/test/trtti21.pp

@@ -0,0 +1,26 @@
+{ GetTypeKind() of an enumeration with holes returns tkEnumeration and
+  TypeInfo() returns Nil, but *only* inside a generic/specialization when used
+  with a generic parameter }
+
+program trtti21;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+  generic TTest<T> = class
+    class function Test: Pointer;
+  end;
+
+class function TTest.Test: Pointer;
+begin
+  Result := TypeInfo(T);
+end;
+
+begin
+  if GetTypeKind(TEnum) <> tkEnumeration then
+    Halt(1);
+  if specialize TTest<TEnum>.Test <> Nil then
+    Halt(2);
+end.

+ 17 - 0
tests/test/trtti22.pp

@@ -0,0 +1,17 @@
+{ %FAIl }
+
+{ outside of generics TypeInfo() of types without type information (e.g. enums
+  with holes) throws a compile error }
+
+program trtti22;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+var
+  p: Pointer;
+begin
+  p := TypeInfo(TEnum);
+end.

+ 27 - 0
tests/test/trtti23.pp

@@ -0,0 +1,27 @@
+{ %FAIl }
+
+{ inside of generics TypeInfo() of types without type information (e.g. enums
+  with holes) that are not generic parameters throws a compile error }
+
+program trtti23;
+
+{$mode objfpc}
+
+type
+  TEnum = (teOne = 1, teTwo);
+
+  generic TTest<T> = class
+    procedure Test;
+  end;
+
+{ TTest }
+
+procedure TTest.Test;
+var
+  ti: Pointer;
+begin
+  ti := TypeInfo(TEnum);
+end;
+
+begin
+end.

+ 15 - 0
tests/webtbs/tw28640.pp

@@ -0,0 +1,15 @@
+{ %cpu=x86_64 }
+function test : int64;assembler;
+  {$ASMMODE INTEL}
+  asm
+        MOV RAX,'=TXEHTAP' // FAIL: LONG STRING "PATHEXT="
+  end;
+var
+  s : string[8];
+  l : int64 absolute s[1];
+begin
+  l:=test;
+  s[0]:=#8;
+  if s<>'PATHEXT=' then
+    halt(1);
+end.

+ 14 - 0
tests/webtbs/tw28640a.pp

@@ -0,0 +1,14 @@
+{ %cpu=x86_64 }
+function test : int64;assembler;
+  asm
+        MOV $'=TXEHTAP',%RAX // FAIL: LONG STRING "PATHEXT="
+  end;
+var
+  s : string[8];
+  l : int64 absolute s[1];
+begin
+  l:=test;
+  s[0]:=#8;
+  if s<>'PATHEXT=' then
+    halt(1);
+end.

+ 16 - 0
tests/webtbs/tw34232.pp

@@ -0,0 +1,16 @@
+program Project1;
+{$mode objfpc}{$H+}
+type
+generic TTest<TKey, TValue> = packed object
+    type
+    TPair = packed record
+      key: TKey;
+      value: TValue;
+    end;
+    TPairSizeEquivalent = packed array[1..sizeof(TPair)] of byte;
+end;
+TTestStringString = specialize TTest<string, string>;
+
+begin
+  writeln(sizeof(TTestStringString.TPairSizeEquivalent));
+end.

+ 21 - 0
tests/webtbs/tw38636.pp

@@ -0,0 +1,21 @@
+{$mode objfpc}
+program Project1;
+
+{$ifdef cpu64}
+const
+    lowlimit = 536879040;
+
+procedure test(i : integer);
+const
+  myarray : array[lowlimit..lowlimit+2] of integer = (1,2,3);
+begin
+  if @myarray[i]<>@myarray then
+    halt(1);
+end;
+
+begin
+  test(lowlimit);
+{$else}
+begin
+{$endif}
+end.

+ 14 - 0
tests/webtbs/tw38642.pp

@@ -0,0 +1,14 @@
+{ %NORUN }
+
+program tw38642;
+{$mode delphi}{$H+}
+uses
+  classes,
+  generics.collections;
+type
+  TMonthType = (January, February, May=10, June, July);
+  TMonthList = TList<TMonthType>;
+var
+  myList : TMonthList;
+begin
+end.

+ 1 - 1
utils/fpmake.pp

@@ -50,7 +50,7 @@ begin
   With Installer do
   With Installer do
     begin
     begin
     P:=AddPackage('utils');
     P:=AddPackage('utils');
-    P.ShortName := 'tils';
+    P.ShortName := 'utils';
     P.OSes:=AllOSes-[embedded,msdos,win16,macosclassic,palmos,zxspectrum,msxdos,amstradcpc];
     P.OSes:=AllOSes-[embedded,msdos,win16,macosclassic,palmos,zxspectrum,msxdos,amstradcpc];
     if Defaults.CPU=jvm then
     if Defaults.CPU=jvm then
       P.OSes := P.OSes - [java,android];
       P.OSes := P.OSes - [java,android];

+ 8 - 0
utils/pas2js/dist/rtl.js

@@ -1040,6 +1040,14 @@ var rtl = {
     }
     }
   },
   },
 
 
+  arrayInsert: function(item, arr, index){
+    if (arr){
+      return arr.splice(index,0,item);
+    } else {
+      return [item];
+    }
+  },
+
   setCharAt: function(s,index,c){
   setCharAt: function(s,index,c){
     return s.substr(0,index)+c+s.substr(index+1);
     return s.substr(0,index)+c+s.substr(index+1);
   },
   },

+ 1 - 2
utils/pas2js/httpcompiler.pp

@@ -558,13 +558,12 @@ begin
   S:=Checkoptions('shqd:ni:p:wP::cm:',['help','quiet','noindexpage','directory:','port:','indexpage:','watch','project::','config:','simpleserver','mimetypes:']);
   S:=Checkoptions('shqd:ni:p:wP::cm:',['help','quiet','noindexpage','directory:','port:','indexpage:','watch','project::','config:','simpleserver','mimetypes:']);
   if (S<>'') or HasOption('h','help') then
   if (S<>'') or HasOption('h','help') then
     usage(S);
     usage(S);
-  FServeOnly:=HasOption('s','simpleserver');
+  FServeOnly:=HasOption('s','serve-only');
   Quiet:=HasOption('q','quiet');
   Quiet:=HasOption('q','quiet');
   Port:=StrToIntDef(GetOptionValue('p','port'),3000);
   Port:=StrToIntDef(GetOptionValue('p','port'),3000);
   D:=GetOptionValue('d','directory');
   D:=GetOptionValue('d','directory');
   if D='' then
   if D='' then
     D:=GetCurrentDir;
     D:=GetCurrentDir;
-  D:=ExpandFileName(D);
   if HasOption('m','mimetypes') then
   if HasOption('m','mimetypes') then
     MimeTypesFile:=GetOptionValue('m','mimetypes');
     MimeTypesFile:=GetOptionValue('m','mimetypes');
   if MimeTypesFile='' then
   if MimeTypesFile='' then