Mercurial > vba-clojure
diff clojure/com/aurellem/gb/rlm_assembly.clj @ 385:3f3cfc89be91
working on mode-dispatch
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 12 Apr 2012 06:20:17 -0500 |
parents | 8013915a07b3 |
children | d8cbbf2a3133 |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/gb/rlm_assembly.clj Wed Apr 11 14:04:21 2012 -0500 1.2 +++ b/clojure/com/aurellem/gb/rlm_assembly.clj Thu Apr 12 06:20:17 2012 -0500 1.3 @@ -116,25 +116,31 @@ 1.4 1.5 0x02 1.6 0x0A ;; get D-pad info 1.7 + 1.8 + 0xF5 ;; push AF 1.9 + 1.10 + 0x3E 1.11 + (Integer/parseInt "00010000" 2) ; prepare to measure buttons 1.12 + 1.13 + 0x02 1.14 + 0x0A ;; get button info 1.15 1.16 + 1.17 0xE6 ;; select bottom bits of A 1.18 0x0F 1.19 1.20 + 0x47 ;; A->B 1.21 + 1.22 + 0xF1 ;; pop AF 1.23 + 1.24 + 0xE6 1.25 + 0x0F ;; select bottom bits of A 1.26 + 1.27 0xCB 1.28 0x37 ;; swap A nybbles 1.29 1.30 - 0x57 ;; A->D 1.31 - 1.32 - 0x3E 1.33 - (Integer/parseInt "00010000" 2) ; prepare to measure buttons 1.34 - 1.35 - 0x02 1.36 - 0x0A ;; get button info 1.37 + 0xB0 ;; (AND A B) -> A 1.38 1.39 - 0xE6 1.40 - 0x0F ;; select bottom bits of A 1.41 - 1.42 - 0xB2 ;; combine together into A 1.43 0x2F ;; (NOT A) -> A 1.44 ]) 1.45 1.46 @@ -154,16 +160,116 @@ 1.47 (set-memory-range pokemon-list-start program) 1.48 (PC! pokemon-list-start))] 1.49 (dorun 1.50 - (for [i (range 0x100)] 1.51 - (assert (= (E (step read-input (buttons i))) i)))) 1.52 - (println "Tested all inputs.") 1.53 + (for [i (range 0x100)] 1.54 + (assert (= (E (step read-input (buttons i))) i)))) 1.55 + (println "Tested all inputs.") 1.56 read-input)) 1.57 1.58 - 1.59 +(def mode-select-mode (Integer/parseInt "00000000" 2)) 1.60 +(def write-mode (Integer/parseInt "00000001" 2)) 1.61 +(def jump-mode (Integer/parseInt "10000000" 2)) 1.62 + 1.63 +(def input-high-addr-jump (Integer/parseInt "10000010" 2)) 1.64 +(def input-high-addr-write (Integer/parseInt "00000010" 2)) 1.65 +(def input-low-addr-jump (Integer/parseInt "10000100" 2)) 1.66 +(def input-low-addr-write (Integer/parseInt "00000100" 2)) 1.67 + 1.68 +(def input-write-num-mode (Integer/parseInt "00001000" 2)) 1.69 +(def do-write-mode (Integer/parseInt "00010000" 2)) 1.70 + 1.71 + 1.72 + 1.73 + 1.74 + 1.75 + 1.76 1.77 (defn main-bootstrap-program [start-address] 1.78 (let [[start-high start-low] (disect-bytes-2 start-address) 1.79 - ] 1.80 + jump-distance (+ (count (frame-metronome) 1.81 + (read-user-input))) 1.82 + 1.83 + init 1.84 + [0x1E 0xFF 0x1C] ;; 0-> E without repeats 1.85 + 1.86 + 1.87 + ;; HL -> BC 1.88 + ;; HL = here 1.89 + ;; add E to HL 1.90 + ;; jp HL 1.91 + 1.92 + mode-dispatch 1.93 + [0x44 1.94 + 1.95 + 1.96 + 1.97 + ;;(here) jr metronome 1.98 + 1.99 + ;;stuff 1.100 + ;;modify E 1.101 + ;;jr metronome 1.102 + 1.103 + ;;stuff 1.104 + ;;jr metronome 1.105 + 1.106 + 1.107 + 1.108 + 1.109 + 1.110 + 1.111 + 1.112 + mode-dispatch 1.113 + [0xCB 1.114 + 0x43 ;; test bit 0 1.115 + 1.116 + 0xCB 1.117 + 0x4B ;; test bit 1 1.118 + 1.119 + 0xCB 1.120 + 0x53 ;; test bit 2 1.121 + 1.122 + 0xCB 1.123 + 0x5B ;; test bit 3 1.124 + 1.125 + 0xCB 1.126 + 0x63 ;; test bit 4 1.127 + 1.128 + 0xCB 1.129 + 0x6B ;; test bit 5 1.130 + 1.131 + ];;default 1.132 + 1.133 + 1.134 + mode-select 1.135 + [0x5F] ;; A->E 1.136 + 1.137 + ;; delayed inputs 1.138 + input-high 0x67 ;; A->H 1.139 + input-low 0x6F ;; A->L 1.140 + input-num 0x57 ;; A->D 1.141 + 1.142 + ;; final-actions 1.143 + jump 0xE9 ;; jp (HL) 1.144 + write 0x22 ;; A->(HL); inc HL 1.145 + input-mode 0x00 ;; no-op 1.146 + 1.147 + 1.148 + 1.149 + input-high 1.150 + [0x67 ;; A->H 1.151 + 0x1E ;; change mode 1.152 + input-low-mode] 1.153 + 1.154 + 1.155 + 1.156 + 1.157 + mode-dispatch 1.158 + 1.159 + 1.160 + 1.161 + 1.162 + 1.163 + 1.164 + 1.165 )) 1.166 1.167