MSP430RTL.ob07 35 KB

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