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.

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