riscv32_start.inc 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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; noreturn; public name'_haltproc';
  11. begin
  12. while true do;
  13. end;
  14. procedure Startup;
  15. var
  16. pdest, psrc, pend: PLongWord;
  17. begin
  18. pdest:=@_data;
  19. psrc:=@_etext;
  20. pend:=@_bss_start;
  21. while pdest<pend do
  22. begin
  23. pdest^:=psrc^;
  24. inc(pdest);
  25. inc(psrc);
  26. end;
  27. pend:=@_bss_end;
  28. while pdest<pend do
  29. begin
  30. pdest^:=0;
  31. inc(pdest);
  32. end;
  33. PASCALMAIN;
  34. HaltProc;
  35. end;
  36. procedure LowlevelStartup; assembler; nostackframe; [public, alias: '_START'];
  37. asm
  38. { Initialize global Pointer }
  39. .option push
  40. .option norelax
  41. lui gp, %hi(_bss_start+0x800)
  42. addi gp, gp, %lo(_bss_start+0x800)
  43. .option pop
  44. { Initialize Stack Pointer }
  45. .L1:
  46. auipc sp, %pcrel_hi(_stack_top)
  47. addi sp, sp, %pcrel_lo(.L1)
  48. { Initialise FP to zero }
  49. addi fp, x0, 0
  50. jal x0, Startup
  51. // { Copy Initialized vars}
  52. // lui x10,%hi(_data)
  53. // addi x10,x10,%lo(_data)
  54. // lui x11,%hi(_edata)
  55. // addi x11,x11,%lo(_edata)
  56. // sltu x12,x10,x11
  57. // beq x12,x0,.L2
  58. // lui x12,%hi(_etext)
  59. // addi x12,x12,%lo(_etext)
  60. // addi x10,x10,-1
  61. // addi x12,x12,-1
  62. // .L1:
  63. // addi x10,x10,1
  64. // addi x12,x12,1
  65. // lb x13,0(x10)
  66. // sb x13,0(x12)
  67. // bne x10,x11,.L1
  68. // .L2:
  69. // { Initialize Memory}
  70. // lui x10,%hi(_bss_start)
  71. // addi x10,x10,%lo(_bss_start)
  72. // lui x11,%hi(_bss_end)
  73. // addi x11,x11,%lo(_bss_end)
  74. // sltu x12,x10,x11
  75. // beq x12,x0,.L4
  76. // addi x10,x10,-1
  77. // .L3:
  78. // addi x10,x10,1
  79. // sb x0,0(x10)
  80. // bne x10,x11,.L3
  81. // .L4:
  82. // jal x0,PASCALMAIN
  83. // jal x0,HaltProc
  84. // .L_bss_start:
  85. // .long _bss_start
  86. // .L_bss_end:
  87. // .long _bss_end
  88. // .L_etext:
  89. // .long _etext
  90. // .L_data:
  91. // .long _data
  92. // .L_edata:
  93. // .long _edata
  94. // .text
  95. end;