start.inc 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. _start:
  2. {$ifdef CPUAVR_16_REGS}
  3. clr r17
  4. {$else CPUAVR_16_REGS}
  5. clr r1
  6. {$endif CPUAVR_16_REGS}
  7. // load stack pointer
  8. ldi r30,lo8(_stack_top)
  9. out 0x3d,r30
  10. ldi r30,hi8(_stack_top)
  11. out 0x3e,r30
  12. // Initialize .data section
  13. ldi XL,lo8(_data)
  14. ldi XH,hi8(_data)
  15. ldi YH,hi8(_edata)
  16. ldi ZL,lo8(_etext)
  17. {$ifdef CPUAVR_16_REGS}
  18. ldi ZH,hi8(_etext)+(0x40) // program memory mapped to $4000 in data space
  19. {$else CPUAVR_16_REGS}
  20. ldi ZH,hi8(_etext)
  21. {$endif CPUAVR_16_REGS}
  22. rjmp .LCopyDataLoopEntry
  23. .LCopyDataLoop:
  24. {$ifdef CPUAVR_16_REGS}
  25. ld r16, Z+
  26. {$else CPUAVR_16_REGS}
  27. lpm r16, Z+
  28. {$endif CPUAVR_16_REGS}
  29. st X+, r16
  30. .LCopyDataLoopEntry:
  31. cpi XL, lo8(_edata)
  32. cpc XH, YH
  33. brne .LCopyDataLoop
  34. // Zero .bss section
  35. ldi XL,lo8(_bss_start)
  36. ldi XH,hi8(_bss_start)
  37. ldi YH,hi8(_bss_end)
  38. {$ifdef RELBRANCHES}
  39. rjmp .LZeroBssLoopEntry
  40. {$else RELBRANCHES}
  41. jmp .LZeroBssLoopEntry
  42. {$endif RELBRANCHES}
  43. .LZeroBssLoop:
  44. {$ifdef CPUAVR_16_REGS}
  45. st X+, r17
  46. {$else CPUAVR_16_REGS}
  47. st X+, r1
  48. {$endif CPUAVR_16_REGS}
  49. .LZeroBssLoopEntry:
  50. cpi XL, lo8(_bss_end)
  51. cpc XH, YH
  52. brne .LZeroBssLoop
  53. {$ifdef RELBRANCHES}
  54. rjmp PASCALMAIN
  55. {$else RELBRANCHES}
  56. jmp PASCALMAIN
  57. {$endif RELBRANCHES}
  58. .text