Skip to content

Commit 7a31656

Browse files
committed
feat(counter) Implemented basic counter program for emulation testing.
1 parent 8901a06 commit 7a31656

File tree

9 files changed

+118
-82
lines changed

9 files changed

+118
-82
lines changed

examples/counter.rs

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,28 @@
11
extern crate arrseq_lightning;
22

3-
use arrseq_lightning::instruction::Instruction;
3+
use arrseq_lightning::instruction::{address, Instruction, operation, RegisterCode};
4+
use arrseq_lightning::instruction::address::{Address};
5+
use arrseq_lightning::instruction::flag::Flag;
6+
use arrseq_lightning::num::MaskedU8;
47

58
fn main() {
9+
let c_max = 10u16;
10+
611
let program = [
7-
Instruction::
12+
Instruction::LoadImmediate { destination: RegisterCode::new(0), segment: MaskedU8::new(0), immediate: c_max }, // li r0, c_max
13+
Instruction::DualSource { operation: operation::DualSource::Compare, sources: [RegisterCode::new(0), RegisterCode::new(1)] }, // cmp r0, r1
14+
Instruction::Branch { hint: None, condition: Flag::Zero, address: Address::Immediate { immediate: address::Immediate::new(8), mode: address::Mode::Relative }}, // jz pc+8
15+
Instruction::Memory { operation: operation::Memory::Branch, address: Address::Immediate { immediate: address::Immediate::new(4), mode: address::Mode::Absolute }}, // jmp 0
16+
Instruction::WaitForInterrupt // hlt
17+
18+
// pseudo code:
19+
//
20+
// ```
21+
// let count = c_max;
22+
// loop {
23+
// count -= 1;
24+
// if count == 0 { return 0 }
25+
// }
26+
// ```
827
];
928
}

src/operation.rs src/core.rs

File renamed without changes.

src/instruction.rs

+15-67
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,29 @@
11
pub mod operation;
2+
pub mod address;
3+
pub mod vector;
4+
pub mod flag;
25

3-
use crate::num::{MaskedU16, MaskedU32, MaskedU8};
6+
use crate::instruction::address::Address;
7+
use crate::instruction::flag::Flag;
8+
use crate::instruction::vector::{VectorComponentFlags, VectorComponentMapping};
9+
use crate::num::{MaskedU8};
410

5-
pub type SegmentCode = MaskedU8<0x3>
11+
pub type SegmentCode = MaskedU8<0x3>;
612
pub type RegisterCode = MaskedU8<0xF>;
7-
pub type FlagCode = MaskedU8<0x07>;
813
pub type BranchHintCode = MaskedU8<0x3>;
914
pub type OperandCode = MaskedU8<0x3>;
10-
pub type VectorComponentCode = MaskedU8<0x3>;
11-
pub const VECTOR_SIZE: usize = 4;
12-
13-
#[derive(Debug, Clone, Copy, PartialEq)]
14-
pub struct VectorComponentMapping {
15-
operand: OperandCode,
16-
components: [VectorComponentCode; 2]
17-
}
18-
19-
#[derive(Debug, Clone, Copy, PartialEq)]
20-
pub struct VectorComponentFlags {
21-
operand: OperandCode,
22-
negate: bool,
23-
zero: bool
24-
}
25-
26-
pub type AddressImmediate = MaskedU32<0x1FFFF>;
27-
pub type ScaleCode = MaskedU8<0x3>;
28-
29-
#[derive(Debug, Clone, Copy, PartialEq)]
30-
pub enum AddressMode {
31-
Absolute,
32-
Relative
33-
}
34-
35-
pub type BaseOffset = MaskedU16<0x1FFF>;
36-
pub type IndexedBaseOffset = MaskedU16<0x1FF>;
37-
38-
#[derive(Debug, Clone, Copy, PartialEq)]
39-
pub enum IndexedBaseOffsetMode {
40-
Immediate(IndexedBaseOffset),
41-
Register(RegisterCode)
42-
}
43-
44-
#[derive(Debug, Clone, Copy, PartialEq)]
45-
pub enum BaseMode {
46-
Offset(BaseOffset),
47-
RegisterOffset(RegisterCode),
48-
Indexed {
49-
index: RegisterCode,
50-
offset: IndexedBaseOffsetMode
51-
}
52-
}
53-
54-
#[derive(Debug, Clone, Copy, PartialEq)]
55-
pub enum Address {
56-
Immediate {
57-
immediate: AddressImmediate,
58-
mode: AddressMode
59-
},
60-
Register {
61-
register: RegisterCode,
62-
mode: AddressMode
63-
},
64-
Base {
65-
base: RegisterCode,
66-
mode: BaseMode
67-
}
68-
}
6915

