started assembler logic rewrite

This commit is contained in:
2026-03-13 16:39:58 +00:00
parent 6da473c272
commit 06c6ba534d
15 changed files with 359 additions and 27 deletions
+8
View File
@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/dsa/assembler_old/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/dsa/common/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/dsa/compiler/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/dsa/emulator/benches" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/dsa/emulator/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/dsa/linker/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/dsa2.iml" filepath="$PROJECT_DIR$/.idea/dsa2.iml" />
</modules>
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+67
View File
@@ -0,0 +1,67 @@
pub enum AsmOpcode {
Nop,
// move
Mov,
CMov,
// load
Ldb,
Ldbs,
Ldh,
Ldhs,
Ldw,
// store
Stb,
Sth,
Stw,
// load immediate
Lli,
Lui,
Lwi,
// comparison
Ieq,
Ine,
Ilt,
Ile,
Igt,
Ige,
// jump
Jmp,
Jez,
Jnz,
Jic,
Jnc,
// bitwise
And,
Nand,
Or,
Nor,
Xor,
Xnor,
Not,
// arithmetic
Add,
Sub,
Shl,
Shr,
Addi,
Subi,
// utility
Push,
Pop,
Call,
Ret,
// system
Int,
IRet,
Hlt,
}
+232
View File
@@ -0,0 +1,232 @@
use crate::prelude::Register;
pub struct Location {
offset: u16,
register: Option<Register>,
label: Option<String>,
}
impl Location {
pub fn new(offset: u16, register: Option<Register>, label: Option<String>) -> Self {
Location {
offset,
register,
label,
}
}
// need implementation to intelligently figure out if we need to load immediates
// so if the label is a const and > u16::max, we do Lui $label temp, then use temp as an offset
// if a register is being used already we have to add the offset to that.
}
pub enum ImmConst {
Label(String),
Imm16(u16),
Imm32(u32),
}
pub enum PseudoInstruction {
Nop,
// move
Mov {
src: Register,
dest: Register,
},
CMov {
src: Register,
dest: Register,
condition: Register,
},
// load
Ldb {
addr: Location,
dest: Register,
},
Ldbs {
addr: Location,
dest: Register,
},
Ldh {
addr: Location,
dest: Register,
},
Ldhs {
addr: Location,
dest: Register,
},
Ldw {
addr: Location,
dest: Register,
},
// store
Stb {
src: Register,
addr: Location,
},
Sth {
src: Register,
addr: Location,
},
Stw {
src: Register,
addr: Location,
},
// load immediate
Lli {
dest: Register,
value: ImmConst,
},
Lui {
dest: Register,
value: ImmConst,
},
Lwi {
dest: Register,
value: ImmConst,
},
// comparison
Ieq {
src1: Register,
src2: Register,
dest: Register,
},
Ine {
src1: Register,
src2: Register,
dest: Register,
},
Ilt {
src1: Register,
src2: Register,
dest: Register,
},
Ile {
src1: Register,
src2: Register,
dest: Register,
},
Igt {
src1: Register,
src2: Register,
dest: Register,
},
Ige {
src1: Register,
src2: Register,
dest: Register,
},
// jump
Jmp {
dest: Location,
},
Jez {
dest: Location,
cond: Register,
},
Jnz {
dest: Location,
cond: Register,
},
Jic {
dest: Location,
},
Jnc {
dest: Location,
},
// bitwise
And {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Nand {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Or {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Nor {
src1: Register,
src2: Register,
dest: Register,
},
Xor {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Xnor {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Not {
src: Register,
dest: Option<Register>,
},
// arithmetic
Add {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Sub {
src1: Register,
src2: Register,
dest: Option<Register>,
},
Shl {
src: Register,
shamt_r: Option<Register>,
shamt_i: Option<ImmConst>,
dest: Option<Register>,
},
Shr {
src: Register,
shamt_r: Option<Register>,
shamt_i: Option<ImmConst>,
dest: Option<Register>,
},
Addi {
src: Register,
value: ImmConst,
dest: Option<Register>,
},
Subi {
src: Register,
value: ImmConst,
dest: Option<Register>,
},
// utility
Push {
src: Register,
},
Pop {
dest: Register,
},
Call {
dest: Location,
},
Ret,
// system
Int {
code: ImmConst,
},
IRet,
Hlt,
}
@@ -1,4 +1,5 @@
use crate::{instructions::Instruction, register::Register}; use crate::isa::instructions::Instruction;
use crate::isa::register::Register;
impl Instruction { impl Instruction {
#[inline] #[inline]
@@ -1,9 +1,7 @@
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use crate::{ use crate::isa::instructions::{Instruction, Opcode};
instructions::{Instruction, Opcode}, use crate::isa::register::Register;
register::Register,
};
impl From<u32> for Instruction { impl From<u32> for Instruction {
#[inline] #[inline]
+2
View File
@@ -0,0 +1,2 @@
pub mod register;
pub mod instructions;
+4 -4
View File
@@ -1,7 +1,7 @@
pub mod instructions; pub mod asm;
pub mod register; pub mod isa;
pub mod prelude { pub mod prelude {
pub use crate::instructions::Instruction; pub use crate::isa::instructions::Instruction;
pub use crate::register::Register; pub use crate::isa::register::Register;
} }
+1 -1
View File
@@ -1,4 +1,4 @@
use common::instructions::Instruction; use common::isa::instructions::Instruction;
use dsa::{BulkAllocStore, Emulator, Page, RandomAccessMemory}; use dsa::{BulkAllocStore, Emulator, Page, RandomAccessMemory};
/// DSA Emulator Benchmark /// DSA Emulator Benchmark
/// ///
+5 -8
View File
@@ -1,18 +1,15 @@
use clap::Parser; use clap::Parser;
use common::{instructions::Instruction, register::Register}; use common::isa::instructions::Instruction;
use dsa::{ use dsa::{
BulkAllocStore, Emulator, Page, RandomAccessMemory, SharedState, args::DsaArgs, io::display::{DisplayDevice, DisplayHandle}, BulkAllocStore, Emulator, Page,
args::DsaArgs, RandomAccessMemory,
io::display::{DisplayDevice, DisplayHandle}, SharedState,
}; };
use std::{ use std::{
os::unix::thread::JoinHandleExt, sync::{atomic::Ordering, Arc},
process::exit,
sync::{Arc, atomic::Ordering},
thread, thread,
time::Duration, time::Duration,
}; };
fn main() { fn main() {
let args = DsaArgs::parse(); let args = DsaArgs::parse();
+6 -9
View File
@@ -1,26 +1,23 @@
use std::{ use std::{
hint::unlikely, hint::unlikely,
ops::{Add, AddAssign}, ops::AddAssign,
sync::{ sync::{
Arc,
atomic::Ordering, atomic::Ordering,
mpsc::{self, TryRecvError}, mpsc::{self, TryRecvError},
Arc,
}, },
thread, thread,
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use common::{ use common::isa::instructions::{Instruction, Opcode};
instructions::{Instruction, Opcode}, use common::isa::register::Register;
register::Register,
};
use crate::{ use crate::{
Page,
config::{IoMapping, MemoryMap, RegionType}, config::{IoMapping, MemoryMap, RegionType},
io::{IoAccess, IoDevice, MappedDevice}, io::{IoDevice, MappedDevice},
memory::{mmu::MMU, ram::RandomAccessMemory}, memory::{mmu::MMU, ram::RandomAccessMemory},
processor::{interrupts::Interrupt, state::SharedState}, processor::{interrupts::Interrupt, state::SharedState},
Page,
}; };
pub struct Emulator<Mem: RandomAccessMemory> { pub struct Emulator<Mem: RandomAccessMemory> {