JsonRom: will behave like an interval map and merge/overwrite segments when appropriate
This commit is contained in:
		
							parent
							
								
									955dce0812
								
							
						
					
					
						commit
						7e9ab6ce27
					
				
							
								
								
									
										27
									
								
								Rom.py
								
								
								
								
							
							
						
						
									
										27
									
								
								Rom.py
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
import bisect
 | 
			
		||||
import io
 | 
			
		||||
import json
 | 
			
		||||
import hashlib
 | 
			
		||||
| 
						 | 
				
			
			@ -27,14 +28,36 @@ class JsonRom(object):
 | 
			
		|||
    def __init__(self):
 | 
			
		||||
        self.name = None
 | 
			
		||||
        self.patches = {}
 | 
			
		||||
        self.addresses = []
 | 
			
		||||
 | 
			
		||||
    def write_byte(self, address, value):
 | 
			
		||||
        self.patches[str(address)] = [value]
 | 
			
		||||
        self.write_bytes(address, [value])
 | 
			
		||||
 | 
			
		||||
    def write_bytes(self, startaddress, values):
 | 
			
		||||
        if not values:
 | 
			
		||||
            return
 | 
			
		||||
        self.patches[str(startaddress)] = list(values)
 | 
			
		||||
        if type(values) is not list:
 | 
			
		||||
            values = list(values)
 | 
			
		||||
 | 
			
		||||
        pos = bisect.bisect_right(self.addresses, startaddress)
 | 
			
		||||
        intervalstart = self.addresses[pos-1] if pos else None
 | 
			
		||||
        intervalpatch = self.patches[str(intervalstart)] if pos else None
 | 
			
		||||
 | 
			
		||||
        if pos and startaddress <= intervalstart + len(intervalpatch): # merge with previous segment
 | 
			
		||||
            offset = startaddress - intervalstart
 | 
			
		||||
            intervalpatch[offset:offset+len(values)] = values
 | 
			
		||||
            startaddress = intervalstart
 | 
			
		||||
            values = intervalpatch
 | 
			
		||||
        else: # new segment
 | 
			
		||||
            self.addresses.insert(pos, startaddress)
 | 
			
		||||
            self.patches[str(startaddress)] = values
 | 
			
		||||
            pos = pos + 1
 | 
			
		||||
 | 
			
		||||
        while pos < len(self.addresses) and self.addresses[pos] <= startaddress + len(values): # merge the next segment into this one
 | 
			
		||||
            intervalstart = self.addresses[pos]
 | 
			
		||||
            values.extend(self.patches[str(intervalstart)][startaddress+len(values)-intervalstart:])
 | 
			
		||||
            del self.patches[str(intervalstart)]
 | 
			
		||||
            del self.addresses[pos]
 | 
			
		||||
 | 
			
		||||
    def write_to_file(self, file):
 | 
			
		||||
        with open(file, 'w') as stream:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue