Example #1
0
class CPU():  #   ROM    RAM
    CPU_TABLE = {
        "MSP430FR2000": (512, 512),
        "MSP430FR2100": (1024, 512),
        "MSP430FR2110": (2048, 1024),
        "MSP430FR2111": (4096, 1024),
        "MSP430iua": (15872, 1024)
    }

    def __init__(self, part="MSP430iua"):
        assert part in CPU.CPU_TABLE

        # Memoria de programa: Termina en el final del espacio de 65kB,
        # y se reserva hacia abajo.
        self.ROM = Memory(mem_size=self.CPU_TABLE[part][0],
                          mem_start=2**16 - self.CPU_TABLE[part][0],
                          readonly=True)
        self.ROM.store_word_at(65534, self.ROM.mem_start)

        # RAM inicia siempre en 0x200
        self.RAM = Memory(mem_size=self.CPU_TABLE[part][1],
                          mem_start=0x0200,
                          readonly=False)
        self.reg = Registers()
        self.sim = Simulator(self.ROM, self.reg)

    def __str__(self):
        return (str(self.reg) + "\n" + str(self.RAM) + "\n" + str(self.ROM) +
                "\n")

    def reset(self):
        self.reg.set_PC(0xfffe)
        self.reg.set_SR(0)

    def step(self, toplevel):
        """ Ejecutar un paso desde el PC actual, luego actualizar el PC """

        try:
            self.reg.set_PC(self.sim.one_step(self.reg.get_PC()))
            # Si PC == None => Lanzo excepcion, ya que no hay proxima instruccion (Se termino el programa)
            if self.reg.get_PC() == None:
                raise MemoryException()

        except MemoryException:
            dlg = Gtk.Dialog(parent=toplevel,
                             title="Fin del programa",
                             buttons=("Cancelar", Gtk.ResponseType.CANCEL,
                                      "Aceptar", Gtk.ResponseType.ACCEPT))

            dlg.set_size_request(250, 50)

            hbox = Gtk.HBox(margin=10, spacing=6)

            hbox.pack_start(Gtk.Label("¿Desea reiniciar el programa?"), True,
                            False, 0)

            hbox.show_all()

            dlg.get_content_area().add(hbox)

            if dlg.run() == Gtk.ResponseType.ACCEPT:
                toplevel.source.reset()

            dlg.destroy()