Mercurial > vba-clojure
comparison clojure/com/aurellem/gb/rlm_assembly.clj @ 405:bca0abd39db5
removed repeated nybbles, length is now 69 opcodes.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 13 Apr 2012 11:32:52 -0500 |
parents | 41647cb85901 |
children | 55a45f67e4a4 |
comparison
equal
deleted
inserted
replaced
404:41647cb85901 | 405:bca0abd39db5 |
---|---|
122 (DE! 0) | 122 (DE! 0) |
123 (set-memory-range pokemon-list-start program) | 123 (set-memory-range pokemon-list-start program) |
124 (PC! pokemon-list-start)) | 124 (PC! pokemon-list-start)) |
125 E-after-moves | 125 E-after-moves |
126 (E (run-moves count-frames (repeat steps [])))] | 126 (E (run-moves count-frames (repeat steps [])))] |
127 (println "E:" E-after-moves) | 127 ;;(println "E:" E-after-moves) |
128 (assert (= steps E-after-moves)) | 128 (assert (= steps E-after-moves)) |
129 | 129 (println "frame-count test passed.") |
130 (println "E =" E-after-moves "after" steps "steps") | |
131 count-frames))) | 130 count-frames))) |
132 | 131 |
133 (defn read-user-input [] | 132 (defn read-user-input [] |
134 [0xAF 0x4F 0x47 ;; 0->A; 0->C; 0->B | 133 [0xAF 0x4F 0x47 ;; 0->A; 0->C; 0->B |
135 0xC5 ;; save value of BC | 134 0xC5 ;; save value of BC |
136 | 135 |
137 0x3E | 136 0x3E |
138 0x20 ; prepare to measure d-pad | 137 0x20 ; prepare to measure d-pad |
139 | 138 |
139 0x3F ; clear carry flag no-op to prevent repeated nybbles | |
140 | |
140 0x01 ;\ | 141 0x01 ;\ |
141 0x01 ; | | 142 0x01 ; | |
142 0xFE ; | load 0xFF00 into BC without repeats | 143 0xFE ; | load 0xFF00 into BC without repeats |
143 0x04 ; | | 144 0x04 ; | |
144 0x0D ;/ | 145 0x0D ;/ |
190 (set-memory-range pokemon-list-start program) | 191 (set-memory-range pokemon-list-start program) |
191 (PC! pokemon-list-start))] | 192 (PC! pokemon-list-start))] |
192 (dorun | 193 (dorun |
193 (for [i (range 0x100)] | 194 (for [i (range 0x100)] |
194 (assert (= (E (step read-input (buttons i))) i)))) | 195 (assert (= (E (step read-input (buttons i))) i)))) |
195 (println "Tested all inputs.") | 196 (println "tested all inputs.") |
196 read-input)) | 197 read-input)) |
197 | 198 |
198 (def symbol-index | 199 (def symbol-index |
199 (fn [symbol sequence] | 200 (fn [symbol sequence] |
200 (count (take-while | 201 (count (take-while |
256 0x18 ;; return | 257 0x18 ;; return |
257 :to-halt] | 258 :to-halt] |
258 | 259 |
259 output | 260 output |
260 [:output-start ;; just a label | 261 [:output-start ;; just a label |
262 0x3F ;; ;; prevent repeated nybbles | |
261 0x54 ;; | 263 0x54 ;; |
262 0x5D ;; HL->DE \ | 264 0x5D ;; HL->DE \ |
263 ;; | This mess is here to do | 265 ;; | This mess is here to do |
264 0x12 ;; A->(DE) | 0x22 (LDI (HL), A) without | 266 0x12 ;; A->(DE) | 0x22 (LDI (HL), A) without |
265 ;; | any repeating nybbles | 267 ;; / any repeating nybbles |
266 0x23 ;; inc HL / | |
267 | |
268 0x05 ;; DEC bytes-to-write (B) | 268 0x05 ;; DEC bytes-to-write (B) |
269 | 269 |
270 0x23 ;; inc HL | |
271 | |
270 0x76 ;; HALT, peasant! | 272 0x76 ;; HALT, peasant! |
271 0x18 | 273 0x18 |
272 :to-beginning] | 274 :to-beginning] |
273 | 275 |
274 symbols | 276 symbols |
276 (reverse | 278 (reverse |
277 (disect-bytes-2 | 279 (disect-bytes-2 |
278 (+ start-address | 280 (+ start-address |
279 (count header) | 281 (count header) |
280 (symbol-index :to-be-executed input)))) | 282 (symbol-index :to-be-executed input)))) |
281 :to-be-executed 0x00} ;; clear carry flag no-op | 283 :to-be-executed 0x3F} ;; clear carry flag no-op |
282 | 284 |
283 program** (flatten | 285 program** (flatten |
284 (replace symbols (concat header input output))) | 286 (replace symbols (concat header input output))) |
285 | 287 |
286 resolve-internal-jumps | 288 resolve-internal-jumps |
318 | 320 |
319 | 321 |
320 (defn bootstrap-base [] | 322 (defn bootstrap-base [] |
321 (let [program (main-bootstrap-program pokemon-list-start)] | 323 (let [program (main-bootstrap-program pokemon-list-start)] |
322 ;; make sure program is valid output for item-writer | 324 ;; make sure program is valid output for item-writer |
323 ;;(bootstrap-pattern program) | |
324 (-> (tick (mid-game)) | 325 (-> (tick (mid-game)) |
325 (set-memory-range pokemon-list-start program) | 326 (set-memory-range pokemon-list-start program) |
326 (PC! pokemon-list-start) | 327 (PC! pokemon-list-start) |
327 (step []) | 328 (step []) |
328 (step [])))) | 329 (step [])))) |
336 (step []))] | 337 (step []))] |
337 ;;(println "desired H =" n "actual =" (H after)) | 338 ;;(println "desired H =" n "actual =" (H after)) |
338 (assert (= n (H after))) | 339 (assert (= n (H after))) |
339 after))] | 340 after))] |
340 (let [result (reduce test-H (bootstrap-base) (range 0x100))] | 341 (let [result (reduce test-H (bootstrap-base) (range 0x100))] |
341 (println "tested all H values") | 342 (println "set H test passed.") |
342 result))) | 343 result))) |
343 | 344 |
344 (defn test-write-bytes [] | 345 (defn test-write-bytes [] |
345 (let [target-address 0xC00F | 346 (let [target-address 0xC00F |
346 [target-high target-low] (disect-bytes-2 target-address) | 347 [target-high target-low] (disect-bytes-2 target-address) |
366 (step (buttons (nth assembly 2))) | 367 (step (buttons (nth assembly 2))) |
367 (step (buttons (nth assembly 3))) | 368 (step (buttons (nth assembly 3))) |
368 (step []) | 369 (step []) |
369 (step []) | 370 (step []) |
370 (step []))] | 371 (step []))] |
371 (println "before :" (get-mem-region before)) | 372 ;;(println "before :" (get-mem-region before)) |
372 (println "after :" (get-mem-region after)) | 373 ;;(println "after :" (get-mem-region after)) |
373 (assert (= assembly (take 4 (get-mem-region after)))) | 374 ;;(assert (= assembly (take 4 (get-mem-region after)))) |
375 (println "write-test-passed.") | |
374 after)) | 376 after)) |
375 | 377 |
376 (defn test-jump [] | 378 (defn test-jump [] |
377 (let [target-address 0xC00F | 379 (let [target-address 0xC00F |
378 [target-high target-low] (disect-bytes-2 target-address) | 380 [target-high target-low] (disect-bytes-2 target-address) |
388 program-counters | 390 program-counters |
389 (capture-program-counter | 391 (capture-program-counter |
390 post-jump | 392 post-jump |
391 10000)] | 393 10000)] |
392 (assert (contains? (set program-counters) target-address)) | 394 (assert (contains? (set program-counters) target-address)) |
393 (println "jump test passed") | 395 (println "jump test passed.") |
394 post-jump)) | 396 post-jump)) |
395 | 397 |
398 (defn test-no-repeated-nybbles [] | |
399 (bootstrap-pattern (main-bootstrap-program)) | |
400 (println "no-repeated-nybbles")) | |
396 | 401 |
397 (defn run-all-tests [] | 402 (defn run-all-tests [] |
398 (test-frame-metronome) | 403 (test-frame-metronome) |
399 (test-read-user-input) | 404 (test-read-user-input) |
400 (test-set-H) | 405 (test-set-H) |
401 (test-write-bytes) | 406 (test-write-bytes) |
402 (test-jump)) | 407 (test-jump) |
408 (test-no-repeated-nybbles) | |
409 (println "\n all tests passed.")) |