Browse Source

* entry code fixed

git-svn-id: trunk@12615 -
florian 16 years ago
parent
commit
40b86f9fa8
1 changed files with 97 additions and 81 deletions
  1. 97 81
      rtl/embedded/arm/lpc21x4.pp

+ 97 - 81
rtl/embedded/arm/lpc21x4.pp

@@ -1,3 +1,4 @@
+{$goto on}
 {******************************************************************************
 {******************************************************************************
 lpc2114.h - Register defs for Philips LPC2114, LPC2124
 lpc2114.h - Register defs for Philips LPC2114, LPC2124
 
 
@@ -17,6 +18,7 @@ Created by Sten Larsson (sten_larsson at yahoo com)
 
 
 Free Pascal conversion by the Free Pascal development team
 Free Pascal conversion by the Free Pascal development team
 ******************************************************************************}
 ******************************************************************************}
+
 unit lpc21x4;
 unit lpc21x4;
 
 
   interface
   interface
@@ -414,86 +416,100 @@ unit lpc21x4;
       end;
       end;
 
 
 
 
-procedure PASCALMAIN; external name 'PASCALMAIN';
-
-begin
-  asm
-    // code derived from phillips appnote 10254
-    .init
-    ldr pc, .Lstart
-    ldr pc, .LUndefined_Addr
-    ldr pc, .LSWI_Addr
-    ldr pc, .LPrefetch_Addr
-    ldr pc, .LAbort_Addr
-
-    // signature
-    nop
-    ldr pc, [PC, #-0xFF0] // load irq vector from vic
-    ldr pc, .LFIQ_Addr
-.LUndefined_Addr:
-    ldr r0,.L1
-    ldr pc,[r0]
-.LSWI_Addr:
-    ldr r0,.L2
-    ldr pc,[r0]
-.LPrefetch_Addr:
-    ldr r0,.L3
-    ldr pc,[r0]
-.LAbort_Addr:
-    ldr r0,.L4
-    ldr pc,[r0]
-.LFIQ_Addr:
-    ldr r0,.L5
-    ldr pc,[r0]
-.L1:
-    .word     Undefined_Handler
-.L2:
-    .word     SWI_Handler
-.L3:
-    .word     Prefetch_Handler
-.L4:
-    .word     Abort_Handler
-.L5:
-    .word     FIQ_Handler
-
-.Lstart:
-    (*
-      Set SP for Supervisor mode. Depending upon
-      the stack the application needs this value
-      needs to be set.
-      stack is already set by bootloader
-      but if this point is entered by any
-      other means than reset, the stack pointer
-      needs to be set explicity
-    *)
-    // LDR SP,=0x40001000
-
-    (*
-      Setting up SP for IRQ and FIQ mode.
-      Change mode before setting each one
-      move back again to Supervisor mode
-      Each interrupt has its own link
-      register, stack pointer and program
-      counter The stack pointers must be
-      initialized for interrupts to be
-      used later.
-    *)
-
-    (*
-      setup for fiq and irq interrupt stacks to run
-      below current stack by 1000.
-    *)
-    mov r0, sp         // copy current stack pointer
-    sub r0, r0, #1000  // make irq stack pointer
-    sub r1, r0, #1000  // make fiq stack pointer
-    msr cpsr_c, #0x12  // switch to irq mode
-    mov sp, r0         // set irq stack pointer
-    msr cpsr_c, #0x11  // fiq mode
-    mov sp, r1         // set fiq stack pointer
-    msr cpsr_c, #0x13  // supervisor mode F,I enabled
-
-    bl PASCALMAIN
-    .text
-  end;
+    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
+        // code derived from phillips appnote 10254
+        .init
+        .align 16
+        .globl _start
+        b   _start
+        ldr pc, .LUndefined_Addr
+        ldr pc, .LSWI_Addr
+        ldr pc, .LPrefetch_Addr
+        ldr pc, .LAbort_Addr
+
+        // signature
+        nop
+        ldr pc, [pc, #-0xFF0] // load irq vector from vic
+        ldr pc, .LFIQ_Addr
+    .LUndefined_Addr:
+        ldr r0,.L1
+        ldr pc,[r0]
+    .LSWI_Addr:
+        ldr r0,.L2
+        ldr pc,[r0]
+    .LPrefetch_Addr:
+        ldr r0,.L3
+        ldr pc,[r0]
+    .LAbort_Addr:
+        ldr r0,.L4
+        ldr pc,[r0]
+    .LFIQ_Addr:
+        ldr r0,.L5
+        ldr pc,[r0]
+    .L1:
+        .long     Undefined_Handler
+    .L2:
+        .long     SWI_Handler
+    .L3:
+        .long     Prefetch_Handler
+    .L4:
+        .long     Abort_Handler
+    .L5:
+        .long     FIQ_Handler
+
+    _start:
+        (*
+          Set SP for Supervisor mode. Depending upon
+          the stack the application needs this value
+          needs to be set.
+          stack is already set by bootloader
+          but if this point is entered by any
+          other means than reset, the stack pointer
+          needs to be set explicity
+        *)
+        // LDR SP,=0x40001000
+
+        (*
+          Setting up SP for IRQ and FIQ mode.
+          Change mode before setting each one
+          move back again to Supervisor mode
+          Each interrupt has its own link
+          register, stack pointer and program
+          counter The stack pointers must be
+          initialized for interrupts to be
+          used later.
+        *)
+
+        (*
+          setup for fiq and irq interrupt stacks to run
+          below current stack by 1000.
+        *)
+        mov r0, sp         // copy current stack pointer
+        sub r0, r0, #1000  // make irq stack pointer
+        sub r1, r0, #1000  // make fiq stack pointer
+        msr cpsr_c, #0x12  // switch to irq mode
+        mov sp, r0         // set irq stack pointer
+        msr cpsr_c, #0x11  // fiq mode
+        mov sp, r1         // set fiq stack pointer
+        msr cpsr_c, #0x13  // supervisor mode F,I enabled
+
+        bl PASCALMAIN
+        bl _FPC_haltproc
+.LVBPDIV:
+        .long 0xE01FC100
+        .text
+      end;
 
 
 end.
 end.