Mercurial > vba-clojure
diff clojure/com/aurellem/run/image.clj @ 512:7ba07a6adb0c
going to correct premium stupdity.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 22 Jun 2012 18:38:22 -0500 |
parents | 964957680c11 |
children | 3dbb863eb801 |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/run/image.clj Fri Jun 22 15:03:41 2012 -0500 1.2 +++ b/clojure/com/aurellem/run/image.clj Fri Jun 22 18:38:22 2012 -0500 1.3 @@ -32,17 +32,6 @@ 1.4 ;; screen. 1.5 1.6 1.7 - 1.8 - 1.9 - 1.10 - 1.11 - 1.12 - 1.13 - 1.14 - 1.15 - 1.16 - 1.17 - 1.18 (def image-program-target 0xB000) 1.19 1.20 (def display-width 160) 1.21 @@ -333,10 +322,6 @@ 1.22 [] 1.23 (sort-by (comp - count) objs))) 1.24 1.25 -(defn absorb-combine-4 [objs] 1.26 - 1.27 - ) 1.28 - 1.29 (defn palettes [^BufferedImage image] 1.30 (let [palettes (map tile->palette (gb-tiles image)) 1.31 unique-palettes (absorb-contract (set palettes))] 1.32 @@ -393,8 +378,6 @@ 1.33 (palette-index 1.34 (tile-pallete tile image-palettes))])))})) 1.35 1.36 - 1.37 - 1.38 (defn wait-until-v-blank 1.39 "Modified version of frame-metronome. waits untill LY == 144, 1.40 indicating start of v-blank period." 1.41 @@ -412,7 +395,6 @@ 1.42 (+ -4 (- (count timing-loop))))]] 1.43 (concat timing-loop continue-if-144))) 1.44 1.45 - 1.46 (def bg-character-data 0x9000) 1.47 1.48 (defn gb-tile->bytes 1.49 @@ -442,7 +424,6 @@ 1.50 (map row->bits 1.51 (partition 8 tile)))))) 1.52 1.53 - 1.54 (defn write-data 1.55 "Efficient assembly to write a sequence of values to 1.56 memory, starting at a target address." 1.57 @@ -450,7 +431,6 @@ 1.58 (let [len (count data) 1.59 program-length 21] ;; change this if program length 1.60 ;; below changes! 1.61 - 1.62 (flatten 1.63 [0x21 ;; load data address start into HL 1.64 (reverse (disect-bytes-2 (+ base-address program-length))) 1.65 @@ -482,6 +462,75 @@ 1.66 (+ len base-address program-length))) 1.67 data]))) 1.68 1.69 +(defn write-image 1.70 + "Assume the image data is 160x144 pixels specified as 360 blocks." 1.71 + [base-address target-address image-data] 1.72 + 1.73 + (let [len (count image-data) 1.74 + gen-program 1.75 + (fn [program-length] 1.76 + (flatten 1.77 + [0x21 ;; load data address start into HL 1.78 + (reverse 1.79 + (disect-bytes-2 (+ base-address program-length))) 1.80 + 1.81 + 0x01 ;; load target address into BC 1.82 + (reverse (disect-bytes-2 target-address)) 1.83 + 1.84 + 0x1E ;; total-rows (18) -> E 1.85 + 1 1.86 + 1.87 + 0x16 ;; total columns (20) -> D 1.88 + 20 1.89 + 1.90 + ;; wite one block (8x8 pixels) to screen. 1.91 + 0x3E 1.92 + 16 ;; load 16 into A 1.93 + 1.94 + 0xF5 ;; push A 1.95 + 1.96 + ;; data x-fer loop start 1.97 + 0x2A ;; (HL) -> A; HL++; 1.98 + 0x02 ;; A -> (BC); 1.99 + 0x03 ;; INC BC; 1.100 + 1.101 + 1.102 + 0xF1 ;; pop A 1.103 + 1.104 + 0x3D ;; dec A 1.105 + 0x20 ;; 1.106 + (->signed-8-bit -8) ;; continue writing block 1.107 + 1.108 + 0x15 ;; dec D 1.109 + 0x20 1.110 + (->signed-8-bit -13) ;; continue writing row 1.111 + 1.112 + ;; row is complete, advance to next row 1.113 + ;; HL += 192 1.114 + 1.115 + 0xC5 ;; push BC 1.116 + 1.117 + 0x06 ;; 0 -> B 1.118 + 0 1.119 + 1.120 + 0x0E 1.121 + 0 ;; 192 -> C 1.122 + 1.123 + 0x09 ;; HL + BC -> HL 1.124 + 1.125 + 0xC1 ;; pop BC 1.126 + 1.127 + 0x1D ;; dec E 1.128 + 0x20 1.129 + (->signed-8-bit -23) ;; contunue writing picture 1.130 + 1.131 + 0xC3 1.132 + (reverse 1.133 + (disect-bytes-2 1.134 + (+ len base-address program-length)))]))] 1.135 + (flatten (concat 1.136 + (gen-program (count (gen-program 0))) 1.137 + image-data)))) 1.138 1.139 (defn test-write-data [] 1.140 (let [test-data (concat (range 256) 1.141 @@ -524,30 +573,30 @@ 1.142 (assert (or (= n 0) (= n 1))) 1.143 (write-byte LCD-bank-select-address n)) 1.144 1.145 +(defn write-image* [_ _ _] []) 1.146 + 1.147 (defn display-image-kernel [base-address ^BufferedImage image] 1.148 (let [gb-image (image->gb-image image) 1.149 1.150 A [(clear-music-registers) 1.151 - 1.152 + 1.153 ;; [X] disable LCD protection circuit. 1.154 (write-byte LCD-control-register 0x00) 1.155 ;; now we can write to all video RAM anytime with 1.156 ;; impunity. 1.157 1.158 - ;; we're only using background palettes; just set the 1.159 - ;; minimum required bg palettes for this image, 1.160 - ;; starting with palette #0. 1.161 + ;; [ ] We're only using background palettes; just set the 1.162 + ;; minimum required bg palettes for this image, starting 1.163 + ;; with palette #0. 1.164 1.165 (set-palettes bg-palette-select bg-palette-data 1.166 (:palettes gb-image)) 1.167 1.168 ;; [X] switch to bank 0 to set BG character data. 1.169 (select-LCD-bank 0) 1.170 - 1.171 ;; [X] set SCX and SCY to 0 1.172 (write-byte SCX-register 0) 1.173 (write-byte SCY-register 0) 1.174 - 1.175 ] 1.176 A (flatten A) 1.177 1.178 @@ -562,7 +611,7 @@ 1.179 1.180 1.181 C [;; [ ] write image to the screen in terms of tiles 1.182 - (write-data 1.183 + (write-image 1.184 (+ base-address (+ (count A) (count B))) 1.185 BG-1-address 1.186 (map first (:data gb-image)))] 1.187 @@ -571,7 +620,7 @@ 1.188 1.189 D [;; [ ] specifiy pallets for each character 1.190 (select-LCD-bank 1) 1.191 - (write-data 1.192 + (write-image 1.193 (+ base-address (+ (count A) (count B) (count C))) 1.194 BG-1-address 1.195 (map second (:data gb-image))) 1.196 @@ -595,14 +644,12 @@ 1.197 "0" ;; OBJ-on flag 1.198 "1") ;; no-effect 1.199 2)) 1.200 - 1.201 1.202 (infinite-loop)] 1.203 D (flatten D)] 1.204 1.205 (concat A B C D))) 1.206 1.207 - 1.208 (defn display-image [#^BufferedImage image] 1.209 (let [kernel-address 0xB000] 1.210 (-> (tick (tick (tick (mid-game)))) 1.211 @@ -610,6 +657,3 @@ 1.212 kernel-address 1.213 (display-image-kernel kernel-address image)) 1.214 (PC! kernel-address)))) 1.215 - 1.216 - 1.217 -