def pragmaIncbin(ppt, line, result): "Includes a binary file" filename = line.expect("STRING").value offset = IR.ConstantExpr(0) size = None if str(line.lookahead(0)) == ",": line.pop() offset = FE.parse_expr(line) if str(line.lookahead(0)) == ",": line.pop() size = FE.parse_expr(line) line.expect("EOL") if type(filename) == str: try: f = file(os.path.join(FE.context_directory, filename), "rb") if offset.hardcoded and (size is None or size.hardcoded): # We know how big it will be, we can just use the values. # First check to make sure they're sane if offset.value() < 0: Err.log("Offset may not be negative") f.close() return f.seek(0, 2) # Seek to end of file if offset.value() > f.tell(): Err.log("Offset runs past end of file") f.close() return if size is not None: if size.value() < 0: Err.log("Length may not be negative") f.close() return if offset.value() + size.value() > f.tell(): Err.log(".incbin length too long") f.close() return if size is None: size = IR.ConstantExpr(-1) f.seek(offset.value()) bytes = f.read(size.value()) bytes = [IR.ConstantExpr(ord(x)) for x in bytes] result.append(IR.Node(ppt, "Byte", *bytes)) else: # offset or length could change based on label placement. # This seems like an unbelievably bad idea, but since we # don't have constant prop it will happen for any symbolic # alias. Don't use symbolic aliases when extracting tiny # pieces out of humongous files, I guess. bytes = f.read() bytes = [IR.ConstantExpr(ord(x)) for x in bytes] if size is None: size = IR.SequenceExpr([IR.ConstantExpr(len(bytes)), "-", offset]) result.append(IR.Node(ppt, "ByteRange", offset, size, *bytes)) f.close() except IOError: Err.log("Could not read " + filename) return
def pragmaAdvance(ppt, line, result): "Outputs filler until reaching the target PC" newPC = FE.parse_expr(line) if str(line.lookahead(0)) == ",": line.pop() fillexpr = FE.parse_expr(line) else: fillexpr = IR.ConstantExpr(0) line.expect("EOL") result.append(IR.Node(ppt, "Advance", newPC, fillexpr))
def readData(line): "Read raw data from a comma-separated list" if line.lookahead(0).type == "STRING": data = [IR.ConstantExpr(ord(x)) for x in line.expect("STRING").value.translate(currentcharmap)] else: data = [FE.parse_expr(line)] next = line.expect(',', 'EOL').type while next == ',': if line.lookahead(0).type == "STRING": data.extend([IR.ConstantExpr(ord(x)) for x in line.expect("STRING").value]) else: data.append(FE.parse_expr(line)) next = line.expect(',', 'EOL').type return data
def readData(line): "Read raw data from a comma-separated list" if line.lookahead(0).type == "STRING": data = [IR.ConstantExpr(ord(x)) for x in line.expect("STRING").value] else: data = [FE.parse_expr(line)] next = line.expect(',', 'EOL').type while next == ',': if line.lookahead(0).type == "STRING": data.extend( [IR.ConstantExpr(ord(x)) for x in line.expect("STRING").value]) else: data.append(FE.parse_expr(line)) next = line.expect(',', 'EOL').type return data
def pragmaRequire(ppt, line, result): "Includes a source file at most one time" filename = str(os.path.dirname(sys.argv[1])) + os.sep + line.expect("STRING").value line.expect("EOL") if type(filename)==str: global loadedfiles if filename not in loadedfiles: loadedfiles[filename]=1 result.append(FE.parse_file(ppt,filename))
def pragmaRequire(ppt, line, result): "Includes a source file at most one time" filename = line.expect("STRING").value line.expect("EOL") if type(filename) == str: global loadedfiles if filename not in loadedfiles: loadedfiles[filename] = 1 result.append(FE.parse_file(ppt, filename))
def pragmaAlias(ppt, line, result): "Assigns an arbitrary label" lbl = line.expect("LABEL").value target = FE.parse_expr(line) result.append(IR.Node(ppt, "Label", lbl, target))
def pragmaInclude(ppt, line, result): "Includes a source file" filename = line.expect("STRING").value line.expect("EOL") if type(filename) == str: result.append(FE.parse_file(ppt, filename))
def pragmaInclude(ppt, line, result): "Includes a source file" filename = str(os.path.dirname(sys.argv[1])) + os.sep + line.expect("STRING").value line.expect("EOL") if type(filename)==str: result.append(FE.parse_file(ppt,filename))
def pragmaCheckpc(ppt, line, result): "Enforces that the PC has not exceeded a certain point" target = FE.parse_expr(line) line.expect("EOL") result.append(IR.Node(ppt, "CheckPC", target))
def pragmaRequire(ppt, line, result): "Includes a source file at most one time" filename = line.expect("STRING").value line.expect("EOL") if type(filename) == str: result.append(FE.parse_file(ppt, filename, True))
def pragmaOrg(ppt, line, result): "Relocates the PC with no output" newPC = FE.parse_expr(line) line.expect("EOL") result.append(IR.Node(ppt, "SetPC", newPC))
def pragmaAdvance(ppt, line, result): "Outputs filler until reaching the target PC" newPC = FE.parse_expr(line) line.expect("EOL") result.append(IR.Node(ppt, "Advance", newPC))