cortexm4f_start.inc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var
  2. _stack_top: record end; external name '_stack_top';
  3. _data: record end; external name '_data';
  4. _edata: record end; external name '_edata';
  5. _text_start: record end; external name '_text_start';
  6. _etext: record end; external name '_etext';
  7. _bss_start: record end; external name '_bss_start';
  8. _bss_end: record end; external name '_bss_end';
  9. procedure Pascalmain; external name 'PASCALMAIN';
  10. procedure HaltProc; assembler; nostackframe; public name'_haltproc';
  11. asm
  12. .Lloop:
  13. b .Lloop
  14. end;
  15. procedure Startup; assembler; nostackframe; [public, alias: '_START'];
  16. asm
  17. ldr r1,.L_etext
  18. ldr r2,.L_data
  19. ldr r3,.L_edata
  20. .Lcopyloop:
  21. cmp r2,r3
  22. ittt ls
  23. ldrls r0,[r1],#4
  24. strls r0,[r2],#4
  25. bls .Lcopyloop
  26. // clear onboard ram
  27. ldr r1,.L_bss_start
  28. ldr r2,.L_bss_end
  29. mov r0,#0
  30. .Lzeroloop:
  31. cmp r1,r2
  32. itt ls
  33. strls r0,[r1],#4
  34. bls .Lzeroloop
  35. {$ifdef REMAP_VECTTAB}
  36. ldr r0, .Lvtor
  37. ldr r1, .Ltext_start
  38. str r1, [r0]
  39. {$endif REMAP_VECTTAB}
  40. {$if defined(FPUARM_HAS_VFP_EXTENSION)}
  41. ldr r0, .Lcpacr
  42. ldr r1, [r0]
  43. orr r1, r1, #0xf00000
  44. str r1, [r0]
  45. dsb
  46. isb
  47. {$endif defined(FPUARM_HAS_VFP_EXTENSION)}
  48. bl PASCALMAIN
  49. b HaltProc
  50. .L_bss_start:
  51. .long _bss_start
  52. .L_bss_end:
  53. .long _bss_end
  54. .L_etext:
  55. .long _etext
  56. .L_data:
  57. .long _data
  58. .L_edata:
  59. .long _edata
  60. {$if defined(FPUARM_HAS_VFP_EXTENSION)}
  61. .Lcpacr:
  62. .long 0xE000ED88
  63. {$endif defined(FPUARM_HAS_VFP_EXTENSION)}
  64. {$ifdef REMAP_VECTTAB}
  65. .Lvtor:
  66. .long 0xE000ED08
  67. .Ltext_start:
  68. .long _text_start
  69. {$endif REMAP_VECTTAB}
  70. end;