z80.inc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2017 by the Free Pascal development team.
  4. Processor dependent implementation for the system unit for
  5. Z80
  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. var
  13. z80_save_hl: Word; public name 'FPC_Z80_SAVE_HL';
  14. {$define FPC_SYSTEM_HAS_FPC_CPUINIT}
  15. procedure fpc_cpuinit;{$ifdef SYSTEMINLINE}inline;{$endif}
  16. begin
  17. end;
  18. {$define FPC_SYSTEM_HAS_MOVE}
  19. procedure Move(const source;var dest;count:SizeInt);assembler;[public, alias: 'FPC_MOVE'];
  20. label
  21. skip, forward_move;
  22. asm
  23. ld c, (count)
  24. ld b, (count+1)
  25. bit 7, b
  26. jp NZ, skip
  27. ld a, b
  28. or a, c
  29. jp Z, skip
  30. ld l, (source)
  31. ld h, (source+1)
  32. ld e, (dest)
  33. ld d, (dest+1)
  34. ld a, d
  35. cp a, h
  36. jp C, forward_move
  37. ld a, e
  38. cp a, l
  39. jp C, forward_move
  40. { backward move }
  41. add hl, bc
  42. dec hl
  43. ex de, hl
  44. add hl, bc
  45. dec hl
  46. ex de, hl
  47. lddr
  48. jp skip
  49. forward_move:
  50. ldir
  51. skip:
  52. end;
  53. {$define FPC_SYSTEM_HAS_FILLCHAR}
  54. Procedure FillChar(var x;count:SizeInt;value:byte);assembler;
  55. label
  56. skip, loop;
  57. asm
  58. ld c, (count)
  59. ld b, (count+1)
  60. bit 7, b
  61. jp NZ, skip
  62. ld a, b
  63. or a, c
  64. jp Z, skip
  65. ld e, (value)
  66. ld a, 0
  67. ld l, (x)
  68. ld h, (x+1)
  69. loop:
  70. ld (hl), e
  71. inc hl
  72. dec bc
  73. cp a, c
  74. jp NZ, loop
  75. cp a, b
  76. jp NZ, loop
  77. skip:
  78. end;
  79. {$IFNDEF INTERNAL_BACKTRACE}
  80. {$define FPC_SYSTEM_HAS_GET_FRAME}
  81. function get_frame:pointer;assembler;nostackframe;
  82. asm
  83. push ix
  84. pop hl
  85. end;
  86. {$ENDIF not INTERNAL_BACKTRACE}
  87. {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
  88. function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler;
  89. label
  90. framebp_null;
  91. asm
  92. ld l, (framebp)
  93. ld h, (framebp+1)
  94. ld a, l
  95. or a, h
  96. jp Z, framebp_null
  97. inc hl
  98. inc hl
  99. ld e, (hl)
  100. inc hl
  101. ld d, (hl)
  102. ex de, hl
  103. framebp_null:
  104. end;
  105. {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
  106. function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;
  107. label
  108. framebp_null;
  109. asm
  110. ld l, (framebp)
  111. ld h, (framebp+1)
  112. ld a, l
  113. or a, h
  114. jp Z, framebp_null
  115. ld e, (hl)
  116. inc hl
  117. ld d, (hl)
  118. ex de, hl
  119. framebp_null:
  120. end;
  121. {$define FPC_SYSTEM_HAS_SPTR}
  122. Function Sptr : pointer;assembler;nostackframe;
  123. asm
  124. ld hl, 0
  125. add hl, sp
  126. end;
  127. function InterLockedDecrement (var Target: longint) : longint;
  128. var
  129. temp_sreg : byte;
  130. begin
  131. { block interrupts }
  132. asm
  133. di
  134. end;
  135. dec(Target);
  136. Result:=Target;
  137. { release interrupts }
  138. asm
  139. ei
  140. end;
  141. end;
  142. function InterLockedIncrement (var Target: longint) : longint;
  143. var
  144. temp_sreg : byte;
  145. begin
  146. { block interrupts }
  147. asm
  148. di
  149. end;
  150. inc(Target);
  151. Result:=Target;
  152. { release interrupts }
  153. asm
  154. ei
  155. end;
  156. end;
  157. function InterLockedExchange (var Target: longint;Source : longint) : longint;
  158. var
  159. temp_sreg : byte;
  160. begin
  161. { block interrupts }
  162. asm
  163. di
  164. end;
  165. Result:=Target;
  166. Target:=Source;
  167. { release interrupts }
  168. asm
  169. ei
  170. end;
  171. end;
  172. function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
  173. var
  174. temp_sreg : byte;
  175. begin
  176. { block interrupts }
  177. asm
  178. di
  179. end;
  180. Result:=Target;
  181. if Target=Comperand then
  182. Target:=NewValue;
  183. { release interrupts }
  184. asm
  185. ei
  186. end;
  187. end;
  188. function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
  189. var
  190. temp_sreg : byte;
  191. begin
  192. { block interrupts }
  193. asm
  194. di
  195. end;
  196. Result:=Target;
  197. inc(Target,Source);
  198. { release interrupts }
  199. asm
  200. ei
  201. end;
  202. end;
  203. function InterLockedDecrement (var Target: smallint) : smallint;
  204. var
  205. temp_sreg : byte;
  206. begin
  207. { block interrupts }
  208. asm
  209. di
  210. end;
  211. dec(Target);
  212. Result:=Target;
  213. { release interrupts }
  214. asm
  215. ei
  216. end;
  217. end;
  218. function InterLockedIncrement (var Target: smallint) : smallint;
  219. var
  220. temp_sreg : byte;
  221. begin
  222. { block interrupts }
  223. asm
  224. di
  225. end;
  226. inc(Target);
  227. Result:=Target;
  228. { release interrupts }
  229. asm
  230. ei
  231. end;
  232. end;
  233. function InterLockedExchange (var Target: smallint;Source : smallint) : smallint;
  234. var
  235. temp_sreg : byte;
  236. begin
  237. { block interrupts }
  238. asm
  239. di
  240. end;
  241. Result:=Target;
  242. Target:=Source;
  243. { release interrupts }
  244. asm
  245. ei
  246. end;
  247. end;
  248. function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint;
  249. var
  250. temp_sreg : byte;
  251. begin
  252. { block interrupts }
  253. asm
  254. di
  255. end;
  256. Result:=Target;
  257. if Target=Comperand then
  258. Target:=NewValue;
  259. { release interrupts }
  260. asm
  261. ei
  262. end;
  263. end;
  264. function InterLockedExchangeAdd (var Target: smallint;Source : smallint) : smallint;
  265. var
  266. temp_sreg : byte;
  267. begin
  268. { block interrupts }
  269. asm
  270. di
  271. end;
  272. Result:=Target;
  273. inc(Target,Source);
  274. { release interrupts }
  275. asm
  276. ei
  277. end;
  278. end;