cpclib_asm::assembler

Struct Env

Source
pub struct Env { /* private fields */ }
Expand description

Environment of the assembly

Implementations§

Source§

impl Env

Symbols handling

Source

pub fn options(&self) -> &EnvOptions

Source

pub fn symbols(&self) -> &SymbolsTableCaseDependent

Source

pub fn symbols_mut(&mut self) -> &mut SymbolsTableCaseDependent

Source

pub fn get_fname<E: ExprEvaluationExt + Debug>( &self, exp: &E, ) -> Result<String, AssemblerError>

Source

pub fn resolve_expr_may_fail_in_first_pass<E: ExprEvaluationExt>( &self, exp: &E, ) -> Result<ExprResult, AssemblerError>

Compute the expression thanks to the symbol table of the environment. If the expression is not solvable in first pass, 0 is returned. If the expression is not solvable in second pass, an error is returned

However, when assembling in a crunched section, the expression MUST NOT fail. edit: why ? I do not get it now and I have removed this limitation

Source

pub fn resolve_index_may_fail_in_first_pass<E: ExprEvaluationExt>( &self, (op, exp): (BinaryOperation, &E), ) -> Result<ExprResult, AssemblerError>

Source

pub fn resolve_expr_may_fail_in_first_pass_with_default<E: ExprEvaluationExt, R: Into<ExprResult>>( &self, exp: &E, r: R, ) -> Result<ExprResult, AssemblerError>

Source§

impl Env

Report handling

Source

pub fn report(&self, start: &Instant) -> Report<'_>

Source§

impl Env

Handle the file search relatively to the current file

Source§

impl Env

Error handling

Source

pub fn add_error_discardable_one_pass( &mut self, e: AssemblerError, ) -> Result<(), AssemblerError>

If the error has not been raised at the previous pass, store it and do not propagate it. Otherwise, propagate it

Source§

impl Env

Source

pub fn with_table(symbols: &SymbolsTable) -> Self

Create an environment that embeds a copy of the given table and is configured to be in the latest pass. Mainly used for tests. TODO use bon here

Source

pub fn with_table_case_dependent(symbols: &SymbolsTableCaseDependent) -> Self

TODO use bon here

Source

pub fn warnings(&self) -> &[AssemblerError]

Source

pub fn handle_post_actions( &mut self, ) -> Result<(Option<RemuChunk>, Option<WabpChunk>), AssemblerError>

Handle the actions to do after assembling. ATM it is only the save of data for each page

Source

pub fn observer(&self) -> Rc<dyn EnvEventObserver>

Source

pub fn handle_print(&mut self) -> Result<(), AssemblerError>

Source§

impl Env

Output handling

Source

pub fn logical_output_address(&self) -> u16

Return the address where the next byte will be written

Source

pub fn physical_output_address(&self) -> PhysicalAddress

Source

pub fn physical_code_address(&self) -> PhysicalAddress

Source

pub fn logical_code_address(&self) -> u16

Return the address of dollar

Source

pub fn output_limit_address(&self) -> u16

Source

pub fn code_limit_address(&self) -> u16

Source

pub fn start_address(&self) -> Option<u16>

Source

pub fn maximum_address(&self) -> u16

Source

pub fn update_dollar(&mut self)

. Update the value of $ in the symbol table in order to take the current output address

Source

pub fn get_memory(&self, start: u16, size: u16) -> Vec<u8>

Produce the memory for the required limits TODO check that the implementation is still correct with snapshot inclusion BUG does not take into account extra bank configuration

Source

pub fn produced_bytes(&self) -> Vec<u8>

Returns the stream of bytes produced for a 64k compilation

Source

pub fn loading_address(&self) -> Option<u16>

Returns the address of the 1st written byte

Source

pub fn execution_address(&self) -> Option<u16>

Returns the address from when to start the program TODO really configure this address

Source

pub fn output_byte(&mut self, v: u8) -> Result<bool, AssemblerError>

Output one byte either in the appropriate bank of the snapshot or in the termporary bank return true if it raised an override warning

Source

pub fn allow_memory_override(&self) -> bool

Source

pub fn output_bytes(&mut self, bytes: &[u8]) -> Result<(), AssemblerError>

