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.

368 lines
5.4KB

  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. Those limitations are the same as those
  8. described in icore.fs.
  9. Oh, also: KEY and EMIT are not defined here. There're
  10. expected to be defined in platform-specific code.
  11. This unit expects the same conf as boot.fs.
  12. )
  13. ( a b c -- b c a )
  14. CODE ROT
  15. HL POPqq, ( C )
  16. DE POPqq, ( B )
  17. BC POPqq, ( A )
  18. chkPS,
  19. DE PUSHqq, ( B )
  20. HL PUSHqq, ( C )
  21. BC PUSHqq, ( A )
  22. ;CODE
  23. ( a -- a a )
  24. CODE DUP
  25. HL POPqq, ( A )
  26. chkPS,
  27. HL PUSHqq, ( A )
  28. HL PUSHqq, ( A )
  29. ;CODE
  30. ( a -- )
  31. CODE DROP
  32. HL POPqq,
  33. ;CODE
  34. ( a b -- b a )
  35. CODE SWAP
  36. HL POPqq, ( B )
  37. DE POPqq, ( A )
  38. chkPS,
  39. HL PUSHqq, ( B )
  40. DE PUSHqq, ( A )
  41. ;CODE
  42. ( a b -- a b a )
  43. CODE OVER
  44. HL POPqq, ( B )
  45. DE POPqq, ( A )
  46. chkPS,
  47. DE PUSHqq, ( A )
  48. HL PUSHqq, ( B )
  49. DE PUSHqq, ( A )
  50. ;CODE
  51. ( a b -- a b a b )
  52. CODE 2DUP
  53. HL POPqq, ( B )
  54. DE POPqq, ( A )
  55. chkPS,
  56. DE PUSHqq, ( A )
  57. HL PUSHqq, ( B )
  58. DE PUSHqq, ( A )
  59. HL PUSHqq, ( B )
  60. ;CODE
  61. ( a b -- )
  62. CODE 2DROP
  63. HL POPqq,
  64. HL POPqq,
  65. ;CODE
  66. ( a b c d -- a b c d a b )
  67. CODE 2OVER
  68. HL POPqq, ( D )
  69. DE POPqq, ( C )
  70. BC POPqq, ( B )
  71. IY POPqq, ( A )
  72. chkPS,
  73. IY PUSHqq, ( A )
  74. BC PUSHqq, ( B )
  75. DE PUSHqq, ( C )
  76. HL PUSHqq, ( D )
  77. IY PUSHqq, ( A )
  78. BC PUSHqq, ( B )
  79. ;CODE
  80. ( a b c d -- c d a b )
  81. CODE 2SWAP
  82. HL POPqq, ( D )
  83. DE POPqq, ( C )
  84. BC POPqq, ( B )
  85. IY POPqq, ( A )
  86. chkPS,
  87. DE PUSHqq, ( C )
  88. HL PUSHqq, ( D )
  89. IY PUSHqq, ( A )
  90. BC PUSHqq, ( B )
  91. ;CODE
  92. CODE AND
  93. HL POPqq,
  94. DE POPqq,
  95. chkPS,
  96. A E LDrr,
  97. L ANDr,
  98. L A LDrr,
  99. A D LDrr,
  100. H ANDr,
  101. H A LDrr,
  102. HL PUSHqq,
  103. ;CODE
  104. CODE OR
  105. HL POPqq,
  106. DE POPqq,
  107. chkPS,
  108. A E LDrr,
  109. L ORr,
  110. L A LDrr,
  111. A D LDrr,
  112. H ORr,
  113. H A LDrr,
  114. HL PUSHqq,
  115. ;CODE
  116. CODE XOR
  117. HL POPqq,
  118. DE POPqq,
  119. chkPS,
  120. A E LDrr,
  121. L XORr,
  122. L A LDrr,
  123. A D LDrr,
  124. H XORr,
  125. H A LDrr,
  126. HL PUSHqq,
  127. ;CODE
  128. CODE NOT
  129. HL POPqq,
  130. chkPS,
  131. A L LDrr,
  132. H ORr,
  133. HL 0 LDddnn,
  134. JRNZ, L1 FWR ( skip )
  135. ( false, make 1 )
  136. HL INCss,
  137. L1 FSET ( skip )
  138. HL PUSHqq,
  139. ;CODE
  140. CODE +
  141. HL POPqq,
  142. DE POPqq,
  143. chkPS,
  144. DE ADDHLss,
  145. HL PUSHqq,
  146. ;CODE
  147. CODE -
  148. DE POPqq,
  149. HL POPqq,
  150. chkPS,
  151. A ORr,
  152. DE SBCHLss,
  153. HL PUSHqq,
  154. ;CODE
  155. CODE *
  156. DE POPqq,
  157. BC POPqq,
  158. chkPS,
  159. ( DE * BC -> DE (high) and HL (low) )
  160. HL 0 LDddnn,
  161. A 0x10 LDrn,
  162. ( loop )
  163. HL ADDHLss,
  164. E RLr,
  165. D RLr,
  166. JRNC, 4 A, ( noinc )
  167. BC ADDHLss,
  168. JRNC, 1 A, ( noinc )
  169. DE INCss,
  170. ( noinc )
  171. A DECr,
  172. JRNZ, -14 A, ( loop )
  173. HL PUSHqq,
  174. ;CODE
  175. ( Borrowed from http://wikiti.brandonw.net/ )
  176. ( Divides AC by DE and places the quotient in AC and the
  177. remainder in HL )
  178. CODE /MOD
  179. DE POPqq,
  180. BC POPqq,
  181. chkPS,
  182. A B LDrr,
  183. B 16 LDrn,
  184. HL 0 LDddnn,
  185. L1 BSET ( loop )
  186. SCF,
  187. C RLr,
  188. RLA,
  189. HL ADCHLss,
  190. DE SBCHLss,
  191. JRNC, L2 FWR ( skip )
  192. DE ADDHLss,
  193. C DECr,
  194. L2 FSET ( skip )
  195. DJNZ, L1 BWR ( loop )
  196. B A LDrr,
  197. HL PUSHqq,
  198. BC PUSHqq,
  199. ;CODE
  200. CODE !
  201. HL POPqq,
  202. DE POPqq,
  203. chkPS,
  204. (HL) E LDrr,
  205. HL INCss,
  206. (HL) D LDrr,
  207. ;CODE
  208. CODE @
  209. HL POPqq,
  210. chkPS,
  211. E (HL) LDrr,
  212. HL INCss,
  213. D (HL) LDrr,
  214. DE PUSHqq,
  215. ;CODE
  216. CODE C!
  217. HL POPqq,
  218. DE POPqq,
  219. chkPS,
  220. (HL) E LDrr,
  221. ;CODE
  222. CODE C@
  223. HL POPqq,
  224. chkPS,
  225. L (HL) LDrr,
  226. H 0 LDrn,
  227. HL PUSHqq,
  228. ;CODE
  229. CODE PC!
  230. BC POPqq,
  231. HL POPqq,
  232. chkPS,
  233. L OUT(C)r,
  234. ;CODE
  235. CODE PC@
  236. BC POPqq,
  237. chkPS,
  238. H 0 LDrn,
  239. L INr(C),
  240. HL PUSHqq,
  241. ;CODE
  242. CODE I
  243. L 0 IX+ LDrIXY,
  244. H 1 IX+ LDrIXY,
  245. HL PUSHqq,
  246. ;CODE
  247. CODE I'
  248. L 2 IX- LDrIXY,
  249. H 1 IX- LDrIXY,
  250. HL PUSHqq,
  251. ;CODE
  252. CODE J
  253. L 4 IX- LDrIXY,
  254. H 3 IX- LDrIXY,
  255. HL PUSHqq,
  256. ;CODE
  257. CODE >R
  258. HL POPqq,
  259. chkPS,
  260. ( 17 == pushRS )
  261. 17 CALLnn,
  262. ;CODE
  263. CODE R>
  264. ( 20 == popRS )
  265. 20 CALLnn,
  266. HL PUSHqq,
  267. ;CODE
  268. CODE BYE
  269. HALT,
  270. ;CODE
  271. CODE (resSP)
  272. ( INITIAL_SP == RAM+0 )
  273. SP RAMSTART LDdd(nn),
  274. ;CODE
  275. CODE (resRS)
  276. IX RS_ADDR LDddnn,
  277. ;CODE
  278. CODE SCMP
  279. DE POPqq,
  280. HL POPqq,
  281. chkPS,
  282. L1 BSET ( loop )
  283. LDA(DE),
  284. (HL) CPr,
  285. JRNZ, L2 FWR ( not equal? break early to "end".
  286. NZ is set. )
  287. A ORr, ( if our char is null, stop )
  288. HL INCss,
  289. DE INCss,
  290. JRNZ, L1 BWR ( loop )
  291. L2 FSET ( end )
  292. ( 40 == flagsToBC )
  293. 40 CALLnn,
  294. BC PUSHqq,
  295. ;CODE
  296. CODE CMP
  297. HL POPqq,
  298. DE POPqq,
  299. chkPS,
  300. A ORr, ( clear carry )
  301. DE SBCHLss,
  302. ( 40 == flagsToBC )
  303. 40 CALLnn,
  304. BC PUSHqq,
  305. ;CODE
  306. ( cur w -- a f )
  307. CODE _find
  308. HL POPqq, ( w )
  309. DE POPqq, ( cur )
  310. chkPS,
  311. ( 3 == find )
  312. 3 CALLnn,
  313. JRZ, L1 FWR ( found )
  314. ( not found )
  315. HL PUSHqq,
  316. DE 0 LDddnn,
  317. DE PUSHqq,
  318. JPNEXT,
  319. L1 FSET ( found )
  320. DE PUSHqq,
  321. DE 1 LDddnn,
  322. DE PUSHqq,
  323. ;CODE
  324. CODE (im1)
  325. IM1,
  326. EI,
  327. ;CODE