| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #include "py_functions.h"
- // This is an ugly solution but heh
- Emulator *emuInst = NULL;
- void play_emu() {
- emuInst->cpu->running = true;
- emuInst->debugger->debug_mode = false;
- }
- void pause_emu() {
- if (emuInst->cpu->running) {
- emuInst->cpu->running = false;
- emuInst->debugger->debug_mode = true;
- // display first round of registers
- // display_registers(emu);
- // disassemble(emu, cpu->pc, 1);
- // update_register_display(emu);
- }
- }
- void reset_emu() {
- if(emuInst == NULL) return;
- emuInst->cpu->pc = 0xC000;
- print_console(emuInst, "Resetting program counter to 0xC000\n");
- }
- void set_reg(uint8_t reg_type, uint8_t value) {
- if(emuInst == NULL) return;
- switch(reg_type) {
- case SET_REG_P1_IN:
- *emuInst->cpu->p1->_IN = value;
- }
- }
- PyObject *get_port1_regs() {
- if(emuInst == NULL) return Py_None;
- char regs[9];
- Port_1 *p = emuInst->cpu->p1;
- regs[0] = *p->_OUT;
- regs[1] = *p->_DIR;
- regs[2] = *p->_IFG;
- regs[3] = *p->_IES;
- regs[4] = *p->_IE;
- regs[5] = *p->_SEL;
- regs[6] = *p->_SEL2;
- regs[7] = *p->_REN;
- regs[8] = *p->_IN;
- return PyBytes_FromStringAndSize(regs, 9);
- }
- void cmd_emu(char *line, int len) {
- if(emuInst == NULL) return;
- if (!emuInst->cpu->running && emuInst->debugger->debug_mode) {
- exec_cmd(emuInst, line, len);
- // update_register_display(emu);
- }
- }
- void stop_emu() {
- if(emuInst == NULL) return;
- emuInst->debugger->quit = true;
- print_console(emuInst, "Stopping emulator..\n");
- }
- void start_emu(char *file) {
- emuInst = (Emulator *) calloc( 1, sizeof(Emulator) );
- Cpu *cpu = NULL; Debugger *deb = NULL;
- emuInst->cpu = (Cpu *) calloc(1, sizeof(Cpu));
- emuInst->cpu->bcm = (Bcm *) calloc(1, sizeof(Bcm));
- emuInst->cpu->timer_a = (Timer_a *) calloc(1, sizeof(Timer_a));
- emuInst->cpu->p1 = (Port_1 *) calloc(1, sizeof(Port_1));
- emuInst->cpu->usci = (Usci *) calloc(1, sizeof(Usci));
- emuInst->debugger = (Debugger *) calloc(1, sizeof(Debugger));
- setup_debugger(emuInst);
- cpu = emuInst->cpu;
- deb = emuInst->debugger;
- // deb->server = (Server *) calloc(1, sizeof(Server));
- initialize_msp_memspace();
- initialize_msp_registers(emuInst);
- setup_bcm(emuInst);
- setup_timer_a(emuInst);
- setup_port_1(emuInst);
- setup_usci(emuInst);
- load_bootloader(0x0C00);
- if(load_firmware(emuInst, file, 0xC000) == 0) {
- // display_registers(emuInst);
- disassemble(emuInst, cpu->pc, 1);
- // update_register_display(emuInst);
- while (!deb->quit) {
- // Handle debugger when CPU is not running
- if (!cpu->running) {
- usleep(10000);
- continue;
- }
- // Handle Breakpoints
- //handle_breakpoints(emuInst);
- // Instruction Decoder
- decode(emuInst, fetch(emuInst), EXECUTE);
- // Handle Peripherals
- handle_bcm(emuInst);
- handle_timer_a(emuInst);
- handle_port_1(emuInst);
- handle_usci(emuInst);
- // Average of 4 cycles per instruction
- mclk_wait_cycles(emuInst, 4);
- }
- }
- uninitialize_msp_memspace();
- free(cpu->timer_a);
- free(cpu->bcm);
- free(cpu->p1);
- free(cpu->usci);
- free(cpu);
- free(deb->server);
- free(deb);
- free(emuInst);
- return;
- }
- //void init_packet_queue (Emulator *emu){
- // Server *s = emu->debugger->server;
- // s->pending_packets_head = NULL;
- // s->pending_packets_tail = NULL;
- // s->packets_queued = 0;
- // s->spin_lock = false;
- //}
- //void *emulator (void *ctxt) {
- // emu = (Emulator *) ctxt;
- // Debugger *deb = emu->debugger;
- //
- // init_packet_queue(emu);
- // printf("starting emulator...\n");
- //}
|