# HG changeset patch # User Robert McIntyre # Date 1331573824 18000 # Node ID 2090bcb78f44e9478e5cd5bb7dcd408aa08cf266 # Parent 9fad96094950b555f9770644348fa48e039ca24b created functions to get and set register values diff -r 9fad96094950 -r 2090bcb78f44 clojure/com/aurellem/gb_driver.clj --- a/clojure/com/aurellem/gb_driver.clj Mon Mar 12 09:59:26 2012 -0500 +++ b/clojure/com/aurellem/gb_driver.clj Mon Mar 12 12:37:04 2012 -0500 @@ -114,6 +114,13 @@ (step state [:listen])) ([] (step (if @current-state @current-state (root))))) +(defn tick + ([] (tick @current-state)) + ([state] + (set-state! state) + (Gb/tick) + (update-state))) + (defn move [^Move move buttons] (Move. (step (:state move) buttons) buttons)) @@ -142,6 +149,12 @@ ([state] (set-state! state) (arr-fn store) store)))) +(defn write-cpu-data [size store-fn] + (fn [new-data] + (let [store (int-array new-data)] + (assert (= size (count new-data))) + (store-fn store)))) + (def memory (cpu-data Gb/GB_MEMORY #(Gb/getMemory %))) @@ -160,26 +173,56 @@ (def registers (cpu-data Gb/NUM_REGISTERS #(Gb/getRegisters %))) +(def write-memory! + (write-cpu-data Gb/GB_MEMORY #(Gb/writeMemory %))) -(defn write-memory! [new-memory] - (let [store (int-array new-memory)] - (assert (= Gb/GB_MEMORY) (count new-memory)) - (Gb/writeMemory new-memory))) +(def write-registers! + (write-cpu-data Gb/NUM_REGISTERS #(Gb/writeRegisters %))) + +;; (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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn AF [state] - (nth (registers state) 2)) +(defmacro gen-get-set-register [name index] + (let [name-bang (symbol (str name "!"))] + `(do + (defn ~name + ~(str "Retrieve the " name " register from state, or " + "from @current-state if state is absent.") + ([state#] + (nth (registers state#) ~index)) + ([] + (~name @current-state))) + (defn ~name-bang + ~(str "Set the " name " register for state, or " + "for @current-state if state is absent.") + ([state# new-register#] + (set-state! state#) + (let [registers# (registers state#)] + (aset registers# ~index new-register#) + (Gb/writeRegisters registers#) + (update-state))) + ([new-register#] + (~name-bang @current-state new-register#)))))) + -(defn BC [state] - (nth (registers state) 3)) -(defn DE [state] - (nth (registers state) 4)) - +(gen-get-set-register PC 0) +(gen-get-set-register SP 1) +(gen-get-set-register AF 2) +(gen-get-set-register BC 3) +(gen-get-set-register DE 4) +(gen-get-set-register HL 5) +(gen-get-set-register IFF 6) + + + ;;;;;;;;;;;;;;; (defmacro defn-memo diff -r 9fad96094950 -r 2090bcb78f44 clojure/com/aurellem/items.clj --- a/clojure/com/aurellem/items.clj Mon Mar 12 09:59:26 2012 -0500 +++ b/clojure/com/aurellem/items.clj Mon Mar 12 12:37:04 2012 -0500 @@ -12,7 +12,7 @@ (subvec (vec (memory state)) item-list-start - (+ item-list-start 60))) + (+ item-list-start 150))) (def item-hack-3 (read-state 77557)) diff -r 9fad96094950 -r 2090bcb78f44 java/src/com/aurellem/gb/Gb.java --- a/java/src/com/aurellem/gb/Gb.java Mon Mar 12 09:59:26 2012 -0500 +++ b/java/src/com/aurellem/gb/Gb.java Mon Mar 12 12:37:04 2012 -0500 @@ -98,7 +98,7 @@ public static final int ROM_SIZE = 0x100000; - public static final int NUM_REGISTERS = 27; + public static final int NUM_REGISTERS = 28; public static final int GB_MEMORY = 0x10000; @@ -115,4 +115,7 @@ public static native void getVRAM(int[] store); public static native void getRegisters(int[] store); + + public static native void writeRegisters(int[] newRegisters); + } diff -r 9fad96094950 -r 2090bcb78f44 src/clojure/clojure.cpp --- a/src/clojure/clojure.cpp Mon Mar 12 09:59:26 2012 -0500 +++ b/src/clojure/clojure.cpp Mon Mar 12 12:37:04 2012 -0500 @@ -221,3 +221,15 @@ } +/* + * Class: com_aurellem_gb_Gb + * Method: writeRegisters + * Signature: ([I)V + */ +JNIEXPORT void JNICALL Java_com_aurellem_gb_Gb_writeRegisters +(JNIEnv *env, jclass clazz, jintArray arr){ + jint *new_registers = env->GetIntArrayElements(arr, 0); + setRegisters(new_registers); + env->ReleaseIntArrayElements(arr, new_registers, 0); +} + diff -r 9fad96094950 -r 2090bcb78f44 src/gb/GB.cpp --- a/src/gb/GB.cpp Mon Mar 12 09:59:26 2012 -0500 +++ b/src/gb/GB.cpp Mon Mar 12 12:37:04 2012 -0500 @@ -3934,6 +3934,7 @@ } } + void storeRegisters(int32* store){ store[0] = (int32) PC.W; store[1] = (int32) SP.W; @@ -3941,28 +3942,64 @@ store[3] = (int32) BC.W; store[4] = (int32) DE.W; store[5] = (int32) HL.W; - store[6] = (int32) register_DIV; - store[7] = (int32) register_TIMA; - store[8] = (int32) register_TMA; - store[9] = (int32) register_TAC; - store[10] = (int32) register_IF; - store[11] = (int32) register_LCDC; - store[12] = (int32) register_STAT; - store[13] = (int32) register_SCY; - store[14] = (int32) register_SCX; - store[15] = (int32) register_LY; - store[16] = (int32) register_LYC; - store[17] = (int32) register_DMA; - store[18] = (int32) register_WY; - store[19] = (int32) register_WX; - store[20] = (int32) register_VBK; - store[21] = (int32) register_HDMA1; - store[22] = (int32) register_HDMA2; - store[23] = (int32) register_HDMA3; - store[24] = (int32) register_HDMA4; - store[25] = (int32) register_HDMA5; - store[26] = (int32) register_SVBK; - store[27] = (int32) register_IE; + + store[6] = (int32) IFF; + + store[7] = (int32) register_DIV; + store[8] = (int32) register_TIMA; + store[9] = (int32) register_TMA; + store[10] = (int32) register_TAC; + store[11] = (int32) register_IF; + store[12] = (int32) register_LCDC; + store[13] = (int32) register_STAT; + store[14] = (int32) register_SCY; + store[15] = (int32) register_SCX; + store[16] = (int32) register_LY; + store[17] = (int32) register_LYC; + store[18] = (int32) register_DMA; + store[19] = (int32) register_WY; + store[20] = (int32) register_WX; + store[21] = (int32) register_VBK; + store[22] = (int32) register_HDMA1; + store[23] = (int32) register_HDMA2; + store[24] = (int32) register_HDMA3; + store[25] = (int32) register_HDMA4; + store[26] = (int32) register_HDMA5; + store[27] = (int32) register_SVBK; + store[28] = (int32) register_IE; +} + +void setRegisters(int32* registers){ + PC.W = (u16) (0xFFFF & registers[0]); + SP.W = (u16) (0xFFFF & registers[1]); + AF.W = (u16) (0xFFFF & registers[2]); + BC.W = (u16) (0xFFFF & registers[3]); + DE.W = (u16) (0xFFFF & registers[4]); + HL.W = (u16) (0xFFFF & registers[5]); + IFF = (u16) (0xFFFF & registers[6]); + + register_DIV = (u8) (0xFF & registers[7]); + register_TIMA = (u8) (0xFF & registers[8]); + register_TMA = (u8) (0xFF & registers[9]); + register_TAC = (u8) (0xFF & registers[10]); + register_IF = (u8) (0xFF & registers[11]); + register_LCDC = (u8) (0xFF & registers[12]); + register_STAT = (u8) (0xFF & registers[13]); + register_SCY = (u8) (0xFF & registers[14]); + register_SCX = (u8) (0xFF & registers[15]); + register_LY = (u8) (0xFF & registers[16]); + register_LYC = (u8) (0xFF & registers[17]); + register_DMA = (u8) (0xFF & registers[18]); + register_WY = (u8) (0xFF & registers[19]); + register_WX = (u8) (0xFF & registers[20]); + register_VBK = (u8) (0xFF & registers[21]); + register_HDMA1 = (u8) (0xFF & registers[22]); + register_HDMA2 = (u8) (0xFF & registers[23]); + register_HDMA3 = (u8) (0xFF & registers[24]); + register_HDMA4 = (u8) (0xFF & registers[25]); + register_HDMA5 = (u8) (0xFF & registers[26]); + register_SVBK = (u8) (0xFF & registers[27]); + register_IE = (u8) (0xFF & registers[28]); } struct EmulatedSystem GBSystem = diff -r 9fad96094950 -r 2090bcb78f44 src/gb/GB.h --- a/src/gb/GB.h Mon Mar 12 09:59:26 2012 -0500 +++ b/src/gb/GB.h Mon Mar 12 12:37:04 2012 -0500 @@ -55,6 +55,8 @@ extern void storeWRam(int32 *); extern void storeVRam(int32 *); extern void storeRegisters(int32 *); +extern void setRegisters(int32 *); + extern long gbWriteMemSaveStatePos(char *, int); extern struct EmulatedSystem GBSystem;