rlm@145: (ns com.aurellem.exp.assembly rlm@145: (:use (com.aurellem.gb gb-driver vbm title items)) rlm@145: (:import [com.aurellem.gb.gb_driver SaveState])) rlm@145: rlm@145: rlm@145: (defn run-item-program rlm@145: "This is my first assembly/item program! rlm@145: it just increments BC by one. rlm@145: rlm@145: The code places a 3 'great balls' at the beginning of the rlm@145: inventory, then directly sets the program counter to start rlm@145: executing at the position of the 'great balls' in memory. rlm@145: rlm@145: Since a 'great ball' is represented in memory as 0x03, which rlm@145: corresponts to the opcode which increments BC by one, that is rlm@145: what happens. Then the program counter to the 0x03 quantity entry rlm@145: and BC is incremented again. rlm@145: rlm@145: Obviously, the game crashes more or less immediately after the rlm@145: program counter advances past the 'great balls' into the next items rlm@145: in the inventory, thus I call shutdown! before anything bad happens." rlm@145: [] rlm@145: (set-inventory (read-state "mid-game") [[:great-ball 3]]) rlm@145: (print-inventory) rlm@145: (println "3 ticks") (tick) (tick) (tick) rlm@145: (println "PC before:" (PC)) rlm@145: (println "BC before:" (BC)) rlm@145: (PC! (inc item-list-start)) rlm@145: (println "PC after setting:" (PC)) rlm@145: (println "data at PC:" (aget (memory) (PC))) rlm@145: (println "one tick") rlm@145: (tick) rlm@145: (println "PC after one tick:" (PC)) rlm@145: (println "BC after one tick:" (BC)) rlm@145: (tick) rlm@145: (println "PC after two ticks:" (PC)) rlm@145: (println "BC after two ticks:" (BC)) rlm@145: rlm@145: (shutdown!)) rlm@145: rlm@145: rlm@145: rlm@145: rlm@145: (defn test-opcodes-1 rlm@145: [] rlm@145: (let [final-state rlm@145: (-> rlm@145: (read-state "mid-game") rlm@145: (set-inv-mem rlm@145: [20 0x02 0x00 0x00 0x02 0x00 0x00 rlm@145: 0x00 0x0 0xFF]) rlm@145: (print-inventory) rlm@145: ;;((fn [_] (println "3 ticks") _)) rlm@145: (tick) (tick) (tick) rlm@145: rlm@145: ;;(println "PC before:" (PC)) rlm@145: ;;(println "BC before:" (BC)) rlm@145: ;;(println "AF:" (AF)) rlm@145: (PC! (inc item-list-start)) rlm@145: (BC! (+ 1 item-list-start)) rlm@145: ;;(println "PC after setting:" (PC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: rlm@145: ;;(println "one tick") rlm@145: (tick) rlm@145: ;;(println "PC after one tick:" (PC)) rlm@145: ;;(println "BC after one tick:" (BC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: (tick) rlm@145: (AF! 0xFFFF) rlm@145: ;;(println "PC after two ticks:" (PC)) rlm@145: ;;(println "BC after two ticks:" (BC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: (tick) rlm@145: ;;(println "PC after three ticks:" (PC)) rlm@145: ;;(println "BC after three ticks:" (BC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: (tick) rlm@145: ;;(println "PC after four ticks:" (PC)) rlm@145: ;;(println "BC after four ticks:" (BC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: (tick) rlm@145: ;;(println "PC after five ticks:" (PC)) rlm@145: ;;(println "BC after five ticks:" (BC)) rlm@145: ;;(println "data at PC:" (aget (memory) (PC))) rlm@145: ;;(println "data at " (BC) "(BC):" (aget (memory) (BC))) rlm@145: (print-inventory) rlm@145: )] rlm@145: rlm@145: (shutdown!) rlm@145: final-state)) rlm@145: rlm@145: rlm@145: rlm@145: (defn test-opcodes-2 rlm@145: [] rlm@145: (set-inv-mem (read-state "mid-game") rlm@145: [20 0x08 0x1D 0xD3 0x00 0x00 0x00 rlm@145: 0x00 0x0 0xFF]) rlm@145: (print-inventory) rlm@145: (println "3 ticks") (tick) (tick) (tick) rlm@145: (println "PC before:" (PC)) rlm@145: (println "SP:" (SP)) rlm@145: (PC! (inc item-list-start)) rlm@145: (println "PC after setting:" (PC)) rlm@145: (println "SP:" (Integer/toBinaryString (SP))) rlm@145: (println "data at PC:" (aget (memory) (PC))) rlm@145: (println "data at 0xD31D:" (Integer/toBinaryString (aget (memory) 0xD31D))) rlm@145: (println "data at 0xD31E:" (Integer/toBinaryString (aget (memory) 0xD31E))) rlm@145: (println "one tick") rlm@145: (tick) rlm@145: (println "PC after one tick:" (PC)) rlm@145: (println "data at PC:" (aget (memory) (PC))) rlm@145: (println "data at 0xD31D:" (Integer/toBinaryString (aget (memory) 0xD31D))) rlm@145: (println "data at 0xD31E:" (Integer/toBinaryString (aget (memory) 0xD31E))) rlm@145: (tick) (tick) (tick) rlm@145: (println "PC aftter four tick:" (PC)) rlm@145: (println "data at PC:" (aget (memory) (PC))) rlm@145: (println "data at 0xD31D:" (aget (memory) 0xD31D)) rlm@145: rlm@145: (print-inventory) rlm@145: (shutdown!)) rlm@145: