You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.5 KiB

  1. use std::fs;
  2. use std::io::Read;
  3. const w: usize = 64;
  4. const h: usize = 32;
  5. pub struct Chip8 {
  6. opcode: u16,
  7. memory: [u8; 4096],
  8. v: [u8; 16],
  9. index: u16,
  10. pc: u16,
  11. gfx: [u8; w * h],
  12. delay_timer: u8,
  13. sound_timer: u8,
  14. stack: [u16; 16],
  15. sp: isize,
  16. key: [u8; 16],
  17. pub draw_flag: bool,
  18. }
  19. const font_set: [u8; 80] = [
  20. 0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
  21. 0x20, 0x60, 0x20, 0x20, 0x70, // 1
  22. 0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2
  23. 0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3
  24. 0x90, 0x90, 0xF0, 0x10, 0x10, // 4
  25. 0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5
  26. 0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6
  27. 0xF0, 0x10, 0x20, 0x40, 0x40, // 7
  28. 0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8
  29. 0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9
  30. 0xF0, 0x90, 0xF0, 0x90, 0x90, // A
  31. 0xE0, 0x90, 0xE0, 0x90, 0xE0, // B
  32. 0xF0, 0x80, 0x80, 0x80, 0xF0, // C
  33. 0xE0, 0x90, 0x90, 0x90, 0xE0, // D
  34. 0xF0, 0x80, 0xF0, 0x80, 0xF0, // E
  35. 0xF0, 0x80, 0xF0, 0x80, 0x80, // F
  36. ];
  37. impl Chip8 {
  38. pub fn new() -> Chip8 {
  39. let mut c = Chip8 {
  40. opcode: 0,
  41. memory: [0; 4096],
  42. v: [0; 16],
  43. index: 0,
  44. pc: 0x200,
  45. gfx: [0; w * h],
  46. delay_timer: 0,
  47. sound_timer: 0,
  48. stack: [0; 16],
  49. sp: 0,
  50. key: [0; 16],
  51. draw_flag: false,
  52. };
  53. for i in 0..font_set.len() {
  54. c.memory[i] = font_set[i];
  55. }
  56. c
  57. }
  58. pub fn load_game(&mut self, filepath: &str) {
  59. let mut f = fs::File::open(filepath).expect("can not load rom file");
  60. let metadata = fs::metadata(filepath).expect("unable to read metadata");
  61. let mut b = vec![0; metadata.len() as usize];
  62. f.read(&mut b).expect("buffer overflow");
  63. for i in 0..b.len() {
  64. self.memory[512 + i] = b[i];
  65. }
  66. }
  67. pub fn emulate_cycle(&mut self) {
  68. self.opcode = (self.memory[self.pc as usize] as u16) << 8
  69. | self.memory[(self.pc + 1) as usize] as u16;
  70. let x: usize = ((self.opcode & 0x0F00) >> 8) as usize;
  71. let y: usize = ((self.opcode & 0x00F0) >> 4) as usize;
  72. let nn: u8 = (self.opcode & 0x00FF) as u8;
  73. let nnn: u16 = (self.opcode & 0x0FFF) as u16;
  74. // TODO
  75. }
  76. }
  77. #[cfg(test)]
  78. mod tests {
  79. use super::*;
  80. #[test]
  81. fn test_load_game() {
  82. let mut c = Chip8::new();
  83. c.load_game("Cargo.toml");
  84. c.emulate_cycle();
  85. // println!("{:?}", c.memory);
  86. }
  87. }