Mercurial > vba-clojure
diff clojure/com/aurellem/gb/rlm_assembly.clj @ 392:309614263aa9
saving progress....
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Thu, 12 Apr 2012 00:52:19 -0500 |
parents | 2e9b2d27f32f |
children | b21d28e6c966 |
line wrap: on
line diff
1.1 --- a/clojure/com/aurellem/gb/rlm_assembly.clj Thu Apr 12 00:20:16 2012 -0500 1.2 +++ b/clojure/com/aurellem/gb/rlm_assembly.clj Thu Apr 12 00:52:19 2012 -0500 1.3 @@ -211,7 +211,7 @@ 1.4 1.5 (let [[start-high start-low] (disect-bytes-2 start-address) 1.6 jump-distance (+ (count (frame-metronome)) 1.7 - (read-user-input)) 1.8 + (count (read-user-input))) 1.9 1.10 init 1.11 [0xAF 0x5F 0x57 0x47] ;; 0->A; 0->E; 0->D; 0->B 1.12 @@ -226,20 +226,17 @@ 1.13 1.14 0x20 ;; skip input section if 1.15 :to-output ;; we're not in input mode 1.16 - 1.17 - 1.18 + 1.19 :to-be-executed 1.20 - 1.21 1.22 - ;; write mode to instruction to be executed (pun) 1.23 + ;; write mode to instruction-to-be-executed (pun) 1.24 0xEA 1.25 :to-be-executed-address 1.26 0x18 ;; return 1.27 - :to-beginning] 1.28 - 1.29 + :to-beginning-1] 1.30 + 1.31 output 1.32 - [0x05 ;; DEC bytes-to-write (B) 1.33 - 1.34 + [:output-start ;; just a label 1.35 0x54 ;; 1.36 0x5D ;; HL->DE \ 1.37 ;; | 1.38 @@ -248,40 +245,66 @@ 1.39 ;; | any repeating nybbles 1.40 0x23 ;; inc HL / 1.41 1.42 - ] 1.43 + 1.44 + 0x05 ;; DEC bytes-to-write (B) 1.45 + 0x20 ;; if there are no more bytes to write, 1.46 + 0x04 1.47 + 0xAF ;; put a no op (0x00) in to-be-executed 1.48 + 0xEA 1.49 + :to-be-executed-address 1.50 + 1.51 + 0x18 1.52 + :to-beginning-2] 1.53 + 1.54 + symbol-index 1.55 + (fn [symbol sequence] 1.56 + (count (take-while 1.57 + (partial not= symbol) 1.58 + sequence))) 1.59 1.60 - 1.61 - 1.62 + symbols 1.63 + {:to-be-executed-address 1.64 + (disect-bytes-2 1.65 + (+ start-address jump-distance 1.66 + (count init) 1.67 + (symbol-index :to-be-executed input))) 1.68 + :to-be-executed 0x3F} ;; clear carry flag no-op 1.69 1.70 - 1.71 + program** (flatten 1.72 + (replace 1.73 + symbols 1.74 + (concat init (frame-metronome) 1.75 + (read-user-input) 1.76 + input output))) 1.77 + resolve-internal-jumps 1.78 + {:output-start [] 1.79 + :to-output 1.80 + (->signed-8-bit 1.81 + (- (symbol-index :output-start program**) 1.82 + (symbol-index :to-output program**)))} 1.83 1.84 - 0x22 ;; A->(HL) ; inc HL 1.85 + program* 1.86 + (flatten (replace resolve-internal-jumps program**)) 1.87 + 1.88 + resolve-external-jumps 1.89 + {:to-beginning-1 1.90 + (->signed-8-bit 1.91 + (+ -2 (- (symbol-index :to-beginning-1 program*)))) 1.92 + :to-beginning-2 1.93 + (->signed-8-bit 1.94 + (+ -2 (- (symbol-index :to-beginning-2 program*))))} 1.95 1.96 - 1.97 - 1.98 - 1.99 - 1.100 - 1.101 - ;; HL = here 1.102 - ;; add C to HL 1.103 - ;; jp HL 1.104 - 1.105 -]])) 1.106 - 1.107 - 1.108 - 1.109 - 1.110 - 1.111 + program 1.112 + (replace resolve-external-jumps program*)] 1.113 + program)) 1.114 1.115 1.116 -(comment 1.117 - 1.118 ;;;;;; TESTS ;;;;;; 1.119 1.120 (defn bootstrap-base [] 1.121 (let [program (main-bootstrap-program pokemon-list-start)] 1.122 ;; make sure program is valid output for item-writer 1.123 - (bootstrap-pattern program) 1.124 + ;;(bootstrap-pattern program) 1.125 (-> (tick (mid-game)) 1.126 (set-memory-range pokemon-list-start program) 1.127 (PC! pokemon-list-start)))) 1.128 @@ -295,11 +318,11 @@ 1.129 before (bootstrap-base) 1.130 after 1.131 (-> before 1.132 - (step []) ; make sure it can handle blanks 1.133 - (step []) ; at the beginning. 1.134 + (step []) ; make sure it can handle blanks 1.135 + (step []) ; at the beginning. 1.136 (step []) 1.137 - (step [:start]) ; select WRITE-BYTES mode 1.138 - (step (buttons 4)) ; write 4 bytes 1.139 + (step [:start]) ; select WRITE-BYTES mode 1.140 + (step (buttons 4)) ; write 4 bytes 1.141 (step (buttons target-high)) 1.142 (step (buttons target-low)) 1.143 (step (buttons (nth assembly 0))) 1.144 @@ -332,4 +355,3 @@ 1.145 (println program-counters) 1.146 (assert (contains? (set program-counters) target-address)) 1.147 post-jump)) 1.148 -) 1.149 \ No newline at end of file