# HG changeset patch # User Robert McIntyre # 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 *);