| @@ -75,7 +75,8 @@ fun encode :: "opcode \<Rightarrow> nat list" where |
| 75 | 75 | else [72,184] @ octets 8 (unat v))" |
| 76 | 76 | | "encode (Push r) = pushcode r" |
| 77 | 77 | | "encode (Pop r) = popcode r" |
| 78 | | -| "encode (Peek i) = [72,139,132,36] @ octets 4 (8 * i)" |
| 78 | +| "encode (Peek i) = (if i < 16 then [72,139,68,36,8 * i] |
| 79 | + else [72,139,132,36] @ octets 4 (8 * i))" |
| 79 | 80 | | "encode (Arithmetic op) = arithmetic op" |
| 80 | 81 | | "encode Conditional = [72,133,219,72,15,69,193]" |
| 81 | 82 | | "encode (Move dst src) = movecode dst src" |
| @@ -96,6 +97,10 @@ definition decode :: "nat list \<Rightarrow> (opcode \<times> nat list) option" |
| 96 | 97 | else if take 3 bs = [72,199,192] then |
| 97 | 98 | if 7 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 3 bs)) then |
| 98 | 99 | Some (Immediate (extend32 (integer (take 4 (drop 3 bs)))), drop 7 bs) else None |
| 100 | + else if take 4 bs = [72,139,68,36] then |
| 101 | + let n = integer (take 1 (drop 4 bs)) in |
| 102 | + if 5 \<le> length bs \<and> n < 128 \<and> n mod 8 = 0 |
| 103 | + then Some (Peek (n div 8), drop 5 bs) else None |
| 99 | 104 | else if take 4 bs = [72,139,132,36] then |
| 100 | 105 | let n = integer (take 4 (drop 4 bs)) in |
| 101 | 106 | if 8 \<le> length bs \<and> list_all (\<lambda>b. b < 256) (take 4 (drop 4 bs)) \<and> |