Write consecutives bytes

Source

pub fn peek(&self, address: &PhysicalAddress) -> u8

Source

pub fn poke( &mut self, byte: u8, address: &PhysicalAddress, ) -> Result<(), AssemblerError>

Source

pub fn size(&self) -> u16

Get the size of the generated binary. ATTENTION it can only work when geneating 0x10000 files

Source

pub fn eval(&self, expr: &Expr) -> Result<ExprResult, AssemblerError>

Evaluate the expression according to the current state of the environment

Source

pub fn sna(&self) -> &Snapshot

Examples found in repository?
examples/generate_loop4000.rs (line 10)
5
6
7
8
9
10
11
12
13
fn build_sna(code: &str) -> Snapshot {
    let listing =
        parse_z80_with_context_builder(code, Default::default()).expect("Unable to parse z80 code");
    let (_, env) = visit_tokens_all_passes_with_options(&listing, Default::default())
        .expect("Unable to assemble z80 code");
    let sna = env.sna().clone();

    sna
}
Source

pub fn sna_version(&self) -> SnapshotVersion

Source

pub fn save_sna<P: AsRef<Utf8Path>>(&self, fname: P) -> Result<(), Error>

Source

pub fn save_cpr<P: AsRef<Utf8Path>>( &self, fname: P, ) -> Result<(), AssemblerError>

Source§

impl Env

Source

pub fn add_warning(&mut self, warning: AssemblerError)

Source§

impl Env

Visit directives

Source

pub fn visit_org_set_arguments( &mut self, code_adr: u16, output_adr: u16, ) -> Result<(), AssemblerError>

Source§

impl Env

Source

pub fn generate_symbols_output<W: Write>( &self, w: &mut W, fmt: SymbolOutputFormat, ) -> Result<()>

Write in w the list of symbols

Source

pub fn visit_listing<T: ListingElement + Visited + MayHaveSpan>( &mut self, listing: &[T], ) -> Result<(), AssemblerError>

Visit all the tokens of the slice of tokens. Return true if an additional pass is requested

Source

pub fn visit_macro_definition( &mut self, name: &str, arguments: &[&str], code: &str, source: Option<&Z80Span>, flavor: AssemblerFlavor, ) -> Result<(), AssemblerError>

Source

pub fn visit_waitnops<E: ExprEvaluationExt>( &mut self, count: &E, ) -> Result<(), AssemblerError>

Source

