diff --git a/src/main.rs b/src/main.rs index d603601..b9b6a23 100644 --- a/src/main.rs +++ b/src/main.rs @@ -55,42 +55,28 @@ fn verify_code(codes : &Vec<(u32, u32)>) -> Result<(), String> { let op_code = (first_code >> 28) as u8; match op_code { 0x0 | 0x1 |0x2 => { - if search_code { - if first_code & 0xf000000 != 0x8000000 { - return Err(format!("wrong code at line {}: need search code after search", line)); - } - search_code = false - } if pos + 2 > max_len { return Err(format!("wrong code at line {}: unexpected end", line)); } pos += 2; } 0x4 => { - if search_code { - if first_code & 0xf000000 != 0x8000000 { - return Err(format!("wrong code at line {}: need search code after search", line)); - } - search_code = false - } if pos + 4 > max_len { return Err(format!("wrong code at line {}: unexpected end", line)); } + let next_code = codes[pos + 2].1; + if next_code & 0xf0000000 != 0x40000000 { + return Err(format!("serial code error at line {}: should start with 0x4", line + 1)); + } pos += 4; } 0x5 => { - if search_code { - return Err(format!("wrong code at line {}: need search code after search", line)); - } if pos + 4 > max_len { return Err(format!("wrong code at line {}: unexpected end", line)); } pos += 4; } 0x8 => { - if search_code { - return Err(format!("wrong code at line {}: need search code after search", line)); - } let search_bytes = (first_code & 0xffff) as usize; if search_bytes == 0 { return Err(format!("wrong code at line {}: search length should not be 0", line)); @@ -104,9 +90,6 @@ fn verify_code(codes : &Vec<(u32, u32)>) -> Result<(), String> { pos += code_len; } 0xa => { - if search_code { - return Err(format!("wrong code at line {}: need search code after search", line)); - } if pos + 1 >= max_len { return Err(format!("wrong code at line {}: unexpected end", line)); } @@ -204,7 +187,14 @@ fn apply_code(patch_file : &str, codes : &Vec<(u32, u32)>) -> Result<(), String> 0x4 => { code_len = 4; let mut val = codes[pos + 1].1; - let mut addr = (first_code & 0xffffff) as usize; + let mut addr = if (first_code & 0xf000000) >= 0x8000000 { + if search_addr == None { + continue; + } + (first_code & 0xffffff) as usize + search_addr.unwrap() + } else { + (first_code & 0xffffff) as usize + }; let mut count = (codes[pos + 2].1 & 0xfff0000) >> 16; let addr_diff = codes[pos + 2].1 & 0xffff; let val_diff = codes[pos + 3].1;