c64-assembler 0.2.0

Commodore 64 assembler, outputs directly to .PRG or Dasm source code
Documentation
use crate::{memory::address_mode::AddressMode, Application, Instructions};

use super::{AssemblerResult, Error};

pub fn validate_address_names_exists(application: &Application) -> AssemblerResult<()> {
    for module in &application.modules {
        validate_instructions(application, &module.instructions)?;
        for function in &module.functions {
            validate_instructions(application, &function.instructions)?;
        }
    }
    Ok(())
}

fn validate_instructions(application: &Application, instructions: &Instructions) -> AssemblerResult<()> {
    for instruction in &instructions.instructions {
        match &instruction.address_mode {
            AddressMode::Implied | AddressMode::Accumulator | AddressMode::Immediate(_) => {}
            AddressMode::Absolute(address_reference)
            | AddressMode::AbsoluteX(address_reference)
            | AddressMode::AbsoluteY(address_reference)
            | AddressMode::Relative(address_reference)
            | AddressMode::Indirect(address_reference)
            | AddressMode::IndexedIndirect(address_reference)
            | AddressMode::IndirectIndexed(address_reference) => {
                if !application.address_lookup.contains_key(&address_reference.name) {
                    return Err(Error::AddressNameUnknown(address_reference.name.to_string()));
                }
            }
        }
    }
    Ok(())
}