Mirror of CollapseOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
4.0KB

  1. ( Core words in z80. This requires a full Forth interpreter
  2. to run, but is also necessary for core.fs. This means that
  3. it needs to be compiled from a prior bootstrapped binary.
  4. This stage is tricky due to the fact that references in
  5. Forth are all absolute, except for prev word refs. This
  6. means that there are severe limitations to the kind of code
  7. you can put here.
  8. You shouldn't define any word with reference to other words.
  9. This means no regular definition. You can, however, execute
  10. any word from our high level Forth, as long as it doesn't
  11. spit word references.
  12. These restrictions are temporary, I'll figure something out
  13. so that we can end up fully bootstrap Forth from within
  14. itself.
  15. Oh, also: KEY and EMIT are not defined here. There're
  16. expected to be defined in platform-specific code.
  17. )
  18. ( a b c -- b c a )
  19. CODE ROT
  20. HL POPqq, ( C )
  21. DE POPqq, ( B )
  22. BC POPqq, ( A )
  23. chkPS,
  24. DE PUSHqq, ( B )
  25. HL PUSHqq, ( C )
  26. BC PUSHqq, ( A )
  27. ;CODE
  28. ( a b -- a b a b )
  29. CODE 2DUP
  30. HL POPqq, ( B )
  31. DE POPqq, ( A )
  32. chkPS,
  33. DE PUSHqq, ( A )
  34. HL PUSHqq, ( B )
  35. DE PUSHqq, ( A )
  36. HL PUSHqq, ( B )
  37. ;CODE
  38. ( a b c d -- a b c d a b )
  39. CODE 2OVER
  40. HL POPqq, ( D )
  41. DE POPqq, ( C )
  42. BC POPqq, ( B )
  43. IY POPqq, ( A )
  44. chkPS,
  45. IY PUSHqq, ( A )
  46. BC PUSHqq, ( B )
  47. DE PUSHqq, ( C )
  48. HL PUSHqq, ( D )
  49. IY PUSHqq, ( A )
  50. BC PUSHqq, ( B )
  51. ;CODE
  52. ( a b c d -- c d a b )
  53. CODE 2SWAP
  54. HL POPqq, ( D )
  55. DE POPqq, ( C )
  56. BC POPqq, ( B )
  57. IY POPqq, ( A )
  58. chkPS,
  59. DE PUSHqq, ( C )
  60. HL PUSHqq, ( D )
  61. IY PUSHqq, ( A )
  62. BC PUSHqq, ( B )
  63. ;CODE
  64. CODE AND
  65. HL POPqq,
  66. DE POPqq,
  67. chkPS,
  68. A E LDrr,
  69. L ANDr,
  70. L A LDrr,
  71. A D LDrr,
  72. H ANDr,
  73. H A LDrr,
  74. HL PUSHqq,
  75. ;CODE
  76. CODE OR
  77. HL POPqq,
  78. DE POPqq,
  79. chkPS,
  80. A E LDrr,
  81. L ORr,
  82. L A LDrr,
  83. A D LDrr,
  84. H ORr,
  85. H A LDrr,
  86. HL PUSHqq,
  87. ;CODE
  88. CODE XOR
  89. HL POPqq,
  90. DE POPqq,
  91. chkPS,
  92. A E LDrr,
  93. L XORr,
  94. L A LDrr,
  95. A D LDrr,
  96. H XORr,
  97. H A LDrr,
  98. HL PUSHqq,
  99. ;CODE
  100. CODE -
  101. DE POPqq,
  102. HL POPqq,
  103. chkPS,
  104. A ORr,
  105. DE SBCHLss,
  106. HL PUSHqq,
  107. ;CODE
  108. CODE *
  109. DE POPqq,
  110. BC POPqq,
  111. chkPS,
  112. ( DE * BC -> DE (high) and HL (low) )
  113. HL 0 LDddnn,
  114. A 0x10 LDrn,
  115. ( loop )
  116. HL ADDHLss,
  117. E RLr,
  118. D RLr,
  119. 6 JRNCe, ( noinc )
  120. BC ADDHLss,
  121. 3 JRNCe, ( noinc )
  122. DE INCss,
  123. ( noinc )
  124. A DECr,
  125. -12 JRNZe, ( loop )
  126. HL PUSHqq,
  127. ;CODE
  128. ( Borrowed from http://wikiti.brandonw.net/ )
  129. ( Divides AC by DE and places the quotient in AC and the
  130. remainder in HL )
  131. CODE /MOD
  132. DE POPqq,
  133. BC POPqq,
  134. chkPS,
  135. A B LDrr,
  136. B 16 LDrn,
  137. HL 0 LDddnn,
  138. ( loop )
  139. SCF,
  140. C RLr,
  141. RLA,
  142. HL ADCHLss,
  143. DE SBCHLss,
  144. 4 JRNCe, ( skip )
  145. DE ADDHLss,
  146. C DECr,
  147. ( skip )
  148. -12 DJNZe, ( loop )
  149. B A LDrr,
  150. HL PUSHqq,
  151. BC PUSHqq,
  152. ;CODE
  153. CODE C!
  154. HL POPqq,
  155. DE POPqq,
  156. chkPS,
  157. (HL) E LDrr,
  158. ;CODE
  159. CODE C@
  160. HL POPqq,
  161. chkPS,
  162. L (HL) LDrr,
  163. H 0 LDrn,
  164. HL PUSHqq,
  165. ;CODE
  166. CODE PC!
  167. BC POPqq,
  168. HL POPqq,
  169. chkPS,
  170. L OUT(C)r,
  171. ;CODE
  172. CODE PC@
  173. BC POPqq,
  174. chkPS,
  175. H 0 LDrn,
  176. L INr(C),
  177. HL PUSHqq,
  178. ;CODE
  179. CODE I
  180. L 0 IX+ LDrIXY,
  181. H 1 IX+ LDrIXY,
  182. HL PUSHqq,
  183. ;CODE
  184. CODE I'
  185. L 2 IX- LDrIXY,
  186. H 1 IX- LDrIXY,
  187. HL PUSHqq,
  188. ;CODE
  189. CODE J
  190. L 4 IX- LDrIXY,
  191. H 3 IX- LDrIXY,
  192. HL PUSHqq,
  193. ;CODE
  194. CODE >R
  195. HL POPqq,
  196. chkPS,
  197. ( JTBL+9 == pushRS )
  198. JTBL 9 + CALLnn,
  199. ;CODE
  200. CODE R>
  201. ( JTBL+12 == popRS )
  202. JTBL 12 + CALLnn,
  203. HL PUSHqq,
  204. ;CODE
  205. CODE IMMEDIATE
  206. CURRENT LDHL(nn),
  207. HL DECss,
  208. 7 (HL) SETbr,
  209. ;CODE
  210. CODE IMMED?
  211. HL POPqq,
  212. chkPS,
  213. HL DECss,
  214. DE 0 LDddnn,
  215. 7 (HL) BITbr,
  216. 3 JRZe, ( notset )
  217. DE INCss,
  218. ( notset )
  219. DE PUSHqq,
  220. ;CODE
  221. CODE BYE
  222. HALT,
  223. ;CODE
  224. CODE (resSP)
  225. ( INITIAL_SP == JTBL+28 )
  226. SP JTBL 28 + @ LDdd(nn),
  227. ;CODE