Browse Source

o merge of the branch laksen/arm-embedded of Jeppe Johansen:
fixes a couple of arm-embedded stuff,
adds some controllers, start of fpv4_s16 support, for a complete list of
changes see below:
------------------------------------------------------------------------
r22787 | laksen | 2012-10-20 22:00:36 +0200 (Sa, 20 Okt 2012) | 1 line

Properly do NR_DEFAULTFLAGS detection/allocation/deallocation
------------------------------------------------------------------------
r22782 | laksen | 2012-10-20 07:44:55 +0200 (Sa, 20 Okt 2012) | 1 line

Fixed flags detections code for wide->short optimization code for Thumb-2
------------------------------------------------------------------------
r22778 | laksen | 2012-10-19 20:23:14 +0200 (Fr, 19 Okt 2012) | 1 line

Added coprocessor registers, and support for 6 operands(MCR/MRC instructions, etc)
------------------------------------------------------------------------
r22647 | laksen | 2012-10-14 21:28:08 +0200 (So, 14 Okt 2012) | 1 line

Added register specifications to lpc1768.pp. From Joan Duran
------------------------------------------------------------------------
r22646 | laksen | 2012-10-14 21:10:20 +0200 (So, 14 Okt 2012) | 4 lines

Fixed some minor formating issues
Implemented a small heap mananger
Implemented console IO
Changed default LineEnding to CrLf(to ease console IO parsing)
------------------------------------------------------------------------
r22599 | laksen | 2012-10-09 08:58:58 +0200 (Di, 09 Okt 2012) | 1 line

Added all STM32F1 configurations
------------------------------------------------------------------------
r22597 | laksen | 2012-10-08 22:10:45 +0200 (Mo, 08 Okt 2012) | 1 line

Added initial support for the Cortex-M4F FPv4_S16 FPU
------------------------------------------------------------------------
r22596 | laksen | 2012-10-08 22:04:14 +0200 (Mo, 08 Okt 2012) | 1 line

Added FPv4_d16 FPU instructions, and a few extra registers
------------------------------------------------------------------------
r22592 | laksen | 2012-10-08 16:07:40 +0200 (Mo, 08 Okt 2012) | 2 lines

Added support for IT block merging
Added a peephole pattern check for UXTB->UXTH chains
------------------------------------------------------------------------
r22590 | laksen | 2012-10-08 14:30:00 +0200 (Mo, 08 Okt 2012) | 3 lines

Add CBNZ/CBZ instructions
Create preliminary Thumb-2 PeepHoleOptPass2 code, hacked together from the ARM mode code
Added a number of simple size optimizations for common Thumb-2 instructions
------------------------------------------------------------------------
r22582 | laksen | 2012-10-08 06:49:39 +0200 (Mo, 08 Okt 2012) | 3 lines

Fix optimizations of Thumb-2 code
Fix problem with loading of condition operand for IT instructions
Properly split IT blocks when register allocator tries to spill inside a block.
------------------------------------------------------------------------
r22581 | laksen | 2012-10-08 05:15:40 +0200 (Mo, 08 Okt 2012) | 4 lines

Fixed assembler calling command line for cpus>ARMv5TE. EDSP instructions will generate errors while assembling, due to RTL assembler routines
Updated boot code for all Cortex-M3 controllers, and sc32442b to use weak linking for exception tables.
Cortex-M3 devices now also share initialization routine to simplify maintenance
STM32F10x classes now have specific units which fit the interrupt source names and counts
------------------------------------------------------------------------
r22580 | laksen | 2012-10-08 05:10:44 +0200 (Mo, 08 Okt 2012) | 2 lines

Added support for .section, .set, .weak, and .thumb_set directive for GAS assembler reader
IFDEF'ed JVM specific assembler directives, to prevent ait_* set to exceed 32 elements
------------------------------------------------------------------------
r22579 | laksen | 2012-10-08 02:10:52 +0200 (Mo, 08 Okt 2012) | 3 lines

Remove all traces of the interrupt vector table generation mechanism
Clean up cpuinfo tables
Fixed ARMv7M bug(BLX <label> doesn't exist on that version)

git-svn-id: trunk@22792 -

florian 12 years ago
parent
commit
04543b179f
71 changed files with 8253 additions and 2120 deletions
  1. 6 1
      .gitattributes
  2. 116 9
      compiler/aasmtai.pas
  3. 12 0
      compiler/aggas.pas
  4. 111 6
      compiler/arm/aasmcpu.pas
  5. 7 3
      compiler/arm/agarmgas.pas
  6. 476 10
      compiler/arm/aoptcpu.pas
  7. 37 5
      compiler/arm/armatt.inc
  8. 32 0
      compiler/arm/armatts.inc
  9. 45 10
      compiler/arm/armins.dat
  10. 1 1
      compiler/arm/armnop.inc
  11. 37 5
      compiler/arm/armop.inc
  12. 21 1
      compiler/arm/armreg.dat
  13. 0 7
      compiler/arm/armtab.inc
  14. 137 3
      compiler/arm/cgcpu.pas
  15. 47 6
      compiler/arm/cpubase.pas
  16. 149 196
      compiler/arm/cpuinfo.pas
  17. 2 2
      compiler/arm/cpupara.pas
  18. 8 0
      compiler/arm/cpupi.pas
  19. 1 1
      compiler/arm/itcpugas.pas
  20. 125 2
      compiler/arm/narmadd.pas
  21. 1 1
      compiler/arm/narmcal.pas
  22. 64 3
      compiler/arm/narmcnv.pas
  23. 29 1
      compiler/arm/narminl.pas
  24. 52 1
      compiler/arm/narmmat.pas
  25. 38 1
      compiler/arm/raarmgas.pas
  26. 18 0
      compiler/arm/rarmcon.inc
  27. 18 0
      compiler/arm/rarmdwa.inc
  28. 1 1
      compiler/arm/rarmnor.inc
  29. 19 1
      compiler/arm/rarmnum.inc
  30. 19 1
      compiler/arm/rarmrni.inc
  31. 18 0
      compiler/arm/rarmsri.inc
  32. 18 0
      compiler/arm/rarmsta.inc
  33. 19 1
      compiler/arm/rarmstd.inc
  34. 18 0
      compiler/arm/rarmsup.inc
  35. 97 0
      compiler/arm/rgcpu.pas
  36. 1 1
      compiler/avr/cpubase.pas
  37. 0 6
      compiler/avr/cpuinfo.pas
  38. 0 7
      compiler/fpcdefs.inc
  39. 0 1
      compiler/globtype.pas
  40. 1 1
      compiler/m68k/cpubase.pas
  41. 1 1
      compiler/mips/cpubase.pas
  42. 11 13
      compiler/nadd.pas
  43. 0 87
      compiler/ncgutil.pas
  44. 0 17
      compiler/pdecsub.pas
  45. 0 5
      compiler/pmodules.pas
  46. 1 1
      compiler/powerpc/cpubase.pas
  47. 1 1
      compiler/powerpc64/cpubase.pas
  48. 5 0
      compiler/psystem.pas
  49. 33 2
      compiler/raatt.pas
  50. 1 1
      compiler/rgbase.pas
  51. 0 11
      compiler/symdef.pas
  52. 0 9
      compiler/systems.pas
  53. 32 3
      compiler/systems/t_embed.pas
  54. 2 2
      compiler/x86/cpubase.pas
  55. 9 0
      rtl/arm/thumb2.inc
  56. 100 7
      rtl/embedded/Makefile
  57. 1 1
      rtl/embedded/Makefile.fpc
  58. 52 0
      rtl/embedded/arm/cortexm3_start.inc
  59. 200 223
      rtl/embedded/arm/lm3fury.pp
  60. 259 224
      rtl/embedded/arm/lm3tempest.pp
  61. 1208 141
      rtl/embedded/arm/lpc1768.pp
  62. 297 335
      rtl/embedded/arm/sc32442b.pp
  63. 0 683
      rtl/embedded/arm/stm32f103.pp
  64. 788 0
      rtl/embedded/arm/stm32f10x_conn.pp
  65. 777 0
      rtl/embedded/arm/stm32f10x_hd.pp
  66. 777 0
      rtl/embedded/arm/stm32f10x_ld.pp
  67. 777 0
      rtl/embedded/arm/stm32f10x_md.pp
  68. 778 0
      rtl/embedded/arm/stm32f10x_xl.pp
  69. 116 14
      rtl/embedded/consoleio.pp
  70. 225 43
      rtl/embedded/heapmgr.pp
  71. 1 1
      rtl/embedded/system.pp

+ 6 - 1
.gitattributes

@@ -7429,12 +7429,17 @@ rtl/darwin/x86_64/sighnd.inc svneol=native#text/plain
 rtl/embedded/Makefile svneol=native#text/plain
 rtl/embedded/Makefile svneol=native#text/plain
 rtl/embedded/Makefile.fpc svneol=native#text/plain
 rtl/embedded/Makefile.fpc svneol=native#text/plain
 rtl/embedded/arm/at91sam7x256.pp svneol=native#text/plain
 rtl/embedded/arm/at91sam7x256.pp svneol=native#text/plain
+rtl/embedded/arm/cortexm3_start.inc svneol=native#text/pascal
 rtl/embedded/arm/lm3fury.pp svneol=native#text/pascal
 rtl/embedded/arm/lm3fury.pp svneol=native#text/pascal
 rtl/embedded/arm/lm3tempest.pp svneol=native#text/pascal
 rtl/embedded/arm/lm3tempest.pp svneol=native#text/pascal
 rtl/embedded/arm/lpc1768.pp svneol=native#text/pascal
 rtl/embedded/arm/lpc1768.pp svneol=native#text/pascal
 rtl/embedded/arm/lpc21x4.pp svneol=native#text/plain
 rtl/embedded/arm/lpc21x4.pp svneol=native#text/plain
 rtl/embedded/arm/sc32442b.pp svneol=native#text/pascal
 rtl/embedded/arm/sc32442b.pp svneol=native#text/pascal
-rtl/embedded/arm/stm32f103.pp svneol=native#text/plain
+rtl/embedded/arm/stm32f10x_conn.pp svneol=native#text/pascal
+rtl/embedded/arm/stm32f10x_hd.pp svneol=native#text/pascal
+rtl/embedded/arm/stm32f10x_ld.pp svneol=native#text/pascal
+rtl/embedded/arm/stm32f10x_md.pp svneol=native#text/pascal
+rtl/embedded/arm/stm32f10x_xl.pp svneol=native#text/pascal
 rtl/embedded/avr/atmega128.pp svneol=native#text/plain
 rtl/embedded/avr/atmega128.pp svneol=native#text/plain
 rtl/embedded/avr/start.inc svneol=native#text/plain
 rtl/embedded/avr/start.inc svneol=native#text/plain
 rtl/embedded/buildrtl.lpi svneol=native#text/plain
 rtl/embedded/buildrtl.lpi svneol=native#text/plain

+ 116 - 9
compiler/aasmtai.pas

@@ -85,7 +85,10 @@ interface
 {$endif m68k}
 {$endif m68k}
 {$ifdef arm}
 {$ifdef arm}
           ait_thumb_func,
           ait_thumb_func,
+          ait_thumb_set,
 {$endif arm}
 {$endif arm}
+          ait_set,
+          ait_weak,
           { used to split into tiny assembler files }
           { used to split into tiny assembler files }
           ait_cutobject,
           ait_cutobject,
           ait_regalloc,
           ait_regalloc,
@@ -94,11 +97,13 @@ interface
           ait_marker,
           ait_marker,
           { used to describe a new location of a variable }
           { used to describe a new location of a variable }
           ait_varloc,
           ait_varloc,
-          { SEH directives used in ARM,MIPS and x86_64 COFF targets }
-          ait_seh_directive,
+{$ifdef JVM}
           { JVM only }
           { JVM only }
           ait_jvar,    { debug information for a local variable }
           ait_jvar,    { debug information for a local variable }
-          ait_jcatch   { exception catch clause }
+          ait_jcatch,  { exception catch clause }
+{$endif JVM}
+          { SEH directives used in ARM,MIPS and x86_64 COFF targets }
+          ait_seh_directive
           );
           );
 
 
         taiconst_type = (
         taiconst_type = (
@@ -187,15 +192,20 @@ interface
 {$endif m68k}
 {$endif m68k}
 {$ifdef arm}
 {$ifdef arm}
           'thumb_func',
           'thumb_func',
+          'thumb_set',
 {$endif arm}
 {$endif arm}
+          'set',
+          'weak',
           'cut',
           'cut',
           'regalloc',
           'regalloc',
           'tempalloc',
           'tempalloc',
           'marker',
           'marker',
           'varloc',
           'varloc',
-          'seh_directive',
+{$ifdef JVM}
           'jvar',
           'jvar',
-          'jcatch'
+          'jcatch',
+{$endif JVM}
+          'seh_directive'
           );
           );
 
 
     type
     type
@@ -275,8 +285,11 @@ interface
                    ,ait_stab, ait_function_name, ait_force_line
                    ,ait_stab, ait_function_name, ait_force_line
                    ,ait_regalloc, ait_tempalloc, ait_symbol_end
                    ,ait_regalloc, ait_tempalloc, ait_symbol_end
 				   ,ait_ent, ait_ent_end, ait_directive
 				   ,ait_ent, ait_ent_end, ait_directive
-                   ,ait_varloc,ait_seh_directive
-                   ,ait_jvar, ait_jcatch];
+                   ,ait_varloc,
+{$ifdef JVM}
+                   ait_jvar, ait_jcatch,
+{$endif JVM}
+                   ait_seh_directive];
 
 
       { ait_* types which do not have line information (and hence which are of type
       { ait_* types which do not have line information (and hence which are of type
         tai, otherwise, they are of type tailineinfo }
         tai, otherwise, they are of type tailineinfo }
@@ -288,11 +301,15 @@ interface
 					 ait_ent, ait_ent_end,
 					 ait_ent, ait_ent_end,
 {$ifdef arm}
 {$ifdef arm}
                      ait_thumb_func,
                      ait_thumb_func,
+                     ait_thumb_set,
 {$endif arm}
 {$endif arm}
+                     ait_set,ait_weak,
                      ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
                      ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
                      ait_symbol,
                      ait_symbol,
-                     ait_seh_directive,
-                     ait_jvar,ait_jcatch
+{$ifdef JVM}
+                     ait_jvar, ait_jcatch,
+{$endif JVM}
+                     ait_seh_directive
                     ];
                     ];
 
 
 
 
@@ -790,6 +807,7 @@ interface
         end;
         end;
         tai_seh_directive_class=class of tai_seh_directive;
         tai_seh_directive_class=class of tai_seh_directive;
 
 
+{$ifdef JVM}
         { JVM variable live range description }
         { JVM variable live range description }
         tai_jvar = class(tai)
         tai_jvar = class(tai)
           stackslot: longint;
           stackslot: longint;
@@ -814,6 +832,30 @@ interface
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
         end;
         end;
         tai_jcatch_class = class of tai_jcatch;
         tai_jcatch_class = class of tai_jcatch;
+{$endif JVM}
+
+        tai_set = class(tai)
+          sym,
+          value: pshortstring;
+          constructor create(const asym, avalue: string);
+          destructor destroy;override;
+          constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
+          procedure ppuwrite(ppufile:tcompilerppufile);override;
+        end;
+
+{$ifdef arm}
+        tai_thumb_set = class(tai_set)
+          constructor create(const asym, avalue: string);
+        end;
+{$endif arm}
+
+        tai_weak = class(tai)
+          sym: pshortstring;
+          constructor create(const asym: string);
+          destructor destroy;override;
+          constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
+          procedure ppuwrite(ppufile:tcompilerppufile);override;
+        end;
 
 
     var
     var
       { array with all class types for tais }
       { array with all class types for tais }
@@ -927,6 +969,69 @@ implementation
       end;
       end;
 
 
 
 
+    constructor tai_weak.create(const asym: string);
+      begin
+        inherited create;
+        typ:=ait_weak;
+        sym:=stringdup(asym);
+      end;
+
+    destructor tai_weak.destroy;
+      begin
+        stringdispose(sym);
+        inherited destroy;
+      end;
+
+    constructor tai_weak.ppuload(t: taitype; ppufile: tcompilerppufile);
+      begin
+        inherited ppuload(t,ppufile);
+        sym:=stringdup(ppufile.getstring);
+      end;
+
+    procedure tai_weak.ppuwrite(ppufile: tcompilerppufile);
+      begin
+        inherited ppuwrite(ppufile);
+        ppufile.putstring(sym^);
+      end;
+
+{$ifdef arm}
+    constructor tai_thumb_set.create(const asym, avalue: string);
+      begin
+        inherited create(asym, avalue);
+        typ:=ait_thumb_set;
+      end;
+{$endif arm}
+
+    constructor tai_set.create(const asym, avalue: string);
+      begin
+        inherited create;
+        typ:=ait_set;
+        sym:=stringdup(asym);
+        value:=stringdup(avalue);
+      end;
+
+    destructor tai_set.destroy;
+      begin
+        stringdispose(sym);
+        stringdispose(value);
+        inherited destroy;
+      end;
+
+    constructor tai_set.ppuload(t: taitype; ppufile: tcompilerppufile);
+      begin
+        inherited ppuload(t,ppufile);
+        sym:=stringdup(ppufile.getstring);
+        value:=stringdup(ppufile.getstring);
+      end;
+
+    procedure tai_set.ppuwrite(ppufile: tcompilerppufile);
+      begin
+        inherited ppuwrite(ppufile);
+        ppufile.putstring(sym^);
+        ppufile.putstring(value^);
+      end;
+
+
     constructor tai_varloc.create(sym: tsym; loc: tregister);
     constructor tai_varloc.create(sym: tsym; loc: tregister);
       begin
       begin
         inherited Create;
         inherited Create;
@@ -2823,6 +2928,7 @@ implementation
       begin
       begin
       end;
       end;
 
 
+{$ifdef JVM}
 
 
 {****************************************************************************
 {****************************************************************************
                               tai_jvar
                               tai_jvar
@@ -2913,6 +3019,7 @@ implementation
         ppufile.putasmsymbol(handlerlab);
         ppufile.putasmsymbol(handlerlab);
       end;
       end;
 
 
+{$endif JVM}
 
 
 begin
 begin
 {$push}{$warnings off}
 {$push}{$warnings off}

+ 12 - 0
compiler/aggas.pas

@@ -1286,7 +1286,19 @@ implementation
              begin
              begin
                AsmWriteLn(#9'.thumb_func');
                AsmWriteLn(#9'.thumb_func');
              end;
              end;
+           ait_thumb_set:
+             begin
+               AsmWriteLn(#9'.thumb_set '+tai_thumb_set(hp).sym^+', '+tai_thumb_set(hp).value^);
+             end;
 {$endif arm}
 {$endif arm}
+           ait_set:
+             begin
+               AsmWriteLn(#9'.set '+tai_set(hp).sym^+', '+tai_set(hp).value^);
+             end;
+           ait_weak:
+             begin
+               AsmWriteLn(#9'.weak '+tai_weak(hp).sym^);
+             end;
            ait_ent:
            ait_ent:
              begin
              begin
                AsmWrite(#9'.ent'#9);
                AsmWrite(#9'.ent'#9);

+ 111 - 6
compiler/arm/aasmcpu.pas

@@ -175,6 +175,7 @@ uses
          constructor op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
          constructor op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
          constructor op_reg_const(op:tasmop; _op1: tregister; _op2: aint);
          constructor op_reg_const(op:tasmop; _op1: tregister; _op2: aint);
 
 
+         constructor op_regset(op:tasmop; regtype: tregistertype; subreg: tsubregister; _op1: tcpuregisterset);
          constructor op_ref_regset(op:tasmop; _op1: treference; regtype: tregistertype; subreg: tsubregister; _op2: tcpuregisterset);
          constructor op_ref_regset(op:tasmop; _op1: treference; regtype: tregistertype; subreg: tsubregister; _op2: tcpuregisterset);
 
 
          constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
          constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
@@ -269,7 +270,7 @@ uses
 implementation
 implementation
 
 
   uses
   uses
-    cutils,rgobj,itcpugas;
+    cutils,rgobj,itcpugas,aoptcpu;
 
 
 
 
     procedure taicpu.loadshifterop(opidx:longint;const so:tshifterop);
     procedure taicpu.loadshifterop(opidx:longint;const so:tshifterop);
@@ -415,6 +416,13 @@ implementation
          loadconst(1,aint(_op2));
          loadconst(1,aint(_op2));
       end;
       end;
 
 
+    constructor taicpu.op_regset(op: tasmop; regtype: tregistertype; subreg: tsubregister; _op1: tcpuregisterset);
+      begin
+        inherited create(op);
+        ops:=1;
+        loadregset(0,regtype,subreg,_op1);
+      end;
+
 
 
     constructor taicpu.op_ref_regset(op:tasmop; _op1: treference; regtype: tregistertype; subreg: tsubregister; _op2: tcpuregisterset);
     constructor taicpu.op_ref_regset(op:tasmop; _op1: treference; regtype: tregistertype; subreg: tsubregister; _op2: tcpuregisterset);
       begin
       begin
@@ -478,8 +486,8 @@ implementation
     constructor taicpu.op_cond(op: tasmop; cond: tasmcond);
     constructor taicpu.op_cond(op: tasmop; cond: tasmcond);
       begin
       begin
         inherited create(op);
         inherited create(op);
-        ops:=0;
-        condition := cond;
+        ops:=1;
+        loadconditioncode(0, cond);
       end;
       end;
 
 
     constructor taicpu.op_modeflags(op: tasmop; flags: tcpumodeflags);
     constructor taicpu.op_modeflags(op: tasmop; flags: tcpumodeflags);
@@ -1090,13 +1098,110 @@ implementation
           end;
           end;
       end;
       end;
 
 
-    procedure finalizearmcode(list, listtoinsert: TAsmList);
+
+    function getMergedInstruction(FirstOp,LastOp:TAsmOp;InvertLast:boolean) : TAsmOp;
+      const
+        opTable: array[A_IT..A_ITTTT] of string =
+          ('T','TE','TT','TEE','TTE','TET','TTT',
+           'TEEE','TTEE','TETE','TTTE',
+           'TEET','TTET','TETT','TTTT');
+        invertedOpTable: array[A_IT..A_ITTTT] of string =
+          ('E','ET','EE','ETT','EET','ETE','EEE',
+           'ETTT','EETT','ETET','EEET',
+           'ETTE','EETE','ETEE','EEEE');
+      var
+        resStr : string;
+        i : TAsmOp;
       begin
       begin
-        insertpcrelativedata(list, listtoinsert);
+        if InvertLast then
+          resStr := opTable[FirstOp]+invertedOpTable[LastOp]
+        else
+          resStr := opTable[FirstOp]+opTable[LastOp];
+        if length(resStr) > 4 then
+          internalerror(2012100805);
+
+        for i := low(opTable) to high(opTable) do
+          if opTable[i] = resStr then
+            exit(i);
+
+        internalerror(2012100806);
+      end;
+
+    procedure foldITInstructions(list: TAsmList);
+      var
+        curtai,hp1 : tai;
+        levels,i : LongInt;
+      begin
+        curtai:=tai(list.First);
+        while assigned(curtai) do
+          begin
+            case curtai.typ of
+              ait_instruction:
+                if IsIT(taicpu(curtai).opcode) then
+                  begin
+                    levels := GetITLevels(taicpu(curtai).opcode);
+                    if levels < 4 then
+                      begin
+                        i:=levels;
+                        hp1:=tai(curtai.Next);
+                        while assigned(hp1) and
+                          (i > 0) do
+                          begin
+                            if hp1.typ=ait_instruction then
+                              begin
+                                dec(i);
+                                if (i = 0) and
+                                  mustbelast(hp1) then
+                                  begin
+                                    hp1:=nil;
+                                    break;
+                                  end;
+                              end;
+                            hp1:=tai(hp1.Next);
+                          end;
+
+                        if assigned(hp1) then
+                          begin
+                            // We are pointing at the first instruction after the IT block
+                            while assigned(hp1) and
+                              (hp1.typ<>ait_instruction) do
+                                hp1:=tai(hp1.Next);
+
+                            if assigned(hp1) and
+                              (hp1.typ=ait_instruction) and
+                              IsIT(taicpu(hp1).opcode) then
+                              begin
+                                if (levels+GetITLevels(taicpu(hp1).opcode) <= 4) and
+                                  ((taicpu(curtai).oper[0]^.cc=taicpu(hp1).oper[0]^.cc) or
+                                   (taicpu(curtai).oper[0]^.cc=inverse_cond(taicpu(hp1).oper[0]^.cc))) then
+                                  begin
+                                    taicpu(curtai).opcode:=getMergedInstruction(taicpu(curtai).opcode,
+                                                                                taicpu(hp1).opcode,
+                                                                                taicpu(curtai).oper[0]^.cc=inverse_cond(taicpu(hp1).oper[0]^.cc));
+
+                                    list.Remove(hp1);
+                                    hp1.Free;
+                                  end;
+                              end;
+                          end;
+                      end;
+                  end;
+            end;
+
+            curtai:=tai(curtai.Next);
+          end;
+      end;
 
 
+    procedure finalizearmcode(list, listtoinsert: TAsmList);
+      begin
         { Do Thumb-2 16bit -> 32bit transformations }
         { Do Thumb-2 16bit -> 32bit transformations }
         if current_settings.cputype in cpu_thumb2 then
         if current_settings.cputype in cpu_thumb2 then
-          ensurethumb2encodings(list);
+          begin
+            ensurethumb2encodings(list);
+            foldITInstructions(list);
+          end;
+
+        insertpcrelativedata(list, listtoinsert);
       end;
       end;
 
 
     procedure InsertPData;
     procedure InsertPData;

+ 7 - 3
compiler/arm/agarmgas.pas

@@ -106,11 +106,13 @@ unit agarmgas;
           result:='-mfpu=vfpv3 '+result;
           result:='-mfpu=vfpv3 '+result;
         if (current_settings.fputype = fpu_vfpv3_d16) then
         if (current_settings.fputype = fpu_vfpv3_d16) then
           result:='-mfpu=vfpv3-d16 '+result;
           result:='-mfpu=vfpv3-d16 '+result;
+        if (current_settings.fputype = fpu_fpv4_s16) then
+          result:='-mfpu=fpv4-sp-d16 '+result;
 
 
         if current_settings.cputype=cpu_armv7m then
         if current_settings.cputype=cpu_armv7m then
           result:='-march=armv7m -mthumb -mthumb-interwork '+result
           result:='-march=armv7m -mthumb -mthumb-interwork '+result
-        { pass only cpu types >= armv6 because the rtl uses runtime selected code with armv5te statements }
-        else if current_settings.cputype>=cpu_armv6 then
+        // EDSP instructions in RTL require armv5te at least to not generate error
+        else if current_settings.cputype >= cpu_armv5te then
           result:='-march='+cputype_to_gas_march[current_settings.cputype]+' '+result;
           result:='-march='+cputype_to_gas_march[current_settings.cputype]+' '+result;
 
 
         if target_info.abi = abi_eabihf then
         if target_info.abi = abi_eabihf then
@@ -292,8 +294,10 @@ unit agarmgas;
 
 
           if taicpu(hp).ops = 0 then
           if taicpu(hp).ops = 0 then
             s:=#9+gas_op2str[op]+' '+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix]
             s:=#9+gas_op2str[op]+' '+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix]
+          else if (taicpu(hp).opcode>=A_VABS) and (taicpu(hp).opcode<=A_VSUB) then
+            s:=#9+gas_op2str[op]+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix]
           else
           else
-            s:=#9+gas_op2str[op]+oppostfix2str[taicpu(hp).oppostfix]+postfix+cond2str[taicpu(hp).condition]; // Conditional infixes are deprecated in unified syntax
+            s:=#9+gas_op2str[op]+oppostfix2str[taicpu(hp).oppostfix]+cond2str[taicpu(hp).condition]+postfix; // Conditional infixes are deprecated in unified syntax
         end
         end
       else
       else
         s:=#9+gas_op2str[op]+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix];
         s:=#9+gas_op2str[op]+cond2str[taicpu(hp).condition]+oppostfix2str[taicpu(hp).oppostfix];

+ 476 - 10
compiler/arm/aoptcpu.pas

@@ -30,7 +30,7 @@ Unit aoptcpu;
 
 
 Interface
 Interface
 
 
-uses cgbase, cpubase, aasmtai, aasmcpu,aopt, aoptcpub, aoptobj;
+uses cgbase, cpubase, aasmtai, aasmcpu,aopt, aoptcpub, aoptobj, cclasses;
 
 
 Type
 Type
   TCpuAsmOptimizer = class(TAsmOptimizer)
   TCpuAsmOptimizer = class(TAsmOptimizer)
@@ -62,9 +62,12 @@ Type
 
 
   TCpuThumb2AsmOptimizer = class(TCpuAsmOptimizer)
   TCpuThumb2AsmOptimizer = class(TCpuAsmOptimizer)
     { uses the same constructor as TAopObj }
     { uses the same constructor as TAopObj }
+    function PeepHoleOptPass1Cpu(var p: tai): boolean; override;
     procedure PeepHoleOptPass2;override;
     procedure PeepHoleOptPass2;override;
   End;
   End;
 
 
+  function MustBeLast(p : tai) : boolean;
+
 Implementation
 Implementation
 
 
   uses
   uses
@@ -79,6 +82,9 @@ Implementation
       result:=
       result:=
         (p.typ=ait_instruction) and
         (p.typ=ait_instruction) and
         (taicpu(p).condition=C_None) and
         (taicpu(p).condition=C_None) and
+        ((taicpu(p).opcode<A_IT) or (taicpu(p).opcode>A_ITTTT)) and
+        (taicpu(p).opcode<>A_CBZ) and
+        (taicpu(p).opcode<>A_CBNZ) and
         (taicpu(p).opcode<>A_PLD) and
         (taicpu(p).opcode<>A_PLD) and
         ((taicpu(p).opcode<>A_BLX) or
         ((taicpu(p).opcode<>A_BLX) or
          (taicpu(p).oper[0]^.typ=top_reg));
          (taicpu(p).oper[0]^.typ=top_reg));
@@ -269,6 +275,15 @@ Implementation
       end;
       end;
   end;
   end;
 
 
+  function isValidConstLoadStoreOffset(const aoffset: longint; const pf: TOpPostfix) : boolean;
+    begin
+      if current_settings.cputype in cpu_thumb2 then
+        result := (aoffset<4096) and (aoffset>-256)
+      else
+        result := ((pf in [PF_None,PF_B]) and
+                   (abs(aoffset)<4096)) or
+                  (abs(aoffset)<256);
+    end;
 
 
   function TCpuAsmOptimizer.RegUsedAfterInstruction(reg: Tregister; p: tai;
   function TCpuAsmOptimizer.RegUsedAfterInstruction(reg: Tregister; p: tai;
     var AllUsedRegs: TAllUsedRegs): Boolean;
     var AllUsedRegs: TAllUsedRegs): Boolean;
@@ -321,6 +336,9 @@ Implementation
          (taicpu(movp).oper[0]^.reg<>NR_R14) and
          (taicpu(movp).oper[0]^.reg<>NR_R14) and
          { the destination register of the mov might not be used beween p and movp }
          { the destination register of the mov might not be used beween p and movp }
          not(RegUsedBetween(taicpu(movp).oper[0]^.reg,p,movp)) and
          not(RegUsedBetween(taicpu(movp).oper[0]^.reg,p,movp)) and
+         { cb[n]z are thumb instructions which require specific registers, with no wide forms }
+         (taicpu(p).opcode<>A_CBZ) and
+         (taicpu(p).opcode<>A_CBNZ) and
          {There is a special requirement for MUL and MLA, oper[0] and oper[1] are not allowed to be the same}
          {There is a special requirement for MUL and MLA, oper[0] and oper[1] are not allowed to be the same}
          not (
          not (
            (taicpu(p).opcode in [A_MLA, A_MUL]) and
            (taicpu(p).opcode in [A_MLA, A_MUL]) and
@@ -1106,16 +1124,10 @@ Implementation
                           { new offset must be valid: either in the range of 8 or 12 bit, depend on the
                           { new offset must be valid: either in the range of 8 or 12 bit, depend on the
                             ldr postfix }
                             ldr postfix }
                           (((taicpu(p).opcode=A_ADD) and
                           (((taicpu(p).opcode=A_ADD) and
-                            (((taicpu(hp1).oppostfix in [PF_None,PF_B]) and
-                              (abs(taicpu(hp1).oper[1]^.ref^.offset+taicpu(p).oper[2]^.val)<4096)) or
-                             (abs(taicpu(hp1).oper[1]^.ref^.offset+taicpu(p).oper[2]^.val)<256)
-                            )
+                           isValidConstLoadStoreOffset(taicpu(hp1).oper[1]^.ref^.offset+taicpu(p).oper[2]^.val, taicpu(hp1).oppostfix)
                            ) or
                            ) or
                            ((taicpu(p).opcode=A_SUB) and
                            ((taicpu(p).opcode=A_SUB) and
-                             (((taicpu(hp1).oppostfix in [PF_None,PF_B]) and
-                               (abs(taicpu(hp1).oper[1]^.ref^.offset-taicpu(p).oper[2]^.val)<4096)) or
-                              (abs(taicpu(hp1).oper[1]^.ref^.offset-taicpu(p).oper[2]^.val)<256)
-                             )
+                            isValidConstLoadStoreOffset(taicpu(hp1).oper[1]^.ref^.offset-taicpu(p).oper[2]^.val, taicpu(hp1).oppostfix)
                            )
                            )
                           ) do
                           ) do
                           begin
                           begin
@@ -1160,6 +1172,114 @@ Implementation
                     if GetNextInstructionUsingReg(p, hp1, taicpu(p).oper[0]^.reg) then
                     if GetNextInstructionUsingReg(p, hp1, taicpu(p).oper[0]^.reg) then
                       RemoveSuperfluousMove(p, hp1, 'DataMov2Data');
                       RemoveSuperfluousMove(p, hp1, 'DataMov2Data');
                   end;
                   end;
+                A_MVN:
+                  begin
+                    {
+                      change
+                      mvn reg2,reg1
+                      and reg3,reg4,reg2
+                      dealloc reg2
+                      to
+                      bic reg3,reg4,reg1
+                    }
+                    if (taicpu(p).oper[1]^.typ = top_reg) and
+                      GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and
+                      MatchInstruction(hp1,A_AND,[],[]) and
+                      (((taicpu(hp1).ops=3) and
+                        (taicpu(hp1).oper[2]^.typ=top_reg) and
+                        (MatchOperand(taicpu(hp1).oper[2]^, taicpu(p).oper[0]^.reg) or
+                         MatchOperand(taicpu(hp1).oper[1]^, taicpu(p).oper[0]^.reg))) or
+                       ((taicpu(hp1).ops=2) and
+                        (taicpu(hp1).oper[1]^.typ=top_reg) and
+                        MatchOperand(taicpu(hp1).oper[1]^, taicpu(p).oper[0]^.reg))) and
+                      assigned(FindRegDealloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) and
+                      { reg1 might not be modified inbetween }
+                      not(RegModifiedBetween(taicpu(p).oper[1]^.reg,p,hp1)) then
+                      begin
+                        DebugMsg('Peephole MvnAnd2Bic done', p);
+                        taicpu(hp1).opcode:=A_BIC;
+
+                        if taicpu(hp1).ops=3 then
+                          begin
+                            if MatchOperand(taicpu(hp1).oper[1]^, taicpu(p).oper[0]^.reg) then
+                              taicpu(hp1).loadReg(1,taicpu(hp1).oper[2]^.reg); // Swap operands
+
+                            taicpu(hp1).loadReg(2,taicpu(p).oper[1]^.reg);
+                          end
+                        else
+                          taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                        asml.remove(p);
+                        p.free;
+                        p:=hp1;
+                      end;
+                  end;
+                A_UXTB:
+                  begin
+                    {
+                      change
+                      uxtb reg2,reg1
+                      strb reg2,[...]
+                      dealloc reg2
+                      to
+                      strb reg1,[...]
+                    }
+                    if MatchInstruction(p, taicpu(p).opcode, [C_None], [PF_None]) and
+                      GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and
+                      MatchInstruction(hp1, A_STR, [C_None], [PF_B]) and
+                      assigned(FindRegDealloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) and
+                      { the reference in strb might not use reg2 }
+                      not(RegInRef(taicpu(p).oper[0]^.reg,taicpu(hp1).oper[1]^.ref^)) and
+                      { reg1 might not be modified inbetween }
+                      not(RegModifiedBetween(taicpu(p).oper[1]^.reg,p,hp1)) then
+                      begin
+                        DebugMsg('Peephole UxtbStrb2Strb done', p);
+                        taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
+                        asml.remove(p);
+                        p.free;
+                        p:=hp1;
+                      end
+                    {
+                      change
+                      uxtb reg2,reg1
+                      uxth reg3,reg2
+                      dealloc reg2
+                      to
+                      uxtb reg3,reg1
+                    }
+                    else if MatchInstruction(p, A_UXTB, [C_None], [PF_None]) and
+                      GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and
+                      MatchInstruction(hp1, A_UXTH, [C_None], [PF_None]) and
+                      (assigned(FindRegDealloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) or
+                       (taicpu(p).oper[0]^.reg = taicpu(hp1).oper[0]^.reg)) and
+                      { reg1 might not be modified inbetween }
+                      not(RegModifiedBetween(taicpu(p).oper[1]^.reg,p,hp1)) then
+                      begin
+                        DebugMsg('Peephole UxtbUxth2Uxtb done', p);
+                        taicpu(hp1).opcode:=A_UXTB;
+                        taicpu(hp1).loadReg(1,taicpu(p).oper[1]^.reg);
+                        asml.remove(p);
+                        p.free;
+                        p:=hp1;
+                      end;
+                  end;
+                A_UXTH:
+                  begin
+                    if MatchInstruction(p, taicpu(p).opcode, [C_None], [PF_None]) and
+                      GetNextInstructionUsingReg(p,hp1,taicpu(p).oper[0]^.reg) and
+                      MatchInstruction(hp1, A_STR, [C_None], [PF_H]) and
+                      assigned(FindRegDealloc(taicpu(p).oper[0]^.reg,tai(hp1.Next))) and
+                      { the reference in strb might not use reg2 }
+                      not(RegInRef(taicpu(p).oper[0]^.reg,taicpu(hp1).oper[1]^.ref^)) and
+                      { reg1 might not be modified inbetween }
+                      not(RegModifiedBetween(taicpu(p).oper[1]^.reg,p,hp1)) then
+                      begin
+                        DebugMsg('Peephole UXTHStrh2Strh done', p);
+                        taicpu(hp1).loadReg(0,taicpu(p).oper[1]^.reg);
+                        asml.remove(p);
+                        p.free;
+                        p:=hp1;
+                      end;
+                  end;
                 A_CMP:
                 A_CMP:
                   begin
                   begin
                     {
                     {
@@ -1574,9 +1694,355 @@ Implementation
     end;
     end;
 
 
 
 
+  procedure DecrementPreceedingIT(list: TAsmList; p: tai);
+    var
+      hp : tai;
+      l : longint;
+    begin
+      hp := tai(p.Previous);
+      l := 1;
+
+      while assigned(hp) and
+        (l <= 4) do
+        begin
+          if hp.typ=ait_instruction then
+            begin
+              if (taicpu(hp).opcode>=A_IT) and
+                (taicpu(hp).opcode <= A_ITTTT) then
+                begin
+                  if (taicpu(hp).opcode = A_IT) and
+                     (l=1) then
+                    list.Remove(hp)
+                  else
+                    case taicpu(hp).opcode of
+                      A_ITE:
+                        if l=2 then taicpu(hp).opcode := A_IT;
+                      A_ITT:
+                        if l=2 then taicpu(hp).opcode := A_IT;
+                      A_ITEE:
+                        if l=3 then taicpu(hp).opcode := A_ITE;
+                      A_ITTE:
+                        if l=3 then taicpu(hp).opcode := A_ITT;
+                      A_ITET:
+                        if l=3 then taicpu(hp).opcode := A_ITE;
+                      A_ITTT:
+                        if l=3 then taicpu(hp).opcode := A_ITT;
+                      A_ITEEE:
+                        if l=4 then taicpu(hp).opcode := A_ITEE;
+                      A_ITTEE:
+                        if l=4 then taicpu(hp).opcode := A_ITTE;
+                      A_ITETE:
+                        if l=4 then taicpu(hp).opcode := A_ITET;
+                      A_ITTTE:
+                        if l=4 then taicpu(hp).opcode := A_ITTT;
+                      A_ITEET:
+                        if l=4 then taicpu(hp).opcode := A_ITEE;
+                      A_ITTET:
+                        if l=4 then taicpu(hp).opcode := A_ITTE;
+                      A_ITETT:
+                        if l=4 then taicpu(hp).opcode := A_ITET;
+                      A_ITTTT:
+                        if l=4 then taicpu(hp).opcode := A_ITTT;
+                    end;
+
+                  break;
+                end;
+              {else if (taicpu(hp).condition<>taicpu(p).condition) or
+                (taicpu(hp).condition<>inverse_cond(taicpu(p).condition)) then
+                break;}
+
+              inc(l);
+            end;
+          hp := tai(hp.Previous);
+        end;
+    end;
+
+  function TCpuThumb2AsmOptimizer.PeepHoleOptPass1Cpu(var p: tai): boolean;
+    var
+      hp : taicpu;
+      hp1,hp2 : tai;
+    begin
+      if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_STM, [C_None], [PF_FD,PF_DB]) and
+        (taicpu(p).oper[0]^.ref^.addressmode=AM_PREINDEXED) and
+        (taicpu(p).oper[0]^.ref^.index=NR_STACK_POINTER_REG) and
+        ((taicpu(p).oper[1]^.regset^*[8..13,15])=[]) then
+        begin
+          hp := taicpu.op_regset(A_PUSH, R_INTREGISTER, R_SUBWHOLE, taicpu(p).oper[1]^.regset^);
+          AsmL.InsertAfter(hp, p);
+          asml.Remove(p);
+          p:=hp;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_STR, [C_None], [PF_None]) and
+        (taicpu(p).oper[1]^.ref^.addressmode=AM_PREINDEXED) and
+        (taicpu(p).oper[1]^.ref^.index=NR_STACK_POINTER_REG) and
+        (taicpu(p).oper[1]^.ref^.offset=-4) and
+        (getsupreg(taicpu(p).oper[0]^.reg) in [0..7,14]) then
+        begin
+          hp := taicpu.op_regset(A_PUSH, R_INTREGISTER, R_SUBWHOLE, [getsupreg(taicpu(p).oper[0]^.reg)]);
+          asml.InsertAfter(hp, p);
+          asml.Remove(p);
+          p.Free;
+          p:=hp;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_LDM, [C_None], [PF_FD,PF_IA]) and
+        (taicpu(p).oper[0]^.ref^.addressmode=AM_PREINDEXED) and
+        (taicpu(p).oper[0]^.ref^.index=NR_STACK_POINTER_REG) and
+        ((taicpu(p).oper[1]^.regset^*[8..14])=[]) then
+        begin
+          hp := taicpu.op_regset(A_POP, R_INTREGISTER, R_SUBWHOLE, taicpu(p).oper[1]^.regset^);
+          asml.InsertBefore(hp, p);
+          asml.Remove(p);
+          p.Free;
+          p:=hp;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_LDR, [C_None], [PF_None]) and
+        (taicpu(p).oper[1]^.ref^.addressmode=AM_POSTINDEXED) and
+        (taicpu(p).oper[1]^.ref^.index=NR_STACK_POINTER_REG) and
+        (taicpu(p).oper[1]^.ref^.offset=4) and
+        (getsupreg(taicpu(p).oper[0]^.reg) in [0..7,15]) then
+        begin
+          hp := taicpu.op_regset(A_POP, R_INTREGISTER, R_SUBWHOLE, [getsupreg(taicpu(p).oper[0]^.reg)]);
+          asml.InsertBefore(hp, p);
+          asml.Remove(p);
+          p.Free;
+          p:=hp;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_MOV, [C_None], [PF_None]) and
+        (taicpu(p).oper[1]^.typ=top_const) and
+        (taicpu(p).oper[1]^.val >= 0) and
+        (taicpu(p).oper[1]^.val < 256) and
+        (not RegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs)) then
+        begin
+          asml.InsertBefore(tai_regalloc.alloc(NR_DEFAULTFLAGS,p), p);
+          asml.InsertAfter(tai_regalloc.dealloc(NR_DEFAULTFLAGS,p), p);
+          IncludeRegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs);
+          taicpu(p).oppostfix:=PF_S;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, A_MVN, [C_None], [PF_None]) and
+        (taicpu(p).oper[1]^.typ=top_reg) and
+        (not RegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs)) then
+        begin
+          asml.InsertBefore(tai_regalloc.alloc(NR_DEFAULTFLAGS,p), p);
+          asml.InsertAfter(tai_regalloc.dealloc(NR_DEFAULTFLAGS,p), p);
+          IncludeRegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs);
+          taicpu(p).oppostfix:=PF_S;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_ADD,A_SUB], [C_None], [PF_None]) and
+        (taicpu(p).ops = 3) and
+        MatchOperand(taicpu(p).oper[0]^, taicpu(p).oper[1]^) and
+        (not MatchOperand(taicpu(p).oper[0]^, NR_STACK_POINTER_REG)) and
+        (taicpu(p).oper[2]^.typ=top_const) and
+        (taicpu(p).oper[2]^.val >= 0) and
+        (taicpu(p).oper[2]^.val < 256) and
+        (not RegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs)) then
+        begin
+          asml.InsertBefore(tai_regalloc.alloc(NR_DEFAULTFLAGS,p), p);
+          asml.InsertAfter(tai_regalloc.dealloc(NR_DEFAULTFLAGS,p), p);
+          IncludeRegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs);
+          taicpu(p).loadconst(1,taicpu(p).oper[2]^.val);
+          taicpu(p).oppostfix:=PF_S;
+          taicpu(p).ops := 2;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_AND,A_ORR,A_EOR,A_LSL,A_LSR,A_ASR,A_ROR], [C_None], [PF_None,PF_S]) and
+        (taicpu(p).ops = 3) and
+        MatchOperand(taicpu(p).oper[0]^, taicpu(p).oper[1]^) and
+        (taicpu(p).oper[2]^.typ=top_reg) and
+        (not RegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs)) then
+        begin
+          asml.InsertBefore(tai_regalloc.alloc(NR_DEFAULTFLAGS,p), p);
+          asml.InsertAfter(tai_regalloc.dealloc(NR_DEFAULTFLAGS,p), p);
+          IncludeRegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs);
+          taicpu(p).ops := 2;
+          taicpu(p).loadreg(1,taicpu(p).oper[2]^.reg);
+          taicpu(p).oppostfix:=PF_S;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_AND,A_ORR,A_EOR], [], [PF_None,PF_S]) and
+        (taicpu(p).ops = 3) and
+        MatchOperand(taicpu(p).oper[0]^, taicpu(p).oper[2]^) and
+        (not RegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs)) then
+        begin
+          asml.InsertBefore(tai_regalloc.alloc(NR_DEFAULTFLAGS,p), p);
+          asml.InsertAfter(tai_regalloc.dealloc(NR_DEFAULTFLAGS,p), p);
+          IncludeRegInUsedRegs(NR_DEFAULTFLAGS,UsedRegs);
+          taicpu(p).oppostfix:=PF_S;
+          taicpu(p).ops := 2;
+          result:=true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_AND], [], [PF_None]) and
+        (taicpu(p).ops = 2) and
+        (taicpu(p).oper[1]^.typ=top_const) and
+        ((taicpu(p).oper[1]^.val=255) or
+         (taicpu(p).oper[1]^.val=65535)) then
+        begin
+          if taicpu(p).oper[1]^.val=255 then
+            taicpu(p).opcode:=A_UXTB
+          else
+            taicpu(p).opcode:=A_UXTH;
+
+          taicpu(p).loadreg(1, taicpu(p).oper[0]^.reg);
+
+          result := true;
+        end
+      else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_AND], [], [PF_None]) and
+        (taicpu(p).ops = 3) and
+        (taicpu(p).oper[2]^.typ=top_const) and
+        ((taicpu(p).oper[2]^.val=255) or
+         (taicpu(p).oper[2]^.val=65535)) then
+        begin
+          if taicpu(p).oper[2]^.val=255 then
+            taicpu(p).opcode:=A_UXTB
+          else
+            taicpu(p).opcode:=A_UXTH;
+
+          taicpu(p).ops:=2;
+
+          result := true;
+        end
+      {else if (p.typ=ait_instruction) and
+        MatchInstruction(p, [A_CMP], [C_None], [PF_None]) and
+        (taicpu(p).oper[1]^.typ=top_const) and
+        (taicpu(p).oper[1]^.val=0) and
+        GetNextInstruction(p,hp1) and
+        (taicpu(hp1).opcode=A_B) and
+        (taicpu(hp1).condition in [C_EQ,C_NE]) then
+        begin
+          if taicpu(hp1).condition = C_EQ then
+            hp2:=taicpu.op_reg_ref(A_CBZ, taicpu(p).oper[0]^.reg, taicpu(hp1).oper[0]^.ref^)
+          else
+            hp2:=taicpu.op_reg_ref(A_CBNZ, taicpu(p).oper[0]^.reg, taicpu(hp1).oper[0]^.ref^);
+
+          taicpu(hp2).is_jmp := true;
+
+          asml.InsertAfter(hp2, hp1);
+
+          asml.Remove(hp1);
+          hp1.Free;
+          asml.Remove(p);
+          p.Free;
+
+          p := hp2;
+
+          result := true;
+        end}
+      else
+        Result := inherited PeepHoleOptPass1Cpu(p);
+    end;
+
   procedure TCpuThumb2AsmOptimizer.PeepHoleOptPass2;
   procedure TCpuThumb2AsmOptimizer.PeepHoleOptPass2;
+    var
+      p,hp1,hp2: tai;
+      l,l2 : longint;
+      condition : tasmcond;
+      hp3: tai;
+      WasLast: boolean;
+      { UsedRegs, TmpUsedRegs: TRegSet; }
+
     begin
     begin
-      { TODO: Add optimizer code }
+      p := BlockStart;
+      { UsedRegs := []; }
+      while (p <> BlockEnd) Do
+        begin
+          { UpdateUsedRegs(UsedRegs, tai(p.next)); }
+          case p.Typ Of
+            Ait_Instruction:
+              begin
+                case taicpu(p).opcode Of
+                  A_B:
+                    if taicpu(p).condition<>C_None then
+                      begin
+                         { check for
+                                Bxx   xxx
+                                <several instructions>
+                             xxx:
+                         }
+                         l:=0;
+                         GetNextInstruction(p, hp1);
+                         while assigned(hp1) and
+                           (l<=4) and
+                           CanBeCond(hp1) and
+                           { stop on labels }
+                           not(hp1.typ=ait_label) do
+                           begin
+                              inc(l);
+                              if MustBeLast(hp1) then
+                                begin
+                                  //hp1:=nil;
+                                  GetNextInstruction(hp1,hp1);
+                                  break;
+                                end
+                              else
+                                GetNextInstruction(hp1,hp1);
+                           end;
+                         if assigned(hp1) then
+                           begin
+                              if FindLabel(tasmlabel(taicpu(p).oper[0]^.ref^.symbol),hp1) then
+                                begin
+                                  if (l<=4) and (l>0) then
+                                    begin
+                                      condition:=inverse_cond(taicpu(p).condition);
+                                      hp2:=p;
+                                      GetNextInstruction(p,hp1);
+                                      p:=hp1;
+                                      repeat
+                                        if hp1.typ=ait_instruction then
+                                          taicpu(hp1).condition:=condition;
+                                        if MustBeLast(hp1) then
+                                          begin
+                                            GetNextInstruction(hp1,hp1);
+                                            break;
+                                          end
+                                        else
+                                          GetNextInstruction(hp1,hp1);
+                                      until not(assigned(hp1)) or
+                                        not(CanBeCond(hp1)) or
+                                        (hp1.typ=ait_label);
+                                      { wait with removing else GetNextInstruction could
+                                        ignore the label if it was the only usage in the
+                                        jump moved away }
+
+                                      asml.InsertAfter(tai_comment.create(strpnew('Collapsed')), hp2);
+
+                                      DecrementPreceedingIT(asml, hp2);
+
+                                      case l of
+                                        1: asml.InsertAfter(taicpu.op_cond(A_IT,condition), hp2);
+                                        2: asml.InsertAfter(taicpu.op_cond(A_ITT,condition), hp2);
+                                        3: asml.InsertAfter(taicpu.op_cond(A_ITTT,condition), hp2);
+                                        4: asml.InsertAfter(taicpu.op_cond(A_ITTTT,condition), hp2);
+                                      end;
+
+                                      tasmlabel(taicpu(hp2).oper[0]^.ref^.symbol).decrefs;
+                                      asml.remove(hp2);
+                                      hp2.free;
+                                      continue;
+                                    end;
+                                end;
+                           end;
+                      end;
+                end;
+              end;
+          end;
+          p := tai(p.next)
+        end;
     end;
     end;
 
 
 begin
 begin

+ 37 - 5
compiler/arm/armatt.inc

@@ -50,6 +50,7 @@
 'mcr',
 'mcr',
 'mla',
 'mla',
 'mov',
 'mov',
+'mrc',
 'mrs',
 'mrs',
 'msr',
 'msr',
 'mnf',
 'mnf',
@@ -206,6 +207,10 @@
 'sel',
 'sel',
 'setend',
 'setend',
 'sev',
 'sev',
+'asr',
+'lsr',
+'lsl',
+'ror',
 'shadd16',
 'shadd16',
 'shadd8',
 'shadd8',
 'shasx',
 'shasx',
@@ -270,12 +275,8 @@
 'wfe',
 'wfe',
 'wfi',
 'wfi',
 'yield',
 'yield',
-'asr',
-'lsr',
-'lsl',
 'pop',
 'pop',
 'push',
 'push',
-'ror',
 'sdiv',
 'sdiv',
 'udiv',
 'udiv',
 'movt',
 'movt',
@@ -295,5 +296,36 @@
 'itett',
 'itett',
 'itttt',
 'itttt',
 'tbb',
 'tbb',
-'tbh'
+'tbh',
+'movw',
+'cbz',
+'cbnz',
+'vabs',
+'vadd',
+'vcmp',
+'vcmpe',
+'vcvt',
+'vdiv',
+'vldm',
+'vldr',
+'vmov',
+'vmrs',
+'vmsr',
+'vmul',
+'vmla',
+'vmls',
+'vnmla',
+'vnmls',
+'vfma',
+'vfms',
+'vfnma',
+'vfnms',
+'vneg',
+'vnmul',
+'vpop',
+'vpush',
+'vsqrt',
+'vstm',
+'vstr',
+'vsub'
 );
 );

+ 32 - 0
compiler/arm/armatts.inc

@@ -295,5 +295,37 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 attsufNONE
 );
 );

+ 45 - 10
compiler/arm/armins.dat

@@ -235,7 +235,7 @@ reg32,imm8,fpureg        \xF0\x02\x01                   FPA
 [LOGcc]
 [LOGcc]
 
 
 [MCR]
 [MCR]
-reg32,mem32         \320\301\1\x13\110            ARM7
+; reg32,mem32         \320\301\1\x13\110            ARM7
 
 
 [MLAcc]
 [MLAcc]
 reg32,reg32,reg32,reg32  \x15\x00\x20\x90               ARM7
 reg32,reg32,reg32,reg32  \x15\x00\x20\x90               ARM7
@@ -247,7 +247,7 @@ reg32,reg32,reg32,reg32  \x15\x00\x20\x90               ARM7
 ; reg32,reg32,imm          \xA\x1\xA0                     ARM7
 ; reg32,reg32,imm          \xA\x1\xA0                     ARM7
 ; reg32,imm                \xB\x3\xA0                     ARM7
 ; reg32,imm                \xB\x3\xA0                     ARM7
 
 
-; [MRC]
+[MRC]
 ; reg32,reg32         \321\301\1\x13\110                  ARM7
 ; reg32,reg32         \321\301\1\x13\110                  ARM7
 
 
 [MRScc]
 [MRScc]
@@ -618,6 +618,14 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 
 
 [SEVcc]
 [SEVcc]
 
 
+[ASRcc]
+
+[LSRcc]
+
+[LSLcc]
+
+[RORcc]
+
 [SHADD16cc]
 [SHADD16cc]
 [SHADD8cc]
 [SHADD8cc]
 [SHASXcc]
 [SHASXcc]
@@ -702,18 +710,10 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 
 
 ; Thumb-2
 ; Thumb-2
 
 
-[ASRcc]
-
-[LSRcc]
-
-[LSLcc]
-
 [POP]
 [POP]
 
 
 [PUSH]
 [PUSH]
 
 
-[RORcc]
-
 [SDIVcc]
 [SDIVcc]
 
 
 [UDIVcc]
 [UDIVcc]
@@ -752,3 +752,38 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 
 
 [TBB]
 [TBB]
 [TBH]
 [TBH]
+
+[MOVW]
+
+[CBZ]
+[CBNZ]
+
+; FPv4-s16 - ARMv7M floating point
+[VABS]
+[VADD]
+[VCMP]
+[VCMPE]
+[VCVT]
+[VDIV]
+[VLDM]
+[VLDR]
+[VMOV]
+[VMRS]
+[VMSR]
+[VMUL]
+[VMLA]
+[VMLS]
+[VNMLA]
+[VNMLS]
+[VFMA]
+[VFMS]
+[VFNMA]
+[VFNMS]
+[VNEG]
+[VNMUL]
+[VPOP]
+[VPUSH]
+[VSQRT]
+[VSTM]
+[VSTR]
+[VSUB]

+ 1 - 1
compiler/arm/armnop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from armins.dat }
 { don't edit, this file is generated from armins.dat }
-106;
+105;

+ 37 - 5
compiler/arm/armop.inc

@@ -50,6 +50,7 @@ A_LOG,
 A_MCR,
 A_MCR,
 A_MLA,
 A_MLA,
 A_MOV,
 A_MOV,
+A_MRC,
 A_MRS,
 A_MRS,
 A_MSR,
 A_MSR,
 A_MNF,
 A_MNF,
@@ -206,6 +207,10 @@ A_SBFX,
 A_SEL,
 A_SEL,
 A_SETEND,
 A_SETEND,
 A_SEV,
 A_SEV,
+A_ASR,
+A_LSR,
+A_LSL,
+A_ROR,
 A_SHADD16,
 A_SHADD16,
 A_SHADD8,
 A_SHADD8,
 A_SHASX,
 A_SHASX,
@@ -270,12 +275,8 @@ A_UXTH,
 A_WFE,
 A_WFE,
 A_WFI,
 A_WFI,
 A_YIELD,
 A_YIELD,
-A_ASR,
-A_LSR,
-A_LSL,
 A_POP,
 A_POP,
 A_PUSH,
 A_PUSH,
-A_ROR,
 A_SDIV,
 A_SDIV,
 A_UDIV,
 A_UDIV,
 A_MOVT,
 A_MOVT,
@@ -295,5 +296,36 @@ A_ITTET,
 A_ITETT,
 A_ITETT,
 A_ITTTT,
 A_ITTTT,
 A_TBB,
 A_TBB,
-A_TBH
+A_TBH,
+A_MOVW,
+A_CBZ,
+A_CBNZ,
+A_VABS,
+A_VADD,
+A_VCMP,
+A_VCMPE,
+A_VCVT,
+A_VDIV,
+A_VLDM,
+A_VLDR,
+A_VMOV,
+A_VMRS,
+A_VMSR,
+A_VMUL,
+A_VMLA,
+A_VMLS,
+A_VNMLA,
+A_VNMLS,
+A_VFMA,
+A_VFMS,
+A_VFNMA,
+A_VFNMS,
+A_VNEG,
+A_VNMUL,
+A_VPOP,
+A_VPUSH,
+A_VSQRT,
+A_VSTM,
+A_VSTR,
+A_VSUB
 );
 );

+ 21 - 1
compiler/arm/armreg.dat

@@ -109,4 +109,24 @@ D31,$04,$07,$1F,d31,0,0
 ; special registers
 ; special registers
 CPSR,$05,$00,$00,cpsr,0,0
 CPSR,$05,$00,$00,cpsr,0,0
 FPSCR,$05,$00,$01,fpscr,0,0
 FPSCR,$05,$00,$01,fpscr,0,0
-SPSR,$05,$00,$02,spsr,0,0
+SPSR,$05,$00,$02,spsr,0,0
+APSR_nzcv,$05,$00,$03,apsr_nzcv,0,0
+; coprocessor registers
+CR0,$05,$00,$04,cr0,0,0
+CR1,$05,$00,$05,cr1,0,0
+CR2,$05,$00,$06,cr2,0,0
+CR3,$05,$00,$07,cr3,0,0
+CR4,$05,$00,$08,cr4,0,0
+CR5,$05,$00,$09,cr5,0,0
+CR6,$05,$00,$0A,cr6,0,0
+CR7,$05,$00,$0B,cr7,0,0
+CR8,$05,$00,$0C,cr8,0,0
+CR9,$05,$00,$0D,cr9,0,0
+CR10,$05,$00,$0E,cr10,0,0
+CR11,$05,$00,$0F,cr11,0,0
+CR12,$05,$00,$10,cr12,0,0
+CR13,$05,$00,$11,cr13,0,0
+CR14,$05,$00,$12,cr14,0,0
+CR15,$05,$00,$13,cr15,0,0
+; coprocessors
+p15,$05,$00,$14,p15,0,0

+ 0 - 7
compiler/arm/armtab.inc

@@ -385,13 +385,6 @@
     code    : #240#2#1;
     code    : #240#2#1;
     flags   : if_fpa
     flags   : if_fpa
   ),
   ),
-  (
-    opcode  : A_MCR;
-    ops     : 2;
-    optypes : (ot_reg32,ot_memory or ot_bits32,ot_none,ot_none);
-    code    : #208#193#1#19#72;
-    flags   : if_arm7
-  ),
   (
   (
     opcode  : A_MLA;
     opcode  : A_MLA;
     ops     : 4;
     ops     : 4;

+ 137 - 3
compiler/arm/cgcpu.pas

@@ -161,6 +161,12 @@ unit cgcpu;
         procedure g_proc_exit(list : TAsmList;parasize : longint;nostackframe:boolean); override;
         procedure g_proc_exit(list : TAsmList;parasize : longint;nostackframe:boolean); override;
 
 
         function handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference; override;
         function handle_load_store(list:TAsmList;op: tasmop;oppostfix : toppostfix;reg:tregister;ref: treference):treference; override;
+
+        procedure a_loadmm_reg_reg(list: TAsmList; fromsize, tosize : tcgsize;reg1, reg2: tregister;shuffle : pmmshuffle); override;
+        procedure a_loadmm_ref_reg(list: TAsmList; fromsize, tosize : tcgsize;const ref: treference; reg: tregister;shuffle : pmmshuffle); override;
+        procedure a_loadmm_reg_ref(list: TAsmList; fromsize, tosize : tcgsize;reg: tregister; const ref: treference;shuffle : pmmshuffle); override;
+        procedure a_loadmm_intreg_reg(list: TAsmList; fromsize, tosize : tcgsize;intreg, mmreg: tregister; shuffle: pmmshuffle); override;
+        procedure a_loadmm_reg_intreg(list: TAsmList; fromsize, tosize : tcgsize;mmreg, intreg: tregister; shuffle : pmmshuffle); override;
       end;
       end;
 
 
       tthumb2cg64farm = class(tcg64farm)
       tthumb2cg64farm = class(tcg64farm)
@@ -3120,10 +3126,17 @@ unit cgcpu;
           rg[R_INTREGISTER]:=trgintcputhumb2.create(R_INTREGISTER,R_SUBWHOLE,
           rg[R_INTREGISTER]:=trgintcputhumb2.create(R_INTREGISTER,R_SUBWHOLE,
               [RS_R0,RS_R1,RS_R2,RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
               [RS_R0,RS_R1,RS_R2,RS_R3,RS_R4,RS_R5,RS_R6,RS_R7,RS_R8,
                RS_R10,RS_R12,RS_R14],first_int_imreg,[]);
                RS_R10,RS_R12,RS_R14],first_int_imreg,[]);
-        rg[R_FPUREGISTER]:=trgcputhumb2.create(R_FPUREGISTER,R_SUBNONE,
+        rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
             [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
             [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7],first_fpu_imreg,[]);
-        rg[R_MMREGISTER]:=trgcputhumb2.create(R_MMREGISTER,R_SUBNONE,
-            [RS_S0,RS_S1,RS_R2,RS_R3,RS_R4,RS_S31],first_mm_imreg,[]);
+
+        if current_settings.fputype=fpu_fpv4_s16 then
+          rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBFD,
+              [RS_D0,RS_D1,RS_D2,RS_D3,RS_D4,RS_D5,RS_D6,RS_D7,
+               RS_D8,RS_D9,RS_D10,RS_D11,RS_D12,RS_D13,RS_D14,RS_D15
+              ],first_mm_imreg,[])
+        else
+          rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBNONE,
+              [RS_S0,RS_S1,RS_R2,RS_R3,RS_R4,RS_S31],first_mm_imreg,[]);
       end;
       end;
 
 
 
 
@@ -3959,6 +3972,127 @@ unit cgcpu;
         Result := ref;
         Result := ref;
       end;
       end;
 
 
+     procedure Tthumb2cgarm.a_loadmm_reg_reg(list: TAsmList; fromsize, tosize: tcgsize; reg1, reg2: tregister; shuffle: pmmshuffle);
+      var
+        instr: taicpu;
+      begin
+        if (fromsize=OS_F32) and
+          (tosize=OS_F32) then
+          begin
+            instr:=setoppostfix(taicpu.op_reg_reg(A_VMOV,reg2,reg1), PF_F32);
+            list.Concat(instr);
+            add_move_instruction(instr);
+          end
+        else if (fromsize=OS_F64) and
+          (tosize=OS_F64) then
+          begin
+            //list.Concat(setoppostfix(taicpu.op_reg_reg(A_VMOV,tregister(longint(reg2)+1),tregister(longint(reg1)+1)), PF_F32));
+            //list.Concat(setoppostfix(taicpu.op_reg_reg(A_VMOV,reg2,reg1), PF_F32));
+          end
+        else if (fromsize=OS_F32) and
+          (tosize=OS_F64) then
+          //list.Concat(setoppostfix(taicpu.op_reg_reg(A_VCVT,reg2,reg1), PF_F32))
+          begin
+            //list.concat(nil);
+          end;
+      end;
+
+     procedure Tthumb2cgarm.a_loadmm_ref_reg(list: TAsmList; fromsize, tosize: tcgsize; const ref: treference; reg: tregister; shuffle: pmmshuffle);
+      var
+        href: treference;
+        tmpreg: TRegister;
+        so: tshifterop;
+      begin
+        href:=ref;
+
+        if (href.base<>NR_NO) and
+          (href.index<>NR_NO) then
+          begin
+            tmpreg:=getintregister(list,OS_INT);
+            if href.shiftmode<>SM_None then
+              begin
+                so.rs:=href.index;
+                so.shiftimm:=href.shiftimm;
+                so.shiftmode:=href.shiftmode;
+                list.concat(taicpu.op_reg_reg_shifterop(A_ADD,tmpreg,href.base,so));
+              end
+            else
+              a_op_reg_reg_reg(list,OP_ADD,OS_INT,href.index,href.base,tmpreg);
+
+            reference_reset_base(href,tmpreg,href.offset,0);
+          end;
+
+        if assigned(href.symbol) then
+          begin
+            tmpreg:=getintregister(list,OS_INT);
+            a_loadaddr_ref_reg(list,href,tmpreg);
+
+            reference_reset_base(href,tmpreg,0,0);
+          end;
+
+        if fromsize=OS_F32 then
+          list.Concat(setoppostfix(taicpu.op_reg_ref(A_VLDR,reg,href), PF_F32))
+        else
+          list.Concat(setoppostfix(taicpu.op_reg_ref(A_VLDR,reg,href), PF_F64));
+      end;
+
+     procedure Tthumb2cgarm.a_loadmm_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference; shuffle: pmmshuffle);
+      var
+        href: treference;
+        so: tshifterop;
+        tmpreg: TRegister;
+      begin
+        href:=ref;
+
+        if (href.base<>NR_NO) and
+          (href.index<>NR_NO) then
+          begin
+            tmpreg:=getintregister(list,OS_INT);
+            if href.shiftmode<>SM_None then
+              begin
+                so.rs:=href.index;
+                so.shiftimm:=href.shiftimm;
+                so.shiftmode:=href.shiftmode;
+                list.concat(taicpu.op_reg_reg_shifterop(A_ADD,tmpreg,href.base,so));
+              end
+            else
+              a_op_reg_reg_reg(list,OP_ADD,OS_INT,href.index,href.base,tmpreg);
+
+            reference_reset_base(href,tmpreg,href.offset,0);
+          end;
+
+        if assigned(href.symbol) then
+          begin
+            tmpreg:=getintregister(list,OS_INT);
+            a_loadaddr_ref_reg(list,href,tmpreg);
+
+            reference_reset_base(href,tmpreg,0,0);
+          end;
+
+        if fromsize=OS_F32 then
+          list.Concat(setoppostfix(taicpu.op_reg_ref(A_VSTR,reg,href), PF_32))
+        else
+          list.Concat(setoppostfix(taicpu.op_reg_ref(A_VSTR,reg,href), PF_64));
+      end;
+
+     procedure Tthumb2cgarm.a_loadmm_intreg_reg(list: TAsmList; fromsize, tosize: tcgsize; intreg, mmreg: tregister; shuffle: pmmshuffle);
+      begin
+        if //(shuffle=nil) and
+          (tosize=OS_F32) then
+          list.Concat(taicpu.op_reg_reg(A_VMOV,mmreg,intreg))
+        else
+          internalerror(2012100813);
+      end;
+
+     procedure Tthumb2cgarm.a_loadmm_reg_intreg(list: TAsmList; fromsize, tosize: tcgsize; mmreg, intreg: tregister; shuffle: pmmshuffle);
+      begin
+        if //(shuffle=nil) and
+          (fromsize=OS_F32) then
+          list.Concat(taicpu.op_reg_reg(A_VMOV,intreg,mmreg))
+        else
+          internalerror(2012100814);
+      end;
+
 
 
     procedure tthumb2cg64farm.a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);
     procedure tthumb2cg64farm.a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);
       var tmpreg: tregister;
       var tmpreg: tregister;

+ 47 - 6
compiler/arm/cpubase.pas

@@ -48,7 +48,7 @@ unit cpubase;
       TAsmOp= {$i armop.inc}
       TAsmOp= {$i armop.inc}
       {This is a bit of a hack, because there are more than 256 ARM Assembly Ops
       {This is a bit of a hack, because there are more than 256 ARM Assembly Ops
        But FPC currently can't handle more than 256 elements in a set.}
        But FPC currently can't handle more than 256 elements in a set.}
-      TCommonAsmOps = Set of A_None .. A_UQSADA8;
+      TCommonAsmOps = Set of A_None .. A_UQASX;
 
 
       { This should define the array of instructions as string }
       { This should define the array of instructions as string }
       op2strtable=array[tasmop] of string[11];
       op2strtable=array[tasmop] of string[11];
@@ -139,7 +139,11 @@ unit cpubase;
         { multiple load/store vfp address modes }
         { multiple load/store vfp address modes }
         PF_IAD,PF_DBD,PF_FDD,PF_EAD,
         PF_IAD,PF_DBD,PF_FDD,PF_EAD,
         PF_IAS,PF_DBS,PF_FDS,PF_EAS,
         PF_IAS,PF_DBS,PF_FDS,PF_EAS,
-        PF_IAX,PF_DBX,PF_FDX,PF_EAX
+        PF_IAX,PF_DBX,PF_FDX,PF_EAX,
+        { FPv4 postfixes }
+        PF_32,PF_64,PF_F32,PF_F64,
+        PF_F32S32,PF_F32U32,
+        PF_S32F32,PF_U32F32
       );
       );
 
 
       TOpPostfixes = set of TOpPostfix;
       TOpPostfixes = set of TOpPostfix;
@@ -152,14 +156,17 @@ unit cpubase;
         PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,
         PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,PF_None,
         PF_S,PF_D,PF_E,PF_None,PF_None);
         PF_S,PF_D,PF_E,PF_None,PF_None);
 
 
-      oppostfix2str : array[TOpPostfix] of string[3] = ('',
+      oppostfix2str : array[TOpPostfix] of string[8] = ('',
         's',
         's',
         'd','e','p','ep',
         'd','e','p','ep',
         'b','sb','bt','h','sh','t',
         'b','sb','bt','h','sh','t',
         'ia','ib','da','db','fd','fa','ed','ea',
         'ia','ib','da','db','fd','fa','ed','ea',
         'iad','dbd','fdd','ead',
         'iad','dbd','fdd','ead',
         'ias','dbs','fds','eas',
         'ias','dbs','fds','eas',
-        'iax','dbx','fdx','eax');
+        'iax','dbx','fdx','eax',
+        '.32','.64','.f32','.f64',
+        '.f32.s32','.f32.u32',
+        '.s32.f32','.u32.f32');
 
 
       roundingmode2str : array[TRoundingMode] of string[1] = ('',
       roundingmode2str : array[TRoundingMode] of string[1] = ('',
         'p','m','z');
         'p','m','z');
@@ -223,7 +230,7 @@ unit cpubase;
 *****************************************************************************}
 *****************************************************************************}
 
 
     const
     const
-      max_operands = 4;
+      max_operands = 6;
 
 
       maxintregs = 15;
       maxintregs = 15;
       maxfpuregs = 8;
       maxfpuregs = 8;
@@ -361,6 +368,9 @@ unit cpubase;
     function split_into_shifter_const(value : aint;var imm1: dword; var imm2: dword):boolean;
     function split_into_shifter_const(value : aint;var imm1: dword; var imm2: dword):boolean;
     function dwarf_reg(r:tregister):shortint;
     function dwarf_reg(r:tregister):shortint;
 
 
+    function IsIT(op: TAsmOp) : boolean;
+    function GetITLevels(op: TAsmOp) : longint;
+
   implementation
   implementation
 
 
     uses
     uses
@@ -368,7 +378,7 @@ unit cpubase;
 
 
 
 
     const
     const
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i rarmstd.inc}
         {$i rarmstd.inc}
       );
       );
 
 
@@ -606,4 +616,35 @@ unit cpubase;
         result:=RS_R0;
         result:=RS_R0;
     end;
     end;
 
 
+    function IsIT(op: TAsmOp) : boolean;
+      begin
+        case op of
+          A_IT,
+          A_ITE, A_ITT,
+          A_ITEE, A_ITTE, A_ITET, A_ITTT,
+          A_ITEEE, A_ITTEE, A_ITETE, A_ITTTE,
+          A_ITEET, A_ITTET, A_ITETT, A_ITTTT:
+            result:=true;
+        else
+          result:=false;
+        end;
+      end;
+
+    function GetITLevels(op: TAsmOp) : longint;
+      begin
+        case op of
+          A_IT:
+            result:=1;
+          A_ITE, A_ITT:
+            result:=2;
+          A_ITEE, A_ITTE, A_ITET, A_ITTT:
+            result:=3;
+          A_ITEEE, A_ITTEE, A_ITETE, A_ITTTE,
+          A_ITEET, A_ITTET, A_ITETT, A_ITTTT:
+            result:=4;
+        else
+          result:=0;
+        end;
+      end;
+
 end.
 end.

+ 149 - 196
compiler/arm/cpuinfo.pas

@@ -65,7 +65,8 @@ Type
       fpu_fpa11,
       fpu_fpa11,
       fpu_vfpv2,
       fpu_vfpv2,
       fpu_vfpv3,
       fpu_vfpv3,
-      fpu_vfpv3_d16
+      fpu_vfpv3_d16,
+      fpu_fpv4_s16
      );
      );
 
 
    tcontrollertype =
    tcontrollertype =
@@ -89,9 +90,38 @@ Type
       ct_at91sam7xc256,
       ct_at91sam7xc256,
 		
 		
       { STMicroelectronics }
       { STMicroelectronics }
-      ct_stm32f103rb,
-      ct_stm32f103re,
-      ct_stm32f103c4t,
+      ct_stm32f100x4, // LD&MD value line, 4=16,6=32,8=64,b=128
+      ct_stm32f100x6,
+      ct_stm32f100x8,
+      ct_stm32f100xB,
+      ct_stm32f100xC, // HD value line, r=512,d=384,c=256
+      ct_stm32f100xD,
+      ct_stm32f100xE,
+      ct_stm32f101x4, // LD Access line, 4=16,6=32
+      ct_stm32f101x6,
+      ct_stm32f101x8, // MD Access line, 8=64,B=128
+      ct_stm32f101xB,
+      ct_stm32f101xC, // HD Access line, C=256,D=384,E=512
+      ct_stm32f101xD,
+      ct_stm32f101xE,
+      ct_stm32f101xF, // XL Access line, F=768,G=1M
+      ct_stm32f101xG,
+      ct_stm32f102x4, // LD usb access line, 4=16,6=32
+      ct_stm32f102x6,
+      ct_stm32f102x8, // MD usb access line, 8=64,B=128
+      ct_stm32f102xB,
+      ct_stm32f103x4, // LD performance line, 4=16,6=32
+      ct_stm32f103x6,
+      ct_stm32f103x8, // MD performance line, 8=64,B=128
+      ct_stm32f103xB,
+      ct_stm32f103xC, // HD performance line, C=256,D=384,E=512
+      ct_stm32f103xD,
+      ct_stm32f103xE,
+      ct_stm32f103xF, // XL performance line, F=768,G=1M
+      ct_stm32f103xG,
+      ct_stm32f107x8, // MD and HD connectivity line, 8=64,B=128,C=256
+      ct_stm32f107xB,
+      ct_stm32f107xC,
 
 
       { TI - Fury Class - 64 K Flash, 16 K SRAM Devices }
       { TI - Fury Class - 64 K Flash, 16 K SRAM Devices }
       ct_lm3s1110,
       ct_lm3s1110,
@@ -227,7 +257,8 @@ Const
      'FPA11',
      'FPA11',
      'VFPV2',
      'VFPV2',
      'VFPV3',
      'VFPV3',
-     'VFPV3_D16'
+     'VFPV3_D16',
+     'FPV4_S16'
    );
    );
 
 
 
 
@@ -239,7 +270,6 @@ Const
    ((
    ((
    	controllertypestr:'';
    	controllertypestr:'';
         controllerunitstr:'';
         controllerunitstr:'';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:0;
         flashsize:0;
         srambase:0;
         srambase:0;
@@ -249,8 +279,7 @@ Const
         (
         (
     	controllertypestr:'LPC2114';
     	controllertypestr:'LPC2114';
         controllerunitstr:'LPC21x4';
         controllerunitstr:'LPC21x4';
-        interruptvectors:8;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$40000000;
         srambase:$40000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -259,8 +288,7 @@ Const
         (
         (
     	controllertypestr:'LPC2124';
     	controllertypestr:'LPC2124';
         controllerunitstr:'LPC21x4';
         controllerunitstr:'LPC21x4';
-        interruptvectors:8;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$40000000;
         srambase:$40000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -269,8 +297,7 @@ Const
         (
         (
     	controllertypestr:'LPC2194';
     	controllertypestr:'LPC2194';
         controllerunitstr:'LPC21x4';
         controllerunitstr:'LPC21x4';
-        interruptvectors:8;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$40000000;
         srambase:$40000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -279,8 +306,7 @@ Const
         (
         (
     	controllertypestr:'LPC1754';
     	controllertypestr:'LPC1754';
         controllerunitstr:'LPC1754';
         controllerunitstr:'LPC1754';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -289,8 +315,7 @@ Const
         (
         (
     	controllertypestr:'LPC1756';
     	controllertypestr:'LPC1756';
         controllerunitstr:'LPC1756';
         controllerunitstr:'LPC1756';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -299,8 +324,7 @@ Const
         (
         (
     	controllertypestr:'LPC1758';
     	controllertypestr:'LPC1758';
         controllerunitstr:'LPC1758';
         controllerunitstr:'LPC1758';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00080000;
         flashsize:$00080000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -309,8 +333,7 @@ Const
         (
         (
     	controllertypestr:'LPC1764';
     	controllertypestr:'LPC1764';
         controllerunitstr:'LPC1764';
         controllerunitstr:'LPC1764';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -319,8 +342,7 @@ Const
         (
         (
     	controllertypestr:'LPC1766';
     	controllertypestr:'LPC1766';
         controllerunitstr:'LPC1766';
         controllerunitstr:'LPC1766';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -329,8 +351,7 @@ Const
         (
         (
     	controllertypestr:'LPC1768';
     	controllertypestr:'LPC1768';
         controllerunitstr:'LPC1768';
         controllerunitstr:'LPC1768';
-        interruptvectors:12;
-    	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00080000;
         flashsize:$00080000;
         srambase:$10000000;
         srambase:$10000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -339,7 +360,6 @@ Const
         (
         (
     	controllertypestr:'AT91SAM7S256';
     	controllertypestr:'AT91SAM7S256';
         controllerunitstr:'AT91SAM7x256';
         controllerunitstr:'AT91SAM7x256';
-        interruptvectors:8;
         flashbase:$00000000;
         flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$00200000;
         srambase:$00200000;
@@ -349,7 +369,6 @@ Const
         (
         (
     	controllertypestr:'AT91SAM7SE256';
     	controllertypestr:'AT91SAM7SE256';
         controllerunitstr:'AT91SAM7x256';
         controllerunitstr:'AT91SAM7x256';
-        interruptvectors:8;
         flashbase:$00000000;
         flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$00200000;
         srambase:$00200000;
@@ -359,7 +378,6 @@ Const
         (
         (
     	controllertypestr:'AT91SAM7X256';
     	controllertypestr:'AT91SAM7X256';
         controllerunitstr:'AT91SAM7x256';
         controllerunitstr:'AT91SAM7x256';
-        interruptvectors:8;
         flashbase:$00000000;
         flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$00200000;
         srambase:$00200000;
@@ -369,51 +387,52 @@ Const
         (
         (
     	controllertypestr:'AT91SAM7XC256';
     	controllertypestr:'AT91SAM7XC256';
         controllerunitstr:'AT91SAM7x256';
         controllerunitstr:'AT91SAM7x256';
-        interruptvectors:8;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$00200000;
         srambase:$00200000;
         sramsize:$00010000
         sramsize:$00010000
         ),
         ),
 
 
-      	// ct_stm32f103rb,
-        (
-    	controllertypestr:'STM32F103RB';
-        controllerunitstr:'STM32F103';
-        interruptvectors:12;
-        flashbase:$08000000;
-        flashsize:$00020000;
-        srambase:$20000000;
-        sramsize:$00005000
-        ),
-        // ct_stm32f103re,
-        (
-    	controllertypestr:'STM32F103RE';
-        controllerunitstr:'STM32F103';
-        interruptvectors:12;
-        flashbase:$08000000;
-        flashsize:$00080000;
-        srambase:$20000000;
-        sramsize:$00010000
-        ),
-        // ct_stm32f103re,
-        (
-    	controllertypestr:'STM32F103C4T';
-        controllerunitstr:'STM32F103';
-        interruptvectors:12;
-        flashbase:$08000000;
-        flashsize:$00004000;
-        srambase:$20000000;
-        sramsize:$00001800
-        ),
+      { STM32F1 series }
+      	(controllertypestr:'STM32F100X4';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001000),
+        (controllertypestr:'STM32F100X6';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00001000),
+        (controllertypestr:'STM32F100X8';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00002000),
+        (controllertypestr:'STM32F100XB';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00002000),
+        (controllertypestr:'STM32F100XC';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00040000; srambase:$20000000; sramsize:$00006000),
+        (controllertypestr:'STM32F100XD';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00060000; srambase:$20000000; sramsize:$00008000),
+        (controllertypestr:'STM32F100XE';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00080000; srambase:$20000000; sramsize:$00008000),
+        (controllertypestr:'STM32F101X4';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001000),
+        (controllertypestr:'STM32F101X6';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00001800),
+        (controllertypestr:'STM32F101X8';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00002800),
+        (controllertypestr:'STM32F101XB';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00004000),
+        (controllertypestr:'STM32F101XC';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00040000; srambase:$20000000; sramsize:$00008000),
+        (controllertypestr:'STM32F101XD';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00060000; srambase:$20000000; sramsize:$0000C000),
+        (controllertypestr:'STM32F101XE';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00080000; srambase:$20000000; sramsize:$0000C000),
+        (controllertypestr:'STM32F101XF';     controllerunitstr:'STM32F10X_XL';     flashbase:$08000000; flashsize:$000C0000; srambase:$20000000; sramsize:$00014000),
+        (controllertypestr:'STM32F101XG';     controllerunitstr:'STM32F10X_XL';     flashbase:$08000000; flashsize:$00100000; srambase:$20000000; sramsize:$00014000),
+        (controllertypestr:'STM32F102X4';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001000),
+        (controllertypestr:'STM32F102X6';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00001800),
+        (controllertypestr:'STM32F102X8';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00002800),
+        (controllertypestr:'STM32F102XB';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00004000),
+        (controllertypestr:'STM32F103X4';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00004000; srambase:$20000000; sramsize:$00001000),
+        (controllertypestr:'STM32F103X6';     controllerunitstr:'STM32F10X_LD';     flashbase:$08000000; flashsize:$00008000; srambase:$20000000; sramsize:$00002800),
+        (controllertypestr:'STM32F103X8';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00005000),
+        (controllertypestr:'STM32F103XB';     controllerunitstr:'STM32F10X_MD';     flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00005000),
+        (controllertypestr:'STM32F103XC';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00040000; srambase:$20000000; sramsize:$0000C000),
+        (controllertypestr:'STM32F103XD';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00060000; srambase:$20000000; sramsize:$00010000),
+        (controllertypestr:'STM32F103XE';     controllerunitstr:'STM32F10X_HD';     flashbase:$08000000; flashsize:$00080000; srambase:$20000000; sramsize:$00010000),
+        (controllertypestr:'STM32F103XF';     controllerunitstr:'STM32F10X_XL';     flashbase:$08000000; flashsize:$000C0000; srambase:$20000000; sramsize:$00018000),
+        (controllertypestr:'STM32F103XG';     controllerunitstr:'STM32F10X_XL';     flashbase:$08000000; flashsize:$00100000; srambase:$20000000; sramsize:$00018000),
+        (controllertypestr:'STM32F107X8';     controllerunitstr:'STM32F10X_CONN';   flashbase:$08000000; flashsize:$00010000; srambase:$20000000; sramsize:$00010000),
+        (controllertypestr:'STM32F107XB';     controllerunitstr:'STM32F10X_CONN';   flashbase:$08000000; flashsize:$00020000; srambase:$20000000; sramsize:$00010000),
+        (controllertypestr:'STM32F107XC';     controllerunitstr:'STM32F10X_CONN';   flashbase:$08000000; flashsize:$00040000; srambase:$20000000; sramsize:$00010000),
 
 
       { TI - 64 K Flash, 16 K SRAM Devices }
       { TI - 64 K Flash, 16 K SRAM Devices }
       	// ct_lm3s1110,
       	// ct_lm3s1110,
         (
         (
     	controllertypestr:'LM3S1110';
     	controllertypestr:'LM3S1110';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -422,8 +441,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1133';
     	controllertypestr:'LM3S1133';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -432,8 +450,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1138';
     	controllertypestr:'LM3S1138';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -442,8 +459,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1150';
     	controllertypestr:'LM3S1150';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -452,8 +468,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1162';
     	controllertypestr:'LM3S1162';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -462,8 +477,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1165';
     	controllertypestr:'LM3S1165';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -472,8 +486,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1166';
     	controllertypestr:'LM3S1166';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -482,8 +495,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2110';
     	controllertypestr:'LM3S2110';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -492,8 +504,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2139';
     	controllertypestr:'LM3S2139';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -502,8 +513,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6100';
     	controllertypestr:'LM3S6100';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -512,8 +522,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6110';
     	controllertypestr:'LM3S6110';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00010000;
         flashsize:$00010000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00004000
         sramsize:$00004000
@@ -524,8 +533,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1601';
     	controllertypestr:'LM3S1601';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -534,8 +542,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1608';
     	controllertypestr:'LM3S1608';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -544,8 +551,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1620';
     	controllertypestr:'LM3S1620';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -554,8 +560,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1635';
     	controllertypestr:'LM3S1635';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -564,8 +569,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1636';
     	controllertypestr:'LM3S1636';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -574,8 +578,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1637';
     	controllertypestr:'LM3S1637';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -584,8 +587,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1651';
     	controllertypestr:'LM3S1651';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -594,8 +596,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2601';
     	controllertypestr:'LM3S2601';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -604,8 +605,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2608';
     	controllertypestr:'LM3S2608';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -614,8 +614,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2620';
     	controllertypestr:'LM3S2620';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -624,8 +623,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2637';
     	controllertypestr:'LM3S2637';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -634,8 +632,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2651';
     	controllertypestr:'LM3S2651';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -644,8 +641,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6610';
     	controllertypestr:'LM3S6610';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -654,8 +650,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6611';
     	controllertypestr:'LM3S6611';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -664,8 +659,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6618';
     	controllertypestr:'LM3S6618';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -674,8 +668,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6633';
     	controllertypestr:'LM3S6633';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -684,8 +677,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6637';
     	controllertypestr:'LM3S6637';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -694,8 +686,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8630';
     	controllertypestr:'LM3S8630';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00020000;
         flashsize:$00020000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00008000
         sramsize:$00008000
@@ -706,8 +697,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1911';
     	controllertypestr:'LM3S1911';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -716,8 +706,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1918';
     	controllertypestr:'LM3S1918';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -726,8 +715,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1937';
     	controllertypestr:'LM3S1937';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -736,8 +724,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1958';
     	controllertypestr:'LM3S1958';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -746,8 +733,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1960';
     	controllertypestr:'LM3S1960';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -756,8 +742,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1968';
     	controllertypestr:'LM3S1968';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -766,8 +751,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1969';
     	controllertypestr:'LM3S1969';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -776,8 +760,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2911';
     	controllertypestr:'LM3S2911';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -786,8 +769,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2918';
     	controllertypestr:'LM3S2918';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -796,8 +778,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2919';
     	controllertypestr:'LM3S2919';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -806,8 +787,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2939';
     	controllertypestr:'LM3S2939';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -816,8 +796,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2948';
     	controllertypestr:'LM3S2948';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -826,8 +805,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2950';
     	controllertypestr:'LM3S2950';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -836,8 +814,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2965';
     	controllertypestr:'LM3S2965';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -846,8 +823,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6911';
     	controllertypestr:'LM3S6911';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -856,8 +832,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6918';
     	controllertypestr:'LM3S6918';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -866,8 +841,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6938';
     	controllertypestr:'LM3S6938';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -876,8 +850,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6950';
     	controllertypestr:'LM3S6950';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -886,8 +859,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6952';
     	controllertypestr:'LM3S6952';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -896,8 +868,7 @@ Const
         (
         (
     	controllertypestr:'LM3S6965';
     	controllertypestr:'LM3S6965';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -906,8 +877,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8930';
     	controllertypestr:'LM3S8930';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -916,8 +886,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8933';
     	controllertypestr:'LM3S8933';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -926,8 +895,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8938';
     	controllertypestr:'LM3S8938';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -936,8 +904,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8962';
     	controllertypestr:'LM3S8962';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -946,8 +913,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8970';
     	controllertypestr:'LM3S8970';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -956,8 +922,7 @@ Const
         (
         (
     	controllertypestr:'LM3S8971';
     	controllertypestr:'LM3S8971';
         controllerunitstr:'LM3FURY';
         controllerunitstr:'LM3FURY';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -968,8 +933,7 @@ Const
         (
         (
     	controllertypestr:'LM3S5951';
     	controllertypestr:'LM3S5951';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -978,8 +942,7 @@ Const
         (
         (
     	controllertypestr:'LM3S5956';
     	controllertypestr:'LM3S5956';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -988,8 +951,7 @@ Const
         (
         (
     	controllertypestr:'LM3S1B21';
     	controllertypestr:'LM3S1B21';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -998,8 +960,7 @@ Const
         (
         (
     	controllertypestr:'LM3S2B93';
     	controllertypestr:'LM3S2B93';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1008,8 +969,7 @@ Const
         (
         (
     	controllertypestr:'LM3S5B91';
     	controllertypestr:'LM3S5B91';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1018,8 +978,7 @@ Const
         (
         (
     	controllertypestr:'LM3S9B81';
     	controllertypestr:'LM3S9B81';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1028,8 +987,7 @@ Const
         (
         (
     	controllertypestr:'LM3S9B90';
     	controllertypestr:'LM3S9B90';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1038,8 +996,7 @@ Const
         (
         (
     	controllertypestr:'LM3S9B92';
     	controllertypestr:'LM3S9B92';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1048,8 +1005,7 @@ Const
         (
         (
     	controllertypestr:'LM3S9B95';
     	controllertypestr:'LM3S9B95';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1058,8 +1014,7 @@ Const
         (
         (
     	controllertypestr:'LM3S9B96';
     	controllertypestr:'LM3S9B96';
         controllerunitstr:'LM3TEMPEST';
         controllerunitstr:'LM3TEMPEST';
-        interruptvectors:72;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00040000;
         flashsize:$00040000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00010000
         sramsize:$00010000
@@ -1069,8 +1024,7 @@ Const
         (
         (
     	controllertypestr:'SC32442B';
     	controllertypestr:'SC32442B';
         controllerunitstr:'sc32442b';
         controllerunitstr:'sc32442b';
-        interruptvectors:7;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00000000;
         flashsize:$00000000;
         srambase:$00000000;
         srambase:$00000000;
         sramsize:$08000000
         sramsize:$08000000
@@ -1080,15 +1034,14 @@ Const
         (
         (
     	controllertypestr:'THUMB2_BARE';
     	controllertypestr:'THUMB2_BARE';
         controllerunitstr:'THUMB2_BARE';
         controllerunitstr:'THUMB2_BARE';
-        interruptvectors:128;
-	flashbase:$00000000;
+        flashbase:$00000000;
         flashsize:$00100000;
         flashsize:$00100000;
         srambase:$20000000;
         srambase:$20000000;
         sramsize:$00100000
         sramsize:$00100000
         )
         )
     );
     );
 
 
-   vfp_scalar = [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16];
+   vfp_scalar = [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16,fpu_fpv4_s16];
 
 
    { Supported optimizations, only used for information }
    { Supported optimizations, only used for information }
    supported_optimizerswitches = genericlevel1optimizerswitches+
    supported_optimizerswitches = genericlevel1optimizerswitches+
@@ -1135,8 +1088,8 @@ Const
        { cpu_armv7    } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
        { cpu_armv7    } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
        { cpu_armv7a   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
        { cpu_armv7a   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
        { cpu_armv7r   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
        { cpu_armv7r   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
-       { cpu_armv7m   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV],
-       { cpu_armv7em  } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV]
+       { cpu_armv7m   } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV],
+       { cpu_armv7em  } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV]
      );
      );
 
 
 Implementation
 Implementation

+ 2 - 2
compiler/arm/cpupara.pas

@@ -124,7 +124,7 @@ unit cpupara;
                 getparaloc:=LOC_MMREGISTER
                 getparaloc:=LOC_MMREGISTER
               else if (calloption in [pocall_cdecl,pocall_cppdecl,pocall_softfloat]) or
               else if (calloption in [pocall_cdecl,pocall_cppdecl,pocall_softfloat]) or
                  (cs_fp_emulation in current_settings.moduleswitches) or
                  (cs_fp_emulation in current_settings.moduleswitches) or
-                 (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16]) then
+                 (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16,fpu_fpv4_s16]) then
                 { the ARM eabi also allows passing VFP values via VFP registers,
                 { the ARM eabi also allows passing VFP values via VFP registers,
                   but Mac OS X doesn't seem to do that and linux only does it if
                   but Mac OS X doesn't seem to do that and linux only does it if
                   built with the "-mfloat-abi=hard" option }
                   built with the "-mfloat-abi=hard" option }
@@ -608,7 +608,7 @@ unit cpupara;
               end
               end
             else if (p.proccalloption in [pocall_softfloat]) or
             else if (p.proccalloption in [pocall_softfloat]) or
                (cs_fp_emulation in current_settings.moduleswitches) or
                (cs_fp_emulation in current_settings.moduleswitches) or
-               (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16]) then
+               (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16,fpu_fpv4_s16]) then
               begin
               begin
                 case retcgsize of
                 case retcgsize of
                   OS_64,
                   OS_64,

+ 8 - 0
compiler/arm/cpupi.pas

@@ -125,6 +125,14 @@ unit cpupi;
                 if r in regs then
                 if r in regs then
                   inc(floatsavesize,8);
                   inc(floatsavesize,8);
             end;
             end;
+          fpu_fpv4_s16:
+            begin
+              floatsavesize:=0;
+              regs:=cg.rg[R_MMREGISTER].used_in_proc-paramanager.get_volatile_registers_mm(pocall_stdcall);
+              for r:=RS_D0 to RS_D15 do
+                if r in regs then
+                  inc(floatsavesize,8);
+            end;
         end;
         end;
         floatsavesize:=align(floatsavesize,max(current_settings.alignment.localalignmin,4));
         floatsavesize:=align(floatsavesize,max(current_settings.alignment.localalignmin,4));
         result:=Align(tg.direction*tg.lasttemp,max(current_settings.alignment.localalignmin,4))+maxpushedparasize+aint(floatsavesize);
         result:=Align(tg.direction*tg.lasttemp,max(current_settings.alignment.localalignmin,4))+maxpushedparasize+aint(floatsavesize);

+ 1 - 1
compiler/arm/itcpugas.pas

@@ -46,7 +46,7 @@ implementation
       cutils,verbose;
       cutils,verbose;
 
 
     const
     const
-      gas_regname_table : array[tregisterindex] of string[7] = (
+      gas_regname_table : array[tregisterindex] of string[10] = (
         {$i rarmstd.inc}
         {$i rarmstd.inc}
       );
       );
 
 

+ 125 - 2
compiler/arm/narmadd.pas

@@ -35,6 +35,7 @@ interface
        public
        public
           function pass_1 : tnode;override;
           function pass_1 : tnode;override;
        protected
        protected
+          function first_addfloat: tnode; override;
           procedure second_addfloat;override;
           procedure second_addfloat;override;
           procedure second_cmpfloat;override;
           procedure second_cmpfloat;override;
           procedure second_cmpordinal;override;
           procedure second_cmpordinal;override;
@@ -48,12 +49,12 @@ interface
       globtype,systems,
       globtype,systems,
       cutils,verbose,globals,
       cutils,verbose,globals,
       constexp,
       constexp,
-      symconst,symdef,paramgr,
+      symconst,symdef,paramgr,symtable,symtype,
       aasmbase,aasmtai,aasmdata,aasmcpu,defutil,htypechk,
       aasmbase,aasmtai,aasmdata,aasmcpu,defutil,htypechk,
       cgbase,cgutils,cgcpu,
       cgbase,cgutils,cgcpu,
       cpuinfo,pass_1,pass_2,regvars,procinfo,
       cpuinfo,pass_1,pass_2,regvars,procinfo,
       cpupara,
       cpupara,
-      ncon,nset,nadd,
+      ncon,nset,nadd,ncnv,ncal,nmat,
       ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32,
       ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32,
       hlcgobj
       hlcgobj
       ;
       ;
@@ -212,6 +213,36 @@ interface
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,
                  location.register,left.location.register,right.location.register));
                  location.register,left.location.register,right.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            begin
+              { force mmreg as location, left right doesn't matter
+                as both will be in a fpureg }
+              location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,true);
+              location_force_mmregscalar(current_asmdata.CurrAsmList,right.location,true);
+
+              location_reset(location,LOC_MMREGISTER,def_cgsize(resultdef));
+              if left.location.loc<>LOC_CMMREGISTER then
+                location.register:=left.location.register
+              else if right.location.loc<>LOC_CMMREGISTER then
+                location.register:=right.location.register
+              else
+                location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
+
+              case nodetype of
+                addn :
+                  op:=A_VADD;
+                muln :
+                  op:=A_VMUL;
+                subn :
+                  op:=A_VSUB;
+                slashn :
+                  op:=A_VDIV;
+                else
+                  internalerror(2009111401);
+              end;
+
+              current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg(op, location.register,left.location.register,right.location.register), PF_F32));
+            end;
           fpu_soft:
           fpu_soft:
             { this case should be handled already by pass1 }
             { this case should be handled already by pass1 }
             internalerror(200308252);
             internalerror(200308252);
@@ -273,6 +304,21 @@ interface
               cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_DEFAULTFLAGS);
               cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_DEFAULTFLAGS);
               current_asmdata.CurrAsmList.concat(taicpu.op_none(A_FMSTAT));
               current_asmdata.CurrAsmList.concat(taicpu.op_none(A_FMSTAT));
             end;
             end;
+          fpu_fpv4_s16:
+            begin
+              location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,true);
+              location_force_mmregscalar(current_asmdata.CurrAsmList,right.location,true);
+
+              if nodetype in [equaln,unequaln] then
+                op:=A_VCMP
+              else
+                op:=A_VCMPE;
+
+              current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,
+                left.location.register,right.location.register));
+              cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_DEFAULTFLAGS);
+              current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg(A_VMRS, NR_APSR_nzcv, NR_FPSCR));
+            end;
           fpu_soft:
           fpu_soft:
             { this case should be handled already by pass1 }
             { this case should be handled already by pass1 }
             internalerror(2009112404);
             internalerror(2009112404);
@@ -464,6 +510,83 @@ interface
           end;
           end;
       end;
       end;
 
 
+    function tarmaddnode.first_addfloat: tnode;
+      var
+        procname: string[31];
+        { do we need to reverse the result ? }
+        notnode : boolean;
+        fdef : tdef;
+      begin
+        result := nil;
+        notnode := false;
+
+        if current_settings.fputype = fpu_fpv4_s16 then
+          begin
+            case tfloatdef(left.resultdef).floattype of
+              s32real:
+                begin
+                  result:=nil;
+                  notnode:=false;
+                end;
+              s64real:
+                begin
+                  fdef:=search_system_type('FLOAT64').typedef;
+                  procname:='float64';
+
+                  case nodetype of
+                    addn:
+                      procname:=procname+'_add';
+                    muln:
+                      procname:=procname+'_mul';
+                    subn:
+                      procname:=procname+'_sub';
+                    slashn:
+                      procname:=procname+'_div';
+                    ltn:
+                      procname:=procname+'_lt';
+                    lten:
+                      procname:=procname+'_le';
+                    gtn:
+                      begin
+                        procname:=procname+'_le';
+                        notnode:=true;
+                      end;
+                    gten:
+                      begin
+                        procname:=procname+'_lt';
+                        notnode:=true;
+                      end;
+                    equaln:
+                      procname:=procname+'_eq';
+                    unequaln:
+                      begin
+                        procname:=procname+'_eq';
+                        notnode:=true;
+                      end;
+                    else
+                      CGMessage3(type_e_operator_not_supported_for_types,node2opstr(nodetype),left.resultdef.typename,right.resultdef.typename);
+                  end;
+
+                  if nodetype in [ltn,lten,gtn,gten,equaln,unequaln] then
+                    resultdef:=pasbool8type;
+                  result:=ctypeconvnode.create_internal(ccallnode.createintern(procname,ccallparanode.create(
+                      ctypeconvnode.create_internal(right,fdef),
+                      ccallparanode.create(
+                        ctypeconvnode.create_internal(left,fdef),nil))),resultdef);
+
+                  left:=nil;
+                  right:=nil;
+
+                  { do we need to reverse the result }
+                  if notnode then
+                    result:=cnotnode.create(result);
+                end;
+            end;
+          end
+        else
+          result:=inherited first_addfloat;
+      end;
+
 
 
     procedure tarmaddnode.second_cmpordinal;
     procedure tarmaddnode.second_cmpordinal;
       var
       var

+ 1 - 1
compiler/arm/narmcal.pas

@@ -49,7 +49,7 @@ implementation
       if (realresdef.typ=floatdef) and 
       if (realresdef.typ=floatdef) and 
          (target_info.abi <> abi_eabihf) and
          (target_info.abi <> abi_eabihf) and
          ((cs_fp_emulation in current_settings.moduleswitches) or
          ((cs_fp_emulation in current_settings.moduleswitches) or
-          (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16])) then
+          (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv3_d16,fpu_fpv4_s16])) then
         begin
         begin
           { keep the fpu values in integer registers for now, the code
           { keep the fpu values in integer registers for now, the code
             generator will move them to memory or an mmregister when necessary
             generator will move them to memory or an mmregister when necessary

+ 64 - 3
compiler/arm/narmcnv.pas

@@ -32,6 +32,7 @@ interface
        tarmtypeconvnode = class(tcgtypeconvnode)
        tarmtypeconvnode = class(tcgtypeconvnode)
          protected
          protected
            function first_int_to_real: tnode;override;
            function first_int_to_real: tnode;override;
+           function first_real_to_real: tnode; override;
          { procedure second_int_to_int;override; }
          { procedure second_int_to_int;override; }
          { procedure second_string_to_string;override; }
          { procedure second_string_to_string;override; }
          { procedure second_cstring_to_pchar;override; }
          { procedure second_cstring_to_pchar;override; }
@@ -58,7 +59,7 @@ implementation
 
 
    uses
    uses
       verbose,globtype,globals,systems,
       verbose,globtype,globals,systems,
-      symconst,symdef,aasmbase,aasmtai,aasmdata,
+      symconst,symdef,aasmbase,aasmtai,aasmdata,symtable,
       defutil,
       defutil,
       cgbase,cgutils,
       cgbase,cgutils,
       pass_1,pass_2,procinfo,
       pass_1,pass_2,procinfo,
@@ -76,7 +77,8 @@ implementation
       var
       var
         fname: string[19];
         fname: string[19];
       begin
       begin
-        if cs_fp_emulation in current_settings.moduleswitches then
+        if (cs_fp_emulation in current_settings.moduleswitches) or
+          (current_settings.fputype=fpu_fpv4_s16) then
           result:=inherited first_int_to_real
           result:=inherited first_int_to_real
         else
         else
           begin
           begin
@@ -117,7 +119,8 @@ implementation
                 expectloc:=LOC_FPUREGISTER;
                 expectloc:=LOC_FPUREGISTER;
               fpu_vfpv2,
               fpu_vfpv2,
               fpu_vfpv3,
               fpu_vfpv3,
-              fpu_vfpv3_d16:
+              fpu_vfpv3_d16,
+              fpu_fpv4_s16:
                 expectloc:=LOC_MMREGISTER;
                 expectloc:=LOC_MMREGISTER;
               else
               else
                 internalerror(2009112702);
                 internalerror(2009112702);
@@ -125,6 +128,48 @@ implementation
           end;
           end;
       end;
       end;
 
 
+    function tarmtypeconvnode.first_real_to_real: tnode;
+      begin
+        if (current_settings.fputype=fpu_fpv4_s16) then
+          begin
+            case tfloatdef(left.resultdef).floattype of
+              s32real:
+                case tfloatdef(resultdef).floattype of
+                  s64real:
+                    result:=ctypeconvnode.create_explicit(ccallnode.createintern('float32_to_float64',ccallparanode.create(
+                      ctypeconvnode.create_internal(left,search_system_type('FLOAT32REC').typedef),nil)),resultdef);
+                  s32real:
+                    begin
+                      result:=left;
+                      left:=nil;
+                    end;
+                  else
+                    internalerror(200610151);
+                end;
+              s64real:
+                case tfloatdef(resultdef).floattype of
+                  s32real:
+                    result:=ctypeconvnode.create_explicit(ccallnode.createintern('float64_to_float32',ccallparanode.create(
+                      ctypeconvnode.create_internal(left,search_system_type('FLOAT64').typedef),nil)),resultdef);
+                  s64real:
+                    begin
+                      result:=left;
+                      left:=nil;
+                    end;
+                  else
+                    internalerror(200610152);
+                end;
+              else
+                internalerror(200610153);
+            end;
+            left:=nil;
+            firstpass(result);
+            exit;
+          end
+        else
+          Result := inherited first_real_to_real;
+      end;
+
 
 
     procedure tarmtypeconvnode.second_int_to_real;
     procedure tarmtypeconvnode.second_int_to_real;
       const
       const
@@ -214,6 +259,22 @@ implementation
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(
                 signedprec2vfpop[signed,location.size],location.register,left.location.register));
                 signedprec2vfpop[signed,location.size],location.register,left.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            begin
+              location_reset(location,LOC_MMREGISTER,def_cgsize(resultdef));
+              signed:=left.location.size=OS_S32;
+              location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,false);
+              if (left.location.size<>OS_F32) then
+                internalerror(2009112703);
+              if left.location.size<>location.size then
+                location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size)
+              else
+                location.register:=left.location.register;
+              if signed then
+                current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_VCVT,location.register,left.location.register), PF_F32S32))
+              else
+                current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_VCVT,location.register,left.location.register), PF_F32U32));
+            end;
         end;
         end;
       end;
       end;
 
 

+ 29 - 1
compiler/arm/narminl.pas

@@ -91,7 +91,8 @@ implementation
             end;
             end;
           fpu_vfpv2,
           fpu_vfpv2,
           fpu_vfpv3,
           fpu_vfpv3,
-          fpu_vfpv3_d16:
+          fpu_vfpv3_d16,
+          fpu_fpv4_s16:
             begin
             begin
               location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,true);
               location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,true);
               location_copy(location,left.location);
               location_copy(location,left.location);
@@ -123,6 +124,13 @@ implementation
               fpu_vfpv3,
               fpu_vfpv3,
               fpu_vfpv3_d16:
               fpu_vfpv3_d16:
                 expectloc:=LOC_MMREGISTER;
                 expectloc:=LOC_MMREGISTER;
+              fpu_fpv4_s16:
+                begin
+                  if tfloatdef(left.resultdef).floattype=s32real then
+                    expectloc:=LOC_MMREGISTER
+                  else
+                    exit(inherited first_abs_real);
+                end;
               else
               else
                 internalerror(2009112401);
                 internalerror(2009112401);
             end;
             end;
@@ -146,6 +154,13 @@ implementation
               fpu_vfpv3,
               fpu_vfpv3,
               fpu_vfpv3_d16:
               fpu_vfpv3_d16:
                 expectloc:=LOC_MMREGISTER;
                 expectloc:=LOC_MMREGISTER;
+              fpu_fpv4_s16:
+                begin
+                  if tfloatdef(left.resultdef).floattype=s32real then
+                    expectloc:=LOC_MMREGISTER
+                  else
+                    exit(inherited first_sqr_real);
+                end;
               else
               else
                 internalerror(2009112402);
                 internalerror(2009112402);
             end;
             end;
@@ -169,6 +184,13 @@ implementation
               fpu_vfpv3,
               fpu_vfpv3,
               fpu_vfpv3_d16:
               fpu_vfpv3_d16:
                 expectloc:=LOC_MMREGISTER;
                 expectloc:=LOC_MMREGISTER;
+              fpu_fpv4_s16:
+                begin
+                  if tfloatdef(left.resultdef).floattype=s32real then
+                    expectloc:=LOC_MMREGISTER
+                  else
+                    exit(inherited first_sqrt_real);
+                end;
               else
               else
                 internalerror(2009112403);
                 internalerror(2009112403);
             end;
             end;
@@ -227,6 +249,8 @@ implementation
                 op:=A_FABSD;
                 op:=A_FABSD;
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,location.register,left.location.register));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,location.register,left.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            current_asmdata.CurrAsmList.Concat(setoppostfix(taicpu.op_reg_reg(A_VABS,location.register,left.location.register), PF_F32));
         else
         else
           internalerror(2009111402);
           internalerror(2009111402);
         end;
         end;
@@ -254,6 +278,8 @@ implementation
                 op:=A_FMULD;
                 op:=A_FMULD;
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,location.register,left.location.register,left.location.register));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,location.register,left.location.register,left.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            current_asmdata.CurrAsmList.Concat(setoppostfix(taicpu.op_reg_reg_reg(A_VMUL,location.register,left.location.register,left.location.register), PF_F32));
         else
         else
           internalerror(2009111403);
           internalerror(2009111403);
         end;
         end;
@@ -281,6 +307,8 @@ implementation
                 op:=A_FSQRTD;
                 op:=A_FSQRTD;
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,location.register,left.location.register));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,location.register,left.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_VSQRT,location.register,left.location.register));
         else
         else
           internalerror(2009111402);
           internalerror(2009111402);
         end;
         end;

+ 52 - 1
compiler/arm/narmmat.pas

@@ -39,6 +39,7 @@ interface
       end;
       end;
 
 
       tarmunaryminusnode = class(tcgunaryminusnode)
       tarmunaryminusnode = class(tcgunaryminusnode)
+        function pass_1: tnode; override;
         procedure second_float;override;
         procedure second_float;override;
       end;
       end;
 
 
@@ -54,9 +55,10 @@ implementation
       cutils,verbose,globals,constexp,
       cutils,verbose,globals,constexp,
       aasmbase,aasmcpu,aasmtai,aasmdata,
       aasmbase,aasmcpu,aasmtai,aasmdata,
       defutil,
       defutil,
+      symtype,symconst,symtable,
       cgbase,cgobj,hlcgobj,cgutils,
       cgbase,cgobj,hlcgobj,cgutils,
       pass_2,procinfo,
       pass_2,procinfo,
-      ncon,
+      ncon,ncnv,ncal,
       cpubase,cpuinfo,
       cpubase,cpuinfo,
       ncgutil,cgcpu,
       ncgutil,cgcpu,
       nadd,pass_1,symdef;
       nadd,pass_1,symdef;
@@ -326,6 +328,46 @@ implementation
                                TARMUNARYMINUSNODE
                                TARMUNARYMINUSNODE
 *****************************************************************************}
 *****************************************************************************}
 
 
+    function tarmunaryminusnode.pass_1: tnode;
+      var
+        procname: string[31];
+        fdef : tdef;
+      begin
+        if (current_settings.fputype<>fpu_fpv4_s16) or
+          (tfloatdef(resultdef).floattype=s32real) then
+          exit(inherited pass_1);
+
+        result:=nil;
+        firstpass(left);
+        if codegenerror then
+          exit;
+
+        if (left.resultdef.typ=floatdef) then
+          begin
+            case tfloatdef(resultdef).floattype of
+              s64real:
+                begin
+                  procname:='float64_sub';
+                  fdef:=search_system_type('FLOAT64').typedef;
+                end;
+              else
+                internalerror(2005082801);
+            end;
+            result:=ctypeconvnode.create_internal(ccallnode.createintern(procname,ccallparanode.create(
+              ctypeconvnode.create_internal(left,fDef),
+              ccallparanode.create(ctypeconvnode.create_internal(crealconstnode.create(0,resultdef),fdef),nil))),resultdef);
+
+            left:=nil;
+          end
+        else
+          begin
+            if (left.resultdef.typ=floatdef) then
+              expectloc:=LOC_FPUREGISTER
+             else if (left.resultdef.typ=orddef) then
+               expectloc:=LOC_REGISTER;
+          end;
+      end;
+
     procedure tarmunaryminusnode.second_float;
     procedure tarmunaryminusnode.second_float;
       var
       var
         op: tasmop;
         op: tasmop;
@@ -357,6 +399,15 @@ implementation
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,
                 location.register,left.location.register));
                 location.register,left.location.register));
             end;
             end;
+          fpu_fpv4_s16:
+            begin
+              location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,true);
+              location:=left.location;
+              if (left.location.loc=LOC_CMMREGISTER) then
+                location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
+              current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_VNEG,
+                location.register,left.location.register), PF_F32));
+            end
           else
           else
             internalerror(2009112602);
             internalerror(2009112602);
         end;
         end;

+ 38 - 1
compiler/arm/raarmgas.pas

@@ -35,6 +35,7 @@ Unit raarmgas;
         actwideformat : boolean;
         actwideformat : boolean;
         function is_asmopcode(const s: string):boolean;override;
         function is_asmopcode(const s: string):boolean;override;
         function is_register(const s:string):boolean;override;
         function is_register(const s:string):boolean;override;
+        function is_targetdirective(const s: string): boolean; override;
         procedure handleopcode;override;
         procedure handleopcode;override;
         procedure BuildReference(oper : tarmoperand);
         procedure BuildReference(oper : tarmoperand);
         procedure BuildOperand(oper : tarmoperand);
         procedure BuildOperand(oper : tarmoperand);
@@ -43,6 +44,7 @@ Unit raarmgas;
         procedure BuildOpCode(instr : tarminstruction);
         procedure BuildOpCode(instr : tarminstruction);
         procedure ReadSym(oper : tarmoperand);
         procedure ReadSym(oper : tarmoperand);
         procedure ConvertCalljmp(instr : tarminstruction);
         procedure ConvertCalljmp(instr : tarminstruction);
+        procedure HandleTargetDirective; override;
       end;
       end;
 
 
 
 
@@ -119,6 +121,16 @@ Unit raarmgas;
           end;
           end;
       end;
       end;
 
 
+    function tarmattreader.is_targetdirective(const s: string): boolean;
+      begin
+        if s = '.thumb_func' then
+          result:=true
+        else if s='.thumb_set' then
+          result:=true
+        else
+          Result:=inherited is_targetdirective(s);
+      end;
+
 
 
     procedure tarmattreader.ReadSym(oper : tarmoperand);
     procedure tarmattreader.ReadSym(oper : tarmoperand);
       var
       var
@@ -1049,7 +1061,7 @@ Unit raarmgas;
             AS_COMMA: { Operand delimiter }
             AS_COMMA: { Operand delimiter }
               Begin
               Begin
                 if ((instr.opcode in [A_MOV, A_MVN, A_CMP, A_CMN, A_TST, A_TEQ]) and (operandnum=2)) or
                 if ((instr.opcode in [A_MOV, A_MVN, A_CMP, A_CMN, A_TST, A_TEQ]) and (operandnum=2)) or
-                  ((operandnum=3) and not(instr.opcode in [A_UMLAL,A_UMULL,A_SMLAL,A_SMULL,A_MLA])) then
+                  ((operandnum=3) and not(instr.opcode in [A_UMLAL,A_UMULL,A_SMLAL,A_SMULL,A_MLA,A_MRC,A_MCR,A_MCRR,A_MRRC])) then
                   begin
                   begin
                     Consume(AS_COMMA);
                     Consume(AS_COMMA);
                     if not(TryBuildShifterOp(instr.Operands[operandnum+1] as tarmoperand)) then
                     if not(TryBuildShifterOp(instr.Operands[operandnum+1] as tarmoperand)) then
@@ -1205,6 +1217,31 @@ Unit raarmgas;
           end;
           end;
       end;
       end;
 
 
+    procedure tarmattreader.HandleTargetDirective;
+      var
+        symname,
+        symval  : String;
+        val     : aint;
+        symtyp  : TAsmsymtype;
+      begin
+        if actasmpattern='.thumb_set' then
+          begin
+            consume(AS_TARGET_DIRECTIVE);
+            BuildConstSymbolExpression(true,false,false, val,symname,symtyp);
+            Consume(AS_COMMA);
+            BuildConstSymbolExpression(true,false,false, val,symval,symtyp);
+
+            curList.concat(tai_thumb_set.create(symname,symval));
+          end
+        else if actasmpattern='.thumb_func' then
+          begin
+            consume(AS_TARGET_DIRECTIVE);
+            curList.concat(tai_thumb_func.create);
+          end
+        else
+          inherited HandleTargetDirective;
+      end;
+
 
 
     procedure tarmattreader.handleopcode;
     procedure tarmattreader.handleopcode;
       var
       var

+ 18 - 0
compiler/arm/rarmcon.inc

@@ -91,3 +91,21 @@ NR_D31 = tregister($0407001F);
 NR_CPSR = tregister($05000000);
 NR_CPSR = tregister($05000000);
 NR_FPSCR = tregister($05000001);
 NR_FPSCR = tregister($05000001);
 NR_SPSR = tregister($05000002);
 NR_SPSR = tregister($05000002);
+NR_APSR_nzcv = tregister($05000003);
+NR_CR0 = tregister($05000004);
+NR_CR1 = tregister($05000005);
+NR_CR2 = tregister($05000006);
+NR_CR3 = tregister($05000007);
+NR_CR4 = tregister($05000008);
+NR_CR5 = tregister($05000009);
+NR_CR6 = tregister($0500000A);
+NR_CR7 = tregister($0500000B);
+NR_CR8 = tregister($0500000C);
+NR_CR9 = tregister($0500000D);
+NR_CR10 = tregister($0500000E);
+NR_CR11 = tregister($0500000F);
+NR_CR12 = tregister($05000010);
+NR_CR13 = tregister($05000011);
+NR_CR14 = tregister($05000012);
+NR_CR15 = tregister($05000013);
+NR_p15 = tregister($05000014);

+ 18 - 0
compiler/arm/rarmdwa.inc

@@ -90,4 +90,22 @@
 0,
 0,
 0,
 0,
 0,
 0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
 0
 0

+ 1 - 1
compiler/arm/rarmnor.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from armreg.dat }
 { don't edit, this file is generated from armreg.dat }
-92
+110

+ 19 - 1
compiler/arm/rarmnum.inc

@@ -90,4 +90,22 @@ tregister($0407001E),
 tregister($0407001F),
 tregister($0407001F),
 tregister($05000000),
 tregister($05000000),
 tregister($05000001),
 tregister($05000001),
-tregister($05000002)
+tregister($05000002),
+tregister($05000003),
+tregister($05000004),
+tregister($05000005),
+tregister($05000006),
+tregister($05000007),
+tregister($05000008),
+tregister($05000009),
+tregister($0500000A),
+tregister($0500000B),
+tregister($0500000C),
+tregister($0500000D),
+tregister($0500000E),
+tregister($0500000F),
+tregister($05000010),
+tregister($05000011),
+tregister($05000012),
+tregister($05000013),
+tregister($05000014)

+ 19 - 1
compiler/arm/rarmrni.inc

@@ -90,4 +90,22 @@
 88,
 88,
 89,
 89,
 90,
 90,
-91
+91,
+92,
+93,
+94,
+95,
+96,
+97,
+98,
+99,
+100,
+101,
+102,
+103,
+104,
+105,
+106,
+107,
+108,
+109

+ 18 - 0
compiler/arm/rarmsri.inc

@@ -1,6 +1,23 @@
 { don't edit, this file is generated from armreg.dat }
 { don't edit, this file is generated from armreg.dat }
 0,
 0,
+92,
 89,
 89,
+93,
+94,
+103,
+104,
+105,
+106,
+107,
+108,
+95,
+96,
+97,
+98,
+99,
+100,
+101,
+102,
 27,
 27,
 30,
 30,
 57,
 57,
@@ -42,6 +59,7 @@
 23,
 23,
 24,
 24,
 90,
 90,
+109,
 1,
 1,
 2,
 2,
 11,
 11,

+ 18 - 0
compiler/arm/rarmsta.inc

@@ -90,4 +90,22 @@
 0,
 0,
 0,
 0,
 0,
 0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
 0
 0

+ 19 - 1
compiler/arm/rarmstd.inc

@@ -90,4 +90,22 @@
 'd31',
 'd31',
 'cpsr',
 'cpsr',
 'fpscr',
 'fpscr',
-'spsr'
+'spsr',
+'apsr_nzcv',
+'cr0',
+'cr1',
+'cr2',
+'cr3',
+'cr4',
+'cr5',
+'cr6',
+'cr7',
+'cr8',
+'cr9',
+'cr10',
+'cr11',
+'cr12',
+'cr13',
+'cr14',
+'cr15',
+'p15'

+ 18 - 0
compiler/arm/rarmsup.inc

@@ -91,3 +91,21 @@ RS_D31 = $1F;
 RS_CPSR = $00;
 RS_CPSR = $00;
 RS_FPSCR = $01;
 RS_FPSCR = $01;
 RS_SPSR = $02;
 RS_SPSR = $02;
+RS_APSR_nzcv = $03;
+RS_CR0 = $04;
+RS_CR1 = $05;
+RS_CR2 = $06;
+RS_CR3 = $07;
+RS_CR4 = $08;
+RS_CR5 = $09;
+RS_CR6 = $0A;
+RS_CR7 = $0B;
+RS_CR8 = $0C;
+RS_CR9 = $0D;
+RS_CR10 = $0E;
+RS_CR11 = $0F;
+RS_CR12 = $10;
+RS_CR13 = $11;
+RS_CR14 = $12;
+RS_CR15 = $13;
+RS_p15 = $14;

+ 97 - 0
compiler/arm/rgcpu.pas

@@ -45,6 +45,9 @@ unit rgcpu;
        end;
        end;
 
 
        trgcputhumb2 = class(trgobj)
        trgcputhumb2 = class(trgobj)
+       private
+         procedure SplitITBlock(list:TAsmList;pos:tai);
+       public
          procedure do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
          procedure do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
          procedure do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
          procedure do_spill_written(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);override;
        end;
        end;
@@ -67,10 +70,17 @@ unit rgcpu;
     procedure trgintcputhumb2.add_cpu_interferences(p: tai);
     procedure trgintcputhumb2.add_cpu_interferences(p: tai);
       var
       var
         r : tregister;
         r : tregister;
+        hr : longint;
       begin
       begin
         if p.typ=ait_instruction then
         if p.typ=ait_instruction then
           begin
           begin
             case taicpu(p).opcode of
             case taicpu(p).opcode of
+              A_CBNZ,
+              A_CBZ:
+                begin
+                  for hr := RS_R8 to RS_R15 do
+                    add_edge(getsupreg(taicpu(p).oper[0]^.reg), hr);
+                end;
               A_ADD:
               A_ADD:
                 begin
                 begin
                   if taicpu(p).ops = 3 then
                   if taicpu(p).ops = 3 then
@@ -245,6 +255,69 @@ unit rgcpu;
           result:=getsubreg(r);
           result:=getsubreg(r);
       end;
       end;
 
 
+    function GetITRemainderOp(originalOp:TAsmOp;remLevels:longint;var newOp: TAsmOp;var NeedsCondSwap:boolean) : TAsmOp;
+      const
+        remOps : array[1..3] of array[A_ITE..A_ITTTT] of TAsmOp = (
+          (A_IT,A_IT,       A_IT,A_IT,A_IT,A_IT,            A_IT,A_IT,A_IT,A_IT,A_IT,A_IT,A_IT,A_IT),
+          (A_NONE,A_NONE,   A_ITT,A_ITE,A_ITE,A_ITT,        A_ITT,A_ITT,A_ITE,A_ITE,A_ITE,A_ITE,A_ITT,A_ITT),
+          (A_NONE,A_NONE,   A_NONE,A_NONE,A_NONE,A_NONE,    A_ITTT,A_ITEE,A_ITET,A_ITTE,A_ITTE,A_ITET,A_ITEE,A_ITTT));
+        newOps : array[1..3] of array[A_ITE..A_ITTTT] of TAsmOp = (
+          (A_IT,A_IT,       A_ITE,A_ITT,A_ITE,A_ITT,        A_ITEE,A_ITTE,A_ITET,A_ITTT,A_ITEE,A_ITTE,A_ITET,A_ITTT),
+          (A_NONE,A_NONE,   A_IT,A_IT,A_IT,A_IT,            A_ITE,A_ITT,A_ITE,A_ITT,A_ITE,A_ITT,A_ITE,A_ITT),
+          (A_NONE,A_NONE,   A_NONE,A_NONE,A_NONE,A_NONE,    A_IT,A_IT,A_IT,A_IT,A_IT,A_IT,A_IT,A_IT));
+        needsSwap: array[1..3] of array[A_ITE..A_ITTTT] of Boolean = (
+          (true ,false,     true ,true ,false,false,        true ,true ,true ,true ,false,false,false,false),
+          (false,false,     true ,false,true ,false,        true ,true ,false,false,true ,true ,false,false),
+          (false,false,     false,false,false,false,        true ,false,true ,false,true ,false,true ,false));
+      begin
+        result:=remOps[remLevels][originalOp];
+        newOp:=newOps[remLevels][originalOp];
+        NeedsCondSwap:=needsSwap[remLevels][originalOp];
+      end;
+
+    procedure trgcputhumb2.SplitITBlock(list: TAsmList; pos: tai);
+      var
+        hp : tai;
+        level,itLevel : LongInt;
+        remOp,newOp : TAsmOp;
+        needsSwap : boolean;
+      begin
+        hp:=pos;
+        level := 0;
+        while assigned(hp) do
+          begin
+            if IsIT(taicpu(hp).opcode) then
+              break
+            else if hp.typ=ait_instruction then
+              inc(level);
+
+            hp:=tai(hp.Previous);
+          end;
+
+        if not assigned(hp) then
+          internalerror(2012100801); // We are supposed to have found the ITxxx instruction here
+
+        if (hp.typ<>ait_instruction) or
+          (not IsIT(taicpu(hp).opcode)) then
+          internalerror(2012100802); // Sanity check
+
+        itLevel := GetITLevels(taicpu(hp).opcode);
+        if level=itLevel then
+          exit; // pos was the last instruction in the IT block anyway
+
+        remOp:=GetITRemainderOp(taicpu(hp).opcode,itLevel-level,newOp,needsSwap);
+
+        if (remOp=A_NONE) or
+          (newOp=A_NONE) then
+          Internalerror(2012100803);
+
+        taicpu(hp).opcode:=newOp;
+
+        if needsSwap then
+          list.InsertAfter(taicpu.op_cond(remOp,inverse_cond(taicpu(hp).oper[0]^.cc)), pos)
+        else
+          list.InsertAfter(taicpu.op_cond(remOp,taicpu(hp).oper[0]^.cc), pos);
+      end;
 
 
     procedure trgcputhumb2.do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);
     procedure trgcputhumb2.do_spill_read(list:TAsmList;pos:tai;const spilltemp:treference;tempreg:tregister);
       var
       var
@@ -267,6 +340,18 @@ unit rgcpu;
           (taicpu(pos).oper[1]^.reg=NR_PC) then
           (taicpu(pos).oper[1]^.reg=NR_PC) then
           pos:=tai(pos.previous);
           pos:=tai(pos.previous);
 
 
+        if (pos.typ=ait_instruction) and
+          (taicpu(pos).condition<>C_None) and
+          (taicpu(pos).opcode<>A_B) then
+          SplitITBlock(list, pos)
+        else if (pos.typ=ait_instruction) and
+          IsIT(taicpu(pos).opcode) then
+          begin
+            if not assigned(pos.Previous) then
+              list.InsertBefore(tai_comment.Create('Dummy'), pos);
+            pos:=tai(pos.Previous);
+          end;
+
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;
@@ -313,6 +398,18 @@ unit rgcpu;
         l : tasmlabel;
         l : tasmlabel;
         hreg : tregister;
         hreg : tregister;
       begin
       begin
+        if (pos.typ=ait_instruction) and
+          (taicpu(pos).condition<>C_None) and
+          (taicpu(pos).opcode<>A_B) then
+          SplitITBlock(list, pos)
+        else if (pos.typ=ait_instruction) and
+          IsIT(taicpu(pos).opcode) then
+          begin
+            if not assigned(pos.Previous) then
+              list.InsertBefore(tai_comment.Create('Dummy'), pos);
+            pos:=tai(pos.Previous);
+          end;
+
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;

+ 1 - 1
compiler/avr/cpubase.pas

@@ -326,7 +326,7 @@ unit cpubase;
 
 
 
 
     const
     const
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i ravrstd.inc}
         {$i ravrstd.inc}
       );
       );
 
 

+ 0 - 6
compiler/avr/cpuinfo.pas

@@ -104,7 +104,6 @@ Const
    ((
    ((
    	controllertypestr:'';
    	controllertypestr:'';
         controllerunitstr:'';
         controllerunitstr:'';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:0;
         flashsize:0;
         srambase:0;
         srambase:0;
@@ -115,7 +114,6 @@ Const
         (
         (
    	controllertypestr:'ATMEGA16';
    	controllertypestr:'ATMEGA16';
         controllerunitstr:'ATMEGA16';
         controllerunitstr:'ATMEGA16';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:$4000;
         flashsize:$4000;
         srambase:0;
         srambase:0;
@@ -126,7 +124,6 @@ Const
         (
         (
    	controllertypestr:'ATMEGA32';
    	controllertypestr:'ATMEGA32';
         controllerunitstr:'ATMEGA32';
         controllerunitstr:'ATMEGA32';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:$8000;
         flashsize:$8000;
         srambase:0;
         srambase:0;
@@ -137,7 +134,6 @@ Const
    	(
    	(
         controllertypestr:'ATMEGA48';
         controllertypestr:'ATMEGA48';
         controllerunitstr:'ATMEGA48';
         controllerunitstr:'ATMEGA48';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:$1000;
         flashsize:$1000;
         srambase:0;
         srambase:0;
@@ -148,7 +144,6 @@ Const
    	(
    	(
         controllertypestr:'ATMEGA64';
         controllertypestr:'ATMEGA64';
         controllerunitstr:'ATMEGA64';
         controllerunitstr:'ATMEGA64';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:$10000;
         flashsize:$10000;
         srambase:0;
         srambase:0;
@@ -159,7 +154,6 @@ Const
    	(
    	(
         controllertypestr:'ATMEGA128';
         controllertypestr:'ATMEGA128';
         controllerunitstr:'ATMEGA128';
         controllerunitstr:'ATMEGA128';
-        interruptvectors:0;
         flashbase:0;
         flashbase:0;
         flashsize:$20000;
         flashsize:$20000;
         srambase:0;
         srambase:0;

+ 0 - 7
compiler/fpcdefs.inc

@@ -28,13 +28,6 @@
 
 
 {$define USEEXCEPT}
 {$define USEEXCEPT}
 
 
-{ If anyone wants to use interrupt for
-  a specific target, add a
-  $define FPC_HAS_SYSTEMS_INTERRUPT_TABLE
-  to fpcdefs.inc to reactivate
-  the corresponding code }
-{$undef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-
 { This fake CPU is used to allow incorporation of globtype unit
 { This fake CPU is used to allow incorporation of globtype unit
   into utils/ppudump without any CPU specific code PM }
   into utils/ppudump without any CPU specific code PM }
 {$ifdef generic_cpu}
 {$ifdef generic_cpu}

+ 0 - 1
compiler/globtype.pas

@@ -267,7 +267,6 @@ interface
        { Used by ARM / AVR to differentiate between specific microcontrollers }
        { Used by ARM / AVR to differentiate between specific microcontrollers }
        tcontrollerdatatype = record
        tcontrollerdatatype = record
           controllertypestr, controllerunitstr: string[20];
           controllertypestr, controllerunitstr: string[20];
-          interruptvectors:integer;
           flashbase, flashsize, srambase, sramsize, eeprombase, eepromsize: dword;
           flashbase, flashsize, srambase, sramsize, eeprombase, eepromsize: dword;
        end;
        end;
 
 

+ 1 - 1
compiler/m68k/cpubase.pas

@@ -353,7 +353,7 @@ implementation
 
 
 
 
     const
     const
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i r68kstd.inc}
         {$i r68kstd.inc}
       );
       );
 
 

+ 1 - 1
compiler/mips/cpubase.pas

@@ -295,7 +295,7 @@ unit cpubase;
 
 
 
 
     const
     const
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i rmipsstd.inc}
         {$i rmipsstd.inc}
       );
       );
 
 

+ 11 - 13
compiler/nadd.pas

@@ -2608,7 +2608,11 @@ implementation
         { In non-emulation mode, real opcodes are
         { In non-emulation mode, real opcodes are
           emitted for floating point values.
           emitted for floating point values.
         }
         }
-        if not (cs_fp_emulation in current_settings.moduleswitches) then
+        if not ((cs_fp_emulation in current_settings.moduleswitches)
+{$ifdef cpufpemu}
+                or (current_settings.fputype=fpu_soft)
+{$endif cpufpemu}
+                ) then
           exit;
           exit;
 
 
         if not(target_info.system in systems_wince) then
         if not(target_info.system in systems_wince) then
@@ -2768,12 +2772,9 @@ implementation
          if nodetype=slashn then
          if nodetype=slashn then
            begin
            begin
 {$ifdef cpufpemu}
 {$ifdef cpufpemu}
-             if (current_settings.fputype=fpu_soft) or (cs_fp_emulation in current_settings.moduleswitches) then
-               begin
-                 result:=first_addfloat;
-                 if assigned(result) then
-                   exit;
-               end;
+             result:=first_addfloat;
+             if assigned(result) then
+               exit;
 {$endif cpufpemu}
 {$endif cpufpemu}
              expectloc:=LOC_FPUREGISTER;
              expectloc:=LOC_FPUREGISTER;
            end
            end
@@ -2984,12 +2985,9 @@ implementation
          else if (rd.typ=floatdef) or (ld.typ=floatdef) then
          else if (rd.typ=floatdef) or (ld.typ=floatdef) then
             begin
             begin
 {$ifdef cpufpemu}
 {$ifdef cpufpemu}
-             if (current_settings.fputype=fpu_soft) or (cs_fp_emulation in current_settings.moduleswitches) then
-               begin
-                 result:=first_addfloat;
-                 if assigned(result) then
-                   exit;
-               end;
+             result:=first_addfloat;
+             if assigned(result) then
+               exit;
 {$endif cpufpemu}
 {$endif cpufpemu}
               if nodetype in [addn,subn,muln,andn,orn,xorn] then
               if nodetype in [addn,subn,muln,andn,orn,xorn] then
                 expectloc:=LOC_FPUREGISTER
                 expectloc:=LOC_FPUREGISTER

+ 0 - 87
compiler/ncgutil.pas

@@ -146,8 +146,6 @@ interface
 
 
     procedure gen_fpc_dummy(list : TAsmList);
     procedure gen_fpc_dummy(list : TAsmList);
 
 
-    procedure InsertInterruptTable;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -2154,89 +2152,4 @@ implementation
       end;
       end;
 
 
 
 
-    procedure InsertInterruptTable;
-
-      procedure WriteVector(const name: string);
-{$IFDEF arm}
-        var
-          ai: taicpu;
-{$ENDIF arm}
-        begin
-{$IFDEF arm}
-          if current_settings.cputype in [cpu_armv7m] then
-            current_asmdata.asmlists[al_globals].concat(tai_const.Createname(name,0))
-          else
-            begin
-              ai:=taicpu.op_sym(A_B,current_asmdata.RefAsmSymbol(name));
-              ai.is_jmp:=true;
-              current_asmdata.asmlists[al_globals].concat(ai);
-            end;
-{$ENDIF arm}
-        end;
-
-      function GetInterruptTableLength: longint;
-        begin
-{$if defined(ARM)}
-          result:=embedded_controllers[current_settings.controllertype].interruptvectors;
-{$else}
-          result:=0;
-{$endif}
-        end;
-
-      var
-        hp: tused_unit;
-        sym: tsym;
-        i, i2: longint;
-        interruptTable: array of tprocdef;
-        pd: tprocdef;
-      begin
-        SetLength(interruptTable, GetInterruptTableLength);
-        FillChar(interruptTable[0], length(interruptTable)*sizeof(pointer), 0);
-
-        hp:=tused_unit(usedunits.first);
-        while assigned(hp) do
-          begin
-            for i := 0 to hp.u.symlist.Count-1 do
-              begin
-                sym:=tsym(hp.u.symlist[i]);
-                if not assigned(sym) then
-                  continue;
-                if sym.typ = procsym then
-                  begin
-                    for i2 := 0 to tprocsym(sym).ProcdefList.Count-1 do
-                      begin
-                        pd:=tprocdef(tprocsym(sym).ProcdefList[i2]);
-                        if pd.interruptvector >= 0 then
-                          begin
-                            if pd.interruptvector > high(interruptTable) then
-                              Internalerror(2011030602);
-                            if interruptTable[pd.interruptvector] <> nil then
-                              internalerror(2011030601);
-
-                            interruptTable[pd.interruptvector]:=pd;
-                            break;
-                          end;
-                      end;
-                  end;
-              end;
-            hp:=tused_unit(hp.next);
-          end;
-
-        new_section(current_asmdata.asmlists[al_globals],sec_init,'VECTORS',sizeof(pint));
-        current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global('VECTORS',AT_DATA,0));
-{$IFDEF arm}
-        if current_settings.cputype in [cpu_armv7m] then
-          current_asmdata.asmlists[al_globals].concat(tai_const.Createname('_stack_top',0)); { ARMv7-M processors have the initial stack value at address 0 }
-{$ENDIF arm}
-
-        for i:=0 to high(interruptTable) do
-          begin
-            if interruptTable[i]<>nil then
-              writeVector(interruptTable[i].mangledname)
-            else
-              writeVector('DefaultHandler'); { Default handler name }
-          end;
-      end;
-
-
 end.
 end.

+ 0 - 17
compiler/pdecsub.pas

@@ -1484,26 +1484,9 @@ begin
 end;
 end;
 
 
 procedure pd_interrupt(pd:tabstractprocdef);
 procedure pd_interrupt(pd:tabstractprocdef);
-
-{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-var v: Tconstexprint;
-{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-
 begin
 begin
   if pd.parast.symtablelevel>normal_function_level then
   if pd.parast.symtablelevel>normal_function_level then
     Message(parser_e_dont_nest_interrupt);
     Message(parser_e_dont_nest_interrupt);
-
-{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-  if target_info.system in systems_interrupt_table then
-    begin
-      if token<>_SEMICOLON then
-        begin
-          pd.proccalloption:=pocall_interrupt;
-          v:=get_intconst;
-          Tprocdef(pd).interruptvector:=v.uvalue;
-        end;
-    end;
-{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
 end;
 end;
 
 
 procedure pd_abstract(pd:tabstractprocdef);
 procedure pd_abstract(pd:tabstractprocdef);

+ 0 - 5
compiler/pmodules.pas

@@ -2225,11 +2225,6 @@ type
          cnodeutils.InsertResStrTablesTable;
          cnodeutils.InsertResStrTablesTable;
          cnodeutils.InsertMemorySizes;
          cnodeutils.InsertMemorySizes;
 
 
-{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-         if target_info.system in systems_interrupt_table then
-           InsertInterruptTable;
-{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-
          { Insert symbol to resource info }
          { Insert symbol to resource info }
          cnodeutils.InsertResourceInfo(resources_used);
          cnodeutils.InsertResourceInfo(resources_used);
 
 

+ 1 - 1
compiler/powerpc/cpubase.pas

@@ -422,7 +422,7 @@ implementation
       rgbase,verbose;
       rgbase,verbose;
 
 
     const
     const
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i rppcstd.inc}
         {$i rppcstd.inc}
       );
       );
 
 

+ 1 - 1
compiler/powerpc64/cpubase.pas

@@ -424,7 +424,7 @@ uses
   rgBase, verbose, itcpugas;
   rgBase, verbose, itcpugas;
 
 
 const
 const
-  std_regname_table: array[tregisterindex] of string[7] = (
+  std_regname_table: array[tregisterindex] of string[10] = (
 {$I rppcstd.inc}
 {$I rppcstd.inc}
     );
     );
 
 

+ 5 - 0
compiler/psystem.pas

@@ -629,14 +629,19 @@ implementation
 {$endif SPARC}
 {$endif SPARC}
 {$ifdef arm}
 {$ifdef arm}
         aiclass[ait_thumb_func]:=tai_thumb_func;
         aiclass[ait_thumb_func]:=tai_thumb_func;
+        aiclass[ait_thumb_set]:=tai_thumb_set;
 {$endif arm}
 {$endif arm}
+        aiclass[ait_set]:=tai_set;
+        aiclass[ait_weak]:=tai_weak;
         aiclass[ait_cutobject]:=tai_cutobject;
         aiclass[ait_cutobject]:=tai_cutobject;
         aiclass[ait_regalloc]:=tai_regalloc;
         aiclass[ait_regalloc]:=tai_regalloc;
         aiclass[ait_tempalloc]:=tai_tempalloc;
         aiclass[ait_tempalloc]:=tai_tempalloc;
         aiclass[ait_marker]:=tai_marker;
         aiclass[ait_marker]:=tai_marker;
         aiclass[ait_seh_directive]:=tai_seh_directive;
         aiclass[ait_seh_directive]:=tai_seh_directive;
+{$ifdef JVM}
         aiclass[ait_jvar]:=tai_jvar;
         aiclass[ait_jvar]:=tai_jvar;
         aiclass[ait_jcatch]:=tai_jcatch;
         aiclass[ait_jcatch]:=tai_jcatch;
+{$endif JVM}
       end;
       end;
 
 
 end.
 end.

+ 33 - 2
compiler/raatt.pas

@@ -53,6 +53,7 @@ unit raatt;
         AS_ALIGN,AS_BALIGN,AS_P2ALIGN,AS_ASCII,
         AS_ALIGN,AS_BALIGN,AS_P2ALIGN,AS_ASCII,
         AS_ASCIIZ,AS_LCOMM,AS_COMM,AS_SINGLE,AS_DOUBLE,AS_EXTENDED,AS_CEXTENDED,
         AS_ASCIIZ,AS_LCOMM,AS_COMM,AS_SINGLE,AS_DOUBLE,AS_EXTENDED,AS_CEXTENDED,
         AS_DATA,AS_TEXT,AS_INIT,AS_FINI,AS_RVA,AS_END,
         AS_DATA,AS_TEXT,AS_INIT,AS_FINI,AS_RVA,AS_END,
+        AS_SET,AS_WEAK,AS_SECTION,
         {------------------ Assembler Operators  --------------------}
         {------------------ Assembler Operators  --------------------}
         AS_TYPE,AS_SIZEOF,AS_VMTOFFSET,AS_MOD,AS_SHL,AS_SHR,AS_NOT,AS_AND,AS_OR,AS_XOR,AS_NOR,AS_AT,
         AS_TYPE,AS_SIZEOF,AS_VMTOFFSET,AS_MOD,AS_SHL,AS_SHR,AS_NOT,AS_AND,AS_OR,AS_XOR,AS_NOR,AS_AT,
         AS_LO,AS_HI,
         AS_LO,AS_HI,
@@ -66,7 +67,7 @@ unit raatt;
       { These tokens should be modified accordingly to the modifications }
       { These tokens should be modified accordingly to the modifications }
       { in the different enumerations.                                   }
       { in the different enumerations.                                   }
       firstdirective = AS_DB;
       firstdirective = AS_DB;
-      lastdirective  = AS_END;
+      lastdirective  = AS_SECTION;
 
 
       token2str : array[tasmtoken] of tasmkeyword=(
       token2str : array[tasmtoken] of tasmkeyword=(
         '','Label','LLabel','string','integer',
         '','Label','LLabel','string','integer',
@@ -78,6 +79,7 @@ unit raatt;
         '.align','.balign','.p2align','.ascii',
         '.align','.balign','.p2align','.ascii',
         '.asciz','.lcomm','.comm','.single','.double','.tfloat','.tcfloat',
         '.asciz','.lcomm','.comm','.single','.double','.tfloat','.tcfloat',
         '.data','.text','.init','.fini','.rva','END',
         '.data','.text','.init','.fini','.rva','END',
+        '.set','.weak','.section',
         'TYPE','SIZEOF','VMTOFFSET','%','<<','>>','!','&','|','^','~','@','lo','hi',
         'TYPE','SIZEOF','VMTOFFSET','%','<<','>>','!','&','|','^','~','@','lo','hi',
         'directive');
         'directive');
 
 
@@ -972,9 +974,13 @@ unit raatt;
    Function tattreader.Assemble: tlinkedlist;
    Function tattreader.Assemble: tlinkedlist;
      Var
      Var
        hl         : tasmlabel;
        hl         : tasmlabel;
-       commname   : string;
+       commname,
+       symname,
+       symval     : string;
        lasTSec    : TAsmSectiontype;
        lasTSec    : TAsmSectiontype;
        l1,l2      : longint;
        l1,l2      : longint;
+       symofs     : aint;
+       symtyp     : TAsmsymtype;
      Begin
      Begin
        Message1(asmr_d_start_reading,'GNU AS');
        Message1(asmr_d_start_reading,'GNU AS');
        firsttoken:=TRUE;
        firsttoken:=TRUE;
@@ -1200,6 +1206,31 @@ unit raatt;
                BuildRva;
                BuildRva;
              end;
              end;
 
 
+           AS_SET:
+             begin
+               Consume(AS_SET);
+               BuildConstSymbolExpression(true,false,false, symofs,symname,symtyp);
+               Consume(AS_COMMA);
+               BuildConstSymbolExpression(true,false,false, symofs,symval,symtyp);
+
+               curList.concat(tai_set.create(symname,symval));
+             end;
+
+           AS_WEAK:
+             begin
+               Consume(AS_WEAK);
+               BuildConstSymbolExpression(true,false,false, l1,symname,symtyp);
+               curList.concat(tai_weak.create(symname));
+             end;
+
+           AS_SECTION:
+             begin
+               Consume(AS_SECTION);
+               new_section(curlist, sec_user, actasmpattern, 0);
+               //curList.concat(tai_section.create(sec_user, actasmpattern, 0));
+               consume(AS_STRING);
+             end;
+
            AS_TARGET_DIRECTIVE:
            AS_TARGET_DIRECTIVE:
              HandleTargetDirective;
              HandleTargetDirective;
 
 

+ 1 - 1
compiler/rgbase.pas

@@ -29,7 +29,7 @@ interface
       cpuBase,cgBase;
       cpuBase,cgBase;
 
 
     type
     type
-      TRegNameTable = array[tregisterindex] of string[7];
+      TRegNameTable = array[tregisterindex] of string[10];
       TRegisterIndexTable = array[tregisterindex] of tregisterindex;
       TRegisterIndexTable = array[tregisterindex] of tregisterindex;
 
 
     function findreg_by_number_table(r:Tregister;const regnumber_index:TRegisterIndexTable):tregisterindex;
     function findreg_by_number_table(r:Tregister;const regnumber_index:TRegisterIndexTable):tregisterindex;

+ 0 - 11
compiler/symdef.pas

@@ -638,8 +638,6 @@ interface
 {$ifdef oldregvars}
 {$ifdef oldregvars}
           regvarinfo: pregvarinfo;
           regvarinfo: pregvarinfo;
 {$endif oldregvars}
 {$endif oldregvars}
-          { interrupt vector }
-          interruptvector : longint;
           { First/last assembler symbol/instruction in aasmoutput list.
           { First/last assembler symbol/instruction in aasmoutput list.
             Note: initialised after compiling the code for the procdef, but
             Note: initialised after compiling the code for the procdef, but
               not saved to/restored from ppu. Used when inserting debug info }
               not saved to/restored from ppu. Used when inserting debug info }
@@ -4079,7 +4077,6 @@ implementation
 {$ifdef i386}
 {$ifdef i386}
           fpu_used:=maxfpuregs;
           fpu_used:=maxfpuregs;
 {$endif i386}
 {$endif i386}
-         interruptvector:=-1;
       end;
       end;
 
 
 
 
@@ -4125,10 +4122,6 @@ implementation
          else
          else
            import_name:=nil;
            import_name:=nil;
          import_nr:=ppufile.getword;
          import_nr:=ppufile.getword;
-{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-         if target_info.system in systems_interrupt_table then
-           interruptvector:=ppufile.getlongint;
-{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
          if (po_msgint in procoptions) then
          if (po_msgint in procoptions) then
            messageinf.i:=ppufile.getlongint;
            messageinf.i:=ppufile.getlongint;
          if (po_msgstr in procoptions) then
          if (po_msgstr in procoptions) then
@@ -4275,10 +4268,6 @@ implementation
          if po_has_importname in procoptions then
          if po_has_importname in procoptions then
            ppufile.putstring(import_name^);
            ppufile.putstring(import_name^);
          ppufile.putword(import_nr);
          ppufile.putword(import_nr);
-{$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-         if target_info.system in systems_interrupt_table then
-           ppufile.putlongint(interruptvector);
-{$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
          if (po_msgint in procoptions) then
          if (po_msgint in procoptions) then
            ppufile.putlongint(messageinf.i);
            ppufile.putlongint(messageinf.i);
          if (po_msgstr in procoptions) then
          if (po_msgstr in procoptions) then

+ 0 - 9
compiler/systems.pas

@@ -303,15 +303,6 @@ interface
 
 
        systems_internal_sysinit = [system_i386_linux,system_i386_win32];
        systems_internal_sysinit = [system_i386_linux,system_i386_win32];
 
 
-       {$ifdef FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-       { If anyone wants to use interrupt for
-         a specific target, add a
-         $define FPC_HAS_SYSTEMS_INTERRUPT_TABLE
-         to fpcdefs.inc to reactivate
-         the corresponding code }
-       systems_interrupt_table = [{system_arm_embedded}];
-       {$endif FPC_HAS_SYSTEMS_INTERRUPT_TABLE}
-
        { all systems that use garbage collection for reference-counted types }
        { all systems that use garbage collection for reference-counted types }
        systems_garbage_collected_managed_types = [
        systems_garbage_collected_managed_types = [
          system_jvm_java32,
          system_jvm_java32,

+ 32 - 3
compiler/systems/t_embed.pas

@@ -232,9 +232,38 @@ begin
       ct_at91sam7x256,
       ct_at91sam7x256,
       ct_at91sam7xc256,
       ct_at91sam7xc256,
 
 
-      ct_stm32f103rb,
-      ct_stm32f103re,
-      ct_stm32f103c4t,
+      ct_stm32f100x4,
+      ct_stm32f100x6,
+      ct_stm32f100x8,
+      ct_stm32f100xB,
+      ct_stm32f100xC,
+      ct_stm32f100xD,
+      ct_stm32f100xE,
+      ct_stm32f101x4,
+      ct_stm32f101x6,
+      ct_stm32f101x8,
+      ct_stm32f101xB,
+      ct_stm32f101xC,
+      ct_stm32f101xD,
+      ct_stm32f101xE,
+      ct_stm32f101xF,
+      ct_stm32f101xG,
+      ct_stm32f102x4,
+      ct_stm32f102x6,
+      ct_stm32f102x8,
+      ct_stm32f102xB,
+      ct_stm32f103x4,
+      ct_stm32f103x6,
+      ct_stm32f103x8,
+      ct_stm32f103xB,
+      ct_stm32f103xC,
+      ct_stm32f103xD,
+      ct_stm32f103xE,
+      ct_stm32f103xF,
+      ct_stm32f103xG,
+      ct_stm32f107x8,
+      ct_stm32f107xB,
+      ct_stm32f107xC,
 
 
       { TI - 64 K Flash, 16 K SRAM Devices }
       { TI - 64 K Flash, 16 K SRAM Devices }
       ct_lm3s1110,
       ct_lm3s1110,

+ 2 - 2
compiler/x86/cpubase.pas

@@ -268,7 +268,7 @@ implementation
 
 
     const
     const
     {$ifdef x86_64}
     {$ifdef x86_64}
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i r8664std.inc}
         {$i r8664std.inc}
       );
       );
 
 
@@ -279,7 +279,7 @@ implementation
         {$i r8664sri.inc}
         {$i r8664sri.inc}
       );
       );
     {$else x86_64}
     {$else x86_64}
-      std_regname_table : array[tregisterindex] of string[7] = (
+      std_regname_table : array[tregisterindex] of string[10] = (
         {$i r386std.inc}
         {$i r386std.inc}
       );
       );
 
 

+ 9 - 0
rtl/arm/thumb2.inc

@@ -33,10 +33,19 @@ Procedure SysInitFPU;{$ifdef SYSTEMINLINE}inline;{$endif}
 begin
 begin
   { Enable FPU exceptions, but disable INEXACT, UNDERFLOW, DENORMAL }
   { Enable FPU exceptions, but disable INEXACT, UNDERFLOW, DENORMAL }
   asm
   asm
+    {$IFDEF FPUFPV4_S16}
+    movw r0, #(0xed88)
+    movt r0, #(0xe000)
+    ldr r1, [r0]
+    orr r1, r1, #(0xF << 20)
+    str r1, [r0]
+    bx lr
+    {$ELSE FPUFPV4_S16}
     rfs r0
     rfs r0
     and r0,r0,#0xffe0ffff
     and r0,r0,#0xffe0ffff
     orr r0,r0,#0x00070000
     orr r0,r0,#0x00070000
     wfs r0
     wfs r0
+    {$endif FPUFPV4_S16}
   end;
   end;
 end;
 end;
 {$endif}
 {$endif}

+ 100 - 7
rtl/embedded/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/04/25]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/09/26]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
@@ -210,6 +210,14 @@ endif
 ifeq ($(OS_TARGET),linux)
 ifeq ($(OS_TARGET),linux)
 linuxHier=1
 linuxHier=1
 endif
 endif
+ifndef CROSSCOMPILE
+BUILDFULLNATIVE=1
+export BUILDFULLNATIVE
+endif
+ifdef BUILDFULLNATIVE
+BUILDNATIVE=1
+export BUILDNATIVE
+endif
 export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
 export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
 ifdef FPCDIR
 ifdef FPCDIR
 override FPCDIR:=$(subst \,/,$(FPCDIR))
 override FPCDIR:=$(subst \,/,$(FPCDIR))
@@ -311,7 +319,7 @@ CPU_UNITS=
 SYSINIT_UNITS=
 SYSINIT_UNITS=
 ifeq ($(ARCH),arm)
 ifeq ($(ARCH),arm)
 ifeq ($(SUBARCH),armv7m)
 ifeq ($(SUBARCH),armv7m)
-CPU_UNITS=lm3fury lm3tempest stm32f103 lpc1768 # thumb2_bare
+CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl stm32f10x_conn lpc1768 # thumb2_bare
 endif
 endif
 ifeq ($(SUBARCH),armv4t)
 ifeq ($(SUBARCH),armv4t)
 CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
 CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
@@ -1681,17 +1689,12 @@ endif
 endif
 endif
 ifdef CREATESHARED
 ifdef CREATESHARED
 override FPCOPT+=-Cg
 override FPCOPT+=-Cg
-ifeq ($(CPU_TARGET),i386)
-override FPCOPT+=-Aas
 endif
 endif
-endif
-ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
 ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 override FPCOPT+=-Cg
 endif
 endif
 endif
 endif
-endif
 ifdef LINKSHARED
 ifdef LINKSHARED
 endif
 endif
 ifdef OPT
 ifdef OPT
@@ -2066,6 +2069,96 @@ endif
 fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 fpc_makefiles: fpc_makefile fpc_makefile_dirs
 fpc_makefiles: fpc_makefile fpc_makefile_dirs
+ifdef TARGET_DIRS_TARGET_DIRS
+TARGET_DIRS_all:
+	$(MAKE) -C TARGET_DIRS all
+TARGET_DIRS_debug:
+	$(MAKE) -C TARGET_DIRS debug
+TARGET_DIRS_smart:
+	$(MAKE) -C TARGET_DIRS smart
+TARGET_DIRS_release:
+	$(MAKE) -C TARGET_DIRS release
+TARGET_DIRS_units:
+	$(MAKE) -C TARGET_DIRS units
+TARGET_DIRS_examples:
+	$(MAKE) -C TARGET_DIRS examples
+TARGET_DIRS_shared:
+	$(MAKE) -C TARGET_DIRS shared
+TARGET_DIRS_install:
+	$(MAKE) -C TARGET_DIRS install
+TARGET_DIRS_sourceinstall:
+	$(MAKE) -C TARGET_DIRS sourceinstall
+TARGET_DIRS_exampleinstall:
+	$(MAKE) -C TARGET_DIRS exampleinstall
+TARGET_DIRS_distinstall:
+	$(MAKE) -C TARGET_DIRS distinstall
+TARGET_DIRS_zipinstall:
+	$(MAKE) -C TARGET_DIRS zipinstall
+TARGET_DIRS_zipsourceinstall:
+	$(MAKE) -C TARGET_DIRS zipsourceinstall
+TARGET_DIRS_zipexampleinstall:
+	$(MAKE) -C TARGET_DIRS zipexampleinstall
+TARGET_DIRS_zipdistinstall:
+	$(MAKE) -C TARGET_DIRS zipdistinstall
+TARGET_DIRS_clean:
+	$(MAKE) -C TARGET_DIRS clean
+TARGET_DIRS_distclean:
+	$(MAKE) -C TARGET_DIRS distclean
+TARGET_DIRS_cleanall:
+	$(MAKE) -C TARGET_DIRS cleanall
+TARGET_DIRS_info:
+	$(MAKE) -C TARGET_DIRS info
+TARGET_DIRS_makefiles:
+	$(MAKE) -C TARGET_DIRS makefiles
+TARGET_DIRS:
+	$(MAKE) -C TARGET_DIRS all
+.PHONY: TARGET_DIRS_all TARGET_DIRS_debug TARGET_DIRS_smart TARGET_DIRS_release TARGET_DIRS_units TARGET_DIRS_examples TARGET_DIRS_shared TARGET_DIRS_install TARGET_DIRS_sourceinstall TARGET_DIRS_exampleinstall TARGET_DIRS_distinstall TARGET_DIRS_zipinstall TARGET_DIRS_zipsourceinstall TARGET_DIRS_zipexampleinstall TARGET_DIRS_zipdistinstall TARGET_DIRS_clean TARGET_DIRS_distclean TARGET_DIRS_cleanall TARGET_DIRS_info TARGET_DIRS_makefiles TARGET_DIRS
+endif
+ifdef TARGET_EXAMPLEDIRS_TARGET_EXAMPLEDIRS
+TARGET_EXAMPLEDIRS_all:
+	$(MAKE) -C TARGET_EXAMPLEDIRS all
+TARGET_EXAMPLEDIRS_debug:
+	$(MAKE) -C TARGET_EXAMPLEDIRS debug
+TARGET_EXAMPLEDIRS_smart:
+	$(MAKE) -C TARGET_EXAMPLEDIRS smart
+TARGET_EXAMPLEDIRS_release:
+	$(MAKE) -C TARGET_EXAMPLEDIRS release
+TARGET_EXAMPLEDIRS_units:
+	$(MAKE) -C TARGET_EXAMPLEDIRS units
+TARGET_EXAMPLEDIRS_examples:
+	$(MAKE) -C TARGET_EXAMPLEDIRS examples
+TARGET_EXAMPLEDIRS_shared:
+	$(MAKE) -C TARGET_EXAMPLEDIRS shared
+TARGET_EXAMPLEDIRS_install:
+	$(MAKE) -C TARGET_EXAMPLEDIRS install
+TARGET_EXAMPLEDIRS_sourceinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS sourceinstall
+TARGET_EXAMPLEDIRS_exampleinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS exampleinstall
+TARGET_EXAMPLEDIRS_distinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS distinstall
+TARGET_EXAMPLEDIRS_zipinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipinstall
+TARGET_EXAMPLEDIRS_zipsourceinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipsourceinstall
+TARGET_EXAMPLEDIRS_zipexampleinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipexampleinstall
+TARGET_EXAMPLEDIRS_zipdistinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipdistinstall
+TARGET_EXAMPLEDIRS_clean:
+	$(MAKE) -C TARGET_EXAMPLEDIRS clean
+TARGET_EXAMPLEDIRS_distclean:
+	$(MAKE) -C TARGET_EXAMPLEDIRS distclean
+TARGET_EXAMPLEDIRS_cleanall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS cleanall
+TARGET_EXAMPLEDIRS_info:
+	$(MAKE) -C TARGET_EXAMPLEDIRS info
+TARGET_EXAMPLEDIRS_makefiles:
+	$(MAKE) -C TARGET_EXAMPLEDIRS makefiles
+TARGET_EXAMPLEDIRS:
+	$(MAKE) -C TARGET_EXAMPLEDIRS all
+.PHONY: TARGET_EXAMPLEDIRS_all TARGET_EXAMPLEDIRS_debug TARGET_EXAMPLEDIRS_smart TARGET_EXAMPLEDIRS_release TARGET_EXAMPLEDIRS_units TARGET_EXAMPLEDIRS_examples TARGET_EXAMPLEDIRS_shared TARGET_EXAMPLEDIRS_install TARGET_EXAMPLEDIRS_sourceinstall TARGET_EXAMPLEDIRS_exampleinstall TARGET_EXAMPLEDIRS_distinstall TARGET_EXAMPLEDIRS_zipinstall TARGET_EXAMPLEDIRS_zipsourceinstall TARGET_EXAMPLEDIRS_zipexampleinstall TARGET_EXAMPLEDIRS_zipdistinstall TARGET_EXAMPLEDIRS_clean TARGET_EXAMPLEDIRS_distclean TARGET_EXAMPLEDIRS_cleanall TARGET_EXAMPLEDIRS_info TARGET_EXAMPLEDIRS_makefiles TARGET_EXAMPLEDIRS
+endif
 all: fpc_all
 all: fpc_all
 debug: fpc_debug
 debug: fpc_debug
 smart: fpc_smart
 smart: fpc_smart

+ 1 - 1
rtl/embedded/Makefile.fpc

@@ -49,7 +49,7 @@ SYSINIT_UNITS=
 
 
 ifeq ($(ARCH),arm)
 ifeq ($(ARCH),arm)
 ifeq ($(SUBARCH),armv7m)
 ifeq ($(SUBARCH),armv7m)
-CPU_UNITS=lm3fury lm3tempest stm32f103 lpc1768 # thumb2_bare
+CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl stm32f10x_conn lpc1768 # thumb2_bare
 endif
 endif
 ifeq ($(SUBARCH),armv4t)
 ifeq ($(SUBARCH),armv4t)
 CPU_UNITS=lpc21x4 at91sam7x256 sc32442b
 CPU_UNITS=lpc21x4 at91sam7x256 sc32442b

+ 52 - 0
rtl/embedded/arm/cortexm3_start.inc

@@ -0,0 +1,52 @@
+var
+ _stack_top: record end; external name '_stack_top';
+ _data: record end; external name '_data';
+ _edata: record end; external name '_edata';
+ _etext: record end; external name '_etext';
+ _bss_start: record end; external name '_bss_start';
+ _bss_end: record end; external name '_bss_end';
+
+procedure Pascalmain; external name 'PASCALMAIN';
+
+procedure HaltProc; assembler; nostackframe; public name'_haltproc';
+asm
+.Lloop:
+   b .Lloop
+end;
+
+procedure Startup; assembler; nostackframe; [public, alias: '_START'];
+asm
+  ldr r1,.L_etext
+  ldr r2,.L_data
+  ldr r3,.L_edata
+.Lcopyloop:
+  cmp r2,r3
+  ittt ls
+  ldrls r0,[r1],#4
+  strls r0,[r2],#4
+  bls .Lcopyloop
+
+  // clear onboard ram
+  ldr r1,.L_bss_start
+  ldr r2,.L_bss_end
+  mov r0,#0
+.Lzeroloop:
+  cmp r1,r2
+  itt ls
+  strls r0,[r1],#4
+  bls .Lzeroloop
+
+  bl PASCALMAIN
+  b HaltProc
+
+.L_bss_start:
+  .long _bss_start
+.L_bss_end:
+  .long _bss_end
+.L_etext:
+  .long _etext
+.L_data:
+  .long _data
+.L_edata:
+  .long _edata
+end;

+ 200 - 223
rtl/embedded/arm/lm3fury.pp

@@ -61,234 +61,211 @@ unit lm3fury;
       rcgc1			:dword absolute (sysconoffset+$104);
       rcgc1			:dword absolute (sysconoffset+$104);
       rcgc2			:dword absolute (sysconoffset+$108);
       rcgc2			:dword absolute (sysconoffset+$108);
 
 
-
-    var
-      NMI_Handler,
-      HardFault_Handler,
-      MemManage_Handler,
-      BusFault_Handler,
-      UsageFault_Handler,
-      SWI_Handler,
-      DebugMonitor_Handler,
-      PendingSV_Handler,
-      Systick_Handler,UART0intvector: pointer;
-	
   implementation
   implementation
 
 
-    var
-      _data: record end; external name '_data';
-      _edata: record end; external name '_edata';
-      _etext: record end; external name '_etext';
-      _bss_start: record end; external name '_bss_start';
-      _bss_end: record end; external name '_bss_end';
-      _stack_top: record end; external name '_stack_top';
-
-    procedure PASCALMAIN; external name 'PASCALMAIN';
-
-    procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
-      asm
-        .Lhalt:
-	  b .Lhalt
-      end;
-
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure GPIO_Port_A_Interrupt; external name 'GPIO_Port_A_Interrupt';
+procedure GPIO_Port_B_Interrupt; external name 'GPIO_Port_B_Interrupt';
+procedure GPIO_Port_C_Interrupt; external name 'GPIO_Port_C_Interrupt';
+procedure GPIO_Port_D_Interrupt; external name 'GPIO_Port_D_Interrupt';
+procedure GPIO_Port_E_Interrupt; external name 'GPIO_Port_E_Interrupt';
+procedure UART0_Interrupt; external name 'UART0_Interrupt';
+procedure UART1_Interrupt; external name 'UART1_Interrupt';
+procedure SSI0_Interrupt; external name 'SSI0_Interrupt';
+procedure I2C0_Interrupt; external name 'I2C0_Interrupt';
+procedure ADC0_Sequence_0_Interrupt; external name 'ADC0_Sequence_0_Interrupt';
+procedure ADC0_Sequence_1_Interrupt; external name 'ADC0_Sequence_1_Interrupt';
+procedure ADC0_Sequence_2_Interrupt; external name 'ADC0_Sequence_2_Interrupt';
+procedure ADC0_Sequence_3_Interrupt; external name 'ADC0_Sequence_3_Interrupt';
+procedure Watchdog_Timer_0_Interrupt; external name 'Watchdog_Timer_0_Interrupt';
+procedure Timer_0A_Interrupt; external name 'Timer_0A_Interrupt';
+procedure Timer_0B_Interrupt; external name 'Timer_0B_Interrupt';
+procedure Timer_1A_Interrupt; external name 'Timer_1A_Interrupt';
+procedure Timer_1B_Interrupt; external name 'Timer_1B_Interrupt';
+procedure Timer_2A_Interrupt; external name 'Timer_2A_Interrupt';
+procedure Timer_2B_Interrupt; external name 'Timer_2B_Interrupt';
+procedure Analog_Comparator_0_Interrupt; external name 'Analog_Comparator_0_Interrupt';
+procedure Analog_Comparator_1_Interrupt; external name 'Analog_Comparator_1_Interrupt';
+procedure Analog_Comparator_2_Interrupt; external name 'Analog_Comparator_2_Interrupt';
+procedure System_Control_Interrupt; external name 'System_Control_Interrupt';
+procedure Flash_Memory_Control_Interrupt; external name 'Flash_Memory_Control_Interrupt';
+procedure GPIO_Port_F_Interrupt; external name 'GPIO_Port_F_Interrupt';
+procedure GPIO_Port_G_Interrupt; external name 'GPIO_Port_G_Interrupt';
+procedure GPIO_Port_H_Interrupt; external name 'GPIO_Port_H_Interrupt';
+procedure UART2_Interrupt; external name 'UART2_Interrupt';
+procedure SSI1_Interrupt; external name 'SSI1_Interrupt';
+procedure Timer_3A_Interrupt; external name 'Timer_3A_Interrupt';
+procedure Timer_3B_Interrupt; external name 'Timer_3B_Interrupt';
+procedure I2C1_Interrupt; external name 'I2C1_Interrupt';
+procedure Hibernation_Module_Interrupt; external name 'Hibernation_Module_Interrupt';
 
 
-    procedure _FPC_start; assembler; nostackframe;
-      label
-        _start;
-      asm
-	.init
-	.align 16
-	
-	.long _stack_top	 			// First entry in NVIC table is the new stack pointer
-	.long _start+1         //gjb changed from stm32f version to avoid invstate error when interrupt fires
-	//b   _start					// Reset
-	.long _start+1
-	//b	 .LNMI_Addr				// Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
-	.long _start+1
-	//b	 .LHardFault_Addr		// All class of fault
-	.long _start+1
-	//b	 .LMemManage_Addr		// Memory management
-	.long _start+1
-	//b	 .LBusFault_Addr		// Pre-fetch fault, memory access fault
-	.long _start+1
-	//b	 .LUsageFault_Addr	// Undefined instruction or illegal state
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LSWI_Addr				// Software Interrupt vector now SVC
-	.long _start+1
-	//b	 .LDebugMonitor_Addr	// Debug Monitor
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LPendingSV_Addr		//	Pendable request for system service
-	.long _start+1
-	//b	 .LSystick_Addr		// System tick timer
-	//16
-	.long .LDefaultHandler+1     //GPIOA  #0
-	.long .LDefaultHandler+1     //GPIOB
-	.long .LDefaultHandler+1     //GPIOC
-	.long .LDefaultHandler+1     //GPIOD
-	.long .LDefaultHandler+1     //GPIOE
-	.long .LUART0handler+1       //.LDefaultHandler+1     //UART0
-	.long .LDefaultHandler+1     //UART1
-	.long .LDefaultHandler+1     //SSI0
-	//24
-	.long .LDefaultHandler+1     //I2C0   #8
-	.long .LDefaultHandler+1     //PWMF
-	.long .LDefaultHandler+1     //PWMG0
-	.long .LDefaultHandler+1     //PWMG1
-	.long .LDefaultHandler+1     //PWMG2
-	.long .LDefaultHandler+1     //QEI0
-	.long .LDefaultHandler+1     //ADC0S0
-	.long .LDefaultHandler+1     //ADC0S1
-	//32
-	.long .LDefaultHandler+1     //ADC0S2 #16
-	.long .LDefaultHandler+1     //ADC0S3
-	.long .LDefaultHandler+1     //WDGTimer01
-	.long .LDefaultHandler+1     //T0A
-	.long .LDefaultHandler+1     //T0B
-	.long .LDefaultHandler+1     //T1A
-	.long .LDefaultHandler+1     //T1B
-	.long .LDefaultHandler+1     //T2A
-	//40
-	.long .LDefaultHandler+1     //T2B    #24
-	.long .LDefaultHandler+1     //COMP0
-	.long .LDefaultHandler+1     //COMP1
-	.long .LDefaultHandler+1     //COMP2
-	.long .LDefaultHandler+1     //SYSCON
-	.long .LDefaultHandler+1     //FLASH
-	.long .LDefaultHandler+1     //GPIOF
-	.long .LDefaultHandler+1     //GPIOG
-	//48
-	.long .LDefaultHandler+1     //GPIOH  #32
-	.long .LDefaultHandler+1     //UART2
-	.long .LDefaultHandler+1     //SSI1
-	.long .LDefaultHandler+1     //T3A
-	.long .LDefaultHandler+1     //T3B
-	.long .LDefaultHandler+1     //I2C1
-	.long .LDefaultHandler+1     //QEI1
-	.long .LDefaultHandler+1     //CAN0
-	//56
-	.long .LDefaultHandler+1     //CAN1   #40
-	.long .LDefaultHandler+1     //res
-	.long .LDefaultHandler+1     //ETH
-	.long .LDefaultHandler+1     //res
-	.long .LDefaultHandler+1     //USB
-	.long .LDefaultHandler+1     //PWMG3
-	.long .LDefaultHandler+1     //UDMAS
-	.long .LDefaultHandler+1     //UDMAE
-	//64
-	.long .LDefaultHandler+1     //ADC1S0 #48
-	.long .LDefaultHandler+1     //ADC1S1
-	.long .LDefaultHandler+1     //ADC1S2
-	.long .LDefaultHandler+1     //ADC1S3
-	.long .LDefaultHandler+1     //I2S0
-	.long .LDefaultHandler+1     //EPI
-	.long .LDefaultHandler+1     //GPIOJ
-	.long .LDefaultHandler+1     //res    #55
+{$i cortexm3_start.inc}
 
 
-.LNMI_Addr:
-	ldr r0,.L1
-	ldr pc,[r0]
-.LHardFault_Addr:
-	ldr r0,.L2
-	ldr pc,[r0]
-.LMemManage_Addr:
-	ldr r0,.L3
-	ldr pc,[r0]
-.LBusFault_Addr:
-	ldr r0,.L4
-	ldr pc,[r0]
-.LUsageFault_Addr:
-	ldr r0,.L5
-	ldr pc,[r0]
-.LSWI_Addr:
-	ldr r0,.L6
-	ldr pc,[r0]
-.LDebugMonitor_Addr:
-	ldr r0,.L7
-	ldr pc,[r0]
-.LPendingSV_Addr:
-	ldr r0,.L8
-	ldr pc,[r0]
-.LSystick_Addr:
-	ldr r0,.L9
-	ldr pc,[r0]
-.LUART0handler:
-  ldr r0,.L10
-  ldr pc,[r0]
-.L1:
-	.long NMI_Handler
-.L2:
-	.long HardFault_Handler
-.L3:
-	.long MemManage_Handler
-.L4:
-	.long BusFault_Handler
-.L5:
-	.long UsageFault_Handler
-.L6:
-	.long SWI_Handler
-.L7:
-	.long DebugMonitor_Handler
-.L8:
-	.long PendingSV_Handler
-.L9:
-	.long Systick_Handler   
-.L10:
-  .long UART0IntVector
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+  .section ".init.interrupt_vectors"
+interrupt_vectors:
+	.long _stack_top
+  .long Startup
+  .long NMI_interrupt
+  .long Hardfault_interrupt
+  .long MemManage_interrupt
+  .long BusFault_interrupt
+  .long UsageFault_interrupt
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long SWI_interrupt
+  .long DebugMonitor_interrupt
+  .long 0
+  .long PendingSV_interrupt
+  .long SysTick_interrupt
   
   
-	.globl _start
-	.text
-_start:
-	
-	// Copy initialized data to ram
-	ldr r1,.L_etext
-	ldr r2,.L_data
-	ldr r3,.L_edata
-.Lcopyloop:
-	cmp r2,r3
-	ittt ls
-	ldrls r0,[r1],#4
-	strls r0,[r2],#4
-	bls .Lcopyloop
-
-	// clear onboard ram
-	ldr r1,.L_bss_start
-	ldr r2,.L_bss_end
-	mov r0,#0
-.Lzeroloop:
-	cmp r1,r2
-	itt ls
-	strls r0,[r1],#4
-	bls .Lzeroloop
-
-	b PASCALMAIN
-	b _FPC_haltproc
-
-.L_bss_start:
-	.long _bss_start
-.L_bss_end:
-	.long _bss_end
-.L_etext:
-	.long _etext
-.L_data:
-	.long _data
-.L_edata:
-	.long _edata
-.LDefaultHandlerAddr:
-	.long .LDefaultHandler
-	// default irq handler just returns
-.LDefaultHandler:
-	mov pc,r14
-    end;
+  .long GPIO_Port_A_Interrupt
+  .long GPIO_Port_B_Interrupt
+  .long GPIO_Port_C_Interrupt
+  .long GPIO_Port_D_Interrupt
+  .long GPIO_Port_E_Interrupt
+  .long UART0_Interrupt
+  .long UART1_Interrupt
+  .long SSI0_Interrupt
+  .long I2C0_Interrupt
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long ADC0_Sequence_0_Interrupt
+  .long ADC0_Sequence_1_Interrupt
+  .long ADC0_Sequence_2_Interrupt
+  .long ADC0_Sequence_3_Interrupt
+  .long Watchdog_Timer_0_Interrupt
+  .long Timer_0A_Interrupt
+  .long Timer_0B_Interrupt
+  .long Timer_1A_Interrupt
+  .long Timer_1B_Interrupt
+  .long Timer_2A_Interrupt
+  .long Timer_2B_Interrupt
+  .long Analog_Comparator_0_Interrupt
+  .long Analog_Comparator_1_Interrupt
+  .long Analog_Comparator_2_Interrupt
+  .long System_Control_Interrupt
+  .long Flash_Memory_Control_Interrupt
+  .long GPIO_Port_F_Interrupt
+  .long GPIO_Port_G_Interrupt
+  .long GPIO_Port_H_Interrupt
+  .long UART2_Interrupt
+  .long SSI1_Interrupt
+  .long Timer_3A_Interrupt
+  .long Timer_3B_Interrupt
+  .long I2C1_Interrupt
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long Hibernation_Module_Interrupt
+  
+  .weak NMI_interrupt
+  .weak Hardfault_interrupt
+  .weak MemManage_interrupt
+  .weak BusFault_interrupt
+  .weak UsageFault_interrupt
+  .weak SWI_interrupt
+  .weak DebugMonitor_interrupt
+  .weak PendingSV_interrupt
+  .weak SysTick_interrupt
+  .weak GPIO_Port_A_Interrupt
+  .weak GPIO_Port_B_Interrupt
+  .weak GPIO_Port_C_Interrupt
+  .weak GPIO_Port_D_Interrupt
+  .weak GPIO_Port_E_Interrupt
+  .weak UART0_Interrupt
+  .weak UART1_Interrupt
+  .weak SSI0_Interrupt
+  .weak I2C0_Interrupt
+  .weak ADC0_Sequence_0_Interrupt
+  .weak ADC0_Sequence_1_Interrupt
+  .weak ADC0_Sequence_2_Interrupt
+  .weak ADC0_Sequence_3_Interrupt
+  .weak Watchdog_Timer_0_Interrupt
+  .weak Timer_0A_Interrupt
+  .weak Timer_0B_Interrupt
+  .weak Timer_1A_Interrupt
+  .weak Timer_1B_Interrupt
+  .weak Timer_2A_Interrupt
+  .weak Timer_2B_Interrupt
+  .weak Analog_Comparator_0_Interrupt
+  .weak Analog_Comparator_1_Interrupt
+  .weak Analog_Comparator_2_Interrupt
+  .weak System_Control_Interrupt
+  .weak Flash_Memory_Control_Interrupt
+  .weak GPIO_Port_F_Interrupt
+  .weak GPIO_Port_G_Interrupt
+  .weak GPIO_Port_H_Interrupt
+  .weak UART2_Interrupt
+  .weak SSI1_Interrupt
+  .weak Timer_3A_Interrupt
+  .weak Timer_3B_Interrupt
+  .weak I2C1_Interrupt
+  .weak Hibernation_Module_Interrupt
+  
+  .set NMI_interrupt, Startup
+  .set Hardfault_interrupt, Startup
+  .set MemManage_interrupt, Startup
+  .set BusFault_interrupt, Startup
+  .set UsageFault_interrupt, Startup
+  .set SWI_interrupt, Startup
+  .set DebugMonitor_interrupt, Startup
+  .set PendingSV_interrupt, Startup
+  .set SysTick_interrupt, Startup
+  .set GPIO_Port_A_Interrupt, Startup
+  .set GPIO_Port_B_Interrupt, Startup
+  .set GPIO_Port_C_Interrupt, Startup
+  .set GPIO_Port_D_Interrupt, Startup
+  .set GPIO_Port_E_Interrupt, Startup
+  .set UART0_Interrupt, Startup
+  .set UART1_Interrupt, Startup
+  .set SSI0_Interrupt, Startup
+  .set I2C0_Interrupt, Startup
+  .set ADC0_Sequence_0_Interrupt, Startup
+  .set ADC0_Sequence_1_Interrupt, Startup
+  .set ADC0_Sequence_2_Interrupt, Startup
+  .set ADC0_Sequence_3_Interrupt, Startup
+  .set Watchdog_Timer_0_Interrupt, Startup
+  .set Timer_0A_Interrupt, Startup
+  .set Timer_0B_Interrupt, Startup
+  .set Timer_1A_Interrupt, Startup
+  .set Timer_1B_Interrupt, Startup
+  .set Timer_2A_Interrupt, Startup
+  .set Timer_2B_Interrupt, Startup
+  .set Analog_Comparator_0_Interrupt, Startup
+  .set Analog_Comparator_1_Interrupt, Startup
+  .set Analog_Comparator_2_Interrupt, Startup
+  .set System_Control_Interrupt, Startup
+  .set Flash_Memory_Control_Interrupt, Startup
+  .set GPIO_Port_F_Interrupt, Startup
+  .set GPIO_Port_G_Interrupt, Startup
+  .set GPIO_Port_H_Interrupt, Startup
+  .set UART2_Interrupt, Startup
+  .set SSI1_Interrupt, Startup
+  .set Timer_3A_Interrupt, Startup
+  .set Timer_3B_Interrupt, Startup
+  .set I2C1_Interrupt, Startup
+  .set Hibernation_Module_Interrupt, Startup
+  
+  .text
+end;
 
 
 end.
 end.
 
 

+ 259 - 224
rtl/embedded/arm/lm3tempest.pp

@@ -60,238 +60,273 @@ unit lm3tempest;
       rcgc0			:dword absolute (sysconoffset+$100);
       rcgc0			:dword absolute (sysconoffset+$100);
       rcgc1			:dword absolute (sysconoffset+$104);
       rcgc1			:dword absolute (sysconoffset+$104);
       rcgc2			:dword absolute (sysconoffset+$108);
       rcgc2			:dword absolute (sysconoffset+$108);
-
-
-    var
-      NMI_Handler,
-      HardFault_Handler,
-      MemManage_Handler,
-      BusFault_Handler,
-      UsageFault_Handler,
-      SWI_Handler,
-      DebugMonitor_Handler,
-      PendingSV_Handler,
-      Systick_Handler,UART0intvector: pointer;
 	
 	
   implementation
   implementation
 
 
-    var
-      _data: record end; external name '_data';
-      _edata: record end; external name '_edata';
-      _etext: record end; external name '_etext';
-      _bss_start: record end; external name '_bss_start';
-      _bss_end: record end; external name '_bss_end';
-      _stack_top: record end; external name '_stack_top';
-
-    procedure PASCALMAIN; external name 'PASCALMAIN';
-
-    procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
-      asm
-        .Lhalt:
-	  b .Lhalt
-      end;
-
-
-    procedure _FPC_start; assembler; nostackframe;
-      label
-        _start;
-      asm
-	.init
-	.align 16
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure GPIO_Port_A_Interrupt; external name 'GPIO_Port_A_Interrupt';
+procedure GPIO_Port_B_Interrupt; external name 'GPIO_Port_B_Interrupt';
+procedure GPIO_Port_C_Interrupt; external name 'GPIO_Port_C_Interrupt';
+procedure GPIO_Port_D_Interrupt; external name 'GPIO_Port_D_Interrupt';
+procedure GPIO_Port_E_Interrupt; external name 'GPIO_Port_E_Interrupt';
+procedure UART0_Interrupt; external name 'UART0_Interrupt';
+procedure UART1_Interrupt; external name 'UART1_Interrupt';
+procedure SSI0_Interrupt; external name 'SSI0_Interrupt';
+procedure I2C0_Interrupt; external name 'I2C0_Interrupt';
+procedure PWM_Fault_Interrupt; external name 'PWM_Fault_Interrupt';
+procedure PWM_Generator_0_Interrupt; external name 'PWM_Generator_0_Interrupt';
+procedure PWM_Generator_1_Interrupt; external name 'PWM_Generator_1_Interrupt';
+procedure PWM_Generator_2_Interrupt; external name 'PWM_Generator_2_Interrupt';
+procedure QEI0_Interrupt; external name 'QEI0_Interrupt';
+procedure ADC0_Sequence_0_Interrupt; external name 'ADC0_Sequence_0_Interrupt';
+procedure ADC0_Sequence_1_Interrupt; external name 'ADC0_Sequence_1_Interrupt';
+procedure ADC0_Sequence_2_Interrupt; external name 'ADC0_Sequence_2_Interrupt';
+procedure ADC0_Sequence_3_Interrupt; external name 'ADC0_Sequence_3_Interrupt';
+procedure Watchdog_Timers_0_and_1_Interrupt; external name 'Watchdog_Timers_0_and_1_Interrupt';
+procedure Timer_0A_Interrupt; external name 'Timer_0A_Interrupt';
+procedure Timer_0B_Interrupt; external name 'Timer_0B_Interrupt';
+procedure Timer_1A_Interrupt; external name 'Timer_1A_Interrupt';
+procedure Timer_1B_Interrupt; external name 'Timer_1B_Interrupt';
+procedure Timer_2A_Interrupt; external name 'Timer_2A_Interrupt';
+procedure Timer_2B_Interrupt; external name 'Timer_2B_Interrupt';
+procedure Analog_Comparator_0_Interrupt; external name 'Analog_Comparator_0_Interrupt';
+procedure Analog_Comparator_1_Interrupt; external name 'Analog_Comparator_1_Interrupt';
+procedure System_Control_Interrupt; external name 'System_Control_Interrupt';
+procedure Flash_Memory_Control_Interrupt; external name 'Flash_Memory_Control_Interrupt';
+procedure GPIO_Port_F_Interrupt; external name 'GPIO_Port_F_Interrupt';
+procedure GPIO_Port_G_Interrupt; external name 'GPIO_Port_G_Interrupt';
+procedure GPIO_Port_H_Interrupt; external name 'GPIO_Port_H_Interrupt';
+procedure UART2_Interrupt; external name 'UART2_Interrupt';
+procedure SSI1_Interrupt; external name 'SSI1_Interrupt';
+procedure Timer_3A_Interrupt; external name 'Timer_3A_Interrupt';
+procedure Timer_3B_Interrupt; external name 'Timer_3B_Interrupt';
+procedure I2C1_Interrupt; external name 'I2C1_Interrupt';
+procedure QEI1_Interrupt; external name 'QEI1_Interrupt';
+procedure CAN0_Interrupt; external name 'CAN0_Interrupt';
+procedure CAN1_Interrupt; external name 'CAN1_Interrupt';
+procedure Hibernation_Module_Interrupt; external name 'Hibernation_Module_Interrupt';
+procedure USB_Interrupt; external name 'USB_Interrupt';
+procedure uDMA_Software_Interrupt; external name 'uDMA_Software_Interrupt';
+procedure uDMA_Error_Interrupt; external name 'uDMA_Error_Interrupt';
+procedure ADC1_Sequence_0_Interrupt; external name 'ADC1_Sequence_0_Interrupt';
+procedure ADC1_Sequence_1_Interrupt; external name 'ADC1_Sequence_1_Interrupt';
+procedure ADC1_Sequence_2_Interrupt; external name 'ADC1_Sequence_2_Interrupt';
+procedure ADC1_Sequence_3_Interrupt; external name 'ADC1_Sequence_3_Interrupt';
+procedure I2S0_Interrupt; external name 'I2S0_Interrupt';
+procedure GPIO_Port_J_Interrupt; external name 'GPIO_Port_J_Interrupt';
 
 
-	// JEC NOTE: CONFIRMED AUG 2011 - address must manually have offset
-	//        the assembler / linker will NOT automatically add the LSB
-        //	  failure to have the LSB prevents coming up in Thumb2 mode
-	.long _stack_top	 			// First entry in NVIC table is the new stack pointer
-	.long _start+1         //gjb changed from stm32f version to avoid invstate error when interrupt fires
-	//b   _start					// Reset
-	.long _start+1
-	//b	 .LNMI_Addr				// Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
-	.long _start+1
-	//b	 .LHardFault_Addr		// All class of fault
-	.long _start+1
-	//b	 .LMemManage_Addr		// Memory management
-	.long _start+1
-	//b	 .LBusFault_Addr		// Pre-fetch fault, memory access fault
-	.long _start+1
-	//b	 .LUsageFault_Addr	// Undefined instruction or illegal state
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LSWI_Addr				// Software Interrupt vector now SVC
-	.long _start+1
-	//b	 .LDebugMonitor_Addr	// Debug Monitor
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LPendingSV_Addr		//	Pendable request for system service
-	.long _start+1
-	//b	 .LSystick_Addr		// System tick timer
-	//16
-	.long .LDefaultHandler+1     //GPIOA  #0
-	.long .LDefaultHandler+1     //GPIOB
-	.long .LDefaultHandler+1     //GPIOC
-	.long .LDefaultHandler+1     //GPIOD
-	.long .LDefaultHandler+1     //GPIOE
-	.long .LUART0handler+1       //.LDefaultHandler+1     //UART0
-	.long .LDefaultHandler+1     //UART1
-	.long .LDefaultHandler+1     //SSI0
-	//24
-	.long .LDefaultHandler+1     //I2C0   #8
-	.long .LDefaultHandler+1     //PWMF
-	.long .LDefaultHandler+1     //PWMG0
-	.long .LDefaultHandler+1     //PWMG1
-	.long .LDefaultHandler+1     //PWMG2
-	.long .LDefaultHandler+1     //QEI0
-	.long .LDefaultHandler+1     //ADC0S0
-	.long .LDefaultHandler+1     //ADC0S1
-	//32
-	.long .LDefaultHandler+1     //ADC0S2 #16
-	.long .LDefaultHandler+1     //ADC0S3
-	.long .LDefaultHandler+1     //WDGTimer01
-	.long .LDefaultHandler+1     //T0A
-	.long .LDefaultHandler+1     //T0B
-	.long .LDefaultHandler+1     //T1A
-	.long .LDefaultHandler+1     //T1B
-	.long .LDefaultHandler+1     //T2A
-	//40
-	.long .LDefaultHandler+1     //T2B    #24
-	.long .LDefaultHandler+1     //COMP0
-	.long .LDefaultHandler+1     //COMP1
-	.long .LDefaultHandler+1     //COMP2
-	.long .LDefaultHandler+1     //SYSCON
-	.long .LDefaultHandler+1     //FLASH
-	.long .LDefaultHandler+1     //GPIOF
-	.long .LDefaultHandler+1     //GPIOG
-	//48
-	.long .LDefaultHandler+1     //GPIOH  #32
-	.long .LDefaultHandler+1     //UART2
-	.long .LDefaultHandler+1     //SSI1
-	.long .LDefaultHandler+1     //T3A
-	.long .LDefaultHandler+1     //T3B
-	.long .LDefaultHandler+1     //I2C1
-	.long .LDefaultHandler+1     //QEI1
-	.long .LDefaultHandler+1     //CAN0
-	//56
-	.long .LDefaultHandler+1     //CAN1   #40
-	.long .LDefaultHandler+1     //res
-	.long .LDefaultHandler+1     //ETH
-	.long .LDefaultHandler+1     //res
-	.long .LDefaultHandler+1     //USB
-	.long .LDefaultHandler+1     //PWMG3
-	.long .LDefaultHandler+1     //UDMAS
-	.long .LDefaultHandler+1     //UDMAE
-	//64
-	.long .LDefaultHandler+1     //ADC1S0 #48
-	.long .LDefaultHandler+1     //ADC1S1
-	.long .LDefaultHandler+1     //ADC1S2
-	.long .LDefaultHandler+1     //ADC1S3
-	.long .LDefaultHandler+1     //I2S0
-	.long .LDefaultHandler+1     //EPI
-	.long .LDefaultHandler+1     //GPIOJ
-	.long .LDefaultHandler+1     //res    #55
+{$i cortexm3_start.inc}
 
 
-.LNMI_Addr:
-	ldr r0,.L1
-	ldr pc,[r0]
-.LHardFault_Addr:
-	ldr r0,.L2
-	ldr pc,[r0]
-.LMemManage_Addr:
-	ldr r0,.L3
-	ldr pc,[r0]
-.LBusFault_Addr:
-	ldr r0,.L4
-	ldr pc,[r0]
-.LUsageFault_Addr:
-	ldr r0,.L5
-	ldr pc,[r0]
-.LSWI_Addr:
-	ldr r0,.L6
-	ldr pc,[r0]
-.LDebugMonitor_Addr:
-	ldr r0,.L7
-	ldr pc,[r0]
-.LPendingSV_Addr:
-	ldr r0,.L8
-	ldr pc,[r0]
-.LSystick_Addr:
-	ldr r0,.L9
-	ldr pc,[r0]
-.LUART0handler:
-  ldr r0,.L10
-  ldr pc,[r0]
-.L1:
-	.long NMI_Handler
-.L2:
-	.long HardFault_Handler
-.L3:
-	.long MemManage_Handler
-.L4:
-	.long BusFault_Handler
-.L5:
-	.long UsageFault_Handler
-.L6:
-	.long SWI_Handler
-.L7:
-	.long DebugMonitor_Handler
-.L8:
-	.long PendingSV_Handler
-.L9:
-	.long Systick_Handler   
-.L10:
-  .long UART0IntVector
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+  .section ".init.interrupt_vectors"
+interrupt_vectors:
+	.long _stack_top
+  .long Startup
+  .long NMI_interrupt
+  .long Hardfault_interrupt
+  .long MemManage_interrupt
+  .long BusFault_interrupt
+  .long UsageFault_interrupt
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long SWI_interrupt
+  .long DebugMonitor_interrupt
+  .long 0
+  .long PendingSV_interrupt
+  .long SysTick_interrupt
   
   
-	.globl _start
-	.text
-_start:
-	
-	// Copy initialized data to ram
-	ldr r1,.L_etext
-	ldr r2,.L_data
-	ldr r3,.L_edata
-.Lcopyloop:
-	cmp r2,r3
-	ittt ls
-	ldrls r0,[r1],#4
-	strls r0,[r2],#4
-	bls .Lcopyloop
-
-	// clear onboard ram
-	ldr r1,.L_bss_start
-	ldr r2,.L_bss_end
-	mov r0,#0
-.Lzeroloop:
-	cmp r1,r2
-	itt ls
-	strls r0,[r1],#4
-	bls .Lzeroloop
+  .long GPIO_Port_A_Interrupt
+  .long GPIO_Port_B_Interrupt
+  .long GPIO_Port_C_Interrupt
+  .long GPIO_Port_D_Interrupt
+  .long GPIO_Port_E_Interrupt
+  .long UART0_Interrupt
+  .long UART1_Interrupt
+  .long SSI0_Interrupt
+  .long I2C0_Interrupt
+  .long PWM_Fault_Interrupt
+  .long PWM_Generator_0_Interrupt
+  .long PWM_Generator_1_Interrupt
+  .long PWM_Generator_2_Interrupt
+  .long QEI0_Interrupt
+  .long ADC0_Sequence_0_Interrupt
+  .long ADC0_Sequence_1_Interrupt
+  .long ADC0_Sequence_2_Interrupt
+  .long ADC0_Sequence_3_Interrupt
+  .long Watchdog_Timers_0_and_1_Interrupt
+  .long Timer_0A_Interrupt
+  .long Timer_0B_Interrupt
+  .long Timer_1A_Interrupt
+  .long Timer_1B_Interrupt
+  .long Timer_2A_Interrupt
+  .long Timer_2B_Interrupt
+  .long Analog_Comparator_0_Interrupt
+  .long Analog_Comparator_1_Interrupt
+  .long 0
+  .long System_Control_Interrupt
+  .long Flash_Memory_Control_Interrupt
+  .long GPIO_Port_F_Interrupt
+  .long GPIO_Port_G_Interrupt
+  .long GPIO_Port_H_Interrupt
+  .long UART2_Interrupt
+  .long SSI1_Interrupt
+  .long Timer_3A_Interrupt
+  .long Timer_3B_Interrupt
+  .long I2C1_Interrupt
+  .long QEI1_Interrupt
+  .long CAN0_Interrupt
+  .long CAN1_Interrupt
+  .long 0
+  .long 0
+  .long Hibernation_Module_Interrupt
+  .long USB_Interrupt
+  .long 0
+  .long uDMA_Software_Interrupt
+  .long uDMA_Error_Interrupt
+  .long ADC1_Sequence_0_Interrupt
+  .long ADC1_Sequence_1_Interrupt
+  .long ADC1_Sequence_2_Interrupt
+  .long ADC1_Sequence_3_Interrupt
+  .long I2S0_Interrupt
+  .long 0
+  .long GPIO_Port_J_Interrupt
+  
+  .weak NMI_interrupt
+  .weak Hardfault_interrupt
+  .weak MemManage_interrupt
+  .weak BusFault_interrupt
+  .weak UsageFault_interrupt
+  .weak SWI_interrupt
+  .weak DebugMonitor_interrupt
+  .weak PendingSV_interrupt
+  .weak SysTick_interrupt
 
 
-	b PASCALMAIN
-	b _FPC_haltproc
+  .weak GPIO_Port_A_Interrupt
+  .weak GPIO_Port_B_Interrupt
+  .weak GPIO_Port_C_Interrupt
+  .weak GPIO_Port_D_Interrupt
+  .weak GPIO_Port_E_Interrupt
+  .weak UART0_Interrupt
+  .weak UART1_Interrupt
+  .weak SSI0_Interrupt
+  .weak I2C0_Interrupt
+  .weak PWM_Fault_Interrupt
+  .weak PWM_Generator_0_Interrupt
+  .weak PWM_Generator_1_Interrupt
+  .weak PWM_Generator_2_Interrupt
+  .weak QEI0_Interrupt
+  .weak ADC0_Sequence_0_Interrupt
+  .weak ADC0_Sequence_1_Interrupt
+  .weak ADC0_Sequence_2_Interrupt
+  .weak ADC0_Sequence_3_Interrupt
+  .weak Watchdog_Timers_0_and_1_Interrupt
+  .weak Timer_0A_Interrupt
+  .weak Timer_0B_Interrupt
+  .weak Timer_1A_Interrupt
+  .weak Timer_1B_Interrupt
+  .weak Timer_2A_Interrupt
+  .weak Timer_2B_Interrupt
+  .weak Analog_Comparator_0_Interrupt
+  .weak Analog_Comparator_1_Interrupt
+  .weak System_Control_Interrupt
+  .weak Flash_Memory_Control_Interrupt
+  .weak GPIO_Port_F_Interrupt
+  .weak GPIO_Port_G_Interrupt
+  .weak GPIO_Port_H_Interrupt
+  .weak UART2_Interrupt
+  .weak SSI1_Interrupt
+  .weak Timer_3A_Interrupt
+  .weak Timer_3B_Interrupt
+  .weak I2C1_Interrupt
+  .weak QEI1_Interrupt
+  .weak CAN0_Interrupt
+  .weak CAN1_Interrupt
+  .weak Hibernation_Module_Interrupt
+  .weak USB_Interrupt
+  .weak uDMA_Software_Interrupt
+  .weak uDMA_Error_Interrupt
+  .weak ADC1_Sequence_0_Interrupt
+  .weak ADC1_Sequence_1_Interrupt
+  .weak ADC1_Sequence_2_Interrupt
+  .weak ADC1_Sequence_3_Interrupt
+  .weak I2S0_Interrupt
+  .weak GPIO_Port_J_Interrupt
+  
+  .set NMI_interrupt, Startup
+  .set Hardfault_interrupt, Startup
+  .set MemManage_interrupt, Startup
+  .set BusFault_interrupt, Startup
+  .set UsageFault_interrupt, Startup
+  .set SWI_interrupt, Startup
+  .set DebugMonitor_interrupt, Startup
+  .set PendingSV_interrupt, Startup
+  .set SysTick_interrupt, Startup
 
 
-.L_bss_start:
-	.long _bss_start
-.L_bss_end:
-	.long _bss_end
-.L_etext:
-	.long _etext
-.L_data:
-	.long _data
-.L_edata:
-	.long _edata
-.LDefaultHandlerAddr:
-	.long .LDefaultHandler
-	// default irq handler just returns
-.LDefaultHandler:
-	mov pc,r14
-    end;
+  .set GPIO_Port_A_Interrupt, Startup
+  .set GPIO_Port_B_Interrupt, Startup
+  .set GPIO_Port_C_Interrupt, Startup
+  .set GPIO_Port_D_Interrupt, Startup
+  .set GPIO_Port_E_Interrupt, Startup
+  .set UART0_Interrupt, Startup
+  .set UART1_Interrupt, Startup
+  .set SSI0_Interrupt, Startup
+  .set I2C0_Interrupt, Startup
+  .set PWM_Fault_Interrupt, Startup
+  .set PWM_Generator_0_Interrupt, Startup
+  .set PWM_Generator_1_Interrupt, Startup
+  .set PWM_Generator_2_Interrupt, Startup
+  .set QEI0_Interrupt, Startup
+  .set ADC0_Sequence_0_Interrupt, Startup
+  .set ADC0_Sequence_1_Interrupt, Startup
+  .set ADC0_Sequence_2_Interrupt, Startup
+  .set ADC0_Sequence_3_Interrupt, Startup
+  .set Watchdog_Timers_0_and_1_Interrupt, Startup
+  .set Timer_0A_Interrupt, Startup
+  .set Timer_0B_Interrupt, Startup
+  .set Timer_1A_Interrupt, Startup
+  .set Timer_1B_Interrupt, Startup
+  .set Timer_2A_Interrupt, Startup
+  .set Timer_2B_Interrupt, Startup
+  .set Analog_Comparator_0_Interrupt, Startup
+  .set Analog_Comparator_1_Interrupt, Startup
+  .set System_Control_Interrupt, Startup
+  .set Flash_Memory_Control_Interrupt, Startup
+  .set GPIO_Port_F_Interrupt, Startup
+  .set GPIO_Port_G_Interrupt, Startup
+  .set GPIO_Port_H_Interrupt, Startup
+  .set UART2_Interrupt, Startup
+  .set SSI1_Interrupt, Startup
+  .set Timer_3A_Interrupt, Startup
+  .set Timer_3B_Interrupt, Startup
+  .set I2C1_Interrupt, Startup
+  .set QEI1_Interrupt, Startup
+  .set CAN0_Interrupt, Startup
+  .set CAN1_Interrupt, Startup
+  .set Hibernation_Module_Interrupt, Startup
+  .set USB_Interrupt, Startup
+  .set uDMA_Software_Interrupt, Startup
+  .set uDMA_Error_Interrupt, Startup
+  .set ADC1_Sequence_0_Interrupt, Startup
+  .set ADC1_Sequence_1_Interrupt, Startup
+  .set ADC1_Sequence_2_Interrupt, Startup
+  .set ADC1_Sequence_3_Interrupt, Startup
+  .set I2S0_Interrupt, Startup
+  .set GPIO_Port_J_Interrupt, Startup
+  
+  .text
+end;
 
 
 end.
 end.
 
 

+ 1208 - 141
rtl/embedded/arm/lpc1768.pp

@@ -6,153 +6,1220 @@ unit lpc1768;
 
 
 interface
 interface
 
 
-var
-    STCTRL   : DWord absolute $E000E010;
-    STRELOAD : DWord absolute $E000E014;
-    STCURR   : DWord absolute $E000E018;
-
-    FIO1DIR2 : Byte  absolute $2009C022;
-    FIO1SET2 : Byte  absolute $2009C03A;
-    FIO1CLR2 : Byte  absolute $2009C03E;
-
-    SCS      : DWord absolute $400FC1A0;
-    CLKSRCSEL: DWord absolute $400FC10C;
-    PLL0FEED : DWord absolute $400FC08C;
-    PLL0CON  : DWord absolute $400FC080;
-    PLL0CFG  : DWord absolute $400FC084;
-    PLL0STAT : DWord absolute $400FC088;
-    CCLKCFG  : DWord absolute $400FC104;
+{$PACKRECORDS 2}
 
 
-implementation
+//
+//    STCTRL   : DWord absolute $E000E010;
+//    STRELOAD : DWord absolute $E000E014;
+//    STCURR   : DWord absolute $E000E018;
+//
+//    FIO1DIR2 : Byte  absolute $2009C022;
+//    FIO1SET2 : Byte  absolute $2009C03A;
+//    FIO1CLR2 : Byte  absolute $2009C03E;
+//
+//    SCS      : DWord absolute $400FC1A0;
+//    CLKSRCSEL: DWord absolute $400FC10C;
+//    PLL0FEED : DWord absolute $400FC08C;
+//    PLL0CON  : DWord absolute $400FC080;
+//    PLL0CFG  : DWord absolute $400FC084;
+//    PLL0STAT : DWord absolute $400FC088;
+//    CCLKCFG  : DWord absolute $400FC104;
+//
 
 
-var
-    _data: record end; external name '_data';
-    _edata: record end; external name '_edata';
-    _etext: record end; external name '_etext';
-    _bss_start: record end; external name '_bss_start';
-    _bss_end: record end; external name '_bss_end';
-    _stack_top: record end; external name '_stack_top';
+Const
+  NonMaskableInt_IRQn        = -14; //  2 Non Maskable // interrupt
+  HardFault_IRQn          	 = -13;  //  4 Cortex-M3 Memory Management // interrupt
+  MemoryManagement_IRQn      = -12; //  4 Cortex-M3 Memory Management // interrupt
+  BusFault_IRQn              = -11; //  5 Cortex-M3 Bus Fault // interrupt
+  UsageFault_IRQn            = -10; //  6 Cortex-M3 Usage Fault // interrupt
+  SVCall_IRQn                = -5;   // 11 Cortex-M3 SV Call // interrupt
+  DebugMonitor_IRQn          = -4;   // 12 Cortex-M3 Debug Monitor // interrupt
+  PendSV_IRQn                = -2;   // 14 Cortex-M3 Pend SV // interrupt
+  SysTick_IRQn               = -1;  // 15 Cortex-M3 System Tick // interrupt
+  WWDG_IRQn                  = 0;   //  Window WatchDog // interrupt
+  PVD_IRQn                   = 1;    //  PVD through EXTI Line detection // interrupt
+  TAMPER_IRQn                = 2;   //  Tamper // interrupt
+  RTC_IRQn                   = 3;    //  RTC global // interrupt
+  FLASH_IRQn                 = 4;    //  FLASH global // interrupt
+  RCC_IRQn                   = 5;    //  RCC global // interrupt
+  EXTI0_IRQn                 = 6;    //  EXTI Line0 // interrupt
+  EXTI1_IRQn                 = 7;    //  EXTI Line1 // interrupt
+  EXTI2_IRQn                 = 8;    //  EXTI Line2 // interrupt
+  EXTI3_IRQn                 = 9;    //  EXTI Line3 // interrupt
+  EXTI4_IRQn                 = 10;  // EXTI Line4 // interrupt
+  DMA1_Channel1_IRQn         = 11;  // DMA1 Channel 1 global // interrupt
+  DMA1_Channel2_IRQn         = 12;  // DMA1 Channel 2 global // interrupt
+  DMA1_Channel3_IRQn         = 13;  // DMA1 Channel 3 global // interrupt
+  DMA1_Channel4_IRQn         = 14;  // DMA1 Channel 4 global // interrupt
+  DMA1_Channel5_IRQn         = 15;  // DMA1 Channel 5 global // interrupt
+  DMA1_Channel6_IRQn         = 16;  // DMA1 Channel 6 global // interrupt
+  DMA1_Channel7_IRQn         = 17;  // DMA1 Channel 7 global // interrupt
+  ADC1_2_IRQn                = 18;   // ADC1 et ADC2 global // interrupt
+  USB_HP_CAN1_TX_IRQn        = 19;   // USB High Priority or CAN1 TX Interrupts
+  USB_LP_CAN1_RX0_IRQn       = 20;  // USB Low Priority or CAN1 RX0 Interrupts
+  CAN1_RX1_IRQn              = 21;   // CAN1 RX1 // interrupt
+  CAN1_SCE_IRQn              = 22;   // CAN1 SCE // interrupt
+  EXTI9_5_IRQn               = 23;  // External Line[9:5] Interrupts
+  TIM1_BRK_IRQn              = 24;   // TIM1 Break // interrupt
+  TIM1_UP_IRQn               = 25;  // TIM1 Update // interrupt
+  TIM1_TRG_COM_IRQn          = 26;   // TIM1 Trigger and Commutation // interrupt
+  TIM1_CC_IRQn               = 27;  // TIM1 Capture Compare // interrupt
+  TIM2_IRQn                  = 28;   // TIM2 global // interrupt
+  TIM3_IRQn                  = 29;   // TIM3 global // interrupt
+  TIM4_IRQn                  = 30;   // TIM4 global // interrupt
+  I2C1_EV_IRQn               = 31;  // I2C1 Event // interrupt
+  I2C1_ER_IRQn               = 32;  // I2C1 Error // interrupt
+  I2C2_EV_IRQn               = 33;  // I2C2 Event // interrupt
+  I2C2_ER_IRQn               = 34;  // I2C2 Error // interrupt
+  SPI1_IRQn                  = 35;   // SPI1 global // interrupt
+  SPI2_IRQn                  = 36;   // SPI2 global // interrupt
+  USART1_IRQn                = 37;   // USART1 global // interrupt
+  USART2_IRQn                = 38;   // USART2 global // interrupt
+  USART3_IRQn                = 39;   // USART3 global // interrupt
+  EXTI15_10_IRQn             = 40;  // External Line[15:10] Interrupts
+  RTCAlarm_IRQn              = 41;   // RTC Alarm through EXTI Line // interrupt
+  USBWakeUp_IRQn             = 42;  // USB WakeUp from suspend through EXTI Line // interrupt
+  TIM8_BRK_IRQn              = 43;   // TIM8 Break // interrupt
+  TIM8_UP_IRQn               = 44;  // TIM8 Update // interrupt
+  TIM8_TRG_COM_IRQn          = 45;   // TIM8 Trigger and Commutation // interrupt
+  TIM8_CC_IRQn               = 46;  // TIM8 Capture Compare // interrupt
+  ADC3_IRQn                  = 47;   // ADC3 global // interrupt
+  FSMC_IRQn                  = 48;   // FSMC global // interrupt
+  SDIO_IRQn                  = 49;   // SDIO global // interrupt
+  TIM5_IRQn                  = 50;   // TIM5 global // interrupt
+  SPI3_IRQn                  = 51;   // SPI3 global // interrupt
+  UART4_IRQn                 = 52;  // UART4 global // interrupt
+  UART5_IRQn                 = 53;  // UART5 global // interrupt
+  TIM6_IRQn                  = 54;   // TIM6 global // interrupt
+  TIM7_IRQn                  = 55;   // TIM7 global // interrupt
+  DMA2_Channel1_IRQn         = 56;  // DMA2 Channel 1 global // interrupt
+  DMA2_Channel2_IRQn         = 57;  // DMA2 Channel 2 global // interrupt
+  DMA2_Channel3_IRQn         = 58;  // DMA2 Channel 3 global // interrupt
+  DMA2_Channel4_5_IRQn       = 59;  // DMA2 Channel 4 and Channel 5 global // interrupt
 
 
-procedure PASCALMAIN; external name 'PASCALMAIN';
+Type
 
 
-procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
-asm
-.Lhalt:
-    b .Lhalt
-end;
+//*------------- System Control (SC) ------------------------------------------*/
+
+TSCRegisters = Record
+  FLASHCFG		: DWord;               // Flash Accelerator Module           */
+  RESERVED0		: Array [1..31] Of DWord;
+  PLL0CON		: DWord;                // Clocking and Power Control         */
+  PLL0CFG		: DWord;
+  PLL0STAT		: DWord;
+  PLL0FEED		: DWord;
+  RESERVED1		: Array [1..4] Of DWord;
+  PLL1CON		: DWord;
+  PLL1CFG		: DWord;
+  PLL1STAT		: DWord;
+  PLL1FEED		: DWord;
+  RESERVED2		: Array [1..4] Of DWord;
+  PCON			: DWord;
+  PCONP			: DWord;
+  RESERVED3		: Array [1..15] Of DWord;
+  CCLKCFG		: DWord;
+  USBCLKCFG		: DWord;
+  CLKSRCSEL		: DWord;
+  RESERVED4		: Array [1..12] Of DWord;
+  EXTINT		: DWord;                 // External Interrupts                */
+  RESERVED5		: DWord;
+  EXTMODE		: DWord;
+  EXTPOLAR		: DWord;
+  RESERVED		: Array [1..12] Of DWord;
+  RSID			: DWord;                   // Reset                              */
+  RESERVED7		: Array [1..7] Of DWord;
+  SCS			: DWord;                    // Syscon Miscellaneous Registers     */
+  IRCTRIM		: DWord;                // Clock Dividers                     */
+  PCLKSEL0		: DWord;
+  PCLKSEL1		: DWord;
+  RESERVED8		: Array [1..4] Of DWord;
+  USBIntSt		: DWord;               // USB Device/OTG Interrupt Register  */
+  DMAREQSEL		: DWord;
+  CLKOUTCFG		: DWord;              // Clock Output Configuration         */
+End;
+
+//*------------- Pin Connect Block (PINCON) -----------------------------------*/
+
+TPINCONRegisters = Record
+   PINSEL0		: DWord;
+   PINSEL1		: DWord;
+   PINSEL2		: DWord;
+   PINSEL3		: DWord;
+   PINSEL4		: DWord;
+   PINSEL5		: DWord;
+   PINSEL6		: DWord;
+   PINSEL7		: DWord;
+   PINSEL8		: DWord;
+   PINSEL9		: DWord;
+   PINSEL10		: DWord;
+   RESERVED0	: Array [1..5] Of DWord;
+   PINMODE0		: DWord;
+   PINMODE1		: DWord;
+   PINMODE2		: DWord;
+   PINMODE3		: DWord;
+   PINMODE4		: DWord;
+   PINMODE5		: DWord;
+   PINMODE6		: DWord;
+   PINMODE7		: DWord;
+   PINMODE8		: DWord;
+   PINMODE9		: DWord;
+   PINMODE_OD0	: DWord;
+   PINMODE_OD1	: DWord;
+   PINMODE_OD2	: DWord;
+   PINMODE_OD3	: DWord;
+   PINMODE_OD4	: DWord;
+   I2CPADCFG	: DWord;
+End;
+
+//------------- General Purpose Input/Output (GPIO) --------------------------*/
+
+{
+TGPIORegisters = Record
+  Case Byte Of
+    0: (FIODIR: DWord);
+    1: (FIORIRL, FIODIRH: Word);
+    2: (FIODIR0, FIODIR1, FIODIR2, FIODIR3: Byte);
+  End;
+  RESERVED0: Array [1..3] Of DWord;;
+  Case Byte Of
+    0: (FIOMASK: DWord);
+    1: (FIOMASKL, FIOMASKH: Word);
+    2: (FIOMASK0, FIOMASK1, FIOMASK2, FIOMASK3: Byte);
+  End;
+  Case Byte Of
+    0: (FIOPIN: DWord);
+    1: (FIOPINL, FIOPINH: Word);
+    2: (FIOPIN0, FIOPIN1, FIOPIN2, FIOPIN3: Byte);
+  End;
+  Case Byte Of
+    0: (FIOSET: DWord);
+    1: (FIOSETL, FIOSETH: Word);
+    2: (FIOSET0, FIOSET1, FIOSET2, FIOSET3: Byte);
+  End;
+  Case Byte Of
+    0: (FIOCLR: DWord);
+    1: (FIOCLRL, FIOSETH: Word);
+    2: (FIOCLR0, FIOCLR1, FIOCLR2, FIOCLR3: Byte);
+  End;
+End;
+}
+  TGPIORegisters = Record
+    FIODIR: DWord;
+    RESERVED0: Array [1..3] Of DWord;
+    FIOMASK: DWord;
+    FIOPIN: DWord;
+    FIOSET: DWord;
+    FIOCLR: DWord;
+  End;
+
+TGPIOINTRegisters = Record
+  IntStatus: DWord;
+  IO0IntStatR: DWord;
+  IO0IntStatF: DWord;
+  IO0IntClr: DWord;
+  IO0IntEnR: DWord;
+  IO0IntEnF: DWord;
+  RESERVED0: Array [1..2] Of DWord;
+  IO2IntStatR: DWord;
+  IO2IntStatF: DWord;
+  IO2IntClr: DWord;
+  IO2IntEnR: DWord;
+  IO2IntEnF: DWord;
+End;
+
+//*------------- Timer (TIM) --------------------------------------------------*/
+TTIMRegisters = Record
+  IR: DWord;
+  TCR: DWord;
+  TC: DWord;
+  PR: DWord;
+  PC: DWord;
+  MCR: DWord;
+  MR0: DWord;
+  MR1: DWord;
+  MR2: DWord;
+  MR3: DWord;
+  CCR: DWord;
+  CR0: DWord;
+  CR1: DWord;
+  RESERVED0: Array [1..2] Of DWord;
+  EMR: DWord;
+  RESERVED1: Array [1..12] Of DWord;
+  CTCR: DWord;
+End;
+
+//*------------- Pulse-Width Modulation (PWM) ---------------------------------*/
+TPWMRegisters = Record
+  IR: DWord;
+  TCR: DWord;
+  TC: DWord;
+  PR: DWord;
+  PC: DWord;
+  MCR: DWord;
+  MR0: DWord;
+  MR1: DWord;
+  MR2: DWord;
+  MR3: DWord;
+  CCR: DWord;
+  CR0: DWord;
+  CR1: DWord;
+  CR2: DWord;
+  CR3: DWord;
+  RESERVED0: DWord;
+  MR4: DWord;
+  MR5: DWord;
+  MR6: DWord;
+  PCR: DWord;
+  LER: DWord;
+  RESERVED1: Array [1..7] Of DWord;
+  CTCR: DWord;
+End;
+
+//*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
+{
+TUARTRegisters = Record
+  Case Byte Of
+    0: (RBR: Byte);
+    1: (THR: Byte);
+    2: (DLL: Byte);
+    3: (RESERVED: DWord);
+  End;
+  Case Byte Of
+    0: (DLM: Byte);
+    1: (IER: DWord);
+  End;
+  Case Byte Of
+    0: (IIR: DWord);
+    1: (FCR: Byte);
+  End;
+  LCR: Byte;
+  RESERVED1: Array [1..7] Of Byte;
+  LSR: Byte;
+  RESERVED2: Array [1..7] Of Byte;
+  SCR: Byte;
+  RESERVED3: Array [1..3] Of Byte;
+  ACR: DWord;
+  ICR: Byte;
+  RESERVED4: Array [1..3] Of Byte;
+  FDR: Byte;
+  RESERVED5: Array [1..7] Of Byte;
+  TER: Byte;
+  RESERVED6: Array [1..39] Of Byte;
+  FIFOLVL: Byte;
+End;
+
+TUART0Registers = Record
+  Case Byte Of
+    0: (RBR: Byte);
+    1: (THR: Byte);
+    2: (DLL: Byte);
+    3: (RESERVED: DWord);
+  End;
+  Case Byte Of
+    0: (DLM: Byte);
+    1: (IER: DWord);
+  End;
+  Case Byte Of
+    0: (IIR: DWord);
+    1: (FCR: Byte);
+  End;
+  LCR: Byte;
+  RESERVED1: Array [1..7] Of Byte;
+  LSR: Byte;
+  RESERVED2: Array [1..7] Of Byte;
+  SCR: Byte;
+  RESERVED3: Array [1..3] Of Byte;
+  ACR: DWord;
+  ICR: Byte;
+  RESERVED4: Array [1..3] Of Byte;
+  FDR: Byte;
+  RESERVED5: Array [1..7] Of Byte;
+  TER: Byte;
+  RESERVED6: Array [1..39] Of Byte;
+  FIFOLVL: Byte;
+End;
+
+
+TUART1Registers = Record
+  Case Byte Of
+    0: (RBR: Byte);
+    1: (THR: Byte);
+    2: (DLL: Byte);
+    3: (RESERVED: DWord);
+  End;
+  Case Byte Of
+    0: (DLM: Byte);
+    1: (IER: DWord);
+  End;
+  Case Byte Of
+    0: (IIR: DWord);
+    1: (FCR: Byte);
+  End;
+  LCR: Byte;
+  RESERVED1: Array [1..3] Of Byte;
+  MCR: Byte;
+  RESERVED2: Array [1..3] Of Byte;
+  LSR: Byte;
+  RESERVED3: Array [1..3] Of Byte;
+  MSR: Byte;
+  RESERVED4: Array [1..3] Of Byte;
+  SCR: Byte;
+  RESERVED5: Array [1..3] Of Byte;
+  ACR: DWord;
+  RESERVED6: DWord;
+  FDR: DWord;
+  RESERVED7: DWord;
+  TER: Byte;
+  RESERVED8: Array [1..27] Of Byte;
+  RS485CTRL: Byte;
+  RESERVED9: Array [1..3] Of Byte;
+  ADRMATCH: Byte;
+  RESERVED10: Array [1..3] Of Byte;
+  RS485DLY: Byte;
+  RESERVED11: Array [1..3] Of Byte;
+  FIFOLVL: Byte
+End;
+}
+//*------------- Serial Peripheral Interface (SPI) ----------------------------*/
+
+TSPIRegisters = Record
+  SPCR			: DWord;
+  SPSR			: DWord;
+  SPDR			: DWord;
+  RESERVED0		: Array [1..3] Of DWord;
+  SPINT			: DWord;
+End;
+
+//*------------- Synchronous Serial Communication (SSP) -----------------------*/
+
+TSSPRegisters = Record
+  CR0,
+  CR1,
+  DR,
+  SR,
+  CPSR,
+  IMSC,
+  RIS,
+  MIS,
+  ICR,
+  DMACR			: DWord;
+End;
+
+//*------------- Inter-Integrated Circuit (I2C) -------------------------------*/
+
+TI2CRegisters = Record
+  I2CONSET		: DWord;
+  I2STAT		: DWord;
+  I2DAT			: DWord;
+  I2ADR0		: DWord;
+  I2SCLH		: DWord;
+  I2SCLL		: DWord;
+  I2CONCLR		: DWord;
+  MMCTRL		: DWord;
+  I2ADR1		: DWord;
+  I2ADR2		: DWord;
+  I2ADR3		: DWord;
+  I2DATA_BUFFER	: DWord;
+  I2MASK0		: DWord;
+  I2MASK1		: DWord;
+  I2MASK2		: DWord;
+  I2MASK3		: DWord;
+End;
+
+//*------------- Inter IC Sound (I2S) -----------------------------------------*/
+
+TI2SRegisters = Record
+  I2SDAO		: DWord;
+  I2SDAI		: DWord;
+  I2STXFIFO		: DWord;
+  I2SRXFIFO		: DWord;
+  I2SSTATE		: DWord;
+  I2SDMA1		: DWord;
+  I2SDMA2		: DWord;
+  I2SIRQ		: DWord;
+  I2STXRATE		: DWord;
+  I2SRXRATE		: DWord;
+  I2STXBITRATE	: DWord;
+  I2SRXBITRATE	: DWord;
+  I2STXMODE		: DWord;
+  I2SRXMODE		: DWord;
+End;
+
+//*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/
+
+TRITRegisters = Record
+  RICOMPVAL		: DWord;
+  RIMASK			: DWord;
+  RICTRL			: Byte;
+  RESERVED0		: Array [1..3] Of Byte;
+  RICOUNTER		: DWord;
+End;
+
+//*------------- Real-Time Clock (RTC) ----------------------------------------*/
+TRTCRegisters = Record
+   ILR			: Byte;
+   RESERVED0		: Array [1..7] Of Byte;
+   CCR			: Byte;
+   RESERVED1		: Array [1..3] Of Byte;
+   CIIR			: Byte;
+   RESERVED2		: Array [1..3] Of Byte;
+   AMR			: Byte;
+   RESERVED3		: Array [1..3] Of Byte;
+   CTIME0		: DWord;
+   CTIME1		: DWord;
+   CTIME2		: DWord;
+   SEC			: Byte;
+   RESERVED4		: Array [1..3] Of Byte;
+   MIN			: Byte;
+   RESERVED5		: Array [1..3] Of Byte;
+   HOUR			: Byte;
+   RESERVED6		: Array [1..3] Of Byte;
+   DOM			: Byte;
+   RESERVED7		: Array [1..3] Of Byte;
+   DOW			: Byte;
+   RESERVED8		: Array [1..3] Of Byte;
+   DOY			: Word;
+   RESERVED9		: Word;
+   MONTH			: Byte;
+   RESERVED10		: Array [1..3] Of Byte;
+   YEAR			: Word;
+   RESERVED11		: Word;
+   CALIBRATION	: DWord;
+   GPREG0		: DWord;
+   GPREG1		: DWord;
+   GPREG2		: DWord;
+   GPREG3		: DWord;
+   GPREG4		: DWord;
+   RTC_AUXEN		: Byte;
+   RESERVED12		: Array [1..3] Of Byte;
+   RTC_AUX		: Byte;
+   RESERVED13		: Array [1..3] Of Byte;
+   ALSEC			: Byte;
+   RESERVED14		: Array [1..3] Of Byte;
+   ALMIN			: Byte;
+   RESERVED15		: Array [1..3] Of Byte;
+   ALHOUR		: Byte;
+   RESERVED16		: Array [1..3] Of Byte;
+   ALDOM			: Byte;
+   RESERVED17		: Array [1..3] Of Byte;
+   ALDOW			: Byte;
+   RESERVED18		: Array [1..3] Of Byte;
+   ALDOY			: Word;
+   RESERVED19		: Word;
+   ALMON			: Byte;
+   RESERVED20		: Array [1..3] Of Byte;
+   ALYEAR		: Word;
+   RESERVED21		: Word;
+End;
+
+//*------------- Watchdog Timer (WDT) -----------------------------------------*/
+
+TWDTRegisters = Record
+  WDMOD			: Byte;
+  RESERVED0		: Array [1..3] Of Byte;
+  WDTC			: DWord;
+  WDFEED			: Byte;
+  RESERVED1		: Array [1..3] Of Byte;
+  WDTV			: DWord;
+  WDCLKSEL		: DWord;
+End;
+
+//*------------- Analog-to-Digital Converter (ADC) ----------------------------*/
+TADCRegisters = Record
+  ADCR			: DWord;
+  ADGDR			: DWord;
+  RESERVED0		: DWord;
+  ADINTEN		: DWord;
+  ADDR0			: DWord;
+  ADDR1			: DWord;
+  ADDR2			: DWord;
+  ADDR3			: DWord;
+  ADDR4			: DWord;
+  ADDR5			: DWord;
+  ADDR6			: DWord;
+  ADDR7			: DWord;
+  ADSTAT			: DWord;
+  ADTRM			: DWord;
+End;
+
+//*------------- Digital-to-Analog Converter (DAC) ----------------------------*/
+TDACRegisters = Record
+  DACR			: DWord;
+  DACCTRL		: DWord;
+  DACCNTVAL		: Word;
+End;
+
+//*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/
+TMCPWMRegisters = Record
+  MCCON		: DWord;
+  MCCON_SET	: DWord;
+  MCCON_CLR	: DWord;
+  MCCAPCON		: DWord;
+  MCCAPCON_SET	: DWord;
+  MCCAPCON_CLR	: DWord;
+  MCTIM0		: DWord;
+  MCTIM1		: DWord;
+  MCTIM2		: DWord;
+  MCPER0		: DWord;
+  MCPER1		: DWord;
+  MCPER2		: DWord;
+  MCPW0		: DWord;
+  MCPW1		: DWord;
+  MCPW2		: DWord;
+  MCDEADTIME	: DWord;
+  MCCCP		: DWord;
+  MCCR0		: DWord;
+  MCCR1		: DWord;
+  MCCR2		: DWord;
+  MCINTEN		: DWord;
+  MCINTEN_SET	: DWord;
+  MCINTEN_CLR	: DWord;
+  MCCNTCON		: DWord;
+  MCCNTCON_SET	: DWord;
+  MCCNTCON_CLR	: DWord;
+  MCINTFLAG	: DWord;
+  MCINTFLAG_SET: DWord;
+  MCINTFLAG_CLR: DWord;
+  MCCAP_CLR	: DWord;
+End;
+//*------------- Quadrature Encoder Interface (QEI) ---------------------------*/
+TQEIRegisters = Record
+  QEICON: DWord;
+  QEISTAT: DWord;
+  QEICONF: DWord;
+  QEIPOS: DWord;
+  QEIMAXPOS: DWord;
+  CMPOS0: DWord;
+  CMPOS1: DWord;
+  CMPOS2: DWord;
+  INXCNT: DWord;
+  INXCMP: DWord;
+  QEILOAD: DWord;
+  QEITIME: DWord;
+  QEIVEL: DWord;
+  QEICAP: DWord;
+  VELCOMP: DWord;
+  FILTER: DWord;
+  RESERVED0: Array [1..998] Of DWord;
+  QEIIEC: DWord;
+  QEIIES: DWord;
+  QEIINTSTAT: DWord;
+  QEIIE: DWord;
+  QEICLR: DWord;
+  QEISET: DWord;
+End;
+
+//*------------- Controller Area Network (CAN) --------------------------------*/
+TCANAF_RAMRegisters = Record
+  MASK: Array [1..512] Of DWord;              //* ID Masks                           */
+End;
+
+TCANAF = Record                          //* Acceptance Filter Registers        */
+  AFMR: DWord;
+  SFF_sa: DWord;
+  SFF_GRP_sa: DWord;
+  EFF_sa: DWord;
+  EFF_GRP_sa: DWord;
+  ENDofTable: DWord;
+  LUTerrAd: DWord;
+  LUTerr: DWord;
+  FCANIE: DWord;
+  FCANIC0: DWord;
+  FCANIC1: DWord;
+End;
+
+TCANCRRegisters = Record                     //* Central Registers                  */
+     CANTxSR: DWord;
+     CANRxSR: DWord;
+     CANMSR: DWord;
+End;
+
+TCANRegisters = Record                     //* Controller Registers               */
+    _MOD: DWord;
+     CMR: DWord;
+    GSR: DWord;
+     ICR: DWord;
+    IER: DWord;
+    BTR: DWord;
+    EWL: DWord;
+     SR: DWord;
+    RFS: DWord;
+    RID: DWord;
+    RDA: DWord;
+    RDB: DWord;
+    TFI1: DWord;
+    TID1: DWord;
+    TDA1: DWord;
+    TDB1: DWord;
+    TFI2: DWord;
+    TID2: DWord;
+    TDA2: DWord;
+    TDB2: DWord;
+    TFI3: DWord;
+    TID3: DWord;
+    TDA3: DWord;
+    TDB3: DWord;
+End;
+
+//*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/
+
+TGPDMARegisters = Record              //* Common Registers                   */
+     DMACIntStat: DWord;
+     DMACIntTCStat: DWord;
+     DMACIntTCClear: DWord;
+     DMACIntErrStat: DWord;
+     DMACIntErrClr: DWord;
+     DMACRawIntTCStat: DWord;
+     DMACRawIntErrStat: DWord;
+     DMACEnbldChns: DWord;
+    DMACSoftBReq: DWord;
+    DMACSoftSReq: DWord;
+    DMACSoftLBReq: DWord;
+    DMACSoftLSReq: DWord;
+    DMACConfig: DWord;
+    DMACSync: DWord;
+End;
+
+TGPDMACHRegisters = Record              //* Channel Registers                  */
+  DMACCSrcAddr	: DWord;
+  DMACCDestAddr	: DWord;
+  DMACCLLI		: DWord;
+  DMACCControl	: DWord;
+  DMACCConfig		: DWord;
+End;
+
+//*------------- Universal Serial Bus (USB) -----------------------------------*/
+TUSBRegisters = Record
+  HcRevision: DWord;             //* USB Host Registers                 */
+  HcControl: DWord;
+    HcCommandStatus: DWord;
+    HcInterruptStatus: DWord;
+    HcInterruptEnable: DWord;
+    HcInterruptDisable: DWord;
+    HcHCCA: DWord;
+     HcPeriodCurrentED: DWord;
+    HcControlHeadED: DWord;
+    HcControlCurrentED: DWord;
+    HcBulkHeadED: DWord;
+    HcBulkCurrentED: DWord;
+     HcDoneHead: DWord;
+    HcFmInterval: DWord;
+     HcFmRemaining: DWord;
+     HcFmNumber: DWord;
+    HcPeriodicStart: DWord;
+    HcLSTreshold: DWord;
+    HcRhDescriptorA: DWord;
+    HcRhDescriptorB: DWord;
+    HcRhStatus: DWord;
+    HcRhPortStatus1: DWord;
+    HcRhPortStatus2: DWord;
+    RESERVED0: Array [1..40] Of DWord;
+     Module_ID: DWord;
+
+     OTGIntSt: DWord;               //* USB On-The-Go Registers            */
+    OTGIntEn: DWord;
+     OTGIntSet: DWord;
+     OTGIntClr: DWord;
+    OTGStCtrl: DWord;
+    OTGTmr: DWord;
+        RESERVED1: Array [1..58] Of DWord;
+
+     USBDevIntSt: DWord;            // USB Device Interrupt Registers     */
+    USBDevIntEn: DWord;
+     USBDevIntClr: DWord;
+     USBDevIntSet: DWord;
+
+     USBCmdCode: DWord;             // USB Device SIE Command Registers   */
+     USBCmdData: DWord;
+
+     USBRxData: DWord;              // USB Device Transfer Registers      */
+     USBTxData: DWord;
+     USBRxPLen: DWord;
+     USBTxPLen: DWord;
+    USBCtrl: DWord;
+     USBDevIntPri: DWord;
+
+     USBEpIntSt: DWord;             // USB Device Endpoint Interrupt Regs */
+    USBEpIntEn: DWord;
+     USBEpIntClr: DWord;
+     USBEpIntSet: DWord;
+     USBEpIntPri: DWord;
+
+    USBReEp: DWord;                // USB Device Endpoint Realization Reg*/
+     USBEpInd: DWord;
+    USBMaxPSize: DWord;
+
+     USBDMARSt: DWord;              // USB Device DMA Registers           */
+     USBDMARClr: DWord;
+     USBDMARSet: DWord;
+        RESERVED2:Array [1..9] Of DWord;
+    USBUDCAH: DWord;
+     USBEpDMASt: DWord;
+     USBEpDMAEn: DWord;
+     USBEpDMADis: DWord;
+     USBDMAIntSt: DWord;
+    USBDMAIntEn: DWord;
+        RESERVED3:Array [1..2] Of DWord;
+     USBEoTIntSt: DWord;
+     USBEoTIntClr: DWord;
+     USBEoTIntSet: DWord;
+     USBNDDRIntSt: DWord;
+     USBNDDRIntClr: DWord;
+     USBNDDRIntSet: DWord;
+     USBSysErrIntSt: DWord;
+     USBSysErrIntClr: DWord;
+     USBSysErrIntSet: DWord;
+        RESERVED4: Array [1..15] Of DWord;
+
+     I2C_RX: DWord;                 // USB OTG I2C Registers              */
+     I2C_WO: DWord;
+     I2C_STS: DWord;
+    I2C_CTL: DWord;
+    I2C_CLKHI: DWord;
+     I2C_CLKLO: DWord;
+        RESERVED5:Array [1..823] Of DWord;
+    USBClkCtrl: Byte;		// USB Clock Control Registers        */
+  End;
+///------------- Ethernet Media Access Controller (EMAC) ----------------------*/
+TEMACRegisters = Record
+    MAC1: DWord;                   // MAC Registers                      */
+    MAC2: DWord;
+    IPGT: DWord;
+    IPGR: DWord;
+    CLRT: DWord;
+    MAXF: DWord;
+    SUPP: DWord;
+    TEST: DWord;
+    MCFG: DWord;
+    MCMD: DWord;
+    MADR: DWord;
+     MWTD: DWord;
+     MRDD: DWord;
+     MIND: DWord;
+        RESERVED0:Array [1..2] Of DWord;
+    SA0: DWord;
+    SA1: DWord;
+    SA2: DWord;
+        RESERVED1:Array [1..45] Of DWord;
+    Command: DWord;                // Control Registers                  */
+     Status: DWord;
+    RxDescriptor: DWord;
+    RxStatus: DWord;
+    RxDescriptorNumber: DWord;
+     RxProduceIndex: DWord;
+    RxConsumeIndex: DWord;
+    TxDescriptor: DWord;
+    TxStatus: DWord;
+    TxDescriptorNumber: DWord;
+    TxProduceIndex: DWord;
+     TxConsumeIndex: DWord;
+        RESERVED2:Array [1..10] Of DWord;
+     TSV0: DWord;
+     TSV1: DWord;
+     RSV: DWord;
+        RESERVED3: Array [1..3] Of DWord;
+    FlowControlCounter: DWord;
+     FlowControlStatus: DWord;
+        RESERVED4: Array [1..34] Of DWord;
+    RxFilterCtrl: DWord;           // Rx Filter Registers                */
+    RxFilterWoLStatus: DWord;
+    RxFilterWoLClear: DWord;
+        RESERVED5: DWord;
+    HashFilterL: DWord;
+    HashFilterH: DWord;
+        RESERVED6:Array [1..882] Of DWord;
+     IntStatus: DWord;              // Module Control Registers           */
+    IntEnable: DWord;
+     IntClear: DWord;
+     IntSet: DWord;
+        RESERVED7: DWord;
+    PowerDown: DWord;
+        RESERVED8: DWord;
+    Module_ID: DWord;
+End;
+
+ TNVICRegisters = packed record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ End;
+
+ TSCBRegisters = packed record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                            {!< Interrupt Control State Register                        }
+  VTOR,                            {!< Vector Table Offset Register                            }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                 }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)   }
+  SHCSR,                            {!< System Handler Control and State Register               }
+  CFSR,                            {!< Configurable Fault Status Register                      }
+  HFSR,                            {!< Hard Fault Status Register                              }
+  DFSR,                            {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                             }
+  BFAR,                            {!< Bus Fault Address Register                              }
+  AFSR: longword;                  {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;    {!< Processor Feature Register                              }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                           }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+TSysTickRegisters = Packed Record
+  CTRL,
+  RELOAD,
+  VAL,
+  CALIB: LongWord;
+End;
+
+// Based on CORE_CM3.H
+
+///*****************************************************************************/
+///                         Peripheral memory map                              */
+///*****************************************************************************/
+
+Const
+ LPC_SCS_BASE        		= $E000E000;
+ LPC_SCB_BASE          = (LPC_SCS_BASE + $0D00);      // System Control Block Base Address
+
+/// Base addresses                                                             */
+
+ LPC_FLASH_BASE        = ($00000000);
+ LPC_RAM_BASE          = ($10000000);
+ LPC_GPIO_BASE         = ($2009C000);
+ LPC_APB0_BASE         = ($40000000);
+ LPC_APB1_BASE         = ($40080000);
+ LPC_AHB_BASE          = ($50000000);
+ LPC_CM3_BASE          = ($E0000000);
+
+/// APB0 peripherals                                                           */
+ LPC_WDT_BASE          = (LPC_APB0_BASE + $00000);
+ LPC_TIM0_BASE         = (LPC_APB0_BASE + $04000);
+ LPC_TIM1_BASE         = (LPC_APB0_BASE + $08000);
+ LPC_UART0_BASE        = (LPC_APB0_BASE + $0C000);
+ LPC_UART1_BASE        = (LPC_APB0_BASE + $10000);
+ LPC_PWM1_BASE         = (LPC_APB0_BASE + $18000);
+ LPC_I2C0_BASE         = (LPC_APB0_BASE + $1C000);
+ LPC_SPI_BASE          = (LPC_APB0_BASE + $20000);
+ LPC_RTC_BASE          = (LPC_APB0_BASE + $24000);
+ LPC_GPIOINT_BASE      = (LPC_APB0_BASE + $28080);
+ LPC_PINCON_BASE       = (LPC_APB0_BASE + $2C000);
+ LPC_SSP1_BASE         = (LPC_APB0_BASE + $30000);
+ LPC_ADC_BASE          = (LPC_APB0_BASE + $34000);
+ LPC_CANAF_RAM_BASE    = (LPC_APB0_BASE + $38000);
+ LPC_CANAF_BASE        = (LPC_APB0_BASE + $3C000);
+ LPC_CANCR_BASE        = (LPC_APB0_BASE + $40000);
+ LPC_CAN1_BASE         = (LPC_APB0_BASE + $44000);
+ LPC_CAN2_BASE         = (LPC_APB0_BASE + $48000);
+ LPC_I2C1_BASE         = (LPC_APB0_BASE + $5C000);
+
+/// APB1 peripherals                                                           */
+ LPC_SSP0_BASE         = (LPC_APB1_BASE + $08000);
+ LPC_DAC_BASE          = (LPC_APB1_BASE + $0C000);
+ LPC_TIM2_BASE         = (LPC_APB1_BASE + $10000);
+ LPC_TIM3_BASE         = (LPC_APB1_BASE + $14000);
+ LPC_UART2_BASE        = (LPC_APB1_BASE + $18000);
+ LPC_UART3_BASE        = (LPC_APB1_BASE + $1C000);
+ LPC_I2C2_BASE         = (LPC_APB1_BASE + $20000);
+ LPC_I2S_BASE          = (LPC_APB1_BASE + $28000);
+ LPC_RIT_BASE          = (LPC_APB1_BASE + $30000);
+ LPC_MCPWM_BASE        = (LPC_APB1_BASE + $38000);
+ LPC_QEI_BASE          = (LPC_APB1_BASE + $3C000);
+ LPC_SC_BASE           = (LPC_APB1_BASE + $7C000);
+
+/// AHB peripherals                                                            */
+ LPC_EMAC_BASE         = (LPC_AHB_BASE  + $00000);
+ LPC_GPDMA_BASE        = (LPC_AHB_BASE  + $04000);
+ LPC_GPDMACH0_BASE     = (LPC_AHB_BASE  + $04100);
+ LPC_GPDMACH1_BASE     = (LPC_AHB_BASE  + $04120);
+ LPC_GPDMACH2_BASE     = (LPC_AHB_BASE  + $04140);
+ LPC_GPDMACH3_BASE     = (LPC_AHB_BASE  + $04160);
+ LPC_GPDMACH4_BASE     = (LPC_AHB_BASE  + $04180);
+ LPC_GPDMACH5_BASE     = (LPC_AHB_BASE  + $041A0);
+ LPC_GPDMACH6_BASE     = (LPC_AHB_BASE  + $041C0);
+ LPC_GPDMACH7_BASE     = (LPC_AHB_BASE  + $041E0);
+ LPC_USB_BASE          = (LPC_AHB_BASE  + $0C000);
+
+/// GPIOs                                                                      */
+ LPC_GPIO0_BASE        = (LPC_GPIO_BASE + $00000);
+ LPC_GPIO1_BASE        = (LPC_GPIO_BASE + $00020);
+ LPC_GPIO2_BASE        = (LPC_GPIO_BASE + $00040);
+ LPC_GPIO3_BASE        = (LPC_GPIO_BASE + $00060);
+ LPC_GPIO4_BASE        = (LPC_GPIO_BASE + $00080);
+
+///*****************************************************************************/
+///                         Peripheral declaration                             */
+///*****************************************************************************/
+
+{$ALIGN 2}
+
+Var
+ LPC_SC                : TSCRegisters  Absolute (LPC_SC_BASE);
+  LPC_SCB    : TSCBRegisters Absolute (LPC_SCB_BASE);
+ 
+ LPC_GPIO0             : TGPIORegisters Absolute (LPC_GPIO0_BASE);
+ LPC_GPIO1             : TGPIORegisters Absolute (LPC_GPIO1_BASE);
+ LPC_GPIO2             : TGPIORegisters Absolute (LPC_GPIO2_BASE);
+ LPC_GPIO3             : TGPIORegisters Absolute (LPC_GPIO3_BASE);
+ LPC_GPIO4             : TGPIORegisters Absolute (LPC_GPIO4_BASE);
+ LPC_WDT               : TWDTRegisters Absolute  (LPC_WDT_BASE);
+ LPC_TIM0              : TTIMRegisters Absolute (LPC_TIM0_BASE);
+ LPC_TIM1              : TTIMRegisters Absolute (LPC_TIM1_BASE);
+ LPC_TIM2              : TTIMRegisters Absolute (LPC_TIM2_BASE);
+ LPC_TIM3              : TTIMRegisters Absolute (LPC_TIM3_BASE);
+ LPC_RIT               : TRITRegisters Absolute (LPC_RIT_BASE);
+{
+ LPC_UART0             : TUART0Registers Absolute (LPC_UART0_BASE);
+ LPC_UART1             : TUART1Registers Absolute (LPC_UART1_BASE);
+ LPC_UART2             : TUARTRegisters Absolute (LPC_UART2_BASE);
+ LPC_UART3             : TUARTRegisters Absolute (LPC_UART3_BASE);
+}
+ LPC_SYSTICK		   : TSysTickRegisters  Absolute (LPC_SCS_BASE+$0010);
+ LPC_NVIC: TNVICRegisters Absolute (LPC_SCS_BASE+$0100);
+
+ LPC_PWM1              : TPWMRegisters Absolute (LPC_PWM1_BASE);
+ LPC_I2C0              : TI2CRegisters Absolute (LPC_I2C0_BASE);
+ LPC_I2C1              : TI2CRegisters Absolute (LPC_I2C1_BASE);
+ LPC_I2C2              : TI2CRegisters Absolute (LPC_I2C2_BASE);
+ LPC_I2S               : TI2SRegisters Absolute (LPC_I2S_BASE);
+ LPC_SPI               : TSPIRegisters Absolute (LPC_SPI_BASE);
+ LPC_RTC               : TRTCRegisters Absolute (LPC_RTC_BASE);
+ LPC_GPIOINT           : TGPIOINTRegisters Absolute (LPC_GPIOINT_BASE);
+ LPC_PINCON            : TPINCONRegisters Absolute (LPC_PINCON_BASE);
+ LPC_SSP0              : TSSPRegisters Absolute (LPC_SSP0_BASE);
+ LPC_SSP1              : TSSPRegisters Absolute (LPC_SSP1_BASE);
+ LPC_ADC               : TADCRegisters Absolute  (LPC_ADC_BASE);
+ LPC_DAC               : TDACRegisters Absolute  (LPC_DAC_BASE);
+{
+ LPC_CANAF_RAM         : TCANAF_RAMRegisters Absolute  (LPC_CANAF_RAM_BASE);
+ LPC_CANAF             : TCANAFRegisters Absolute  (LPC_CANAF_BASE);
+ LPC_CANCR             : TCANCR_RAMRegisters Absolute  (LPC_CANCR_BASE);
+}
+ LPC_CAN1              : TCANRegisters Absolute  (LPC_CAN1_BASE);
+ LPC_CAN2              : TCANRegisters Absolute  (LPC_CAN2_BASE);
+ LPC_MCPWM             : TMCPWMRegisters Absolute  (LPC_MCPWM_BASE);
+ LPC_QEI               : TQEIRegisters Absolute  (LPC_QEI_BASE);
+ LPC_EMAC              : TEMACRegisters Absolute  (LPC_EMAC_BASE);
+ LPC_GPDMA             : TGPDMARegisters Absolute  (LPC_GPDMA_BASE);
+ LPC_GPDMACH0          : TGPDMACHRegisters Absolute  (LPC_GPDMACH0_BASE);
+ LPC_GPDMACH1          : TGPDMACHRegisters Absolute  (LPC_GPDMACH1_BASE);
+ LPC_GPDMACH2          : TGPDMACHRegisters Absolute  (LPC_GPDMACH2_BASE);
+ LPC_GPDMACH3          : TGPDMACHRegisters Absolute  (LPC_GPDMACH3_BASE);
+ LPC_GPDMACH4          : TGPDMACHRegisters Absolute  (LPC_GPDMACH4_BASE);
+ LPC_GPDMACH5          : TGPDMACHRegisters Absolute  (LPC_GPDMACH5_BASE);
+ LPC_GPDMACH6          : TGPDMACHRegisters Absolute  (LPC_GPDMACH6_BASE);
+ LPC_GPDMACH7          : TGPDMACHRegisters Absolute  (LPC_GPDMACH7_BASE);
+ LPC_USB               : TUSBRegisters Absolute  (LPC_USB_BASE);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Watchdog_Interrupt; external name 'Watchdog_Interrupt';
+procedure Timer0_Interrupt; external name 'Timer0_Interrupt';
+procedure Timer1_Interrupt; external name 'Timer1_Interrupt';
+procedure Timer2_Interrupt; external name 'Timer2_Interrupt';
+procedure Timer3_Interrupt; external name 'Timer3_Interrupt';
+procedure UART0_Interrupt; external name 'UART0_Interrupt';
+procedure UART1_Interrupt; external name 'UART1_Interrupt';
+procedure UART2_Interrupt; external name 'UART2_Interrupt';
+procedure UART3_Interrupt; external name 'UART3_Interrupt';
+procedure PWM1_Interrupt; external name 'PWM1_Interrupt';
+procedure I2C0_Interrupt; external name 'I2C0_Interrupt';
+procedure I2C1_Interrupt; external name 'I2C1_Interrupt';
+procedure I2C2_Interrupt; external name 'I2C2_Interrupt';
+procedure SPI_Interrupt; external name 'SPI_Interrupt';
+procedure SSP0_Interrupt; external name 'SSP0_Interrupt';
+procedure SSP1_Interrupt; external name 'SSP1_Interrupt';
+procedure PLL0_Interrupt; external name 'PLL0_Interrupt';
+procedure RTC_Interrupt; external name 'RTC_Interrupt';
+procedure EINT0_Interrupt; external name 'EINT0_Interrupt';
+procedure EINT1_Interrupt; external name 'EINT1_Interrupt';
+procedure EINT2_Interrupt; external name 'EINT2_Interrupt';
+procedure EINT3_Interrupt; external name 'EINT3_Interrupt';
+procedure ADC_Interrupt; external name 'ADC_Interrupt';
+procedure BOD_Interrupt; external name 'BOD_Interrupt';
+procedure USB_Interrupt; external name 'USB_Interrupt';
+procedure CAN_Interrupt; external name 'CAN_Interrupt';
+procedure HPDMA_Interrupt; external name 'HPDMA_Interrupt';
+procedure I2C_Interrupt; external name 'I2C_Interrupt';
+procedure Ethernet_Interrupt; external name 'Ethernet_Interrupt';
+procedure RITINT_Interrupt; external name 'RITINT_Interrupt';
+procedure MotorControlPWM_Interrupt; external name 'MotorControlPWM_Interrupt';
+procedure QuadratureEncoder_Interrupt; external name 'QuadratureEncoder_Interrupt';
+procedure PLL1_Interrupt; external name 'PLL1_Interrupt';
+procedure USBActivity_Interrupt; external name 'USBActivity_Interrupt';
+procedure CanActivity_Interrupt; external name 'CanActivity_Interrupt';
+
+{$i cortexm3_start.inc}
 
 
-procedure _FPC_start; assembler; nostackframe;
-label _start;
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
 asm
 asm
-    .init
-    .balign 16
-
-    .long _stack_top            // stack top address
-    .long _start+1              // 1 Reset
-    .long .LDefaultHandler+1    // 2 NMI
-    .long .LDefaultHandler+1    // 3 HardFault
-    .long .LDefaultHandler+1    // 4 MemManage
-    .long .LDefaultHandler+1    // 5 BusFault
-    .long .LDefaultHandler+1    // 6 UsageFault
-    .long .LDefaultHandler+1    // 7 RESERVED
-    .long .LDefaultHandler+1    // 8 RESERVED
-    .long .LDefaultHandler+1    // 9 RESERVED
-    .long .LDefaultHandler+1    // 10 RESERVED
-    .long .LDefaultHandler+1    // 11 SVCall
-    .long .LDefaultHandler+1    // 12 Debug Monitor
-    .long .LDefaultHandler+1    // 13 RESERVED
-    .long .LDefaultHandler+1    // 14 PendSV
-    .long .LDefaultHandler+1    // 15 SysTick
-    .long .LDefaultHandler+1    // 16 External Interrupt(0)
-    .long .LDefaultHandler+1    // 17 External Interrupt(1)
-    .long .LDefaultHandler+1    // 18 External Interrupt(2)
-    .long .LDefaultHandler+1    // 19 ...
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-    .long .LDefaultHandler+1
-
-    .globl _start
-    .text
-_start:
-
-    // Copy initialized data to ram
-    ldr r1,.L_etext
-    ldr r2,.L_data
-    ldr r3,.L_edata
-.Lcopyloop:
-    cmp r2,r3
-    ittt ls
-    ldrls r0,[r1],#4
-    strls r0,[r2],#4
-    bls .Lcopyloop
-
-    // clear onboard ram
-    ldr r1,.L_bss_start
-    ldr r2,.L_bss_end
-    mov r0,#0
-.Lzeroloop:
-    cmp r1,r2
-    itt ls
-    strls r0,[r1],#4
-    bls .Lzeroloop
-
-    b PASCALMAIN
-    b _FPC_haltproc
-
-.L_bss_start:
-    .long _bss_start
-.L_bss_end:
-    .long _bss_end
-.L_etext:
-    .long _etext
-.L_data:
-    .long _data
-.L_edata:
-    .long _edata
-.LDefaultHandlerAddr:
-    .long .LDefaultHandler
-    // default irq handler just returns
-.LDefaultHandler:
-    mov pc,r14
+  .section ".init.interrupt_vectors"
+interrupt_vectors:
+  .long _stack_top            // stack top address
+  .long Startup
+  .long NMI_interrupt
+  .long Hardfault_interrupt
+  .long MemManage_interrupt
+  .long BusFault_interrupt
+  .long UsageFault_interrupt
+  .long 0
+  .long 0
+  .long 0
+  .long 0
+  .long SWI_interrupt
+  .long DebugMonitor_interrupt
+  .long 0
+  .long PendingSV_interrupt
+  .long SysTick_interrupt
+  
+  .long Watchdog_Interrupt
+  .long Timer0_Interrupt
+  .long Timer1_Interrupt
+  .long Timer2_Interrupt
+  .long Timer3_Interrupt
+  .long UART0_Interrupt
+  .long UART1_Interrupt
+  .long UART2_Interrupt
+  .long UART3_Interrupt
+  .long PWM1_Interrupt
+  .long I2C0_Interrupt
+  .long I2C1_Interrupt
+  .long I2C2_Interrupt
+  .long SPI_Interrupt
+  .long SSP0_Interrupt
+  .long SSP1_Interrupt
+  .long PLL0_Interrupt
+  .long RTC_Interrupt
+  .long EINT0_Interrupt
+  .long EINT1_Interrupt
+  .long EINT2_Interrupt
+  .long EINT3_Interrupt
+  .long ADC_Interrupt
+  .long BOD_Interrupt
+  .long USB_Interrupt
+  .long CAN_Interrupt
+  .long HPDMA_Interrupt
+  .long I2C_Interrupt
+  .long Ethernet_Interrupt
+  .long RITINT_Interrupt
+  .long MotorControlPWM_Interrupt
+  .long QuadratureEncoder_Interrupt
+  .long PLL1_Interrupt
+  .long USBActivity_Interrupt
+  .long CanActivity_Interrupt
+  
+  .weak NMI_interrupt
+  .weak Hardfault_interrupt
+  .weak MemManage_interrupt
+  .weak BusFault_interrupt
+  .weak UsageFault_interrupt
+  .weak SWI_interrupt
+  .weak DebugMonitor_interrupt
+  .weak PendingSV_interrupt
+  .weak SysTick_interrupt
+  .weak Watchdog_Interrupt
+  .weak Timer0_Interrupt
+  .weak Timer1_Interrupt
+  .weak Timer2_Interrupt
+  .weak Timer3_Interrupt
+  .weak UART0_Interrupt
+  .weak UART1_Interrupt
+  .weak UART2_Interrupt
+  .weak UART3_Interrupt
+  .weak PWM1_Interrupt
+  .weak I2C0_Interrupt
+  .weak I2C1_Interrupt
+  .weak I2C2_Interrupt
+  .weak SPI_Interrupt
+  .weak SSP0_Interrupt
+  .weak SSP1_Interrupt
+  .weak PLL0_Interrupt
+  .weak RTC_Interrupt
+  .weak EINT0_Interrupt
+  .weak EINT1_Interrupt
+  .weak EINT2_Interrupt
+  .weak EINT3_Interrupt
+  .weak ADC_Interrupt
+  .weak BOD_Interrupt
+  .weak USB_Interrupt
+  .weak CAN_Interrupt
+  .weak HPDMA_Interrupt
+  .weak I2C_Interrupt
+  .weak Ethernet_Interrupt
+  .weak RITINT_Interrupt
+  .weak MotorControlPWM_Interrupt
+  .weak QuadratureEncoder_Interrupt
+  .weak PLL1_Interrupt
+  .weak USBActivity_Interrupt
+  .weak CanActivity_Interrupt
+  
+    .set NMI_interrupt, Startup
+  .set Hardfault_interrupt, Startup
+  .set MemManage_interrupt, Startup
+  .set BusFault_interrupt, Startup
+  .set UsageFault_interrupt, Startup
+  .set SWI_interrupt, Startup
+  .set DebugMonitor_interrupt, Startup
+  .set PendingSV_interrupt, Startup
+  .set SysTick_interrupt, Startup
+  .set Watchdog_Interrupt, Startup
+  .set Timer0_Interrupt, Startup
+  .set Timer1_Interrupt, Startup
+  .set Timer2_Interrupt, Startup
+  .set Timer3_Interrupt, Startup
+  .set UART0_Interrupt, Startup
+  .set UART1_Interrupt, Startup
+  .set UART2_Interrupt, Startup
+  .set UART3_Interrupt, Startup
+  .set PWM1_Interrupt, Startup
+  .set I2C0_Interrupt, Startup
+  .set I2C1_Interrupt, Startup
+  .set I2C2_Interrupt, Startup
+  .set SPI_Interrupt, Startup
+  .set SSP0_Interrupt, Startup
+  .set SSP1_Interrupt, Startup
+  .set PLL0_Interrupt, Startup
+  .set RTC_Interrupt, Startup
+  .set EINT0_Interrupt, Startup
+  .set EINT1_Interrupt, Startup
+  .set EINT2_Interrupt, Startup
+  .set EINT3_Interrupt, Startup
+  .set ADC_Interrupt, Startup
+  .set BOD_Interrupt, Startup
+  .set USB_Interrupt, Startup
+  .set CAN_Interrupt, Startup
+  .set HPDMA_Interrupt, Startup
+  .set I2C_Interrupt, Startup
+  .set Ethernet_Interrupt, Startup
+  .set RITINT_Interrupt, Startup
+  .set MotorControlPWM_Interrupt, Startup
+  .set QuadratureEncoder_Interrupt, Startup
+  .set PLL1_Interrupt, Startup
+  .set USBActivity_Interrupt, Startup
+  .set CanActivity_Interrupt, Startup
+  
+  .text
 end;
 end;
 
 
 end.
 end.

+ 297 - 335
rtl/embedded/arm/sc32442b.pp

@@ -8,7 +8,7 @@ unit sc32442b;
   interface
   interface
 
 
     var
     var
-	   { Memory Controller }
+     { Memory Controller }
       BWSCON: longword 		absolute $48000000;
       BWSCON: longword 		absolute $48000000;
       BANKCON0: longword 	absolute $48000004;
       BANKCON0: longword 	absolute $48000004;
       BANKCON1: longword 	absolute $48000008;
       BANKCON1: longword 	absolute $48000008;
@@ -21,8 +21,8 @@ unit sc32442b;
       REFRESH: longword 	absolute $48000024;
       REFRESH: longword 	absolute $48000024;
       BANKSIZE: longword 	absolute $48000028;
       BANKSIZE: longword 	absolute $48000028;
       MRSRB6: longword 		absolute $4800002C;
       MRSRB6: longword 		absolute $4800002C;
-		
-		{ USB Host Controller }
+    
+    { USB Host Controller }
       HcRevision: longword 			absolute $49000000;
       HcRevision: longword 			absolute $49000000;
       HcControl: longword 				absolute $49000004;
       HcControl: longword 				absolute $49000004;
       HcCommonStatus: longword 		absolute $49000008;
       HcCommonStatus: longword 		absolute $49000008;
@@ -46,8 +46,8 @@ unit sc32442b;
       HcRhStatus: longword				absolute $49000050;
       HcRhStatus: longword				absolute $49000050;
       HcRhPortStatus1: longword		absolute $49000054;
       HcRhPortStatus1: longword		absolute $49000054;
       HcRhPortStatus2: longword		absolute $49000058;
       HcRhPortStatus2: longword		absolute $49000058;
-		
-		{ Interrupt controller }
+    
+    { Interrupt controller }
       SRCPND: longword			absolute $4A000000;
       SRCPND: longword			absolute $4A000000;
       INTMOD: longword			absolute $4A000004;
       INTMOD: longword			absolute $4A000004;
       INTMSK: longword			absolute $4A000008;
       INTMSK: longword			absolute $4A000008;
@@ -56,291 +56,278 @@ unit sc32442b;
       INTOFFSET: longword		absolute $4A000014;
       INTOFFSET: longword		absolute $4A000014;
       SUBSRCPND: longword		absolute $4A000018;
       SUBSRCPND: longword		absolute $4A000018;
       INTSUBMSK: longword		absolute $4A00001C;
       INTSUBMSK: longword		absolute $4A00001C;
-		
+    
     type
     type
-	   TDMA = packed record
-		  DISRC,
-		  DISRCC,
-		  DIDST,
-		  DIDSTC,
-		  DCON,
-		  DSTAT,
-		  DCSRC,
-		  DCDST,
-		  DMASKTRIG: longword;
-		end;
-		
-	 var
-		{ DMA }
-		DMA0: TDMA	absolute $4B000000;
-		DMA1: TDMA	absolute $4B000040;
-		DMA2: TDMA	absolute $4B000080;
-		DMA3: TDMA	absolute $4B0000C0;
-		
-		{ Clock and power }
-		LOCKTIME: longword	absolute $4C000000;
-		MPLLCON: longword		absolute $4C000004;
-		UPLLCON: longword		absolute $4C000008;
-		CLKCON: longword		absolute $4C00000C;
-		CLKSLOW: longword		absolute $4C000010;
-		CLKDIVN: longword		absolute $4C000014;
-		CAMDIVN: longword		absolute $4C000018;
-		
-		{ LCD Controller }
-		LCDCON1: longword		absolute $4D000000;
-		LCDCON2: longword		absolute $4D000004;
-		LCDCON3: longword		absolute $4D000008;
-		LCDCON4: longword		absolute $4D00000C;
-		LCDCON5: longword		absolute $4D000010;
-		LCDSADDR1: longword	absolute $4D000014;
-		LCDSADDR2: longword	absolute $4D000018;
-		LCDSADDR3: longword	absolute $4D00001C;
-		REDLUT: longword		absolute $4D000020;
-		GREENLUT: longword	absolute $4D000024;
-		BLUELUT: longword		absolute $4D000028;
-		DITHMODE: longword	absolute $4D00004C;
-		TPAL: longword			absolute $4D000050;
-		LCDINTPND: longword	absolute $4D000054;
-		LCDSRCPND: longword	absolute $4D000058;
-		LCDINTMSK: longword	absolute $4D00005C;
-		TCONSEL: longword		absolute $4D000060;
-		
-		{ NAND Flash }
-		NFCONF: longword		absolute $4E000000;
-		NFCONT: longword		absolute $4E000004;
-		NFCMD: longword		absolute $4E000008;
-		NFADDR: longword		absolute $4E00000C;
-		NFDATA: longword		absolute $4E000010;
-		NFECC0: longword		absolute $4E000014;
-		NFECC1: longword		absolute $4E000018;
-		NFSECC: longword		absolute $4E00001C;
-		NFSTAT: longword		absolute $4E000020;
-		NFESTAT0: longword	absolute $4E000024;
-		NFESTAT1: longword	absolute $4E000028;
-		NFMECC0: longword		absolute $4E00002C;
-		NFMECC1: longword		absolute $4E000030;
-		NFSECC2: longword		absolute $4E000034;
-		NFSBLK: longword		absolute $4E000038;
-		NFEBLK: longword		absolute $4E00003C;
-		
+     TDMA = packed record
+      DISRC,
+      DISRCC,
+      DIDST,
+      DIDSTC,
+      DCON,
+      DSTAT,
+      DCSRC,
+      DCDST,
+      DMASKTRIG: longword;
+    end;
+    
+   var
+    { DMA }
+    DMA0: TDMA	absolute $4B000000;
+    DMA1: TDMA	absolute $4B000040;
+    DMA2: TDMA	absolute $4B000080;
+    DMA3: TDMA	absolute $4B0000C0;
+    
+    { Clock and power }
+    LOCKTIME: longword	absolute $4C000000;
+    MPLLCON: longword		absolute $4C000004;
+    UPLLCON: longword		absolute $4C000008;
+    CLKCON: longword		absolute $4C00000C;
+    CLKSLOW: longword		absolute $4C000010;
+    CLKDIVN: longword		absolute $4C000014;
+    CAMDIVN: longword		absolute $4C000018;
+    
+    { LCD Controller }
+    LCDCON1: longword		absolute $4D000000;
+    LCDCON2: longword		absolute $4D000004;
+    LCDCON3: longword		absolute $4D000008;
+    LCDCON4: longword		absolute $4D00000C;
+    LCDCON5: longword		absolute $4D000010;
+    LCDSADDR1: longword	absolute $4D000014;
+    LCDSADDR2: longword	absolute $4D000018;
+    LCDSADDR3: longword	absolute $4D00001C;
+    REDLUT: longword		absolute $4D000020;
+    GREENLUT: longword	absolute $4D000024;
+    BLUELUT: longword		absolute $4D000028;
+    DITHMODE: longword	absolute $4D00004C;
+    TPAL: longword			absolute $4D000050;
+    LCDINTPND: longword	absolute $4D000054;
+    LCDSRCPND: longword	absolute $4D000058;
+    LCDINTMSK: longword	absolute $4D00005C;
+    TCONSEL: longword		absolute $4D000060;
+    
+    { NAND Flash }
+    NFCONF: longword		absolute $4E000000;
+    NFCONT: longword		absolute $4E000004;
+    NFCMD: longword		absolute $4E000008;
+    NFADDR: longword		absolute $4E00000C;
+    NFDATA: longword		absolute $4E000010;
+    NFECC0: longword		absolute $4E000014;
+    NFECC1: longword		absolute $4E000018;
+    NFSECC: longword		absolute $4E00001C;
+    NFSTAT: longword		absolute $4E000020;
+    NFESTAT0: longword	absolute $4E000024;
+    NFESTAT1: longword	absolute $4E000028;
+    NFMECC0: longword		absolute $4E00002C;
+    NFMECC1: longword		absolute $4E000030;
+    NFSECC2: longword		absolute $4E000034;
+    NFSBLK: longword		absolute $4E000038;
+    NFEBLK: longword		absolute $4E00003C;
+    
     type
     type
-	   TUART = packed record
-		  ULCON,
-		  UCON,
-		  UFCON,
-		  UMCON,
-		  UTRSTAT,
-		  UERSTAT,
-		  UFSTAT,
-		  UMSTAT,
-		  UTXH,
-		  URXH,
-		  UBRDIV: longword;
-		end;
-	 var
-		{ UART }
-		UART0: TUART		absolute $50000000;
-		UART1: TUART		absolute $50004000;
-		UART2: TUART		absolute $50008000;
-		
-	 type
-	   TPWMTimer = packed record
-		  TCNTB,
-		  TCMPB,
-		  TCNTO: longword;
-		end;
-	 var
-		{ PWM Timer }
-		TCFG0: longword		absolute $51000000;
-		TCFG1: longword 		absolute $51000004;
-		TCON: longword 		absolute $51000008;
-		PWMTimer: array[0..4] of TPWMTimer absolute $5100000C;
-		
-		{ USB Device }
-		FUNC_ADDR_REG: byte		absolute $52000140;
-		PWR_REG: byte				absolute $52000144;
-		EP_INT_REG: byte			absolute $52000148;
-		USB_INT_REG: byte			absolute $52000158;
-		EP_INT_EN_REG: byte		absolute $5200015C;
-		USB_INT_EN_REG: byte		absolute $5200016C;
-		FRAME_NUM1_REG: byte		absolute $52000170;
-		FRAME_NUM2_REG: byte		absolute $52000174;
-		INDEX_REG: byte			absolute $52000178;
-		EP0_CSR: byte				absolute $52000184;
-		IN_CSR1_REG: byte			absolute $52000184;
-		IN_CSR2_REG: byte			absolute $52000188;
-		MAXP_REG: byte				absolute $52000180;
-		OUT_CSR1_REG: byte		absolute $52000190;
-		OUT_CSR2_REG: byte		absolute $52000194;
-		OUT_FIFO_CNT1_REG: byte	absolute $52000198;
-		OUT_FIFO_CNT2_REG: byte	absolute $5200019C;
-		EP0_FIFO: byte				absolute $520001C0;
-		EP1_FIFO: byte				absolute $520001C4;
-		EP2_FIFO: byte				absolute $520001C8;
-		EP3_FIFO: byte				absolute $520001CC;
-		EP4_FIFO: byte				absolute $520001D0;
-		EP1_DMA_CON: byte			absolute $52000200;
-		EP1_DMA_UNIT: byte		absolute $52000204;
-		EP1_DMA_FIFO: byte		absolute $52000208;
-		EP1_DMA_TTC_L: byte		absolute $5200020C;
-		EP1_DMA_TTC_M: byte		absolute $52000210;
-		EP1_DMA_TTC_H: byte		absolute $52000214;
-		EP2_DMA_CON: byte			absolute $52000218;
-		EP2_DMA_UNIT: byte		absolute $5200021C;
-		EP2_DMA_FIFO: byte		absolute $52000220;
-		EP2_DMA_TTC_L: byte		absolute $52000224;
-		EP2_DMA_TTC_M: byte		absolute $52000228;
-		EP2_DMA_TTC_H: byte		absolute $5200022C;
-		EP3_DMA_CON: byte			absolute $52000240;
-		EP3_DMA_UNIT: byte		absolute $52000244;
-		EP3_DMA_FIFO: byte		absolute $52000248;
-		EP3_DMA_TTC_L: byte		absolute $5200024C;
-		EP3_DMA_TTC_M: byte		absolute $52000250;
-		EP3_DMA_TTC_H: byte		absolute $52000254;
-		EP4_DMA_CON: byte			absolute $52000258;
-		EP4_DMA_UNIT: byte		absolute $5200025C;
-		EP4_DMA_FIFO: byte		absolute $52000260;
-		EP4_DMA_TTC_L: byte		absolute $52000264;
-		EP4_DMA_TTC_M: byte		absolute $52000268;
-		EP4_DMA_TTC_H: byte		absolute $5200026C;
-		
-		{ Watchdog timer }
-		WTCON: longword		absolute $53000000;
-		WTDAT: longword		absolute $53000004;
-		WTCNT: longword		absolute $53000008;
-		
-		{ I2C }
-		IICCON: longword		absolute $54000000;
-		IICSTAT: longword		absolute $54000004;
-		IICADD: longword		absolute $54000008;
-		IICDS: longword		absolute $5400000C;
-		IICLC: longword		absolute $54000010;
-		
-		{ I2S }
-		IISCON: longword		absolute $55000000;
-		IISMOD: longword		absolute $55000004;
-		IISPSR: longword		absolute $55000008;
-		IISFCON: longword		absolute $5500000C;
-		IISFIFO: longword		absolute $55000010;
-		
-	 type
-	   TGPIO = packed record
-		  CON,
-		  DAT,
-		  DN: longword;
-		end;
-	 var
-		{ GPIO }
-		GPA: TGPIO		absolute $56000000;
-		GPB: TGPIO		absolute $56000010;
-		GPC: TGPIO		absolute $56000020;
-		GPD: TGPIO		absolute $56000030;
-		GPE: TGPIO		absolute $56000040;
-		GPF: TGPIO		absolute $56000050;
-		GPG: TGPIO		absolute $56000060;
-		GPH: TGPIO		absolute $56000070;
-		GPJ: TGPIO		absolute $560000D0;
-		MISCCR: longword		absolute $56000080;
-		DCLKCON: longword		absolute $56000084;
-		EXTINT0: longword		absolute $56000088;
-		EXTINT1: longword		absolute $5600008C;
-		EXTINT2: longword		absolute $56000090;
-		EINTFLT0: longword	absolute $56000094;
-		EINTFLT1: longword	absolute $56000098;
-		EINTFLT2: longword	absolute $5600009C;
-		EINTFLT3: longword	absolute $560000A0;
-		EINTMASK: longword	absolute $560000A4;
-		EINTPEND: longword	absolute $560000A8;
-		GSTATUS0: longword	absolute $560000AC;
-		GSTATUS1: longword	absolute $560000B0;
-		GSTATUS2: longword	absolute $560000B4;
-		GSTATUS3: longword	absolute $560000B8;
-		GSTATUS4: longword	absolute $560000BC;
-		MSLCON: longword		absolute $560000CC;
-		
-		{ RTC }
-		RTCCON: byte		absolute $57000040;
-		TICNT: byte			absolute $57000044;
-		RTCALM: byte		absolute $57000050;
-		ALMSEC: byte		absolute $57000054;
-		ALMMIN: byte		absolute $57000058;
-		ALMHOUR: byte		absolute $5700005C;
-		ALMDATE: byte		absolute $57000060;
-		ALMMON: byte		absolute $57000064;
-		ALMYEAR: byte		absolute $57000068;
-		BCDSEC: byte		absolute $57000070;
-		BCDMIN: byte		absolute $57000074;
-		BCDHOUR: byte		absolute $57000078;
-		BCDDATE: byte		absolute $5700007C;
-		BCDDAY: byte		absolute $57000080;
-		BCDMON: byte		absolute $57000084;
-		BCDYEAR: byte		absolute $57000088;
-		RTCLBAT: byte		absolute $5700006C;
-		
-		{ AD converter }
-		ADCCON: longword		absolute $58000000;
-		ADCTSC: longword		absolute $58000004;
-		ADCDLY: longword		absolute $58000008;
-		ADCDAT0: longword		absolute $5800000C;
-		ADCDAT1: longword		absolute $58000010;
-		ADCUPDN: longword		absolute $58000014;
-		
-	 type
-	   TSPI = packed record
-		  SPCON,
-		  SPSTA,
-		  SPPIN,
-		  SPPRE,
-		  SPTDAT,
-		  SPRDAT: longword;
-		end;
-	 var
-		{ SPI }
-		SPI0: TSPI		absolute $59000000;
-		SPI1: TSPI		absolute $59000020;
-		
-		{ SD Interface }
-		SDICON: longword		absolute $5A000000;
-		SDIPRE: longword		absolute $5A000004;
-		SDICARG: longword		absolute $5A000008;
-		SDICCON: longword		absolute $5A00000C;
-		SDICSTA: longword		absolute $5A000010;
-		SDIRSP0: longword		absolute $5A000014;
-		SDIRSP1: longword		absolute $5A000018;
-		SDIRSP2: longword		absolute $5A00001C;
-		SDIRSP3: longword		absolute $5A000020;
-		SDIDTIMER: longword	absolute $5A000024;
-		SDIBSIZE: longword	absolute $5A000028;
-		SDIDCON: longword		absolute $5A00002C;
-		SDIDCNT: longword		absolute $5A000030;
-		SDIDSTA: longword		absolute $5A000034;
-		SDIFSTA: longword		absolute $5A000038;
-		SDIIMSK: longword		absolute $5A00003C;
-		SDIDAT: byte			absolute $5A000040;
-		
-    var
-      Undefined_Handler,
-      SWI_Handler,
-      Prefetch_Handler,
-      Abort_Handler,
-      IRQ_Handler,
-      FIQ_Handler : pointer;
+     TUART = packed record
+      ULCON,
+      UCON,
+      UFCON,
+      UMCON,
+      UTRSTAT,
+      UERSTAT,
+      UFSTAT,
+      UMSTAT,
+      UTXH,
+      URXH,
+      UBRDIV: longword;
+    end;
+   var
+    { UART }
+    UART0: TUART		absolute $50000000;
+    UART1: TUART		absolute $50004000;
+    UART2: TUART		absolute $50008000;
+    
+   type
+     TPWMTimer = packed record
+      TCNTB,
+      TCMPB,
+      TCNTO: longword;
+    end;
+   var
+    { PWM Timer }
+    TCFG0: longword		absolute $51000000;
+    TCFG1: longword 		absolute $51000004;
+    TCON: longword 		absolute $51000008;
+    PWMTimer: array[0..4] of TPWMTimer absolute $5100000C;
+    
+    { USB Device }
+    FUNC_ADDR_REG: byte		absolute $52000140;
+    PWR_REG: byte				absolute $52000144;
+    EP_INT_REG: byte			absolute $52000148;
+    USB_INT_REG: byte			absolute $52000158;
+    EP_INT_EN_REG: byte		absolute $5200015C;
+    USB_INT_EN_REG: byte		absolute $5200016C;
+    FRAME_NUM1_REG: byte		absolute $52000170;
+    FRAME_NUM2_REG: byte		absolute $52000174;
+    INDEX_REG: byte			absolute $52000178;
+    EP0_CSR: byte				absolute $52000184;
+    IN_CSR1_REG: byte			absolute $52000184;
+    IN_CSR2_REG: byte			absolute $52000188;
+    MAXP_REG: byte				absolute $52000180;
+    OUT_CSR1_REG: byte		absolute $52000190;
+    OUT_CSR2_REG: byte		absolute $52000194;
+    OUT_FIFO_CNT1_REG: byte	absolute $52000198;
+    OUT_FIFO_CNT2_REG: byte	absolute $5200019C;
+    EP0_FIFO: byte				absolute $520001C0;
+    EP1_FIFO: byte				absolute $520001C4;
+    EP2_FIFO: byte				absolute $520001C8;
+    EP3_FIFO: byte				absolute $520001CC;
+    EP4_FIFO: byte				absolute $520001D0;
+    EP1_DMA_CON: byte			absolute $52000200;
+    EP1_DMA_UNIT: byte		absolute $52000204;
+    EP1_DMA_FIFO: byte		absolute $52000208;
+    EP1_DMA_TTC_L: byte		absolute $5200020C;
+    EP1_DMA_TTC_M: byte		absolute $52000210;
+    EP1_DMA_TTC_H: byte		absolute $52000214;
+    EP2_DMA_CON: byte			absolute $52000218;
+    EP2_DMA_UNIT: byte		absolute $5200021C;
+    EP2_DMA_FIFO: byte		absolute $52000220;
+    EP2_DMA_TTC_L: byte		absolute $52000224;
+    EP2_DMA_TTC_M: byte		absolute $52000228;
+    EP2_DMA_TTC_H: byte		absolute $5200022C;
+    EP3_DMA_CON: byte			absolute $52000240;
+    EP3_DMA_UNIT: byte		absolute $52000244;
+    EP3_DMA_FIFO: byte		absolute $52000248;
+    EP3_DMA_TTC_L: byte		absolute $5200024C;
+    EP3_DMA_TTC_M: byte		absolute $52000250;
+    EP3_DMA_TTC_H: byte		absolute $52000254;
+    EP4_DMA_CON: byte			absolute $52000258;
+    EP4_DMA_UNIT: byte		absolute $5200025C;
+    EP4_DMA_FIFO: byte		absolute $52000260;
+    EP4_DMA_TTC_L: byte		absolute $52000264;
+    EP4_DMA_TTC_M: byte		absolute $52000268;
+    EP4_DMA_TTC_H: byte		absolute $5200026C;
+    
+    { Watchdog timer }
+    WTCON: longword		absolute $53000000;
+    WTDAT: longword		absolute $53000004;
+    WTCNT: longword		absolute $53000008;
+    
+    { I2C }
+    IICCON: longword		absolute $54000000;
+    IICSTAT: longword		absolute $54000004;
+    IICADD: longword		absolute $54000008;
+    IICDS: longword		absolute $5400000C;
+    IICLC: longword		absolute $54000010;
+    
+    { I2S }
+    IISCON: longword		absolute $55000000;
+    IISMOD: longword		absolute $55000004;
+    IISPSR: longword		absolute $55000008;
+    IISFCON: longword		absolute $5500000C;
+    IISFIFO: longword		absolute $55000010;
+    
+   type
+     TGPIO = packed record
+      CON,
+      DAT,
+      DN: longword;
+    end;
+   var
+    { GPIO }
+    GPA: TGPIO		absolute $56000000;
+    GPB: TGPIO		absolute $56000010;
+    GPC: TGPIO		absolute $56000020;
+    GPD: TGPIO		absolute $56000030;
+    GPE: TGPIO		absolute $56000040;
+    GPF: TGPIO		absolute $56000050;
+    GPG: TGPIO		absolute $56000060;
+    GPH: TGPIO		absolute $56000070;
+    GPJ: TGPIO		absolute $560000D0;
+    MISCCR: longword		absolute $56000080;
+    DCLKCON: longword		absolute $56000084;
+    EXTINT0: longword		absolute $56000088;
+    EXTINT1: longword		absolute $5600008C;
+    EXTINT2: longword		absolute $56000090;
+    EINTFLT0: longword	absolute $56000094;
+    EINTFLT1: longword	absolute $56000098;
+    EINTFLT2: longword	absolute $5600009C;
+    EINTFLT3: longword	absolute $560000A0;
+    EINTMASK: longword	absolute $560000A4;
+    EINTPEND: longword	absolute $560000A8;
+    GSTATUS0: longword	absolute $560000AC;
+    GSTATUS1: longword	absolute $560000B0;
+    GSTATUS2: longword	absolute $560000B4;
+    GSTATUS3: longword	absolute $560000B8;
+    GSTATUS4: longword	absolute $560000BC;
+    MSLCON: longword		absolute $560000CC;
+    
+    { RTC }
+    RTCCON: byte		absolute $57000040;
+    TICNT: byte			absolute $57000044;
+    RTCALM: byte		absolute $57000050;
+    ALMSEC: byte		absolute $57000054;
+    ALMMIN: byte		absolute $57000058;
+    ALMHOUR: byte		absolute $5700005C;
+    ALMDATE: byte		absolute $57000060;
+    ALMMON: byte		absolute $57000064;
+    ALMYEAR: byte		absolute $57000068;
+    BCDSEC: byte		absolute $57000070;
+    BCDMIN: byte		absolute $57000074;
+    BCDHOUR: byte		absolute $57000078;
+    BCDDATE: byte		absolute $5700007C;
+    BCDDAY: byte		absolute $57000080;
+    BCDMON: byte		absolute $57000084;
+    BCDYEAR: byte		absolute $57000088;
+    RTCLBAT: byte		absolute $5700006C;
+    
+    { AD converter }
+    ADCCON: longword		absolute $58000000;
+    ADCTSC: longword		absolute $58000004;
+    ADCDLY: longword		absolute $58000008;
+    ADCDAT0: longword		absolute $5800000C;
+    ADCDAT1: longword		absolute $58000010;
+    ADCUPDN: longword		absolute $58000014;
+    
+   type
+     TSPI = packed record
+      SPCON,
+      SPSTA,
+      SPPIN,
+      SPPRE,
+      SPTDAT,
+      SPRDAT: longword;
+    end;
+   var
+    { SPI }
+    SPI0: TSPI		absolute $59000000;
+    SPI1: TSPI		absolute $59000020;
+    
+    { SD Interface }
+    SDICON: longword		absolute $5A000000;
+    SDIPRE: longword		absolute $5A000004;
+    SDICARG: longword		absolute $5A000008;
+    SDICCON: longword		absolute $5A00000C;
+    SDICSTA: longword		absolute $5A000010;
+    SDIRSP0: longword		absolute $5A000014;
+    SDIRSP1: longword		absolute $5A000018;
+    SDIRSP2: longword		absolute $5A00001C;
+    SDIRSP3: longword		absolute $5A000020;
+    SDIDTIMER: longword	absolute $5A000024;
+    SDIBSIZE: longword	absolute $5A000028;
+    SDIDCON: longword		absolute $5A00002C;
+    SDIDCNT: longword		absolute $5A000030;
+    SDIDSTA: longword		absolute $5A000034;
+    SDIFSTA: longword		absolute $5A000038;
+    SDIIMSK: longword		absolute $5A00003C;
+    SDIDAT: byte			absolute $5A000040;
 
 
   implementation
   implementation
 
 
-    procedure AT91F_Default_FIQ_handler; assembler; nostackframe; public name 'AT91F_Default_FIQ_handler';
-      asm
-      .Lloop:
-        b .Lloop
-      end;
-
-    procedure AT91F_Default_IRQ_handler; assembler; nostackframe; public name 'AT91F_Default_IRQ_handler';
-      asm
-      .Lloop:
-        b .Lloop
-      end;
-
-    procedure AT91F_Spurious_handler; assembler; nostackframe; public name 'AT91F_Spurious_handler';
+    procedure UndefinedInstrHandler; external name 'UndefinedInstrHandler';
+    procedure SWIHandler; external name 'SWIHandler';
+    procedure PrefetchAbortHandler; external name 'PrefetchAbortHandler';
+    procedure DataAbortHandler; external name 'DataAbortHandler';
+    procedure IRQHandler; external name 'IRQHandler';
+    procedure FIQHandler; external name 'FIQHandler';
+        
+    procedure DefaultExceptionHandler; assembler; nostackframe;
       asm
       asm
       .Lloop:
       .Lloop:
         b .Lloop
         b .Lloop
@@ -370,45 +357,40 @@ unit sc32442b;
         .align 16
         .align 16
         .globl _start
         .globl _start
         b   _start
         b   _start
-        b   .LUndefined_Addr  // Undefined Instruction vector
-        b   .LSWI_Addr        // Software Interrupt vector
-        b   .LPrefetch_Addr   // Prefetch abort vector
-        b   .LAbort_Addr      // Data abort vector
+        ldr pc, .LUndefined_Addr  // Undefined Instruction vector
+        ldr pc, .LSWI_Addr        // Software Interrupt vector
+        ldr pc, .LPrefetch_Addr   // Prefetch abort vector
+        ldr pc, .LAbort_Addr      // Data abort vector
         nop                   // reserved
         nop                   // reserved
-        b   .LIRQ_Addr        // Interrupt Request (IRQ) vector
-        b   .LFIQ_Addr        // Fast interrupt request (FIQ) vector
+        ldr pc, .LIRQ_Addr        // Interrupt Request (IRQ) vector
+        ldr pc, .LFIQ_Addr        // Fast interrupt request (FIQ) vector
 
 
     .LUndefined_Addr:
     .LUndefined_Addr:
-        ldr r0,.L1
-        ldr pc,[r0]
+        .long UndefinedInstrHandler
     .LSWI_Addr:
     .LSWI_Addr:
-        ldr r0,.L2
-        ldr pc,[r0]
+        .long SWIHandler
     .LPrefetch_Addr:
     .LPrefetch_Addr:
-        ldr r0,.L3
-        ldr pc,[r0]
+        .long PrefetchAbortHandler
     .LAbort_Addr:
     .LAbort_Addr:
-        ldr r0,.L4
-        ldr pc,[r0]
+        .long DataAbortHandler
     .LIRQ_Addr:
     .LIRQ_Addr:
-        ldr r0,.L5
-        ldr pc,[r0]
+        .long IRQHandler
     .LFIQ_Addr:
     .LFIQ_Addr:
-        ldr r0,.L5
-        ldr pc,[r0]
+        .long FIQHandler
 
 
-    .L1:
-        .long     Undefined_Handler
-    .L2:
-        .long     SWI_Handler
-    .L3:
-        .long     Prefetch_Handler
-    .L4:
-        .long     Abort_Handler
-    .L5:
-        .long     IRQ_Handler
-    .L6:
-        .long     FIQ_Handler
+        .weak UndefinedInstrHandler
+        .weak SWIHandler
+        .weak PrefetchAbortHandler
+        .weak DataAbortHandler
+        .weak IRQHandler
+        .weak FIQHandler
+        
+        .set UndefinedInstrHandler, DefaultExceptionHandler
+        .set SWIHandler, DefaultExceptionHandler
+        .set PrefetchAbortHandler, DefaultExceptionHandler
+        .set DataAbortHandler, DefaultExceptionHandler
+        .set IRQHandler, DefaultExceptionHandler
+        .set FIQHandler, DefaultExceptionHandler
 
 
     _start:
     _start:
         (*
         (*
@@ -454,21 +436,6 @@ unit sc32442b;
         msr   CPSR_c, #0x1f   // switch to System Mode, interrupts enabled
         msr   CPSR_c, #0x1f   // switch to System Mode, interrupts enabled
         mov   sp, r0
         mov   sp, r0
 
 
-        // for now, all handlers are set to a default one
-        ldr r1,.LDefaultHandlerAddr
-        ldr r0,.L1
-        str r1,[r0]
-        ldr r0,.L2
-        str r1,[r0]
-        ldr r0,.L3
-        str r1,[r0]
-        ldr r0,.L4
-        str r1,[r0]
-        ldr r0,.L5
-        str r1,[r0]
-        ldr r0,.L6
-        str r1,[r0]
-
         // copy initialized data from flash to ram
         // copy initialized data from flash to ram
         ldr r1,.L_etext
         ldr r1,.L_etext
         ldr r2,.L_data
         ldr r2,.L_data
@@ -502,11 +469,6 @@ unit sc32442b;
         .long _edata
         .long _edata
 .L_stack_top:
 .L_stack_top:
         .long _stack_top
         .long _stack_top
-.LDefaultHandlerAddr:
-        .long .LDefaultHandler
-        // default irq handler just returns
-.LDefaultHandler:
-        mov pc,r14
         .text
         .text
       end;
       end;
 
 

+ 0 - 683
rtl/embedded/arm/stm32f103.pp

@@ -1,683 +0,0 @@
-{
-Register definitions and utility code for STM32F103
-Preliminary startup code - TODO: interrupt handler variables
-
-Created by Jeppe Johansen 2009 - [email protected]
-}
-unit stm32f103;
-
-{$goto on}
-{$define stm32f103}
-
-interface
-
-type
- TBitvector32 = bitpacked array[0..31] of 0..1;
-
-{$PACKRECORDS 2}
-const
- PeripheralBase 	= $40000000;
-
- FSMCBase			= $60000000;
-
- APB1Base 			= PeripheralBase;
- APB2Base 			= PeripheralBase+$10000;
- AHBBase 			= PeripheralBase+$20000;
-
- SCS_BASE         = $E000E000;
-
- { FSMC }
- FSMCBank1NOR1		= FSMCBase+$00000000;
- FSMCBank1NOR2		= FSMCBase+$04000000;
- FSMCBank1NOR3		= FSMCBase+$08000000;
- FSMCBank1NOR4		= FSMCBase+$0C000000;
-
- FSMCBank1PSRAM1	= FSMCBase+$00000000;
- FSMCBank1PSRAM2	= FSMCBase+$04000000;
- FSMCBank1PSRAM3	= FSMCBase+$08000000;
- FSMCBank1PSRAM4	= FSMCBase+$0C000000;
-
- FSMCBank2NAND1	= FSMCBase+$10000000;
- FSMCBank3NAND2	= FSMCBase+$20000000;
-
- FSMCBank4PCCARD	= FSMCBase+$30000000;
-
-type
- TTimerRegisters = record
-  CR1, res1,
-  CR2, res2,
-  SMCR, res3,
-  DIER, res4,
-  SR, res5,
-  EGR, res,
-  CCMR1, res6,
-  CCMR2, res7,
-  CCER, res8,
-  CNT, res9,
-  PSC, res10,
-  ARR, res11,
-  RCR, res12,
-  CCR1, res13,
-  CCR2, res14,
-  CCR3, res15,
-  CCR4, res16,
-  BDTR, res17,
-  DCR, res18,
-  DMAR, res19: Word;
- end;
-
- TRTCRegisters = record
-  CRH, res1,
-  CRL, res2,
-  PRLH, res3,
-  PRLL, res4,
-  DIVH, res5,
-  DIVL, res6,
-  CNTH, res7,
-  CNTL, res8,
-  ALRH, res9,
-  ALRL, res10: Word;
- end;
-
- TIWDGRegisters = record
-  KR, res1,
-  PR, res2,
-  RLR, res3,
-  SR, res4: word;
- end;
-
- TWWDGRegisters = record
-  CR, res2,
-  CFR, res3,
-  SR, res4: word;
- end;
-
- TSPIRegisters = record
-  CR1, res1,
-  CR2, res2,
-  SR, res3,
-  DR, res4,
-  CRCPR, res5,
-  RXCRCR, res6,
-  TXCRCR, res7,
-  I2SCFGR, res8,
-  I2SPR, res9: Word;
- end;
-
- TUSARTRegisters = record
-  SR, res1,
-  DR, res2,
-  BRR, res3,
-  CR1, res4,
-  CR2, res5,
-  CR3, res6,
-  GTPR, res7: Word;
- end;
-
- TI2CRegisters = record
-  CR1, res1,
-  CR2, res2,
-  OAR1, res3,
-  OAR2, res4,
-  DR, res5,
-  SR1, res6,
-  SR2, res7,
-  CCR, res8: word;
-  TRISE: byte;
- end;
-
- TUSBRegisters = record
-  EPR: array[0..7] of DWord;
-
-  res: array[0..7] of dword;
-
-  CNTR, res1,
-  ISTR, res2,
-  FNR, res3: Word;
-  DADDR: byte; res4: word; res5: byte;
-  BTABLE: Word;
- end;
-
- TUSBMem = packed array[0..511] of byte;
-
- TCANMailbox = record
-  IR,
-  DTR,
-  DLR,
-  DHR: DWord;
- end;
-
- TCANRegisters = record
-  MCR,
-  MSR,
-  TSR,
-  RF0R,
-  RF1R,
-  IER,
-  ESR,
-  BTR: DWord;
-
-  res5: array[$020..$17F] of byte;
-
-  TX: array[0..2] of TCANMailbox;
-  RX: array[0..2] of TCANMailbox;
-
-  res6: array[$1D0..$1FF] of byte;
-
-  FMR,
-  FM1R,
-  res9: DWord;
-  FS1R, res10: word;
-  res11: DWord;
-  FFA1R, res12: word;
-  res13: DWord;
-  FA1R, res14: word;
-  res15: array[$220..$23F] of byte;
-
-  FOR1,
-  FOR2: DWord;
-
-  FB: array[1..13] of array[1..2] of DWord;
- end;
-
- TBKPRegisters = record
-  DR: array[1..10] of record data, res: word; end;
-
-  RTCCR,
-  CR,
-  CSR,
-  res1,res2: DWord;
-
-  DR2: array[11..42] of record data, res: word; end;
- end;
-
- TPwrRegisters = record
-  CR, res: word;
-  CSR: Word;
- end;
-
- TDACRegisters = record
-  CR,
-  SWTRIGR: DWord;
-
-  DHR12R1, res2,
-  DHR12L1, res3,
-  DHR8R1, res4,
-  DHR12R2, res5,
-  DHR12L2, res6,
-  DHR8R2, res7: word;
-
-  DHR12RD,
-  DHR12LD: DWord;
-
-  DHR8RD, res8,
-
-  DOR1, res9,
-  DOR2, res10: Word;
- end;
-
- TAFIORegisters = record
-  EVCR,
-  MAPR: DWord;
-  EXTICR: array[0..3] of DWord;
- end;
-
- TEXTIRegisters = record
-  IMR,
-  EMR,
-  RTSR,
-  FTSR,
-  SWIER,
-  PR: DWord;
- end;
-
- TPortRegisters = record
-  CRL,
-  CRH,
-  IDR,
-  ODR,
-  BSRR,
-  BRR,
-  LCKR: DWord;
- end;
-
- TADCRegisters = record
-  SR,
-  CR1,
-  CR2,
-  SMPR1,
-  SMPR2: DWord;
-  JOFR1, res2,
-  JOFR2, res3,
-  JOFR3, res4,
-  JOFR4, res5,
-  HTR, res6,
-  LTR, res7: word;
-  SQR1,
-  SQR2,
-  SQR3,
-  JSQR: DWord;
-  JDR1, res8,
-  JDR2, res9,
-  JDR3, res10,
-  JDR4, res11: Word;
-  DR: DWord;
- end;
-
- TSDIORegisters = record
-  POWER,
-  CLKCR,
-  ARG: DWord;
-  CMD, res3,
-  RESPCMD, res4: Word;
-  RESP1,
-  RESP2,
-  RESP3,
-  RESP4,
-  DTIMER,
-  DLEN: DWord;
-  DCTRL, res5: word;
-  DCOUNT,
-  STA,
-  ICR,
-  MASK,
-  FIFOCNT,
-  FIFO: DWord;
- end;
-
- TDMAChannel = record
-  CCR, res1,
-  CNDTR, res2: word;
-  CPAR,
-  CMAR,
-  res: DWord;
- end;
-
- TDMARegisters = record
-  ISR,
-  IFCR: DWord;
-  Channel: array[0..7] of TDMAChannel;
- end;
-
- TRCCRegisters = record
-  CR,
-  CFGR,
-  CIR,
-  APB2RSTR,
-  APB1RSTR,
-  AHBENR,
-  APB2ENR,
-  APB1ENR,
-  BDCR,
-  CSR: DWord;
- end;
-
- TCRCRegisters = record
-  DR: DWord;
-  IDR: byte; res1: word; res2: byte;
-  CR: byte;
- end;
-
- TFSMCRegisters = record
-  nothingyet: byte;
- end;
-
- TFlashRegisters = record
-  ACR,
-  KEYR,
-  OPTKEYR,
-  SR,
-  CR,
-  AR,
-  res,
-  OBR,
-  WRPR: DWord;
- end;
-
- TNVICRegisters = packed record
-  ISER: array[0..7] of longword;
-   reserved0: array[0..23] of longword;
-  ICER: array[0..7] of longword;
-   reserved1: array[0..23] of longword;
-  ISPR: array[0..7] of longword;
-   reserved2: array[0..23] of longword;
-  ICPR: array[0..7] of longword;
-   reserved3: array[0..23] of longword;
-  IABR: array[0..7] of longword;
-   reserved4: array[0..55] of longword;
-  IP: array[0..239] of longword;
-   reserved5: array[0..643] of longword;
-  STIR: longword;
- end;
-
- TSCBRegisters = packed record
-  CPUID,                            {!< CPU ID Base Register                                     }
-  ICSR,                             {!< Interrupt Control State Register                         }
-  VTOR,                             {!< Vector Table Offset Register                             }
-  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
-  SCR,                              {!< System Control Register                                  }
-  CCR: longword;                    {!< Configuration Control Register                           }
-  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
-  SHCSR,                            {!< System Handler Control and State Register                }
-  CFSR,                             {!< Configurable Fault Status Register                       }
-  HFSR,                             {!< Hard Fault Status Register                               }
-  DFSR,                             {!< Debug Fault Status Register                              }
-  MMFAR,                            {!< Mem Manage Address Register                              }
-  BFAR,                             {!< Bus Fault Address Register                               }
-  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
-  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
-  DFR,                              {!< Debug Feature Register                                   }
-  ADR: longword;                    {!< Auxiliary Feature Register                               }
-  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
-  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
- end;
-
- TSysTickRegisters = packed record
-  Ctrl,
-  Load,
-  Val,
-  Calib: longword;
- end;
-
-{$ALIGN 2}
-var
- { Timers }
- Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
- Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
- Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
- Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
- Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
- Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
- Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
- Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
-
- { RTC }
- RTC: TRTCRegisters 			absolute (APB1Base+$2800);
-
- { WDG }
- WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
- IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
-
- { SPI }
- SPI1: TSPIRegisters			absolute (APB2Base+$3000);
- SPI2: TSPIRegisters			absolute (APB1Base+$3800);
- SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
-
- { USART/UART }
- USART1: TUSARTRegisters	absolute (APB2Base+$3800);
- USART2: TUSARTRegisters	absolute (APB1Base+$4400);
- USART3: TUSARTRegisters	absolute (APB1Base+$4800);
- UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
- UART5: TUSARTRegisters		absolute (APB1Base+$5000);
-
- { I2C }
- I2C1: TI2CRegisters			absolute (APB1Base+$5400);
- I2C2: TI2CRegisters			absolute (APB1Base+$5800);
-
- { USB }
- USB: TUSBRegisters			absolute (APB1Base+$5C00);
- USBMem: TUSBMem                        absolute (APB1Base+$6000);
-
- { CAN }
- CAN: TCANRegisters			absolute (APB1Base+$6800);
-
- { BKP }
- BKP: TBKPRegisters			absolute (APB1Base+$6C00);
-
- { PWR }
- PWR: TPwrRegisters			absolute (APB1Base+$7000);
-
- { DAC }
- DAC: TDACRegisters			absolute (APB1Base+$7400);
-
- { GPIO }
- AFIO: TAFIORegisters		absolute (APB2Base+$0);
- EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
-
- PortA: TPortRegisters		absolute (APB2Base+$0800);
- PortB: TPortRegisters		absolute (APB2Base+$0C00);
- PortC: TPortRegisters		absolute (APB2Base+$1000);
- PortD: TPortRegisters		absolute (APB2Base+$1400);
- PortE: TPortRegisters		absolute (APB2Base+$1800);
- PortF: TPortRegisters		absolute (APB2Base+$1C00);
- PortG: TPortRegisters		absolute (APB2Base+$2000);
-
- { ADC }
- ADC1: TADCRegisters			absolute (APB2Base+$2400);
- ADC2: TADCRegisters			absolute (APB2Base+$2800);
- ADC3: TADCRegisters			absolute (APB2Base+$3C00);
-
- { SDIO }
- SDIO: TSDIORegisters		absolute (APB2Base+$8000);
-
- { DMA }
- DMA1: TDMARegisters			absolute (AHBBase+$0000);
- DMA2: TDMARegisters			absolute (AHBBase+$0400);
-
- { RCC }
- RCC: TRCCRegisters			absolute (AHBBase+$1000);
-
- { Flash }
- Flash: TFlashRegisters		absolute (AHBBase+$2000);
-
- { CRC }
- CRC: TCRCRegisters			absolute (AHBBase+$3000);
-
- { SCB }
- SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
-
- { SysTick }
- SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
-
- { NVIC }
- NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
-
-var
-	NMI_Handler,
-	HardFault_Handler,
-	MemManage_Handler,
-	BusFault_Handler,
-	UsageFault_Handler,
-	SWI_Handler,
-	DebugMonitor_Handler,
-	PendingSV_Handler,
-	Systick_Handler: pointer;
-
-implementation
-
-var
-	_data: record end; external name '_data';
-	_edata: record end; external name '_edata';
-	_etext: record end; external name '_etext';
-	_bss_start: record end; external name '_bss_start';
-	_bss_end: record end; external name '_bss_end';
-	_stack_top: record end; external name '_stack_top';
-
-procedure PASCALMAIN; external name 'PASCALMAIN';
-
-procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
-asm
-.Lhalt:
-	b .Lhalt
-end;
-
-procedure _FPC_start; assembler; nostackframe;
-label _start;
-asm
-	.init
-	.balign 16
-	
-	.long _stack_top	 			// First entry in NVIC table is the new stack pointer
-	.long _start+1
-	//b   _start					// Reset
-	.long _start+1
-	//b	 .LNMI_Addr				// Non maskable interrupt. The RCC Clock Security System (CSS) is linked to the NMI vector.
-	.long _start+1
-	//b	 .LHardFault_Addr		// All class of fault
-	.long _start+1
-	//b	 .LMemManage_Addr		// Memory management
-	.long _start+1
-	//b	 .LBusFault_Addr		// Pre-fetch fault, memory access fault
-	.long _start+1
-	//b	 .LUsageFault_Addr	// Undefined instruction or illegal state
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LSWI_Addr				// Software Interrupt vector
-	.long _start+1
-	//b	 .LDebugMonitor_Addr	// Debug Monitor
-	.long _start+1
-	//nop							// Reserved
-	.long _start+1
-	//b	 .LPendingSV_Addr		//	Pendable request for system service
-	.long _start+1
-	//b	 .LSystick_Addr		// System tick timer
-	//17
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	//20
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-	.long .LDefaultHandler+1
-
-.LNMI_Addr:
-	ldr r0,.L1
-	ldr pc,[r0]
-.LHardFault_Addr:
-	ldr r0,.L2
-	ldr pc,[r0]
-.LMemManage_Addr:
-	ldr r0,.L3
-	ldr pc,[r0]
-.LBusFault_Addr:
-	ldr r0,.L4
-	ldr pc,[r0]
-.LUsageFault_Addr:
-	ldr r0,.L5
-	ldr pc,[r0]
-.LSWI_Addr:
-	ldr r0,.L6
-	ldr pc,[r0]
-.LDebugMonitor_Addr:
-	ldr r0,.L7
-	ldr pc,[r0]
-.LPendingSV_Addr:
-	ldr r0,.L8
-	ldr pc,[r0]
-.LSystick_Addr:
-	ldr r0,.L9
-	ldr pc,[r0]
-
-.L1:
-	.long NMI_Handler
-.L2:
-	.long HardFault_Handler
-.L3:
-	.long MemManage_Handler
-.L4:
-	.long BusFault_Handler
-.L5:
-	.long UsageFault_Handler
-.L6:
-	.long SWI_Handler
-.L7:
-	.long DebugMonitor_Handler
-.L8:
-	.long PendingSV_Handler
-.L9:
-	.long Systick_Handler
-
-	.globl _start
-	.text
-_start:
-	
-	// Copy initialized data to ram
-	ldr r1,.L_etext
-	ldr r2,.L_data
-	ldr r3,.L_edata
-.Lcopyloop:
-	cmp r2,r3
-	ittt ls
-	ldrls r0,[r1],#4
-	strls r0,[r2],#4
-	bls .Lcopyloop
-
-	// clear onboard ram
-	ldr r1,.L_bss_start
-	ldr r2,.L_bss_end
-	mov r0,#0
-.Lzeroloop:
-	cmp r1,r2
-	itt ls
-	strls r0,[r1],#4
-	bls .Lzeroloop
-
-	b PASCALMAIN
-	b _FPC_haltproc
-
-.L_bss_start:
-	.long _bss_start
-.L_bss_end:
-	.long _bss_end
-.L_etext:
-	.long _etext
-.L_data:
-	.long _data
-.L_edata:
-	.long _edata
-.LDefaultHandlerAddr:
-	.long .LDefaultHandler
-	// default irq handler just returns
-.LDefaultHandler:
-	mov pc,r14
-end;
-
-end.
-

+ 788 - 0
rtl/embedded/arm/stm32f10x_conn.pp

@@ -0,0 +1,788 @@
+{
+Register definitions and utility code for STM32F10x - Connectivity line
+
+Created by Jeppe Johansen 2012 - [email protected]
+}
+unit stm32f10x_conn;
+
+{$goto on}
+{$define stm32f10x_conn}
+
+interface
+
+type
+ TBitvector32 = bitpacked array[0..31] of 0..1;
+
+{$PACKRECORDS 2}
+const
+ PeripheralBase 	= $40000000;
+
+ FSMCBase			= $60000000;
+
+ APB1Base 			= PeripheralBase;
+ APB2Base 			= PeripheralBase+$10000;
+ AHBBase 			= PeripheralBase+$20000;
+
+ SCS_BASE         = $E000E000;
+
+ { FSMC }
+ FSMCBank1NOR1		= FSMCBase+$00000000;
+ FSMCBank1NOR2		= FSMCBase+$04000000;
+ FSMCBank1NOR3		= FSMCBase+$08000000;
+ FSMCBank1NOR4		= FSMCBase+$0C000000;
+
+ FSMCBank1PSRAM1	= FSMCBase+$00000000;
+ FSMCBank1PSRAM2	= FSMCBase+$04000000;
+ FSMCBank1PSRAM3	= FSMCBase+$08000000;
+ FSMCBank1PSRAM4	= FSMCBase+$0C000000;
+
+ FSMCBank2NAND1	= FSMCBase+$10000000;
+ FSMCBank3NAND2	= FSMCBase+$20000000;
+
+ FSMCBank4PCCARD	= FSMCBase+$30000000;
+
+type
+ TTimerRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SMCR, res3,
+  DIER, res4,
+  SR, res5,
+  EGR, res,
+  CCMR1, res6,
+  CCMR2, res7,
+  CCER, res8,
+  CNT, res9,
+  PSC, res10,
+  ARR, res11,
+  RCR, res12,
+  CCR1, res13,
+  CCR2, res14,
+  CCR3, res15,
+  CCR4, res16,
+  BDTR, res17,
+  DCR, res18,
+  DMAR, res19: Word;
+ end;
+
+ TRTCRegisters = record
+  CRH, res1,
+  CRL, res2,
+  PRLH, res3,
+  PRLL, res4,
+  DIVH, res5,
+  DIVL, res6,
+  CNTH, res7,
+  CNTL, res8,
+  ALRH, res9,
+  ALRL, res10: Word;
+ end;
+
+ TIWDGRegisters = record
+  KR, res1,
+  PR, res2,
+  RLR, res3,
+  SR, res4: word;
+ end;
+
+ TWWDGRegisters = record
+  CR, res2,
+  CFR, res3,
+  SR, res4: word;
+ end;
+
+ TSPIRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SR, res3,
+  DR, res4,
+  CRCPR, res5,
+  RXCRCR, res6,
+  TXCRCR, res7,
+  I2SCFGR, res8,
+  I2SPR, res9: Word;
+ end;
+
+ TUSARTRegisters = record
+  SR, res1,
+  DR, res2,
+  BRR, res3,
+  CR1, res4,
+  CR2, res5,
+  CR3, res6,
+  GTPR, res7: Word;
+ end;
+
+ TI2CRegisters = record
+  CR1, res1,
+  CR2, res2,
+  OAR1, res3,
+  OAR2, res4,
+  DR, res5,
+  SR1, res6,
+  SR2, res7,
+  CCR, res8: word;
+  TRISE: byte;
+ end;
+
+ TUSBRegisters = record
+  EPR: array[0..7] of longword;
+
+  res: array[0..7] of longword;
+
+  CNTR, res1,
+  ISTR, res2,
+  FNR, res3: Word;
+  DADDR: byte; res4: word; res5: byte;
+  BTABLE: Word;
+ end;
+
+ TUSBMem = packed array[0..511] of byte;
+
+ TCANMailbox = record
+  IR,
+  DTR,
+  DLR,
+  DHR: longword;
+ end;
+
+ TCANRegisters = record
+  MCR,
+  MSR,
+  TSR,
+  RF0R,
+  RF1R,
+  IER,
+  ESR,
+  BTR: longword;
+
+  res5: array[$020..$17F] of byte;
+
+  TX: array[0..2] of TCANMailbox;
+  RX: array[0..2] of TCANMailbox;
+
+  res6: array[$1D0..$1FF] of byte;
+
+  FMR,
+  FM1R,
+  res9: longword;
+  FS1R, res10: word;
+  res11: longword;
+  FFA1R, res12: word;
+  res13: longword;
+  FA1R, res14: word;
+  res15: array[$220..$23F] of byte;
+
+  FOR1,
+  FOR2: longword;
+
+  FB: array[1..13] of array[1..2] of longword;
+ end;
+
+ TBKPRegisters = record
+  DR: array[1..10] of record data, res: word; end;
+
+  RTCCR,
+  CR,
+  CSR,
+  res1,res2: longword;
+
+  DR2: array[11..42] of record data, res: word; end;
+ end;
+
+ TPwrRegisters = record
+  CR, res: word;
+  CSR: Word;
+ end;
+
+ TDACRegisters = record
+  CR,
+  SWTRIGR: longword;
+
+  DHR12R1, res2,
+  DHR12L1, res3,
+  DHR8R1, res4,
+  DHR12R2, res5,
+  DHR12L2, res6,
+  DHR8R2, res7: word;
+
+  DHR12RD,
+  DHR12LD: longword;
+
+  DHR8RD, res8,
+
+  DOR1, res9,
+  DOR2, res10: Word;
+ end;
+
+ TAFIORegisters = record
+  EVCR,
+  MAPR: longword;
+  EXTICR: array[0..3] of longword;
+ end;
+
+ TEXTIRegisters = record
+  IMR,
+  EMR,
+  RTSR,
+  FTSR,
+  SWIER,
+  PR: longword;
+ end;
+
+ TPortRegisters = record
+  CRL,
+  CRH,
+  IDR,
+  ODR,
+  BSRR,
+  BRR,
+  LCKR: longword;
+ end;
+
+ TADCRegisters = record
+  SR,
+  CR1,
+  CR2,
+  SMPR1,
+  SMPR2: longword;
+  JOFR1, res2,
+  JOFR2, res3,
+  JOFR3, res4,
+  JOFR4, res5,
+  HTR, res6,
+  LTR, res7: word;
+  SQR1,
+  SQR2,
+  SQR3,
+  JSQR: longword;
+  JDR1, res8,
+  JDR2, res9,
+  JDR3, res10,
+  JDR4, res11: Word;
+  DR: longword;
+ end;
+
+ TSDIORegisters = record
+  POWER,
+  CLKCR,
+  ARG: longword;
+  CMD, res3,
+  RESPCMD, res4: Word;
+  RESP1,
+  RESP2,
+  RESP3,
+  RESP4,
+  DTIMER,
+  DLEN: longword;
+  DCTRL, res5: word;
+  DCOUNT,
+  STA,
+  ICR,
+  MASK,
+  FIFOCNT,
+  FIFO: longword;
+ end;
+
+ TDMAChannel = record
+  CCR, res1,
+  CNDTR, res2: word;
+  CPAR,
+  CMAR,
+  res: longword;
+ end;
+
+ TDMARegisters = record
+  ISR,
+  IFCR: longword;
+  Channel: array[0..7] of TDMAChannel;
+ end;
+
+ TRCCRegisters = record
+  CR,
+  CFGR,
+  CIR,
+  APB2RSTR,
+  APB1RSTR,
+  AHBENR,
+  APB2ENR,
+  APB1ENR,
+  BDCR,
+  CSR: longword;
+ end;
+
+ TCRCRegisters = record
+  DR: longword;
+  IDR: byte; res1: word; res2: byte;
+  CR: byte;
+ end;
+
+ TFSMCRegisters = record
+  nothingyet: byte;
+ end;
+
+ TFlashRegisters = record
+  ACR,
+  KEYR,
+  OPTKEYR,
+  SR,
+  CR,
+  AR,
+  res,
+  OBR,
+  WRPR: longword;
+ end;
+
+ TNVICRegisters = record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ end;
+
+ TSCBRegisters = record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                             {!< Interrupt Control State Register                         }
+  VTOR,                             {!< Vector Table Offset Register                             }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                  }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
+  SHCSR,                            {!< System Handler Control and State Register                }
+  CFSR,                             {!< Configurable Fault Status Register                       }
+  HFSR,                             {!< Hard Fault Status Register                               }
+  DFSR,                             {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                              }
+  BFAR,                             {!< Bus Fault Address Register                               }
+  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+ TSysTickRegisters = record
+  Ctrl,
+  Load,
+  Val,
+  Calib: longword;
+ end;
+
+{$ALIGN 2}
+var
+ { Timers }
+ Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
+ Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
+ Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
+ Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
+ Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
+ Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
+ Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
+ Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
+
+ { RTC }
+ RTC: TRTCRegisters 			absolute (APB1Base+$2800);
+
+ { WDG }
+ WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
+ IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
+
+ { SPI }
+ SPI1: TSPIRegisters			absolute (APB2Base+$3000);
+ SPI2: TSPIRegisters			absolute (APB1Base+$3800);
+ SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
+
+ { USART/UART }
+ USART1: TUSARTRegisters	absolute (APB2Base+$3800);
+ USART2: TUSARTRegisters	absolute (APB1Base+$4400);
+ USART3: TUSARTRegisters	absolute (APB1Base+$4800);
+ UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
+ UART5: TUSARTRegisters		absolute (APB1Base+$5000);
+
+ { I2C }
+ I2C1: TI2CRegisters			absolute (APB1Base+$5400);
+ I2C2: TI2CRegisters			absolute (APB1Base+$5800);
+
+ { USB }
+ USB: TUSBRegisters			absolute (APB1Base+$5C00);
+ USBMem: TUSBMem                        absolute (APB1Base+$6000);
+
+ { CAN }
+ CAN: TCANRegisters			absolute (APB1Base+$6800);
+
+ { BKP }
+ BKP: TBKPRegisters			absolute (APB1Base+$6C00);
+
+ { PWR }
+ PWR: TPwrRegisters			absolute (APB1Base+$7000);
+
+ { DAC }
+ DAC: TDACRegisters			absolute (APB1Base+$7400);
+
+ { GPIO }
+ AFIO: TAFIORegisters		absolute (APB2Base+$0);
+ EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
+
+ PortA: TPortRegisters		absolute (APB2Base+$0800);
+ PortB: TPortRegisters		absolute (APB2Base+$0C00);
+ PortC: TPortRegisters		absolute (APB2Base+$1000);
+ PortD: TPortRegisters		absolute (APB2Base+$1400);
+ PortE: TPortRegisters		absolute (APB2Base+$1800);
+ PortF: TPortRegisters		absolute (APB2Base+$1C00);
+ PortG: TPortRegisters		absolute (APB2Base+$2000);
+
+ { ADC }
+ ADC1: TADCRegisters			absolute (APB2Base+$2400);
+ ADC2: TADCRegisters			absolute (APB2Base+$2800);
+ ADC3: TADCRegisters			absolute (APB2Base+$3C00);
+
+ { SDIO }
+ SDIO: TSDIORegisters		absolute (APB2Base+$8000);
+
+ { DMA }
+ DMA1: TDMARegisters			absolute (AHBBase+$0000);
+ DMA2: TDMARegisters			absolute (AHBBase+$0400);
+
+ { RCC }
+ RCC: TRCCRegisters			absolute (AHBBase+$1000);
+
+ { Flash }
+ Flash: TFlashRegisters		absolute (AHBBase+$2000);
+
+ { CRC }
+ CRC: TCRCRegisters			absolute (AHBBase+$3000);
+
+ { SCB }
+ SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
+
+ { SysTick }
+ SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
+
+ { NVIC }
+ NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Window_Watchdog_interrupt; external name 'Window_Watchdog_interrupt';
+procedure PVD_through_EXTI_Line_detection_interrupt; external name 'PVD_through_EXTI_Line_detection_interrupt';
+procedure Tamper_interrupt; external name 'Tamper_interrupt';
+procedure RTC_global_interrupt; external name 'RTC_global_interrupt';
+procedure Flash_global_interrupt; external name 'Flash_global_interrupt';
+procedure RCC_global_interrupt; external name 'RCC_global_interrupt';
+procedure EXTI_Line0_interrupt; external name 'EXTI_Line0_interrupt';
+procedure EXTI_Line1_interrupt; external name 'EXTI_Line1_interrupt';
+procedure EXTI_Line2_interrupt; external name 'EXTI_Line2_interrupt';
+procedure EXTI_Line3_interrupt; external name 'EXTI_Line3_interrupt';
+procedure EXTI_Line4_interrupt; external name 'EXTI_Line4_interrupt';
+procedure DMA1_Channel1_global_interrupt; external name 'DMA1_Channel1_global_interrupt';
+procedure DMA1_Channel2_global_interrupt; external name 'DMA1_Channel2_global_interrupt';
+procedure DMA1_Channel3_global_interrupt; external name 'DMA1_Channel3_global_interrupt';
+procedure DMA1_Channel4_global_interrupt; external name 'DMA1_Channel4_global_interrupt';
+procedure DMA1_Channel5_global_interrupt; external name 'DMA1_Channel5_global_interrupt';
+procedure DMA1_Channel6_global_interrupt; external name 'DMA1_Channel6_global_interrupt';
+procedure DMA1_Channel7_global_interrupt; external name 'DMA1_Channel7_global_interrupt';
+procedure ADC1_and_ADC2_global_interrupt; external name 'ADC1_and_ADC2_global_interrupt';
+procedure CAN1_TX_interrupts; external name 'CAN1_TX_interrupts';
+procedure CAN1_RX0_interrupts; external name 'CAN1_RX0_interrupts';
+procedure CAN1_RX1_interrupt; external name 'CAN1_RX1_interrupt';
+procedure CAN1_SCE_interrupt; external name 'CAN1_SCE_interrupt';
+procedure EXTI_Line9_5_interrupts; external name 'EXTI_Line9_5_interrupts';
+procedure TIM1_Break_interrupt; external name 'TIM1_Break_interrupt';
+procedure TIM1_Update_interrupt; external name 'TIM1_Update_interrupt';
+procedure TIM1_Trigger_and_Commutation_interrupts; external name 'TIM1_Trigger_and_Commutation_interrupts';
+procedure TIM1_Capture_Compare_interrupt; external name 'TIM1_Capture_Compare_interrupt';
+procedure TIM2_global_interrupt; external name 'TIM2_global_interrupt';
+procedure TIM3_global_interrupt; external name 'TIM3_global_interrupt';
+procedure TIM4_global_interrupt; external name 'TIM4_global_interrupt';
+procedure I2C1_event_interrupt; external name 'I2C1_event_interrupt';
+procedure I2C1_error_interrupt; external name 'I2C1_error_interrupt';
+procedure I2C2_event_interrupt; external name 'I2C2_event_interrupt';
+procedure I2C2_error_interrupt; external name 'I2C2_error_interrupt';
+procedure SPI1_global_interrupt; external name 'SPI1_global_interrupt';
+procedure SPI2_global_interrupt; external name 'SPI2_global_interrupt';
+procedure USART1_global_interrupt; external name 'USART1_global_interrupt';
+procedure USART2_global_interrupt; external name 'USART2_global_interrupt';
+procedure USART3_global_interrupt; external name 'USART3_global_interrupt';
+procedure EXTI_Line15_10_interrupts; external name 'EXTI_Line15_10_interrupts';
+procedure RTC_alarm_through_EXTI_line_interrupt; external name 'RTC_alarm_through_EXTI_line_interrupt';
+procedure USB_OTG_FS_Wakeup_through_EXTI_line_interrupt; external name 'USB_OTG_FS_Wakeup_through_EXTI_line_interrupt';
+procedure TIM5_global_interrupt; external name 'TIM5_global_interrupt';
+procedure SPI3_global_interrupt; external name 'SPI3_global_interrupt';
+procedure UART4_global_interrupt; external name 'UART4_global_interrupt';
+procedure UART5_global_interrupt; external name 'UART5_global_interrupt';
+procedure TIM6_global_interrupt; external name 'TIM6_global_interrupt';
+procedure TIM7_global_interrupt; external name 'TIM7_global_interrupt';
+procedure DMA2_Channel1_global_interrupt; external name 'DMA2_Channel1_global_interrupt';
+procedure DMA2_Channel2_global_interrupt; external name 'DMA2_Channel2_global_interrupt';
+procedure DMA2_Channel3_global_interrupt; external name 'DMA2_Channel3_global_interrupt';
+procedure DMA2_Channel4_global_interrupt; external name 'DMA2_Channel4_global_interrupt';
+procedure DMA2_Channel5_global_interrupt; external name 'DMA2_Channel5_global_interrupt';
+procedure Ethernet_global_interrupt; external name 'Ethernet_global_interrupt';
+procedure Ethernet_Wakeup_through_EXTI_line_interrupt; external name 'Ethernet_Wakeup_through_EXTI_line_interrupt';
+procedure CAN2_TX_interrupts; external name 'CAN2_TX_interrupts';
+procedure CAN2_RX0_interrupts; external name 'CAN2_RX0_interrupts';
+procedure CAN2_RX1_interrupt; external name 'CAN2_RX1_interrupt';
+procedure CAN2_SCE_interrupt; external name 'CAN2_SCE_interrupt';
+procedure USB_On_The_Go_FS_global_interrupt; external name 'USB_On_The_Go_FS_global_interrupt';
+
+{$i cortexm3_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+   .section ".init.interrupt_vectors"
+interrupt_vectors:
+   .long _stack_top
+   .long Startup
+   .long NMI_interrupt
+   .long Hardfault_interrupt
+   .long MemManage_interrupt
+   .long BusFault_interrupt
+   .long UsageFault_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long SWI_interrupt
+   .long DebugMonitor_interrupt
+   .long 0
+   .long PendingSV_interrupt
+   .long SysTick_interrupt
+   
+   .long Window_Watchdog_interrupt
+   .long PVD_through_EXTI_Line_detection_interrupt
+   .long Tamper_interrupt
+   .long RTC_global_interrupt
+   .long Flash_global_interrupt
+   .long RCC_global_interrupt
+   .long EXTI_Line0_interrupt
+   .long EXTI_Line1_interrupt
+   .long EXTI_Line2_interrupt
+   .long EXTI_Line3_interrupt
+   .long EXTI_Line4_interrupt
+   .long DMA1_Channel1_global_interrupt
+   .long DMA1_Channel2_global_interrupt
+   .long DMA1_Channel3_global_interrupt
+   .long DMA1_Channel4_global_interrupt
+   .long DMA1_Channel5_global_interrupt
+   .long DMA1_Channel6_global_interrupt
+   .long DMA1_Channel7_global_interrupt
+   .long ADC1_and_ADC2_global_interrupt
+   .long CAN1_TX_interrupts
+   .long CAN1_RX0_interrupts
+   .long CAN1_RX1_interrupt
+   .long CAN1_SCE_interrupt
+   .long EXTI_Line9_5_interrupts
+   .long TIM1_Break_interrupt
+   .long TIM1_Update_interrupt
+   .long TIM1_Trigger_and_Commutation_interrupts
+   .long TIM1_Capture_Compare_interrupt
+   .long TIM2_global_interrupt
+   .long TIM3_global_interrupt
+   .long TIM4_global_interrupt
+   .long I2C1_event_interrupt
+   .long I2C1_error_interrupt
+   .long I2C2_event_interrupt
+   .long I2C2_error_interrupt
+   .long SPI1_global_interrupt
+   .long SPI2_global_interrupt
+   .long USART1_global_interrupt
+   .long USART2_global_interrupt
+   .long USART3_global_interrupt
+   .long EXTI_Line15_10_interrupts
+   .long RTC_alarm_through_EXTI_line_interrupt
+   .long USB_OTG_FS_Wakeup_through_EXTI_line_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long TIM5_global_interrupt
+   .long SPI3_global_interrupt
+   .long UART4_global_interrupt
+   .long UART5_global_interrupt
+   .long TIM6_global_interrupt
+   .long TIM7_global_interrupt
+   .long DMA2_Channel1_global_interrupt
+   .long DMA2_Channel2_global_interrupt
+   .long DMA2_Channel3_global_interrupt
+   .long DMA2_Channel4_global_interrupt
+   .long DMA2_Channel5_global_interrupt
+   .long Ethernet_global_interrupt
+   .long Ethernet_Wakeup_through_EXTI_line_interrupt
+   .long CAN2_TX_interrupts
+   .long CAN2_RX0_interrupts
+   .long CAN2_RX1_interrupt
+   .long CAN2_SCE_interrupt
+   .long USB_On_The_Go_FS_global_interrupt
+   
+   .weak NMI_interrupt
+   .weak Hardfault_interrupt
+   .weak MemManage_interrupt
+   .weak BusFault_interrupt
+   .weak UsageFault_interrupt
+   .weak SWI_interrupt
+   .weak DebugMonitor_interrupt
+   .weak PendingSV_interrupt
+   .weak SysTick_interrupt
+   
+   .weak Window_Watchdog_interrupt
+   .weak PVD_through_EXTI_Line_detection_interrupt
+   .weak Tamper_interrupt
+   .weak RTC_global_interrupt
+   .weak Flash_global_interrupt
+   .weak RCC_global_interrupt
+   .weak EXTI_Line0_interrupt
+   .weak EXTI_Line1_interrupt
+   .weak EXTI_Line2_interrupt
+   .weak EXTI_Line3_interrupt
+   .weak EXTI_Line4_interrupt
+   .weak DMA1_Channel1_global_interrupt
+   .weak DMA1_Channel2_global_interrupt
+   .weak DMA1_Channel3_global_interrupt
+   .weak DMA1_Channel4_global_interrupt
+   .weak DMA1_Channel5_global_interrupt
+   .weak DMA1_Channel6_global_interrupt
+   .weak DMA1_Channel7_global_interrupt
+   .weak ADC1_and_ADC2_global_interrupt
+   .weak CAN1_TX_interrupts
+   .weak CAN1_RX0_interrupts
+   .weak CAN1_RX1_interrupt
+   .weak CAN1_SCE_interrupt
+   .weak EXTI_Line9_5_interrupts
+   .weak TIM1_Break_interrupt
+   .weak TIM1_Update_interrupt
+   .weak TIM1_Trigger_and_Commutation_interrupts
+   .weak TIM1_Capture_Compare_interrupt
+   .weak TIM2_global_interrupt
+   .weak TIM3_global_interrupt
+   .weak TIM4_global_interrupt
+   .weak I2C1_event_interrupt
+   .weak I2C1_error_interrupt
+   .weak I2C2_event_interrupt
+   .weak I2C2_error_interrupt
+   .weak SPI1_global_interrupt
+   .weak SPI2_global_interrupt
+   .weak USART1_global_interrupt
+   .weak USART2_global_interrupt
+   .weak USART3_global_interrupt
+   .weak EXTI_Line15_10_interrupts
+   .weak RTC_alarm_through_EXTI_line_interrupt
+   .weak USB_OTG_FS_Wakeup_through_EXTI_line_interrupt
+   .weak TIM5_global_interrupt
+   .weak SPI3_global_interrupt
+   .weak UART4_global_interrupt
+   .weak UART5_global_interrupt
+   .weak TIM6_global_interrupt
+   .weak TIM7_global_interrupt
+   .weak DMA2_Channel1_global_interrupt
+   .weak DMA2_Channel2_global_interrupt
+   .weak DMA2_Channel3_global_interrupt
+   .weak DMA2_Channel4_global_interrupt
+   .weak DMA2_Channel5_global_interrupt
+   .weak Ethernet_global_interrupt
+   .weak Ethernet_Wakeup_through_EXTI_line_interrupt
+   .weak CAN2_TX_interrupts
+   .weak CAN2_RX0_interrupts
+   .weak CAN2_RX1_interrupt
+   .weak CAN2_SCE_interrupt
+   .weak USB_On_The_Go_FS_global_interrupt
+
+   
+   .set NMI_interrupt, Startup
+   .set Hardfault_interrupt, Startup
+   .set MemManage_interrupt, Startup
+   .set BusFault_interrupt, Startup
+   .set UsageFault_interrupt, Startup
+   .set SWI_interrupt, Startup
+   .set DebugMonitor_interrupt, Startup
+   .set PendingSV_interrupt, Startup
+   .set SysTick_interrupt, Startup
+
+   .set Window_Watchdog_interrupt, Startup
+   .set PVD_through_EXTI_Line_detection_interrupt, Startup
+   .set Tamper_interrupt, Startup
+   .set RTC_global_interrupt, Startup
+   .set Flash_global_interrupt, Startup
+   .set RCC_global_interrupt, Startup
+   .set EXTI_Line0_interrupt, Startup
+   .set EXTI_Line1_interrupt, Startup
+   .set EXTI_Line2_interrupt, Startup
+   .set EXTI_Line3_interrupt, Startup
+   .set EXTI_Line4_interrupt, Startup
+   .set DMA1_Channel1_global_interrupt, Startup
+   .set DMA1_Channel2_global_interrupt, Startup
+   .set DMA1_Channel3_global_interrupt, Startup
+   .set DMA1_Channel4_global_interrupt, Startup
+   .set DMA1_Channel5_global_interrupt, Startup
+   .set DMA1_Channel6_global_interrupt, Startup
+   .set DMA1_Channel7_global_interrupt, Startup
+   .set ADC1_and_ADC2_global_interrupt, Startup
+   .set CAN1_TX_interrupts, Startup
+   .set CAN1_RX0_interrupts, Startup
+   .set CAN1_RX1_interrupt, Startup
+   .set CAN1_SCE_interrupt, Startup
+   .set EXTI_Line9_5_interrupts, Startup
+   .set TIM1_Break_interrupt, Startup
+   .set TIM1_Update_interrupt, Startup
+   .set TIM1_Trigger_and_Commutation_interrupts, Startup
+   .set TIM1_Capture_Compare_interrupt, Startup
+   .set TIM2_global_interrupt, Startup
+   .set TIM3_global_interrupt, Startup
+   .set TIM4_global_interrupt, Startup
+   .set I2C1_event_interrupt, Startup
+   .set I2C1_error_interrupt, Startup
+   .set I2C2_event_interrupt, Startup
+   .set I2C2_error_interrupt, Startup
+   .set SPI1_global_interrupt, Startup
+   .set SPI2_global_interrupt, Startup
+   .set USART1_global_interrupt, Startup
+   .set USART2_global_interrupt, Startup
+   .set USART3_global_interrupt, Startup
+   .set EXTI_Line15_10_interrupts, Startup
+   .set RTC_alarm_through_EXTI_line_interrupt, Startup
+   .set USB_OTG_FS_Wakeup_through_EXTI_line_interrupt, Startup
+   .set TIM5_global_interrupt, Startup
+   .set SPI3_global_interrupt, Startup
+   .set UART4_global_interrupt, Startup
+   .set UART5_global_interrupt, Startup
+   .set TIM6_global_interrupt, Startup
+   .set TIM7_global_interrupt, Startup
+   .set DMA2_Channel1_global_interrupt, Startup
+   .set DMA2_Channel2_global_interrupt, Startup
+   .set DMA2_Channel3_global_interrupt, Startup
+   .set DMA2_Channel4_global_interrupt, Startup
+   .set DMA2_Channel5_global_interrupt, Startup
+   .set Ethernet_global_interrupt, Startup
+   .set Ethernet_Wakeup_through_EXTI_line_interrupt, Startup
+   .set CAN2_TX_interrupts, Startup
+   .set CAN2_RX0_interrupts, Startup
+   .set CAN2_RX1_interrupt, Startup
+   .set CAN2_SCE_interrupt, Startup
+   .set USB_On_The_Go_FS_global_interrupt, Startup
+   
+   .text
+end;
+
+end.

+ 777 - 0
rtl/embedded/arm/stm32f10x_hd.pp

@@ -0,0 +1,777 @@
+{
+Register definitions and utility code for STM32F10x - HD density
+
+Created by Jeppe Johansen 2012 - [email protected]
+}
+unit stm32f10x_hd;
+
+{$goto on}
+{$define stm32f10x_hd}
+
+interface
+
+type
+ TBitvector32 = bitpacked array[0..31] of 0..1;
+
+{$PACKRECORDS 2}
+const
+ PeripheralBase 	= $40000000;
+
+ FSMCBase			= $60000000;
+
+ APB1Base 			= PeripheralBase;
+ APB2Base 			= PeripheralBase+$10000;
+ AHBBase 			= PeripheralBase+$20000;
+
+ SCS_BASE         = $E000E000;
+
+ { FSMC }
+ FSMCBank1NOR1		= FSMCBase+$00000000;
+ FSMCBank1NOR2		= FSMCBase+$04000000;
+ FSMCBank1NOR3		= FSMCBase+$08000000;
+ FSMCBank1NOR4		= FSMCBase+$0C000000;
+
+ FSMCBank1PSRAM1	= FSMCBase+$00000000;
+ FSMCBank1PSRAM2	= FSMCBase+$04000000;
+ FSMCBank1PSRAM3	= FSMCBase+$08000000;
+ FSMCBank1PSRAM4	= FSMCBase+$0C000000;
+
+ FSMCBank2NAND1	= FSMCBase+$10000000;
+ FSMCBank3NAND2	= FSMCBase+$20000000;
+
+ FSMCBank4PCCARD	= FSMCBase+$30000000;
+
+type
+ TTimerRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SMCR, res3,
+  DIER, res4,
+  SR, res5,
+  EGR, res,
+  CCMR1, res6,
+  CCMR2, res7,
+  CCER, res8,
+  CNT, res9,
+  PSC, res10,
+  ARR, res11,
+  RCR, res12,
+  CCR1, res13,
+  CCR2, res14,
+  CCR3, res15,
+  CCR4, res16,
+  BDTR, res17,
+  DCR, res18,
+  DMAR, res19: Word;
+ end;
+
+ TRTCRegisters = record
+  CRH, res1,
+  CRL, res2,
+  PRLH, res3,
+  PRLL, res4,
+  DIVH, res5,
+  DIVL, res6,
+  CNTH, res7,
+  CNTL, res8,
+  ALRH, res9,
+  ALRL, res10: Word;
+ end;
+
+ TIWDGRegisters = record
+  KR, res1,
+  PR, res2,
+  RLR, res3,
+  SR, res4: word;
+ end;
+
+ TWWDGRegisters = record
+  CR, res2,
+  CFR, res3,
+  SR, res4: word;
+ end;
+
+ TSPIRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SR, res3,
+  DR, res4,
+  CRCPR, res5,
+  RXCRCR, res6,
+  TXCRCR, res7,
+  I2SCFGR, res8,
+  I2SPR, res9: Word;
+ end;
+
+ TUSARTRegisters = record
+  SR, res1,
+  DR, res2,
+  BRR, res3,
+  CR1, res4,
+  CR2, res5,
+  CR3, res6,
+  GTPR, res7: Word;
+ end;
+
+ TI2CRegisters = record
+  CR1, res1,
+  CR2, res2,
+  OAR1, res3,
+  OAR2, res4,
+  DR, res5,
+  SR1, res6,
+  SR2, res7,
+  CCR, res8: word;
+  TRISE: byte;
+ end;
+
+ TUSBRegisters = record
+  EPR: array[0..7] of longword;
+
+  res: array[0..7] of longword;
+
+  CNTR, res1,
+  ISTR, res2,
+  FNR, res3: Word;
+  DADDR: byte; res4: word; res5: byte;
+  BTABLE: Word;
+ end;
+
+ TUSBMem = packed array[0..511] of byte;
+
+ TCANMailbox = record
+  IR,
+  DTR,
+  DLR,
+  DHR: longword;
+ end;
+
+ TCANRegisters = record
+  MCR,
+  MSR,
+  TSR,
+  RF0R,
+  RF1R,
+  IER,
+  ESR,
+  BTR: longword;
+
+  res5: array[$020..$17F] of byte;
+
+  TX: array[0..2] of TCANMailbox;
+  RX: array[0..2] of TCANMailbox;
+
+  res6: array[$1D0..$1FF] of byte;
+
+  FMR,
+  FM1R,
+  res9: longword;
+  FS1R, res10: word;
+  res11: longword;
+  FFA1R, res12: word;
+  res13: longword;
+  FA1R, res14: word;
+  res15: array[$220..$23F] of byte;
+
+  FOR1,
+  FOR2: longword;
+
+  FB: array[1..13] of array[1..2] of longword;
+ end;
+
+ TBKPRegisters = record
+  DR: array[1..10] of record data, res: word; end;
+
+  RTCCR,
+  CR,
+  CSR,
+  res1,res2: longword;
+
+  DR2: array[11..42] of record data, res: word; end;
+ end;
+
+ TPwrRegisters = record
+  CR, res: word;
+  CSR: Word;
+ end;
+
+ TDACRegisters = record
+  CR,
+  SWTRIGR: longword;
+
+  DHR12R1, res2,
+  DHR12L1, res3,
+  DHR8R1, res4,
+  DHR12R2, res5,
+  DHR12L2, res6,
+  DHR8R2, res7: word;
+
+  DHR12RD,
+  DHR12LD: longword;
+
+  DHR8RD, res8,
+
+  DOR1, res9,
+  DOR2, res10: Word;
+ end;
+
+ TAFIORegisters = record
+  EVCR,
+  MAPR: longword;
+  EXTICR: array[0..3] of longword;
+ end;
+
+ TEXTIRegisters = record
+  IMR,
+  EMR,
+  RTSR,
+  FTSR,
+  SWIER,
+  PR: longword;
+ end;
+
+ TPortRegisters = record
+  CRL,
+  CRH,
+  IDR,
+  ODR,
+  BSRR,
+  BRR,
+  LCKR: longword;
+ end;
+
+ TADCRegisters = record
+  SR,
+  CR1,
+  CR2,
+  SMPR1,
+  SMPR2: longword;
+  JOFR1, res2,
+  JOFR2, res3,
+  JOFR3, res4,
+  JOFR4, res5,
+  HTR, res6,
+  LTR, res7: word;
+  SQR1,
+  SQR2,
+  SQR3,
+  JSQR: longword;
+  JDR1, res8,
+  JDR2, res9,
+  JDR3, res10,
+  JDR4, res11: Word;
+  DR: longword;
+ end;
+
+ TSDIORegisters = record
+  POWER,
+  CLKCR,
+  ARG: longword;
+  CMD, res3,
+  RESPCMD, res4: Word;
+  RESP1,
+  RESP2,
+  RESP3,
+  RESP4,
+  DTIMER,
+  DLEN: longword;
+  DCTRL, res5: word;
+  DCOUNT,
+  STA,
+  ICR,
+  MASK,
+  FIFOCNT,
+  FIFO: longword;
+ end;
+
+ TDMAChannel = record
+  CCR, res1,
+  CNDTR, res2: word;
+  CPAR,
+  CMAR,
+  res: longword;
+ end;
+
+ TDMARegisters = record
+  ISR,
+  IFCR: longword;
+  Channel: array[0..7] of TDMAChannel;
+ end;
+
+ TRCCRegisters = record
+  CR,
+  CFGR,
+  CIR,
+  APB2RSTR,
+  APB1RSTR,
+  AHBENR,
+  APB2ENR,
+  APB1ENR,
+  BDCR,
+  CSR: longword;
+ end;
+
+ TCRCRegisters = record
+  DR: longword;
+  IDR: byte; res1: word; res2: byte;
+  CR: byte;
+ end;
+
+ TFSMCRegisters = record
+  nothingyet: byte;
+ end;
+
+ TFlashRegisters = record
+  ACR,
+  KEYR,
+  OPTKEYR,
+  SR,
+  CR,
+  AR,
+  res,
+  OBR,
+  WRPR: longword;
+ end;
+
+ TNVICRegisters = record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ end;
+
+ TSCBRegisters = record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                             {!< Interrupt Control State Register                         }
+  VTOR,                             {!< Vector Table Offset Register                             }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                  }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
+  SHCSR,                            {!< System Handler Control and State Register                }
+  CFSR,                             {!< Configurable Fault Status Register                       }
+  HFSR,                             {!< Hard Fault Status Register                               }
+  DFSR,                             {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                              }
+  BFAR,                             {!< Bus Fault Address Register                               }
+  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+ TSysTickRegisters = record
+  Ctrl,
+  Load,
+  Val,
+  Calib: longword;
+ end;
+
+{$ALIGN 2}
+var
+ { Timers }
+ Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
+ Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
+ Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
+ Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
+ Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
+ Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
+ Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
+ Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
+
+ { RTC }
+ RTC: TRTCRegisters 			absolute (APB1Base+$2800);
+
+ { WDG }
+ WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
+ IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
+
+ { SPI }
+ SPI1: TSPIRegisters			absolute (APB2Base+$3000);
+ SPI2: TSPIRegisters			absolute (APB1Base+$3800);
+ SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
+
+ { USART/UART }
+ USART1: TUSARTRegisters	absolute (APB2Base+$3800);
+ USART2: TUSARTRegisters	absolute (APB1Base+$4400);
+ USART3: TUSARTRegisters	absolute (APB1Base+$4800);
+ UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
+ UART5: TUSARTRegisters		absolute (APB1Base+$5000);
+
+ { I2C }
+ I2C1: TI2CRegisters			absolute (APB1Base+$5400);
+ I2C2: TI2CRegisters			absolute (APB1Base+$5800);
+
+ { USB }
+ USB: TUSBRegisters			absolute (APB1Base+$5C00);
+ USBMem: TUSBMem                        absolute (APB1Base+$6000);
+
+ { CAN }
+ CAN: TCANRegisters			absolute (APB1Base+$6800);
+
+ { BKP }
+ BKP: TBKPRegisters			absolute (APB1Base+$6C00);
+
+ { PWR }
+ PWR: TPwrRegisters			absolute (APB1Base+$7000);
+
+ { DAC }
+ DAC: TDACRegisters			absolute (APB1Base+$7400);
+
+ { GPIO }
+ AFIO: TAFIORegisters		absolute (APB2Base+$0);
+ EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
+
+ PortA: TPortRegisters		absolute (APB2Base+$0800);
+ PortB: TPortRegisters		absolute (APB2Base+$0C00);
+ PortC: TPortRegisters		absolute (APB2Base+$1000);
+ PortD: TPortRegisters		absolute (APB2Base+$1400);
+ PortE: TPortRegisters		absolute (APB2Base+$1800);
+ PortF: TPortRegisters		absolute (APB2Base+$1C00);
+ PortG: TPortRegisters		absolute (APB2Base+$2000);
+
+ { ADC }
+ ADC1: TADCRegisters			absolute (APB2Base+$2400);
+ ADC2: TADCRegisters			absolute (APB2Base+$2800);
+ ADC3: TADCRegisters			absolute (APB2Base+$3C00);
+
+ { SDIO }
+ SDIO: TSDIORegisters		absolute (APB2Base+$8000);
+
+ { DMA }
+ DMA1: TDMARegisters			absolute (AHBBase+$0000);
+ DMA2: TDMARegisters			absolute (AHBBase+$0400);
+
+ { RCC }
+ RCC: TRCCRegisters			absolute (AHBBase+$1000);
+
+ { Flash }
+ Flash: TFlashRegisters		absolute (AHBBase+$2000);
+
+ { CRC }
+ CRC: TCRCRegisters			absolute (AHBBase+$3000);
+
+ { SCB }
+ SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
+
+ { SysTick }
+ SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
+
+ { NVIC }
+ NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Window_watchdog_interrupt; external name 'Window_watchdog_interrupt';
+procedure PVD_through_EXTI_Line_detection_interrupt; external name 'PVD_through_EXTI_Line_detection_interrupt';
+procedure Tamper_interrupt; external name 'Tamper_interrupt';
+procedure RTC_global_interrupt; external name 'RTC_global_interrupt';
+procedure Flash_global_interrupt; external name 'Flash_global_interrupt';
+procedure RCC_global_interrupt; external name 'RCC_global_interrupt';
+procedure EXTI_Line0_interrupt; external name 'EXTI_Line0_interrupt';
+procedure EXTI_Line1_interrupt; external name 'EXTI_Line1_interrupt';
+procedure EXTI_Line2_interrupt; external name 'EXTI_Line2_interrupt';
+procedure EXTI_Line3_interrupt; external name 'EXTI_Line3_interrupt';
+procedure EXTI_Line4_interrupt; external name 'EXTI_Line4_interrupt';
+procedure DMA1_Channel1_global_interrupt; external name 'DMA1_Channel1_global_interrupt';
+procedure DMA1_Channel2_global_interrupt; external name 'DMA1_Channel2_global_interrupt';
+procedure DMA1_Channel3_global_interrupt; external name 'DMA1_Channel3_global_interrupt';
+procedure DMA1_Channel4_global_interrupt; external name 'DMA1_Channel4_global_interrupt';
+procedure DMA1_Channel5_global_interrupt; external name 'DMA1_Channel5_global_interrupt';
+procedure DMA1_Channel6_global_interrupt; external name 'DMA1_Channel6_global_interrupt';
+procedure DMA1_Channel7_global_interrupt; external name 'DMA1_Channel7_global_interrupt';
+procedure ADC1_and_ADC2_global_interrupt; external name 'ADC1_and_ADC2_global_interrupt';
+procedure USB_High_Priority_or_CAN_TX_interrupts; external name 'USB_High_Priority_or_CAN_TX_interrupts';
+procedure USB_Low_Priority_or_CAN_RX0_interrupts; external name 'USB_Low_Priority_or_CAN_RX0_interrupts';
+procedure CAN_RX1_interrupt; external name 'CAN_RX1_interrupt';
+procedure CAN_SCE_interrupt; external name 'CAN_SCE_interrupt';
+procedure EXTI_Line9_5_interrupts; external name 'EXTI_Line9_5_interrupts';
+procedure TIM1_Break_interrupt; external name 'TIM1_Break_interrupt';
+procedure TIM1_Update_interrupt; external name 'TIM1_Update_interrupt';
+procedure TIM1_Trigger_and_Commutation_interrupts; external name 'TIM1_Trigger_and_Commutation_interrupts';
+procedure TIM1_Capture_Compare_interrupt; external name 'TIM1_Capture_Compare_interrupt';
+procedure TIM2_global_interrupt; external name 'TIM2_global_interrupt';
+procedure TIM3_global_interrupt; external name 'TIM3_global_interrupt';
+procedure TIM4_global_interrupt; external name 'TIM4_global_interrupt';
+procedure I2C1_event_interrupt; external name 'I2C1_event_interrupt';
+procedure I2C1_error_interrupt; external name 'I2C1_error_interrupt';
+procedure I2C2_event_interrupt; external name 'I2C2_event_interrupt';
+procedure I2C2_error_interrupt; external name 'I2C2_error_interrupt';
+procedure SPI1_global_interrupt; external name 'SPI1_global_interrupt';
+procedure SPI2_global_interrupt; external name 'SPI2_global_interrupt';
+procedure USART1_global_interrupt; external name 'USART1_global_interrupt';
+procedure USART2_global_interrupt; external name 'USART2_global_interrupt';
+procedure USART3_global_interrupt; external name 'USART3_global_interrupt';
+procedure EXTI_Line15_10_interrupts; external name 'EXTI_Line15_10_interrupts';
+procedure RTC_alarm_through_EXTI_line_interrupt; external name 'RTC_alarm_through_EXTI_line_interrupt';
+procedure USB_wakeup_from_suspend_through_EXTI_line_interrupt; external name 'USB_wakeup_from_suspend_through_EXTI_line_interrupt';
+procedure TIM8_Break_interrupt; external name 'TIM8_Break_interrupt';
+procedure TIM8_Update_interrupt; external name 'TIM8_Update_interrupt';
+procedure TIM8_Trigger_and_Commutation_interrupts; external name 'TIM8_Trigger_and_Commutation_interrupts';
+procedure TIM8_Capture_Compare_interrupt; external name 'TIM8_Capture_Compare_interrupt';
+procedure ADC3_global_interrupt; external name 'ADC3_global_interrupt';
+procedure FSMC_global_interrupt; external name 'FSMC_global_interrupt';
+procedure SDIO_global_interrupt; external name 'SDIO_global_interrupt';
+procedure TIM5_global_interrupt; external name 'TIM5_global_interrupt';
+procedure SPI3_global_interrupt; external name 'SPI3_global_interrupt';
+procedure UART4_global_interrupt; external name 'UART4_global_interrupt';
+procedure UART5_global_interrupt; external name 'UART5_global_interrupt';
+procedure TIM6_global_interrupt; external name 'TIM6_global_interrupt';
+procedure TIM7_global_interrupt; external name 'TIM7_global_interrupt';
+procedure DMA2_Channel1_global_interrupt; external name 'DMA2_Channel1_global_interrupt';
+procedure DMA2_Channel2_global_interrupt; external name 'DMA2_Channel2_global_interrupt';
+procedure DMA2_Channel3_global_interrupt; external name 'DMA2_Channel3_global_interrupt';
+procedure DMA2_Channel4_and_DMA2_Channel5_global_interrupts; external name 'DMA2_Channel4_and_DMA2_Channel5_global_interrupts';
+
+{$i cortexm3_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+   .section ".init.interrupt_vectors"
+interrupt_vectors:
+   .long _stack_top
+   .long Startup
+   .long NMI_interrupt
+   .long Hardfault_interrupt
+   .long MemManage_interrupt
+   .long BusFault_interrupt
+   .long UsageFault_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long SWI_interrupt
+   .long DebugMonitor_interrupt
+   .long 0
+   .long PendingSV_interrupt
+   .long SysTick_interrupt
+   
+   .long Window_watchdog_interrupt
+   .long PVD_through_EXTI_Line_detection_interrupt
+   .long Tamper_interrupt
+   .long RTC_global_interrupt
+   .long Flash_global_interrupt
+   .long RCC_global_interrupt
+   .long EXTI_Line0_interrupt
+   .long EXTI_Line1_interrupt
+   .long EXTI_Line2_interrupt
+   .long EXTI_Line3_interrupt
+   .long EXTI_Line4_interrupt
+   .long DMA1_Channel1_global_interrupt
+   .long DMA1_Channel2_global_interrupt
+   .long DMA1_Channel3_global_interrupt
+   .long DMA1_Channel4_global_interrupt
+   .long DMA1_Channel5_global_interrupt
+   .long DMA1_Channel6_global_interrupt
+   .long DMA1_Channel7_global_interrupt
+   .long ADC1_and_ADC2_global_interrupt
+   .long USB_High_Priority_or_CAN_TX_interrupts
+   .long USB_Low_Priority_or_CAN_RX0_interrupts
+   .long CAN_RX1_interrupt
+   .long CAN_SCE_interrupt
+   .long EXTI_Line9_5_interrupts
+   .long TIM1_Break_interrupt
+   .long TIM1_Update_interrupt
+   .long TIM1_Trigger_and_Commutation_interrupts
+   .long TIM1_Capture_Compare_interrupt
+   .long TIM2_global_interrupt
+   .long TIM3_global_interrupt
+   .long TIM4_global_interrupt
+   .long I2C1_event_interrupt
+   .long I2C1_error_interrupt
+   .long I2C2_event_interrupt
+   .long I2C2_error_interrupt
+   .long SPI1_global_interrupt
+   .long SPI2_global_interrupt
+   .long USART1_global_interrupt
+   .long USART2_global_interrupt
+   .long USART3_global_interrupt
+   .long EXTI_Line15_10_interrupts
+   .long RTC_alarm_through_EXTI_line_interrupt
+   .long USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .long TIM8_Break_interrupt
+   .long TIM8_Update_interrupt
+   .long TIM8_Trigger_and_Commutation_interrupts
+   .long TIM8_Capture_Compare_interrupt
+   .long ADC3_global_interrupt
+   .long FSMC_global_interrupt
+   .long SDIO_global_interrupt
+   .long TIM5_global_interrupt
+   .long SPI3_global_interrupt
+   .long UART4_global_interrupt
+   .long UART5_global_interrupt
+   .long TIM6_global_interrupt
+   .long TIM7_global_interrupt
+   .long DMA2_Channel1_global_interrupt
+   .long DMA2_Channel2_global_interrupt
+   .long DMA2_Channel3_global_interrupt
+   .long DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+   
+   .weak NMI_interrupt
+   .weak Hardfault_interrupt
+   .weak MemManage_interrupt
+   .weak BusFault_interrupt
+   .weak UsageFault_interrupt
+   .weak SWI_interrupt
+   .weak DebugMonitor_interrupt
+   .weak PendingSV_interrupt
+   .weak SysTick_interrupt
+   
+   .weak Window_watchdog_interrupt
+   .weak PVD_through_EXTI_Line_detection_interrupt
+   .weak Tamper_interrupt
+   .weak RTC_global_interrupt
+   .weak Flash_global_interrupt
+   .weak RCC_global_interrupt
+   .weak EXTI_Line0_interrupt
+   .weak EXTI_Line1_interrupt
+   .weak EXTI_Line2_interrupt
+   .weak EXTI_Line3_interrupt
+   .weak EXTI_Line4_interrupt
+   .weak DMA1_Channel1_global_interrupt
+   .weak DMA1_Channel2_global_interrupt
+   .weak DMA1_Channel3_global_interrupt
+   .weak DMA1_Channel4_global_interrupt
+   .weak DMA1_Channel5_global_interrupt
+   .weak DMA1_Channel6_global_interrupt
+   .weak DMA1_Channel7_global_interrupt
+   .weak ADC1_and_ADC2_global_interrupt
+   .weak USB_High_Priority_or_CAN_TX_interrupts
+   .weak USB_Low_Priority_or_CAN_RX0_interrupts
+   .weak CAN_RX1_interrupt
+   .weak CAN_SCE_interrupt
+   .weak EXTI_Line9_5_interrupts
+   .weak TIM1_Break_interrupt
+   .weak TIM1_Update_interrupt
+   .weak TIM1_Trigger_and_Commutation_interrupts
+   .weak TIM1_Capture_Compare_interrupt
+   .weak TIM2_global_interrupt
+   .weak TIM3_global_interrupt
+   .weak TIM4_global_interrupt
+   .weak I2C1_event_interrupt
+   .weak I2C1_error_interrupt
+   .weak I2C2_event_interrupt
+   .weak I2C2_error_interrupt
+   .weak SPI1_global_interrupt
+   .weak SPI2_global_interrupt
+   .weak USART1_global_interrupt
+   .weak USART2_global_interrupt
+   .weak USART3_global_interrupt
+   .weak EXTI_Line15_10_interrupts
+   .weak RTC_alarm_through_EXTI_line_interrupt
+   .weak USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .weak TIM8_Break_interrupt
+   .weak TIM8_Update_interrupt
+   .weak TIM8_Trigger_and_Commutation_interrupts
+   .weak TIM8_Capture_Compare_interrupt
+   .weak ADC3_global_interrupt
+   .weak FSMC_global_interrupt
+   .weak SDIO_global_interrupt
+   .weak TIM5_global_interrupt
+   .weak SPI3_global_interrupt
+   .weak UART4_global_interrupt
+   .weak UART5_global_interrupt
+   .weak TIM6_global_interrupt
+   .weak TIM7_global_interrupt
+   .weak DMA2_Channel1_global_interrupt
+   .weak DMA2_Channel2_global_interrupt
+   .weak DMA2_Channel3_global_interrupt
+   .weak DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+
+   
+   .set NMI_interrupt, Startup
+   .set Hardfault_interrupt, Startup
+   .set MemManage_interrupt, Startup
+   .set BusFault_interrupt, Startup
+   .set UsageFault_interrupt, Startup
+   .set SWI_interrupt, Startup
+   .set DebugMonitor_interrupt, Startup
+   .set PendingSV_interrupt, Startup
+   .set SysTick_interrupt, Startup
+
+   .set Window_watchdog_interrupt, Startup
+   .set PVD_through_EXTI_Line_detection_interrupt, Startup
+   .set Tamper_interrupt, Startup
+   .set RTC_global_interrupt, Startup
+   .set Flash_global_interrupt, Startup
+   .set RCC_global_interrupt, Startup
+   .set EXTI_Line0_interrupt, Startup
+   .set EXTI_Line1_interrupt, Startup
+   .set EXTI_Line2_interrupt, Startup
+   .set EXTI_Line3_interrupt, Startup
+   .set EXTI_Line4_interrupt, Startup
+   .set DMA1_Channel1_global_interrupt, Startup
+   .set DMA1_Channel2_global_interrupt, Startup
+   .set DMA1_Channel3_global_interrupt, Startup
+   .set DMA1_Channel4_global_interrupt, Startup
+   .set DMA1_Channel5_global_interrupt, Startup
+   .set DMA1_Channel6_global_interrupt, Startup
+   .set DMA1_Channel7_global_interrupt, Startup
+   .set ADC1_and_ADC2_global_interrupt, Startup
+   .set USB_High_Priority_or_CAN_TX_interrupts, Startup
+   .set USB_Low_Priority_or_CAN_RX0_interrupts, Startup
+   .set CAN_RX1_interrupt, Startup
+   .set CAN_SCE_interrupt, Startup
+   .set EXTI_Line9_5_interrupts, Startup
+   .set TIM1_Break_interrupt, Startup
+   .set TIM1_Update_interrupt, Startup
+   .set TIM1_Trigger_and_Commutation_interrupts, Startup
+   .set TIM1_Capture_Compare_interrupt, Startup
+   .set TIM2_global_interrupt, Startup
+   .set TIM3_global_interrupt, Startup
+   .set TIM4_global_interrupt, Startup
+   .set I2C1_event_interrupt, Startup
+   .set I2C1_error_interrupt, Startup
+   .set I2C2_event_interrupt, Startup
+   .set I2C2_error_interrupt, Startup
+   .set SPI1_global_interrupt, Startup
+   .set SPI2_global_interrupt, Startup
+   .set USART1_global_interrupt, Startup
+   .set USART2_global_interrupt, Startup
+   .set USART3_global_interrupt, Startup
+   .set EXTI_Line15_10_interrupts, Startup
+   .set RTC_alarm_through_EXTI_line_interrupt, Startup
+   .set USB_wakeup_from_suspend_through_EXTI_line_interrupt, Startup
+   .set TIM8_Break_interrupt, Startup
+   .set TIM8_Update_interrupt, Startup
+   .set TIM8_Trigger_and_Commutation_interrupts, Startup
+   .set TIM8_Capture_Compare_interrupt, Startup
+   .set ADC3_global_interrupt, Startup
+   .set FSMC_global_interrupt, Startup
+   .set SDIO_global_interrupt, Startup
+   .set TIM5_global_interrupt, Startup
+   .set SPI3_global_interrupt, Startup
+   .set UART4_global_interrupt, Startup
+   .set UART5_global_interrupt, Startup
+   .set TIM6_global_interrupt, Startup
+   .set TIM7_global_interrupt, Startup
+   .set DMA2_Channel1_global_interrupt, Startup
+   .set DMA2_Channel2_global_interrupt, Startup
+   .set DMA2_Channel3_global_interrupt, Startup
+   .set DMA2_Channel4_and_DMA2_Channel5_global_interrupts, Startup
+   
+   .text
+end;
+
+end.

+ 777 - 0
rtl/embedded/arm/stm32f10x_ld.pp

@@ -0,0 +1,777 @@
+{
+Register definitions and utility code for STM32F10x - Low Density
+
+Created by Jeppe Johansen 2012 - [email protected]
+}
+unit stm32f10x_ld;
+
+{$goto on}
+{$define stm32f10x_ld}
+
+interface
+
+type
+ TBitvector32 = bitpacked array[0..31] of 0..1;
+
+{$PACKRECORDS 2}
+const
+ PeripheralBase 	= $40000000;
+
+ FSMCBase			= $60000000;
+
+ APB1Base 			= PeripheralBase;
+ APB2Base 			= PeripheralBase+$10000;
+ AHBBase 			= PeripheralBase+$20000;
+
+ SCS_BASE         = $E000E000;
+
+ { FSMC }
+ FSMCBank1NOR1		= FSMCBase+$00000000;
+ FSMCBank1NOR2		= FSMCBase+$04000000;
+ FSMCBank1NOR3		= FSMCBase+$08000000;
+ FSMCBank1NOR4		= FSMCBase+$0C000000;
+
+ FSMCBank1PSRAM1	= FSMCBase+$00000000;
+ FSMCBank1PSRAM2	= FSMCBase+$04000000;
+ FSMCBank1PSRAM3	= FSMCBase+$08000000;
+ FSMCBank1PSRAM4	= FSMCBase+$0C000000;
+
+ FSMCBank2NAND1	= FSMCBase+$10000000;
+ FSMCBank3NAND2	= FSMCBase+$20000000;
+
+ FSMCBank4PCCARD	= FSMCBase+$30000000;
+
+type
+ TTimerRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SMCR, res3,
+  DIER, res4,
+  SR, res5,
+  EGR, res,
+  CCMR1, res6,
+  CCMR2, res7,
+  CCER, res8,
+  CNT, res9,
+  PSC, res10,
+  ARR, res11,
+  RCR, res12,
+  CCR1, res13,
+  CCR2, res14,
+  CCR3, res15,
+  CCR4, res16,
+  BDTR, res17,
+  DCR, res18,
+  DMAR, res19: Word;
+ end;
+
+ TRTCRegisters = record
+  CRH, res1,
+  CRL, res2,
+  PRLH, res3,
+  PRLL, res4,
+  DIVH, res5,
+  DIVL, res6,
+  CNTH, res7,
+  CNTL, res8,
+  ALRH, res9,
+  ALRL, res10: Word;
+ end;
+
+ TIWDGRegisters = record
+  KR, res1,
+  PR, res2,
+  RLR, res3,
+  SR, res4: word;
+ end;
+
+ TWWDGRegisters = record
+  CR, res2,
+  CFR, res3,
+  SR, res4: word;
+ end;
+
+ TSPIRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SR, res3,
+  DR, res4,
+  CRCPR, res5,
+  RXCRCR, res6,
+  TXCRCR, res7,
+  I2SCFGR, res8,
+  I2SPR, res9: Word;
+ end;
+
+ TUSARTRegisters = record
+  SR, res1,
+  DR, res2,
+  BRR, res3,
+  CR1, res4,
+  CR2, res5,
+  CR3, res6,
+  GTPR, res7: Word;
+ end;
+
+ TI2CRegisters = record
+  CR1, res1,
+  CR2, res2,
+  OAR1, res3,
+  OAR2, res4,
+  DR, res5,
+  SR1, res6,
+  SR2, res7,
+  CCR, res8: word;
+  TRISE: byte;
+ end;
+
+ TUSBRegisters = record
+  EPR: array[0..7] of longword;
+
+  res: array[0..7] of longword;
+
+  CNTR, res1,
+  ISTR, res2,
+  FNR, res3: Word;
+  DADDR: byte; res4: word; res5: byte;
+  BTABLE: Word;
+ end;
+
+ TUSBMem = packed array[0..511] of byte;
+
+ TCANMailbox = record
+  IR,
+  DTR,
+  DLR,
+  DHR: longword;
+ end;
+
+ TCANRegisters = record
+  MCR,
+  MSR,
+  TSR,
+  RF0R,
+  RF1R,
+  IER,
+  ESR,
+  BTR: longword;
+
+  res5: array[$020..$17F] of byte;
+
+  TX: array[0..2] of TCANMailbox;
+  RX: array[0..2] of TCANMailbox;
+
+  res6: array[$1D0..$1FF] of byte;
+
+  FMR,
+  FM1R,
+  res9: longword;
+  FS1R, res10: word;
+  res11: longword;
+  FFA1R, res12: word;
+  res13: longword;
+  FA1R, res14: word;
+  res15: array[$220..$23F] of byte;
+
+  FOR1,
+  FOR2: longword;
+
+  FB: array[1..13] of array[1..2] of longword;
+ end;
+
+ TBKPRegisters = record
+  DR: array[1..10] of record data, res: word; end;
+
+  RTCCR,
+  CR,
+  CSR,
+  res1,res2: longword;
+
+  DR2: array[11..42] of record data, res: word; end;
+ end;
+
+ TPwrRegisters = record
+  CR, res: word;
+  CSR: Word;
+ end;
+
+ TDACRegisters = record
+  CR,
+  SWTRIGR: longword;
+
+  DHR12R1, res2,
+  DHR12L1, res3,
+  DHR8R1, res4,
+  DHR12R2, res5,
+  DHR12L2, res6,
+  DHR8R2, res7: word;
+
+  DHR12RD,
+  DHR12LD: longword;
+
+  DHR8RD, res8,
+
+  DOR1, res9,
+  DOR2, res10: Word;
+ end;
+
+ TAFIORegisters = record
+  EVCR,
+  MAPR: longword;
+  EXTICR: array[0..3] of longword;
+ end;
+
+ TEXTIRegisters = record
+  IMR,
+  EMR,
+  RTSR,
+  FTSR,
+  SWIER,
+  PR: longword;
+ end;
+
+ TPortRegisters = record
+  CRL,
+  CRH,
+  IDR,
+  ODR,
+  BSRR,
+  BRR,
+  LCKR: longword;
+ end;
+
+ TADCRegisters = record
+  SR,
+  CR1,
+  CR2,
+  SMPR1,
+  SMPR2: longword;
+  JOFR1, res2,
+  JOFR2, res3,
+  JOFR3, res4,
+  JOFR4, res5,
+  HTR, res6,
+  LTR, res7: word;
+  SQR1,
+  SQR2,
+  SQR3,
+  JSQR: longword;
+  JDR1, res8,
+  JDR2, res9,
+  JDR3, res10,
+  JDR4, res11: Word;
+  DR: longword;
+ end;
+
+ TSDIORegisters = record
+  POWER,
+  CLKCR,
+  ARG: longword;
+  CMD, res3,
+  RESPCMD, res4: Word;
+  RESP1,
+  RESP2,
+  RESP3,
+  RESP4,
+  DTIMER,
+  DLEN: longword;
+  DCTRL, res5: word;
+  DCOUNT,
+  STA,
+  ICR,
+  MASK,
+  FIFOCNT,
+  FIFO: longword;
+ end;
+
+ TDMAChannel = record
+  CCR, res1,
+  CNDTR, res2: word;
+  CPAR,
+  CMAR,
+  res: longword;
+ end;
+
+ TDMARegisters = record
+  ISR,
+  IFCR: longword;
+  Channel: array[0..7] of TDMAChannel;
+ end;
+
+ TRCCRegisters = record
+  CR,
+  CFGR,
+  CIR,
+  APB2RSTR,
+  APB1RSTR,
+  AHBENR,
+  APB2ENR,
+  APB1ENR,
+  BDCR,
+  CSR: longword;
+ end;
+
+ TCRCRegisters = record
+  DR: longword;
+  IDR: byte; res1: word; res2: byte;
+  CR: byte;
+ end;
+
+ TFSMCRegisters = record
+  nothingyet: byte;
+ end;
+
+ TFlashRegisters = record
+  ACR,
+  KEYR,
+  OPTKEYR,
+  SR,
+  CR,
+  AR,
+  res,
+  OBR,
+  WRPR: longword;
+ end;
+
+ TNVICRegisters = record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ end;
+
+ TSCBRegisters = record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                             {!< Interrupt Control State Register                         }
+  VTOR,                             {!< Vector Table Offset Register                             }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                  }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
+  SHCSR,                            {!< System Handler Control and State Register                }
+  CFSR,                             {!< Configurable Fault Status Register                       }
+  HFSR,                             {!< Hard Fault Status Register                               }
+  DFSR,                             {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                              }
+  BFAR,                             {!< Bus Fault Address Register                               }
+  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+ TSysTickRegisters = record
+  Ctrl,
+  Load,
+  Val,
+  Calib: longword;
+ end;
+
+{$ALIGN 2}
+var
+ { Timers }
+ Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
+ Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
+ Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
+ Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
+ Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
+ Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
+ Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
+ Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
+
+ { RTC }
+ RTC: TRTCRegisters 			absolute (APB1Base+$2800);
+
+ { WDG }
+ WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
+ IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
+
+ { SPI }
+ SPI1: TSPIRegisters			absolute (APB2Base+$3000);
+ SPI2: TSPIRegisters			absolute (APB1Base+$3800);
+ SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
+
+ { USART/UART }
+ USART1: TUSARTRegisters	absolute (APB2Base+$3800);
+ USART2: TUSARTRegisters	absolute (APB1Base+$4400);
+ USART3: TUSARTRegisters	absolute (APB1Base+$4800);
+ UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
+ UART5: TUSARTRegisters		absolute (APB1Base+$5000);
+
+ { I2C }
+ I2C1: TI2CRegisters			absolute (APB1Base+$5400);
+ I2C2: TI2CRegisters			absolute (APB1Base+$5800);
+
+ { USB }
+ USB: TUSBRegisters			absolute (APB1Base+$5C00);
+ USBMem: TUSBMem                        absolute (APB1Base+$6000);
+
+ { CAN }
+ CAN: TCANRegisters			absolute (APB1Base+$6800);
+
+ { BKP }
+ BKP: TBKPRegisters			absolute (APB1Base+$6C00);
+
+ { PWR }
+ PWR: TPwrRegisters			absolute (APB1Base+$7000);
+
+ { DAC }
+ DAC: TDACRegisters			absolute (APB1Base+$7400);
+
+ { GPIO }
+ AFIO: TAFIORegisters		absolute (APB2Base+$0);
+ EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
+
+ PortA: TPortRegisters		absolute (APB2Base+$0800);
+ PortB: TPortRegisters		absolute (APB2Base+$0C00);
+ PortC: TPortRegisters		absolute (APB2Base+$1000);
+ PortD: TPortRegisters		absolute (APB2Base+$1400);
+ PortE: TPortRegisters		absolute (APB2Base+$1800);
+ PortF: TPortRegisters		absolute (APB2Base+$1C00);
+ PortG: TPortRegisters		absolute (APB2Base+$2000);
+
+ { ADC }
+ ADC1: TADCRegisters			absolute (APB2Base+$2400);
+ ADC2: TADCRegisters			absolute (APB2Base+$2800);
+ ADC3: TADCRegisters			absolute (APB2Base+$3C00);
+
+ { SDIO }
+ SDIO: TSDIORegisters		absolute (APB2Base+$8000);
+
+ { DMA }
+ DMA1: TDMARegisters			absolute (AHBBase+$0000);
+ DMA2: TDMARegisters			absolute (AHBBase+$0400);
+
+ { RCC }
+ RCC: TRCCRegisters			absolute (AHBBase+$1000);
+
+ { Flash }
+ Flash: TFlashRegisters		absolute (AHBBase+$2000);
+
+ { CRC }
+ CRC: TCRCRegisters			absolute (AHBBase+$3000);
+
+ { SCB }
+ SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
+
+ { SysTick }
+ SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
+
+ { NVIC }
+ NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Window_watchdog_interrupt; external name 'Window_watchdog_interrupt';
+procedure PVD_through_EXTI_Line_detection_interrupt; external name 'PVD_through_EXTI_Line_detection_interrupt';
+procedure Tamper_interrupt; external name 'Tamper_interrupt';
+procedure RTC_global_interrupt; external name 'RTC_global_interrupt';
+procedure Flash_global_interrupt; external name 'Flash_global_interrupt';
+procedure RCC_global_interrupt; external name 'RCC_global_interrupt';
+procedure EXTI_Line0_interrupt; external name 'EXTI_Line0_interrupt';
+procedure EXTI_Line1_interrupt; external name 'EXTI_Line1_interrupt';
+procedure EXTI_Line2_interrupt; external name 'EXTI_Line2_interrupt';
+procedure EXTI_Line3_interrupt; external name 'EXTI_Line3_interrupt';
+procedure EXTI_Line4_interrupt; external name 'EXTI_Line4_interrupt';
+procedure DMA1_Channel1_global_interrupt; external name 'DMA1_Channel1_global_interrupt';
+procedure DMA1_Channel2_global_interrupt; external name 'DMA1_Channel2_global_interrupt';
+procedure DMA1_Channel3_global_interrupt; external name 'DMA1_Channel3_global_interrupt';
+procedure DMA1_Channel4_global_interrupt; external name 'DMA1_Channel4_global_interrupt';
+procedure DMA1_Channel5_global_interrupt; external name 'DMA1_Channel5_global_interrupt';
+procedure DMA1_Channel6_global_interrupt; external name 'DMA1_Channel6_global_interrupt';
+procedure DMA1_Channel7_global_interrupt; external name 'DMA1_Channel7_global_interrupt';
+procedure ADC1_and_ADC2_global_interrupt; external name 'ADC1_and_ADC2_global_interrupt';
+procedure USB_High_Priority_or_CAN_TX_interrupts; external name 'USB_High_Priority_or_CAN_TX_interrupts';
+procedure USB_Low_Priority_or_CAN_RX0_interrupts; external name 'USB_Low_Priority_or_CAN_RX0_interrupts';
+procedure CAN_RX1_interrupt; external name 'CAN_RX1_interrupt';
+procedure CAN_SCE_interrupt; external name 'CAN_SCE_interrupt';
+procedure EXTI_Line9_5_interrupts; external name 'EXTI_Line9_5_interrupts';
+procedure TIM1_Break_interrupt; external name 'TIM1_Break_interrupt';
+procedure TIM1_Update_interrupt; external name 'TIM1_Update_interrupt';
+procedure TIM1_Trigger_and_Commutation_interrupts; external name 'TIM1_Trigger_and_Commutation_interrupts';
+procedure TIM1_Capture_Compare_interrupt; external name 'TIM1_Capture_Compare_interrupt';
+procedure TIM2_global_interrupt; external name 'TIM2_global_interrupt';
+procedure TIM3_global_interrupt; external name 'TIM3_global_interrupt';
+procedure TIM4_global_interrupt; external name 'TIM4_global_interrupt';
+procedure I2C1_event_interrupt; external name 'I2C1_event_interrupt';
+procedure I2C1_error_interrupt; external name 'I2C1_error_interrupt';
+procedure I2C2_event_interrupt; external name 'I2C2_event_interrupt';
+procedure I2C2_error_interrupt; external name 'I2C2_error_interrupt';
+procedure SPI1_global_interrupt; external name 'SPI1_global_interrupt';
+procedure SPI2_global_interrupt; external name 'SPI2_global_interrupt';
+procedure USART1_global_interrupt; external name 'USART1_global_interrupt';
+procedure USART2_global_interrupt; external name 'USART2_global_interrupt';
+procedure USART3_global_interrupt; external name 'USART3_global_interrupt';
+procedure EXTI_Line15_10_interrupts; external name 'EXTI_Line15_10_interrupts';
+procedure RTC_alarm_through_EXTI_line_interrupt; external name 'RTC_alarm_through_EXTI_line_interrupt';
+procedure USB_wakeup_from_suspend_through_EXTI_line_interrupt; external name 'USB_wakeup_from_suspend_through_EXTI_line_interrupt';
+procedure TIM8_Break_interrupt; external name 'TIM8_Break_interrupt';
+procedure TIM8_Update_interrupt; external name 'TIM8_Update_interrupt';
+procedure TIM8_Trigger_and_Commutation_interrupts; external name 'TIM8_Trigger_and_Commutation_interrupts';
+procedure TIM8_Capture_Compare_interrupt; external name 'TIM8_Capture_Compare_interrupt';
+procedure ADC3_global_interrupt; external name 'ADC3_global_interrupt';
+procedure FSMC_global_interrupt; external name 'FSMC_global_interrupt';
+procedure SDIO_global_interrupt; external name 'SDIO_global_interrupt';
+procedure TIM5_global_interrupt; external name 'TIM5_global_interrupt';
+procedure SPI3_global_interrupt; external name 'SPI3_global_interrupt';
+procedure UART4_global_interrupt; external name 'UART4_global_interrupt';
+procedure UART5_global_interrupt; external name 'UART5_global_interrupt';
+procedure TIM6_global_interrupt; external name 'TIM6_global_interrupt';
+procedure TIM7_global_interrupt; external name 'TIM7_global_interrupt';
+procedure DMA2_Channel1_global_interrupt; external name 'DMA2_Channel1_global_interrupt';
+procedure DMA2_Channel2_global_interrupt; external name 'DMA2_Channel2_global_interrupt';
+procedure DMA2_Channel3_global_interrupt; external name 'DMA2_Channel3_global_interrupt';
+procedure DMA2_Channel4_and_DMA2_Channel5_global_interrupts; external name 'DMA2_Channel4_and_DMA2_Channel5_global_interrupts';
+
+{$i cortexm3_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+   .section ".init.interrupt_vectors"
+interrupt_vectors:
+   .long _stack_top
+   .long Startup
+   .long NMI_interrupt
+   .long Hardfault_interrupt
+   .long MemManage_interrupt
+   .long BusFault_interrupt
+   .long UsageFault_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long SWI_interrupt
+   .long DebugMonitor_interrupt
+   .long 0
+   .long PendingSV_interrupt
+   .long SysTick_interrupt
+   
+   .long Window_watchdog_interrupt
+   .long PVD_through_EXTI_Line_detection_interrupt
+   .long Tamper_interrupt
+   .long RTC_global_interrupt
+   .long Flash_global_interrupt
+   .long RCC_global_interrupt
+   .long EXTI_Line0_interrupt
+   .long EXTI_Line1_interrupt
+   .long EXTI_Line2_interrupt
+   .long EXTI_Line3_interrupt
+   .long EXTI_Line4_interrupt
+   .long DMA1_Channel1_global_interrupt
+   .long DMA1_Channel2_global_interrupt
+   .long DMA1_Channel3_global_interrupt
+   .long DMA1_Channel4_global_interrupt
+   .long DMA1_Channel5_global_interrupt
+   .long DMA1_Channel6_global_interrupt
+   .long DMA1_Channel7_global_interrupt
+   .long ADC1_and_ADC2_global_interrupt
+   .long USB_High_Priority_or_CAN_TX_interrupts
+   .long USB_Low_Priority_or_CAN_RX0_interrupts
+   .long CAN_RX1_interrupt
+   .long CAN_SCE_interrupt
+   .long EXTI_Line9_5_interrupts
+   .long TIM1_Break_interrupt
+   .long TIM1_Update_interrupt
+   .long TIM1_Trigger_and_Commutation_interrupts
+   .long TIM1_Capture_Compare_interrupt
+   .long TIM2_global_interrupt
+   .long TIM3_global_interrupt
+   .long TIM4_global_interrupt
+   .long I2C1_event_interrupt
+   .long I2C1_error_interrupt
+   .long I2C2_event_interrupt
+   .long I2C2_error_interrupt
+   .long SPI1_global_interrupt
+   .long SPI2_global_interrupt
+   .long USART1_global_interrupt
+   .long USART2_global_interrupt
+   .long USART3_global_interrupt
+   .long EXTI_Line15_10_interrupts
+   .long RTC_alarm_through_EXTI_line_interrupt
+   .long USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .long TIM8_Break_interrupt
+   .long TIM8_Update_interrupt
+   .long TIM8_Trigger_and_Commutation_interrupts
+   .long TIM8_Capture_Compare_interrupt
+   .long ADC3_global_interrupt
+   .long FSMC_global_interrupt
+   .long SDIO_global_interrupt
+   .long TIM5_global_interrupt
+   .long SPI3_global_interrupt
+   .long UART4_global_interrupt
+   .long UART5_global_interrupt
+   .long TIM6_global_interrupt
+   .long TIM7_global_interrupt
+   .long DMA2_Channel1_global_interrupt
+   .long DMA2_Channel2_global_interrupt
+   .long DMA2_Channel3_global_interrupt
+   .long DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+   
+   .weak NMI_interrupt
+   .weak Hardfault_interrupt
+   .weak MemManage_interrupt
+   .weak BusFault_interrupt
+   .weak UsageFault_interrupt
+   .weak SWI_interrupt
+   .weak DebugMonitor_interrupt
+   .weak PendingSV_interrupt
+   .weak SysTick_interrupt
+   
+   .weak Window_watchdog_interrupt
+   .weak PVD_through_EXTI_Line_detection_interrupt
+   .weak Tamper_interrupt
+   .weak RTC_global_interrupt
+   .weak Flash_global_interrupt
+   .weak RCC_global_interrupt
+   .weak EXTI_Line0_interrupt
+   .weak EXTI_Line1_interrupt
+   .weak EXTI_Line2_interrupt
+   .weak EXTI_Line3_interrupt
+   .weak EXTI_Line4_interrupt
+   .weak DMA1_Channel1_global_interrupt
+   .weak DMA1_Channel2_global_interrupt
+   .weak DMA1_Channel3_global_interrupt
+   .weak DMA1_Channel4_global_interrupt
+   .weak DMA1_Channel5_global_interrupt
+   .weak DMA1_Channel6_global_interrupt
+   .weak DMA1_Channel7_global_interrupt
+   .weak ADC1_and_ADC2_global_interrupt
+   .weak USB_High_Priority_or_CAN_TX_interrupts
+   .weak USB_Low_Priority_or_CAN_RX0_interrupts
+   .weak CAN_RX1_interrupt
+   .weak CAN_SCE_interrupt
+   .weak EXTI_Line9_5_interrupts
+   .weak TIM1_Break_interrupt
+   .weak TIM1_Update_interrupt
+   .weak TIM1_Trigger_and_Commutation_interrupts
+   .weak TIM1_Capture_Compare_interrupt
+   .weak TIM2_global_interrupt
+   .weak TIM3_global_interrupt
+   .weak TIM4_global_interrupt
+   .weak I2C1_event_interrupt
+   .weak I2C1_error_interrupt
+   .weak I2C2_event_interrupt
+   .weak I2C2_error_interrupt
+   .weak SPI1_global_interrupt
+   .weak SPI2_global_interrupt
+   .weak USART1_global_interrupt
+   .weak USART2_global_interrupt
+   .weak USART3_global_interrupt
+   .weak EXTI_Line15_10_interrupts
+   .weak RTC_alarm_through_EXTI_line_interrupt
+   .weak USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .weak TIM8_Break_interrupt
+   .weak TIM8_Update_interrupt
+   .weak TIM8_Trigger_and_Commutation_interrupts
+   .weak TIM8_Capture_Compare_interrupt
+   .weak ADC3_global_interrupt
+   .weak FSMC_global_interrupt
+   .weak SDIO_global_interrupt
+   .weak TIM5_global_interrupt
+   .weak SPI3_global_interrupt
+   .weak UART4_global_interrupt
+   .weak UART5_global_interrupt
+   .weak TIM6_global_interrupt
+   .weak TIM7_global_interrupt
+   .weak DMA2_Channel1_global_interrupt
+   .weak DMA2_Channel2_global_interrupt
+   .weak DMA2_Channel3_global_interrupt
+   .weak DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+
+   
+   .set NMI_interrupt, Startup
+   .set Hardfault_interrupt, Startup
+   .set MemManage_interrupt, Startup
+   .set BusFault_interrupt, Startup
+   .set UsageFault_interrupt, Startup
+   .set SWI_interrupt, Startup
+   .set DebugMonitor_interrupt, Startup
+   .set PendingSV_interrupt, Startup
+   .set SysTick_interrupt, Startup
+
+   .set Window_watchdog_interrupt, Startup
+   .set PVD_through_EXTI_Line_detection_interrupt, Startup
+   .set Tamper_interrupt, Startup
+   .set RTC_global_interrupt, Startup
+   .set Flash_global_interrupt, Startup
+   .set RCC_global_interrupt, Startup
+   .set EXTI_Line0_interrupt, Startup
+   .set EXTI_Line1_interrupt, Startup
+   .set EXTI_Line2_interrupt, Startup
+   .set EXTI_Line3_interrupt, Startup
+   .set EXTI_Line4_interrupt, Startup
+   .set DMA1_Channel1_global_interrupt, Startup
+   .set DMA1_Channel2_global_interrupt, Startup
+   .set DMA1_Channel3_global_interrupt, Startup
+   .set DMA1_Channel4_global_interrupt, Startup
+   .set DMA1_Channel5_global_interrupt, Startup
+   .set DMA1_Channel6_global_interrupt, Startup
+   .set DMA1_Channel7_global_interrupt, Startup
+   .set ADC1_and_ADC2_global_interrupt, Startup
+   .set USB_High_Priority_or_CAN_TX_interrupts, Startup
+   .set USB_Low_Priority_or_CAN_RX0_interrupts, Startup
+   .set CAN_RX1_interrupt, Startup
+   .set CAN_SCE_interrupt, Startup
+   .set EXTI_Line9_5_interrupts, Startup
+   .set TIM1_Break_interrupt, Startup
+   .set TIM1_Update_interrupt, Startup
+   .set TIM1_Trigger_and_Commutation_interrupts, Startup
+   .set TIM1_Capture_Compare_interrupt, Startup
+   .set TIM2_global_interrupt, Startup
+   .set TIM3_global_interrupt, Startup
+   .set TIM4_global_interrupt, Startup
+   .set I2C1_event_interrupt, Startup
+   .set I2C1_error_interrupt, Startup
+   .set I2C2_event_interrupt, Startup
+   .set I2C2_error_interrupt, Startup
+   .set SPI1_global_interrupt, Startup
+   .set SPI2_global_interrupt, Startup
+   .set USART1_global_interrupt, Startup
+   .set USART2_global_interrupt, Startup
+   .set USART3_global_interrupt, Startup
+   .set EXTI_Line15_10_interrupts, Startup
+   .set RTC_alarm_through_EXTI_line_interrupt, Startup
+   .set USB_wakeup_from_suspend_through_EXTI_line_interrupt, Startup
+   .set TIM8_Break_interrupt, Startup
+   .set TIM8_Update_interrupt, Startup
+   .set TIM8_Trigger_and_Commutation_interrupts, Startup
+   .set TIM8_Capture_Compare_interrupt, Startup
+   .set ADC3_global_interrupt, Startup
+   .set FSMC_global_interrupt, Startup
+   .set SDIO_global_interrupt, Startup
+   .set TIM5_global_interrupt, Startup
+   .set SPI3_global_interrupt, Startup
+   .set UART4_global_interrupt, Startup
+   .set UART5_global_interrupt, Startup
+   .set TIM6_global_interrupt, Startup
+   .set TIM7_global_interrupt, Startup
+   .set DMA2_Channel1_global_interrupt, Startup
+   .set DMA2_Channel2_global_interrupt, Startup
+   .set DMA2_Channel3_global_interrupt, Startup
+   .set DMA2_Channel4_and_DMA2_Channel5_global_interrupts, Startup
+   
+   .text
+end;
+
+end.

+ 777 - 0
rtl/embedded/arm/stm32f10x_md.pp

@@ -0,0 +1,777 @@
+{
+Register definitions and utility code for STM32F10x - Medium density
+
+Created by Jeppe Johansen 2012 - [email protected]
+}
+unit stm32f10x_md;
+
+{$goto on}
+{$define stm32f10x_md}
+
+interface
+
+type
+ TBitvector32 = bitpacked array[0..31] of 0..1;
+
+{$PACKRECORDS 2}
+const
+ PeripheralBase 	= $40000000;
+
+ FSMCBase			= $60000000;
+
+ APB1Base 			= PeripheralBase;
+ APB2Base 			= PeripheralBase+$10000;
+ AHBBase 			= PeripheralBase+$20000;
+
+ SCS_BASE         = $E000E000;
+
+ { FSMC }
+ FSMCBank1NOR1		= FSMCBase+$00000000;
+ FSMCBank1NOR2		= FSMCBase+$04000000;
+ FSMCBank1NOR3		= FSMCBase+$08000000;
+ FSMCBank1NOR4		= FSMCBase+$0C000000;
+
+ FSMCBank1PSRAM1	= FSMCBase+$00000000;
+ FSMCBank1PSRAM2	= FSMCBase+$04000000;
+ FSMCBank1PSRAM3	= FSMCBase+$08000000;
+ FSMCBank1PSRAM4	= FSMCBase+$0C000000;
+
+ FSMCBank2NAND1	= FSMCBase+$10000000;
+ FSMCBank3NAND2	= FSMCBase+$20000000;
+
+ FSMCBank4PCCARD	= FSMCBase+$30000000;
+
+type
+ TTimerRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SMCR, res3,
+  DIER, res4,
+  SR, res5,
+  EGR, res,
+  CCMR1, res6,
+  CCMR2, res7,
+  CCER, res8,
+  CNT, res9,
+  PSC, res10,
+  ARR, res11,
+  RCR, res12,
+  CCR1, res13,
+  CCR2, res14,
+  CCR3, res15,
+  CCR4, res16,
+  BDTR, res17,
+  DCR, res18,
+  DMAR, res19: Word;
+ end;
+
+ TRTCRegisters = record
+  CRH, res1,
+  CRL, res2,
+  PRLH, res3,
+  PRLL, res4,
+  DIVH, res5,
+  DIVL, res6,
+  CNTH, res7,
+  CNTL, res8,
+  ALRH, res9,
+  ALRL, res10: Word;
+ end;
+
+ TIWDGRegisters = record
+  KR, res1,
+  PR, res2,
+  RLR, res3,
+  SR, res4: word;
+ end;
+
+ TWWDGRegisters = record
+  CR, res2,
+  CFR, res3,
+  SR, res4: word;
+ end;
+
+ TSPIRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SR, res3,
+  DR, res4,
+  CRCPR, res5,
+  RXCRCR, res6,
+  TXCRCR, res7,
+  I2SCFGR, res8,
+  I2SPR, res9: Word;
+ end;
+
+ TUSARTRegisters = record
+  SR, res1,
+  DR, res2,
+  BRR, res3,
+  CR1, res4,
+  CR2, res5,
+  CR3, res6,
+  GTPR, res7: Word;
+ end;
+
+ TI2CRegisters = record
+  CR1, res1,
+  CR2, res2,
+  OAR1, res3,
+  OAR2, res4,
+  DR, res5,
+  SR1, res6,
+  SR2, res7,
+  CCR, res8: word;
+  TRISE: byte;
+ end;
+
+ TUSBRegisters = record
+  EPR: array[0..7] of longword;
+
+  res: array[0..7] of longword;
+
+  CNTR, res1,
+  ISTR, res2,
+  FNR, res3: Word;
+  DADDR: byte; res4: word; res5: byte;
+  BTABLE: Word;
+ end;
+
+ TUSBMem = packed array[0..511] of byte;
+
+ TCANMailbox = record
+  IR,
+  DTR,
+  DLR,
+  DHR: longword;
+ end;
+
+ TCANRegisters = record
+  MCR,
+  MSR,
+  TSR,
+  RF0R,
+  RF1R,
+  IER,
+  ESR,
+  BTR: longword;
+
+  res5: array[$020..$17F] of byte;
+
+  TX: array[0..2] of TCANMailbox;
+  RX: array[0..2] of TCANMailbox;
+
+  res6: array[$1D0..$1FF] of byte;
+
+  FMR,
+  FM1R,
+  res9: longword;
+  FS1R, res10: word;
+  res11: longword;
+  FFA1R, res12: word;
+  res13: longword;
+  FA1R, res14: word;
+  res15: array[$220..$23F] of byte;
+
+  FOR1,
+  FOR2: longword;
+
+  FB: array[1..13] of array[1..2] of longword;
+ end;
+
+ TBKPRegisters = record
+  DR: array[1..10] of record data, res: word; end;
+
+  RTCCR,
+  CR,
+  CSR,
+  res1,res2: longword;
+
+  DR2: array[11..42] of record data, res: word; end;
+ end;
+
+ TPwrRegisters = record
+  CR, res: word;
+  CSR: Word;
+ end;
+
+ TDACRegisters = record
+  CR,
+  SWTRIGR: longword;
+
+  DHR12R1, res2,
+  DHR12L1, res3,
+  DHR8R1, res4,
+  DHR12R2, res5,
+  DHR12L2, res6,
+  DHR8R2, res7: word;
+
+  DHR12RD,
+  DHR12LD: longword;
+
+  DHR8RD, res8,
+
+  DOR1, res9,
+  DOR2, res10: Word;
+ end;
+
+ TAFIORegisters = record
+  EVCR,
+  MAPR: longword;
+  EXTICR: array[0..3] of longword;
+ end;
+
+ TEXTIRegisters = record
+  IMR,
+  EMR,
+  RTSR,
+  FTSR,
+  SWIER,
+  PR: longword;
+ end;
+
+ TPortRegisters = record
+  CRL,
+  CRH,
+  IDR,
+  ODR,
+  BSRR,
+  BRR,
+  LCKR: longword;
+ end;
+
+ TADCRegisters = record
+  SR,
+  CR1,
+  CR2,
+  SMPR1,
+  SMPR2: longword;
+  JOFR1, res2,
+  JOFR2, res3,
+  JOFR3, res4,
+  JOFR4, res5,
+  HTR, res6,
+  LTR, res7: word;
+  SQR1,
+  SQR2,
+  SQR3,
+  JSQR: longword;
+  JDR1, res8,
+  JDR2, res9,
+  JDR3, res10,
+  JDR4, res11: Word;
+  DR: longword;
+ end;
+
+ TSDIORegisters = record
+  POWER,
+  CLKCR,
+  ARG: longword;
+  CMD, res3,
+  RESPCMD, res4: Word;
+  RESP1,
+  RESP2,
+  RESP3,
+  RESP4,
+  DTIMER,
+  DLEN: longword;
+  DCTRL, res5: word;
+  DCOUNT,
+  STA,
+  ICR,
+  MASK,
+  FIFOCNT,
+  FIFO: longword;
+ end;
+
+ TDMAChannel = record
+  CCR, res1,
+  CNDTR, res2: word;
+  CPAR,
+  CMAR,
+  res: longword;
+ end;
+
+ TDMARegisters = record
+  ISR,
+  IFCR: longword;
+  Channel: array[0..7] of TDMAChannel;
+ end;
+
+ TRCCRegisters = record
+  CR,
+  CFGR,
+  CIR,
+  APB2RSTR,
+  APB1RSTR,
+  AHBENR,
+  APB2ENR,
+  APB1ENR,
+  BDCR,
+  CSR: longword;
+ end;
+
+ TCRCRegisters = record
+  DR: longword;
+  IDR: byte; res1: word; res2: byte;
+  CR: byte;
+ end;
+
+ TFSMCRegisters = record
+  nothingyet: byte;
+ end;
+
+ TFlashRegisters = record
+  ACR,
+  KEYR,
+  OPTKEYR,
+  SR,
+  CR,
+  AR,
+  res,
+  OBR,
+  WRPR: longword;
+ end;
+
+ TNVICRegisters = record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ end;
+
+ TSCBRegisters = record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                             {!< Interrupt Control State Register                         }
+  VTOR,                             {!< Vector Table Offset Register                             }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                  }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
+  SHCSR,                            {!< System Handler Control and State Register                }
+  CFSR,                             {!< Configurable Fault Status Register                       }
+  HFSR,                             {!< Hard Fault Status Register                               }
+  DFSR,                             {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                              }
+  BFAR,                             {!< Bus Fault Address Register                               }
+  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+ TSysTickRegisters = record
+  Ctrl,
+  Load,
+  Val,
+  Calib: longword;
+ end;
+
+{$ALIGN 2}
+var
+ { Timers }
+ Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
+ Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
+ Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
+ Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
+ Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
+ Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
+ Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
+ Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
+
+ { RTC }
+ RTC: TRTCRegisters 			absolute (APB1Base+$2800);
+
+ { WDG }
+ WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
+ IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
+
+ { SPI }
+ SPI1: TSPIRegisters			absolute (APB2Base+$3000);
+ SPI2: TSPIRegisters			absolute (APB1Base+$3800);
+ SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
+
+ { USART/UART }
+ USART1: TUSARTRegisters	absolute (APB2Base+$3800);
+ USART2: TUSARTRegisters	absolute (APB1Base+$4400);
+ USART3: TUSARTRegisters	absolute (APB1Base+$4800);
+ UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
+ UART5: TUSARTRegisters		absolute (APB1Base+$5000);
+
+ { I2C }
+ I2C1: TI2CRegisters			absolute (APB1Base+$5400);
+ I2C2: TI2CRegisters			absolute (APB1Base+$5800);
+
+ { USB }
+ USB: TUSBRegisters			absolute (APB1Base+$5C00);
+ USBMem: TUSBMem                        absolute (APB1Base+$6000);
+
+ { CAN }
+ CAN: TCANRegisters			absolute (APB1Base+$6800);
+
+ { BKP }
+ BKP: TBKPRegisters			absolute (APB1Base+$6C00);
+
+ { PWR }
+ PWR: TPwrRegisters			absolute (APB1Base+$7000);
+
+ { DAC }
+ DAC: TDACRegisters			absolute (APB1Base+$7400);
+
+ { GPIO }
+ AFIO: TAFIORegisters		absolute (APB2Base+$0);
+ EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
+
+ PortA: TPortRegisters		absolute (APB2Base+$0800);
+ PortB: TPortRegisters		absolute (APB2Base+$0C00);
+ PortC: TPortRegisters		absolute (APB2Base+$1000);
+ PortD: TPortRegisters		absolute (APB2Base+$1400);
+ PortE: TPortRegisters		absolute (APB2Base+$1800);
+ PortF: TPortRegisters		absolute (APB2Base+$1C00);
+ PortG: TPortRegisters		absolute (APB2Base+$2000);
+
+ { ADC }
+ ADC1: TADCRegisters			absolute (APB2Base+$2400);
+ ADC2: TADCRegisters			absolute (APB2Base+$2800);
+ ADC3: TADCRegisters			absolute (APB2Base+$3C00);
+
+ { SDIO }
+ SDIO: TSDIORegisters		absolute (APB2Base+$8000);
+
+ { DMA }
+ DMA1: TDMARegisters			absolute (AHBBase+$0000);
+ DMA2: TDMARegisters			absolute (AHBBase+$0400);
+
+ { RCC }
+ RCC: TRCCRegisters			absolute (AHBBase+$1000);
+
+ { Flash }
+ Flash: TFlashRegisters		absolute (AHBBase+$2000);
+
+ { CRC }
+ CRC: TCRCRegisters			absolute (AHBBase+$3000);
+
+ { SCB }
+ SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
+
+ { SysTick }
+ SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
+
+ { NVIC }
+ NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Window_watchdog_interrupt; external name 'Window_watchdog_interrupt';
+procedure PVD_through_EXTI_Line_detection_interrupt; external name 'PVD_through_EXTI_Line_detection_interrupt';
+procedure Tamper_interrupt; external name 'Tamper_interrupt';
+procedure RTC_global_interrupt; external name 'RTC_global_interrupt';
+procedure Flash_global_interrupt; external name 'Flash_global_interrupt';
+procedure RCC_global_interrupt; external name 'RCC_global_interrupt';
+procedure EXTI_Line0_interrupt; external name 'EXTI_Line0_interrupt';
+procedure EXTI_Line1_interrupt; external name 'EXTI_Line1_interrupt';
+procedure EXTI_Line2_interrupt; external name 'EXTI_Line2_interrupt';
+procedure EXTI_Line3_interrupt; external name 'EXTI_Line3_interrupt';
+procedure EXTI_Line4_interrupt; external name 'EXTI_Line4_interrupt';
+procedure DMA1_Channel1_global_interrupt; external name 'DMA1_Channel1_global_interrupt';
+procedure DMA1_Channel2_global_interrupt; external name 'DMA1_Channel2_global_interrupt';
+procedure DMA1_Channel3_global_interrupt; external name 'DMA1_Channel3_global_interrupt';
+procedure DMA1_Channel4_global_interrupt; external name 'DMA1_Channel4_global_interrupt';
+procedure DMA1_Channel5_global_interrupt; external name 'DMA1_Channel5_global_interrupt';
+procedure DMA1_Channel6_global_interrupt; external name 'DMA1_Channel6_global_interrupt';
+procedure DMA1_Channel7_global_interrupt; external name 'DMA1_Channel7_global_interrupt';
+procedure ADC1_and_ADC2_global_interrupt; external name 'ADC1_and_ADC2_global_interrupt';
+procedure USB_High_Priority_or_CAN_TX_interrupts; external name 'USB_High_Priority_or_CAN_TX_interrupts';
+procedure USB_Low_Priority_or_CAN_RX0_interrupts; external name 'USB_Low_Priority_or_CAN_RX0_interrupts';
+procedure CAN_RX1_interrupt; external name 'CAN_RX1_interrupt';
+procedure CAN_SCE_interrupt; external name 'CAN_SCE_interrupt';
+procedure EXTI_Line9_5_interrupts; external name 'EXTI_Line9_5_interrupts';
+procedure TIM1_Break_interrupt; external name 'TIM1_Break_interrupt';
+procedure TIM1_Update_interrupt; external name 'TIM1_Update_interrupt';
+procedure TIM1_Trigger_and_Commutation_interrupts; external name 'TIM1_Trigger_and_Commutation_interrupts';
+procedure TIM1_Capture_Compare_interrupt; external name 'TIM1_Capture_Compare_interrupt';
+procedure TIM2_global_interrupt; external name 'TIM2_global_interrupt';
+procedure TIM3_global_interrupt; external name 'TIM3_global_interrupt';
+procedure TIM4_global_interrupt; external name 'TIM4_global_interrupt';
+procedure I2C1_event_interrupt; external name 'I2C1_event_interrupt';
+procedure I2C1_error_interrupt; external name 'I2C1_error_interrupt';
+procedure I2C2_event_interrupt; external name 'I2C2_event_interrupt';
+procedure I2C2_error_interrupt; external name 'I2C2_error_interrupt';
+procedure SPI1_global_interrupt; external name 'SPI1_global_interrupt';
+procedure SPI2_global_interrupt; external name 'SPI2_global_interrupt';
+procedure USART1_global_interrupt; external name 'USART1_global_interrupt';
+procedure USART2_global_interrupt; external name 'USART2_global_interrupt';
+procedure USART3_global_interrupt; external name 'USART3_global_interrupt';
+procedure EXTI_Line15_10_interrupts; external name 'EXTI_Line15_10_interrupts';
+procedure RTC_alarm_through_EXTI_line_interrupt; external name 'RTC_alarm_through_EXTI_line_interrupt';
+procedure USB_wakeup_from_suspend_through_EXTI_line_interrupt; external name 'USB_wakeup_from_suspend_through_EXTI_line_interrupt';
+procedure TIM8_Break_interrupt; external name 'TIM8_Break_interrupt';
+procedure TIM8_Update_interrupt; external name 'TIM8_Update_interrupt';
+procedure TIM8_Trigger_and_Commutation_interrupts; external name 'TIM8_Trigger_and_Commutation_interrupts';
+procedure TIM8_Capture_Compare_interrupt; external name 'TIM8_Capture_Compare_interrupt';
+procedure ADC3_global_interrupt; external name 'ADC3_global_interrupt';
+procedure FSMC_global_interrupt; external name 'FSMC_global_interrupt';
+procedure SDIO_global_interrupt; external name 'SDIO_global_interrupt';
+procedure TIM5_global_interrupt; external name 'TIM5_global_interrupt';
+procedure SPI3_global_interrupt; external name 'SPI3_global_interrupt';
+procedure UART4_global_interrupt; external name 'UART4_global_interrupt';
+procedure UART5_global_interrupt; external name 'UART5_global_interrupt';
+procedure TIM6_global_interrupt; external name 'TIM6_global_interrupt';
+procedure TIM7_global_interrupt; external name 'TIM7_global_interrupt';
+procedure DMA2_Channel1_global_interrupt; external name 'DMA2_Channel1_global_interrupt';
+procedure DMA2_Channel2_global_interrupt; external name 'DMA2_Channel2_global_interrupt';
+procedure DMA2_Channel3_global_interrupt; external name 'DMA2_Channel3_global_interrupt';
+procedure DMA2_Channel4_and_DMA2_Channel5_global_interrupts; external name 'DMA2_Channel4_and_DMA2_Channel5_global_interrupts';
+
+{$i cortexm3_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+   .section ".init.interrupt_vectors"
+interrupt_vectors:
+   .long _stack_top
+   .long Startup
+   .long NMI_interrupt
+   .long Hardfault_interrupt
+   .long MemManage_interrupt
+   .long BusFault_interrupt
+   .long UsageFault_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long SWI_interrupt
+   .long DebugMonitor_interrupt
+   .long 0
+   .long PendingSV_interrupt
+   .long SysTick_interrupt
+   
+   .long Window_watchdog_interrupt
+   .long PVD_through_EXTI_Line_detection_interrupt
+   .long Tamper_interrupt
+   .long RTC_global_interrupt
+   .long Flash_global_interrupt
+   .long RCC_global_interrupt
+   .long EXTI_Line0_interrupt
+   .long EXTI_Line1_interrupt
+   .long EXTI_Line2_interrupt
+   .long EXTI_Line3_interrupt
+   .long EXTI_Line4_interrupt
+   .long DMA1_Channel1_global_interrupt
+   .long DMA1_Channel2_global_interrupt
+   .long DMA1_Channel3_global_interrupt
+   .long DMA1_Channel4_global_interrupt
+   .long DMA1_Channel5_global_interrupt
+   .long DMA1_Channel6_global_interrupt
+   .long DMA1_Channel7_global_interrupt
+   .long ADC1_and_ADC2_global_interrupt
+   .long USB_High_Priority_or_CAN_TX_interrupts
+   .long USB_Low_Priority_or_CAN_RX0_interrupts
+   .long CAN_RX1_interrupt
+   .long CAN_SCE_interrupt
+   .long EXTI_Line9_5_interrupts
+   .long TIM1_Break_interrupt
+   .long TIM1_Update_interrupt
+   .long TIM1_Trigger_and_Commutation_interrupts
+   .long TIM1_Capture_Compare_interrupt
+   .long TIM2_global_interrupt
+   .long TIM3_global_interrupt
+   .long TIM4_global_interrupt
+   .long I2C1_event_interrupt
+   .long I2C1_error_interrupt
+   .long I2C2_event_interrupt
+   .long I2C2_error_interrupt
+   .long SPI1_global_interrupt
+   .long SPI2_global_interrupt
+   .long USART1_global_interrupt
+   .long USART2_global_interrupt
+   .long USART3_global_interrupt
+   .long EXTI_Line15_10_interrupts
+   .long RTC_alarm_through_EXTI_line_interrupt
+   .long USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .long TIM8_Break_interrupt
+   .long TIM8_Update_interrupt
+   .long TIM8_Trigger_and_Commutation_interrupts
+   .long TIM8_Capture_Compare_interrupt
+   .long ADC3_global_interrupt
+   .long FSMC_global_interrupt
+   .long SDIO_global_interrupt
+   .long TIM5_global_interrupt
+   .long SPI3_global_interrupt
+   .long UART4_global_interrupt
+   .long UART5_global_interrupt
+   .long TIM6_global_interrupt
+   .long TIM7_global_interrupt
+   .long DMA2_Channel1_global_interrupt
+   .long DMA2_Channel2_global_interrupt
+   .long DMA2_Channel3_global_interrupt
+   .long DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+   
+   .weak NMI_interrupt
+   .weak Hardfault_interrupt
+   .weak MemManage_interrupt
+   .weak BusFault_interrupt
+   .weak UsageFault_interrupt
+   .weak SWI_interrupt
+   .weak DebugMonitor_interrupt
+   .weak PendingSV_interrupt
+   .weak SysTick_interrupt
+   
+   .weak Window_watchdog_interrupt
+   .weak PVD_through_EXTI_Line_detection_interrupt
+   .weak Tamper_interrupt
+   .weak RTC_global_interrupt
+   .weak Flash_global_interrupt
+   .weak RCC_global_interrupt
+   .weak EXTI_Line0_interrupt
+   .weak EXTI_Line1_interrupt
+   .weak EXTI_Line2_interrupt
+   .weak EXTI_Line3_interrupt
+   .weak EXTI_Line4_interrupt
+   .weak DMA1_Channel1_global_interrupt
+   .weak DMA1_Channel2_global_interrupt
+   .weak DMA1_Channel3_global_interrupt
+   .weak DMA1_Channel4_global_interrupt
+   .weak DMA1_Channel5_global_interrupt
+   .weak DMA1_Channel6_global_interrupt
+   .weak DMA1_Channel7_global_interrupt
+   .weak ADC1_and_ADC2_global_interrupt
+   .weak USB_High_Priority_or_CAN_TX_interrupts
+   .weak USB_Low_Priority_or_CAN_RX0_interrupts
+   .weak CAN_RX1_interrupt
+   .weak CAN_SCE_interrupt
+   .weak EXTI_Line9_5_interrupts
+   .weak TIM1_Break_interrupt
+   .weak TIM1_Update_interrupt
+   .weak TIM1_Trigger_and_Commutation_interrupts
+   .weak TIM1_Capture_Compare_interrupt
+   .weak TIM2_global_interrupt
+   .weak TIM3_global_interrupt
+   .weak TIM4_global_interrupt
+   .weak I2C1_event_interrupt
+   .weak I2C1_error_interrupt
+   .weak I2C2_event_interrupt
+   .weak I2C2_error_interrupt
+   .weak SPI1_global_interrupt
+   .weak SPI2_global_interrupt
+   .weak USART1_global_interrupt
+   .weak USART2_global_interrupt
+   .weak USART3_global_interrupt
+   .weak EXTI_Line15_10_interrupts
+   .weak RTC_alarm_through_EXTI_line_interrupt
+   .weak USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .weak TIM8_Break_interrupt
+   .weak TIM8_Update_interrupt
+   .weak TIM8_Trigger_and_Commutation_interrupts
+   .weak TIM8_Capture_Compare_interrupt
+   .weak ADC3_global_interrupt
+   .weak FSMC_global_interrupt
+   .weak SDIO_global_interrupt
+   .weak TIM5_global_interrupt
+   .weak SPI3_global_interrupt
+   .weak UART4_global_interrupt
+   .weak UART5_global_interrupt
+   .weak TIM6_global_interrupt
+   .weak TIM7_global_interrupt
+   .weak DMA2_Channel1_global_interrupt
+   .weak DMA2_Channel2_global_interrupt
+   .weak DMA2_Channel3_global_interrupt
+   .weak DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+
+   
+   .set NMI_interrupt, Startup
+   .set Hardfault_interrupt, Startup
+   .set MemManage_interrupt, Startup
+   .set BusFault_interrupt, Startup
+   .set UsageFault_interrupt, Startup
+   .set SWI_interrupt, Startup
+   .set DebugMonitor_interrupt, Startup
+   .set PendingSV_interrupt, Startup
+   .set SysTick_interrupt, Startup
+
+   .set Window_watchdog_interrupt, Startup
+   .set PVD_through_EXTI_Line_detection_interrupt, Startup
+   .set Tamper_interrupt, Startup
+   .set RTC_global_interrupt, Startup
+   .set Flash_global_interrupt, Startup
+   .set RCC_global_interrupt, Startup
+   .set EXTI_Line0_interrupt, Startup
+   .set EXTI_Line1_interrupt, Startup
+   .set EXTI_Line2_interrupt, Startup
+   .set EXTI_Line3_interrupt, Startup
+   .set EXTI_Line4_interrupt, Startup
+   .set DMA1_Channel1_global_interrupt, Startup
+   .set DMA1_Channel2_global_interrupt, Startup
+   .set DMA1_Channel3_global_interrupt, Startup
+   .set DMA1_Channel4_global_interrupt, Startup
+   .set DMA1_Channel5_global_interrupt, Startup
+   .set DMA1_Channel6_global_interrupt, Startup
+   .set DMA1_Channel7_global_interrupt, Startup
+   .set ADC1_and_ADC2_global_interrupt, Startup
+   .set USB_High_Priority_or_CAN_TX_interrupts, Startup
+   .set USB_Low_Priority_or_CAN_RX0_interrupts, Startup
+   .set CAN_RX1_interrupt, Startup
+   .set CAN_SCE_interrupt, Startup
+   .set EXTI_Line9_5_interrupts, Startup
+   .set TIM1_Break_interrupt, Startup
+   .set TIM1_Update_interrupt, Startup
+   .set TIM1_Trigger_and_Commutation_interrupts, Startup
+   .set TIM1_Capture_Compare_interrupt, Startup
+   .set TIM2_global_interrupt, Startup
+   .set TIM3_global_interrupt, Startup
+   .set TIM4_global_interrupt, Startup
+   .set I2C1_event_interrupt, Startup
+   .set I2C1_error_interrupt, Startup
+   .set I2C2_event_interrupt, Startup
+   .set I2C2_error_interrupt, Startup
+   .set SPI1_global_interrupt, Startup
+   .set SPI2_global_interrupt, Startup
+   .set USART1_global_interrupt, Startup
+   .set USART2_global_interrupt, Startup
+   .set USART3_global_interrupt, Startup
+   .set EXTI_Line15_10_interrupts, Startup
+   .set RTC_alarm_through_EXTI_line_interrupt, Startup
+   .set USB_wakeup_from_suspend_through_EXTI_line_interrupt, Startup
+   .set TIM8_Break_interrupt, Startup
+   .set TIM8_Update_interrupt, Startup
+   .set TIM8_Trigger_and_Commutation_interrupts, Startup
+   .set TIM8_Capture_Compare_interrupt, Startup
+   .set ADC3_global_interrupt, Startup
+   .set FSMC_global_interrupt, Startup
+   .set SDIO_global_interrupt, Startup
+   .set TIM5_global_interrupt, Startup
+   .set SPI3_global_interrupt, Startup
+   .set UART4_global_interrupt, Startup
+   .set UART5_global_interrupt, Startup
+   .set TIM6_global_interrupt, Startup
+   .set TIM7_global_interrupt, Startup
+   .set DMA2_Channel1_global_interrupt, Startup
+   .set DMA2_Channel2_global_interrupt, Startup
+   .set DMA2_Channel3_global_interrupt, Startup
+   .set DMA2_Channel4_and_DMA2_Channel5_global_interrupts, Startup
+   
+   .text
+end;
+
+end.

+ 778 - 0
rtl/embedded/arm/stm32f10x_xl.pp

@@ -0,0 +1,778 @@
+{
+Register definitions and utility code for STM32F10x - XL density
+
+Created by Jeppe Johansen 2012 - [email protected]
+}
+unit stm32f10x_xl;
+
+{$goto on}
+{$define stm32f10x_xl}
+
+interface
+
+type
+ TBitvector32 = bitpacked array[0..31] of 0..1;
+
+{$PACKRECORDS 2}
+const
+ PeripheralBase 	= $40000000;
+
+ FSMCBase			= $60000000;
+
+ APB1Base 			= PeripheralBase;
+ APB2Base 			= PeripheralBase+$10000;
+ AHBBase 			= PeripheralBase+$20000;
+
+ SCS_BASE         = $E000E000;
+
+ { FSMC }
+ FSMCBank1NOR1		= FSMCBase+$00000000;
+ FSMCBank1NOR2		= FSMCBase+$04000000;
+ FSMCBank1NOR3		= FSMCBase+$08000000;
+ FSMCBank1NOR4		= FSMCBase+$0C000000;
+
+ FSMCBank1PSRAM1	= FSMCBase+$00000000;
+ FSMCBank1PSRAM2	= FSMCBase+$04000000;
+ FSMCBank1PSRAM3	= FSMCBase+$08000000;
+ FSMCBank1PSRAM4	= FSMCBase+$0C000000;
+
+ FSMCBank2NAND1	= FSMCBase+$10000000;
+ FSMCBank3NAND2	= FSMCBase+$20000000;
+
+ FSMCBank4PCCARD	= FSMCBase+$30000000;
+
+type
+ TTimerRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SMCR, res3,
+  DIER, res4,
+  SR, res5,
+  EGR, res,
+  CCMR1, res6,
+  CCMR2, res7,
+  CCER, res8,
+  CNT, res9,
+  PSC, res10,
+  ARR, res11,
+  RCR, res12,
+  CCR1, res13,
+  CCR2, res14,
+  CCR3, res15,
+  CCR4, res16,
+  BDTR, res17,
+  DCR, res18,
+  DMAR, res19: Word;
+ end;
+
+ TRTCRegisters = record
+  CRH, res1,
+  CRL, res2,
+  PRLH, res3,
+  PRLL, res4,
+  DIVH, res5,
+  DIVL, res6,
+  CNTH, res7,
+  CNTL, res8,
+  ALRH, res9,
+  ALRL, res10: Word;
+ end;
+
+ TIWDGRegisters = record
+  KR, res1,
+  PR, res2,
+  RLR, res3,
+  SR, res4: word;
+ end;
+
+ TWWDGRegisters = record
+  CR, res2,
+  CFR, res3,
+  SR, res4: word;
+ end;
+
+ TSPIRegisters = record
+  CR1, res1,
+  CR2, res2,
+  SR, res3,
+  DR, res4,
+  CRCPR, res5,
+  RXCRCR, res6,
+  TXCRCR, res7,
+  I2SCFGR, res8,
+  I2SPR, res9: Word;
+ end;
+
+ TUSARTRegisters = record
+  SR, res1,
+  DR, res2,
+  BRR, res3,
+  CR1, res4,
+  CR2, res5,
+  CR3, res6,
+  GTPR, res7: Word;
+ end;
+
+ TI2CRegisters = record
+  CR1, res1,
+  CR2, res2,
+  OAR1, res3,
+  OAR2, res4,
+  DR, res5,
+  SR1, res6,
+  SR2, res7,
+  CCR, res8: word;
+  TRISE: byte;
+ end;
+
+ TUSBRegisters = record
+  EPR: array[0..7] of longword;
+
+  res: array[0..7] of longword;
+
+  CNTR, res1,
+  ISTR, res2,
+  FNR, res3: Word;
+  DADDR: byte; res4: word; res5: byte;
+  BTABLE: Word;
+ end;
+
+ TUSBMem = packed array[0..511] of byte;
+
+ TCANMailbox = record
+  IR,
+  DTR,
+  DLR,
+  DHR: longword;
+ end;
+
+ TCANRegisters = record
+  MCR,
+  MSR,
+  TSR,
+  RF0R,
+  RF1R,
+  IER,
+  ESR,
+  BTR: longword;
+
+  res5: array[$020..$17F] of byte;
+
+  TX: array[0..2] of TCANMailbox;
+  RX: array[0..2] of TCANMailbox;
+
+  res6: array[$1D0..$1FF] of byte;
+
+  FMR,
+  FM1R,
+  res9: longword;
+  FS1R, res10: word;
+  res11: longword;
+  FFA1R, res12: word;
+  res13: longword;
+  FA1R, res14: word;
+  res15: array[$220..$23F] of byte;
+
+  FOR1,
+  FOR2: longword;
+
+  FB: array[1..13] of array[1..2] of longword;
+ end;
+
+ TBKPRegisters = record
+  DR: array[1..10] of record data, res: word; end;
+
+  RTCCR,
+  CR,
+  CSR,
+  res1,res2: longword;
+
+  DR2: array[11..42] of record data, res: word; end;
+ end;
+
+ TPwrRegisters = record
+  CR, res: word;
+  CSR: Word;
+ end;
+
+ TDACRegisters = record
+  CR,
+  SWTRIGR: longword;
+
+  DHR12R1, res2,
+  DHR12L1, res3,
+  DHR8R1, res4,
+  DHR12R2, res5,
+  DHR12L2, res6,
+  DHR8R2, res7: word;
+
+  DHR12RD,
+  DHR12LD: longword;
+
+  DHR8RD, res8,
+
+  DOR1, res9,
+  DOR2, res10: Word;
+ end;
+
+ TAFIORegisters = record
+  EVCR,
+  MAPR: longword;
+  EXTICR: array[0..3] of longword;
+ end;
+
+ TEXTIRegisters = record
+  IMR,
+  EMR,
+  RTSR,
+  FTSR,
+  SWIER,
+  PR: longword;
+ end;
+
+ TPortRegisters = record
+  CRL,
+  CRH,
+  IDR,
+  ODR,
+  BSRR,
+  BRR,
+  LCKR: longword;
+ end;
+
+ TADCRegisters = record
+  SR,
+  CR1,
+  CR2,
+  SMPR1,
+  SMPR2: longword;
+  JOFR1, res2,
+  JOFR2, res3,
+  JOFR3, res4,
+  JOFR4, res5,
+  HTR, res6,
+  LTR, res7: word;
+  SQR1,
+  SQR2,
+  SQR3,
+  JSQR: longword;
+  JDR1, res8,
+  JDR2, res9,
+  JDR3, res10,
+  JDR4, res11: Word;
+  DR: longword;
+ end;
+
+ TSDIORegisters = record
+  POWER,
+  CLKCR,
+  ARG: longword;
+  CMD, res3,
+  RESPCMD, res4: Word;
+  RESP1,
+  RESP2,
+  RESP3,
+  RESP4,
+  DTIMER,
+  DLEN: longword;
+  DCTRL, res5: word;
+  DCOUNT,
+  STA,
+  ICR,
+  MASK,
+  FIFOCNT,
+  FIFO: longword;
+ end;
+
+ TDMAChannel = record
+  CCR, res1,
+  CNDTR, res2: word;
+  CPAR,
+  CMAR,
+  res: longword;
+ end;
+
+ TDMARegisters = record
+  ISR,
+  IFCR: longword;
+  Channel: array[0..7] of TDMAChannel;
+ end;
+
+ TRCCRegisters = record
+  CR,
+  CFGR,
+  CIR,
+  APB2RSTR,
+  APB1RSTR,
+  AHBENR,
+  APB2ENR,
+  APB1ENR,
+  BDCR,
+  CSR: longword;
+ end;
+
+ TCRCRegisters = record
+  DR: longword;
+  IDR: byte; res1: word; res2: byte;
+  CR: byte;
+ end;
+
+ TFSMCRegisters = record
+  nothingyet: byte;
+ end;
+
+ TFlashRegisters = record
+  ACR,
+  KEYR,
+  OPTKEYR,
+  SR,
+  CR,
+  AR,
+  res,
+  OBR,
+  WRPR: longword;
+ end;
+
+ TNVICRegisters = record
+  ISER: array[0..7] of longword;
+   reserved0: array[0..23] of longword;
+  ICER: array[0..7] of longword;
+   reserved1: array[0..23] of longword;
+  ISPR: array[0..7] of longword;
+   reserved2: array[0..23] of longword;
+  ICPR: array[0..7] of longword;
+   reserved3: array[0..23] of longword;
+  IABR: array[0..7] of longword;
+   reserved4: array[0..55] of longword;
+  IP: array[0..239] of longword;
+   reserved5: array[0..643] of longword;
+  STIR: longword;
+ end;
+
+ TSCBRegisters = record
+  CPUID,                            {!< CPU ID Base Register                                     }
+  ICSR,                             {!< Interrupt Control State Register                         }
+  VTOR,                             {!< Vector Table Offset Register                             }
+  AIRCR,                            {!< Application Interrupt / Reset Control Register           }
+  SCR,                              {!< System Control Register                                  }
+  CCR: longword;                    {!< Configuration Control Register                           }
+  SHP: array[0..11] of byte;        {!< System Handlers Priority Registers (4-7, 8-11, 12-15)    }
+  SHCSR,                            {!< System Handler Control and State Register                }
+  CFSR,                             {!< Configurable Fault Status Register                       }
+  HFSR,                             {!< Hard Fault Status Register                               }
+  DFSR,                             {!< Debug Fault Status Register                              }
+  MMFAR,                            {!< Mem Manage Address Register                              }
+  BFAR,                             {!< Bus Fault Address Register                               }
+  AFSR: longword;                   {!< Auxiliary Fault Status Register                          }
+  PFR: array[0..1] of longword;     {!< Processor Feature Register                               }
+  DFR,                              {!< Debug Feature Register                                   }
+  ADR: longword;                    {!< Auxiliary Feature Register                               }
+  MMFR: array[0..3] of longword;    {!< Memory Model Feature Register                            }
+  ISAR: array[0..4] of longword;    {!< ISA Feature Register                                     }
+ end;
+
+ TSysTickRegisters = record
+  Ctrl,
+  Load,
+  Val,
+  Calib: longword;
+ end;
+
+{$ALIGN 2}
+var
+ { Timers }
+ Timer1: TTimerRegisters 	absolute (APB2Base+$2C00);
+ Timer2: TTimerRegisters 	absolute (APB1Base+$0000);
+ Timer3: TTimerRegisters 	absolute (APB1Base+$0400);
+ Timer4: TTimerRegisters 	absolute (APB1Base+$0800);
+ Timer5: TTimerRegisters 	absolute (APB1Base+$0C00);
+ Timer6: TTimerRegisters 	absolute (APB1Base+$1000);
+ Timer7: TTimerRegisters 	absolute (APB1Base+$1400);
+ Timer8: TTimerRegisters 	absolute (APB2Base+$3400);
+
+ { RTC }
+ RTC: TRTCRegisters 			absolute (APB1Base+$2800);
+
+ { WDG }
+ WWDG: TWWDGRegisters 		absolute (APB1Base+$2C00);
+ IWDG: TIWDGRegisters 		absolute (APB1Base+$3000);
+
+ { SPI }
+ SPI1: TSPIRegisters			absolute (APB2Base+$3000);
+ SPI2: TSPIRegisters			absolute (APB1Base+$3800);
+ SPI3: TSPIRegisters			absolute (APB1Base+$3C00);
+
+ { USART/UART }
+ USART1: TUSARTRegisters	absolute (APB2Base+$3800);
+ USART2: TUSARTRegisters	absolute (APB1Base+$4400);
+ USART3: TUSARTRegisters	absolute (APB1Base+$4800);
+ UART4: TUSARTRegisters		absolute (APB1Base+$4C00);
+ UART5: TUSARTRegisters		absolute (APB1Base+$5000);
+
+ { I2C }
+ I2C1: TI2CRegisters			absolute (APB1Base+$5400);
+ I2C2: TI2CRegisters			absolute (APB1Base+$5800);
+
+ { USB }
+ USB: TUSBRegisters			absolute (APB1Base+$5C00);
+ USBMem: TUSBMem                        absolute (APB1Base+$6000);
+
+ { CAN }
+ CAN: TCANRegisters			absolute (APB1Base+$6800);
+
+ { BKP }
+ BKP: TBKPRegisters			absolute (APB1Base+$6C00);
+
+ { PWR }
+ PWR: TPwrRegisters			absolute (APB1Base+$7000);
+
+ { DAC }
+ DAC: TDACRegisters			absolute (APB1Base+$7400);
+
+ { GPIO }
+ AFIO: TAFIORegisters		absolute (APB2Base+$0);
+ EXTI: TEXTIRegisters		absolute (APB2Base+$0400);
+
+ PortA: TPortRegisters		absolute (APB2Base+$0800);
+ PortB: TPortRegisters		absolute (APB2Base+$0C00);
+ PortC: TPortRegisters		absolute (APB2Base+$1000);
+ PortD: TPortRegisters		absolute (APB2Base+$1400);
+ PortE: TPortRegisters		absolute (APB2Base+$1800);
+ PortF: TPortRegisters		absolute (APB2Base+$1C00);
+ PortG: TPortRegisters		absolute (APB2Base+$2000);
+
+ { ADC }
+ ADC1: TADCRegisters			absolute (APB2Base+$2400);
+ ADC2: TADCRegisters			absolute (APB2Base+$2800);
+ ADC3: TADCRegisters			absolute (APB2Base+$3C00);
+
+ { SDIO }
+ SDIO: TSDIORegisters		absolute (APB2Base+$8000);
+
+ { DMA }
+ DMA1: TDMARegisters			absolute (AHBBase+$0000);
+ DMA2: TDMARegisters			absolute (AHBBase+$0400);
+
+ { RCC }
+ RCC: TRCCRegisters			absolute (AHBBase+$1000);
+
+ { Flash }
+ Flash: TFlashRegisters		absolute (AHBBase+$2000);
+
+ { CRC }
+ CRC: TCRCRegisters			absolute (AHBBase+$3000);
+
+ { SCB }
+ SCB: TSCBRegisters        absolute (SCS_BASE+$0D00);
+
+ { SysTick }
+ SysTick: TSysTickRegisters   absolute (SCS_BASE+$0010);
+
+ { NVIC }
+ NVIC: TNVICRegisters      absolute (SCS_BASE+$0100);
+
+implementation
+
+procedure NMI_interrupt; external name 'NMI_interrupt';
+procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
+procedure MemManage_interrupt; external name 'MemManage_interrupt';
+procedure BusFault_interrupt; external name 'BusFault_interrupt';
+procedure UsageFault_interrupt; external name 'UsageFault_interrupt';
+procedure SWI_interrupt; external name 'SWI_interrupt';
+procedure DebugMonitor_interrupt; external name 'DebugMonitor_interrupt';
+procedure PendingSV_interrupt; external name 'PendingSV_interrupt';
+procedure SysTick_interrupt; external name 'SysTick_interrupt';
+procedure Window_watchdog_interrupt; external name 'Window_watchdog_interrupt';
+procedure PVD_through_EXTI_Line_detection_interrupt; external name 'PVD_through_EXTI_Line_detection_interrupt';
+procedure Tamper_interrupt; external name 'Tamper_interrupt';
+procedure RTC_global_interrupt; external name 'RTC_global_interrupt';
+procedure Flash_global_interrupt; external name 'Flash_global_interrupt';
+procedure RCC_global_interrupt; external name 'RCC_global_interrupt';
+procedure EXTI_Line0_interrupt; external name 'EXTI_Line0_interrupt';
+procedure EXTI_Line1_interrupt; external name 'EXTI_Line1_interrupt';
+procedure EXTI_Line2_interrupt; external name 'EXTI_Line2_interrupt';
+procedure EXTI_Line3_interrupt; external name 'EXTI_Line3_interrupt';
+procedure EXTI_Line4_interrupt; external name 'EXTI_Line4_interrupt';
+procedure DMA1_Channel1_global_interrupt; external name 'DMA1_Channel1_global_interrupt';
+procedure DMA1_Channel2_global_interrupt; external name 'DMA1_Channel2_global_interrupt';
+procedure DMA1_Channel3_global_interrupt; external name 'DMA1_Channel3_global_interrupt';
+procedure DMA1_Channel4_global_interrupt; external name 'DMA1_Channel4_global_interrupt';
+procedure DMA1_Channel5_global_interrupt; external name 'DMA1_Channel5_global_interrupt';
+procedure DMA1_Channel6_global_interrupt; external name 'DMA1_Channel6_global_interrupt';
+procedure DMA1_Channel7_global_interrupt; external name 'DMA1_Channel7_global_interrupt';
+procedure ADC1_and_ADC2_global_interrupt; external name 'ADC1_and_ADC2_global_interrupt';
+procedure USB_High_Priority_or_CAN_TX_interrupts; external name 'USB_High_Priority_or_CAN_TX_interrupts';
+procedure USB_Low_Priority_or_CAN_RX0_interrupts; external name 'USB_Low_Priority_or_CAN_RX0_interrupts';
+procedure CAN_RX1_interrupt; external name 'CAN_RX1_interrupt';
+procedure CAN_SCE_interrupt; external name 'CAN_SCE_interrupt';
+procedure EXTI_Line9_5_interrupts; external name 'EXTI_Line9_5_interrupts';
+procedure TIM1_Break_TIM9_global_interrupt; external name 'TIM1_Break_TIM9_global_interrupt';
+procedure TIM1_Update_TIM10_global_interrupt; external name 'TIM1_Update_TIM10_global_interrupt';
+procedure TIM1_Trigger_and_Commutation_TIM11_global_interrupts; external name 'TIM1_Trigger_and_Commutation_TIM11_global_interrupts';
+procedure TIM1_Capture_Compare_interrupt; external name 'TIM1_Capture_Compare_interrupt';
+procedure TIM2_global_interrupt; external name 'TIM2_global_interrupt';
+procedure TIM3_global_interrupt; external name 'TIM3_global_interrupt';
+procedure TIM4_global_interrupt; external name 'TIM4_global_interrupt';
+procedure I2C1_event_interrupt; external name 'I2C1_event_interrupt';
+procedure I2C1_error_interrupt; external name 'I2C1_error_interrupt';
+procedure I2C2_event_interrupt; external name 'I2C2_event_interrupt';
+procedure I2C2_error_interrupt; external name 'I2C2_error_interrupt';
+procedure SPI1_global_interrupt; external name 'SPI1_global_interrupt';
+procedure SPI2_global_interrupt; external name 'SPI2_global_interrupt';
+procedure USART1_global_interrupt; external name 'USART1_global_interrupt';
+procedure USART2_global_interrupt; external name 'USART2_global_interrupt';
+procedure USART3_global_interrupt; external name 'USART3_global_interrupt';
+procedure EXTI_Line15_10_interrupts; external name 'EXTI_Line15_10_interrupts';
+procedure RTC_alarm_through_EXTI_line_interrupt; external name 'RTC_alarm_through_EXTI_line_interrupt';
+procedure USB_wakeup_from_suspend_through_EXTI_line_interrupt; external name 'USB_wakeup_from_suspend_through_EXTI_line_interrupt';
+procedure TIM8_Break_TIM12_global_interrupt; external name 'TIM8_Break_TIM12_global_interrupt';
+procedure TIM8_Update_TIM13_global_interrupt; external name 'TIM8_Update_TIM13_global_interrupt';
+procedure TIM8_Trigger_and_Commutation_TIM14_global_interrupts; external name 'TIM8_Trigger_and_Commutation_TIM14_global_interrupts';
+procedure TIM8_Capture_Compare_interrupt; external name 'TIM8_Capture_Compare_interrupt';
+procedure ADC3_global_interrupt; external name 'ADC3_global_interrupt';
+procedure FSMC_global_interrupt; external name 'FSMC_global_interrupt';
+procedure SDIO_global_interrupt; external name 'SDIO_global_interrupt';
+procedure TIM5_global_interrupt; external name 'TIM5_global_interrupt';
+procedure SPI3_global_interrupt; external name 'SPI3_global_interrupt';
+procedure UART4_global_interrupt; external name 'UART4_global_interrupt';
+procedure UART5_global_interrupt; external name 'UART5_global_interrupt';
+procedure TIM6_global_interrupt; external name 'TIM6_global_interrupt';
+procedure TIM7_global_interrupt; external name 'TIM7_global_interrupt';
+procedure DMA2_Channel1_global_interrupt; external name 'DMA2_Channel1_global_interrupt';
+procedure DMA2_Channel2_global_interrupt; external name 'DMA2_Channel2_global_interrupt';
+procedure DMA2_Channel3_global_interrupt; external name 'DMA2_Channel3_global_interrupt';
+procedure DMA2_Channel4_and_DMA2_Channel5_global_interrupts; external name 'DMA2_Channel4_and_DMA2_Channel5_global_interrupts';
+
+{$i cortexm3_start.inc}
+
+procedure Vectors; assembler; nostackframe;
+label interrupt_vectors;
+asm
+   .section ".init.interrupt_vectors"
+interrupt_vectors:
+   .long _stack_top
+   .long Startup
+   .long NMI_interrupt
+   .long Hardfault_interrupt
+   .long MemManage_interrupt
+   .long BusFault_interrupt
+   .long UsageFault_interrupt
+   .long 0
+   .long 0
+   .long 0
+   .long 0
+   .long SWI_interrupt
+   .long DebugMonitor_interrupt
+   .long 0
+   .long PendingSV_interrupt
+   .long SysTick_interrupt
+   
+   .long Window_watchdog_interrupt
+   .long PVD_through_EXTI_Line_detection_interrupt
+   .long Tamper_interrupt
+   .long RTC_global_interrupt
+   .long Flash_global_interrupt
+   .long RCC_global_interrupt
+   .long EXTI_Line0_interrupt
+   .long EXTI_Line1_interrupt
+   .long EXTI_Line2_interrupt
+   .long EXTI_Line3_interrupt
+   .long EXTI_Line4_interrupt
+   .long DMA1_Channel1_global_interrupt
+   .long DMA1_Channel2_global_interrupt
+   .long DMA1_Channel3_global_interrupt
+   .long DMA1_Channel4_global_interrupt
+   .long DMA1_Channel5_global_interrupt
+   .long DMA1_Channel6_global_interrupt
+   .long DMA1_Channel7_global_interrupt
+   .long ADC1_and_ADC2_global_interrupt
+   .long USB_High_Priority_or_CAN_TX_interrupts
+   .long USB_Low_Priority_or_CAN_RX0_interrupts
+   .long CAN_RX1_interrupt
+   .long CAN_SCE_interrupt
+   .long EXTI_Line9_5_interrupts
+   .long TIM1_Break_TIM9_global_interrupt
+   .long TIM1_Update_TIM10_global_interrupt
+   .long TIM1_Trigger_and_Commutation_TIM11_global_interrupts
+   .long TIM1_Capture_Compare_interrupt
+   .long TIM2_global_interrupt
+   .long TIM3_global_interrupt
+   .long TIM4_global_interrupt
+   .long I2C1_event_interrupt
+   .long I2C1_error_interrupt
+   .long I2C2_event_interrupt
+   .long I2C2_error_interrupt
+   .long SPI1_global_interrupt
+   .long SPI2_global_interrupt
+   .long USART1_global_interrupt
+   .long USART2_global_interrupt
+   .long USART3_global_interrupt
+   .long EXTI_Line15_10_interrupts
+   .long RTC_alarm_through_EXTI_line_interrupt
+   .long USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .long TIM8_Break_TIM12_global_interrupt
+   .long TIM8_Update_TIM13_global_interrupt
+   .long TIM8_Trigger_and_Commutation_TIM14_global_interrupts
+   .long TIM8_Capture_Compare_interrupt
+   .long ADC3_global_interrupt
+   .long FSMC_global_interrupt
+   .long SDIO_global_interrupt
+   .long TIM5_global_interrupt
+   .long SPI3_global_interrupt
+   .long UART4_global_interrupt
+   .long UART5_global_interrupt
+   .long TIM6_global_interrupt
+   .long TIM7_global_interrupt
+   .long DMA2_Channel1_global_interrupt
+   .long DMA2_Channel2_global_interrupt
+   .long DMA2_Channel3_global_interrupt
+   .long DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+   
+   
+   .weak NMI_interrupt
+   .weak Hardfault_interrupt
+   .weak MemManage_interrupt
+   .weak BusFault_interrupt
+   .weak UsageFault_interrupt
+   .weak SWI_interrupt
+   .weak DebugMonitor_interrupt
+   .weak PendingSV_interrupt
+   .weak SysTick_interrupt
+   
+   .weak Window_watchdog_interrupt
+   .weak PVD_through_EXTI_Line_detection_interrupt
+   .weak Tamper_interrupt
+   .weak RTC_global_interrupt
+   .weak Flash_global_interrupt
+   .weak RCC_global_interrupt
+   .weak EXTI_Line0_interrupt
+   .weak EXTI_Line1_interrupt
+   .weak EXTI_Line2_interrupt
+   .weak EXTI_Line3_interrupt
+   .weak EXTI_Line4_interrupt
+   .weak DMA1_Channel1_global_interrupt
+   .weak DMA1_Channel2_global_interrupt
+   .weak DMA1_Channel3_global_interrupt
+   .weak DMA1_Channel4_global_interrupt
+   .weak DMA1_Channel5_global_interrupt
+   .weak DMA1_Channel6_global_interrupt
+   .weak DMA1_Channel7_global_interrupt
+   .weak ADC1_and_ADC2_global_interrupt
+   .weak USB_High_Priority_or_CAN_TX_interrupts
+   .weak USB_Low_Priority_or_CAN_RX0_interrupts
+   .weak CAN_RX1_interrupt
+   .weak CAN_SCE_interrupt
+   .weak EXTI_Line9_5_interrupts
+   .weak TIM1_Break_TIM9_global_interrupt
+   .weak TIM1_Update_TIM10_global_interrupt
+   .weak TIM1_Trigger_and_Commutation_TIM11_global_interrupts
+   .weak TIM1_Capture_Compare_interrupt
+   .weak TIM2_global_interrupt
+   .weak TIM3_global_interrupt
+   .weak TIM4_global_interrupt
+   .weak I2C1_event_interrupt
+   .weak I2C1_error_interrupt
+   .weak I2C2_event_interrupt
+   .weak I2C2_error_interrupt
+   .weak SPI1_global_interrupt
+   .weak SPI2_global_interrupt
+   .weak USART1_global_interrupt
+   .weak USART2_global_interrupt
+   .weak USART3_global_interrupt
+   .weak EXTI_Line15_10_interrupts
+   .weak RTC_alarm_through_EXTI_line_interrupt
+   .weak USB_wakeup_from_suspend_through_EXTI_line_interrupt
+   .weak TIM8_Break_TIM12_global_interrupt
+   .weak TIM8_Update_TIM13_global_interrupt
+   .weak TIM8_Trigger_and_Commutation_TIM14_global_interrupts
+   .weak TIM8_Capture_Compare_interrupt
+   .weak ADC3_global_interrupt
+   .weak FSMC_global_interrupt
+   .weak SDIO_global_interrupt
+   .weak TIM5_global_interrupt
+   .weak SPI3_global_interrupt
+   .weak UART4_global_interrupt
+   .weak UART5_global_interrupt
+   .weak TIM6_global_interrupt
+   .weak TIM7_global_interrupt
+   .weak DMA2_Channel1_global_interrupt
+   .weak DMA2_Channel2_global_interrupt
+   .weak DMA2_Channel3_global_interrupt
+   .weak DMA2_Channel4_and_DMA2_Channel5_global_interrupts
+
+   
+   .set NMI_interrupt, Startup
+   .set Hardfault_interrupt, Startup
+   .set MemManage_interrupt, Startup
+   .set BusFault_interrupt, Startup
+   .set UsageFault_interrupt, Startup
+   .set SWI_interrupt, Startup
+   .set DebugMonitor_interrupt, Startup
+   .set PendingSV_interrupt, Startup
+   .set SysTick_interrupt, Startup
+
+   .set Window_watchdog_interrupt, Startup
+   .set PVD_through_EXTI_Line_detection_interrupt, Startup
+   .set Tamper_interrupt, Startup
+   .set RTC_global_interrupt, Startup
+   .set Flash_global_interrupt, Startup
+   .set RCC_global_interrupt, Startup
+   .set EXTI_Line0_interrupt, Startup
+   .set EXTI_Line1_interrupt, Startup
+   .set EXTI_Line2_interrupt, Startup
+   .set EXTI_Line3_interrupt, Startup
+   .set EXTI_Line4_interrupt, Startup
+   .set DMA1_Channel1_global_interrupt, Startup
+   .set DMA1_Channel2_global_interrupt, Startup
+   .set DMA1_Channel3_global_interrupt, Startup
+   .set DMA1_Channel4_global_interrupt, Startup
+   .set DMA1_Channel5_global_interrupt, Startup
+   .set DMA1_Channel6_global_interrupt, Startup
+   .set DMA1_Channel7_global_interrupt, Startup
+   .set ADC1_and_ADC2_global_interrupt, Startup
+   .set USB_High_Priority_or_CAN_TX_interrupts, Startup
+   .set USB_Low_Priority_or_CAN_RX0_interrupts, Startup
+   .set CAN_RX1_interrupt, Startup
+   .set CAN_SCE_interrupt, Startup
+   .set EXTI_Line9_5_interrupts, Startup
+   .set TIM1_Break_TIM9_global_interrupt, Startup
+   .set TIM1_Update_TIM10_global_interrupt, Startup
+   .set TIM1_Trigger_and_Commutation_TIM11_global_interrupts, Startup
+   .set TIM1_Capture_Compare_interrupt, Startup
+   .set TIM2_global_interrupt, Startup
+   .set TIM3_global_interrupt, Startup
+   .set TIM4_global_interrupt, Startup
+   .set I2C1_event_interrupt, Startup
+   .set I2C1_error_interrupt, Startup
+   .set I2C2_event_interrupt, Startup
+   .set I2C2_error_interrupt, Startup
+   .set SPI1_global_interrupt, Startup
+   .set SPI2_global_interrupt, Startup
+   .set USART1_global_interrupt, Startup
+   .set USART2_global_interrupt, Startup
+   .set USART3_global_interrupt, Startup
+   .set EXTI_Line15_10_interrupts, Startup
+   .set RTC_alarm_through_EXTI_line_interrupt, Startup
+   .set USB_wakeup_from_suspend_through_EXTI_line_interrupt, Startup
+   .set TIM8_Break_TIM12_global_interrupt, Startup
+   .set TIM8_Update_TIM13_global_interrupt, Startup
+   .set TIM8_Trigger_and_Commutation_TIM14_global_interrupts, Startup
+   .set TIM8_Capture_Compare_interrupt, Startup
+   .set ADC3_global_interrupt, Startup
+   .set FSMC_global_interrupt, Startup
+   .set SDIO_global_interrupt, Startup
+   .set TIM5_global_interrupt, Startup
+   .set SPI3_global_interrupt, Startup
+   .set UART4_global_interrupt, Startup
+   .set UART5_global_interrupt, Startup
+   .set TIM6_global_interrupt, Startup
+   .set TIM7_global_interrupt, Startup
+   .set DMA2_Channel1_global_interrupt, Startup
+   .set DMA2_Channel2_global_interrupt, Startup
+   .set DMA2_Channel3_global_interrupt, Startup
+   .set DMA2_Channel4_and_DMA2_Channel5_global_interrupts, Startup
+   
+   .text
+end;
+
+end.

+ 116 - 14
rtl/embedded/consoleio.pp

@@ -17,28 +17,130 @@ Unit consoleio;
 
 
   interface
   interface
 
 
+    type
+      TWriteCharFunc = function(ACh: char; AUserData: pointer): boolean;
+      TReadCharFunc = function(var ACh: char; AUserData: pointer): boolean;
+
+    procedure OpenIO(var f: Text; AWrite: TWriteCharFunc; ARead: TReadCharFunc; AMode:longint; AUserData: pointer);
+
   implementation
   implementation
 
 
+    {$i textrec.inc}
+
+    type
+      PUserData = ^TUserData;
+      TUserData = record
+        WriteChar: TWriteCharFunc;
+        ReadChar: TReadCharFunc;
+        UserData: Pointer;
+      end;
+
+    function EmptyWrite(ACh: char; AUserData: pointer): boolean;
+      begin
+        result:=true;
+      end;
+
+    function EmptyRead(var ACh: char; AUserData: pointer): boolean;
+      begin
+        result:=true;
+        ACh:=#0;
+      end;
+
+    procedure Console_Close(var t:TextRec);
+      begin
+      end;
+
+    function ReadData(Func: TReadCharFunc; UserData: pointer; Buffer: pchar; count: longint): longint;
+      var
+        c: char;
+        got_linechar: boolean;
+      begin
+        result:=0;
+        got_linechar:=false;
+        while (result < count) and (not got_linechar) do
+          begin
+            if Func(c, UserData) then
+              begin
+                if c = #10 then
+                  got_linechar:=true;
+                buffer^:=c;
+                inc(buffer);
+                inc(result);
+              end;
+          end;
+      end;
+
+    Procedure Console_Read(var t:TextRec);
+      var
+        userdata: PUserData;
+      begin
+        userdata:[email protected][1];
+        InOutRes:=0;
+        t.bufend:=ReadData(userdata^.ReadChar,userdata^.UserData,pchar(t.bufptr),t.bufsize);
+        t.bufpos:=0;
+      end;
+
+    Procedure Console_Write(var t:TextRec);
+      var
+        userdata: PUserData;
+        p: pchar;
+        i: longint;
+      begin
+        if t.BufPos=0 then exit;
+        userdata:[email protected][1];
+        i := 0;
+        p := pchar(t.bufptr);
+        while i < t.bufpos do
+          begin
+            if not userdata^.WriteChar(p^, userdata^.UserData) then
+              break;
+            inc(p);
+            inc(i);
+          end;
+        if i<>t.BufPos then
+          InOutRes:=101
+        else
+          InOutRes:=0;
+        t.BufPos:=0;
+      end;
+
+    procedure OpenIO(var f: Text; AWrite: TWriteCharFunc; ARead: TReadCharFunc; AMode:longint; AUserData: pointer);
+      var
+        userdata: PUserData;
+      begin
+        Assign(f,'');
+        userdata:=@TextRec(f).UserData[1];
+        TextRec(f).Mode:=AMode;
+        case AMode of
+          fmInput: TextRec(f).Handle:=StdInputHandle;
+          fmOutput: TextRec(f).Handle:=StdOutputHandle;
+        end;
+        TextRec(f).CloseFunc:=@Console_Close;
+        TextRec(f).FlushFunc:=nil;
+        case AMode of
+          fmInput: TextRec(f).InOutFunc:=@Console_Read;
+          fmOutput: 
+            begin
+              TextRec(f).InOutFunc:=@Console_Write;
+              TextRec(f).FlushFunc:=@Console_Write;
+            end;
+        end;
+        userdata^.WriteChar := AWrite;
+        userdata^.ReadChar := ARead;
+        userdata^.UserData := AUserData;
+      end;
+
     procedure SysInitStdIO;
     procedure SysInitStdIO;
       begin
       begin
-        // OpenStdIO(Input,fmInput,0);
-        // OpenStdIO(Output,fmOutput,0);
-        // OpenStdIO(ErrOutput,fmOutput,0);
-        // OpenStdIO(StdOut,fmOutput,0);
-        // OpenStdIO(StdErr,fmOutput,0);
+        OpenIO(Input, @EmptyWrite, @EmptyRead, fmInput, nil);
+        OpenIO(Output, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(ErrOutput, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(StdOut, @EmptyWrite, @EmptyRead, fmOutput, nil);
+        OpenIO(StdErr, @EmptyWrite, @EmptyRead, fmOutput, nil);
       end;
       end;
 
 
    procedure SysFlushStdIO;
    procedure SysFlushStdIO;
      begin
      begin
-       { Make sure that all output is written to the redirected file }
-{!!!!!!!!       if Textrec(Output).Mode=fmOutput then
-         Flush(Output);
-       if Textrec(ErrOutput).Mode=fmOutput then
-         Flush(ErrOutput);
-       if Textrec(stdout).Mode=fmOutput then
-         Flush(stdout);
-       if Textrec(StdErr).Mode=fmOutput then
-         Flush(StdErr);  }
      end;
      end;
 
 
 var
 var

+ 225 - 43
rtl/embedded/heapmgr.pp

@@ -2,7 +2,7 @@
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
     Copyright (c) 2011 by the Free Pascal development team.
     Copyright (c) 2011 by the Free Pascal development team.
 
 
-    Heap manager for the FPC embedded target
+    Tiny heap manager for the FPC embedded target
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -15,52 +15,234 @@
 {$mode objfpc}
 {$mode objfpc}
 Unit heapmgr;
 Unit heapmgr;
 
 
-interface
-
-implementation
-
-  var
-    Memorymanager: TMemoryManager;external name 'FPC_SYSTEM_MEMORYMANAGER';
-
-  Procedure HandleError (Errno : longint);external name 'FPC_HANDLEERROR';
-
-  {*****************************************************************************
-        OS Memory allocation / deallocation
-   ****************************************************************************}
-  function SysOSAlloc(size: ptruint): pointer;
-  begin
-    result:=nil; // pointer($02000000);
-  end;
-
-
-  procedure SysOSFree(p: pointer; size: ptruint);
-  begin
-  end;
-
-  {$define FPC_IN_HEAPMGR}
-  {$i heap.inc}
-
-  const
-    MyMemoryManager: TMemoryManager = (
-      NeedLock: false;  // Obsolete
-      GetMem: @SysGetMem;
-      FreeMem: @SysFreeMem;
-      FreeMemSize: @SysFreeMemSize;
-      AllocMem: @SysAllocMem;
-      ReAllocMem: @SysReAllocMem;
-      MemSize: @SysMemSize;
-      InitThread: nil;
-      DoneThread: nil;
-      RelocateHeap: nil;
-      GetHeapStatus: @SysGetHeapStatus;
-      GetFPCHeapStatus: @SysGetFPCHeapStatus;
-    );
+  interface
+
+    procedure RegisterHeapBlock(AAddress: pointer; ASize: ptruint);
+
+  implementation
+
+    const
+      MinBlock = 16;
+
+    type
+      PHeapBlock = ^THeapBlock;
+      THeapBlock = record
+        Size: ptruint;
+        Next: PHeapBlock;
+        EndAddr: pointer;
+      end;
+
+    var
+      Blocks: PHeapBlock = nil;
+
+    procedure InternalFreeMem(Addr: Pointer; Size: ptruint); forward;
+
+    function FindSize(p: pointer): ptruint;
+      begin
+        FindSize := PPtrUInt(p)[-1];
+      end;
+
+    function SysGetMem(Size: ptruint): pointer;
+      var
+        p, prev: PHeapBlock;
+        AllocSize, RestSize: ptruint;
+      begin
+        AllocSize := align(size+sizeof(ptruint), sizeof(pointer));
+
+        p := Blocks;
+        prev := nil;
+        while assigned(p) and (p^.Size < AllocSize) do
+          begin
+            prev := p;
+            p := p^.Next;
+          end;
+
+        if assigned(p) then
+          begin
+            result := @pptruint(p)[1];
+
+            if p^.Size-AllocSize >= MinBlock then
+              RestSize := p^.Size-AllocSize
+            else
+              begin
+                AllocSize := p^.Size;
+                RestSize := 0;
+              end;
+
+            if prev = nil then
+              Blocks := p^.Next
+            else
+              prev^.next := p^.next;
+
+            pptruint(p)^ := size;
+
+            InternalFreemem(pointer(ptruint(p)+AllocSize), RestSize);
+          end
+        else
+          Result := nil;
+      end;
+
+    function GetAlignedMem(Size, Alignment: ptruint): pointer;
+      var
+        mem: Pointer;
+        memp: ptruint;
+      begin
+        if alignment <= sizeof(pointer) then
+          result := GetMem(size)
+        else
+          begin
+            mem := GetMem(Size+Alignment-1);
+            memp := align(ptruint(mem), Alignment);
+            InternalFreemem(mem, ptruint(memp)-ptruint(mem));
+            result := pointer(memp);
+          end;
+      end;
+
+    procedure InternalFreeMem(Addr: Pointer; Size: ptruint);
+      var 
+        b, p, prev: PHeapBlock;
+        concatenated: boolean;
+      begin
+        concatenated := true;
+        while concatenated do
+          begin
+            concatenated := false;
+            b := addr;
+
+            b^.Next := Blocks;
+            b^.Size := Size;
+            b^.EndAddr := pointer(ptruint(addr)+size);
+
+            if Blocks = nil then
+              Blocks := b
+            else
+              begin
+                p := Blocks;
+                prev := nil;
+
+                while assigned(p) do
+                  begin
+                    if p^.EndAddr = addr then
+                      begin
+                        addr:=p;
+                        size:=p^.size+size;
+                        if prev = nil then
+                          blocks:=p^.next
+                        else
+                          prev^.next:=p^.next;
+                        concatenated:=true;
+                        break;
+                      end
+                    else if p = b^.EndAddr then
+                      begin
+                        size:=p^.size+size;
+                        if prev = nil then
+                          blocks:=p^.next
+                        else
+                          prev^.next:=p^.next;
+                        concatenated:=true;
+                        break;
+                      end;
+                    
+                    prev := p;
+                    p := p^.next;
+                  end;
+
+                if not concatenated then
+                  begin
+                    p := Blocks;
+                    prev := nil;
+
+                    while assigned(p) and (p^.Size < size) do
+                      begin
+                        prev := p;
+                        p := p^.Next;
+                      end;
+
+                    if assigned(prev) then
+                      begin
+                        b^.Next := p;
+                        prev^.Next := b;
+                      end
+                    else
+                      Blocks := b;
+                  end;
+              end;
+          end;
+      end;
+
+    function SysFreeMem(Addr: Pointer): ptruint;
+      var
+        sz: ptruint;
+      begin
+        sz := Align(FindSize(addr)+SizeOf(ptruint), sizeof(pointer));
+
+        InternalFreeMem(@pptruint(addr)[-1], sz);
+        
+        result := sz;
+      end;
+
+    function SysFreeMemSize(Addr: Pointer; Size: Ptruint): ptruint;
+      begin
+        result := SysFreeMem(addr);
+      end;
+
+    function SysMemSize(p: pointer): ptruint;
+      begin
+        result := findsize(p);
+      end;
+
+    function SysAllocMem(size: ptruint): pointer;
+      begin
+        result := SysGetMem(size);
+        if result<>nil then
+          FillChar(result^,SysMemSize(result),0);
+      end;
+
+    function SysReAllocMem(var p: pointer; size: ptruint):pointer;
+      var
+        sz: ptruint;
+      begin
+        result := AllocMem(size);
+        if result <> nil then
+          begin
+            if p <> nil then
+              begin
+                sz := FindSize(p);
+                if sz > size then
+                  sz := size;
+                move(pbyte(p)^, pbyte(result)^, sz);
+              end;
+          end;
+        SysFreeMem(p);
+        p := result;
+      end;
+
+    procedure RegisterHeapBlock(AAddress: pointer; ASize: ptruint);
+      begin
+        FreeMem(AAddress, ASize);
+      end;
+
+    const
+      MyMemoryManager: TMemoryManager = (
+        NeedLock: false;  // Obsolete
+        GetMem: @SysGetMem;
+        FreeMem: @SysFreeMem;
+        FreeMemSize: @SysFreeMemSize;
+        AllocMem: @SysAllocMem;
+        ReAllocMem: @SysReAllocMem;
+        MemSize: @SysMemSize;
+        InitThread: nil;
+        DoneThread: nil;
+        RelocateHeap: nil;
+        GetHeapStatus: nil;
+        GetFPCHeapStatus: nil;
+      );
 
 
 
 
 initialization
 initialization
   SetMemoryManager(MyMemoryManager);
   SetMemoryManager(MyMemoryManager);
-  InitHeap;
 finalization
 finalization
-  FinalizeHeap;
+  //FinalizeHeap;
 end.
 end.
 
 

+ 1 - 1
rtl/embedded/system.pp

@@ -67,7 +67,7 @@ const
   CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
   CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
 
 
   sLineBreak = LineEnding;
   sLineBreak = LineEnding;
-  DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
+  DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsCrLF;
 {$endif FPC_HAS_FEATURE_TEXTIO}
 {$endif FPC_HAS_FEATURE_TEXTIO}
 
 
 {$ifdef FPC_HAS_FEATURE_COMMANDARGS}
 {$ifdef FPC_HAS_FEATURE_COMMANDARGS}