From 8f7163c459d94117b5aefb115ab25d8ad23db4aa Mon Sep 17 00:00:00 2001 From: zxq5 Date: Sun, 1 Feb 2026 22:16:09 +0000 Subject: [PATCH] added some documentation and started on compiler for custom language (not C) based on previous prototypes. pretty broken state rn. --- compiler/src/lexer.rs | 26 +- compiler/src/main.rs | 16 +- compiler/src/parserprototype.rs | 435 +++++++++++ resources/dsc/example.dsc | 10 +- resources/ideas/DSA_Project_Roadmap.md | 843 ++++++++++++++++++++++ resources/ideas/DSA_Project_Roadmap.pdf | Bin 0 -> 116116 bytes resources/ideas/TODOS.md | 0 resources/ideas/dsa_assembly_reference.md | 427 +++++++++++ resources/ideas/dsa_binary_format.md | 10 + 9 files changed, 1750 insertions(+), 17 deletions(-) create mode 100644 compiler/src/parserprototype.rs create mode 100644 resources/ideas/DSA_Project_Roadmap.md create mode 100644 resources/ideas/DSA_Project_Roadmap.pdf delete mode 100644 resources/ideas/TODOS.md create mode 100644 resources/ideas/dsa_assembly_reference.md create mode 100644 resources/ideas/dsa_binary_format.md diff --git a/compiler/src/lexer.rs b/compiler/src/lexer.rs index e616b93..e76e131 100644 --- a/compiler/src/lexer.rs +++ b/compiler/src/lexer.rs @@ -4,12 +4,15 @@ use std::str::Chars; #[derive(Debug, PartialEq, Clone)] pub enum Token { // Keywords + Fn, + Let, If, Else, Loop, Break, Return, Continue, + Include, // Identifiers and literals Identifier(String), @@ -24,7 +27,7 @@ pub enum Token { Semicolon, // ; Colon, // : Comma, // , - Pipe, // | + // Pipe, // | // Operators Plus, // + @@ -39,6 +42,7 @@ pub enum Token { LessEqual, // <= Greater, // > GreaterEqual, // >= + RightArrow, // -> // Special Eof, @@ -47,7 +51,10 @@ pub enum Token { impl Token { pub fn tt(&self) -> &str { match self { + Token::Include => "Include", + Token::Fn => "Fn", Token::If => "If", + Token::Let => "Let", Token::Else => "Else", Token::Loop => "Loop", Token::Break => "Break", @@ -63,7 +70,8 @@ impl Token { Token::Semicolon => "Semicolon", Token::Colon => "Colon", Token::Comma => "Comma", - Token::Pipe => "Pipe", + Token::RightArrow => "RightArrow", + // Token::Pipe => "Pipe", Token::Plus => "Plus", Token::Minus => "Minus", Token::Star => "Star", @@ -168,11 +176,17 @@ impl<'a> Lexer<'a> { Some(';') => Token::Semicolon, Some(':') => Token::Colon, Some(',') => Token::Comma, - Some('|') => Token::Pipe, + // Some('|') => Token::Pipe, Some('+') => Token::Plus, - Some('-') => Token::Minus, Some('*') => Token::Star, Some('/') => Token::Slash, + Some('-') => { + if self.match_next('>') { + Token::RightArrow + } else { + Token::Minus + } + } Some('!') => { if self.match_next('=') { Token::BangEqual @@ -218,12 +232,14 @@ impl<'a> Lexer<'a> { let mut ident = c.to_string(); ident.push_str(&self.read_identifier()); match ident.as_str() { + "fn" => Token::Fn, "if" => Token::If, "else" => Token::Else, "loop" => Token::Loop, "break" => Token::Break, "return" => Token::Return, "continue" => Token::Continue, + "include" => Token::Include, _ => Token::Identifier(ident), } } else if c.is_ascii_digit() { @@ -331,7 +347,7 @@ mod tests { assert_eq!(lexer.next_token(), Token::Colon); assert_eq!(lexer.next_token(), Token::Identifier("Func".to_string())); assert_eq!(lexer.next_token(), Token::Assign); - assert_eq!(lexer.next_token(), Token::Pipe); + // assert_eq!(lexer.next_token(), Token::Pipe); assert_eq!(lexer.next_token(), Token::Identifier("x".to_string())); assert_eq!(lexer.next_token(), Token::Colon); assert_eq!(lexer.next_token(), Token::Identifier("U32".to_string())); diff --git a/compiler/src/main.rs b/compiler/src/main.rs index 031ecc8..b1a127c 100644 --- a/compiler/src/main.rs +++ b/compiler/src/main.rs @@ -1,7 +1,12 @@ +#![feature(try_trait_v2)] + use std::{fs, path::Path}; pub mod lexer; -pub mod parser; +pub mod parserprototype; +use parserprototype::Parser; + +use crate::parserprototype::ParseResult; fn main() { println!("Hello, world!"); @@ -13,13 +18,16 @@ fn main() { let tokens = lexer.collect::>(); println!("{tokens:?}"); - let mut parser = parser::Parser::new(tokens); + let mut parser = Parser::new(tokens); let ast = match parser.parse() { - Ok(ast) => ast, - Err(e) => { + ParseResult::Accept(ast) => ast, + ParseResult::Reject(e) => { eprintln!("Error: {e:?}"); return; } + ParseResult::Deny => { + panic!("Parser denied parsing") + } }; println!("{ast:?}"); } diff --git a/compiler/src/parserprototype.rs b/compiler/src/parserprototype.rs new file mode 100644 index 0000000..72c3441 --- /dev/null +++ b/compiler/src/parserprototype.rs @@ -0,0 +1,435 @@ +use crate::lexer::Token; +use crate::{expect_tt, expect_value}; +use core::fmt; +use std::ops::{ControlFlow, FromResidual, Try}; + +#[derive(Debug, Clone)] +pub enum ParseResult { + Accept(T), + Deny, + Reject(E), +} + +#[derive(Debug, Clone)] +pub enum CompilerError { + UnexpectedToken(Token), + UnexpectedEndOfInput, + UnexpectedCharacter(char), + InvalidSyntax(String), + Generic(String), +} + +pub struct Parser { + tokens: Vec, + idx: usize, +} + +impl Parser { + pub fn new(tokens: Vec) -> Self { + Self { tokens, idx: 0 } + } + + pub fn parse(&mut self) -> ParseResult { + let mut declarations = Vec::new(); + + while let ParseResult::Accept(_) = self.peek_next() { + declarations.push(self.parse_declaration()?); + } + + ParseResult::Accept(Program { + imports: vec![], + declarations, + }) + } + + fn parse_declaration(&mut self) -> ParseResult { + if expect_tt!(self.peek_next()?, Fn).accepted() { + let x = self.parse_func(); + println!("function {:?}", x); + return x; + } + + println!("{:?}", self.peek_next()?); + + ParseResult::Reject(CompilerError::UnexpectedEndOfInput) + } + + fn parse_func(&mut self) -> ParseResult { + // expect function keyword + // + println!("pre name! {:?}", self.peek_next()?); + + let _ = expect_tt!(self.next()?, Fn); + + println!("this is the name! {:?}", self.peek_next()?); + + // expect function name + let name = match self.next()? { + Token::Identifier(name) => name, + id => return ParseResult::Reject(CompilerError::UnexpectedToken(id)), + }; + + // expect left paren + let _ = expect_tt!(self.next()?, LParen); + + let mut params = Vec::new(); + while expect_tt!(self.peek_next()?, Identifier).accepted() { + let arg = self.parse_var_decl()?; + params.push(arg); + } + + // expect right paren + let _ = expect_tt!(self.next()?, RParen); + + // see if we can parse the return type! + let mut return_type = TypeId::Void; + + if expect_tt!(self.peek_next()?, RightArrow).accepted() { + let _ = self.next(); + return_type = self.parse_type()?; + } + + // expect left brace + let _ = expect_tt!(self.next()?, LBrace); + + let mut body = Vec::new(); + + // expect right brace + let _ = expect_tt!(self.next()?, RBrace); + + ParseResult::Accept(Declaration::Function { + name, + params, + return_type, + body, + }) + } + + fn parse_var_decl(&mut self) -> ParseResult { + let name = match self.next()? { + Token::Identifier(name) => name, + id => return ParseResult::Reject(CompilerError::UnexpectedToken(id)), + }; + + let _ = expect_tt!(self.next()?, Colon); + + let type_ = self.parse_type()?; + + ParseResult::Accept(Variable { + name, + param_type: Some(type_), + }) + } + + fn parse_type(&mut self) -> ParseResult { + // get the type name incl namespace + let typename = self.parse_identifier()?; + + match typename.name.as_str() { + "u32" => ParseResult::Accept(TypeId::U32), + "u16" => ParseResult::Accept(TypeId::U16), + "u8" => ParseResult::Accept(TypeId::U8), + "i32" => ParseResult::Accept(TypeId::I32), + "i16" => ParseResult::Accept(TypeId::I16), + "i8" => ParseResult::Accept(TypeId::I8), + "void" => ParseResult::Accept(TypeId::Void), + "char" => ParseResult::Accept(TypeId::Char), + _ => todo!("Implement parsing for other types!!"), + } + } + + fn parse_identifier(&mut self) -> ParseResult { + let primary = match self.next()? { + Token::Identifier(namespace) => namespace, + id => return ParseResult::Reject(CompilerError::UnexpectedToken(id)), + }; + + if expect_tt!(self.peek_next()?, Colon).accepted() { + let _ = expect_tt!(self.next()?, Colon); + let _ = expect_tt!(self.next()?, Colon); + + let secondary = match self.next()? { + Token::Identifier(name) => name, + id => return ParseResult::Reject(CompilerError::UnexpectedToken(id)), + }; + + ParseResult::Accept(Name { + namespace: Some(primary), + name: secondary, + }) + } else { + ParseResult::Accept(Name { + namespace: None, + name: primary, + }) + } + } + + fn next(&mut self) -> ParseResult { + if self.idx >= self.tokens.len() { + ParseResult::Reject(CompilerError::UnexpectedEndOfInput) + } else { + let token = self.tokens[self.idx].clone(); + println!("NEXT {:?}", token); + self.idx += 1; + ParseResult::Accept(token) + } + } + + fn peek_next(&self) -> ParseResult { + if self.idx >= self.tokens.len() { + ParseResult::Reject(CompilerError::UnexpectedEndOfInput) + } else { + ParseResult::Accept(self.tokens[self.idx].clone()) + } + } +} + +#[derive(Debug, Clone)] +pub struct Program { + pub imports: Vec, + pub declarations: Vec, +} + +#[derive(Debug, Clone)] +pub enum Declaration { + Function { + name: String, + return_type: TypeId, + params: Vec, + body: Block, + }, + Variable { + name: String, + init: Option, + }, +} + +#[derive(Debug, Clone)] +pub struct Dependency { + pub name: String, + pub path: String, +} + +#[derive(Debug, Clone)] +pub struct Variable { + pub name: String, + pub param_type: Option, +} + +#[derive(Debug, Clone)] +pub struct Name { + pub name: String, + pub namespace: Option, +} + +#[derive(Debug, Clone)] +pub enum TypeId { + U8, + U16, + U32, + I8, + I16, + I32, + Char, + Void, + Ptr(Box), + Ref(Box), + Array(Box, usize), + Struct { + name: Name, + fields: Vec<(String, TypeId)>, + }, +} + +pub type Block = Vec; + +#[derive(Debug, Clone)] +pub enum Statement { + Block(Block), + Assign { + var: Variable, + value: Option>, + }, + Expression { + expr: Expression, + }, + If { + condition: Expression, + then_stmt: Block, + else_stmt: Block, + }, + While { + condition: Expression, + body: Vec, + }, + Loop(Block), + Break, + Continue, + Return(Option), +} + +#[derive(Debug, Clone)] +pub enum ConstExpr { + Number(i32), + String(String), +} + +impl fmt::Display for ConstExpr { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ConstExpr::Number(n) => write!(f, "{}", n), + ConstExpr::String(s) => write!(f, "\"{}\"", s), + } + } +} + +#[derive(Debug, Clone)] +pub enum Expression { + Empty, + Binary { + op: BinaryOperator, + left: Box, + right: Box, + }, + Unary { + op: UnaryOperator, + operand: Box, + }, + Variable { + name: Name, + expr_type: Option, + }, + Number { + value: i32, + }, + Call { + name: Name, + args: Vec, + }, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum BinaryOperator { + Add, + Sub, + Mul, + Div, + Eq, + Ne, + Lt, + Gt, + Le, + Ge, +} + +impl fmt::Display for BinaryOperator { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + BinaryOperator::Add => write!(f, "+"), + BinaryOperator::Sub => write!(f, "-"), + BinaryOperator::Mul => write!(f, "*"), + BinaryOperator::Div => write!(f, "/"), + BinaryOperator::Eq => write!(f, "=="), + BinaryOperator::Ne => write!(f, "!="), + BinaryOperator::Lt => write!(f, "<"), + BinaryOperator::Gt => write!(f, ">"), + BinaryOperator::Le => write!(f, "<="), + BinaryOperator::Ge => write!(f, ">="), + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub enum UnaryOperator { + Plus, + Minus, +} + +impl fmt::Display for UnaryOperator { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + UnaryOperator::Plus => write!(f, "+"), + UnaryOperator::Minus => write!(f, "-"), + } + } +} + +impl ParseResult { + pub fn accepted(&self) -> bool { + matches!(self, ParseResult::Accept(_)) + } +} + +pub enum ParseResultResidual { + Deny, + Reject(T), +} + +impl Try for ParseResult { + type Output = T; + type Residual = ParseResultResidual; + + fn from_output(output: T) -> Self { + ParseResult::Accept(output) + } + + fn branch(self) -> ControlFlow { + match self { + ParseResult::Accept(v) => ControlFlow::Continue(v), + ParseResult::Deny => ControlFlow::Break(ParseResultResidual::Deny), + ParseResult::Reject(e) => ControlFlow::Break(ParseResultResidual::Reject(e)), + } + } +} + +impl FromResidual for ParseResult { + fn from_residual(residual: ParseResultResidual) -> Self { + match residual { + ParseResultResidual::Deny => ParseResult::Deny, + ParseResultResidual::Reject(e) => ParseResult::Reject(e), + } + } +} + +#[macro_export] +macro_rules! expect_tt { + ($token:expr, $($variant:ident),+) => {{ + let tt = $token.tt().to_string(); + + // for some reason the code trips tf out without this line + + println!("token {:?}", $token); + + let mut vs = String::new(); + $( + let s = stringify!($variant); + vs.push_str(s); + vs.push_str("|"); + )+ + + match tt.as_str() { + $( + stringify!($variant) => ParseResult::Accept($token.clone()), + )+ + _ => { + println!("EXPECTED!! {} [{}]", tt, vs); + // let expected = format!("[{}]", vec![$(stringify!($variant)),+].join(" | ")); + ParseResult::Reject(CompilerError::UnexpectedToken($token.clone())) + } + } + }}; +} + +#[macro_export] +macro_rules! expect_value { + ($token:expr, $variant:expr) => {{ + match $token { + $variant(x) => ParseResult::Accept(x), + _ => { + let expected = format!("[{}]") + ParseResult::Reject(CompilerError::UnexpectedToken($token.clone())) + } + } + }}; +} diff --git a/resources/dsc/example.dsc b/resources/dsc/example.dsc index 550a707..0f09703 100644 --- a/resources/dsc/example.dsc +++ b/resources/dsc/example.dsc @@ -1,8 +1,2 @@ -main: Func = | x: U32, y: U32 | { - res = add(x, y); - print(res); - - if res > 10 { - print("res is greater than 10"); - } -} +fn factorial(n: u32) -> u32 {} +fn main(x: u32, y: u32) -> u32 {} diff --git a/resources/ideas/DSA_Project_Roadmap.md b/resources/ideas/DSA_Project_Roadmap.md new file mode 100644 index 0000000..563498e --- /dev/null +++ b/resources/ideas/DSA_Project_Roadmap.md @@ -0,0 +1,843 @@ +# DSA Project Roadmap & Task Breakdown + +> **Damn Simple Architecture** — Full ecosystem development plan including emulator, assembler, compiler, debugger, and tooling infrastructure. + +--- + +## Table of Contents + +1. [Phase 1: Foundation & Core Infrastructure](#phase-1-foundation--core-infrastructure) + - [1.1 Binary Format & Linking System](#11-binary-format--linking-system) + - [1.2 Assembler Rewrite](#12-assembler-rewrite) + - [1.3 Documentation Updates](#13-documentation-updates) +2. [Phase 2: Compiler Development](#phase-2-compiler-development) + - [2.1 Language Design & Implementation](#21-language-design--implementation) + - [2.2 Standard Library](#22-standard-library) +3. [Phase 3: Build System & Package Management](#phase-3-build-system--package-management) + - [3.1 Build System](#31-build-system) + - [3.2 Package Management System](#32-package-management-system) +4. [Phase 4: Debugger & Development Tools](#phase-4-debugger--development-tools) + - [4.1 Debug Symbol System](#41-debug-symbol-system) + - [4.2 Debugger Implementation](#42-debugger-implementation) + - [4.3 Enhanced Editor Integration](#43-enhanced-editor-integration) +5. [Phase 5: Integration & Polish](#phase-5-integration--polish) +6. [Phase 6: Future Enhancements (NTH)](#phase-6-future-enhancements-nth) +7. [Summary Timeline](#summary-timeline) +8. [Critical Path](#critical-path) +9. [Recommended Work Order](#recommended-work-order) + +--- + +## Phase 1: Foundation & Core Infrastructure + +**Estimated Duration: 3–4 weeks** + +--- + +### 1.1 Binary Format & Linking System + +> **Priority: CRITICAL** — Everything depends on this. +> **Total Estimate: 1.5 weeks** + +--- + +#### 1.1.1 Design New Binary Format Specification + +**Estimate: 2 days** +**Dependencies:** None +**Deliverable:** `docs/binary-format-spec.md` + +- [ ] Research existing object file formats (ELF, COFF, Mach-O) for inspiration +- [ ] Design `.dsb` object file format specification + - [ ] Symbol table structure + - [ ] Relocation table format + - [ ] Section definitions (code, data, rodata, bss) + - [ ] Debug information structure + - [ ] Metadata headers +- [ ] Design `.dse` executable format specification + - [ ] Entry point definition + - [ ] Memory layout requirements + - [ ] Linking metadata +- [ ] Document format specifications in markdown +- [ ] Create format version strategy for future compatibility + +--- + +#### 1.1.2 Implement DSB Object File Writer + +**Estimate: 3 days** +**Dependencies:** 1.1.1 +**Deliverable:** `dsa-binary-format` crate v0.1.0 + +- [ ] Create new crate: `dsa-binary-format` +- [ ] Implement object file structures + - [ ] Header structure + - [ ] Symbol table builder + - [ ] Section manager + - [ ] Relocation entry creator +- [ ] Write serialization logic +- [ ] Add validation and error handling +- [ ] Write unit tests for each structure +- [ ] Integration tests for complete object files + +--- + +#### 1.1.3 Build Linker Program + +**Estimate: 4 days** +**Dependencies:** 1.1.2 +**Deliverable:** `dsa-link` executable + +- [ ] Create new crate: `dsa-linker` +- [ ] Implement symbol resolution + - [ ] Global symbol table + - [ ] Symbol conflict detection + - [ ] Weak symbol handling +- [ ] Implement relocation processing + - [ ] Address calculation + - [ ] Patch generation + - [ ] Cross-section references +- [ ] Build executable generator + - [ ] Combine sections + - [ ] Generate final memory layout + - [ ] Write `.dse` output +- [ ] Add linker script support (basic) +- [ ] Comprehensive error messages +- [ ] Test suite with complex linking scenarios + +--- + +### 1.2 Assembler Rewrite + +> **Priority: HIGH** — Required for all compiled code. +> **Total Estimate: 1.5 weeks** + +--- + +#### 1.2.1 Assembler Architecture Design + +**Estimate: 1 day** +**Dependencies:** 1.1.1 +**Deliverable:** `docs/assembler-architecture.md` + +- [ ] Design multi-pass architecture + - [ ] Pass 1: Symbol collection + - [ ] Pass 2: Macro expansion + - [ ] Pass 3: Code generation + - [ ] Pass 4: Relocation generation +- [ ] Plan error handling strategy +- [ ] Design threading model for parallel file processing +- [ ] Define module/import resolution system +- [ ] Plan integration points with DSC compiler + +--- + +#### 1.2.2 Implement Core Assembler + +**Estimate: 5 days** +**Dependencies:** 1.1.2, 1.2.1 +**Deliverable:** `dsa-asm` executable v2.0.0 + +- [ ] Create new crate: `dsa-assembler-ng` (next-gen) +- [ ] Implement lexer with better error recovery +- [ ] Build parser with detailed error messages + - [ ] Instruction parsing + - [ ] Directive handling + - [ ] Macro system + - [ ] Include resolution +- [ ] Symbol table management +- [ ] Code generator outputting to DSB format +- [ ] Multi-threading for file parsing +- [ ] Comprehensive test suite +- [ ] Error message testing + +--- + +#### 1.2.3 Import System & DSC Integration + +**Estimate: 2 days** +**Dependencies:** 1.2.2, 2.1.2 +**Deliverable:** Working import system + +- [ ] Design import protocol between DSC and assembler +- [ ] Implement symbol table merging +- [ ] Handle pre-compiled object imports +- [ ] Test DSC → Assembly → Object pipeline +- [ ] Document integration process + +--- + +### 1.3 Documentation Updates + +> **Priority: MEDIUM** — Can be done alongside development. +> **Total Estimate: 3 days (distributed)** + +--- + +#### 1.3.1 Update Assembly Documentation + +**Estimate: 1 day** +**Dependencies:** 1.2.2 +**Deliverable:** Updated `docs/dsa-assembly-reference.md` + +- [ ] Review all instruction documentation +- [ ] Document new pseudo-instructions +- [ ] Update calling convention docs +- [ ] Add examples for new features +- [ ] Document assembler directives +- [ ] Macro system documentation + +--- + +#### 1.3.2 Architecture Documentation + +**Estimate: 1 day** +**Dependencies:** None (can start anytime) +**Deliverable:** `docs/dsa-architecture.md` + +- [ ] Document ISA specification +- [ ] Memory model documentation +- [ ] Interrupt handling +- [ ] Hardware peripheral specs +- [ ] Timing/performance characteristics + +--- + +#### 1.3.3 Build Tools Documentation + +**Estimate: 1 day** +**Dependencies:** 1.2.2, 1.1.3, 3.1.2 +**Deliverable:** `docs/build-tools-guide.md` + +- [ ] Assembler usage guide +- [ ] Linker usage guide +- [ ] Build system guide +- [ ] Tutorial: Building a simple program +- [ ] Tutorial: Multi-file projects + +--- + +## Phase 2: Compiler Development + +**Estimated Duration: 3–4 weeks** + +--- + +### 2.1 Language Design & Implementation + +> **Priority: HIGH** — Core functionality. +> **Total Estimate: 2.5 weeks** + +--- + +#### 2.1.1 Language Syntax Design + +**Estimate: 2 days** +**Dependencies:** None +**Deliverable:** `docs/language-spec.md` + +- [ ] Define syntax goals (simplicity, systems programming) +- [ ] Design type system + - [ ] Primitive types + - [ ] Pointers/references + - [ ] Structs + - [ ] Arrays + - [ ] Function types +- [ ] Control flow syntax +- [ ] Function declaration syntax +- [ ] Module/import system +- [ ] Operator precedence +- [ ] Write EBNF grammar +- [ ] Create example programs + +--- + +#### 2.1.2 Lexer & Parser Implementation + +**Estimate: 4 days** +**Dependencies:** 2.1.1 +**Deliverable:** Parser in `dsc-compiler` crate + +- [ ] Adapt existing C lexer to new syntax +- [ ] Implement new parser for designed syntax +- [ ] AST node definitions +- [ ] Error recovery mechanisms +- [ ] Comprehensive parser tests +- [ ] Syntax error message quality testing + +--- + +#### 2.1.3 Code Generation Improvements + +**Estimate: 5 days** +**Dependencies:** 2.1.2, 1.2.2 +**Deliverable:** Working code generator + +- [ ] Review and fix existing codegen issues +- [ ] Implement missing language features + - [ ] Structs + - [ ] Arrays + - [ ] Pointers/memory operations + - [ ] For loops + - [ ] Switch statements + - [ ] Break/continue +- [ ] Optimize register allocation further +- [ ] Implement proper function calling conventions +- [ ] Add constant folding optimization +- [ ] Dead code elimination +- [ ] Test each feature thoroughly + +--- + +#### 2.1.4 Type Checking & Semantic Analysis + +**Estimate: 3 days** +**Dependencies:** 2.1.2 +**Deliverable:** Type checker integrated in compiler + +- [ ] Implement type checker +- [ ] Symbol table for scoping +- [ ] Type inference where applicable +- [ ] Const checking +- [ ] Definite assignment analysis +- [ ] Comprehensive semantic error messages +- [ ] Test suite for type errors + +--- + +### 2.2 Standard Library + +> **Priority: MEDIUM** — Needed for useful programs. +> **Total Estimate: 1 week** + +--- + +#### 2.2.1 Core Runtime Library (in Assembly) + +**Estimate: 3 days** +**Dependencies:** 1.2.2 +**Deliverable:** `lib/runtime/` directory + +- [ ] Memory allocation (malloc/free) +- [ ] String operations +- [ ] Math functions +- [ ] I/O functions (improved print, read) +- [ ] System call interface +- [ ] Tests for each function + +--- + +#### 2.2.2 Standard Library (in DSC) + +**Estimate: 2 days** +**Dependencies:** 2.1.3, 2.2.1 +**Deliverable:** `lib/std/` directory + +- [ ] String module +- [ ] Collections (array utilities, maybe simple list) +- [ ] File I/O module +- [ ] Math utilities +- [ ] Tests and examples + +--- + +## Phase 3: Build System & Package Management + +**Estimated Duration: 2–3 weeks** + +--- + +### 3.1 Build System + +> **Priority: HIGH** — Required for complex projects. +> **Total Estimate: 1.5 weeks** + +--- + +#### 3.1.1 Build System Design + +**Estimate: 1 day** +**Dependencies:** None +**Deliverable:** `docs/build-system-design.md` + +- [ ] Define project structure conventions +- [ ] Design build manifest format (`dsa-project.toml` or similar) +- [ ] Dependency resolution strategy +- [ ] Build cache design +- [ ] Incremental build strategy +- [ ] Multi-target support + +--- + +#### 3.1.2 Build Tool Implementation + +**Estimate: 5 days** +**Dependencies:** 3.1.1, 1.2.2, 1.1.3, 2.1.3 +**Deliverable:** `dsa-build` executable + +- [ ] Create crate: `dsa-build` +- [ ] Manifest parser +- [ ] Dependency graph builder +- [ ] Task orchestrator + - [ ] Compilation tasks + - [ ] Assembly tasks + - [ ] Linking tasks +- [ ] Build cache implementation +- [ ] Parallel build support +- [ ] Clean, rebuild commands +- [ ] Watch mode for development +- [ ] Comprehensive tests + +--- + +#### 3.1.3 Project Management Commands + +**Estimate: 2 days** +**Dependencies:** 3.1.2 +**Deliverable:** Enhanced `dsa-build` with project management + +- [ ] `dsa new ` — Create new project +- [ ] `dsa init` — Initialize in existing directory +- [ ] `dsa add ` — Add dependency +- [ ] Binary vs library project types +- [ ] Template system for project scaffolding +- [ ] Documentation for each command + +--- + +### 3.2 Package Management System + +> **Priority: MEDIUM** — Enables code sharing. +> **Total Estimate: 1.5 weeks** + +--- + +#### 3.2.1 Package Registry Design + +**Estimate: 2 days** +**Dependencies:** 3.1.1 +**Deliverable:** `docs/package-registry-design.md` + +- [ ] Decide: Git monorepo vs custom hosting +- [ ] Design package naming conventions +- [ ] Version resolution strategy (semver) +- [ ] Package manifest format +- [ ] Security considerations +- [ ] Package storage format (source/binary/both) +- [ ] API design for registry server + +--- + +#### 3.2.2 Local Package Manager Tool + +**Estimate: 4 days** +**Dependencies:** 3.2.1, 3.1.2 +**Deliverable:** `dsa-pkg` tool integrated with `dsa-build` + +- [ ] Create crate: `dsa-pkg` +- [ ] Package index synchronization +- [ ] Dependency resolver +- [ ] Package download/cache system +- [ ] Integration with build system +- [ ] Commands: + - [ ] `dsa install ` + - [ ] `dsa publish` + - [ ] `dsa search ` + - [ ] `dsa update` +- [ ] Lock file generation +- [ ] Test with mock registry + +--- + +#### 3.2.3 Package Registry Implementation + +**Estimate: 3 days** +**Dependencies:** 3.2.1 +**Deliverable:** Package registry (URL or repo) + +- [ ] If **Git monorepo** approach: + - [ ] Set up repository structure + - [ ] CI/CD for validation + - [ ] Submission process + - [ ] Package browser website +- [ ] If **custom hosting**: + - [ ] Simple web server (Rust + Axum/Actix) + - [ ] Package upload API + - [ ] Package search API + - [ ] Basic web UI + - [ ] Database for metadata +- [ ] Documentation for publishing + +--- + +## Phase 4: Debugger & Development Tools + +**Estimated Duration: 3–4 weeks** + +--- + +### 4.1 Debug Symbol System + +> **Priority: HIGH** — Foundation for debugging. +> **Total Estimate: 1 week** + +--- + +#### 4.1.1 Debug Symbol Format Design + +**Estimate: 1 day** +**Dependencies:** 1.1.1 +**Deliverable:** `docs/debug-symbol-format.md` + +- [ ] Design symbol table format + - [ ] Function addresses → names + - [ ] Line number → address mapping + - [ ] Variable location information + - [ ] Type information +- [ ] Define symbol table file format +- [ ] Plan for embedding in DSE/DSB files + +--- + +#### 4.1.2 Symbol Generation in Tools + +**Estimate: 3 days** +**Dependencies:** 4.1.1, 1.2.2, 2.1.3 +**Deliverable:** Debug symbols in build output + +- [ ] Modify assembler to emit debug symbols +- [ ] Modify compiler to emit debug symbols + - [ ] Source file/line tracking + - [ ] Variable scope tracking +- [ ] Linker merges debug symbols +- [ ] Test symbol generation pipeline + +--- + +#### 4.1.3 Symbol Table Loader in Emulator + +**Estimate: 2 days** +**Dependencies:** 4.1.2 +**Deliverable:** Symbol loading in emulator crate + +- [ ] Implement symbol table parser +- [ ] Build address → symbol lookup (HashMap) +- [ ] Build symbol → address lookup +- [ ] Memory efficient storage +- [ ] Tests for symbol resolution + +--- + +### 4.2 Debugger Implementation + +> **Priority: HIGH** — Major productivity boost. +> **Total Estimate: 2 weeks** + +--- + +#### 4.2.1 Core Debugger Features + +**Estimate: 5 days** +**Dependencies:** 4.1.3 +**Deliverable:** Debugger backend + +- [ ] Execution control + - [ ] Step instruction + - [ ] Step over function calls + - [ ] Continue to breakpoint + - [ ] Run to cursor +- [ ] Breakpoint system + - [ ] Address breakpoints + - [ ] Conditional breakpoints + - [ ] Watchpoints (memory access) +- [ ] Register inspection +- [ ] Memory inspection +- [ ] Stack trace generation +- [ ] Test debugger commands + +--- + +#### 4.2.2 Disassembler with Symbol Resolution + +**Estimate: 3 days** +**Dependencies:** 4.1.3 +**Deliverable:** Enhanced disassembler + +- [ ] Instruction decoder +- [ ] Format with labels instead of addresses +- [ ] Show function names at call sites +- [ ] Inline comments with variable names +- [ ] Color coding for instruction types +- [ ] Tests for disassembly output + +--- + +#### 4.2.3 Pseudo-Instruction Decompiler + +> ⚠️ **COMPLEX TASK** — Separate pass to decompile assembly into readable pseudo-instructions. + +**Estimate: 4 days** +**Dependencies:** 4.2.2 +**Deliverable:** Pseudo-instruction view mode + +- [ ] Pattern recognition for common sequences + - [ ] Function prologue/epilogue + - [ ] Multiplication using shifts/adds + - [ ] Division + - [ ] Conditional moves +- [ ] Control flow reconstruction + - [ ] If/else detection + - [ ] Loop detection + - [ ] Switch statement detection +- [ ] Expression reconstruction +- [ ] Format as higher-level pseudo-code +- [ ] Extensive pattern testing + +--- + +#### 4.2.4 Execution History Tracking + +**Estimate: 2 days** +**Dependencies:** 4.2.1 +**Deliverable:** Execution trace feature + +- [ ] Circular buffer for instruction history +- [ ] Register state snapshots over time +- [ ] Configurable history depth +- [ ] Efficient memory usage +- [ ] Playback/reverse debugging (basic) +- [ ] Export trace to file + +--- + +### 4.3 Enhanced Editor Integration + +> **Priority: MEDIUM** — UX improvement. +> **Total Estimate: 1 week** + +--- + +#### 4.3.1 Tiling Window System + +**Estimate: 2 days** +**Dependencies:** None (UI work) +**Deliverable:** Panel system in emulator + +- [ ] Research Rust tiling libraries (`egui_tiles`, or custom) +- [ ] Design panel layout system + - [ ] Code editor panel + - [ ] Disassembly panel + - [ ] Register panel + - [ ] Memory panel + - [ ] Console panel +- [ ] Implement drag-and-drop panel management +- [ ] Save/load layouts + +--- + +#### 4.3.2 Assembly Editor Improvements + +**Estimate: 2 days** +**Dependencies:** 4.3.1 +**Deliverable:** Enhanced assembly editor + +- [ ] Syntax highlighting for DSA assembly +- [ ] Auto-completion for instructions +- [ ] Label/symbol auto-completion +- [ ] Error highlighting +- [ ] Inline documentation tooltips +- [ ] Jump-to-definition for labels + +--- + +#### 4.3.3 High-Level Language Editor + +**Estimate: 2 days** +**Dependencies:** 4.3.1, 2.1.4 +**Deliverable:** DSC language editor + +- [ ] Syntax highlighting for DSC language +- [ ] Basic auto-completion +- [ ] Bracket matching +- [ ] Error highlighting from compiler +- [ ] Go-to-definition (using debug symbols) +- [ ] Inline type hints + +--- + +#### 4.3.4 Integrate Build Tools in Editor + +**Estimate: 1 day** +**Dependencies:** 4.3.1, 3.1.2 +**Deliverable:** Integrated build experience + +- [ ] Build button/command in UI +- [ ] Show build output in console panel +- [ ] Error navigation (click to jump to source) +- [ ] Hot reload on successful build +- [ ] Build status indicator + +--- + +## Phase 5: Integration & Polish + +**Estimated Duration: 1–2 weeks** + +--- + +### 5.1 Tool Integration + +> **Priority: HIGH** — Everything works together. +> **Total Estimate: 1 week** + +--- + +#### 5.1.1 Unified Toolchain + +**Estimate: 3 days** +**Dependencies:** All previous phases +**Deliverable:** `dsa` unified command-line tool + +- [ ] Create meta-crate: `dsa-tools` +- [ ] Unified CLI with subcommands + - [ ] `dsa build` + - [ ] `dsa run` + - [ ] `dsa debug` + - [ ] `dsa test` + - [ ] `dsa pkg` +- [ ] Shared configuration system +- [ ] Tool interop testing +- [ ] Documentation for workflow + +--- + +#### 5.1.2 Emulator Integration + +**Estimate: 2 days** +**Dependencies:** 5.1.1, 4.3.4 +**Deliverable:** Fully integrated development environment + +- [ ] Add build tools as emulator dependencies +- [ ] In-editor build triggered from emulator +- [ ] Debugger uses build output directly +- [ ] Source-level debugging with line mapping +- [ ] Test full edit → build → debug cycle + +--- + +#### 5.1.3 Documentation & Tutorials + +**Estimate: 2 days** +**Dependencies:** 5.1.2 +**Deliverable:** Complete documentation suite + +- [ ] Getting started guide +- [ ] Full tutorial: Building a simple game +- [ ] Debugger usage guide +- [ ] Best practices document +- [ ] Troubleshooting guide + +--- + +## Phase 6: Future Enhancements (NTH) + +> **Priority: LOW** — Nice to have, long-term goal. +> **Estimated Duration: 4+ weeks** + +--- + +### 6.1 Command-Line Emulator + +> ⚠️ **COMPLEX LONG-TERM GOAL** — Requires significant design and UX consideration. + +--- + +#### 6.1.1 Design Phase + +**Estimate: 1 week** +**Dependencies:** None +**Deliverable:** `docs/cli-emulator-design.md` + +- [ ] UX research for terminal-based debuggers +- [ ] Design TUI layout (using `ratatui` or similar) +- [ ] Command syntax design +- [ ] Scripting support design +- [ ] Accessibility considerations + +--- + +#### 6.1.2 Implementation + +**Estimate: 3+ weeks** +**Dependencies:** 6.1.1, Phase 4 complete +**Deliverable:** `dsa-emu-cli` executable + +- [ ] TUI framework setup +- [ ] Core emulator integration +- [ ] Command parser +- [ ] Panel rendering (code, registers, memory, etc.) +- [ ] Keyboard shortcuts +- [ ] Mouse support +- [ ] Configuration system +- [ ] Extensive usability testing + +--- + +## Summary Timeline + +| Phase | Duration | Key Dependencies | +|---|---|---| +| Phase 1: Foundation | 3–4 weeks | None | +| Phase 2: Compiler | 3–4 weeks | Phase 1 complete | +| Phase 3: Build System | 2–3 weeks | Phases 1–2 complete | +| Phase 4: Debugger | 3–4 weeks | Phases 1–3 complete | +| Phase 5: Integration | 1–2 weeks | Phases 1–4 complete | +| Phase 6: CLI Emulator *(NTH)* | 4+ weeks | Phase 4 complete | + +**Total Estimated Time: 12–17 weeks (3–4 months) for Phases 1–5** + +--- + +## Critical Path + +The following tasks are on the critical path and will block other work if delayed: + +``` +1.1.1 Binary format design + └── 1.1.2 Object file writer + └── 1.1.3 Linker + └── 1.2.2 Assembler rewrite + └── 2.1.3 Compiler codegen + └── 3.1.2 Build system + └── 4.1.2 Debug symbols + └── 4.2.1 Debugger +``` + +--- + +## Recommended Work Order + +| Weeks | Focus | Tasks | +|---|---|---| +| 1–2 | Binary Format & Linker | 1.1.1 → 1.1.2 → 1.1.3 | +| 3–4 | Assembler Rewrite | 1.2.1 → 1.2.2 | +| 5–6 | Compiler Syntax & Parser | 2.1.1 → 2.1.2 *(start 1.3 docs in parallel)* | +| 7–9 | Compiler Codegen & Types | 2.1.3 → 2.1.4 *(start 2.2.1 runtime in parallel)* | +| 10–11 | Build System | 3.1.1 → 3.1.2 → 3.1.3 | +| 12–13 | Package Management *(if desired now)* | 3.2.1 → 3.2.2 → 3.2.3 | +| 14–15 | Debug Symbols | 4.1.1 → 4.1.2 → 4.1.3 | +| 16–18 | Core Debugger | 4.2.1 → 4.2.2 → 4.2.4 | +| 19–20 | Editor Enhancements | 4.3.1 → 4.3.2 → 4.3.3 → 4.3.4 | +| 21–22 | Integration & Polish | 5.1.1 → 5.1.2 → 5.1.3 | + +--- + +## Notes + +- Time estimates assume ~6–8 productive hours per day. +- Add **20–30% buffer** for unexpected issues. +- Testing time is included in each estimate. +- Documentation is distributed throughout rather than batched at the end. +- Package management (3.2) can be deferred if time-constrained. +- Pseudo-instruction decompiler (4.2.3) can be a stretch goal. +- CLI emulator (Phase 6) is explicitly a "nice to have" and should not block other work. diff --git a/resources/ideas/DSA_Project_Roadmap.pdf b/resources/ideas/DSA_Project_Roadmap.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba50e5c2358e9b8a59c0f13a65be3cf6ec67fd93 GIT binary patch literal 116116 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 z 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

