Mercurial > vba-clojure
diff clojure/com/aurellem/gb_driver.clj @ 100:2090bcb78f44
created functions to get and set register values
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Mon, 12 Mar 2012 12:37:04 -0500 |
parents | 9fad96094950 |
children | 37711ff4a7bc |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/gb_driver.clj Mon Mar 12 09:59:26 2012 -0500 1.2 +++ b/clojure/com/aurellem/gb_driver.clj Mon Mar 12 12:37:04 2012 -0500 1.3 @@ -114,6 +114,13 @@ 1.4 (step state [:listen])) 1.5 ([] (step (if @current-state @current-state (root))))) 1.6 1.7 +(defn tick 1.8 + ([] (tick @current-state)) 1.9 + ([state] 1.10 + (set-state! state) 1.11 + (Gb/tick) 1.12 + (update-state))) 1.13 + 1.14 (defn move 1.15 [^Move move buttons] 1.16 (Move. (step (:state move) buttons) buttons)) 1.17 @@ -142,6 +149,12 @@ 1.18 ([state] 1.19 (set-state! state) (arr-fn store) store)))) 1.20 1.21 +(defn write-cpu-data [size store-fn] 1.22 + (fn [new-data] 1.23 + (let [store (int-array new-data)] 1.24 + (assert (= size (count new-data))) 1.25 + (store-fn store)))) 1.26 + 1.27 (def memory 1.28 (cpu-data Gb/GB_MEMORY #(Gb/getMemory %))) 1.29 1.30 @@ -160,26 +173,56 @@ 1.31 (def registers 1.32 (cpu-data Gb/NUM_REGISTERS #(Gb/getRegisters %))) 1.33 1.34 +(def write-memory! 1.35 + (write-cpu-data Gb/GB_MEMORY #(Gb/writeMemory %))) 1.36 1.37 -(defn write-memory! [new-memory] 1.38 - (let [store (int-array new-memory)] 1.39 - (assert (= Gb/GB_MEMORY) (count new-memory)) 1.40 - (Gb/writeMemory new-memory))) 1.41 +(def write-registers! 1.42 + (write-cpu-data Gb/NUM_REGISTERS #(Gb/writeRegisters %))) 1.43 + 1.44 +;; (defn write-memory! [new-memory] 1.45 +;; (let [store (int-array new-memory)] 1.46 +;; (assert (= Gb/GB_MEMORY) (count new-memory)) 1.47 +;; (Gb/writeMemory new-memory))) 1.48 1.49 1.50 ;; TODO add register names 1.51 1.52 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1.53 1.54 -(defn AF [state] 1.55 - (nth (registers state) 2)) 1.56 +(defmacro gen-get-set-register [name index] 1.57 + (let [name-bang (symbol (str name "!"))] 1.58 + `(do 1.59 + (defn ~name 1.60 + ~(str "Retrieve the " name " register from state, or " 1.61 + "from @current-state if state is absent.") 1.62 + ([state#] 1.63 + (nth (registers state#) ~index)) 1.64 + ([] 1.65 + (~name @current-state))) 1.66 + (defn ~name-bang 1.67 + ~(str "Set the " name " register for state, or " 1.68 + "for @current-state if state is absent.") 1.69 + ([state# new-register#] 1.70 + (set-state! state#) 1.71 + (let [registers# (registers state#)] 1.72 + (aset registers# ~index new-register#) 1.73 + (Gb/writeRegisters registers#) 1.74 + (update-state))) 1.75 + ([new-register#] 1.76 + (~name-bang @current-state new-register#)))))) 1.77 + 1.78 1.79 -(defn BC [state] 1.80 - (nth (registers state) 3)) 1.81 1.82 -(defn DE [state] 1.83 - (nth (registers state) 4)) 1.84 - 1.85 +(gen-get-set-register PC 0) 1.86 +(gen-get-set-register SP 1) 1.87 +(gen-get-set-register AF 2) 1.88 +(gen-get-set-register BC 3) 1.89 +(gen-get-set-register DE 4) 1.90 +(gen-get-set-register HL 5) 1.91 +(gen-get-set-register IFF 6) 1.92 + 1.93 + 1.94 + 1.95 ;;;;;;;;;;;;;;; 1.96 1.97 (defmacro defn-memo