Advertisement
Guest User

Untitled

a guest
Feb 26th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.28 KB | None | 0 0
  1. use std::io::prelude::*;
  2. use std::fs::File;
  3.  
  4. #[allow(dead_code)]
  5. struct CPU {
  6.     pub opcode: u16,
  7.     pub memory: [u8; 4096],
  8.     pub i: u16,
  9.     pub v: [u8; 16],
  10.     pub sound_timer: u8,
  11.     pub delay_timer: u8,
  12.     pub pc: u16,
  13.     pub sp: u8,
  14.     pub stack: [u16; 16],
  15. }
  16.  
  17. type Instruction = fn(&mut CPU);
  18.  
  19. fn ldi(cpu: &mut CPU) {
  20.     let code = cpu.opcode;
  21.     let register = ((code & 0x0F00) >> 8) as usize;
  22.     let value = (code & 0xFF) as u8;
  23.     cpu.v[register] = value;
  24.     cpu.pc += 2;
  25. }
  26.  
  27. fn ldii(cpu: &mut CPU) {
  28.     cpu.i = cpu.opcode & 0x0FFF;
  29.     cpu.pc += 2;
  30. }
  31.  
  32. fn call(cpu: &mut CPU) {
  33.     let addr = cpu.opcode & 0x0FFF;
  34.     cpu.stack[cpu.sp as usize] = cpu.pc;
  35.     cpu.sp += 1;
  36.     cpu.pc = addr;
  37. }
  38.  
  39. fn load_program_in_vect(path: &str) -> Vec<u8> {
  40.     let mut vect: Vec<u8> = Vec::new();
  41.     let mut file = File::open(path)
  42.         .expect("Fichier pas trouvĂ©");
  43.     file.read_to_end(&mut vect).expect("Impossible de lire le fichier");
  44.     return vect;
  45. }
  46.  
  47. fn load_vect_in_memory(cpu: &mut CPU, vect: Vec<u8>) {
  48.     for i in 0..vect.len() {
  49.         cpu.memory[i + (cpu.i as usize)] = vect[i];
  50.     }
  51. }
  52.  
  53. fn initialize_instructions(inst: &mut Vec<(u16, Instruction)>) {
  54.     inst.push((0x6000, ldi));
  55.     inst.push((0x2000, call));
  56.     inst.push((0xa000, ldii));
  57. }
  58.  
  59. fn main() {
  60.     //let _display = [[0u8; 32]; 64];
  61.     let mut cpu = CPU {
  62.         opcode: 0,
  63.         v: [0; 16],
  64.         i: 0x200,
  65.         sound_timer: 0,
  66.         delay_timer: 0,
  67.         pc: 0x200,
  68.         sp: 0,
  69.         memory: [0; 4096],
  70.         stack: [0; 16],
  71.     };
  72.     let vect = load_program_in_vect("test.ch8");
  73.     load_vect_in_memory(&mut cpu, vect);
  74.     let mut instr: Vec<(u16, Instruction)> = Vec::new();
  75.     initialize_instructions(&mut instr);
  76.     //while true {
  77.  
  78.     cpu.opcode = ((cpu.memory[cpu.pc as usize] as u16) << 8) | (cpu.memory[(cpu.pc + 1) as usize] as u16);
  79.     let test = ((cpu.memory[842] as u16) << 8) | (cpu.memory[843] as u16);
  80.     println!("test {:04x}", test);
  81.     println!("opcode {:04x}", cpu.opcode);
  82.     while true {
  83.         for inst in &instr {
  84.             let (code, function) = *inst;
  85.             if cpu.opcode & code == code {
  86.                 function(&mut cpu);
  87.                 break;
  88.             }
  89.         }
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement