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
use crate::*;


pub fn parse_directive_bits(
    state: &mut asm::parser::State)
    -> Result<(), ()>
{
    state.asm_state.cur_wordsize = asm::parser::parse_expr_usize_fn(state, |u| match u
    {
        0 => None,
        _ => Some(u)
    })?;

    Ok(())
}


pub fn parse_directive_res(
    state: &mut asm::parser::State)
    -> Result<(), ()>
{
    let words = asm::parser::parse_expr_usize(state)?;

    // FIXME: multiplication can overflow
    let bits = words * state.asm_state.cur_wordsize;

    let bankdata = state.asm_state.get_bankdata_mut(state.asm_state.cur_bank);
    bankdata.reserve(bits);
    
    Ok(())
}


pub fn parse_directive_align(
    state: &mut asm::parser::State)
    -> Result<(), ()>
{
    let wordsize = asm::parser::parse_expr_usize_fn(state, |u| match u
    {
        0 => None,
        _ => Some(u),
    })?;

    let bankdata = state.asm_state.get_bankdata(state.asm_state.cur_bank);
    let skip_bits = bankdata.bits_until_aligned(state.asm_state, wordsize);

    let bankdata = state.asm_state.get_bankdata_mut(state.asm_state.cur_bank);
    bankdata.reserve(skip_bits);
    
    Ok(())
}


pub fn parse_directive_labelalign(
    state: &mut asm::parser::State)
    -> Result<(), ()>
{
    state.asm_state.cur_labelalign = asm::parser::parse_expr_usize_fn(state, |u| match u
    {
        0 => None,
        _ => Some(u),
    })?;

    Ok(())
}


pub fn parse_directive_addr(
    state: &mut asm::parser::State)
    -> Result<(), ()>
{
    let (addr, addr_span) = asm::parser::parse_expr_bigint(state)?;

    let bankdata = state.asm_state.get_bankdata(state.asm_state.cur_bank);
    let skip_bits = bankdata.bits_until_address(
        state.asm_state,
        addr,
        state.report.clone(),
        &addr_span)?;

    let bankdata = state.asm_state.get_bankdata_mut(state.asm_state.cur_bank);
    bankdata.reserve(skip_bits);
    
    Ok(())
}