rlm@68
|
1 (ns com.aurellem.vbm
|
rlm@68
|
2 (:import java.io.File)
|
rlm@68
|
3 (:import org.apache.commons.io.FileUtils))
|
rlm@68
|
4
|
rlm@68
|
5 (defn vbm-bytes [#^File vbm]
|
rlm@68
|
6 (let [bytes (FileUtils/readFileToByteArray vbm)
|
rlm@68
|
7 ints (int-array (count bytes))]
|
rlm@68
|
8 (areduce bytes idx _ nil
|
rlm@68
|
9 (aset ints idx
|
rlm@68
|
10 (bit-and 0xFF (aget bytes idx))))
|
rlm@68
|
11 ints))
|
rlm@68
|
12
|
rlm@68
|
13 (def button-mask
|
rlm@68
|
14 {;; main buttons
|
rlm@68
|
15 :a 0x0001
|
rlm@68
|
16 :b 0x0002
|
rlm@68
|
17
|
rlm@68
|
18 ;; directional pad
|
rlm@68
|
19 :r 0x0010
|
rlm@68
|
20 :l 0x0020
|
rlm@68
|
21 :u 0x0040
|
rlm@68
|
22 :d 0x0080
|
rlm@68
|
23
|
rlm@68
|
24 ;; meta buttons
|
rlm@68
|
25 :select 0x0004
|
rlm@68
|
26 :start 0x0008
|
rlm@68
|
27
|
rlm@68
|
28 ;; hard reset -- not really a button
|
rlm@68
|
29 :reset 0x0800})
|
rlm@68
|
30
|
rlm@68
|
31 (defn button-code [buttons]
|
rlm@68
|
32 (reduce bit-or 0x0000 (map button-mask buttons)))
|
rlm@68
|
33
|
rlm@68
|
34 (defn buttons [mask]
|
rlm@68
|
35 (loop [buttons []
|
rlm@68
|
36 masks (seq button-mask)]
|
rlm@68
|
37 (if (empty? masks) buttons
|
rlm@68
|
38 (let [[button value] (first masks)]
|
rlm@68
|
39 (if (not= 0x0000 (bit-and value mask))
|
rlm@68
|
40 (recur (conj buttons button) (rest masks))
|
rlm@68
|
41 (recur buttons (rest masks)))))))
|
rlm@68
|
42
|
rlm@68
|
43 (def vbm-header-length 255)
|
rlm@68
|
44
|
rlm@68
|
45 (defn repair-vbm
|
rlm@68
|
46 "Two 0's must be inserted after every reset, and the first
|
rlm@68
|
47 button must be dropped"
|
rlm@68
|
48 [vbm-seq]
|
rlm@68
|
49 (loop [fixed []
|
rlm@68
|
50 pending (next vbm-seq)]
|
rlm@68
|
51 (if (empty? pending) fixed
|
rlm@68
|
52 (let [mask (first pending)]
|
rlm@68
|
53 (if (not= 0x0000 (bit-and mask (button-mask :reset)))
|
rlm@68
|
54 (recur (conj fixed mask 0x0000 0x0000) (next pending))
|
rlm@68
|
55 (recur (conj fixed mask) (next pending)))))))
|
rlm@68
|
56
|
rlm@68
|
57 (defn vbm-masks [#^File vbm]
|
rlm@68
|
58 (repair-vbm
|
rlm@68
|
59 (map (fn [[a b]]
|
rlm@68
|
60 (+ (bit-shift-left a 8) b))
|
rlm@68
|
61 (partition
|
rlm@68
|
62 2 (drop vbm-header-length (vbm-bytes vbm))))))
|
rlm@68
|
63
|
rlm@68
|
64 (defn vbm-buttons [#^File vbm]
|
rlm@68
|
65 (map buttons (vbm-masks vbm)))
|
rlm@68
|
66
|
rlm@68
|
67
|
rlm@68
|
68
|
rlm@68
|
69
|
rlm@68
|
70
|
rlm@68
|
71 |