avr.inc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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. procedure fpc_cpuinit;{$ifdef SYSTEMINLINE}inline;{$endif}
  14. begin
  15. end;
  16. {$define FPC_SYSTEM_HAS_MOVE}
  17. procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];
  18. var
  19. pdest,psrc,pend : pbyte;
  20. begin
  21. if (@dest=@source) or (count<=0) then
  22. exit;
  23. if (@dest<@source) or (@source+count<@dest) then
  24. begin
  25. { Forward Move }
  26. psrc:=@source;
  27. pdest:=@dest;
  28. pend:=psrc+count;
  29. while psrc<pend do
  30. begin
  31. pdest^:=psrc^;
  32. inc(pdest);
  33. inc(psrc);
  34. end;
  35. end
  36. else
  37. begin
  38. { Backward Move }
  39. psrc:=@source+count;
  40. pdest:=@dest+count;
  41. while psrc>@source do
  42. begin
  43. dec(pdest);
  44. dec(psrc);
  45. pdest^:=psrc^;
  46. end;
  47. end;
  48. end;
  49. {$define FPC_SYSTEM_HAS_FILLCHAR}
  50. Procedure FillChar(var x;count:SizeInt;value:byte);
  51. var
  52. pdest,pend : pbyte;
  53. v : ptruint;
  54. begin
  55. if count <= 0 then
  56. exit;
  57. pdest:=@x;
  58. pend:=pdest+count;
  59. while pdest<pend do
  60. begin
  61. pdest^:=value;
  62. inc(pdest);
  63. end;
  64. end;
  65. {$IFNDEF INTERNAL_BACKTRACE}
  66. {$define FPC_SYSTEM_HAS_GET_FRAME}
  67. function get_frame:pointer;assembler;nostackframe;
  68. asm
  69. end;
  70. {$ENDIF not INTERNAL_BACKTRACE}
  71. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  72. function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler;
  73. asm
  74. end;
  75. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  76. function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;
  77. asm
  78. end;
  79. {$define FPC_SYSTEM_HAS_SPTR}
  80. Function Sptr : pointer;assembler;
  81. asm
  82. end;
  83. function InterLockedDecrement (var Target: longint) : longint;
  84. var
  85. temp_sreg : byte;
  86. begin
  87. { block interrupts }
  88. asm
  89. in r0,0x3f
  90. std temp_sreg,r0
  91. cli
  92. end;
  93. dec(Target);
  94. Result:=Target;
  95. { release interrupts }
  96. asm
  97. ldd r0,temp_sreg
  98. out 0x3f,r0
  99. end;
  100. end;
  101. function InterLockedIncrement (var Target: longint) : longint;
  102. var
  103. temp_sreg : byte;
  104. begin
  105. { block interrupts }
  106. asm
  107. in r0,0x3f
  108. std temp_sreg,r0
  109. cli
  110. end;
  111. inc(Target);
  112. Result:=Target;
  113. { release interrupts }
  114. asm
  115. ldd r0,temp_sreg
  116. out 0x3f,r0
  117. end;
  118. end;
  119. function InterLockedExchange (var Target: longint;Source : longint) : longint;
  120. var
  121. temp_sreg : byte;
  122. begin
  123. { block interrupts }
  124. asm
  125. in r0,0x3f
  126. std temp_sreg,r0
  127. cli
  128. end;
  129. Result:=Target;
  130. Target:=Source;
  131. { release interrupts }
  132. asm
  133. ldd r0,temp_sreg
  134. out 0x3f,r0
  135. end;
  136. end;
  137. function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
  138. var
  139. temp_sreg : byte;
  140. begin
  141. { block interrupts }
  142. asm
  143. in r0,0x3f
  144. std temp_sreg,r0
  145. cli
  146. end;
  147. Result:=Target;
  148. if Target=Comperand then
  149. Target:=NewValue;
  150. { release interrupts }
  151. asm
  152. ldd r0,temp_sreg
  153. out 0x3f,r0
  154. end;
  155. end;
  156. function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
  157. var
  158. temp_sreg : byte;
  159. begin
  160. { block interrupts }
  161. asm
  162. in r0,0x3f
  163. std temp_sreg,r0
  164. cli
  165. end;
  166. Result:=Target;
  167. inc(Target,Source);
  168. { release interrupts }
  169. asm
  170. ldd r0,temp_sreg
  171. out 0x3f,r0
  172. end;
  173. end;
  174. function InterLockedDecrement (var Target: smallint) : smallint;
  175. var
  176. temp_sreg : byte;
  177. begin
  178. { block interrupts }
  179. asm
  180. in r0,0x3f
  181. std temp_sreg,r0
  182. cli
  183. end;
  184. dec(Target);
  185. Result:=Target;
  186. { release interrupts }
  187. asm
  188. ldd r0,temp_sreg
  189. out 0x3f,r0
  190. end;
  191. end;
  192. function InterLockedIncrement (var Target: smallint) : smallint;
  193. var
  194. temp_sreg : byte;
  195. begin
  196. { block interrupts }
  197. asm
  198. in r0,0x3f
  199. std temp_sreg,r0
  200. cli
  201. end;
  202. inc(Target);
  203. Result:=Target;
  204. { release interrupts }
  205. asm
  206. ldd r0,temp_sreg
  207. out 0x3f,r0
  208. end;
  209. end;
  210. function InterLockedExchange (var Target: smallint;Source : smallint) : smallint;
  211. var
  212. temp_sreg : byte;
  213. begin
  214. { block interrupts }
  215. asm
  216. in r0,0x3f
  217. std temp_sreg,r0
  218. cli
  219. end;
  220. Result:=Target;
  221. Target:=Source;
  222. { release interrupts }
  223. asm
  224. ldd r0,temp_sreg
  225. out 0x3f,r0
  226. end;
  227. end;
  228. function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint;
  229. var
  230. temp_sreg : byte;
  231. begin
  232. { block interrupts }
  233. asm
  234. in r0,0x3f
  235. std temp_sreg,r0
  236. cli
  237. end;
  238. Result:=Target;
  239. if Target=Comperand then
  240. Target:=NewValue;
  241. { release interrupts }
  242. asm
  243. ldd r0,temp_sreg
  244. out 0x3f,r0
  245. end;
  246. end;
  247. function InterLockedExchangeAdd (var Target: smallint;Source : smallint) : smallint;
  248. var
  249. temp_sreg : byte;
  250. begin
  251. { block interrupts }
  252. asm
  253. in r0,0x3f
  254. std temp_sreg,r0
  255. cli
  256. end;
  257. Result:=Target;
  258. inc(Target,Source);
  259. { release interrupts }
  260. asm
  261. ldd r0,temp_sreg
  262. out 0x3f,r0
  263. end;
  264. end;