7016
#[derive(Debug, Clone, Copy, PartialEq)]
7117
pub enum Instruction {
18+
WaitForInterrupt,
7219
LoadImmediate {
20+
destination: RegisterCode,
7321
segment: SegmentCode,
7422
immediate: u16
7523
},
7624
DualSource {
7725
operation: operation::DualSource,
78-
source: [RegisterCode; 2]
26+
sources: [RegisterCode; 2]
7927
},
8028
Destination {
8129
operation: operation::Destination,
@@ -104,15 +52,15 @@ pub enum Instruction {
10452
LoadVectorComponents {
10553
destination: RegisterCode,
10654
/// Having [None] means that the component corresponding to the index should be 0.
107-
components: [Option<VectorComponentCode>; VECTOR_SIZE]
55+
components: [Option<vector::ComponentCode>; vector::SIZE]
10856
},
10957
ExtractVectorComponents {
11058
vector: RegisterCode,
11159
/// Having [None] means that the component corresponding to the index should not be extracted into a register.
112-
components: [Option<RegisterCode>; VECTOR_SIZE]
60+
components: [Option<RegisterCode>; vector::SIZE]
11361
},
11462
FlagVectorComponents {
115-
flags: [VectorComponentFlags; VECTOR_SIZE],
63+
flags: [VectorComponentFlags; vector::SIZE],
11664
temporary: bool
11765
},
11866
/// Only supports 2 operands due to the size constrain of an instruction.
@@ -135,7 +83,7 @@ pub enum Instruction {
13583
source: RegisterCode
13684
},
13785
Branch {
138-
condition: FlagCode,
86+
condition: Flag,
13987
hint: Option<bool>,
14088
address: Address
14189
}

src/instruction/address.rs

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use crate::instruction::RegisterCode;
2+
use crate::num::{MaskedU16, MaskedU32, MaskedU8};
3+
4+
pub type Immediate = MaskedU32<0x1FFFF>;
5+
pub type ScaleCode = MaskedU8<0x3>;
6+
7+
#[derive(Debug, Clone, Copy, PartialEq)]
8+
pub enum Mode {
9+
Absolute,
10+
Relative
11+
}
12+
13+
pub type BaseOffset = MaskedU16<0x1FFF>;
14+
pub type IndexedBaseOffset = MaskedU16<0x1FF>;
15+
16+
#[derive(Debug, Clone, Copy, PartialEq)]
17+
pub enum IndexedBaseOffsetMode {
18+
Immediate(IndexedBaseOffset),
19+
Register(RegisterCode)
20+
}
21+
22+
#[derive(Debug, Clone, Copy, PartialEq)]
23+
pub enum BaseMode {
24+
Offset(BaseOffset),
25+
RegisterOffset(RegisterCode),
26+
Indexed {
27+
index: RegisterCode,
28+
offset: IndexedBaseOffsetMode
29+
}
30+
}
31+
32+
#[derive(Debug, Clone, Copy, PartialEq)]
33+
pub enum Address {
34+
Immediate {
35+
immediate: Immediate,
36+
mode: Mode
37+
},
38+
Register {
39+
register: RegisterCode,
40+
mode: Mode
41+
},
42+
Base {
43+
base: RegisterCode,
44+
mode: BaseMode
45+
}
46+
}

src/instruction/flag.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::num::MaskedU8;
2+
3+
pub type Code = MaskedU8<0x07>;
4+
5+
#[derive(Debug, Clone, Copy, PartialEq)]
6+
pub enum Flag {
7+
Zero,
8+
Negative,
9+
Overflow,
10+
Regrouping,
11+
Parity
12+
}

src/instruction/operation.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
//! Enums of all operations for specific operand formats.
22
3-
use crate::instruction::Instruction;
4-
53
#[derive(Debug, Clone, Copy, PartialEq)]
64
pub enum DualSource {
75
Compare
@@ -42,8 +40,8 @@ pub enum DestinationDualSource {
4240

4341
#[derive(Debug, Clone, Copy, PartialEq)]
4442
pub enum DestinationTripleSource {
45-
MultiplyAndAdd, // mad
46-
AddAndMultiply // adm
43+
MultiplyAndAdd,
44+
AddAndMultiply
4745
}
4846

4947
#[derive(Debug, Clone, Copy, PartialEq)]
@@ -57,7 +55,8 @@ pub enum DualDestinationDualSource {
5755
#[derive(Debug, Clone, Copy, PartialEq)]
5856
pub enum Memory {
5957
Call,
60-
ReleaseMemory
58+
ReleaseMemory,
59+
Branch
6160
}
6261

6362
#[derive(Debug, Clone, Copy, PartialEq)]
@@ -66,7 +65,7 @@ pub enum SourceMemory {
6665
CopyMemoryWordToRegister,
6766
CopyMemoryDwordToRegister,
6867
CopyMemoryQwordToRegister,
69-
68+
7069
AcquireMemoryByte,
7170
AcquireMemoryWord,
7271
AcquireMemoryDword,

src/instruction/vector.rs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use crate::instruction::{OperandCode};
2+
use crate::num::MaskedU8;
3+
4+
pub type ComponentCode = MaskedU8<0x3>;
5+
pub const SIZE: usize = 4;
6+
7+
#[derive(Debug, Clone, Copy, PartialEq)]
8+
pub struct VectorComponentMapping {
9+
operand: OperandCode,
10+
components: [ComponentCode; 2]
11+
}
12+
13+
#[derive(Debug, Clone, Copy, PartialEq)]
14+
pub struct VectorComponentFlags {
15+
operand: OperandCode,
16+
negate: bool,
17+
zero: bool
18+
}

src/lib.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
#![allow(clippy::unused_io_amount)]
1515
#![allow(soft_unstable)]
1616

17-
//
1817
pub mod instruction;
1918
pub mod num;
20-
// pub mod operation;
21-
// mod processor;
19+
pub mod core;

src/processor.rs

-4
This file was deleted.

0 commit comments

Comments
 (0)