rlm@145: (ns com.aurellem.gb.util rlm@145: (:use (com.aurellem.gb gb-driver vbm)) rlm@145: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@145: rlm@145: rlm@145: (defn A [state] rlm@145: (bit-shift-right (bit-and 0x0000FF00 (AF state)) 8)) rlm@145: rlm@145: (defn B [state] rlm@145: (bit-shift-right (bit-and 0x0000FF00 (BC state)) 8)) rlm@145: rlm@145: (defn D [state] rlm@145: (bit-shift-right (bit-and 0x0000FF00 (DE state)) 8)) rlm@145: rlm@145: (defn H [state] rlm@145: (bit-shift-right (bit-and 0x0000FF00 (HL state)) 8)) rlm@145: rlm@145: (defn C [state] rlm@145: (bit-and 0xFF (BC state))) rlm@145: (defn F [state] rlm@145: (bit-and 0xFF (AF state))) rlm@145: (defn E [state] rlm@145: (bit-and 0xFF (DE state))) rlm@145: (defn L [state] rlm@145: (bit-and 0xFF (HL state))) rlm@145: rlm@145: (defn binary-str [num] rlm@145: (format "%08d" rlm@145: (Integer/parseInt rlm@145: (Integer/toBinaryString num) 10))) rlm@145: rlm@145: (defn view-register [state name reg-fn] rlm@145: (println (format "%s: %s" name rlm@145: (binary-str (reg-fn state)))) rlm@145: state) rlm@145: rlm@145: (defn view-memory [state mem] rlm@145: (println (format "mem 0x%04X = %s" mem rlm@145: (binary-str (aget (memory state) mem)))) rlm@145: state) rlm@145: rlm@145: (defn print-listing [state begin end] rlm@145: (dorun (map rlm@145: (fn [opcode line] rlm@145: (println (format "0x%04X: 0x%02X" line opcode))) rlm@145: (subvec (vec (memory state)) begin end) rlm@145: (range begin end))) rlm@145: state) rlm@145: rlm@145: (defn print-pc [state] rlm@145: (println (format "PC: 0x%04X" (PC state))) rlm@145: state) rlm@145: rlm@145: (defn print-op [state] rlm@145: (println (format "OP: 0x%02X" (aget (memory state) (PC state)))) rlm@145: state) rlm@145: rlm@145: (defn d-tick rlm@145: ([state] rlm@145: (-> state print-pc print-op tick))) rlm@145: rlm@145: (defn print-interrupt rlm@145: [^SaveState state] rlm@145: (println (format "IE: %d" (IE state))) rlm@145: state) rlm@145: rlm@145: (defn set-memory rlm@145: ([state location value] rlm@145: (set-state! state) rlm@145: (let [mem (memory state)] rlm@145: (aset mem location value) rlm@145: (write-memory! mem) rlm@145: (update-state))) rlm@145: ([location value] rlm@145: (set-memory @current-state location value))) rlm@145: rlm@145: (defn set-memory-range rlm@145: ([state start values] rlm@145: (set-state! state) rlm@145: (let [mem (memory state)] rlm@145: rlm@145: (dorun (map (fn [index val] rlm@145: (aset mem index val)) rlm@145: (range start rlm@145: (+ start (count values))) values)) rlm@145: (write-memory! mem) rlm@145: (update-state))) rlm@145: ([start values] rlm@145: (set-memory-range rlm@145: @current-state start values))) rlm@145: rlm@145: (defn common-differences [& seqs] rlm@145: (let [backbone (range (count (first seqs)))] rlm@145: (filter rlm@145: (comp (partial apply distinct?) second) rlm@145: (zipmap backbone rlm@145: (apply (partial map list) seqs))))) rlm@145: rlm@145: (defn mid-game [] rlm@145: (read-state "mid-game"))