Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::io::prelude::*;
- use std::fs::File;
- #[allow(dead_code)]
- struct CPU {
- pub opcode: u16,
- pub memory: [u8; 4096],
- pub i: u16,
- pub v: [u8; 16],
- pub sound_timer: u8,
- pub delay_timer: u8,
- pub pc: u16,
- pub sp: u8,
- pub stack: [u16; 16],
- }
- type Instruction = fn(&mut CPU);
- fn ldi(cpu: &mut CPU) {
- let code = cpu.opcode;
- let register = ((code & 0x0F00) >> 8) as usize;
- let value = (code & 0xFF) as u8;
- cpu.v[register] = value;
- cpu.pc += 2;
- }
- fn ldii(cpu: &mut CPU) {
- cpu.i = cpu.opcode & 0x0FFF;
- cpu.pc += 2;
- }
- fn call(cpu: &mut CPU) {
- let addr = cpu.opcode & 0x0FFF;
- cpu.stack[cpu.sp as usize] = cpu.pc;
- cpu.sp += 1;
- cpu.pc = addr;
- }
- fn load_program_in_vect(path: &str) -> Vec<u8> {
- let mut vect: Vec<u8> = Vec::new();
- let mut file = File::open(path)
- .expect("Fichier pas trouvé");
- file.read_to_end(&mut vect).expect("Impossible de lire le fichier");
- return vect;
- }
- fn load_vect_in_memory(cpu: &mut CPU, vect: Vec<u8>) {
- for i in 0..vect.len() {
- cpu.memory[i + (cpu.i as usize)] = vect[i];
- }
- }
- fn initialize_instructions(inst: &mut Vec<(u16, Instruction)>) {
- inst.push((0x6000, ldi));
- inst.push((0x2000, call));
- inst.push((0xa000, ldii));
- }
- fn main() {
- //let _display = [[0u8; 32]; 64];
- let mut cpu = CPU {
- opcode: 0,
- v: [0; 16],
- i: 0x200,
- sound_timer: 0,
- delay_timer: 0,
- pc: 0x200,
- sp: 0,
- memory: [0; 4096],
- stack: [0; 16],
- };
- let vect = load_program_in_vect("test.ch8");
- load_vect_in_memory(&mut cpu, vect);
- let mut instr: Vec<(u16, Instruction)> = Vec::new();
- initialize_instructions(&mut instr);
- //while true {
- cpu.opcode = ((cpu.memory[cpu.pc as usize] as u16) << 8) | (cpu.memory[(cpu.pc + 1) as usize] as u16);
- let test = ((cpu.memory[842] as u16) << 8) | (cpu.memory[843] as u16);
- println!("test {:04x}", test);
- println!("opcode {:04x}", cpu.opcode);
- while true {
- for inst in &instr {
- let (code, function) = *inst;
- if cpu.opcode & code == code {
- function(&mut cpu);
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement