Fix bug with FX0A
This commit is contained in:
16
main.c
16
main.c
@@ -53,6 +53,7 @@ int main(int argc, char **argv) {
|
|||||||
int frame = 0;
|
int frame = 0;
|
||||||
int press = 0;
|
int press = 0;
|
||||||
int wait = 0;
|
int wait = 0;
|
||||||
|
int store = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (DEBUG) printf("0x%x ", state.program_counter);
|
if (DEBUG) printf("0x%x ", state.program_counter);
|
||||||
@@ -66,10 +67,7 @@ int main(int argc, char **argv) {
|
|||||||
press = 0;
|
press = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
clock_t start = clock() / (CLOCKS_PER_SEC/1000);
|
|
||||||
|
|
||||||
// opcodes are 16 bits
|
// opcodes are 16 bits
|
||||||
word opcode = (state.memory[state.program_counter++] << 8) | (state.memory[state.program_counter++]);
|
|
||||||
|
|
||||||
SDL_PollEvent(&e);
|
SDL_PollEvent(&e);
|
||||||
if (e.type == SDL_QUIT) break;
|
if (e.type == SDL_QUIT) break;
|
||||||
@@ -91,13 +89,15 @@ int main(int argc, char **argv) {
|
|||||||
for (int i = 0; i < 0x10; ++i) {
|
for (int i = 0; i < 0x10; ++i) {
|
||||||
if (state.input[i] != 0)
|
if (state.input[i] != 0)
|
||||||
{
|
{
|
||||||
state.registers[0xF] = i;
|
state.registers[store] = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wait = 0;
|
wait = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
word opcode = (state.memory[state.program_counter++] << 8) | (state.memory[state.program_counter++]);
|
||||||
|
|
||||||
switch (opcode & 0xF000)
|
switch (opcode & 0xF000)
|
||||||
{
|
{
|
||||||
case 0x0000: // screen clear or function return
|
case 0x0000: // screen clear or function return
|
||||||
@@ -284,9 +284,11 @@ int main(int argc, char **argv) {
|
|||||||
byte data = state.memory[state.address_I + line];
|
byte data = state.memory[state.address_I + line];
|
||||||
for (int xpos = 0; xpos < 8; ++xpos)
|
for (int xpos = 0; xpos < 8; ++xpos)
|
||||||
{
|
{
|
||||||
|
int ypos = y + line;
|
||||||
|
if (ypos > 63) ypos -= 64;
|
||||||
if (!(data & (1 << xpos))) continue;
|
if (!(data & (1 << xpos))) continue;
|
||||||
if (state.screen[x + (7 - xpos)][y + line]) state.registers[0xF] = 1;
|
if (state.screen[x + (7 - xpos)][ypos]) state.registers[0xF] = 1;
|
||||||
state.screen[x + (7 - xpos)][y + line] ^= 1;
|
state.screen[x + (7 - xpos)][ypos] ^= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,6 +331,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
case 0x0A:
|
case 0x0A:
|
||||||
wait = 1;
|
wait = 1;
|
||||||
|
store = reg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x15:
|
case 0x15:
|
||||||
@@ -393,7 +396,6 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
|
|
||||||
clock_t stop = clock() / (CLOCKS_PER_SEC/1000);
|
|
||||||
SDL_Delay(1);
|
SDL_Delay(1);
|
||||||
++frame;
|
++frame;
|
||||||
// SDL_DestroyWindow(window);
|
// SDL_DestroyWindow(window);
|
||||||
|
|||||||
Reference in New Issue
Block a user