# HG changeset patch # User Robert McIntyre # Date 1331799845 18000 # Node ID ad96e9464d6a2ed09393bdbc8e40adde77f4c0a6 # Parent 3a60bb14a64ae926189b9bae43e4e3b038d936c9 working on the start of the bootstrap program; expanded register array to 29 elements diff -r 3a60bb14a64a -r ad96e9464d6a clojure/com/aurellem/assembly.clj --- a/clojure/com/aurellem/assembly.clj Wed Mar 14 21:37:37 2012 -0500 +++ b/clojure/com/aurellem/assembly.clj Thu Mar 15 03:24:05 2012 -0500 @@ -6,7 +6,7 @@ (read-state "mid-game")) (defn inject-assembly - [^SaveState state + ([^SaveState state program-counter registers assembly-code] (let [scratch-memory (memory state)] @@ -20,7 +20,14 @@ (write-memory! scratch-memory) (write-registers! registers) (PC! program-counter)))) - + ;;([program-counter] + ;; (fn [^SaveState state registers assembly-code] + ;; (inject-assembly state program-counter registers assembly-code))) + ) + + +;;(def inject-assembly-item +;; (inject-assembly (inc item-list-start))) (defn inject-item-assembly ([^SaveState state assembly-code] @@ -32,20 +39,99 @@ (defn info ([^SaveState state] - (println "PC: " (PC state)) + (println (format "PC: 0x%04X" (PC state))) (println "Instruction:" (format "0x%02X" (aget (memory state) (PC state)))) state)) +(defn print-interrupt + [^SaveState state] + (println (format "IE: %d" (IE state))) + state) + (defn run-assembly ([info-fn assembly n] (let [final-state (reduce (fn [state _] (tick (info-fn state))) - (inject-item-assembly (tick (tick (tick (mid-game)))) assembly) + (inject-item-assembly + (mid-game) assembly) (range n))] - (shutdown!) final-state)) ([assembly n] (run-assembly info assembly n))) - \ No newline at end of file + + +(def buttons-port 0xFF00) + +(defn view-register [state name reg-fn] + (println (format "%s : 0x%02X" name (reg-fn state))) + state) + +(defn A [state] + (bit-shift-right (bit-and 0x0000FF00 (AF state)) 8)) + +(defn view-memory [state mem] + (println (format "mem 0x%04X = 0x%02X" mem (aget (memory state) mem))) + state) + +(defn read-buttons [] + (let [button-pressed (tick (step (mid-game) [:d]))] + (-> button-pressed + (IE! 0) + (inject-item-assembly + (concat + ;; write 00010000 to 0xFF00 to select joypad + [0x18 ;D31D ; jump over + 0x01 ;D31E ; the next 8 bits + (Integer/parseInt "00010000" 2) ;D31F data section + 0x00 ;D320 ; take a break + 0xFA ;D321 ; put DC15 into A + 0x1F ;D322 --] + 0xD3 ;D323 --] DC1F ; data section + 0x01 ;D324 ; load 0xFF00 into BC + 0x00 ;D325 + 0xFF ;D326 + 0x02 ;D327 ; load (DC1F) into FF00 + ; to select directional + ; buttons + + ] + + [])) + (info) + (tick) ;; skip over data section + (info) + (tick) ;; no-op + (info) + (view-register "Register A" A) + (tick) ;; load-data into A + (view-register "Register A" A) + (info) + (view-register "Register BC" BC) + (tick) ;; load A into 0xFF00 + (view-register "Register BC" BC) + ))) + + +(defn trace [state] + (loop [program-counters [] + opcodes []] + (let [frame-boundary? + (com.aurellem.gb.Gb/tick)] + (println (count opcodes)) + (if frame-boundary? + [program-counters opcodes] + (recur + (conj program-counters + (first (registers @current-state))) + (conj opcodes + (aget (memory @current-state) + (PC @current-state)))))))) + + +(defn good-trace [] + (-> (mid-game) (tick) (IE! 0) + (set-inv-mem [0x00 0x00 0X00 0x00]) + (PC! item-list-start)(print-interrupt) + (info) (tick) (info) (tick) (info))) \ No newline at end of file diff -r 3a60bb14a64a -r ad96e9464d6a clojure/com/aurellem/gb_driver.clj --- a/clojure/com/aurellem/gb_driver.clj Wed Mar 14 21:37:37 2012 -0500 +++ b/clojure/com/aurellem/gb_driver.clj Thu Mar 15 03:24:05 2012 -0500 @@ -116,7 +116,7 @@ (defn tick ([] (tick @current-state)) - ([state] + ([^SaveState state] (set-state! state) (Gb/tick) (update-state))) diff -r 3a60bb14a64a -r ad96e9464d6a clojure/com/aurellem/items.clj --- a/clojure/com/aurellem/items.clj Wed Mar 14 21:37:37 2012 -0500 +++ b/clojure/com/aurellem/items.clj Thu Mar 15 03:24:05 2012 -0500 @@ -14,8 +14,6 @@ item-list-start (+ item-list-start 150))) -(def item-hack-3 (read-state 77557)) - (def item-code->item-name (hash-map 0x01 :master-ball @@ -158,8 +156,7 @@ 0xFC :TM52 ;; "fly" 0xFD :TM53 ;; "surf" 0xFE :TM54 ;; "strength" - 0xFF :end-of-list-sentinel - )) + 0xFF :end-of-list-sentinel)) (def item-name->item-code (zipmap (vals item-code->item-name) diff -r 3a60bb14a64a -r ad96e9464d6a java/src/com/aurellem/gb/Gb.java --- a/java/src/com/aurellem/gb/Gb.java Wed Mar 14 21:37:37 2012 -0500 +++ b/java/src/com/aurellem/gb/Gb.java Thu Mar 15 03:24:05 2012 -0500 @@ -97,7 +97,7 @@ public static final int ROM_SIZE = 0x100000; - public static final int NUM_REGISTERS = 28; + public static final int NUM_REGISTERS = 29; public static final int GB_MEMORY = 0x10000;