use std::io::{self, Read, Write};
pub mod serialization;
pub mod f80;
pub(crate) mod util;
use serialization::*;
#[derive(Clone, Copy, Debug, FromPrimitive)]
#[repr(u8)]
pub enum OPCode
{
NOP,
HLT,
SYSCALL,
LEA,
MOV, CMOVcc, SETcc, XCHG,
REGOP,
AND, OR, XOR, TEST, BITWISE,
ADD, SUB, CMP, CMPZ,
MULDIV,
JMP, Jcc, LOOPcc, CALL, RET,
PUSH, POP,
INC, DEC, NEG, NOT,
STRING,
FINIT,
FLD,
FADD, FSUB, FSUBR,
DEBUG,
}
#[derive(Clone, Copy, FromPrimitive)]
pub enum Syscall {
Exit,
Read, Write, Seek,
Break,
}
pub struct Executable {
pub(crate) text_seglen: usize,
pub(crate) rodata_seglen: usize,
pub(crate) data_seglen: usize,
pub(crate) bss_seglen: usize,
pub(crate) content: Vec<u8>,
}
const EXE_PREFIX: &[u8] = "csx64-exe\0".as_bytes();
impl BinaryWrite for Executable {
fn bin_write<F: Write>(&self, f: &mut F) -> io::Result<()> {
EXE_PREFIX.bin_write(f)?;
self.text_seglen.bin_write(f)?;
self.rodata_seglen.bin_write(f)?;
self.data_seglen.bin_write(f)?;
self.bss_seglen.bin_write(f)?;
self.content.bin_write(f)
}
}
impl BinaryRead for Executable {
fn bin_read<F: Read>(f: &mut F) -> io::Result<Executable> {
if Vec::<u8>::bin_read(f)? != EXE_PREFIX {
return Err(io::ErrorKind::InvalidData.into());
}
let text_seglen = BinaryRead::bin_read(f)?;
let rodata_seglen = BinaryRead::bin_read(f)?;
let data_seglen = BinaryRead::bin_read(f)?;
let bss_seglen = BinaryRead::bin_read(f)?;
let content = BinaryRead::bin_read(f)?;
Ok(Executable { text_seglen, rodata_seglen, data_seglen, bss_seglen, content })
}
}