Compare commits

...

2 Commits

Author SHA1 Message Date
mebibytedraco
cb6e6ece7d Fix usage of constants for data.fill 2024-02-22 19:19:24 -05:00
mebibytedraco
8ccc3c0503 Allow using constant as size argument to data.fill 2024-02-22 13:25:03 -05:00

View File

@ -276,6 +276,13 @@ struct OperationTwo {
rhs: Box<AstNode>, rhs: Box<AstNode>,
} }
// This might be a terrible idea
#[derive(PartialEq, Debug, Clone)]
enum SizeOrLabelName {
Size(u32),
Label(String),
}
#[derive(PartialEq, Debug, Clone)] #[derive(PartialEq, Debug, Clone)]
enum AstNode { enum AstNode {
OperationZero(OperationZero) , OperationZero(OperationZero) ,
@ -317,7 +324,7 @@ enum AstNode {
DataStrZero(String), DataStrZero(String),
DataFill { DataFill {
value: u8, value: u8,
size: u32, size: SizeOrLabelName,
}, },
IncludedBinary(Vec<u8>), IncludedBinary(Vec<u8>),
@ -412,6 +419,13 @@ fn main() {
current_address = origin_address; current_address = origin_address;
instructions.push(vec![0; difference].into()); instructions.push(vec![0; difference].into());
} else if let AstNode::DataFill {value, size} = node { } else if let AstNode::DataFill {value, size} = node {
let size = match size {
SizeOrLabelName::Size(size) => size,
SizeOrLabelName::Label(name) => {
let address_table = LABEL_ADDRESSES.lock().unwrap();
address_table.get(&name).expect(&format!("Label not found: {}", name)).0
},
};
current_address += size; current_address += size;
instructions.push(vec![value; size as usize].into()); instructions.push(vec![value; size as usize].into());
} else if let AstNode::IncludedBinary(binary_vec) = node { } else if let AstNode::IncludedBinary(binary_vec) = node {
@ -430,6 +444,7 @@ fn main() {
println!("Performing label backpatching..."); println!("Performing label backpatching...");
let table = LABEL_TARGETS.lock().unwrap(); let table = LABEL_TARGETS.lock().unwrap();
let address_table = LABEL_ADDRESSES.lock().unwrap(); let address_table = LABEL_ADDRESSES.lock().unwrap();
dbg!(&address_table);
let address_file = format_address_table(&address_table); let address_file = format_address_table(&address_table);
println!("{}", address_file); println!("{}", address_file);
@ -691,8 +706,11 @@ fn parse_data(pair: pest::iterators::Pair<Rule>) -> AstNode {
let size = { let size = {
let ast = parse_operand(pair.into_inner().nth(1).unwrap(), false); let ast = parse_operand(pair.into_inner().nth(1).unwrap(), false);
if let AstNode::Immediate32(word) = ast { if let AstNode::Immediate32(word) = ast {
word SizeOrLabelName::Size(word)
} else if let AstNode::LabelOperand {name, ..} = ast {
SizeOrLabelName::Label(name)
} else { } else {
dbg!(ast);
unreachable!() unreachable!()
} }
}; };
@ -1504,4 +1522,4 @@ fn optimize_node(node: AstNode, enabled: &mut bool) -> AstNode {
} else { } else {
node node
} }
} }