This commit is contained in:
Robin Hübner 2018-09-30 19:58:46 +02:00
parent aad17f3dcc
commit 9f560af861
1 changed files with 42 additions and 14 deletions

View File

@ -301,7 +301,7 @@ struct PixelBuffer {
out vec4 out_col; out vec4 out_col;
void main() { void main() {
float v = texture(tex, frag_uv.st).r; float v = texture(tex, frag_uv.st).r * 255;
out_col = vec4(v, v, v, 1.0); out_col = vec4(v, v, v, 1.0);
} }
@ -624,6 +624,13 @@ struct Chip8 {
void reset() { void reset() {
cpu = cpu.init; cpu = cpu.init;
stack = stack.init;
ram = ram.init;
sp = sp.init;
run_flag = run_flag.init;
draw_flag = draw_flag.init;
screen_buf = screen_buf.init; screen_buf = screen_buf.init;
screen_data = screen_data.init; screen_data = screen_data.init;
@ -666,8 +673,7 @@ struct Chip8 {
case 0x2000: // 0x2NNN Calls subroutine at NNN. case 0x2000: // 0x2NNN Calls subroutine at NNN.
stack[sp++] = cpu.pc; stack[sp++] = cpu.pc;
pc_target = cpu.opcode.capture!(0, 12); pc_target = cpu.opcode & 0x0FFF;
break; break;
case 0x3000: // 0x3XNN Skips the next instruction if VX equals NN. case 0x3000: // 0x3XNN Skips the next instruction if VX equals NN.
@ -726,11 +732,25 @@ struct Chip8 {
break; break;
case 0x0004: // 0x8XY4 Adds VY to VX. VF is set to 1 when there's a carry, and to 0 when there isn't. case 0x0004: // 0x8XY4 Adds VY to VX. VF is set to 1 when there's a carry, and to 0 when there isn't.
cpu.v[x] += cpu.v[y]; //TODO carry flag auto vx = cpu.v[x];
auto vy = cpu.v[y];
if (cast(ushort)vx + cast(ushort)vy > 255) {
cpu.v[0xF] = 1;
} else {
cpu.v[0xF] = 0;
}
cpu.v[x] += cpu.v[y];
break; break;
case 0x0005: // 0x8XY5 VY is subtracted from VX. VF is set to 0 when there's a borrow, and 1 when there isn't. case 0x0005: // 0x8XY5 VY is subtracted from VX. VF is set to 0 when there's a borrow, and 1 when there isn't.
cpu.v[x] -= cpu.v[y]; //TODO borrow flag auto vx = cpu.v[x];
auto vy = cpu.v[y];
if (vx > vy) {
cpu.v[0xF] = 1;
} else {
cpu.v[0xF] = 0;
}
cpu.v[x] -= cpu.v[y];
break; break;
case 0x0006: // 0x8XY6 Shifts VX right by one. VF is set to the value of the least significant bit of VX before the shift. case 0x0006: // 0x8XY6 Shifts VX right by one. VF is set to the value of the least significant bit of VX before the shift.
@ -738,10 +758,18 @@ struct Chip8 {
auto vx = cpu.v[x]; auto vx = cpu.v[x];
cpu.v[0xF] = (vx & 0b10000000) >> 7; cpu.v[0xF] = (vx & 0b10000000) >> 7;
cpu.v[x] >>= 1; cpu.v[x] >>= 1;
cpu.v[x] /= 2;
break; break;
case 0x0007: // 0x8XY7 Sets VX to VY minus VX. VF is set to 0 when there's a borrow, and 1 when there isn't. case 0x0007: // 0x8XY7 Sets VX to VY minus VX. VF is set to 0 when there's a borrow, and 1 when there isn't.
cpu.v[x] = cast(Register)(cpu.v[y] - cpu.v[x]); // TODO borrow flag auto vx = cpu.v[x];
auto vy = cpu.v[y];
if (vy > vx) {
cpu.v[0xF] = 1;
} else {
cpu.v[0xF] = 0;
}
cpu.v[x] = cast(Register)(vy - vx); // TODO borrow flag
break; break;
case 0x000E: // 0x8XYE Shifts VX left by one. VF is set to the value of the most significant bit of VX before the shift. case 0x000E: // 0x8XYE Shifts VX left by one. VF is set to the value of the most significant bit of VX before the shift.
@ -749,6 +777,7 @@ struct Chip8 {
auto vx = cpu.v[x]; auto vx = cpu.v[x];
cpu.v[0xF] = (vx & 0b10000000) >> 7; cpu.v[0xF] = (vx & 0b10000000) >> 7;
cpu.v[x] <<= 1; cpu.v[x] <<= 1;
cpu.v[x] *= 2;
break; break;
default: // unhandled for some reason default: // unhandled for some reason
@ -1012,10 +1041,10 @@ struct Emulator {
status.initialize(&this, &emu); status.initialize(&this, &emu);
// debug data // debug data
emu.screen_buf[0] = 255; emu.screen_buf[0] = 1;
emu.screen_buf[64 - 1] = 255; emu.screen_buf[64 - 1] = 1;
emu.screen_buf[64*32 - 64] = 255; emu.screen_buf[64*32 - 64] = 1;
emu.screen_buf[64*32 - 1] = 255; emu.screen_buf[64*32 - 1] = 1;
// set up pixel buffer to poke a // set up pixel buffer to poke a
buf.create(emu.screen_buf.ptr, 64, 32); buf.create(emu.screen_buf.ptr, 64, 32);
@ -1069,12 +1098,11 @@ struct Emulator {
int w, h; int w, h;
window.windowSize(w, h); window.windowSize(w, h);
if (emu.draw_flag) { if (emu.draw_flag) {
buf.update(emu.screen_buf); buf.update(emu.screen_buf);
} }
buf.draw(w, h); buf.draw(w, h);
imgui.newFrame(window); imgui.newFrame(window);
status.draw(); status.draw();