Ассемблер AVR   C++   Pascal Все листинги   Мои листинги   Добавить листинг

VM.c

Автор DI HALT
Язык: C++
Опубликовано 27 июля 2010 года в 22:56
Просмотров 207

Модуль с подключаемой либо виртуальной машины

  1. #include <VM.h>
  2.  
  3.  
  4. #include <VM_PROG.h>
  5. static u08 VM_RAM[256];
  6. static u08 VM_PC[10];
  7.  
  8. void VM_Forward(void)
  9. {
  10. LED_PORT ^=1<<LED3;
  11. VM_PC[0]++;
  12.  
  13. SetTask(VM);
  14. }
  15.  
  16. void VM_Back(void)
  17. {
  18. LED_PORT ^=1<<LED3;
  19. VM_PC[0]++;
  20.  
  21. SetTask(VM);
  22. }
  23.  
  24. void VM_Stop(void)
  25. {
  26. LED_PORT ^=1<<LED3;
  27. VM_PC[0]++;
  28.  
  29. SetTask(VM);
  30. }
  31.  
  32. void VM_Delay(void)
  33. {
  34. u16 delay;
  35. u08 *OneByte;
  36.  
  37. OneByte = (u08 *)&delay;
  38.  
  39. *OneByte = VM_PGM[++VM_PC[0]];
  40. OneByte++;
  41. *OneByte = VM_PGM[++VM_PC[0]];
  42.  
  43. VM_PC[0]++;
  44.  
  45. SetTimerTask(VM,delay);
  46. }
  47.  
  48.  
  49. void VM_OFF(void)
  50. {
  51. InitVM();
  52. }
  53.  
  54. //VM Task Table ==========================================================
  55. static TPTR VM_FUNC[] PROGMEM =
  56. {
  57. &VM_OFF, //0
  58. &VM_Back, //1
  59. &VM_Forward, //2
  60. &VM_Delay, //3
  61. &VM_Stop //4
  62. };
  63.  
  64. //VM Dispatcher
  65. void VM(void) // Виртуальная машина
  66. {
  67. SetTask((void*)pgm_read_word_near(VM_FUNC+VM_PGM[VM_PC[0]]));
  68. }
  69.  
  70. // VM initializations ====================================================
  71. void InitVM(void)
  72. {
  73. u08 i;
  74.  
  75. for(i=0;i!=10;i++)
  76. {
  77. VM_PC[i]=0;
  78. }
  79. }

Материалы сайта являются авторскими. Копирование и публикация материалов без активной ссылки на первоисточник запрещено.

Реклама: лаки