@@ -115,6 +115,12 @@ void Chip8::emulate_cycle ()
115
115
pc = opcode & 0x0FFF ;
116
116
printf (" Jump to 0x%X\n " , pc);
117
117
break ;
118
+ case 0x2000 : // 0x2NNN call subroutine at address NNN
119
+ stack[sp] = pc; // store program counter in stack
120
+ ++sp; // advance stack pointer
121
+ pc = opcode & 0x0FFF ; // "jump" to subroutine at NNN
122
+ printf (" Call subroutine at 0x%X (from 0x%X)\n " , pc, stack[sp - 1 ]);
123
+ break ;
118
124
case 0x3000 : // 0x3XNN if(VX == NN) skip next instruction
119
125
printf (" Skip one instruction if V[0x%X] == 0x%X\n " , (opcode & 0x0F00 ) >> 8 , (opcode & 0x00FF ));
120
126
if (V[(opcode & 0x0F00 ) >> 8 ] == (opcode & 0x00FF ))
@@ -141,23 +147,6 @@ void Chip8::emulate_cycle ()
141
147
}
142
148
pc += 2 ; // normal advancement in program
143
149
break ;
144
- case 0x6000 : // 0x6XNN set VX to NN
145
- V[(opcode & 0x0F00 ) >> 8 ] = opcode & 0x00FF ;
146
- printf (" Set V[0x%X] to 0x%X\n " , (opcode & 0x0F00 ) >> 8 ,
147
- opcode & 0x00FF );
148
- pc += 2 ;
149
- break ;
150
- case 0xA000 : // 0xANNN movi: move NNN into I
151
- I = opcode & 0x0FFF ; // move last 12 bits into I
152
- printf (" Move 0x%X into I\n " , I);
153
- pc += 0x2 ; // advance by 2 bytes (size of opcode)
154
- break ;
155
- case 0x2000 : // 0x2NNN call subroutine at address NNN
156
- stack[sp] = pc; // store program counter in stack
157
- ++sp; // advance stack pointer
158
- pc = opcode & 0x0FFF ; // "jump" to subroutine at NNN
159
- printf (" Call subroutine at 0x%X (from 0x%X)\n " , pc, stack[sp - 1 ]);
160
- break ;
161
150
case 0x5000 : // 0x5XY0 Skips next instruction if VX == VY
162
151
printf (" Skip one instruction if V[0x%X] == V[0x%X]\n " , (opcode & 0x0F00 ) >> 8 , (opcode & 0x00F0 ) >> 4 );
163
152
if (V[(opcode & 0x0F00 ) >> 8 ] == V[(opcode & 0x00F0 ) >> 4 ])
@@ -171,6 +160,12 @@ void Chip8::emulate_cycle ()
171
160
}
172
161
pc += 2 ;
173
162
break ;
163
+ case 0x6000 : // 0x6XNN set VX to NN
164
+ V[(opcode & 0x0F00 ) >> 8 ] = opcode & 0x00FF ;
165
+ printf (" Set V[0x%X] to 0x%X\n " , (opcode & 0x0F00 ) >> 8 ,
166
+ opcode & 0x00FF );
167
+ pc += 2 ;
168
+ break ;
174
169
case 0x7000 : // 0x7XNN Add NN to VX
175
170
V[(opcode & 0x0F00 ) >> 8 ] += opcode & 0x00FF ;
176
171
pc += 2 ;
@@ -277,6 +272,15 @@ void Chip8::emulate_cycle ()
277
272
}
278
273
pc += 2 ;
279
274
break ;
275
+ case 0xA000 : // 0xANNN move NNN into I
276
+ I = opcode & 0x0FFF ; // move last 12 bits into I
277
+ printf (" Move 0x%X into I\n " , I);
278
+ pc += 0x2 ; // advance by 2 bytes (size of opcode)
279
+ break ;
280
+ case 0xB000 : // 0xBNNN jump to NNN + V0
281
+ pc = (opcode & 0x0FFF ) + V[0x0 ];
282
+ printf (" Jump to 0x%X + V[0x0]" , opcode & 0x0FFF );
283
+ break ;
280
284
case 0xC000 : // 0xCXNN Sets VX to the result of "rand & NN"
281
285
V[(opcode & 0x0F00 ) >> 8 ] = (rand () % 255 ) & (opcode & 0x00FF );
282
286
pc += 2 ;
@@ -327,10 +331,10 @@ void Chip8::emulate_cycle ()
327
331
case 0xE000 : // Multiple instructions
328
332
switch (opcode & 0x00FF )
329
333
{
330
- case 0x00A1 : // 0xEXA1 skip next instruction if key in VX *IS NOT * pressed
334
+ case 0x009E : // 0xEX9E skip next instruction if key in VX *IS* pressed
331
335
{
332
- printf (" Skip next instruction if key[V[0x%X]] not pressed\n " , (opcode & 0x0F00 ) >> 8 );
333
- if (key[V[(opcode & 0x0F00 ) >> 8 ]] = = 0 )
336
+ printf (" Skip next instruction if key[V[0x%X]] pressed\n " , (opcode & 0x0F00 ) >> 8 );
337
+ if (key[V[(opcode & 0x0F00 ) >> 8 ]] ! = 0 )
334
338
{
335
339
printf (" TRUE\n " );
336
340
pc += 2 ;
@@ -342,10 +346,10 @@ void Chip8::emulate_cycle ()
342
346
pc += 2 ;
343
347
break ;
344
348
}
345
- case 0x009E : // 0xEX9E skip next instruction if key in VX *IS* pressed
349
+ case 0x00A1 : // 0xEXA1 skip next instruction if key in VX *IS NOT * pressed
346
350
{
347
- printf (" Skip next instruction if key[V[0x%X]] pressed\n " , (opcode & 0x0F00 ) >> 8 );
348
- if (key[V[(opcode & 0x0F00 ) >> 8 ]] ! = 0 )
351
+ printf (" Skip next instruction if key[V[0x%X]] not pressed\n " , (opcode & 0x0F00 ) >> 8 );
352
+ if (key[V[(opcode & 0x0F00 ) >> 8 ]] = = 0 )
349
353
{
350
354
printf (" TRUE\n " );
351
355
pc += 2 ;
@@ -356,13 +360,14 @@ void Chip8::emulate_cycle ()
356
360
}
357
361
pc += 2 ;
358
362
break ;
359
- }
363
+ }
364
+
360
365
default :
361
366
printf (" Unknown opcode / not implemented: 0x%X\n " , opcode);
362
367
break ;
363
368
}
364
369
break ;
365
- case 0xF000 :
370
+ case 0xF000 : // Multiple instructions
366
371
switch (opcode & 0x00FF )
367
372
{
368
373
case 0x0007 : // 0xFX07 Sets VX to value of delay_timer
@@ -453,6 +458,10 @@ void Chip8::emulate_cycle ()
453
458
{
454
459
if (sound_timer == 1 )
455
460
{
461
+ if (beep_fn != nullptr )
462
+ {
463
+ beep_fn ();
464
+ }
456
465
printf (" BEEP!\n " );
457
466
}
458
467
--sound_timer;
0 commit comments