This commit is contained in:
		
							parent
							
								
									aad17f3dcc
								
							
						
					
					
						commit
						9f560af861
					
				
							
								
								
									
										56
									
								
								source/app.d
								
								
								
								
							
							
						
						
									
										56
									
								
								source/app.d
								
								
								
								
							| 
						 | 
				
			
			@ -301,7 +301,7 @@ struct PixelBuffer {
 | 
			
		|||
		out vec4 out_col;
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -624,6 +624,13 @@ struct Chip8 {
 | 
			
		|||
	void reset() {
 | 
			
		||||
 | 
			
		||||
		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_data = screen_data.init;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -666,8 +673,7 @@ struct Chip8 {
 | 
			
		|||
			case 0x2000: // 0x2NNN Calls subroutine at NNN.
 | 
			
		||||
 | 
			
		||||
				stack[sp++] = cpu.pc;
 | 
			
		||||
				pc_target = cpu.opcode.capture!(0, 12);
 | 
			
		||||
 | 
			
		||||
				pc_target = cpu.opcode & 0x0FFF;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x3000: // 0x3XNN Skips the next instruction if VX equals NN.
 | 
			
		||||
| 
						 | 
				
			
			@ -726,11 +732,25 @@ struct Chip8 {
 | 
			
		|||
						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.
 | 
			
		||||
						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;
 | 
			
		||||
 | 
			
		||||
					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;
 | 
			
		||||
 | 
			
		||||
					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];
 | 
			
		||||
						cpu.v[0xF] = (vx & 0b10000000) >> 7;
 | 
			
		||||
						cpu.v[x] >>= 1;
 | 
			
		||||
						cpu.v[x] /= 2;
 | 
			
		||||
						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.
 | 
			
		||||
						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;
 | 
			
		||||
 | 
			
		||||
					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];
 | 
			
		||||
						cpu.v[0xF] = (vx & 0b10000000) >> 7;
 | 
			
		||||
						cpu.v[x] <<= 1;
 | 
			
		||||
						cpu.v[x] *= 2;
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
					default: // unhandled for some reason
 | 
			
		||||
| 
						 | 
				
			
			@ -762,7 +791,7 @@ struct Chip8 {
 | 
			
		|||
			case 0x9000: // 0x9XYO Skips the next instruction if VX doesn't equal VY.
 | 
			
		||||
 | 
			
		||||
				if (cpu.v[cpu.opcode.capture!(8, 12)] != cpu.v[cpu.opcode.capture!(4, 8)]) {
 | 
			
		||||
					pc_target += 2; //do skip yes
 | 
			
		||||
					pc_target += 2; // do skip yes
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				break;
 | 
			
		||||
| 
						 | 
				
			
			@ -897,7 +926,7 @@ struct Chip8 {
 | 
			
		|||
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
					default: //unhandled for some reason
 | 
			
		||||
					default: // unhandled for some reason
 | 
			
		||||
						writefln("unknown opcode: 0x%x", cpu.opcode);
 | 
			
		||||
						break;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1012,10 +1041,10 @@ struct Emulator {
 | 
			
		|||
		status.initialize(&this, &emu);
 | 
			
		||||
 | 
			
		||||
		// debug data
 | 
			
		||||
		emu.screen_buf[0] = 255;
 | 
			
		||||
		emu.screen_buf[64 - 1] = 255;
 | 
			
		||||
		emu.screen_buf[64*32 - 64] = 255;
 | 
			
		||||
		emu.screen_buf[64*32 - 1] = 255;
 | 
			
		||||
		emu.screen_buf[0] = 1;
 | 
			
		||||
		emu.screen_buf[64 - 1] = 1;
 | 
			
		||||
		emu.screen_buf[64*32 - 64] = 1;
 | 
			
		||||
		emu.screen_buf[64*32 - 1] = 1;
 | 
			
		||||
 | 
			
		||||
		// set up pixel buffer to poke a
 | 
			
		||||
		buf.create(emu.screen_buf.ptr, 64, 32);
 | 
			
		||||
| 
						 | 
				
			
			@ -1069,12 +1098,11 @@ struct Emulator {
 | 
			
		|||
 | 
			
		||||
		int w, h;
 | 
			
		||||
		window.windowSize(w, h);
 | 
			
		||||
 | 
			
		||||
		if (emu.draw_flag) {
 | 
			
		||||
			buf.update(emu.screen_buf);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		buf.draw(w, h);
 | 
			
		||||
 | 
			
		||||
		imgui.newFrame(window);
 | 
			
		||||
 | 
			
		||||
		status.draw();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue