1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#![no_std]
#![no_main]
use core::fmt::Write;
#[cfg(target_arch = "x86_64")]
core::arch::global_asm!(
".text",
".global _start",
".type _start,@function",
"_start:",
"xor rbp,rbp",
"mov rdi, rsp",
".weak _DYNAMIC",
".hidden _DYNAMIC",
"lea rsi, [rip + _DYNAMIC]",
"and rsp,-16",
"call __proxy_main"
);
struct Printer {
buf: [u8; 512],
pos: usize,
}
impl Printer {
fn new() -> Self {
Self {
buf: [0; 512],
pos: 0,
}
}
fn bytes(&self) -> &[u8] {
&self.buf[..self.pos]
}
}
impl core::fmt::Write for Printer {
fn write_str(&mut self, s: &str) -> core::fmt::Result {
let remaining_buf = &mut self.buf[self.pos..];
let raw_s = s.as_bytes();
let write_num = raw_s.len().min(remaining_buf.len());
remaining_buf[..write_num].copy_from_slice(&raw_s[..write_num]);
self.pos += raw_s.len();
if write_num < raw_s.len() {
Err(core::fmt::Error)
} else {
Ok(())
}
}
}
#[panic_handler]
fn panic(info: &core::panic::PanicInfo) -> ! {
let mut p = Printer::new();
let _ = write!(&mut p, "Fatal error: {}\n", info);
let stderr = unsafe { rustix::stdio::stderr() };
let _ = rustix::io::write(stderr, p.bytes());
rustix::runtime::exit_group(1)
}
#[unsafe(no_mangle)]
unsafe extern "C" fn __proxy_main(_stack_ptr: *const u8, _dynv: *const usize) {
let code = main();
rustix::runtime::exit_group(code);
}
fn main() -> i32 {
let mut p = Printer::new();
write!(&mut p, "Hello {}, you are worth {} tons of gold\n", "Jacques", 10_000).expect("Could not format this");
let stdout = unsafe { rustix::stdio::stdout() };
let _ = rustix::io::write(stdout, p.bytes());
0
}
// use std::{
// fs::File,
// io::BufReader,
// time::{Duration, Instant},
// };
// const SECOND: u64 = 1_000_000_000;
// const REFRESH_RATE: u64 = 60;
// const FRAME_DURATION: Duration = Duration::from_nanos(SECOND / REFRESH_RATE);
// fn main() -> std::io::Result<()> {
// if let Some(arg) = std::env::args().nth(1) {
// let mut chip8 = chip8::Chip8::new();
// {
// let file = File::open(arg)?;
// let buf_reader = BufReader::new(file);
// chip8.load_rom(buf_reader)?;
// }
// loop {
// let start = Instant::now();
// for _ in 0..8 {
// chip8.cycle();
// }
// chip8.display()?;
// std::thread::sleep(FRAME_DURATION - start.elapsed());
// }
// } else {
// println!("usage: chip8 rompath")
// }
// Ok(())
// }
|