# HG changeset patch # User Robert McIntyre # Date 1340246498 18000 # Node ID e6c02264dc9c119e6b3df047204f6b35ee27790b # Parent 24b459a95b464a0124c4efd747cbb0bb0f930b7b trying to track down pesky assembly bug. diff -r 24b459a95b46 -r e6c02264dc9c clojure/com/aurellem/run/image.clj --- a/clojure/com/aurellem/run/image.clj Wed Jun 20 19:51:50 2012 -0500 +++ b/clojure/com/aurellem/run/image.clj Wed Jun 20 21:41:38 2012 -0500 @@ -427,9 +427,78 @@ (map row->bits (partition 8 tile)))))) - -(defn display-image-kernel [^BufferedImage image] +(defn write-data + "Efficient assembly to write a sequence of values to + memory, starting at a target address." + [base-address target-address data] + (let [len (count data)] + (flatten + (if (<= len 255) + [0x21 ;; load data address start into HL + (reverse (disect-bytes-2 (+ 16 base-address))) + + 0x01 ;; load target address into BC + (reverse (disect-bytes-2 target-address)) + + 0x16 ;; load len into D + len + + + ;; data x-fer loop start + 0x2A ;; (HL) -> A; HL++; + 0x02 ;; A -> (BC); + 0x03 ;; INC BC; + 0x15 ;; DEC D + + 0x20 ;; if D is not now 0, + (->signed-8-bit -6) ;; GOTO start + + 0x18 + len + + data] + (let [first-part (write-data base-address target-address + (take 255 data))] + [first-part + (write-data (+ base-address (count first-part)) + (+ target-address 255) + (drop 255 data))]))))) + +(defn test-write-data [] + (let [test-data (repeat 3 0xD3) + base-address 0xA000 + target-address 0xA500 + + test-kernel + (flatten + [0xF3 ;; disable interrupts + (write-data (+ 1 base-address) + target-address test-data) + (infinite-loop)])] +;; (assert + ;; (= test-data + (-> (mid-game) + tick tick tick + (set-memory-range base-address test-kernel) + (PC! base-address) + + ;;(run-moves (repeat 100 [])) + ;;(memory) + ;;vec + ;;(subvec target-address + ;; (+ target-address + ;; (count test-data))) + ;;println + ))) + + + + + + + +(defn display-image-kernel [base-address ^BufferedImage image] (let [gb-image (image->gb-image image)] [(clear-music-registers) @@ -455,17 +524,16 @@ ;; section - ;; [ ] disable the display of OBJ tiles. ;; [ ] reactivate the LCD display - (infinite-loop) + (infinite-loop)] - ) + ))