@@ -13,6 +13,9 @@ uint16 index_register = 0x0;
13
13
uint8 memory [4096 ];
14
14
uint8 registers [0x10 ];
15
15
16
+ uint8 delay_timer = 0x0 ;
17
+ uint8 sound_timer = 0x0 ;
18
+
16
19
void chip_execute () {
17
20
uint16 op = memory [ip ] << 8 | memory [ip + 1 ];
18
21
ip += 2 ;
@@ -107,7 +110,7 @@ void chip_execute() {
107
110
registers [x ] = registers [y ] - registers [x ];
108
111
break ;
109
112
default :
110
- printf ("[*] instruction not implemented 0x%04x\n" , op );
113
+ printf ("[*] register instruction not implemented 0x%04x\n" , op );
111
114
}
112
115
break ;
113
116
case 0xa :
@@ -117,13 +120,46 @@ void chip_execute() {
117
120
case 0xd :
118
121
// draw()
119
122
{
120
- registers [0xF ] = 0 ;
121
123
uint8 sprite [n ];
122
124
memcpy (sprite , memory + index_register , sizeof (uint8 ) * n );
123
125
uint8 unset = sdl_draw (registers [x ], registers [y ], sprite , n );
124
126
registers [0xF ] = unset ;
125
127
}
126
128
break ;
129
+ case 0xf :
130
+ switch (nn ) {
131
+ case 0x07 :
132
+ // store delay_timer into register X
133
+ registers [x ] = delay_timer ;
134
+ break ;
135
+ case 0x15 :
136
+ // set delay_timer to register X
137
+ delay_timer = registers [x ];
138
+ break ;
139
+ case 0x18 :
140
+ // set sound_timer to register X
141
+ sound_timer = registers [x ];
142
+ break ;
143
+ case 0x1e :
144
+ // add register X to index register
145
+ index_register += registers [x ];
146
+ break ;
147
+ case 0x55 :
148
+ // store values from register 0 -> X into memory at I
149
+ for (int i = 0 ; i <= x ; i ++ ) {
150
+ memory [index_register + i ] = registers [i ];
151
+ }
152
+ break ;
153
+ case 0x65 :
154
+ // load values into register 0 -> X from memory at I
155
+ for (int i = 0 ; i <= x ; i ++ ) {
156
+ registers [i ] = memory [index_register + i ];
157
+ }
158
+ break ;
159
+ default :
160
+ printf ("[+] special instruction not implemented 0x%04x\n" , op );
161
+ }
162
+ break ;
127
163
default :
128
164
printf ("[*] instruction not implemented 0x%04x\n" , op );
129
165
}
@@ -136,6 +172,12 @@ void chip_execute_frame() {
136
172
for (int i = 0 ; i < 700 /60 ; i ++ ) {
137
173
chip_execute ();
138
174
}
175
+
176
+ if (delay_timer != 0x0 )
177
+ delay_timer -- ;
178
+
179
+ if (sound_timer != 0x0 )
180
+ sound_timer -- ;
139
181
}
140
182
141
183
int main (int argc , char * argv []) {
0 commit comments