rlm@68: (ns com.aurellem.vbm rlm@68: (:import java.io.File) rlm@71: (:import org.apache.commons.io.FileUtils) rlm@71: (:use com.aurellem.gb-driver)) rlm@68: rlm@68: (defn vbm-bytes [#^File vbm] rlm@68: (let [bytes (FileUtils/readFileToByteArray vbm) rlm@68: ints (int-array (count bytes))] rlm@68: (areduce bytes idx _ nil rlm@68: (aset ints idx rlm@68: (bit-and 0xFF (aget bytes idx)))) rlm@68: ints)) rlm@68: rlm@68: (def vbm-header-length 255) rlm@68: rlm@68: (defn repair-vbm rlm@70: "Two 0's must be inserted after every reset." rlm@68: [vbm-seq] rlm@68: (loop [fixed [] rlm@70: pending vbm-seq] rlm@68: (if (empty? pending) fixed rlm@68: (let [mask (first pending)] rlm@71: (if (not= 0x0000 (bit-and mask (button-code :reset))) rlm@68: (recur (conj fixed mask 0x0000 0x0000) (next pending)) rlm@68: (recur (conj fixed mask) (next pending))))))) rlm@68: rlm@68: (defn vbm-masks [#^File vbm] rlm@68: (repair-vbm rlm@68: (map (fn [[a b]] rlm@68: (+ (bit-shift-left a 8) b)) rlm@68: (partition rlm@68: 2 (drop vbm-header-length (vbm-bytes vbm)))))) rlm@68: rlm@68: (defn vbm-buttons [#^File vbm] rlm@68: (map buttons (vbm-masks vbm))) rlm@68: rlm@71: (defn play-vbm [#^File vbm] rlm@71: (reset) rlm@71: (dorun (map step (vbm-masks vbm)))) rlm@68: rlm@68: rlm@68: rlm@68: rlm@68: