2
0

avrcommon.inc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. uses
  2. intrinsics;
  3. var
  4. _data: record end; external name '__data_start';
  5. _edata: record end; external name '__data_end';
  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. _stack_top: record end; external name '_stack_top';
  10. __dtors_end: record end; external name '__dtors_end';
  11. procedure PASCALMAIN; external name 'PASCALMAIN';
  12. procedure _FPC_haltproc; public name '_haltproc';noreturn;
  13. begin
  14. avr_cli;
  15. while true do
  16. ;
  17. end;
  18. procedure Default_IRQ_handler; public name '_Default_IRQ_handler';noreturn;
  19. begin
  20. while true do
  21. ;
  22. end;
  23. procedure _FPC_init_zeroreg_SP; public name '_init_zeroreg_SP'; section '.init2';assembler;nostackframe;noreturn;
  24. asm
  25. {$ifdef CPUAVR_16_REGS}
  26. clr r17
  27. {$else CPUAVR_16_REGS}
  28. clr r1
  29. {$endif CPUAVR_16_REGS}
  30. // AVR1 has a hardware stack, no configuration possible
  31. {$ifndef CPUAVR1}
  32. // load stack pointer
  33. ldi r30,lo8(_stack_top)
  34. out 0x3d,r30
  35. {$if declared(SPH) or declared(CPU)}
  36. ldi r30,hi8(_stack_top)
  37. out 0x3e,r30
  38. {$endif declared}
  39. {$endif CPUAVR1}
  40. end;
  41. {$ifndef CPUAVR1}
  42. procedure _FPC_copy_data; section '.init4';assembler;nostackframe;noreturn;
  43. asm
  44. // Initialize .data section
  45. ldi XL,lo8(_data)
  46. ldi XH,hi8(_data)
  47. ldi YH,hi8(_edata)
  48. ldi ZL,lo8(_etext)
  49. {$ifdef CPUAVR_16_REGS}
  50. ldi ZH,hi8(_etext)+(0x40) // program memory mapped to $4000 in data space
  51. {$else CPUAVR_16_REGS}
  52. ldi ZH,hi8(_etext)
  53. {$endif CPUAVR_16_REGS}
  54. rjmp .LCopyDataLoopEntry
  55. .LCopyDataLoop:
  56. {$ifdef CPUAVR_16_REGS}
  57. ld r16, Z+
  58. {$else CPUAVR_16_REGS}
  59. lpm r16, Z+
  60. {$endif CPUAVR_16_REGS}
  61. st X+, r16
  62. .LCopyDataLoopEntry:
  63. cpi XL, lo8(_edata)
  64. cpc XH, YH
  65. brne .LCopyDataLoop
  66. // Zero .bss section
  67. ldi XL,lo8(_bss_start)
  68. ldi XH,hi8(_bss_start)
  69. ldi YH,hi8(_bss_end)
  70. {$ifdef RELBRANCHES}
  71. rjmp .LZeroBssLoopEntry
  72. {$else RELBRANCHES}
  73. jmp .LZeroBssLoopEntry
  74. {$endif RELBRANCHES}
  75. .LZeroBssLoop:
  76. {$ifdef CPUAVR_16_REGS}
  77. st X+, r17
  78. {$else CPUAVR_16_REGS}
  79. st X+, r1
  80. {$endif CPUAVR_16_REGS}
  81. .LZeroBssLoopEntry:
  82. cpi XL, lo8(_bss_end)
  83. cpc XH, YH
  84. brne .LZeroBssLoop
  85. end;
  86. {$endif CPUAVR1}
  87. procedure _FPC_jmp_main; section '.init9';assembler;nostackframe;noreturn;
  88. asm
  89. {$ifdef RELBRANCHES}
  90. rjmp PASCALMAIN
  91. {$else RELBRANCHES}
  92. jmp PASCALMAIN
  93. {$endif RELBRANCHES}
  94. end;