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