py_functions.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "py_functions.h"
  2. // This is an ugly solution but heh
  3. Emulator *emuInst;
  4. void play_emu() {
  5. emuInst->cpu->running = true;
  6. emuInst->debugger->debug_mode = false;
  7. }
  8. void pause_emu() {
  9. if (emuInst->cpu->running) {
  10. emuInst->cpu->running = false;
  11. emuInst->debugger->debug_mode = true;
  12. // display first round of registers
  13. // display_registers(emu);
  14. // disassemble(emu, cpu->pc, 1);
  15. // update_register_display(emu);
  16. }
  17. }
  18. void reset_emu() {
  19. if(!emuInst) return;
  20. emuInst->cpu->pc = 0xC000;
  21. print_console(emuInst, "Resetting program counter to 0xC000\n");
  22. }
  23. void set_reg(uint8_t reg_type, uint8_t value) {
  24. if(!emuInst) return;
  25. switch(reg_type) {
  26. case SET_REG_P1_IN:
  27. *emuInst->cpu->p1->_IN = value;
  28. }
  29. }
  30. PyObject *get_port1_regs() {
  31. if(!emuInst) return Py_None;
  32. char regs[9];
  33. Port_1 *p = emuInst->cpu->p1;
  34. regs[0] = *p->_OUT;
  35. regs[1] = *p->_DIR;
  36. regs[2] = *p->_IFG;
  37. regs[3] = *p->_IES;
  38. regs[4] = *p->_IE;
  39. regs[5] = *p->_SEL;
  40. regs[6] = *p->_SEL2;
  41. regs[7] = *p->_REN;
  42. regs[8] = *p->_IN;
  43. return PyBytes_FromStringAndSize(regs, 9);
  44. }
  45. void cmd_emu(char *line, int len) {
  46. if(!emuInst) return;
  47. if (!emuInst->cpu->running && emuInst->debugger->debug_mode) {
  48. exec_cmd(emuInst, line, len);
  49. // update_register_display(emu);
  50. }
  51. }
  52. void stop_emu() {
  53. if(!emuInst) return;
  54. emuInst->debugger->quit = true;
  55. print_console(emuInst, "Stopping emulator..\n");
  56. }
  57. void start_emu(char *file) {
  58. emuInst = (Emulator *) calloc( 1, sizeof(Emulator) );
  59. Cpu *cpu = NULL; Debugger *deb = NULL;
  60. emuInst->cpu = (Cpu *) calloc(1, sizeof(Cpu));
  61. emuInst->cpu->bcm = (Bcm *) calloc(1, sizeof(Bcm));
  62. emuInst->cpu->timer_a = (Timer_a *) calloc(1, sizeof(Timer_a));
  63. emuInst->cpu->p1 = (Port_1 *) calloc(1, sizeof(Port_1));
  64. emuInst->cpu->usci = (Usci *) calloc(1, sizeof(Usci));
  65. emuInst->debugger = (Debugger *) calloc(1, sizeof(Debugger));
  66. setup_debugger(emuInst);
  67. cpu = emuInst->cpu;
  68. deb = emuInst->debugger;
  69. // deb->server = (Server *) calloc(1, sizeof(Server));
  70. initialize_msp_memspace();
  71. initialize_msp_registers(emuInst);
  72. setup_bcm(emuInst);
  73. setup_timer_a(emuInst);
  74. setup_port_1(emuInst);
  75. setup_usci(emuInst);
  76. load_bootloader(0x0C00);
  77. load_firmware(emuInst, file, 0xC000);
  78. display_registers(emuInst);
  79. disassemble(emuInst, cpu->pc, 1);
  80. update_register_display(emuInst);
  81. while (!deb->quit) {
  82. // Handle debugger when CPU is not running
  83. if (!cpu->running) {
  84. usleep(10000);
  85. continue;
  86. }
  87. // Handle Breakpoints
  88. handle_breakpoints(emuInst);
  89. // Instruction Decoder
  90. decode(emuInst, fetch(emuInst), EXECUTE);
  91. // Handle Peripherals
  92. handle_bcm(emuInst);
  93. handle_timer_a(emuInst);
  94. handle_port_1(emuInst);
  95. handle_usci(emuInst);
  96. // Average of 4 cycles per instruction
  97. mclk_wait_cycles(emuInst, 4);
  98. }
  99. uninitialize_msp_memspace();
  100. free(cpu->timer_a);
  101. free(cpu->bcm);
  102. free(cpu->p1);
  103. free(cpu->usci);
  104. free(cpu);
  105. free(deb->server);
  106. free(deb);
  107. free(emuInst);
  108. return;
  109. }
  110. //void init_packet_queue (Emulator *emu){
  111. // Server *s = emu->debugger->server;
  112. // s->pending_packets_head = NULL;
  113. // s->pending_packets_tail = NULL;
  114. // s->packets_queued = 0;
  115. // s->spin_lock = false;
  116. //}
  117. //void *emulator (void *ctxt) {
  118. // emu = (Emulator *) ctxt;
  119. // Debugger *deb = emu->debugger;
  120. //
  121. // init_packet_queue(emu);
  122. // printf("starting emulator...\n");
  123. //}