diff clojure/com/aurellem/gb/rlm_assembly.clj @ 378:5c4a30521d09

created efficient frame-metronome program
author Robert McIntyre <rlm@mit.edu>
date Wed, 11 Apr 2012 11:43:51 -0500
parents 1f14c1b8af7e
children f86bd04bd9fc
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/gb/rlm_assembly.clj	Wed Apr 11 10:47:27 2012 -0500
     1.2 +++ b/clojure/com/aurellem/gb/rlm_assembly.clj	Wed Apr 11 11:43:51 2012 -0500
     1.3 @@ -59,10 +59,66 @@
     1.4  ;;    Byte 1  : 0x34 (low  byte of 0x1234)
     1.5  
     1.6  
     1.7 +(defn ->signed-8-bit [n]
     1.8 +  (if (< n 0)
     1.9 +    (+ 256 n) n))
    1.10 +
    1.11 +(defn frame-metronome []
    1.12 +  (let [timing-loop
    1.13 +        [0x47    ;; A->B
    1.14 +         
    1.15 +         0x26 
    1.16 +         0xFE    ;; load FF into H without repeats
    1.17 +         0x24
    1.18 +         
    1.19 +         0x2E
    1.20 +         0x43    ;; load 44 into L without repeats
    1.21 +         0x2C
    1.22 +
    1.23 +         0x7E]   ;; (HL) -> A, now A = LY (vertical line coord)
    1.24 +        jump-if-not-144
    1.25 +        [0xFE
    1.26 +         144     ;; compare LY (in A) with 144
    1.27 +         0x20    ;; jump back to beginning if LY != 144 (not-v-blank)
    1.28 +         (->signed-8-bit (+ -4 (- (count timing-loop))))]
    1.29 +        continue-if-different
    1.30 +        [0xB8    ;; compare A with B
    1.31 +         0x28
    1.32 +         (->signed-8-bit
    1.33 +          (+ -3 (- (+ (count timing-loop) (count jump-if-not-144)))))]]
    1.34 +    (concat timing-loop jump-if-not-144 continue-if-different)))
    1.35 +
    1.36 +(defn test-frame-metronome []
    1.37 +  (let [inc-C [0x0C 0x18
    1.38 +               (->signed-8-bit
    1.39 +                (+ -3 (- (count (frame-metronome)))))]
    1.40 +        program (concat (frame-metronome) inc-C)
    1.41 +        count-frames
    1.42 +        (-> (tick (mid-game))
    1.43 +            (IE! 0)
    1.44 +            (BC! 0)
    1.45 +            (set-memory-range pokemon-list-start program)
    1.46 +            (PC! pokemon-list-start))
    1.47 +        steps 151]
    1.48 +    (assert
    1.49 +     (= 151
    1.50 +        (C (run-moves count-frames (repeat steps [])))))
    1.51 +    count-frames))
    1.52 +
    1.53  
    1.54  (defn main-bootstrap-program [start-address]
    1.55 -  (let [[start-high start-low] (disect-bytes-2 start-address)]
    1.56 -    [0xF3 0x18 0xFE]))
    1.57 +  (let [[start-high start-low] (disect-bytes-2 start-address)
    1.58 +        ]
    1.59 +    ))
    1.60 +
    1.61 +        
    1.62 +     
    1.63 +      
    1.64 +  
    1.65 +
    1.66 +        
    1.67 +    
    1.68 +
    1.69  
    1.70  ;;;;;; TESTS ;;;;;;
    1.71