pub fn visit_struct_definition<T: ListingElement + ToSimpleToken, S1: SourceString, S2: AsRef<str>>( &mut self, name: S1, content: &[(S2, T)], source: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Source

pub fn visit_buildcpr(&mut self) -> Result<(), AssemblerError>

Source

pub fn visit_buildsna( &mut self, version: Option<&SnapshotVersion>, ) -> Result<(), AssemblerError>

Source

pub fn visit_assembler_control<C: AssemblerControlCommand>( &mut self, cmd: &C, span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Source

pub fn visit_align<E: ExprEvaluationExt>( &mut self, boundary: &E, fill: Option<&E>, ) -> Result<(), AssemblerError>

Source

pub fn logical_to_physical_address(&self, address: u16) -> PhysicalAddress

return the page and bank configuration for the given address at the current mmr configuration https://grimware.org/doku.php/documentations/devices/gatearray#mmr

Source

pub fn visit_undef<S: SourceString>( &mut self, label: S, ) -> Result<(), AssemblerError>

Remove the given variable from the table of symbols

Source

pub fn visit_protect<E: ExprEvaluationExt>( &mut self, start: &E, stop: &E, ) -> Result<(), AssemblerError>

Source

pub fn visit_print(&mut self, info: &[FormattedExpr], span: Option<&Z80Span>)

Print the evaluation of the expression in the 2nd pass

Source

pub fn visit_pause(&mut self, span: Option<&Z80Span>)

Source

pub fn visit_fail( &self, info: Option<&[FormattedExpr]>, ) -> Result<(), AssemblerError>

Source

pub fn visit_save<E: ExprEvaluationExt + Debug>( &mut self, amsdos_fname: &E, address: Option<&E>, size: Option<&E>, save_type: Option<&SaveType>, dsk_fname: Option<&E>, _side: Option<&E>, ) -> Result<(), AssemblerError>

Source

pub fn visit_charset( &mut self, format: &CharsetFormat, ) -> Result<(), AssemblerError>

Source

pub fn visit_snainit<E: ExprEvaluationExt + Debug>( &mut self, fname: &E, ) -> Result<(), AssemblerError>

Source

pub fn visit_snaset( &mut self, flag: &SnapshotFlag, value: &FlagValue, ) -> Result<(), AssemblerError>

Source

pub fn visit_incbin(&mut self, data: &[u8]) -> Result<(), AssemblerError>

Source

pub fn visit_crunched_section<'tokens, T: Visited + ListingElement + MayHaveSpan + Sync>( &mut self, kind: &CrunchType, lst: &mut [ProcessedToken<'tokens, T>], previous_bytes: &mut Option<Vec<u8>>, previous_crunched_bytes: &mut Option<Vec<u8>>, span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Handle a crunched section. bytes generated during previous pass or previous loop are provided TO NOT crunched them an additional time if they are similar

Source§

impl Env

Visit the tokens during several passes without providing a specific symbol table.

Source

pub fn new(options: EnvOptions) -> Self

Source

pub fn pass(&self) -> &AssemblingPass

Source§

impl Env

Source

pub fn visit_return<E: ExprEvaluationExt>( &mut self, e: &E, ) -> Result<(), AssemblerError>

Source

pub fn user_defined_function( &self, name: &str, ) -> Result<&Function, AssemblerError>

Source

pub fn any_function<'res>( &'res self, name: &'res str, ) -> Result<&'res Function, AssemblerError>

Source§

impl Env

Source

pub fn visit_while<'token, E, T>( &mut self, cond: &E, code: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Source

pub fn visit_iterate<'token, E: ExprEvaluationExt, T: ListingElement<Expr = E> + Visited + MayHaveSpan + Sync>( &mut self, counter_name: &str, values: Either<&Vec<E>, &E>, code: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Handle the iterate repetition directive Values is either a list of values or a Expression that represents a list

Source

pub fn visit_rorg<'token, T, E>( &mut self, address: &E, code: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Source

pub fn visit_confined<'token, E: ExprEvaluationExt, T>( &mut self, lst: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Source

pub fn visit_for<'token, E: ExprEvaluationExt, T>( &mut self, label: &str, start: &E, stop: &E, step: Option<&E>, code: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Handle the for directive

Source

pub fn visit_repeat_until<'token, E, T>( &mut self, cond: &E, code: &mut [ProcessedToken<'token, T>], span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Handle the standard repetition directive

Source

pub fn visit_starting_index<E>( &mut self, start: Option<&E>, step: Option<&E>, ) -> Result<(), AssemblerError>

Source

pub fn visit_repeat<'token, T, E>( &mut self, count: &E, code: &mut [ProcessedToken<'token, T>], counter_name: Option<&str>, counter_start: Option<&E>, counter_step: Option<&E>, span: Option<&Z80Span>, ) -> Result<(), AssemblerError>

Handle the standard repetition directive

Source§

impl Env

Macro related code

Source

pub fn inc_macro_seed(&mut self)

Source

pub fn macro_seed(&self) -> usize

Source§

impl Env

Warnings related code

Source

pub fn cleanup_warnings(&mut self)

Source§

impl Env

Source

pub fn visit_basic<S: SourceString, S2: SourceString, E: ExprEvaluationExt>( &mut self, variables: Option<Vec<S>>, hidden_lines: Option<&Vec<E>>, code: S2, ) -> Result<(), AssemblerError>

Source

pub fn assemble_basic<S: SourceString, S2: SourceString, E: ExprEvaluationExt>( &mut self, variables: Option<Vec<S>>, hidden_lines: Option<&Vec<E>>, code: S2, ) -> Result<Vec<u8>, AssemblerError>

Source§

impl Env

Trait Implementations§

Source§

impl Clone for Env

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Env

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Env

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl !Freeze for Env

§

impl !RefUnwindSafe for Env

§

impl !Send for Env

§

impl !Sync for Env

§

impl Unpin for Env

§

impl !UnwindSafe for Env

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.