# HG changeset patch # User Robert McIntyre # Date 1331667601 18000 # Node ID 2f8089eacab9ce2e1a7fe6f66ddc2d21a31de9ad # Parent d2e00ea31508f85685f6a81017d5c512726ad422 working on some actual assembly programs diff -r d2e00ea31508 -r 2f8089eacab9 clojure/com/aurellem/assembly.clj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clojure/com/aurellem/assembly.clj Tue Mar 13 14:40:01 2012 -0500 @@ -0,0 +1,55 @@ +(ns com.aurellem.assembly + (:use (com.aurellem gb-driver vbm title items)) + (:import [com.aurellem.gb_driver SaveState])) + + + + +(defn inject-assembly + [^SaveState state + program-counter registers + assembly-code] + (set-state! state) + (let [scratch-memory (memory state)] + ;; inject assembly code + (dorun (map (fn [index val] + (aset scratch-memory index val)) + (range program-counter + (+ program-counter (count assembly-code))) + assembly-code)) + (write-memory! scratch-memory) + (set-state! (update-state)) + (write-registers! registers) + (set-state! (update-state)) + (PC! program-counter) + (update-state))) + +(defn inject-item-assembly + ([^SaveState state assembly-code] + (inject-assembly state (inc item-list-start) + (registers state) + assembly-code)) + ([assembly-code] + (inject-item-assembly @current-state assembly-code))) + +(defn info + ([^SaveState state] + (set-state! state) + (println "PC: " (PC)) + (println "Instruction:" (format "0x%02X" (aget (memory state) (PC)))) + state)) + +(defn irony [] (read-state 578544)) + +(defn run-assembly + ([info-fn assembly n] + (let [final-state + (reduce (fn [state _] + (tick (info-fn state))) + (inject-item-assembly (tick (tick (tick (irony)))) assembly) + (range n))] + (shutdown!) + final-state)) + ([assembly n] + (run-assembly info assembly n))) + \ No newline at end of file diff -r d2e00ea31508 -r 2f8089eacab9 clojure/com/aurellem/gb_driver.clj --- a/clojure/com/aurellem/gb_driver.clj Tue Mar 13 00:03:02 2012 -0500 +++ b/clojure/com/aurellem/gb_driver.clj Tue Mar 13 14:40:01 2012 -0500 @@ -93,8 +93,7 @@ (defn set-state! [^SaveState state] (assert (:data state) "Not a valid state!") (if (not @on?) (restart!)) - (if (not= @current-state state) - (Gb/loadState (:data state))) + (Gb/loadState (:data state)) (reset! current-state state)) (defrecord Move [keys state]) diff -r d2e00ea31508 -r 2f8089eacab9 clojure/com/aurellem/items.clj --- a/clojure/com/aurellem/items.clj Tue Mar 13 00:03:02 2012 -0500 +++ b/clojure/com/aurellem/items.clj Tue Mar 13 14:40:01 2012 -0500 @@ -196,7 +196,8 @@ (apply str (rest (str item-name))) quantity))) (range 0 (count inv)) inv) - ["+--+----------------+----------+\n"])))))) + ["+--+----------------+----------+\n"])))) + state)) (defn inventory-codes [inventory] (flatten