view clojure/com/aurellem/assembly.clj @ 106:3a60bb14a64a

better functional assembly interface; removed frame numbers from SaveStates
author Robert McIntyre <rlm@mit.edu>
date Wed, 14 Mar 2012 21:37:37 -0500
parents 2f8089eacab9
children ad96e9464d6a
line wrap: on
line source
1 (ns com.aurellem.assembly
2 (:use (com.aurellem gb-driver vbm title items))
3 (:import [com.aurellem.gb_driver SaveState]))
5 (defn mid-game []
6 (read-state "mid-game"))
8 (defn inject-assembly
9 [^SaveState state
10 program-counter registers
11 assembly-code]
12 (let [scratch-memory (memory state)]
13 ;; inject assembly code
14 (dorun (map (fn [index val]
15 (aset scratch-memory index val))
16 (range program-counter
17 (+ program-counter (count assembly-code)))
18 assembly-code))
19 (-> state
20 (write-memory! scratch-memory)
21 (write-registers! registers)
22 (PC! program-counter))))
25 (defn inject-item-assembly
26 ([^SaveState state assembly-code]
27 (inject-assembly state (inc item-list-start)
28 (registers state)
29 assembly-code))
30 ([assembly-code]
31 (inject-item-assembly @current-state assembly-code)))
33 (defn info
34 ([^SaveState state]
35 (println "PC: " (PC state))
36 (println "Instruction:"
37 (format "0x%02X" (aget (memory state) (PC state))))
38 state))
40 (defn run-assembly
41 ([info-fn assembly n]
42 (let [final-state
43 (reduce (fn [state _]
44 (tick (info-fn state)))
45 (inject-item-assembly (tick (tick (tick (mid-game)))) assembly)
46 (range n))]
47 (shutdown!)
48 final-state))
49 ([assembly n]
50 (run-assembly info assembly n)))