finsh_ops.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. /*
  2. * operations for finsh shell.
  3. *
  4. * COPYRIGHT (C) 2006 - 2013, RT-Thread Development Team
  5. *
  6. * This file is part of RT-Thread (http://www.rt-thread.org)
  7. * Maintainer: bernard.xiong <bernard.xiong at gmail.com>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. *
  25. * Change Logs:
  26. * Date Author Notes
  27. * 2010-03-22 Bernard first version
  28. */
  29. #include "finsh_ops.h"
  30. #include "finsh_vm.h"
  31. #define OP_BIN_BYTE(x) do {\
  32. (finsh_sp - 2)->char_value = (finsh_sp - 2)->char_value x (finsh_sp - 1)->char_value; \
  33. finsh_sp--; \
  34. }while (0)
  35. #define OP_BIN_WORD(x) do {\
  36. (finsh_sp - 2)->short_value = (finsh_sp - 2)->short_value x (finsh_sp - 1)->short_value; \
  37. finsh_sp--; \
  38. }while (0)
  39. #define OP_BIN_DWORD(x) do {\
  40. (finsh_sp - 2)->long_value = (finsh_sp - 2)->long_value x (finsh_sp - 1)->long_value; \
  41. finsh_sp--; \
  42. }while (0)
  43. /* --- noop --- */
  44. void OP_no_op()
  45. {
  46. /* none */
  47. return ;
  48. }
  49. /* --- add --- */
  50. void OP_add_byte()
  51. {
  52. OP_BIN_BYTE(+);
  53. return ;
  54. }
  55. void OP_add_word()
  56. {
  57. OP_BIN_WORD(+);
  58. return ;
  59. }
  60. void OP_add_dword()
  61. {
  62. OP_BIN_DWORD(+);
  63. return ;
  64. }
  65. /* --- sub --- */
  66. void OP_sub_byte()
  67. {
  68. OP_BIN_BYTE(-);
  69. return ;
  70. }
  71. void OP_sub_word()
  72. {
  73. OP_BIN_WORD(-);
  74. return ;
  75. }
  76. void OP_sub_dword()
  77. {
  78. OP_BIN_DWORD(-);
  79. return ;
  80. }
  81. /* --- div --- */
  82. void OP_div_byte()
  83. {
  84. OP_BIN_BYTE(/);
  85. return ;
  86. }
  87. void OP_div_word()
  88. {
  89. OP_BIN_WORD(/);
  90. return ;
  91. }
  92. void OP_div_dword()
  93. {
  94. OP_BIN_DWORD(/);
  95. return ;
  96. }
  97. /* --- mod --- */
  98. void OP_mod_byte()
  99. {
  100. OP_BIN_BYTE(%);
  101. return ;
  102. }
  103. void OP_mod_word()
  104. {
  105. OP_BIN_WORD(%);
  106. return ;
  107. }
  108. void OP_mod_dword()
  109. {
  110. OP_BIN_DWORD(%);
  111. return ;
  112. }
  113. /* --- mul --- */
  114. void OP_mul_byte()
  115. {
  116. OP_BIN_BYTE(*);
  117. return ;
  118. }
  119. void OP_mul_word()
  120. {
  121. OP_BIN_WORD(*);
  122. return ;
  123. }
  124. void OP_mul_dword()
  125. {
  126. OP_BIN_DWORD(*);
  127. return ;
  128. }
  129. /* --- and --- */
  130. void OP_and_byte()
  131. {
  132. OP_BIN_BYTE(&);
  133. return ;
  134. }
  135. void OP_and_word()
  136. {
  137. OP_BIN_WORD(&);
  138. return ;
  139. }
  140. void OP_and_dword()
  141. {
  142. OP_BIN_DWORD(&);
  143. return ;
  144. }
  145. /* --- or --- */
  146. void OP_or_byte()
  147. {
  148. OP_BIN_BYTE(|);
  149. return ;
  150. }
  151. void OP_or_word()
  152. {
  153. OP_BIN_WORD(|);
  154. return ;
  155. }
  156. void OP_or_dword()
  157. {
  158. OP_BIN_DWORD(|);
  159. return ;
  160. }
  161. /* --- xor --- */
  162. void OP_xor_byte()
  163. {
  164. OP_BIN_BYTE(^);
  165. return ;
  166. }
  167. void OP_xor_word()
  168. {
  169. OP_BIN_WORD(^);
  170. return ;
  171. }
  172. void OP_xor_dword()
  173. {
  174. OP_BIN_DWORD(^);
  175. return ;
  176. }
  177. /* --- bw --- */
  178. void OP_bw_byte()
  179. {
  180. (finsh_sp - 1)->char_value = ~ ((finsh_sp - 1)->char_value);
  181. return ;
  182. }
  183. void OP_bw_word()
  184. {
  185. (finsh_sp - 1)->short_value = ~ ((finsh_sp - 1)->short_value);
  186. return ;
  187. }
  188. void OP_bw_dword()
  189. {
  190. (finsh_sp - 1)->long_value = ~ ((finsh_sp - 1)->long_value);
  191. return ;
  192. }
  193. /* --- shl --- */
  194. void OP_shl_byte()
  195. {
  196. OP_BIN_BYTE(<<);
  197. return ;
  198. }
  199. void OP_shl_word()
  200. {
  201. OP_BIN_WORD(<<);
  202. return ;
  203. }
  204. void OP_shl_dword()
  205. {
  206. OP_BIN_DWORD(<<);
  207. return ;
  208. }
  209. /* --- shr --- */
  210. void OP_shr_byte()
  211. {
  212. OP_BIN_BYTE(>>);
  213. return ;
  214. }
  215. void OP_shr_word()
  216. {
  217. OP_BIN_WORD(>>);
  218. return ;
  219. }
  220. void OP_shr_dword()
  221. {
  222. OP_BIN_DWORD(>>);
  223. return ;
  224. }
  225. /* --- ld --- */
  226. void OP_ld_byte()
  227. {
  228. finsh_sp->char_value = *finsh_pc;
  229. finsh_sp++;
  230. finsh_pc++;
  231. return ;
  232. }
  233. void OP_ld_word()
  234. {
  235. finsh_sp->short_value = FINSH_GET16(finsh_pc);
  236. finsh_sp ++;
  237. finsh_pc += 2;
  238. return ;
  239. }
  240. void OP_ld_dword()
  241. {
  242. finsh_sp->long_value = FINSH_GET32(finsh_pc);
  243. finsh_sp ++;
  244. finsh_pc += 4;
  245. return ;
  246. }
  247. void OP_ld_value_byte()
  248. {
  249. char* c;
  250. c = (char*) (FINSH_GET32(finsh_pc));
  251. finsh_sp->char_value = *c;
  252. finsh_sp ++;
  253. finsh_pc += 4;
  254. return;
  255. }
  256. void OP_ld_value_byte_stack()
  257. {
  258. char* c;
  259. c = (char *)(finsh_sp - 1)->long_value;
  260. (finsh_sp - 1)->char_value = *c;
  261. return;
  262. }
  263. void OP_ld_value_word()
  264. {
  265. short* s;
  266. s = (short*) (FINSH_GET32(finsh_pc));
  267. finsh_sp->short_value = *s;
  268. finsh_sp ++;
  269. finsh_pc += 4;
  270. return;
  271. }
  272. void OP_ld_value_word_stack()
  273. {
  274. short* s;
  275. s = (short *)(finsh_sp - 1)->long_value;
  276. (finsh_sp - 1)->short_value = *s;
  277. return;
  278. }
  279. void OP_ld_value_dword()
  280. {
  281. long* l;
  282. l = (long*) (FINSH_GET32(finsh_pc));
  283. finsh_sp->long_value = *l;
  284. finsh_sp ++;
  285. finsh_pc += 4;
  286. return;
  287. }
  288. void OP_ld_value_dword_stack()
  289. {
  290. long* l;
  291. l = (long *)(finsh_sp - 1)->long_value;
  292. (finsh_sp - 1)->long_value = *l;
  293. return;
  294. }
  295. /* --- st --- */
  296. /*
  297. * 2006-4-16 bernard
  298. * fixed the sp move bug
  299. */
  300. void OP_st_byte()
  301. {
  302. *(char*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->char_value;
  303. finsh_sp --;
  304. return ;
  305. }
  306. /*
  307. * 2006-4-16 bernard
  308. * fixed the sp move bug
  309. */
  310. void OP_st_word()
  311. {
  312. *(short*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->short_value;
  313. finsh_sp --;
  314. return ;
  315. }
  316. /*
  317. * 2006-4-16 bernard
  318. * fixed the sp move bug
  319. */
  320. void OP_st_dword()
  321. {
  322. *(long*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->long_value;
  323. finsh_sp --;
  324. return ;
  325. }
  326. /* --- pop --- */
  327. void OP_pop()
  328. {
  329. finsh_sp --;
  330. return ;
  331. }
  332. /* --- call --- */
  333. void OP_call()
  334. {
  335. /* the max number of arg*/
  336. unsigned long parameterv[16];
  337. unsigned int parameters, i;
  338. typedef unsigned long var_t;
  339. typedef var_t (*op_func)();
  340. op_func f;
  341. var_t r;
  342. parameters = *finsh_pc ++;
  343. i = 0; finsh_sp --;
  344. while (i < parameters)
  345. {
  346. parameterv[parameters - 1 - i] = finsh_sp->long_value;
  347. finsh_sp --;
  348. i++;
  349. }
  350. f = (op_func)(finsh_sp->long_value);
  351. switch (parameters)
  352. {
  353. case 0:
  354. r = f(0);
  355. break;
  356. case 1:
  357. r = f(parameterv[0]);
  358. break;
  359. case 2:
  360. r = f(parameterv[0], parameterv[1]);
  361. break;
  362. case 3:
  363. r = f(parameterv[0], parameterv[1], parameterv[2]);
  364. break;
  365. case 4:
  366. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3]);
  367. break;
  368. case 5:
  369. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  370. parameterv[4]);
  371. break;
  372. case 6:
  373. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  374. parameterv[4], parameterv[5]);
  375. break;
  376. case 7:
  377. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  378. parameterv[4], parameterv[5], parameterv[6]);
  379. break;
  380. case 8:
  381. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  382. parameterv[4], parameterv[5], parameterv[6], parameterv[7]);
  383. break;
  384. case 9:
  385. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  386. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  387. parameterv[8]);
  388. break;
  389. case 10:
  390. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  391. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  392. parameterv[8], parameterv[9]);
  393. break;
  394. case 11:
  395. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  396. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  397. parameterv[8], parameterv[9], parameterv[10]);
  398. break;
  399. case 12:
  400. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  401. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  402. parameterv[8], parameterv[9], parameterv[10], parameterv[11]);
  403. break;
  404. case 13:
  405. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  406. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  407. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  408. parameterv[12]);
  409. break;
  410. case 14:
  411. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  412. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  413. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  414. parameterv[12], parameterv[13]);
  415. break;
  416. case 15:
  417. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  418. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  419. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  420. parameterv[12], parameterv[13], parameterv[14]);
  421. break;
  422. case 16:
  423. r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],
  424. parameterv[4], parameterv[5], parameterv[6], parameterv[7],
  425. parameterv[8], parameterv[9], parameterv[10], parameterv[11],
  426. parameterv[12], parameterv[13], parameterv[14], parameterv[15]);
  427. break;
  428. default:
  429. r = 0;
  430. break;
  431. }
  432. finsh_sp->long_value = r;
  433. finsh_sp ++;
  434. return ;
  435. }
  436. const op_func op_table[] =
  437. {
  438. /* 00 */ OP_no_op,
  439. /* 01 */ OP_add_byte,
  440. /* 02 */ OP_add_word,
  441. /* 03 */ OP_add_dword,
  442. /* 04 */ OP_sub_byte,
  443. /* 05 */ OP_sub_word,
  444. /* 06 */ OP_sub_dword,
  445. /* 07 */ OP_div_byte,
  446. /* 08 */ OP_div_word,
  447. /* 09 */ OP_div_dword,
  448. /* 10 */ OP_mod_byte,
  449. /* 11 */ OP_mod_word,
  450. /* 12 */ OP_mod_dword,
  451. /* 13 */ OP_mul_byte,
  452. /* 14 */ OP_mul_word,
  453. /* 15 */ OP_mul_dword,
  454. /* 16 */ OP_and_byte,
  455. /* 17 */ OP_and_word,
  456. /* 18 */ OP_and_dword,
  457. /* 19 */ OP_or_byte,
  458. /* 20 */ OP_or_word,
  459. /* 21 */ OP_or_dword,
  460. /* 22 */ OP_xor_byte,
  461. /* 23 */ OP_xor_word,
  462. /* 24 */ OP_xor_dword,
  463. /* 25 */ OP_bw_byte,
  464. /* 26 */ OP_bw_word,
  465. /* 27 */ OP_bw_dword,
  466. /* 28 */ OP_shl_byte,
  467. /* 29 */ OP_shl_word,
  468. /* 30 */ OP_shl_dword,
  469. /* 31 */ OP_shr_byte,
  470. /* 32 */ OP_shr_word,
  471. /* 33 */ OP_shr_dword,
  472. /* 34 */ OP_ld_byte,
  473. /* 35 */ OP_ld_word,
  474. /* 36 */ OP_ld_dword,
  475. /* 37 */ OP_ld_value_byte,
  476. /* 38 */ OP_ld_value_word,
  477. /* 39 */ OP_ld_value_dword,
  478. /* 40 */ OP_st_byte,
  479. /* 41 */ OP_st_word,
  480. /* 42 */ OP_st_dword,
  481. /* 43 */ OP_pop,
  482. /* 44 */ OP_call,
  483. /* 45 */ OP_ld_value_byte_stack,
  484. /* 46 */ OP_ld_value_word_stack,
  485. /* 47 */ OP_ld_value_dword_stack,
  486. NULL
  487. };