geh
This commit is contained in:
		
							parent
							
								
									9f560af861
								
							
						
					
					
						commit
						f0d309f925
					
				
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										45
									
								
								source/app.d
								
								
								
								
							
							
						
						
									
										45
									
								
								source/app.d
								
								
								
								
							|  | @ -397,7 +397,7 @@ struct Chip8Status { | ||||||
| 
 | 
 | ||||||
| 		import std.file : read; | 		import std.file : read; | ||||||
| 
 | 
 | ||||||
| 		auto buf = read("programs/sqrt.ch8"); | 		auto buf = read("programs/chip8_picture.ch8"); | ||||||
| 		emu_.load(0x200, buf); // do ze load yes, will copy all the data in
 | 		emu_.load(0x200, buf); // do ze load yes, will copy all the data in
 | ||||||
| 
 | 
 | ||||||
| 	} // loadShortcut
 | 	} // loadShortcut
 | ||||||
|  | @ -523,15 +523,15 @@ struct Chip8Status { | ||||||
| 						case SDL_SCANCODE_G: redrawShortcut(); break; | 						case SDL_SCANCODE_G: redrawShortcut(); break; | ||||||
| 						case SDL_SCANCODE_T: toggleRunShortcut(); break; | 						case SDL_SCANCODE_T: toggleRunShortcut(); break; | ||||||
| 						case SDL_SCANCODE_S: stepShortcut(); break; | 						case SDL_SCANCODE_S: stepShortcut(); break; | ||||||
| 						case SDL_SCANCODE_Q: quitShortcut(); | 						case SDL_SCANCODE_Q: quitShortcut(); break; | ||||||
| 						default: break; | 						default: break; | ||||||
| 					} | 					} | ||||||
| 				} else { | 				} else { | ||||||
| 					if (ev.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { | 					if (ev.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { | ||||||
| 						quitShortcut(); | 						quitShortcut(); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 				break; | 				break; | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 			default: | 			default: | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
|  | @ -625,7 +625,8 @@ struct Chip8 { | ||||||
| 
 | 
 | ||||||
| 		cpu = cpu.init; | 		cpu = cpu.init; | ||||||
| 		stack = stack.init; | 		stack = stack.init; | ||||||
| 		ram = ram.init; | 		ram[0x200 .. $ - 1] = 0; | ||||||
|  | 		cpu.pc = 0x200; | ||||||
| 		sp = sp.init; | 		sp = sp.init; | ||||||
| 
 | 
 | ||||||
| 		run_flag = run_flag.init; | 		run_flag = run_flag.init; | ||||||
|  | @ -758,7 +759,6 @@ 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.
 | ||||||
|  | @ -777,7 +777,6 @@ 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
 | ||||||
|  | @ -801,13 +800,13 @@ struct Chip8 { | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
| 			case 0xB000: // 0xBNNN Jumps to the address NNN plus V0.
 | 			case 0xB000: // 0xBNNN Jumps to the address NNN plus V0.
 | ||||||
| 				pc_target = cast(ubyte)cpu.opcode.capture!(0, 12) + cpu.v[0x0]; | 				pc_target = cast(ProgramCounter)(cpu.opcode.capture!(0, 12) + cpu.v[0x0]); | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
| 			case 0xC000: // 0xCXNN Sets VX to the result of a bitwise and operation on a random number and NN.
 | 			case 0xC000: // 0xCXNN Sets VX to the result of a bitwise and operation on a random number and NN.
 | ||||||
| 
 | 
 | ||||||
| 				import std.random : uniform; | 				import std.random : uniform; | ||||||
| 				auto x = cpu.opcode.capture!(8, 12); | 				auto x = cpu.opcode.capture!(0, 8); | ||||||
| 				cpu.v[x] = uniform(Register.min, Register.max) & cpu.opcode.capture!(0, 8); | 				cpu.v[x] = uniform(Register.min, Register.max) & cpu.opcode.capture!(0, 8); | ||||||
| 				break; | 				break; | ||||||
| 
 | 
 | ||||||
|  | @ -829,12 +828,19 @@ struct Chip8 { | ||||||
| 					ushort pixel = ram[spr_addr + row]; | 					ushort pixel = ram[spr_addr + row]; | ||||||
| 
 | 
 | ||||||
| 					foreach (int col; 0 .. 8) { | 					foreach (int col; 0 .. 8) { | ||||||
| 						if ((pixel & (0x80 >> col)) != 0) { | 						if ((pixel & 0x80) > 0) { | ||||||
| 							if (screen_buf[(x + col + ((y + row) * 64))] == 1) { | 							auto x_off = (x + col) % 64; | ||||||
|  | 							auto y_off = (y + row) % 32; | ||||||
|  | 							auto offset = x_off + (y_off * 64); | ||||||
|  | 							if (screen_buf[offset] == 1) { | ||||||
| 								cpu.v[0xF] = 1; | 								cpu.v[0xF] = 1; | ||||||
|  | 							} else { | ||||||
|  | 								cpu.v[0xF] = 0; | ||||||
| 							} | 							} | ||||||
| 							screen_buf[x + row + ((y + col) * 64)] ^= 1; | 							screen_buf[offset] ^= 1; | ||||||
|  | 							writefln("write to offset: %d", offset); | ||||||
| 						} | 						} | ||||||
|  | 						pixel <<= 1; | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 				} | 				} | ||||||
|  | @ -971,18 +977,6 @@ struct Chip8 { | ||||||
| 
 | 
 | ||||||
| 	} // tick
 | 	} // tick
 | ||||||
| 
 | 
 | ||||||
| 	void draw() { |  | ||||||
| 		 |  | ||||||
| 		if (draw_flag) { |  | ||||||
| 			// update buffer with new pixel data
 |  | ||||||
| 			draw_flag = false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// glPixelZoom(rt.width / 64, rt.height / 32);
 |  | ||||||
| 		// glDrawPixels(64, 32, GL_RGB, GL_UNSIGNED_BYTE, screen_data.ptr);
 |  | ||||||
| 
 |  | ||||||
| 	} // draw
 |  | ||||||
| 
 |  | ||||||
| } // Emulator
 | } // Emulator
 | ||||||
| 
 | 
 | ||||||
| void loadLibs() { | void loadLibs() { | ||||||
|  | @ -1046,7 +1040,7 @@ struct Emulator { | ||||||
| 		emu.screen_buf[64*32 - 64] = 1; | 		emu.screen_buf[64*32 - 64] = 1; | ||||||
| 		emu.screen_buf[64*32 - 1] = 1; | 		emu.screen_buf[64*32 - 1] = 1; | ||||||
| 
 | 
 | ||||||
| 		// set up pixel buffer to poke a
 | 		// set up pixel buffer to poke at
 | ||||||
| 		buf.create(emu.screen_buf.ptr, 64, 32); | 		buf.create(emu.screen_buf.ptr, 64, 32); | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
|  | @ -1100,6 +1094,7 @@ struct Emulator { | ||||||
| 		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); | ||||||
|  | 			emu.draw_flag = false; | ||||||
| 		} | 		} | ||||||
| 		buf.draw(w, h); | 		buf.draw(w, h); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue