From f4027cae775e3c9c237675f9df35a744d54f3f2e Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Mon, 28 Oct 2024 19:52:29 +1300 Subject: Rewrite assembler This is an almost complete rewrite of the entire assembler from the ground up, with a different parsing strategy and a whole new symbol resolution mechanism for automatically including library files. The assembly syntax has also been slightly modified, with padding tokens now being prefixed with '#' instead of '$', and a block-style anonymous-label syntax which uses the '{' and '}' characters. --- src/locators/bytecode.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/locators/bytecode.rs (limited to 'src/locators/bytecode.rs') diff --git a/src/locators/bytecode.rs b/src/locators/bytecode.rs new file mode 100644 index 0000000..500e9f0 --- /dev/null +++ b/src/locators/bytecode.rs @@ -0,0 +1,39 @@ +pub struct BytecodeSpan { + /// The location of this span in the assembled bytecode. + pub location: BytecodeLocation, + /// The bytes which this span represents. + pub bytes: Vec, +} + + +impl Default for BytecodeSpan { + fn default() -> Self { + Self { + location: BytecodeLocation { + address: 0, + length: 0, + }, + bytes: Vec::new(), + } + } +} + + +#[derive(Clone, Copy)] +pub struct BytecodeLocation { + // Address of the first byte. + pub address: usize, + // Length as a number of bytes. + pub length: usize, +} + + +impl std::fmt::Display for BytecodeLocation { + fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + write!(f, "0x{:>04x}", self.address)?; + if self.length > 0 { + write!(f, "-0x{:>04x}", self.address + self.length)?; + } + Ok(()) + } +} -- cgit v1.2.3-70-g09d2