# HG changeset patch
# User Robert McIntyre <rlm@mit.edu>
# Date 1331526439 18000
# Node ID cb487c4ce5c087968be1b73f4b32eaa0512381d6
# Parent  b74a578d0c88a5b37452f3027e4aed6b91a824df
added write-memory!, which allows me to write any value to the
gameboy's memory-mapped rom or ram.

diff -r b74a578d0c88 -r cb487c4ce5c0 clojure/com/aurellem/gb_driver.clj
--- a/clojure/com/aurellem/gb_driver.clj	Sun Mar 11 23:10:44 2012 -0500
+++ b/clojure/com/aurellem/gb_driver.clj	Sun Mar 11 23:27:19 2012 -0500
@@ -155,6 +155,13 @@
 (def registers
   (cpu-data Gb/NUM_REGISTERS #(Gb/getRegisters %)))
 
+
+(defn write-memory! [new-memory]
+  (let [store (int-array new-memory)]
+    (assert (= Gb/GB_MEMORY) (count new-memory))
+    (Gb/writeMemory new-memory)))
+    
+
 ;; TODO add register names
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff -r b74a578d0c88 -r cb487c4ce5c0 clojure/com/aurellem/inspect.clj
--- a/clojure/com/aurellem/inspect.clj	Sun Mar 11 23:10:44 2012 -0500
+++ b/clojure/com/aurellem/inspect.clj	Sun Mar 11 23:27:19 2012 -0500
@@ -37,27 +37,27 @@
 
 ;; trying to find how items are represented in memory
 
-(def empty-inventory @current-state)
+(comment
+  (def empty-inventory @current-state)
+  
+  (def one-potion @current-state)
+  
+  (def two-potions @current-state)
+  
+  (def three-potions @current-state)
+  
+  (def four-potions @current-state)
+  
+  (def five-potions @current-state)
+  
+  
+  ;; result
+  (def canidates
+    (apply common-differences
+           (map (comp vec memory)
+                [empty-inventory one-potion two-potions three-potions
+                 four-potions five-potions])))
 
-(def one-potion @current-state)
-
-(def two-potions @current-state)
-
-(def three-potions @current-state)
-
-(def four-potions @current-state)
-
-(def five-potions @current-state)
-  
-
-;; result
-(def canidates
-  (apply common-differences
-         (map (comp vec memory)
-              [empty-inventory one-potion two-potions three-potions
-               four-potions five-potions])))
-
-(comment
   [55875 (37 15 49 27 14 44)]
   [55876 (30 1 49 56 55 23)]
   [49158 (154 191 78 135 70 73)]
diff -r b74a578d0c88 -r cb487c4ce5c0 java/src/com/aurellem/gb/Gb.java
--- a/java/src/com/aurellem/gb/Gb.java	Sun Mar 11 23:10:44 2012 -0500
+++ b/java/src/com/aurellem/gb/Gb.java	Sun Mar 11 23:27:19 2012 -0500
@@ -104,6 +104,8 @@
 
     public static native void getMemory(int[] store);
 
+    public static native void writeMemory(int[] newMemory);
+
     public static native void getRAM(int[] store);
 
     public static native void getROM(int[] store);
diff -r b74a578d0c88 -r cb487c4ce5c0 src/clojure/clojure.cpp
--- a/src/clojure/clojure.cpp	Sun Mar 11 23:10:44 2012 -0500
+++ b/src/clojure/clojure.cpp	Sun Mar 11 23:27:19 2012 -0500
@@ -143,6 +143,18 @@
   env->ReleaseIntArrayElements(arr, mem_store, 0);
 }
 
+/*
+ * Class:     com_aurellem_gb_Gb
+ * Method:    writeMemory
+ * Signature: ([I)V
+ */
+JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeMemory
+(JNIEnv *env, jclass clazz, jintArray arr){
+  jint *new_memory = env->GetIntArrayElements(arr, 0);
+  writeMemory(new_memory);
+  env->ReleaseIntArrayElements(arr, new_memory, 0);
+}
+
 
 /*
  * Class:     com_aurellem_gb_Gb
diff -r b74a578d0c88 -r cb487c4ce5c0 src/gb/GB.cpp
--- a/src/gb/GB.cpp	Sun Mar 11 23:10:44 2012 -0500
+++ b/src/gb/GB.cpp	Sun Mar 11 23:27:19 2012 -0500
@@ -3896,6 +3896,16 @@
   }
 }
 
+void writeMemory(int32* newMemory){
+  int i;
+  int j;
+  for (i = 0; i < 0x10; i++){
+    for (j = 0; j< 0x1000; j++){
+      gbMemoryMap[i][j] = (u8)(0xFF & newMemory[i*0x1000 + j]);
+    }
+  }
+}
+
 void storeRam(int32* store){
   int i;
   for (i = 0; i < gbRamSize; i++){
diff -r b74a578d0c88 -r cb487c4ce5c0 src/gb/GB.h
--- a/src/gb/GB.h	Sun Mar 11 23:10:44 2012 -0500
+++ b/src/gb/GB.h	Sun Mar 11 23:27:19 2012 -0500
@@ -48,6 +48,8 @@
 extern int getRomSize();
 
 extern void storeMemory(int32 *);
+extern void writeMemory(int32 *);
+
 extern void storeRam(int32 *);
 extern void storeRom(int32 *);
 extern void storeWRam(int32 *);