Mercurial > vba-clojure
diff clojure/com/aurellem/run/adv_choreo.clj @ 553:0901694725f0
saving progress for the night.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 30 Aug 2012 14:11:11 -0500 |
parents | 9068685e7d96 |
children | 37daf1acb212 |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/run/adv_choreo.clj Thu Aug 30 12:09:15 2012 -0500 1.2 +++ b/clojure/com/aurellem/run/adv_choreo.clj Thu Aug 30 14:11:11 2012 -0500 1.3 @@ -8,6 +8,8 @@ 1.4 bootstrap-0 bootstrap-1 image 1.5 ram-display final-cut basic-choreo)) 1.6 (:require clojure.string) 1.7 + (:import java.awt.image.BufferedImage) 1.8 + (:import (javax.imageio ImageWriteParam IIOImage ImageIO)) 1.9 (:import [com.aurellem.gb.gb_driver SaveState]) 1.10 (:import java.io.File)) 1.11 1.12 @@ -36,12 +38,6 @@ 1.13 ;; Green font on black background for matrix look. 1.14 1.15 1.16 - 1.17 -;; [ ] get single long ram write. 1.18 - 1.19 - 1.20 - 1.21 - 1.22 (defn program-data [base-address] 1.23 (let [image-program 1.24 (display-image-kernel 1.25 @@ -77,13 +73,96 @@ 1.26 1.27 1.28 1.29 + 1.30 +(def glyphs 1.31 + "The sixteen 8x8 glyphs which make up the \"terminal\" font." 1.32 + (mapv #(ImageIO/read 1.33 + (File. user-home (str "proj/vba-clojure/font/" % ".png"))) 1.34 + ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "A" "B" "C" "D" "E" "F"])) 1.35 + 1.36 +(defn glyphs-init-program 1.37 + [start-address] 1.38 + (let [zero-glyph (image->gb-image (glyphs 0)) 1.39 + 1.40 + ;; write same pallet information to all pallettes 1.41 + A (flatten 1.42 + [(write-byte LCD-control-register 0x00) 1.43 + (set-palettes bg-palette-select bg-palette-data 1.44 + (repeat 8 (first (:palettes zero-glyph)))) 1.45 + (select-LCD-bank 0) 1.46 + (write-byte SCX-register 0) 1.47 + (write-byte SCY-register 0)]) 1.48 + B (flatten 1.49 + [(write-data 1.50 + (+ start-address (count A)) 1.51 + character-data-address 1.52 + (flatten 1.53 + (map (comp gb-tile->bytes first :tiles image->gb-image) 1.54 + glyphs)))])] 1.55 + (concat A B))) 1.56 + 1.57 + 1.58 +(defn glyph-display-program 1.59 + [start-address 1.60 + delay-count 1.61 + total-glyph-count] 1.62 + (glyphs-init-program start-address) ;; ONLY for testing! 1.63 + ) 1.64 + 1.65 + 1.66 +(defn glyph-bootstrap-program 1.67 + [start-address delay-count total-glyph-count] 1.68 + (let [init [0xAF 0x4F 0x47] ;; 0->A; 0->C; 0->B 1.69 + header (concat (frame-metronome) (read-user-input)) 1.70 + 1.71 + glyph-display (glyph-display-program 1.72 + (+ (count init) (count header) 1.73 + start-address) 1.74 + 0 0) ;; ONLY FOR TESTING 1.75 + 1.76 + state-machine-start-address 1.77 + (+ start-address (count init) (count header) (count glyph-display)) 1.78 + state-machine 1.79 + (bootstrap-state-machine state-machine-start-address) 1.80 + 1.81 + return-to-header 1.82 + (flatten 1.83 + [0x18 1.84 + (->signed-8-bit 1.85 + (- (count init) 1.86 + 2 ;; this command length 1.87 + 3 ;; I have no idea why we need a 3 here 1.88 + ;; need to investigate. 1.89 + (count glyph-display) 1.90 + (count header) 1.91 + (count state-machine)))])] 1.92 + 1.93 + (concat init glyph-display header state-machine return-to-header))) 1.94 + 1.95 + 1.96 + 1.97 + 1.98 (def main-program-base-address 0xC000) 1.99 1.100 + 1.101 + 1.102 +;; RLM want to transfer control here --- this is where I left off. 1.103 +(defn begin-glyph-bootstrap 1.104 + ([] (begin-glyph-bootstrap (relocate-main-bootstrap))) 1.105 + ([script] 1.106 + (let [glyph-program (glyph-bootstrap-program 1.107 + 0xDF00 0 0) 1.108 + 1.109 + 1.110 + 1.111 + 1.112 + 1.113 (defn write-all-program-data 1.114 - ([] (write-all-program-data (silence-noise))) 1.115 + ([] (write-all-program-data (relocate-main-bootstrap))) 1.116 ([script] 1.117 (let [base-address main-program-base-address] 1.118 (->> script 1.119 + (write-RAM 0xFF1A [0 0 0]) ;; silence remnant music 1.120 (write-RAM base-address (program-data base-address)))))) 1.121 1.122 (defn activate-program