avr.inc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by the Free Pascal development team.
  4. Processor dependent implementation for the system unit for
  5. AVR
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$asmmode gas}
  13. const
  14. {$i cpuinnr.inc}
  15. { Reads SREG and then disables interrupts, returns contents of SREG }
  16. function avr_save: byte;[INTERNPROC: in_avr_save];
  17. { Restores SREG }
  18. procedure avr_restore(old_sreg: byte); [INTERNPROC: in_avr_restore];
  19. procedure fpc_cpuinit;{$ifdef SYSTEMINLINE}inline;{$endif}
  20. begin
  21. end;
  22. {$define FPC_SYSTEM_HAS_MOVE}
  23. procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];
  24. var
  25. pdest,psrc,pend : pbyte;
  26. begin
  27. if (@dest=@source) or (count<=0) then
  28. exit;
  29. if (@dest<@source) or (@source+count<@dest) then
  30. begin
  31. { Forward Move }
  32. psrc:=@source;
  33. pdest:=@dest;
  34. pend:=psrc+count;
  35. while psrc<pend do
  36. begin
  37. pdest^:=psrc^;
  38. inc(pdest);
  39. inc(psrc);
  40. end;
  41. end
  42. else
  43. begin
  44. { Backward Move }
  45. psrc:=@source+count;
  46. pdest:=@dest+count;
  47. while psrc>@source do
  48. begin
  49. dec(pdest);
  50. dec(psrc);
  51. pdest^:=psrc^;
  52. end;
  53. end;
  54. end;
  55. {$define FPC_SYSTEM_HAS_FILLCHAR}
  56. Procedure FillChar(var x;count:SizeInt;value:byte);
  57. var
  58. pdest,pend : pbyte;
  59. v : ptruint;
  60. begin
  61. if count <= 0 then
  62. exit;
  63. pdest:=@x;
  64. pend:=pdest+count;
  65. while pdest<pend do
  66. begin
  67. pdest^:=value;
  68. inc(pdest);
  69. end;
  70. end;
  71. {$IFNDEF INTERNAL_BACKTRACE}
  72. {$define FPC_SYSTEM_HAS_GET_FRAME}
  73. function get_frame:pointer;assembler;nostackframe;
  74. asm
  75. end;
  76. {$ENDIF not INTERNAL_BACKTRACE}
  77. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  78. function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler;nostackframe;
  79. asm
  80. end;
  81. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  82. function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;nostackframe;
  83. asm
  84. end;
  85. {$define FPC_SYSTEM_HAS_SPTR}
  86. Function Sptr : pointer;assembler;nostackframe;
  87. asm
  88. end;
  89. function InterLockedDecrement (var Target: longint) : longint;
  90. var
  91. temp_sreg : byte;
  92. begin
  93. { block interrupts }
  94. temp_sreg:=avr_save();
  95. Result:=Target-1;
  96. Target:=Result;
  97. { release interrupts }
  98. avr_restore(temp_sreg);
  99. end;
  100. function InterLockedIncrement (var Target: longint) : longint;
  101. var
  102. temp_sreg : byte;
  103. begin
  104. { block interrupts }
  105. temp_sreg:=avr_save();
  106. Result:=Target+1;
  107. Target:=Result;
  108. { release interrupts }
  109. avr_restore(temp_sreg);
  110. end;
  111. function InterLockedExchange (var Target: longint;Source : longint) : longint;
  112. var
  113. temp_sreg : byte;
  114. begin
  115. { block interrupts }
  116. temp_sreg:=avr_save();
  117. Result:=Target;
  118. Target:=Source;
  119. { release interrupts }
  120. avr_restore(temp_sreg);
  121. end;
  122. function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
  123. var
  124. temp_sreg : byte;
  125. begin
  126. { block interrupts }
  127. temp_sreg:=avr_save();
  128. Result:=Target;
  129. if Result=Comperand then
  130. Target:=NewValue;
  131. { release interrupts }
  132. avr_restore(temp_sreg);
  133. end;
  134. function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
  135. var
  136. temp_sreg : byte;
  137. begin
  138. { block interrupts }
  139. temp_sreg:=avr_save();
  140. Result:=Target;
  141. Target:=Result+Source;
  142. { release interrupts }
  143. avr_restore(temp_sreg);
  144. end;
  145. function InterLockedDecrement (var Target: smallint) : smallint;
  146. var
  147. temp_sreg : byte;
  148. begin
  149. { block interrupts }
  150. temp_sreg:=avr_save();
  151. Result:=Target-1;
  152. Target:=Result;
  153. { release interrupts }
  154. avr_restore(temp_sreg);
  155. end;
  156. function InterLockedIncrement (var Target: smallint) : smallint;
  157. var
  158. temp_sreg : byte;
  159. begin
  160. { block interrupts }
  161. temp_sreg:=avr_save();
  162. Result:=Target+1;
  163. Target:=Result;
  164. { release interrupts }
  165. avr_restore(temp_sreg);
  166. end;
  167. function InterLockedExchange (var Target: smallint;Source : smallint) : smallint;
  168. var
  169. temp_sreg : byte;
  170. begin
  171. { block interrupts }
  172. temp_sreg:=avr_save();
  173. Result:=Target;
  174. Target:=Source;
  175. { release interrupts }
  176. avr_restore(temp_sreg);
  177. end;
  178. function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint;
  179. var
  180. temp_sreg : byte;
  181. begin
  182. { block interrupts }
  183. temp_sreg:=avr_save();
  184. Result:=Target;
  185. if Result=Comperand then
  186. Target:=NewValue;
  187. { release interrupts }
  188. avr_restore(temp_sreg);
  189. end;
  190. function InterLockedExchangeAdd (var Target: smallint;Source : smallint) : smallint;
  191. var
  192. temp_sreg : byte;
  193. begin
  194. { block interrupts }
  195. temp_sreg:=avr_save();
  196. Result:=Target;
  197. Target:=Result+Source;
  198. { release interrupts }
  199. avr_restore(temp_sreg);
  200. end;