| @@ -60,8 +60,19 @@ definition movecode :: "register \<Rightarrow> register \<Rightarrow> nat list" |
| 60 | 60 | "movecode dst src = [72 + (if regno src \<ge> 8 then 4 else 0) + (if regno dst \<ge> 8 then 1 else 0), |
| 61 | 61 | 137, 192 + 8 * (regno src mod 8) + regno dst mod 8]" |
| 62 | 62 | |
| 63 | +definition extend32 :: "nat \<Rightarrow> pixel" where |
| 64 | + "extend32 n = word_of_int (signed_take_bit 31 (int n))" |
| 65 | + |
| 66 | +lemma extend32_octets [simp]: "extend32 (integer (octets 4 n)) = extend32 n" |
| 67 | +proof - |
| 68 | + have "signed_take_bit 31 (int (n mod 256 ^ 4)) = signed_take_bit 31 (int n)" |
| 69 | + by (simp add: signed_take_bit_eq_iff_take_bit_eq take_bit_eq_mod of_nat_mod) |
| 70 | + then show ?thesis by (simp add: extend32_def integer_octets) |
| 71 | +qed |
| 72 | + |
| 63 | 73 | fun encode :: "opcode \<Rightarrow> nat list" where |
| 64 | | - "encode (Immediate v) = [72,184] @ octets 8 (unat v)" |
| 74 | + "encode (Immediate v) = (if extend32 (unat v) = v then [72,199,192] @ octets 4 (unat v) |
| 75 | + else [72,184] @ octets 8 (unat v))" |
| 65 | 76 | | "encode (Push r) = pushcode r" |
| 66 | 77 | | "encode (Pop r) = popcode r" |
| 67 | 78 | | "encode (Peek i) = [72,139,132,36] @ octets 4 (8 * i)" |
| @@ -82,6 +93,9 @@ definition decode :: "nat list \<Rightarrow> (opcode \<times> nat list) option" |
| 82 | 93 | "decode bs = (if take 2 bs = [72,184] then |
| 83 | 94 | if 10 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 8 (drop 2 bs)) then |
| 84 | 95 | Some (Immediate (word_of_nat (integer (take 8 (drop 2 bs)))), drop 10 bs) else None |
| 96 | + else if take 3 bs = [72,199,192] then |
| 97 | + if 7 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 3 bs)) then |
| 98 | + Some (Immediate (extend32 (integer (take 4 (drop 3 bs)))), drop 7 bs) else None |
| 85 | 99 | else if take 4 bs = [72,139,132,36] then |
| 86 | 100 | let n = integer (take 4 (drop 4 bs)) in |
| 87 | 101 | if 8 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 4 bs)) \<and> |