# HG changeset patch # User Dylan Holmes # Date 1332389941 18000 # Node ID 5e34473ac77462ad31a561ca48b28a535e503e75 # Parent d63886d63b2f28d37f428bb851c17346bb9414ac merged assembly diff -r d63886d63b2f -r 5e34473ac774 clojure/com/aurellem/gb/assembly.clj --- a/clojure/com/aurellem/gb/assembly.clj Wed Mar 21 23:02:45 2012 -0500 +++ b/clojure/com/aurellem/gb/assembly.clj Wed Mar 21 23:19:01 2012 -0500 @@ -406,6 +406,11 @@ (set-state! (input-number)) (dotimes [_ 90000] (step (view-memory @current-state 0xD352)))) + + + + + (defn write-memory-assembly* "A program for altering in-game memory by pressing buttons." [] @@ -419,22 +424,25 @@ 0xF1 ;; pop AF (vblank prev) [D320] 0x2F ;; invert A - 0x47 ;; A -> B + 0x4F ;; A -> C 0xF0 ;; copy STAT into A 0x41 - 0xCB ;; swap A nybbles; now A_0 is (VB==1). - 0x37 - + 0x47 ;; A->B + 0x1F ;; rotate A right + 0x2F ;; complement A + 0xA0 ;; A & B --> A + 0xF5 ;; push AF (vbprev) - 0xA0 ;; A & B --> A. Now A_0 contains "increment?" + 0xA1 ;; A & C --> A. Now A_0 contains "increment?" 0xCB ;; test A_0. this result will be used twice. 0x47 + 0x28 ;; end frame (JUMP) if A_0 = 0. - 0x00 ;; TODO: set jump length + 0xF3 ;; TODO: set jump length ;; -------- GET BUTTON INPUT @@ -470,8 +478,8 @@ 0xBF ;; compare(A,A) sets Z=0 - 0x18 ;; JUMP back to "load A into [FF00]" [20 steps?] - 0xED + 0x18 ;; JUMP back to "load A into [FF00]" + 0xEF ;; ------ TAKE ACTION BASED ON USER INPUT @@ -556,6 +564,59 @@ (IE! 0) (inject-item-assembly (write-memory-assembly*)))) +(defn ntick [s n] + (if (zero? n) s + (do + (set-state! s) + (dorun (dotimes [_ n] + (com.aurellem.gb.Gb/tick))) + (update-state)))) + + +(defn find-frame-shift [state] + ;;(restart!) + (set-state! state) + (loop [n 0] + (if (>= (first (registers)) 0xD32D) + (do (println n) + (update-state)) + (do + (com.aurellem.gb.Gb/tick) + (recur (inc n) ))))) + +(defn demo-assembly [n] + (repeat n 0x00)) + + +(defn find-frame-shift* [state] + (set-state! state) + (loop [] + (com.aurellem.gb.Gb/tick) + ;;(println (first (registers))) + (if (>= (first (registers)) 0xD32D) + (update-state) + (recur)))) + + +(defn dylan** + ([k] + (-> + (tick (mid-game)) + (inject-item-assembly(write-memory-assembly*)) + ;;(find-frame-shift) + (ntick k) + (d-tick) + (view-register "A" A) + (view-register "B" B) + (view-register "D" D) + (view-register "E" E) + (view-register "F" F) + (#(do (println) %)) + )) + ([] (dylan** 0))) + + + (defn dylan* [] (->