diff clojure/com/aurellem/gb/assembly.clj @ 183:5e34473ac774

merged assembly
author Dylan Holmes <ocsenave@gmail.com>
date Wed, 21 Mar 2012 23:19:01 -0500
parents 95b2758dd517
children d585b91de06c
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/gb/assembly.clj	Wed Mar 21 23:02:45 2012 -0500
     1.2 +++ b/clojure/com/aurellem/gb/assembly.clj	Wed Mar 21 23:19:01 2012 -0500
     1.3 @@ -406,6 +406,11 @@
     1.4    (set-state! (input-number)) 
     1.5    (dotimes [_ 90000] (step (view-memory @current-state 0xD352))))
     1.6  
     1.7 +
     1.8 +
     1.9 +
    1.10 +
    1.11 +
    1.12  (defn write-memory-assembly*
    1.13    "A program for altering in-game memory by pressing buttons."
    1.14    []
    1.15 @@ -419,22 +424,25 @@
    1.16     0xF1 ;; pop AF (vblank prev) [D320]
    1.17  
    1.18     0x2F ;; invert A
    1.19 -   0x47 ;; A -> B
    1.20 +   0x4F ;; A -> C
    1.21     
    1.22     0xF0 ;; copy STAT into A
    1.23     0x41
    1.24  
    1.25 -   0xCB ;; swap A nybbles; now A_0 is (VB==1).
    1.26 -   0x37
    1.27 -
    1.28 +   0x47 ;; A->B
    1.29 +   0x1F ;; rotate A right
    1.30 +   0x2F ;; complement A
    1.31 +   0xA0 ;; A & B --> A
    1.32 +   
    1.33     0xF5 ;; push AF (vbprev)
    1.34     
    1.35 -   0xA0 ;; A & B --> A. Now A_0 contains "increment?"
    1.36 +   0xA1 ;; A & C --> A. Now A_0 contains "increment?"
    1.37     
    1.38     0xCB ;; test A_0. this result will be used twice.
    1.39     0x47
    1.40 +   
    1.41     0x28 ;; end frame (JUMP) if A_0 = 0.  
    1.42 -   0x00 ;; TODO: set jump length
    1.43 +   0xF3 ;; TODO: set jump length
    1.44     
    1.45     ;; -------- GET BUTTON INPUT
    1.46     
    1.47 @@ -470,8 +478,8 @@
    1.48  
    1.49     0xBF ;; compare(A,A) sets Z=0
    1.50     
    1.51 -   0x18 ;; JUMP back to "load A into [FF00]" [20 steps?]
    1.52 -   0xED
    1.53 +   0x18 ;; JUMP back to "load A into [FF00]"
    1.54 +   0xEF
    1.55  
    1.56  
    1.57     ;; ------ TAKE ACTION BASED ON USER INPUT
    1.58 @@ -556,6 +564,59 @@
    1.59        (IE! 0)
    1.60        (inject-item-assembly (write-memory-assembly*))))
    1.61  
    1.62 +(defn ntick [s n]
    1.63 +  (if (zero? n) s
    1.64 +      (do
    1.65 +        (set-state! s)
    1.66 +        (dorun (dotimes [_ n] 
    1.67 +                 (com.aurellem.gb.Gb/tick)))
    1.68 +        (update-state))))
    1.69 +
    1.70 +
    1.71 +(defn find-frame-shift [state]
    1.72 +  ;;(restart!)
    1.73 +  (set-state! state)
    1.74 +  (loop [n 0]
    1.75 +    (if (>= (first (registers)) 0xD32D)
    1.76 +      (do (println n)
    1.77 +      (update-state))
    1.78 +      (do
    1.79 +        (com.aurellem.gb.Gb/tick)
    1.80 +        (recur (inc n) )))))
    1.81 +  
    1.82 +(defn demo-assembly [n]
    1.83 +  (repeat n 0x00))
    1.84 +
    1.85 +
    1.86 +(defn find-frame-shift* [state]
    1.87 +  (set-state! state)
    1.88 +  (loop []
    1.89 +    (com.aurellem.gb.Gb/tick)
    1.90 +    ;;(println (first (registers)))
    1.91 +    (if (>= (first (registers)) 0xD32D)
    1.92 +      (update-state)
    1.93 +      (recur))))
    1.94 +
    1.95 +
    1.96 +(defn dylan**
    1.97 +  ([k]
    1.98 +  (->
    1.99 +   (tick (mid-game))
   1.100 +   (inject-item-assembly(write-memory-assembly*))
   1.101 +   ;;(find-frame-shift)
   1.102 +   (ntick k)
   1.103 +   (d-tick)
   1.104 +   (view-register "A" A)
   1.105 +   (view-register "B" B)
   1.106 +   (view-register "D" D)
   1.107 +   (view-register "E" E)
   1.108 +   (view-register "F" F)
   1.109 +   (#(do (println) %))
   1.110 +   ))
   1.111 +  ([] (dylan** 0)))
   1.112 +   
   1.113 +   
   1.114 +
   1.115  
   1.116  (defn dylan* []
   1.117    (->