MSP430RTL.ob07 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE MSP430RTL;
  7. CONST
  8. _mul* = 0;
  9. _divmod* = 1;
  10. _lsl* = 2;
  11. _asr* = 3;
  12. _ror* = 4;
  13. _lsr* = 5;
  14. _in* = 6;
  15. _in2* = 7;
  16. _set1* = 8;
  17. _incl* = 9;
  18. _excl* = 10;
  19. _move* = 11;
  20. _set* = 12;
  21. _arrcpy* = 13;
  22. _rot* = 14;
  23. _strcmp* = 15;
  24. _error* = 16;
  25. _is* = 17;
  26. _guard* = 18;
  27. _guardrec* = 19;
  28. _length* = 20;
  29. _new* = 21;
  30. HP* = 15;
  31. LenIV* = 32;
  32. iv = 10000H - LenIV * 2;
  33. bsl = iv - 2;
  34. sp = bsl - 2;
  35. empty_proc* = sp - 2;
  36. bits = empty_proc - 272;
  37. bits_offs = bits - 32;
  38. DataSize* = iv - bits_offs;
  39. types = bits_offs - 2;
  40. IntVectorSize* = LenIV * 2 + DataSize;
  41. VarSize* = 4;
  42. StkReserve* = 40;
  43. trap = 2;
  44. TYPE
  45. EMITPROC = PROCEDURE (n: INTEGER);
  46. VAR
  47. ram*: INTEGER;
  48. rtl*: ARRAY 22 OF
  49. RECORD
  50. label*: INTEGER;
  51. used: BOOLEAN
  52. END;
  53. Label, Word, Call: EMITPROC;
  54. PROCEDURE Gen*;
  55. PROCEDURE Word1 (word: INTEGER);
  56. BEGIN
  57. Word(word)
  58. END Word1;
  59. PROCEDURE Word2 (word1, word2: INTEGER);
  60. BEGIN
  61. Word1(word1);
  62. Word1(word2)
  63. END Word2;
  64. PROCEDURE Word3 (word1, word2, word3: INTEGER);
  65. BEGIN
  66. Word1(word1);
  67. Word1(word2);
  68. Word1(word3)
  69. END Word3;
  70. BEGIN
  71. (* _lsl (n, x: INTEGER): INTEGER *)
  72. IF rtl[_lsl].used THEN
  73. Label(rtl[_lsl].label);
  74. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- n *)
  75. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- x *)
  76. Word2(0F035H, 15); (* AND #15, R5 *)
  77. Word1(2400H + 3); (* JZ L1 *)
  78. (* L2: *)
  79. Word1(5404H); (* ADD R4, R4 *)
  80. Word1(8315H); (* SUB #1, R5 *)
  81. Word1(2000H + 400H - 3); (* JNZ L2 *)
  82. (* L1: *)
  83. Word1(4130H) (* RET *)
  84. END;
  85. (* _asr (n, x: INTEGER): INTEGER *)
  86. IF rtl[_asr].used THEN
  87. Label(rtl[_asr].label);
  88. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- n *)
  89. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- x *)
  90. Word2(0F035H, 15); (* AND #15, R5 *)
  91. Word1(2400H + 3); (* JZ L1 *)
  92. (* L2: *)
  93. Word1(1104H); (* RRA R4 *)
  94. Word1(8315H); (* SUB #1, R5 *)
  95. Word1(2000H + 400H - 3); (* JNZ L2 *)
  96. (* L1: *)
  97. Word1(4130H) (* RET *)
  98. END;
  99. (* _ror (n, x: INTEGER): INTEGER *)
  100. IF rtl[_ror].used THEN
  101. Label(rtl[_ror].label);
  102. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- n *)
  103. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- x *)
  104. Word2(0F035H, 15); (* AND #15, R5 *)
  105. Word1(2400H + 5); (* JZ L1 *)
  106. Word1(4406H); (* MOV R4, R6 *)
  107. (* L2: *)
  108. Word1(1006H); (* RRC R6 *)
  109. Word1(1004H); (* RRC R4 *)
  110. Word1(8315H); (* SUB #1, R5 *)
  111. Word1(2000H + 400H - 4); (* JNZ L2 *)
  112. (* L1: *)
  113. Word1(4130H) (* RET *)
  114. END;
  115. (* _lsr (n, x: INTEGER): INTEGER *)
  116. IF rtl[_lsr].used THEN
  117. Label(rtl[_lsr].label);
  118. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- n *)
  119. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- x *)
  120. Word2(0F035H, 15); (* AND #15, R5 *)
  121. Word1(2400H + 4); (* JZ L1 *)
  122. (* L2: *)
  123. Word1(0C312H); (* BIC #1, SR *)
  124. Word1(1004H); (* RRC R4 *)
  125. Word1(8315H); (* SUB #1, R5 *)
  126. Word1(2000H + 400H - 4); (* JNZ L2 *)
  127. (* L1: *)
  128. Word1(4130H) (* RET *)
  129. END;
  130. (* _set (b, a: INTEGER): SET *)
  131. IF rtl[_set].used THEN
  132. Label(rtl[_set].label);
  133. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- b *)
  134. Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- a *)
  135. Word1(9504H); (* CMP R5, R4 *)
  136. Word1(3800H + 24); (* JL L1 *)
  137. Word2(9035H, 16); (* CMP #16, R5 *)
  138. Word1(3400H + 21); (* JGE L1 *)
  139. Word1(9304H); (* CMP #0, R4 *)
  140. Word1(3800H + 19); (* JL L1 *)
  141. Word2(9034H, 16); (* CMP #16, R4 *)
  142. Word1(3800H + 2); (* JL L2 *)
  143. Word2(4034H, 15); (* MOV #15, R4 *)
  144. (* L2: *)
  145. Word1(9305H); (* CMP #0, R5 *)
  146. Word1(3400H + 1); (* JGE L3 *)
  147. Word1(4305H); (* MOV #0, R5 *)
  148. (* L3: *)
  149. Word1(8504H); (* SUB R5, R4 *)
  150. Word1(5404H); (* ADD R4, R4 *)
  151. Word2(5034H, bits_offs); (* ADD bits_offs, R4 *)
  152. Word1(4424H); (* MOV @R4, R4 *)
  153. Word1(5505H); (* ADD R5, R5 *)
  154. Word1(5405H); (* ADD R4, R5 *)
  155. Word2(5035H, bits); (* ADD bits, R5 *)
  156. Word1(4524H); (* MOV @R5, R4 *)
  157. Word1(4130H); (* RET *)
  158. (* L1: *)
  159. Word1(4304H); (* MOV #0, R4 *)
  160. Word1(4130H) (* RET *)
  161. END;
  162. (* _set1 (a: INTEGER): SET *)
  163. IF rtl[_set1].used THEN
  164. Label(rtl[_set1].label);
  165. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- a *)
  166. Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *)
  167. Word1(2000H + 5); (* JNZ L1 *)
  168. Word1(5404H); (* ADD R4, R4 *)
  169. Word2(5034H, bits); (* ADD bits, R4 *)
  170. Word1(4424H); (* MOV @R4, R4 *)
  171. Word1(4130H); (* RET *)
  172. (* L1: *)
  173. Word1(4304H); (* MOV #0, R4 *)
  174. Word1(4130H) (* RET *)
  175. END;
  176. (* _in2 (i, s: INTEGER): BOOLEAN *)
  177. IF rtl[_in2].used THEN
  178. Label(rtl[_in2].label);
  179. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- i *)
  180. Word1(5404H); (* ADD R4, R4 *)
  181. Word2(5034H, bits); (* ADD bits, R4 *)
  182. Word1(4424H); (* MOV @R4, R4 *)
  183. Word2(0F114H, 4); (* AND 4(SP), R4 *)
  184. Word1(2400H + 1); (* JZ L1 *)
  185. Word1(4314H); (* MOV #1, R4 *)
  186. (* L1: *)
  187. Word1(4130H) (* RET *)
  188. END;
  189. (* _in (s, i: INTEGER): BOOLEAN *)
  190. IF rtl[_in].used THEN
  191. Label(rtl[_in].label);
  192. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- i *)
  193. Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *)
  194. Word1(2000H + 9); (* JNZ L2 *)
  195. Word1(5404H); (* ADD R4, R4 *)
  196. Word2(5034H, bits); (* ADD bits, R4 *)
  197. Word1(4424H); (* MOV @R4, R4 *)
  198. Word2(0F114H, 2); (* AND 2(SP), R4 *)
  199. Word1(2400H + 3); (* JZ L1 *)
  200. Word1(4314H); (* MOV #1, R4 *)
  201. Word1(4130H); (* RET *)
  202. (* L2: *)
  203. Word1(4304H); (* MOV #0, R4 *)
  204. (* L1: *)
  205. Word1(4130H) (* RET *)
  206. END;
  207. (* _incl (VAR s: SET; i: INTEGER) *)
  208. IF rtl[_incl].used THEN
  209. Label(rtl[_incl].label);
  210. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- i *)
  211. Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *)
  212. Word1(2000H + 8); (* JNZ L1 *)
  213. Word1(5404H); (* ADD R4, R4 *)
  214. Word2(5034H, bits); (* ADD bits, R4 *)
  215. Word1(4424H); (* MOV @R4, R4 *)
  216. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- @s *)
  217. Word2(0D485H, 0); (* BIS R4, 0(R5) *)
  218. (* L1: *)
  219. Word1(4130H) (* RET *)
  220. END;
  221. (* _excl (VAR s: SET; i: INTEGER) *)
  222. IF rtl[_excl].used THEN
  223. Label(rtl[_excl].label);
  224. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- i *)
  225. Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *)
  226. Word1(2000H + 8); (* JNZ L1 *)
  227. Word1(5404H); (* ADD R4, R4 *)
  228. Word2(5034H, bits); (* ADD bits, R4 *)
  229. Word1(4424H); (* MOV @R4, R4 *)
  230. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- @s *)
  231. Word2(0C485H, 0); (* BIC R4, 0(R5) *)
  232. (* L1: *)
  233. Word1(4130H) (* RET *)
  234. END;
  235. (* _rot (len, adr: INTEGER) *)
  236. IF rtl[_rot].used THEN
  237. Label(rtl[_rot].label);
  238. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- len *)
  239. Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- adr *)
  240. Word1(8314H); (* SUB #1, R4 *)
  241. Word1(5404H); (* ADD R4, R4 *)
  242. Word1(1225H); (* PUSH @R5 *)
  243. Word1(4406H); (* MOV R4, R6 *)
  244. (* L1: *)
  245. Word3(4595H, 2, 0); (* MOV 2(R5), 0(R5) *)
  246. Word1(5325H); (* ADD #2, R5 *)
  247. Word1(8326H); (* SUB #2, R6 *)
  248. Word1(2000H + 400H - 6); (* JNZ L1 *)
  249. Word2(41B5H, 0); (* MOV @SP+, 0(R5) *)
  250. Word1(4130H) (* RET *)
  251. END;
  252. (* _divmod (b, a: INTEGER): INTEGER (* res -> R4, mod -> R5 *) *)
  253. IF rtl[_divmod].used THEN
  254. Label(rtl[_divmod].label);
  255. Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- a *)
  256. Word1(4304H); (* MOV #0, R4 *)
  257. (* L1: *)
  258. Word2(4116H, 2); (* MOV 2(SP), R6; R6 <- b *)
  259. Word1(9605H); (* CMP R6, R5 *)
  260. Word1(3800H + 17); (* JL L3 *)
  261. Word1(4327H); (* MOV #2, R7 *)
  262. Word1(5606H); (* ADD R6, R6 *)
  263. (* L4: *)
  264. Word1(9306H); (* CMP #0, R6 *)
  265. Word1(2400H + 6); (* JZ L2 *)
  266. Word1(3800H + 5); (* JL L2 *)
  267. Word1(9605H); (* CMP R6, R5 *)
  268. Word1(3800H + 3); (* JL L2 *)
  269. Word1(5606H); (* ADD R6, R6 *)
  270. Word1(5707H); (* ADD R7, R7 *)
  271. Word1(3C00H + 400H - 8); (* JMP L4 *)
  272. (* L2: *)
  273. Word1(0C312H); (* BIC #1, SR *)
  274. Word1(1006H); (* RRC R6 *)
  275. Word1(0C312H); (* BIC #1, SR *)
  276. Word1(1007H); (* RRC R7 *)
  277. Word1(8605H); (* SUB R6, R5 *)
  278. Word1(5704H); (* ADD R7, R4 *)
  279. Word1(3C00H + 400H - 21); (* JMP L1 *)
  280. (* L3: *)
  281. (*----------- (a < 0) --------------*)
  282. (* L1: *)
  283. Word1(9305H); (* CMP #0, R5 *)
  284. Word1(3400H + 23); (* JGE L3 *)
  285. Word2(4116H, 2); (* MOV 2(SP), R6; R6 <- b *)
  286. Word1(4327H); (* MOV #2, R7 *)
  287. Word1(5606H); (* ADD R6, R6 *)
  288. Word1(0E335H); (* XOR #-1, R5 *)
  289. Word1(5315H); (* ADD #1, R5 *)
  290. (* L4: *)
  291. Word1(9306H); (* CMP #0, R6 *)
  292. Word1(2400H + 6); (* JZ L2 *)
  293. Word1(3800H + 5); (* JL L2 *)
  294. Word1(9605H); (* CMP R6, R5 *)
  295. Word1(3800H + 3); (* JL L2 *)
  296. Word1(5606H); (* ADD R6, R6 *)
  297. Word1(5707H); (* ADD R7, R7 *)
  298. Word1(3C00H + 400H - 8); (* JMP L4 *)
  299. (* L2: *)
  300. Word1(0E335H); (* XOR #-1, R5 *)
  301. Word1(5315H); (* ADD #1, R5 *)
  302. Word1(0C312H); (* BIC #1, SR *)
  303. Word1(1006H); (* RRC R6 *)
  304. Word1(0C312H); (* BIC #1, SR *)
  305. Word1(1007H); (* RRC R7 *)
  306. Word1(5605H); (* ADD R6, R5 *)
  307. Word1(8704H); (* SUB R7, R4 *)
  308. Word1(3C00H + 400H - 25); (* JMP L1 *)
  309. (* L3: *)
  310. Word1(4130H) (* RET *)
  311. END;
  312. (* _mul (a, b: INTEGER): INTEGER *)
  313. IF rtl[_mul].used THEN
  314. Label(rtl[_mul].label);
  315. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- a *)
  316. Word2(4116H, 4); (* MOV 4(SP), R6; R6 <- b *)
  317. Word1(4304H); (* MOV #0, R4; res := 0 *)
  318. Word1(9306H); (* CMP #0, R6 *)
  319. Word1(2400H + 7); (* JZ L1 *)
  320. (* L2: *)
  321. Word1(0B316H); (* BIT #1, R6 *)
  322. Word1(2400H + 1); (* JZ L3 *)
  323. Word1(5504H); (* ADD R5, R4 *)
  324. (* L3: *)
  325. Word1(5505H); (* ADD R5, R5 *)
  326. Word1(0C312H); (* BIC #1, SR *)
  327. Word1(1006H); (* RRC R6 *)
  328. Word1(2000H + 400H - 7); (* JNZ L2 *)
  329. (* L1: *)
  330. Word1(4130H) (* RET *)
  331. END;
  332. (* _error (modNum, modName, err, line: INTEGER) *)
  333. IF rtl[_error].used THEN
  334. Label(rtl[_error].label);
  335. Word1(5321H); (* ADD #2, SP *)
  336. Word1(4134H); (* POP R4; R4 <- modNum *)
  337. Word1(4135H); (* POP R5; R5 <- modName *)
  338. Word1(4136H); (* POP R6; R6 <- err *)
  339. Word1(4137H); (* POP R7; R7 <- line *)
  340. Word2(4211H, sp); (* MOV sp(SR), SP *)
  341. Word1(1207H); (* PUSH R7 *)
  342. Word1(1206H); (* PUSH R6 *)
  343. Word1(1205H); (* PUSH R5 *)
  344. Word1(1204H); (* PUSH R4 *)
  345. Word2(4214H, sp); (* MOV sp(SR), R4 *)
  346. Word2(1294H, trap); (* CALL trap(R4) *)
  347. Word2(04032H, 0F0H) (* MOV CPUOFF+OSCOFF+SCG0+SCG1, SR *)
  348. END;
  349. (* _new (t, size: INTEGER; VAR ptr: INTEGER) *)
  350. IF rtl[_new].used THEN
  351. Label(rtl[_new].label);
  352. Word1(1202H); (* PUSH SR *)
  353. Word1(4302H); (* MOV #0, SR *)
  354. Word1(4303H); (* NOP *)
  355. Word1(4104H); (* MOV SP, R4 *)
  356. Word2(8034H, StkReserve); (* SUB #StkReserve, R4 *)
  357. Word1(4005H + 100H * HP); (* MOV HP, R5 *)
  358. Word2(5115H, 6); (* ADD 6(SP), R5 *)
  359. Word1(9504H); (* CMP R5, R4 *)
  360. Word2(4114H, 8); (* MOV 8(SP), R4 *)
  361. Word1(3800H + 12); (* JL L1 *)
  362. Word3(4190H + HP, 4, 0); (* MOV 4(SP), 0(HP) *)
  363. Word1(5320H + HP); (* ADD #2, HP *)
  364. Word2(4084H + 100H * HP, 0); (* MOV HP, 0(R4) *)
  365. (* L3 *)
  366. Word2(4380H + HP, 0); (* MOV #0, 0(HP) *)
  367. Word1(5320H + HP); (* ADD #2, HP *)
  368. Word1(9500H + HP); (* CMP R5, HP *)
  369. Word1(3800H + 400H - 5); (* JL L3 *)
  370. Word1(3C00H + 2); (* JMP L2 *)
  371. (* L1 *)
  372. Word2(4384H, 0); (* MOV #0, 0(R4) *)
  373. (* L2 *)
  374. Word1(1300H) (* RETI *)
  375. END;
  376. (* _guardrec (t0, t1: INTEGER): INTEGER *)
  377. IF rtl[_guardrec].used THEN
  378. Label(rtl[_guardrec].label);
  379. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- t0 *)
  380. Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- t1 *)
  381. Word2(4036H, types); (* MOV #types, R6 *)
  382. (* L3: *)
  383. Word1(9305H); (* CMP #0, R5 *)
  384. Word1(2400H + 8); (* JZ L1 *)
  385. Word1(9405H); (* CMP R4, R5 *)
  386. Word1(2400H + 10); (* JZ L2 *)
  387. Word1(5505H); (* ADD R5, R5 *)
  388. Word1(0E335H); (* XOR #-1, R5 *)
  389. Word1(5315H); (* ADD #1, R5 *)
  390. Word1(5605H); (* ADD R6, R5 *)
  391. Word1(4525H); (* MOV @R5, R5 *)
  392. Word1(3C00H + 400H - 10); (* JMP L3 *)
  393. (* L1: *)
  394. Word1(9405H); (* CMP R4, R5 *)
  395. Word1(2400H + 2); (* JZ L2 *)
  396. Word1(4304H); (* MOV #0, R4 *)
  397. Word1(4130H); (* RET *)
  398. (* L2: *)
  399. Word1(4314H); (* MOV #1, R4 *)
  400. Word1(4130H) (* RET *)
  401. END;
  402. (* _is (t, p: INTEGER): INTEGER *)
  403. IF rtl[_is].used THEN
  404. Label(rtl[_is].label);
  405. Word2(4114H, 4); (* MOV 4(SP), R4; R4 <- p *)
  406. Word2(4115H, 2); (* MOV 2(SP), R5; R5 <- t *)
  407. Word1(9304H); (* TST R4 *)
  408. Word1(2400H + 2); (* JZ L *)
  409. Word2(4414H, -2); (* MOV -2(R4), R4 *)
  410. (* L: *)
  411. Word1(1204H); (* PUSH R4 *)
  412. Word1(1205H); (* PUSH R5 *)
  413. Call(rtl[_guardrec].label); (* CALL _guardrec *)
  414. Word1(5221H); (* ADD #4, SP *)
  415. Word1(4130H) (* RET *)
  416. END;
  417. (* _guard (t, p: INTEGER): INTEGER *)
  418. IF rtl[_guard].used THEN
  419. Label(rtl[_guard].label);
  420. Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- p *)
  421. Word1(4314H); (* MOV #1, R4 *)
  422. Word1(4525H); (* MOV @R5, R5 *)
  423. Word1(9305H); (* TST R5 *)
  424. Word1(2400H + 9); (* JZ L *)
  425. Word2(4515H, -2); (* MOV -2(R5), R5 *)
  426. Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- t *)
  427. Word1(1205H); (* PUSH R5 *)
  428. Word1(1204H); (* PUSH R4 *)
  429. Call(rtl[_guardrec].label); (* CALL _guardrec *)
  430. Word1(5221H); (* ADD #4, SP *)
  431. (* L: *)
  432. Word1(4130H) (* RET *)
  433. END;
  434. (* _move (bytes, dest, source: INTEGER) *)
  435. IF rtl[_move].used THEN
  436. Label(rtl[_move].label);
  437. Word2(4116H, 2); (* MOV 2(SP), R6; R6 <- bytes *)
  438. Word2(4117H, 4); (* MOV 4(SP), R7; R7 <- dest *)
  439. Word2(4115H, 6); (* MOV 6(SP), R5; R5 <- source *)
  440. Word1(9306H); (* CMP #0, R6 *)
  441. Word1(3800H + 6); (* JL L1 *)
  442. Word1(2400H + 5); (* JZ L1 *)
  443. (* L2: *)
  444. Word2(45F7H, 0); (* MOV.B @R5+, 0(R7) *)
  445. Word1(5317H); (* ADD #1, R7 *)
  446. Word1(8316H); (* SUB #1, R6 *)
  447. Word1(2000H + 400H - 5); (* JNZ L2 *)
  448. (* L1: *)
  449. Word1(4130H) (* RET *)
  450. END;
  451. (* _arrcpy (base_size, len_dst, dst, len_src, src: INTEGER) *)
  452. IF rtl[_arrcpy].used THEN
  453. Label(rtl[_arrcpy].label);
  454. Word3(9191H, 8, 4); (* CMP 8(SP), 4(SP) *)
  455. Word1(3800H + 18); (* JL L1 *)
  456. Word2(1211H, 12); (* PUSH 12(SP) *)
  457. Word2(1211H, 10); (* PUSH 10(SP) *)
  458. Word2(1211H, 14); (* PUSH 14(SP) *)
  459. Word2(1211H, 10); (* PUSH 10(SP) *)
  460. Call(rtl[_mul].label); (* CALL _mul *)
  461. Word1(5221H); (* ADD #4, SP *)
  462. Word1(1204H); (* PUSH R4 *)
  463. Call(rtl[_move].label); (* CALL _move *)
  464. Word2(5031H, 6); (* ADD #6, SP *)
  465. Word1(4314H); (* MOV #1, R4 *)
  466. Word1(4130H); (* RET *)
  467. (* L1 *)
  468. Word1(4304H); (* MOV #0, R4 *)
  469. Word1(4130H) (* RET *)
  470. END;
  471. (* _length (len, str: INTEGER): INTEGER *)
  472. IF rtl[_length].used THEN
  473. Label(rtl[_length].label);
  474. Word2(4116H, 2); (* MOV 2(SP), R6; R6 <- len *)
  475. Word2(4117H, 4); (* MOV 4(SP), R7; R7 <- str *)
  476. Word1(4304H); (* MOV #0, R4; res := 0 *)
  477. (* L2: *)
  478. Word1(4775H); (* MOV.B @R7+, R5 *)
  479. Word1(9305H); (* CMP #0, R5 *)
  480. Word1(2400H + 3); (* JZ L1 *)
  481. Word1(5314H); (* ADD #1, R4 *)
  482. Word1(8316H); (* SUB #1, R6 *)
  483. Word1(2000H + 400H - 6); (* JNZ L2 *)
  484. (* L1: *)
  485. Word1(4130H) (* RET *)
  486. END;
  487. (* _strcmp (op, len2, str2, len1, str1: INTEGER): BOOLEAN *)
  488. IF rtl[_strcmp].used THEN
  489. Label(rtl[_strcmp].label);
  490. Word2(4116H, 4); (* MOV 4(SP), R6; R6 <- len2 *)
  491. Word2(4117H, 8); (* MOV 8(SP), R7; R7 <- len1 *)
  492. Word1(9607H); (* CMP R6, R7 *)
  493. Word1(3400H + 1); (* JGE L5 *)
  494. Word1(4706H); (* MOV R7, R6 *)
  495. (* L5: *)
  496. Word1(1206H); (* PUSH R6 *)
  497. Word2(4116H, 12); (* MOV 12(SP), R6; R6 <- str1 *)
  498. Word2(4117H, 8); (* MOV 8(SP), R7; R7 <- str2 *)
  499. (* L3: *)
  500. Word2(9381H, 0); (* CMP #0, 0(SP) *)
  501. Word1(2400H + 11); (* JZ L1 *)
  502. Word1(4674H); (* MOV.B @R6+, R4 *)
  503. Word1(4775H); (* MOV.B @R7+, R5 *)
  504. Word2(8391H, 0); (* SUB #1, 0(SP) *)
  505. Word1(9405H); (* CMP R4, R5 *)
  506. Word1(2400H + 2); (* JZ L2 *)
  507. Word1(8504H); (* SUB R5, R4 *)
  508. Word1(3C00H + 5); (* JMP L4 *)
  509. (* L2: *)
  510. Word1(9304H); (* CMP #0, R4 *)
  511. Word1(2000H + 400H - 13); (* JNZ L3 *)
  512. Word1(3C00H + 2); (* JMP L4 *)
  513. (* L1: *)
  514. Word2(4034H, 8000H); (* MOV #8000H, R4 *)
  515. (* L4: *)
  516. Word1(5321H); (* ADD #2, SP *)
  517. Word2(9034H, 8000H); (* CMP #8000H, R4 *)
  518. Word1(2000H + 18); (* JNZ L6 *)
  519. Word2(4116H, 4); (* MOV 4(SP), R6; R6 <- len2 *)
  520. Word2(4117H, 8); (* MOV 8(SP), R7; R7 <- len1 *)
  521. Word1(9607H); (* CMP R6, R7 *)
  522. Word1(2400H + 11); (* JZ L7 *)
  523. Word1(3800H + 4); (* JL L8 *)
  524. Word2(5116H, 10); (* ADD 10(SP), R6 *)
  525. Word1(4664H); (* MOV.B @R6, R4 *)
  526. Word1(3C00H + 7); (* JMP L6 *)
  527. (* L8: *)
  528. Word2(5117H, 6); (* ADD 6(SP), R7 *)
  529. Word1(4764H); (* MOV.B @R7, R4 *)
  530. Word1(0E334H); (* XOR #-1, R4 *)
  531. Word1(5314H); (* ADD #1, R4 *)
  532. Word1(3C00H + 1); (* JMP L6 *)
  533. (* L7: *)
  534. Word1(4304H); (* MOV #0, R4 *)
  535. (* L6: *)
  536. Word2(5110H, 2); (* ADD 2(SP), PC; PC <- PC + op *)
  537. Word1(9304H); (* CMP #0, R4 *)
  538. Word1(4314H); (* MOV #1, R4 *)
  539. Word1(2400H + 1); (* JZ L *)
  540. Word1(4304H); (* MOV #0, R4 *)
  541. (* L *)
  542. Word1(4130H); (* RET *)
  543. Word1(4303H); (* NOP *)
  544. Word1(9304H); (* CMP #0, R4 *)
  545. Word1(4314H); (* MOV #1, R4 *)
  546. Word1(2000H + 1); (* JNZ L *)
  547. Word1(4304H); (* MOV #0, R4 *)
  548. (* L *)
  549. Word1(4130H); (* RET *)
  550. Word1(4303H); (* NOP *)
  551. Word1(9304H); (* CMP #0, R4 *)
  552. Word1(4314H); (* MOV #1, R4 *)
  553. Word1(3800H + 1); (* JL L *)
  554. Word1(4304H); (* MOV #0, R4 *)
  555. (* L *)
  556. Word1(4130H); (* RET *)
  557. Word1(4303H); (* NOP *)
  558. Word1(9304H); (* CMP #0, R4 *)
  559. Word1(4314H); (* MOV #1, R4 *)
  560. Word1(3800H + 2); (* JL L *)
  561. Word1(2400H + 1); (* JZ L *)
  562. Word1(4304H); (* MOV #0, R4 *)
  563. (* L *)
  564. Word1(4130H); (* RET *)
  565. Word1(9304H); (* CMP #0, R4 *)
  566. Word1(4304H); (* MOV #0, R4 *)
  567. Word1(3800H + 2); (* JL L *)
  568. Word1(2400H + 1); (* JZ L *)
  569. Word1(4314H); (* MOV #1, R4 *)
  570. (* L *)
  571. Word1(4130H); (* RET *)
  572. Word1(9304H); (* CMP #0, R4 *)
  573. Word1(4314H); (* MOV #1, R4 *)
  574. Word1(3400H + 1); (* JGE L *)
  575. Word1(4304H); (* MOV #0, R4 *)
  576. (* L *)
  577. Word1(4130H) (* RET *)
  578. END
  579. END Gen;
  580. PROCEDURE Set* (idx, label: INTEGER);
  581. BEGIN
  582. rtl[idx].label := label;
  583. rtl[idx].used := FALSE
  584. END Set;
  585. PROCEDURE Used* (idx: INTEGER);
  586. BEGIN
  587. rtl[idx].used := TRUE;
  588. IF (idx = _guard) OR (idx = _is) THEN
  589. rtl[_guardrec].used := TRUE
  590. ELSIF idx = _arrcpy THEN
  591. rtl[_move].used := TRUE;
  592. rtl[_mul].used := TRUE
  593. END
  594. END Used;
  595. PROCEDURE Init* (pLabel, pWord, pCall: EMITPROC);
  596. BEGIN
  597. Label := pLabel;
  598. Word := pWord;
  599. Call := pCall;
  600. ram := 200H;
  601. END Init;
  602. END MSP430RTL.