diff clojure/com/aurellem/assembly.clj @ 124:f8dadd9478a5

fixed problem with mode transitions
author Robert McIntyre <rlm@mit.edu>
date Sat, 17 Mar 2012 01:23:47 -0500
parents c9a280b8bd1c
children d2e00c923bad
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/assembly.clj	Sat Mar 17 00:29:34 2012 -0500
     1.2 +++ b/clojure/com/aurellem/assembly.clj	Sat Mar 17 01:23:47 2012 -0500
     1.3 @@ -82,11 +82,10 @@
     1.4    state)
     1.5  
     1.6  (defn trace [state]
     1.7 -  (loop [program-counters []
     1.8 -         opcodes []]
     1.9 +  (loop [program-counters [(first (registers @current-state)) ]
    1.10 +         opcodes [(aget (memory @current-state) (PC @current-state))]]
    1.11      (let [frame-boundary?
    1.12            (com.aurellem.gb.Gb/tick)]
    1.13 -      (println (count opcodes))
    1.14        (if frame-boundary?
    1.15          [program-counters opcodes]
    1.16          (recur
    1.17 @@ -95,7 +94,13 @@
    1.18           (conj opcodes
    1.19                 (aget (memory @current-state)
    1.20                       (PC @current-state))))))))
    1.21 -  
    1.22 +
    1.23 +(defn print-trace [state n]
    1.24 +  (let [[program-counters opcodes] (trace state)]
    1.25 +    (dorun (map (fn [pc op] (println (format "%04X: 0x%02X" pc op)))
    1.26 +                (take n program-counters)
    1.27 +                (take n opcodes)))))
    1.28 +
    1.29  (defn good-trace []
    1.30    (-> (mid-game) (tick) (IE! 0)
    1.31        (set-inv-mem [0x00 0x00 0X00 0x00])
    1.32 @@ -441,6 +446,7 @@
    1.33    (dotimes [_ 90000] (step (view-memory @current-state 0xD352))))
    1.34  
    1.35  (defn write-memory-assembly []
    1.36 + 
    1.37    [
    1.38     ;; Main Timing Loop
    1.39     ;;   Constantly check for v-blank and Trigger main state machine on
    1.40 @@ -461,14 +467,14 @@
    1.41     0x4F   ; D325                  
    1.42  
    1.43     0xC2   ; D326                  ; if bit-1 is not 0, then
    1.44 -   0x44   ; D327                  ; GOTO non-v-blank.
    1.45 +   0x3E   ; D327                  ; GOTO non-v-blank.
    1.46     0xD3   ; D328                  
    1.47  
    1.48     0xCB   ; D329                  
    1.49     0x47   ; D32A                  
    1.50  
    1.51     0xCA   ; D32B                  ; if bit-0 is not 1, then
    1.52 -   0x44   ; D32C                  ; GOTO non-v-blank.
    1.53 +   0x3E   ; D32C                  ; GOTO non-v-blank.
    1.54     0xD3   ; D32D                  
    1.55  
    1.56     ;; V-Blank
    1.57 @@ -478,19 +484,19 @@
    1.58     0x20   ; D32F                  
    1.59     0xD3   ; D330                  
    1.60  
    1.61 -   0xFE   ; D331                  ; compare A to 0.
    1.62 -   0x00   ; D332                  
    1.63 -
    1.64 -   ;;   set v-blank-prev to 1.
    1.65 -   0x3E   ; D333                  ; load 1 into A.
    1.66 -   0x01   ; D334
    1.67 -   
    1.68 -   0xEA   ; D335                  ; load A into v-blank-prev
    1.69 -   0x20   ; D336                  
    1.70 -   0xD3   ; D337
    1.71 -
    1.72 -   ;;   if v-blank-prev was 0, activate state-machine
    1.73 -   0xC2   ; D338                  ; if v-blank-prev 
    1.74 +   0xFE   ; D331                  ; compare A to 0. >--------\ 
    1.75 +   0x00   ; D332                                              \
    1.76 +                                  ;                           |
    1.77 +   ;;   set v-blank-prev to 1.                                |
    1.78 +   0x3E   ; D333                  ; load 1 into A.            |
    1.79 +   0x01   ; D334                                              | 
    1.80 +                                  ;                           |
    1.81 +   0xEA   ; D335                  ; load A into v-blank-prev  |
    1.82 +   0x20   ; D336                                              |
    1.83 +   0xD3   ; D337                                              |
    1.84 +                                  ;                           /
    1.85 +   ;;   if v-blank-prev was 0, activate state-machine <------/
    1.86 +   0xCA   ; D338                  ; if v-blank-prev 
    1.87     0x46   ; D339                  ;   was 0, 
    1.88     0xD3   ; D33A                  ; GOTO state-machine
    1.89  
    1.90 @@ -513,6 +519,7 @@
    1.91     0xD3   ; D345                  ; GOTO beginning
    1.92     ;; END Not-V-Blank
    1.93  
    1.94 +   
    1.95     ;; Main State Machine -- Input Section
    1.96     ;;   This is called once every frame.
    1.97     ;;   It collects input and uses it to drive the
    1.98 @@ -533,10 +540,9 @@
    1.99  
   1.100  
   1.101     ;;;;;;;;;  BEGIN RLM DEBUG
   1.102 -   0xC3 ;; jump to beginning
   1.103 -   0x1D
   1.104 -   0xD3
   1.105 -   
   1.106 +   ;;0xC3 ;; jump to beginning
   1.107 +   ;;0x1D
   1.108 +   ;;0xD3
   1.109     ;;;;;;;;;  END RLM DEBUG
   1.110  
   1.111     
   1.112 @@ -600,9 +606,9 @@
   1.113     0x52   ;D373
   1.114     0xD3   ;D374
   1.115  
   1.116 -   0xC3   ;D375                    ; secret jump :)
   1.117 -   0x1D   ;D376
   1.118 -   0xD3   ;D377
   1.119 +   0x00   ;D375                  
   1.120 +   0x00   ;D376
   1.121 +   0x00   ;D377
   1.122     0x00   ;D378
   1.123     0x00   ;D379
   1.124     0x00   ;D37A
   1.125 @@ -779,6 +785,9 @@
   1.126  (def frame-count 0xD31F)
   1.127  (def input 0xD352)
   1.128  (def current-mode 0xD382)
   1.129 +(def bytes-to-write 0xD383)
   1.130 +(def start-point 0xD384)
   1.131 +
   1.132  
   1.133  (defn write-memory []
   1.134    (-> (tick (mid-game))
   1.135 @@ -805,6 +814,31 @@
   1.136     (step [])
   1.137     (view-memory frame-count)))
   1.138  
   1.139 +(defn test-mode-2 []
   1.140 +  (->
   1.141 +   (write-memory)
   1.142 +   (view-memory current-mode)
   1.143 +   (step [])
   1.144 +   (step [])
   1.145 +   (step [])
   1.146 +   (#(do (println "after three steps") %))
   1.147 +   (view-memory current-mode)
   1.148 +   (step [:a])
   1.149 +   (#(do (println "step with [:a]") %))
   1.150 +   (view-memory current-mode)
   1.151 +   (view-memory bytes-to-write)
   1.152 +   (view-memory start-point)
   1.153 +   (#(do (println "step with [:u :d :l :r]")%))
   1.154 +   (step [:u :d])
   1.155 +   (view-memory current-mode)
   1.156 +   (view-memory bytes-to-write)
   1.157 +   (view-memory start-point)
   1.158 +   (#(do (println "step with [:u :d]")%))
   1.159 +   (step [:u :d])
   1.160 +   (view-memory current-mode)
   1.161 +   (view-memory bytes-to-write)
   1.162 +   (view-memory start-point)
   1.163  
   1.164 +   ))
   1.165  
   1.166