diff clojure/com/aurellem/gb/assembly.clj @ 175:5d9a7a0ca09a

beginning test of latest assembly code. 240->70.
author Dylan Holmes <ocsenave@gmail.com>
date Wed, 21 Mar 2012 18:17:37 -0500
parents 412ca096a9ba
children 95b2758dd517
line wrap: on
line diff
     1.1 --- a/clojure/com/aurellem/gb/assembly.clj	Wed Mar 21 03:38:46 2012 -0500
     1.2 +++ b/clojure/com/aurellem/gb/assembly.clj	Wed Mar 21 18:17:37 2012 -0500
     1.3 @@ -407,87 +407,47 @@
     1.4    (dotimes [_ 90000] (step (view-memory @current-state 0xD352))))
     1.5  
     1.6  
     1.7 -    
     1.8 -
     1.9 -
    1.10 -
    1.11 -
    1.12 -
    1.13 -
    1.14 -
    1.15 -
    1.16 -
    1.17 -
    1.18 -
    1.19 -
    1.20 -
    1.21 -
    1.22 -
    1.23 -
    1.24 -
    1.25 -
    1.26 -
    1.27 -
    1.28 -
    1.29 -
    1.30 -
    1.31 -
    1.32 -
    1.33 -
    1.34  (defn write-memory-assembly*
    1.35 -  "Currently, grabs input from the user each frame."
    1.36 +  "A program for altering in-game memory by pressing buttons."
    1.37    []
    1.38    [
    1.39 +   0xF3 ; stop interrupts
    1.40 +   ;; --------- CLEANUP
    1.41 +   0xAF ; zero A  [D31E]
    1.42 +   0x57 ; A->D; makes D=0.
    1.43 +   
    1.44     ;; --------- FRAME METRONOME
    1.45 -   0x18 ;; jump ahead to cleanup. first time only.
    1.46 -   0x40 ;; v-blank-prev [D31E]
    1.47 +   0xF1 ;; pop AF (vblank prev) [D320]
    1.48  
    1.49 -   0xFA ;; load modes into A [D31F]
    1.50 +   0x2F ;; invert A
    1.51 +   0x47 ;; A -> B
    1.52 +   
    1.53 +   0xF0 ;; copy STAT into A
    1.54     0x41
    1.55 -   0xFF
    1.56  
    1.57 -   0x47 ;; A -> B
    1.58 -   0xCB ;; rotate A
    1.59 -   0x2F
    1.60 -   0x2F ;; invert A
    1.61 +   0xCB ;; swap A nybbles; now A_0 is (VB==1).
    1.62 +   0x37
    1.63  
    1.64 -   0xA0
    1.65 -   0x47 ;; now B_0 contains (VB==1)
    1.66 -
    1.67 -   0xFA ;; load v-blank-prev
    1.68 -   0x1E
    1.69 -   0xD3
    1.70 -
    1.71 -   0x2F ;; complement v-blank-prev
    1.72 +   0xF5 ;; push AF (vbprev)
    1.73     
    1.74 -   0xA0 ;; A & B --> A
    1.75 -   0x4F ;; now C_0 contains increment?
    1.76 -
    1.77 -
    1.78 -   0x78 ;; B->A
    1.79 -   0xEA ;; spit A --> vbprev
    1.80 -   0x1E
    1.81 -   0xD3
    1.82 -
    1.83 -   0xCB   ;test C_0
    1.84 -   0x41
    1.85 -   0x20   ; JUMP ahead to button input if nonzero
    1.86 -   0x02
    1.87 -   0x18   ; JUMP  back to frame metronome (D31F)
    1.88 -   0xE7
    1.89 +   0xA0 ;; A & B --> A. Now A_0 contains "increment?"
    1.90 +   
    1.91 +   0xCB ;; test A_0. this result will be used twice.
    1.92 +   0x47
    1.93 +   0x28 ;; end frame (JUMP) if A_0 = 0.  
    1.94 +   0x00 ;; TODO: set jump length
    1.95     
    1.96     ;; -------- GET BUTTON INPUT
    1.97 -
    1.98 -        ;; btw, C_0 is now 1
    1.99 +   
   1.100 +        ;; btw, Z bit is now 1
   1.101          ;; prepare to select bits
   1.102 -
   1.103 -   0x06 ;; load 0x00 into B
   1.104 -   0x00 ;; to initialize for "OR" loop
   1.105   
   1.106     0x3E ;; load 0x20 into A, to measure dpad
   1.107     0x20
   1.108 +   
   1.109 +   0x06 ;; load 0x00 into B
   1.110 +   0x00 ;; to initialize for "OR" loop
   1.111  
   1.112 -   
   1.113     0xE0 ;; load A into [FF00] ;; start of OR loop [D33C]
   1.114     0x00
   1.115     
   1.116 @@ -498,17 +458,19 @@
   1.117     0x0F
   1.118     
   1.119     0xB0 ;; A or B --> A
   1.120 -   0xCB
   1.121 -   0x41 ;; test bit 0 of C
   1.122 -   0x28 ;; JUMP forward if 0
   1.123 +
   1.124 +   0x28 ;; JUMP forward if Z=0
   1.125     0x08
   1.126  
   1.127     0x47 ;; A -> B
   1.128     0xCB ;; swap B nybbles
   1.129     0x30 
   1.130 -   0x0C ;; increment C
   1.131 +   
   1.132     0x3E ;; load 0x10 into A, to measure btns
   1.133     0x10
   1.134 +
   1.135 +   0xBF ;; compare(A,A) sets Z=0
   1.136 +   
   1.137     0x18 ;; JUMP back to "load A into [FF00]" [20 steps?]
   1.138     0xED
   1.139  
   1.140 @@ -536,7 +498,6 @@
   1.141     0x2F ; complement A, by request. [D34F]
   1.142     
   1.143     0x47 ; A->B ;; now B contains the pressed keys
   1.144 -   0x7B ; E->A ;; now A contains the count.
   1.145  
   1.146     0xCB ; test bit 5 of D (are we in o/p mode?)
   1.147     0x6A
   1.148 @@ -552,28 +513,16 @@
   1.149     0xE9 ; ** move PC to (HL)
   1.150  
   1.151     ;; output mode II: writing bytes
   1.152 -   0xFE ; A compare 0. finished writing?
   1.153 -   0x00
   1.154 -   0x20 ; if we are not finished, skip cleanup
   1.155 -   0x04 ; JUMP
   1.156 -
   1.157 -   ;; CLEANUP
   1.158 -   ;; btw, A is already zero.
   1.159 -   0xAF ; zero A  [D35F]
   1.160 -   0x57 ; A->D; makes D=0.
   1.161 -   0x18 ; end of frame
   1.162 -   0xBC
   1.163 -   
   1.164 -   ;; ---- end of cleanup
   1.165 -
   1.166 +   0xAF ; zero A
   1.167 +   0xBB ; compare count to zero. finished writing?
   1.168 +   0x28 ; if we are finished, jump back to cleanup
   1.169 +   0x00 ; TODO: set jump length backwards.
   1.170     
   1.171     ;; continue writing bytes
   1.172 -   0x1D ;; decrement E, the number of bytes to write [D363]
   1.173 -   0x78 ;; B->A; now A contains the pressed keys
   1.174 -   0x77 ;; copy A to (HL)
   1.175 -   0x23 ;; increment HL
   1.176 +   0x78 ;; B->A
   1.177 +   0x22 ;; copy A to (HL) and increment HL. 
   1.178     0x18 ;; end frame. [goto D31F]
   1.179 -   0xB6 ;; TODO: set skip length backwards
   1.180 +   0xB6 ;; JUMP
   1.181  
   1.182  
   1.183     ;; ---- end of o/p section
   1.184 @@ -599,7 +548,7 @@
   1.185     0x00 ;; var: thing to execute [D374]
   1.186  
   1.187     0x18 ;; end frame
   1.188 -   0xA8
   1.189 +   0xA8 ;; JUMP
   1.190     ]
   1.191    )
   1.192