# HG changeset patch # User Robert McIntyre # Date 1340250571 18000 # Node ID b9814e3114e48160bd4ea6cfaba396fa73b1c74d # Parent d2c40a12de280b92042ddee080fca5e431a233c3 efficient data writing assembly complete. diff -r d2c40a12de28 -r b9814e3114e4 clojure/com/aurellem/run/image.clj --- a/clojure/com/aurellem/run/image.clj Wed Jun 20 22:08:56 2012 -0500 +++ b/clojure/com/aurellem/run/image.clj Wed Jun 20 22:49:31 2012 -0500 @@ -432,50 +432,53 @@ "Efficient assembly to write a sequence of values to memory, starting at a target address." [base-address target-address data] - (let [len (count data)] + (let [len (count data) + program-length 21] ;; change this if program length + ;; below changes! + (flatten - (if (<= len 255) [0x21 ;; load data address start into HL - (reverse (disect-bytes-2 (+ 16 base-address))) + (reverse (disect-bytes-2 (+ base-address program-length))) 0x01 ;; load target address into BC (reverse (disect-bytes-2 target-address)) - 0x16 ;; load len into D - len + 0x11 ;; load len into DE + (reverse (disect-bytes-2 len)) ;; data x-fer loop start 0x2A ;; (HL) -> A; HL++; 0x02 ;; A -> (BC); 0x03 ;; INC BC; - 0x15 ;; DEC D + 0x1B ;; DEC DE - 0x20 ;; if D is not now 0, - (->signed-8-bit -6) ;; GOTO start + 0xAF + 0xB2 ;; (OR D E) -> A + 0xB3 + - 0x18 - len + 0x20 ;; if DE is not now 0, + (->signed-8-bit -9) ;; GOTO start - 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))]))))) + 0xC3 + (reverse + (disect-bytes-2 + (+ len base-address program-length))) + data]))) + (defn test-write-data [] - (let [test-data [0xDE 0xAD 0xBE 0xEF] - base-address 0xA000 - target-address 0xC000 + (let [test-data (concat (range 256) + (reverse (range 256))) + base-address 0xC000 + target-address 0xD000 test-kernel (flatten [0xF3 ;; disable interrupts (write-data (+ 1 base-address) target-address test-data) - (clear-music-registers) (infinite-loop)])] (assert (= test-data @@ -483,7 +486,6 @@ tick tick tick (set-memory-range base-address test-kernel) (PC! base-address) - (run-moves (repeat 100 [])) (memory) vec @@ -491,12 +493,6 @@ (+ target-address (count test-data)))))))) - - - - - - (defn display-image-kernel [base-address ^BufferedImage image] (let [gb-image (image->gb-image image)]