mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 21:49:09 +02:00
* entry code fixed
git-svn-id: trunk@12615 -
This commit is contained in:
parent
5f9b82d38b
commit
40b86f9fa8
@ -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';
|
procedure PASCALMAIN; external name 'PASCALMAIN';
|
||||||
|
|
||||||
begin
|
procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
|
||||||
asm
|
asm
|
||||||
// code derived from phillips appnote 10254
|
.Lhalt:
|
||||||
.init
|
b .Lhalt
|
||||||
ldr pc, .Lstart
|
end;
|
||||||
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:
|
procedure _FPC_start; assembler; nostackframe;
|
||||||
(*
|
label
|
||||||
Set SP for Supervisor mode. Depending upon
|
_start;
|
||||||
the stack the application needs this value
|
asm
|
||||||
needs to be set.
|
// code derived from phillips appnote 10254
|
||||||
stack is already set by bootloader
|
.init
|
||||||
but if this point is entered by any
|
.align 16
|
||||||
other means than reset, the stack pointer
|
.globl _start
|
||||||
needs to be set explicity
|
b _start
|
||||||
*)
|
ldr pc, .LUndefined_Addr
|
||||||
// LDR SP,=0x40001000
|
ldr pc, .LSWI_Addr
|
||||||
|
ldr pc, .LPrefetch_Addr
|
||||||
|
ldr pc, .LAbort_Addr
|
||||||
|
|
||||||
(*
|
// signature
|
||||||
Setting up SP for IRQ and FIQ mode.
|
nop
|
||||||
Change mode before setting each one
|
ldr pc, [pc, #-0xFF0] // load irq vector from vic
|
||||||
move back again to Supervisor mode
|
ldr pc, .LFIQ_Addr
|
||||||
Each interrupt has its own link
|
.LUndefined_Addr:
|
||||||
register, stack pointer and program
|
ldr r0,.L1
|
||||||
counter The stack pointers must be
|
ldr pc,[r0]
|
||||||
initialized for interrupts to be
|
.LSWI_Addr:
|
||||||
used later.
|
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:
|
||||||
setup for fiq and irq interrupt stacks to run
|
(*
|
||||||
below current stack by 1000.
|
Set SP for Supervisor mode. Depending upon
|
||||||
*)
|
the stack the application needs this value
|
||||||
mov r0, sp // copy current stack pointer
|
needs to be set.
|
||||||
sub r0, r0, #1000 // make irq stack pointer
|
stack is already set by bootloader
|
||||||
sub r1, r0, #1000 // make fiq stack pointer
|
but if this point is entered by any
|
||||||
msr cpsr_c, #0x12 // switch to irq mode
|
other means than reset, the stack pointer
|
||||||
mov sp, r0 // set irq stack pointer
|
needs to be set explicity
|
||||||
msr cpsr_c, #0x11 // fiq mode
|
*)
|
||||||
mov sp, r1 // set fiq stack pointer
|
// LDR SP,=0x40001000
|
||||||
msr cpsr_c, #0x13 // supervisor mode F,I enabled
|
|
||||||
|
|
||||||
bl PASCALMAIN
|
(*
|
||||||
.text
|
Setting up SP for IRQ and FIQ mode.
|
||||||
end;
|
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.
|
||||||
|
Loading…
Reference in New Issue
Block a user