From 6095a746c3dce24f30fb3a4faa7f20149675288a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Tj=C3=A4der?= <henrik@tjaders.com> Date: Thu, 9 Nov 2017 18:58:52 +0100 Subject: [PATCH] Now codgen works --- src/main.rs | 85 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/src/main.rs b/src/main.rs index 62de534..6171a82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -145,45 +145,66 @@ static CODED: [u32; 132] = /// /// Count the number of zeroes /// -fn count_zero(num: u32) -> u32 { +fn count_zero(mut num: u32) -> u32 { - let mut count_zero = 0; - let mut count_one = 0; + let mut n = 32; - for x in 0..32 { - if num % 2 == 0 { - count_zero += 1; - } else { - count_one += 1; + while num != 0 { + if num & 1u32 == 1u32 { + n -= 1; } - num << 1; + num >>= 1; } - count_zero ^ count_one + n } /// /// Modify the seed for decoding /// +/// +///FUNCTION codgen(): UNSIGNED INTEGER; +/// LOCAL SIGNED INTEGER n; +/// LOCAL UNSIGNED INTEGER x, y; +/// BEGIN +/// n := [count the number of 0's in word "seed"]; +/// x := [rotate "seed" left by 30 bits]; +/// y := [shift "seed" right-ARITHMETIC by 6 bits]; +/// seed := x XOR y XOR n; +/// RETURN( seed XOR 0x464b713e ); +/// END; fn codgen(seed: &mut u32) -> u32 { let n: u32; let (x, y): (u32, u32); - n = count_zero(*seed); + let local_seed: u32 = seed.clone(); + + + // Send away copy of seed + //n = count_zero(local_seed); + n = local_seed.count_zeros(); + + println!("Number of zeroes: {}", n); - println!("Seed:\n{:b}", *seed); + //println!("Seed:\n{:b}", local_seed); // Inte OK än - x = seed.rotate_left(2); - println!("{:b}", x); + x = local_seed.rotate_left(30); + + // Stolen from K & H + //x = local_seed << 30 | ((local_seed>> 2) & 0x3FFFFFFF); + + //println!("{:b}", x); // Fungerade fint - y = *seed >> 6; + // Shift 6 to the right arithmetic + // Needs to be i32 to be arithmetic, testing wrapping_shr + y = ((local_seed as i32) >> 6) as u32; + //y = local_seed.wrapping_shr(6); - *seed = x ^ y ^ n; + *seed = (x ^ y ^ n) as u32; (*seed) ^ 0x464b713e - } /// @@ -191,7 +212,6 @@ fn codgen(seed: &mut u32) -> u32 { /// fn decode(coded: &[u32], plain: &mut[u8], seed: &mut u32) -> u32 { - let x = 3; x @@ -204,28 +224,29 @@ fn main() { let mut seed = 0x3e944b9f; //decode(&CODED, unsafe { &mut PLAIN }, &mut seed); - // - codgen(&mut seed); - println!("Ran codgen, new seed: {:x}", seed); + let mut locseed; + + locseed = codgen(&mut seed); + assert_eq!(locseed, 0x891432f9); + println!("Ran codgen, new seed: {:x}", locseed); + locseed = codgen(&mut seed); + println!("Ran codgen, new seed: {:x}", locseed); + locseed = codgen(&mut seed); + println!("Ran codgen, new seed: {:x}", locseed); + locseed = codgen(&mut seed); + println!("Ran codgen, new seed: {:x}", locseed); + locseed = codgen(&mut seed); + assert_eq!(locseed, 0xce83d1b8); + println!("Ran codgen, new seed: {:x}", locseed); } + /* # Group 1's Codeword Generator Subroutine (pseudocode) # (remember: "seed" is a global variable, UNSIGNED INTEGER; # you may implement local variables in registers or on the stack; # result returned in v0; preserve all except t regs) -# -# FUNCTION codgen(): UNSIGNED INTEGER; -# LOCAL SIGNED INTEGER n; -# LOCAL UNSIGNED INTEGER x, y; -# BEGIN -# n := [count the number of 0's in word "seed"]; -# x := [rotate "seed" left by 30 bits]; -# y := [shift "seed" right-ARITHMETIC by 6 bits]; -# seed := x XOR y XOR n; -# RETURN( seed XOR 0x464b713e ); -# END; # # hint: if "seed" is initialized to 0x3e944b9f, # the first five calls will generate these values: -- GitLab