Exemplo n.º 1
0
  def __init__(self, raw_mem, cpu, path_mgr):
    self.raw_mem = raw_mem
    self.ram_size = raw_mem.ram_size
    self.cpu = cpu
    self.path_mgr = path_mgr

    # create a label manager and error tracker
    self.label_mgr = LabelManager()
    self.error_tracker = ErrorTracker(cpu, self.label_mgr)
    self.label_mgr.error_tracker = self.error_tracker

    # set a label for first two dwords
    label = LabelRange("zero_page",0,8)
    self.label_mgr.add_label(label)
    
    # create memory access
    self.mem = MainMemory(self.raw_mem, self.error_tracker)
    self.mem.ctx = self

    # create memory allocator
    self.mem_begin = 0x1000
    self.alloc = MemoryAlloc(self.mem, 0, self.ram_size, self.mem_begin, self.label_mgr)
    
    # create segment loader
    self.seg_loader = SegmentLoader( self.mem, self.alloc, self.label_mgr, self.path_mgr )

    # lib manager
    self.lib_mgr = LibManager( self.label_mgr )
    
    # no current process right now
    self.process = None
    self.proc_list = []
    self.tr_list = []
Exemplo n.º 2
0
 def create_old_dos_guard(self):
   # create a guard memory for tracking invalid old dos access
   self.dos_guard_base = self.mem.reserve_special_range()
   self.dos_guard_size = 0x010000
   label = LabelRange("old_dos",self.dos_guard_base, self.dos_guard_size)
   self.label_mgr.add_label(label)
   log_mem_init.info(label)
Exemplo n.º 3
0
 def alloc_bstr(self, name, bstr):
   size = len(bstr) + 2 # front: count, end: extra zero for safety
   addr = self.alloc_mem(size)
   label = LabelRange(name, addr, size)
   self.label_mgr.add_label(label)
   self.mem.access.w_bstr(addr, bstr)
   mem = Memory(addr,size,label,self.mem.access)
   log_mem_alloc.info("alloc b_str: %s",mem)
   self.mem_objs[addr] = mem
   return mem
Exemplo n.º 4
0
 def alloc_cstr(self, name, cstr):
   size = len(cstr) + 1
   addr = self.alloc_mem(size)
   label = LabelRange(name, addr, size)
   self.label_mgr.add_label(label)
   self.mem.access.w_cstr(addr, cstr)
   mem = Memory(addr,size,label,self.mem.access)
   log_mem_alloc.info("alloc c_str: %s",mem)
   self.mem_objs[addr] = mem
   return mem
Exemplo n.º 5
0
 def alloc_memory(self, name, size, add_label=True):
   addr = self.alloc_mem(size)
   if add_label:
     label = LabelRange(name, addr, size)
     self.label_mgr.add_label(label)
   else:
     label = None
   mem = Memory(addr,size,label,self.mem.access)
   log_mem_alloc.info("alloc memory: %s",mem)
   self.mem_objs[addr] = mem
   return mem
Exemplo n.º 6
0
    def _load_seg(self, ami_bin_file, sys_bin_file):
        base_name = os.path.basename(sys_bin_file)
        hunk_file = HunkReader()

        # does file exist?
        if not os.path.isfile(sys_bin_file):
            self.error = "Can't find '%s'" % sys_bin_file
            return None

        # read hunk file
        fobj = file(sys_bin_file, "rb")
        result = hunk_file.read_file_obj(sys_bin_file, fobj, None)
        if result != Hunk.RESULT_OK:
            self.error = "Error loading '%s'" % sys_bin_file
            return None

        # build segments
        ok = hunk_file.build_segments()
        if not ok:
            self.error = "Error building segments for '%s'" % sys_bin_file
            return None

        # make sure its a loadseg()
        if hunk_file.type != Hunk.TYPE_LOADSEG:
            self.error = "File not loadSeg()able: '%s'" % sys_bin_file
            return None

        # create relocator
        relocator = HunkRelocate(hunk_file)

        # allocate segment memory
        sizes = relocator.get_sizes()
        names = relocator.get_type_names()
        seg_list = SegList(ami_bin_file, sys_bin_file)
        addrs = []
        for i in xrange(len(sizes)):
            size = sizes[i]
            seg_size = size + 4  # add segment pointer
            seg_addr = self.alloc.alloc_mem(seg_size)

            # create label
            label = None
            name = "%s_%d:%s" % (base_name, i, names[i].replace("HUNK_",
                                                                "").lower())
            if self.alloc.label_mgr != None:
                label = LabelRange(name, seg_addr, seg_size)
                self.alloc.label_mgr.add_label(label)

            seg = Segment(name, seg_addr, seg_size, label)
            seg_list.add(seg)
            addrs.append(seg.addr + 4)  # begin of segment data/code

        # relocate to addresses and return data
        datas = relocator.relocate(addrs)

        # write to allocated memory
        last_addr = None
        for i in xrange(len(sizes)):
            addr = addrs[i]
            self.mem.access.w_data(addr, datas[i])
            # write segment pointers
            if last_addr != None:
                b_addr = addr >> 2  # BCPL segment pointers
                self.mem.access.w32(last_addr - 4, b_addr)
            last_addr = addr

        return seg_list