1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

use crate::vm::*;

pub fn is_instruction_valid(op_code: char) -> bool {
     for code in VM_INSTRUCTIONS.iter() {
         if *code == op_code {
             return true
         }
     }
    false
}

pub fn rotr(i: i32) -> i32 {  i / 3 + i % 3 * 19683 }

pub fn crz_op(x: usize, y: usize) -> usize {
        let mut i: usize = 0;

        const p9: [usize; 5] = [1, 9, 81, 729, 6561];

        const o_table: [[usize; 9]; 9] = [
            [4, 3, 3, 1, 0, 0, 1, 0, 0],
            [4, 3, 5, 1, 0, 2, 1, 0, 2],
            [5, 5, 4, 2, 2, 1, 2, 2, 1],
            [4, 3, 3, 1, 0, 0, 7, 6, 6],
            [4, 3, 5, 1, 0, 2, 7, 6, 8],
            [5, 5, 4, 2, 2, 1, 8, 8, 7],
            [7, 6, 6, 7, 6, 6, 4, 3, 3],
            [7, 6, 8, 7, 6, 8, 4, 3, 5],
            [8, 8, 7, 8, 8, 7, 5, 5, 4],
        ];

        for index in 0..5 {
            let s = y / p9[index] % 9;

            let d = x / p9[index] % 9;

            let oa = o_table[s][d];

            let oz = oa * p9[index];

            i += oz;
        }
        i
    }