py_functions.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. emuInst->cpu->pc = 0xC000;
  20. print_console(emuInst, "Resetting program counter to 0xC000\n");
  21. }
  22. void cmd_emu(char *line, int len) {
  23. if (!emuInst->cpu->running && emuInst->debugger->debug_mode) {
  24. exec_cmd(emuInst, line, len);
  25. // update_register_display(emu);
  26. }
  27. }
  28. void stop_emu() {
  29. emuInst->debugger->quit = true;
  30. print_console(emuInst, "Stopping emulator..\n");
  31. }
  32. void start_emu(char *file) {
  33. emuInst = (Emulator *) calloc( 1, sizeof(Emulator) );
  34. Cpu *cpu = NULL; Debugger *deb = NULL;
  35. emuInst->cpu = (Cpu *) calloc(1, sizeof(Cpu));
  36. emuInst->cpu->bcm = (Bcm *) calloc(1, sizeof(Bcm));
  37. emuInst->cpu->timer_a = (Timer_a *) calloc(1, sizeof(Timer_a));
  38. emuInst->cpu->p1 = (Port_1 *) calloc(1, sizeof(Port_1));
  39. emuInst->cpu->usci = (Usci *) calloc(1, sizeof(Usci));
  40. emuInst->debugger = (Debugger *) calloc(1, sizeof(Debugger));
  41. setup_debugger(emuInst);
  42. cpu = emuInst->cpu;
  43. deb = emuInst->debugger;
  44. // deb->server = (Server *) calloc(1, sizeof(Server));
  45. initialize_msp_memspace();
  46. initialize_msp_registers(emuInst);
  47. setup_bcm(emuInst);
  48. setup_timer_a(emuInst);
  49. setup_port_1(emuInst);
  50. setup_usci(emuInst);
  51. load_bootloader(0x0C00);
  52. load_firmware(emuInst, file, 0xC000);
  53. display_registers(emuInst);
  54. disassemble(emuInst, cpu->pc, 1);
  55. update_register_display(emuInst);
  56. while (!deb->quit) {
  57. // Handle debugger when CPU is not running
  58. if (!cpu->running) {
  59. usleep(10000);
  60. continue;
  61. }
  62. // Handle Breakpoints
  63. handle_breakpoints(emuInst);
  64. // Instruction Decoder
  65. decode(emuInst, fetch(emuInst), EXECUTE);
  66. // Handle Peripherals
  67. handle_bcm(emuInst);
  68. handle_timer_a(emuInst);
  69. handle_port_1(emuInst);
  70. handle_usci(emuInst);
  71. // Average of 4 cycles per instruction
  72. mclk_wait_cycles(emuInst, 4);
  73. }
  74. uninitialize_msp_memspace();
  75. free(cpu->timer_a);
  76. free(cpu->bcm);
  77. free(cpu->p1);
  78. free(cpu->usci);
  79. free(cpu);
  80. free(deb->server);
  81. free(deb);
  82. free(emuInst);
  83. return;
  84. }
  85. //void init_packet_queue (Emulator *emu){
  86. // Server *s = emu->debugger->server;
  87. // s->pending_packets_head = NULL;
  88. // s->pending_packets_tail = NULL;
  89. // s->packets_queued = 0;
  90. // s->spin_lock = false;
  91. //}
  92. //void *emulator (void *ctxt) {
  93. // emu = (Emulator *) ctxt;
  94. // Debugger *deb = emu->debugger;
  95. //
  96. // init_packet_queue(emu);
  97. // printf("starting emulator...\n");
  98. //}