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.

409 lines
6.1KB

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