Mercurial > vba-clojure
diff clojure/com/aurellem/gb/rlm_assembly.clj @ 390:dbf7b5a2e9e7
saving progress.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Wed, 11 Apr 2012 23:40:01 -0500 |
parents | bb8978d370d8 |
children | 2e9b2d27f32f |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/gb/rlm_assembly.clj Thu Apr 12 12:08:36 2012 -0500 1.2 +++ b/clojure/com/aurellem/gb/rlm_assembly.clj Wed Apr 11 23:40:01 2012 -0500 1.3 @@ -5,6 +5,13 @@ 1.4 (:use (com.aurellem.run bootstrap-1)) 1.5 (:import [com.aurellem.gb.gb_driver SaveState])) 1.6 1.7 + 1.8 +;; MODE-SELECT 1.9 +;; SET-LENGTH 1.10 +;; SET-TARGET 1.11 +;; WRITE 1.12 +;; JUMP 1.13 + 1.14 ;; Specs for Main Bootstrap Program 1.15 1.16 ;; Number-Input 1.17 @@ -64,7 +71,8 @@ 1.18 (+ 256 n) n)) 1.19 1.20 (defn frame-metronome [] 1.21 - (let [timing-loop 1.22 + (let [init [0xC5] ;; save value of BC 1.23 + timing-loop 1.24 [0x01 ; \ 1.25 0x43 ; | 1.26 0xFE ; | load 0xFF44 into BC without repeats 1.27 @@ -81,7 +89,7 @@ 1.28 [0x05 ;; dec B, which is 0xFF 1.29 0x20 ;; spin until B==0 1.30 0xFD]] 1.31 - (concat timing-loop continue-if-144 spin-loop))) 1.32 + (concat init timing-loop continue-if-144 spin-loop))) 1.33 1.34 (defn test-frame-metronome 1.35 "Ensure that frame-metronome ticks exactly once every frame." 1.36 @@ -97,7 +105,8 @@ 1.37 (DE! 0) 1.38 (set-memory-range pokemon-list-start program) 1.39 (PC! pokemon-list-start)) 1.40 - E-after-moves (E (run-moves count-frames (repeat steps [])))] 1.41 + E-after-moves 1.42 + (E (run-moves count-frames (repeat steps [])))] 1.43 (println "E:" E-after-moves) 1.44 (assert (= steps E-after-moves)) 1.45 1.46 @@ -143,6 +152,7 @@ 1.47 0xB0 ;; (or A B) -> A 1.48 1.49 0x2F ;; (NOT A) -> A 1.50 + 1.51 ]) 1.52 1.53 (defn test-read-user-input [] 1.54 @@ -179,27 +189,54 @@ 1.55 (def do-write-mode (Integer/parseInt "00010000" 2)) 1.56 1.57 (defn main-bootstrap-program [start-address] 1.58 + ;; Register Use: 1.59 + 1.60 + ;; BC persistent scratch 1.61 + ;; 1.62 + ;; A user-input 1.63 + ;; HL target-address 1.64 + ;; D current-mode 1.65 + ;; E bytes-to-write 1.66 + 1.67 + 1.68 + ;; Modes are: 1.69 + 1.70 + ;; single-action-modes: 1.71 + ;; SET-MODE 1.72 + ;; SET-TARGET-HIGH 1.73 + ;; SET-TARGET-LOW 1.74 + ;; SET-WRITE-LENGTH 1.75 + ;; JUMP 1.76 + 1.77 + ;; multi-action-modes 1.78 + ;; WRITE 1.79 + 1.80 + 1.81 + 1.82 (let [[start-high start-low] (disect-bytes-2 start-address) 1.83 - jump-distance (+ (count (frame-metronome) 1.84 - (read-user-input))) 1.85 + jump-distance (+ (count (frame-metronome)) 1.86 + (read-user-input)) 1.87 1.88 init 1.89 - [0xAF 0x5F] ;; 0->A; 0->E; 1.90 + [0xAF 0x5F 0x57 0x47] ;; 0->A; 0->E; 0->D; 0->B 1.91 1.92 + 1.93 + 1.94 1.95 - header 1.96 - [0x47] ;; A->B 1.97 + input 1.98 + [0xC1 ;; pop BC so it's not volatile 1.99 + ;; some condition 1.100 + ;; to skip if not in input 1.101 + ;; mode 1.102 + 1.103 + 1.104 + 1.105 + 1.106 + 0xE9 ;; jump to (HL) 1.107 1.108 - mode-select 1.109 - [0xCB 0x43 ;; last-bit is zero 1.110 - 0x28 :to-beginning 1.111 - 0x5F];; A->E 1.112 - 1.113 - input-section 1.114 - [0xCB 0x4B ;; test bit 0 of E 1.115 - 0x28 0x03 1.116 - 1.117 - 1.118 + 0x22 ;; A->(HL) ; inc HL 1.119 + 1.120 + 1.121 0x57 ;; A->D 1.122 1.123 0x67 ;; A->H 1.124 @@ -219,54 +256,7 @@ 1.125 ;; add C to HL 1.126 ;; jp HL 1.127 1.128 - prepare-HL 1.129 - [0xD1 ;; pop DE causes D and E to be non-volitale 1.130 - 1.131 - 0x21 ;; load HL from literal nn 1.132 - :dispatch-high 1.133 - :dispatch-low] 1.134 - 1.135 - mode-dispatch 1.136 - [0xC5 ;; push BC 1.137 - 0x06 ;\ 1.138 - 0x01 ; | 0->B without repeats 1.139 - 0x05 ;/ 1.140 - 0x09 ;; add BC to HL 1.141 - 0xC1 ;; pop BC 1.142 - 0xE9] ;; jp 1.143 - 1.144 - mode-select 1.145 - [0x4F ;; A->C (this is the address of dispatch above) 1.146 - 0x18 ;; return 1.147 - :jump-to-end] 1.148 - 1.149 - input-bytes-to-write 1.150 - [0x47 ;; A->B 1.151 - 0x18 ;; return 1.152 - :jump-to-end] 1.153 - 1.154 - 1.155 - 1.156 - 1.157 - 1.158 - cleanup 1.159 - [0xD5 ;; push DE 1.160 - 0x18 1.161 - 0x??];; jump all the way back to frame-metronome 1.162 - 1.163 - 1.164 -;; (concat init (frame-metronome) (read-user-input) 1.165 -;; prepare-HL here mode-dispatch) 1.166 - 1.167 - 1.168 - 1.169 - 1.170 - 1.171 - 1.172 - 1.173 - 1.174 -;; )) 1.175 - 1.176 +]])) 1.177 1.178 1.179