VaGX@{g~J3C4i>aw0I9^ns3r?a2cAwumw>s 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/write: protection fault (unless in kernel mode)** | +| `mmr` | Privileged | Hardware memory map table address
**on-read/write: protection fault (unless in kernel mode)** | +| `zero` | Read-only | Always contains zero
**on-read: always returns zero**
**on-write: value is voided** | +| `pcx` | Read-only | Program counter
**on-write: protection fault** | +| `noreg` | Placeholder | Indicates absence of register argument
**on-read/write: illegal instruction fault** | + +## Hardware Instructions + +### Data Movement Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **MOV** | `src_reg, dest_reg` | Copy value from source to destination register | +| **MOVS** | `src_reg, dest_reg` | Copy with sign extension | + +**Examples:** +```asm +mov rg0, rg1 ; Copy rg0 to rg1 +movs rg0, rg1 ; Copy rg0 to rg1 with sign extension +``` +### Memory Access Instructions + +#### Load Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **LDB** | `base_reg, dest_reg [, offset]`
`label, dest_reg [, offset]` | Load byte from memory | +| **LDBS** | `base_reg, dest_reg [, offset]`
`label, dest_reg [, offset]` | Load byte with sign extension | +| **LDH** | `base_reg, dest_reg [, offset]`
`label, dest_reg [, offset]` | Load half-word (16-bit) | +| **LDHS** | `base_reg, dest_reg [, offset]`
`label, dest_reg [, offset]` | Load half-word with sign extension | +| **LDW** | `base_reg, dest_reg [, offset]`
`label, dest_reg [, offset]` | Load word (32-bit) | + +**Examples:** +```asm +; Direct register addressing +ldb rg0, rg1 ; Load byte from address in rg0 +ldw rg0, rg1, 8 ; Load word from (rg0 + 8) + +; Label addressing +ldb buffer, rg2 ; Load byte from label 'buffer' +ldw stack, bpr ; Load stack address into base pointer +``` +**Label Expansions:** +```asm +; ldb buffer, rg2 expands to: +lli buffer, rg2 ; Load lower 16 bits of buffer address +lui buffer, rg2 ; Load upper 16 bits of buffer address +ldb rg2, rg2 ; Load byte from address in rg2 + +; ldw stack, bpr expands to: +lli stack, bpr ; Load lower 16 bits of stack address +lui stack, bpr ; Load upper 16 bits of stack address +ldw bpr, bpr ; Load word from address in bpr +``` +#### Store Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **STB** | `src_reg, base_reg [, offset]`
`src_reg, label [, offset]` | Store byte to memory | +| **STH** | `src_reg, base_reg [, offset]`
`src_reg, label [, offset]` | Store half-word to memory | +| **STW** | `src_reg, base_reg [, offset]`
`src_reg, label [, offset]` | Store word to memory | + +**Examples:** +```asm +; Direct register addressing +stb rg0, rg1 ; Store byte from rg0 to address in rg1 +stw rg0, rg1, 12 ; Store word to (rg1 + 12) + +; Label addressing +stb acc, buffer ; Store byte from accumulator to 'buffer' +stw rg1, current ; Store word to 'current' variable +``` +**Label Expansions:** +```asm +; stb acc, buffer expands to: +lli buffer, rgf ; Load lower 16 bits of buffer address +lui buffer, rgf ; Load upper 16 bits of buffer address +stb acc, rgf ; Store byte from acc to address in rgf + +; stw rg1, current expands to: +lli current, rgf ; Load lower 16 bits of current address +lui current, rgf ; Load upper 16 bits of current address +stw rg1, rgf ; Store word from rg1 to address in rgf +``` +### Immediate Load Instructions + +| Mnemonic | Operands | Description | +|----------|----------|------------------------------------------------------------------------| +| **LLI** | `imm, dest_reg` | Load 16-bit immediate into lower 16 bits
**Clears upper 16 bits!** | +| **LUI** | `imm, dest_reg` | Load 16-bit immediate into upper 16 bits | + +**Usage** + +ensure that you always run **Lli** before **Lui** as **Lli** clears the upper 16 bits. + +**Examples:** +```asm +lli 0x1234, rg0 ; Load 0x1234 into lower 16 bits of rg0 +lui 0xABCD, rg0 ; Load 0xABCD into upper 16 bits of rg0 +``` +### Jump Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **JMP** | `addr [, offset_reg]`
`imm, offset_reg` | Unconditional jump | +| **JEQ** | `addr [, offset_reg]` | Jump if equal flag set | +| **JNE** | `addr [, offset_reg]` | Jump if not equal flag set | +| **JGT** | `addr [, offset_reg]` | Jump if greater than flag set | +| **JGE** | `addr [, offset_reg]` | Jump if greater or equal flags set | +| **JLT** | `addr [, offset_reg]` | Jump if less than flag set | +| **JLE** | `addr [, offset_reg]` | Jump if less or equal flags set | + +**Examples:** +```asm +jmp start ; Jump to label 'start' +jmp 4, ret ; Jump to address (4 + ret register) +jeq end ; Jump to 'end' if equal flag set +jgt loop ; Jump to 'loop' if greater than flag set +``` +### Arithmetic Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **ADD** | `src1_reg, src2_reg, dest_reg` | Addition | +| **SUB** | `src1_reg, src2_reg, dest_reg` | Subtraction | +| **IADD** | `src_reg, imm [, dest_reg]` | Immediate addition | +| **ISUB** | `src_reg, imm [, dest_reg]` | Immediate subtraction | +| **INC** | `reg` | Increment register by 1 | +| **DEC** | `reg` | Decrement register by 1 | + +**Examples:** +```asm +add rg0, rg1, rg2 ; rg2 = rg0 + rg1 +sub rg0, rg1, rg2 ; rg2 = rg0 - rg1 +iadd rg0, 10 ; rg0 = rg0 + 10 +// or using alternate syntax +addi rg0, 1 ; rg0 = rg0 + 1 +inc rg0 ; rg0 = rg0 + 1 +``` +### Bitwise Operations + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **AND** | `src1_reg, src2_reg, dest_reg` | Bitwise AND | +| **OR** | `src1_reg, src2_reg, dest_reg` | Bitwise OR | +| **XOR** | `src1_reg, src2_reg, dest_reg` | Bitwise XOR | +| **NOT** | `src_reg, dest_reg` | Bitwise NOT | +| **NAND** | `src1_reg, src2_reg, dest_reg` | Bitwise NAND | +| **NOR** | `src1_reg, src2_reg, dest_reg` | Bitwise NOR | +| **XNOR** | `src1_reg, src2_reg, dest_reg` | Bitwise XNOR | + +**Examples:** +```asm +and rg0, rg1, rg2 ; rg2 = rg0 & rg1 +not rg0, rg1 ; rg1 = ~rg0 +``` +### Shift Operations + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **SHL** | `reg, shift_amount` | Shift left | +| **SHR** | `reg, shift_amount` | Shift right | + +**Examples:** +```asm +shl rg0, 2 ; Shift rg0 left by 2 bits +shr rg0, 3 ; Shift rg0 right by 3 bits +``` +### Comparison and Control + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **CMP** | `reg1, reg2` | Compare registers and set flags | + +**Examples:** +```asm +cmp rg0, zero ; Compare rg0 with zero register +cmp rg1, rg2 ; Compare rg1 with rg2 +``` +### System Instructions + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **HLT** | - | Halt processor execution | +| **NOP** | - | No operation | +| **INT** | `interrupt_code` | Trigger interrupt | +| **IRT** | - | Return from interrupt | + +**Examples:** +```asm +hlt ; Stop processor execution +int 0x21 ; Trigger interrupt 0x21 +``` +## Pseudo-Instructions + +### Data Definition + +| Mnemonic | Syntax | Description | +|----------|--------|-------------| +| **DB** | `name: value1 [, value2, ...]` | Define bytes | +| **DH** | `name: value1 [, value2, ...]` | Define half-words | +| **DW** | `name: value1 [, value2, ...]` | Define words | + +**Examples:** +```asm +db message: "Hello World", 0 +dh numbers: 1000, 2000, 3000 +dw stack: 0x10000 +``` +### Memory Reservation + +| Mnemonic | Syntax | Description | +|----------|--------|-------------| +| **RESB** | `name: size` | Reserve bytes | +| **RESH** | `name: size` | Reserve half-words | +| **RESW** | `name: size` | Reserve words | + +**Examples:** +```asm +resb buffer: 256 ; Reserve 256 bytes +resh array: 100 ; Reserve space for 100 half-words +resw heap: 1024 ; Reserve space for 1024 words +``` +### Stack Operations + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **PUSH** | `reg` | Push register value onto stack | +| **POP** | `reg` | Pop stack value into register | + +**Examples:** +```asm +push rg0 ; Push rg0 value onto stack +pop ret ; Pop return address +``` +### Memory Access Shortcuts + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **LWI** | `name, reg` | Load address into register | + +**Examples:** +```asm +lwi string, rg1 ; Load address of 'string' into rg1 +``` + +### Function Control + +| Mnemonic | Operands | Description | +|----------|----------|-------------| +| **CALL** | `namespace::function` | Call a function with automatic return address management | +| **RETURN** | - | Return from a function to the caller | + +**Examples:** +```asm +call print::print ; Call the print function from the print namespace +return ; Return from the current function +``` + +### Module System + +| Mnemonic | Syntax | Description | +|----------|--------|-------------| +| **INCLUDE** | `module_name "path"` | Include module | + +**Examples:** +```asm +include print "print.dsa" +include fib "fib.dsa" +``` +## Library Examples + +### Multiplication Library (multiply.dsa) + +```asm +// multiply.dsa +// usage: +// +// include multiply "" +// +// usage for multiply: +// push (arg1) +// push (arg0) +// call multiply::multiply +// pop (arg0) +// pop (arg1) + +multiply: + push bpr + mov spr, bpr + + ldw bpr, rg0, 8 // load op 1 + ldw bpr, rg1, 12 // load op 2 + + lli 0, acc // initialize accumulator + +start: + add acc, rg0, acc + dec rg1 + + cmp rg1, zero + jgt start + +end: + stw acc, bpr, 8 // store result for caller + mov bpr, spr + pop bpr + return +``` + +### Print Library (print.dsa) + +```asm +// print.dsa +// usage: +// +// include print "" +// +// usage for print: +// push (register containing address of string) +// call print::print +// pop zero +// +// usage for reset: +// call print::reset + +dw display: 0x20000 +dw current: 0x20000 + +// prints the given text to the screen. +print: + push bpr + mov spr, bpr + + ldw bpr, rg0, 8 // get string address argument + ldw current, rg1 // get current display position + +print_loop: + ldb rg0, acc + stb acc, rg1 + + iadd rg0, 1 + iadd rg1, 1 + + cmp acc, zero + jne print_loop + jmp end + +// return +end: + stw rg1, current + + mov bpr, spr + pop bpr + return + +// resets the cursor position on the screen +reset: + push bpr + mov spr, bpr + ldw display, rg1 + stw rg1, current + mov bpr, spr + pop bpr + return +``` + +### Example Program (main.dsa) + +```asm +include print "./print.dsa" + +dw stack: 0x10000 +db string: "'To confuse your enemy, you must first confuse yourself' - Probably Sun Tzu." + +init: + // set up a stack. + ldw stack, bpr + mov bpr, spr + +start: + lwi string, rg1 + + // push string address argument + push rg1 + // call print function + call print::print + // clean up stack + pop rg1 + + hlt +``` \ No newline at end of file diff --git a/resources/ideas/dsa_binary_format.md b/resources/ideas/dsa_binary_format.md new file mode 100644 index 0000000..3a372ad --- /dev/null +++ b/resources/ideas/dsa_binary_format.md @@ -0,0 +1,10 @@ +# DSA File formatting specification. + +First, a clarification on what formats this document references. + +- .dsb: DSA Binary object, similar to a .o object file +- .dse: DSA Executable file, similar to a .exe/ELF binary + +## Format Specification + +### DSB binary format