This commit is contained in:
parent
aad17f3dcc
commit
9f560af861
52
source/app.d
52
source/app.d
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue