forked from AbleOS/ableos
Compare commits
14 commits
f8c7873978
...
43ea77c18f
Author | SHA1 | Date | |
---|---|---|---|
koniifer | 43ea77c18f | ||
Able | fcca015866 | ||
Able | cc9337348e | ||
Able | 028949559b | ||
Able | 91380539d9 | ||
Able | ec25c0f207 | ||
Able | 1b5cb54a2b | ||
Able | 9686349476 | ||
Able | 40cc412ab3 | ||
Able | cd369b39d5 | ||
331cbf5da1 | |||
Able | 0594b99a59 | ||
Able | 1855307cd9 | ||
Able | 7426bf479f |
14
Cargo.lock
generated
14
Cargo.lock
generated
|
@ -390,17 +390,17 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "hbbytecode"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#2bc7a5c13f6ab2b3ee28f772f31eb3414fa2b25b"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
|
||||
|
||||
[[package]]
|
||||
name = "hbbytecode"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/ableos/holey-bytes#2bc7a5c13f6ab2b3ee28f772f31eb3414fa2b25b"
|
||||
source = "git+https://git.ablecorp.us/ableos/holey-bytes#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
|
||||
|
||||
[[package]]
|
||||
name = "hblang"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#2bc7a5c13f6ab2b3ee28f772f31eb3414fa2b25b"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
|
||||
dependencies = [
|
||||
"hbvm 0.1.0 (git+https://git.ablecorp.us/AbleOS/holey-bytes.git)",
|
||||
]
|
||||
|
@ -408,7 +408,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "hbvm"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#2bc7a5c13f6ab2b3ee28f772f31eb3414fa2b25b"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
|
||||
dependencies = [
|
||||
"hbbytecode 0.1.0 (git+https://git.ablecorp.us/AbleOS/holey-bytes.git)",
|
||||
]
|
||||
|
@ -416,7 +416,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "hbvm"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/ableos/holey-bytes#2bc7a5c13f6ab2b3ee28f772f31eb3414fa2b25b"
|
||||
source = "git+https://git.ablecorp.us/ableos/holey-bytes#c133c2dbe71b3f1e1142bacef200775ae0c1d22d"
|
||||
dependencies = [
|
||||
"hbbytecode 0.1.0 (git+https://git.ablecorp.us/ableos/holey-bytes)",
|
||||
]
|
||||
|
@ -737,9 +737,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.19.0"
|
||||
version = "1.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe"
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
|
|
|
@ -1,20 +1,84 @@
|
|||
use logos::Logos;
|
||||
pub mod protocol;
|
||||
|
||||
#[derive(Logos, Debug, PartialEq)]
|
||||
use std::io::Read;
|
||||
|
||||
use {
|
||||
logos::{Lexer, Logos},
|
||||
protocol::Protocol,
|
||||
};
|
||||
|
||||
#[derive(Logos, Debug, PartialEq, Clone)]
|
||||
#[logos(skip r"[ \t\n\f]+")] // Ignore this regex pattern between tokens
|
||||
enum Token {
|
||||
// Tokens can be literal strings, of any length.
|
||||
#[token("protocol")]
|
||||
Protocol,
|
||||
|
||||
#[token(".")]
|
||||
Period,
|
||||
#[token("{")]
|
||||
LBrace,
|
||||
|
||||
// Or regular expressions.
|
||||
#[regex("[a-zA-Z]+")]
|
||||
Text,
|
||||
#[token("}")]
|
||||
RBrace,
|
||||
|
||||
#[token("(")]
|
||||
LParen,
|
||||
|
||||
#[token(")")]
|
||||
RParen,
|
||||
|
||||
#[token(":")]
|
||||
Colon,
|
||||
#[token(";")]
|
||||
SemiColon,
|
||||
|
||||
#[token(",")]
|
||||
Comma,
|
||||
|
||||
#[token("=")]
|
||||
Equal,
|
||||
|
||||
#[token("->")]
|
||||
RArrow,
|
||||
|
||||
#[regex("[a-zA-Z_]+", |lex|{lex.slice().to_string()})]
|
||||
Text(String),
|
||||
|
||||
#[regex("[1234567890]+", |lex|{lex.slice().parse::<u64>().unwrap()})]
|
||||
Number(u64),
|
||||
|
||||
#[regex(r"@[a-zA-Z_]+", |lex|{lex.slice().to_string()})]
|
||||
Decorator(String),
|
||||
|
||||
#[regex(r#"@[a-zA-Z_]+\([a-zA-Z,0-9=]+\)"#, |lex|{lex.slice().to_string()})]
|
||||
DecoratorOption(String),
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let mut lex = Token::lexer("Create ridiculously fast Lexers.");
|
||||
pub fn build_idl(name: String) {
|
||||
let contents = open_protocol(name);
|
||||
let lex = Token::lexer(&contents);
|
||||
let mut tokens = vec![];
|
||||
for x in lex {
|
||||
match x {
|
||||
Ok(token) => {
|
||||
println!("{:?}", token);
|
||||
tokens.push(token);
|
||||
}
|
||||
Err(err) => println!("{:?}", err),
|
||||
}
|
||||
}
|
||||
build(tokens);
|
||||
}
|
||||
|
||||
fn build(a: Vec<Token>) {
|
||||
for toke in a {
|
||||
println!("{:?}", toke);
|
||||
}
|
||||
}
|
||||
|
||||
fn open_protocol(name: String) -> String {
|
||||
let path = format!("sysdata/idl/{}/src/protocol.aidl", name);
|
||||
let mut file = std::fs::File::open(path).unwrap();
|
||||
let mut contents = String::new();
|
||||
file.read_to_string(&mut contents).unwrap();
|
||||
contents
|
||||
}
|
||||
|
|
17
dev/src/idl/protocol.rs
Normal file
17
dev/src/idl/protocol.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
pub enum ProtocolTypes {
|
||||
Byte,
|
||||
}
|
||||
|
||||
pub struct Protocol {}
|
||||
impl Protocol {
|
||||
pub fn is_empty(&self) -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
pub fn validate_data(&self, data: Vec<u8>) -> bool {
|
||||
if !data.is_empty() && self.is_empty() {
|
||||
return false;
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
|
@ -1,4 +1,6 @@
|
|||
use std::io::Write;
|
||||
|
||||
use idl::build_idl;
|
||||
pub mod idl;
|
||||
|
||||
pub enum Options {
|
||||
|
@ -7,7 +9,7 @@ pub enum Options {
|
|||
New,
|
||||
Run,
|
||||
}
|
||||
#[derive(PartialEq)]
|
||||
#[derive(PartialEq, Debug)]
|
||||
pub enum DevelopmentType {
|
||||
Program,
|
||||
Library,
|
||||
|
@ -24,7 +26,7 @@ fn main() {
|
|||
|
||||
match subcommand {
|
||||
"build" => {
|
||||
let name = &args[1];
|
||||
let name = &args.pop().unwrap();
|
||||
build(name.to_string())
|
||||
}
|
||||
"new" => {
|
||||
|
@ -103,8 +105,21 @@ fn run() {
|
|||
|
||||
fn build(name: String) {
|
||||
println!("building {}", name);
|
||||
let mut a = name.split("/");
|
||||
let dev_type = a.next().unwrap();
|
||||
let name = a.next().unwrap().to_string();
|
||||
match dev_type {
|
||||
"programs" => build_program(name),
|
||||
"idl" => build_idl(name),
|
||||
_ => {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build_program(name: String) {}
|
||||
pub fn build_library(name: String) {}
|
||||
|
||||
fn help() {
|
||||
println!(
|
||||
"==========
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use {crate::logger::TERMINAL_LOGGER, core::fmt::Write, spin::Mutex};
|
||||
static SERIAL_CONSOLE: Mutex<SerialConsole> = Mutex::new(SerialConsole {
|
||||
pub static SERIAL_CONSOLE: Mutex<SerialConsole> = Mutex::new(SerialConsole {
|
||||
uart: 0x09000000 as *mut u8,
|
||||
});
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ use {
|
|||
core::fmt,
|
||||
hashbrown::HashMap,
|
||||
};
|
||||
|
||||
/// A device object.
|
||||
/// TODO define device
|
||||
pub type Device = xml::XMLElement;
|
||||
|
@ -23,27 +24,29 @@ impl DeviceTree {
|
|||
let mut dt = Self {
|
||||
devices: HashMap::new(),
|
||||
};
|
||||
device_tree!(dt, [
|
||||
"Mice",
|
||||
"Keyboards",
|
||||
"Controllers",
|
||||
"Generic HIDs",
|
||||
"Disk Drives",
|
||||
"CD Drives",
|
||||
"Batteries",
|
||||
"Monitors",
|
||||
"GPUs",
|
||||
"CPUs",
|
||||
"USB",
|
||||
"Serial Ports",
|
||||
"Cameras",
|
||||
"Biometric Devices",
|
||||
]);
|
||||
device_tree!(
|
||||
dt,
|
||||
[
|
||||
"Mice",
|
||||
"Keyboards",
|
||||
"Controllers",
|
||||
"Generic HIDs",
|
||||
"Disk Drives",
|
||||
"CD Drives",
|
||||
"Batteries",
|
||||
"Monitors",
|
||||
"GPUs",
|
||||
"CPUs",
|
||||
"USB",
|
||||
"Serial Ports",
|
||||
"Cameras",
|
||||
"Biometric Devices",
|
||||
]
|
||||
);
|
||||
dt
|
||||
}
|
||||
}
|
||||
use crate::{utils::TAB, device_tree};
|
||||
use crate::tab;
|
||||
use crate::{device_tree, tab, utils::TAB};
|
||||
impl fmt::Display for DeviceTree {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
writeln!(f)?;
|
|
@ -1,11 +1,14 @@
|
|||
//! Environment call handling routines
|
||||
|
||||
use crate::holeybytes::kernel_services::{block_read, service_definition_service::sds_msg_handler};
|
||||
use crate::holeybytes::kernel_services::{
|
||||
block_read, dt_msg_handler::dt_msg_handler, logging_service::log_msg_handler,
|
||||
service_definition_service::sds_msg_handler,
|
||||
};
|
||||
|
||||
use {
|
||||
super::Vm,
|
||||
crate::{arch, ipc::buffer::IpcBuffer, kmain::IPC_BUFFERS},
|
||||
log::{debug, error, info, trace, warn},
|
||||
log::{debug, error, info, trace},
|
||||
};
|
||||
|
||||
pub fn handler(vm: &mut Vm) {
|
||||
|
@ -152,46 +155,18 @@ pub fn handler(vm: &mut Vm) {
|
|||
_ => {}
|
||||
}
|
||||
}
|
||||
#[cfg(not(target_arch = "x86_64"))]
|
||||
3 => unimplemented!("TODO: implement whatever buffer 3 does for no x86_64"),
|
||||
// source of rng
|
||||
4 => {
|
||||
// limit to last 32 bits
|
||||
vm.registers[1] =
|
||||
hbvm::value::Value(crate::arch::hardware_random_u64() & 0xFFFFFFFF);
|
||||
}
|
||||
// get arch
|
||||
5 => {
|
||||
if cfg!(target_arch = "x86_64") {
|
||||
vm.registers[1] = hbvm::value::Value(0);
|
||||
} else if cfg!(target_arch = "aarch64") {
|
||||
vm.registers[1] = hbvm::value::Value(1);
|
||||
} else {
|
||||
vm.registers[1] = hbvm::value::Value(u64::MAX)
|
||||
}
|
||||
}
|
||||
// AbleCode™ (get fb ptr)
|
||||
6 => {
|
||||
use {
|
||||
crate::kmain::FB_REQ,
|
||||
limine::{Framebuffer, NonNullPtr},
|
||||
};
|
||||
let fb1: &NonNullPtr<Framebuffer> =
|
||||
&FB_REQ.get_response().get().unwrap().framebuffers()[0];
|
||||
let msg = block_read(mem_addr, length)[0];
|
||||
if msg == b'p' {
|
||||
// ptr
|
||||
let fb_front = fb1.address.as_ptr().unwrap() as *const u8;
|
||||
log::info!("Graphics front ptr {:?}", fb_front);
|
||||
vm.registers[1] = hbvm::value::Value(fb_front as u64);
|
||||
} else if msg == b'w' {
|
||||
// width
|
||||
log::info!("FB Width: {}", fb1.width);
|
||||
vm.registers[1] = hbvm::value::Value(fb1.width);
|
||||
} else if msg == b'h' {
|
||||
// height
|
||||
log::info!("FB Height: {}", fb1.height);
|
||||
vm.registers[1] = hbvm::value::Value(fb1.height);
|
||||
}
|
||||
}
|
||||
5 => match dt_msg_handler(vm, mem_addr, length) {
|
||||
Ok(()) => {}
|
||||
Err(_) => log::error!("Improper dt query"),
|
||||
},
|
||||
buffer_id => {
|
||||
let mut buffs = IPC_BUFFERS.lock();
|
||||
match buffs.get_mut(&buffer_id) {
|
||||
|
@ -272,34 +247,6 @@ pub fn handler(vm: &mut Vm) {
|
|||
}
|
||||
}
|
||||
|
||||
fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
// let message_length = 8 + 8 + 8;
|
||||
// log::info!("Mem Addr 0x{:x?} length {}", mem_addr, length);
|
||||
let msg_vec = block_read(mem_addr, length);
|
||||
|
||||
let log_level = msg_vec.last().unwrap();
|
||||
match core::str::from_utf8(&msg_vec[1..]) {
|
||||
Ok(strr) => {
|
||||
// use LogLevel::*;
|
||||
let _ll = match log_level {
|
||||
0 | 48 => error!("{}", strr),
|
||||
1 | 49 => warn!("{}", strr),
|
||||
2 | 50 => info!("{}", strr),
|
||||
3 | 51 => debug!("{}", strr),
|
||||
4 | 52 => trace!("{}", strr),
|
||||
_ => {
|
||||
return Err(LogError::InvalidLogFormat);
|
||||
}
|
||||
};
|
||||
}
|
||||
Err(e) => {
|
||||
error!("{:?}", e);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum LogError {
|
||||
NoMessages,
|
||||
|
|
87
kernel/src/holeybytes/kernel_services/dt_msg_handler.rs
Normal file
87
kernel/src/holeybytes/kernel_services/dt_msg_handler.rs
Normal file
|
@ -0,0 +1,87 @@
|
|||
use {
|
||||
crate::holeybytes::{kernel_services::block_read, Vm},
|
||||
alloc::{
|
||||
string::{String, ToString},
|
||||
vec::Vec,
|
||||
},
|
||||
};
|
||||
pub enum DtError {
|
||||
QueryFailure,
|
||||
}
|
||||
|
||||
pub fn dt_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), DtError> {
|
||||
let msg_vec = block_read(mem_addr, length);
|
||||
let mut bytes: Vec<u8> = Vec::new();
|
||||
for byte in msg_vec {
|
||||
if *byte == 0 {
|
||||
break;
|
||||
}
|
||||
bytes.push(*byte)
|
||||
}
|
||||
let query_string = String::from_utf8(bytes).unwrap();
|
||||
log::trace!("Query {}", query_string);
|
||||
|
||||
let ret = query_parse(query_string);
|
||||
log::trace!("Query response {}", ret);
|
||||
|
||||
vm.registers[1] = hbvm::value::Value(ret);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn query_parse(query_string: String) -> u64 {
|
||||
let qt_parse_step_one = query_string.split("/");
|
||||
let mut qt_parse_step_two: Vec<String> = Vec::new();
|
||||
for a in qt_parse_step_one {
|
||||
qt_parse_step_two.push(a.to_string());
|
||||
}
|
||||
|
||||
let first_fragment: &str = &qt_parse_step_two[0];
|
||||
let ret = match first_fragment {
|
||||
"framebuffer" => framebuffer_parse(qt_parse_step_two),
|
||||
"cpu" => cpu_parse(qt_parse_step_two),
|
||||
|
||||
_ => 0,
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
fn cpu_parse(qt_parse_step_two: Vec<String>) -> u64 {
|
||||
let second_fragment: &str = &qt_parse_step_two[1];
|
||||
match second_fragment {
|
||||
// "architecture" => {
|
||||
// return 0;
|
||||
// }
|
||||
_ => {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
fn framebuffer_parse(qt_parse_step_two: Vec<String>) -> u64 {
|
||||
use crate::kmain::FB_REQ;
|
||||
let fbs = &FB_REQ.get_response().get().unwrap().framebuffers();
|
||||
|
||||
let second_fragment: &str = &qt_parse_step_two[1];
|
||||
match second_fragment {
|
||||
"fb0" => {
|
||||
let fb_front = &fbs[0];
|
||||
let third_fragment: &str = &qt_parse_step_two[2];
|
||||
let ret = match third_fragment {
|
||||
"ptr" => {
|
||||
let ptr = fb_front.address.as_ptr().unwrap();
|
||||
ptr as usize as u64
|
||||
}
|
||||
"width" => fb_front.width,
|
||||
"height" => fb_front.height,
|
||||
|
||||
_ => 0,
|
||||
};
|
||||
return ret;
|
||||
}
|
||||
_ => {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
}
|
49
kernel/src/holeybytes/kernel_services/logging_service.rs
Normal file
49
kernel/src/holeybytes/kernel_services/logging_service.rs
Normal file
|
@ -0,0 +1,49 @@
|
|||
use crate::holeybytes::{kernel_services::block_read, Vm};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum LogError {
|
||||
InvalidLogFormat,
|
||||
}
|
||||
use log::Record;
|
||||
|
||||
pub fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
let msg_vec = block_read(mem_addr, length);
|
||||
|
||||
let log_level = msg_vec.last().unwrap();
|
||||
|
||||
let file_name = "None";
|
||||
let line_number = 0;
|
||||
|
||||
match core::str::from_utf8(&msg_vec[..msg_vec.len()]) {
|
||||
Ok(strr) => {
|
||||
use log::Level::*;
|
||||
let log_level = match log_level {
|
||||
0 | 48 => Error,
|
||||
1 | 49 => Warn,
|
||||
2 | 50 => Info,
|
||||
3 | 51 => Debug,
|
||||
4 | 52 => Trace,
|
||||
_ => {
|
||||
return Err(LogError::InvalidLogFormat);
|
||||
}
|
||||
};
|
||||
|
||||
log::logger().log(
|
||||
&Record::builder()
|
||||
.args(format_args!("{}", strr))
|
||||
.level(log_level)
|
||||
.target("Userspace")
|
||||
.file(Some(file_name))
|
||||
.line(Some(line_number))
|
||||
.module_path(Some(&file_name))
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
|
||||
Err(e) => {
|
||||
log::error!("{:?}", e);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
use core::slice;
|
||||
|
||||
pub mod dt_msg_handler;
|
||||
pub mod logging_service;
|
||||
pub mod mem_serve;
|
||||
pub mod service_definition_service;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use {
|
||||
crate::{
|
||||
arch::hardware_random_u64,
|
||||
holeybytes::{ecah::LogError, kernel_services::block_read, Vm},
|
||||
holeybytes::{kernel_services::block_read, Vm},
|
||||
ipc::{buffer::IpcBuffer, protocol::Protocol},
|
||||
kmain::IPC_BUFFERS,
|
||||
},
|
||||
|
@ -15,12 +15,12 @@ pub static SERVICES: Lazy<Mutex<Services>> = Lazy::new(|| {
|
|||
dt.0.insert(0, Protocol::void());
|
||||
Mutex::new(dt)
|
||||
});
|
||||
|
||||
pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
|
||||
#[derive(Debug)]
|
||||
pub enum ServiceError {
|
||||
InvalidFormat,
|
||||
}
|
||||
pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), ServiceError> {
|
||||
let msg_vec = block_read(mem_addr, length);
|
||||
if msg_vec.is_empty() {
|
||||
return Err(LogError::NoMessages);
|
||||
}
|
||||
let sds_event_type: ServiceEventType = msg_vec[0].into();
|
||||
|
||||
// info!("Length {}", msg_vec.len());
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
protocol abc {
|
||||
}
|
24
sysdata/idl/log/src/protocol.aidl
Normal file
24
sysdata/idl/log/src/protocol.aidl
Normal file
|
@ -0,0 +1,24 @@
|
|||
@auto_increment
|
||||
enum LogLevel {
|
||||
Error = 0,
|
||||
Warn,
|
||||
Info,
|
||||
Debug,
|
||||
Trace,
|
||||
}
|
||||
|
||||
@auto_increment
|
||||
enum LogResult {
|
||||
Err = 0,
|
||||
Ok,
|
||||
}
|
||||
|
||||
struct Log {
|
||||
log_level: LogLevel,
|
||||
}
|
||||
|
||||
@visibility(public)
|
||||
protocol Log {
|
||||
fn log(Log) -> LogResult;
|
||||
fn flush() -> LogResult;
|
||||
}
|
1
sysdata/libraries/dt_api/README.md
Normal file
1
sysdata/libraries/dt_api/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# dt_api
|
8
sysdata/libraries/dt_api/src/lib.hb
Normal file
8
sysdata/libraries/dt_api/src/lib.hb
Normal file
|
@ -0,0 +1,8 @@
|
|||
stn := @use("rel:../../stn/src/lib.hb");
|
||||
.{string, memory, buffer} := stn
|
||||
|
||||
dt_get := fn(query: ^u8): int {
|
||||
message_length := string.length(query)
|
||||
|
||||
return @eca(int, 3, 5, query, message_length)
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
Element := struct {
|
||||
width: int,
|
||||
height: int,
|
||||
|
||||
x: u16,
|
||||
y: u16,
|
||||
|
||||
id: int,
|
||||
}
|
||||
|
||||
create_element := fn(): Element {
|
||||
return Element.(0, 0, 0, 0, 0)
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
FrameID := struct {
|
||||
|
||||
}
|
|
@ -1,12 +1,24 @@
|
|||
stn := @use("rel:../../stn/src/lib.hb");
|
||||
.{string, memory, buffer} := stn
|
||||
|
||||
WindowID := struct {
|
||||
host_id: int,
|
||||
window_id: int,
|
||||
}
|
||||
|
||||
create_window := fn(): WindowID {
|
||||
return WindowID.(1, 2)
|
||||
}
|
||||
create_window := fn(channel: int): void {
|
||||
// get the horizon buffer
|
||||
// request a new window and provide the callback buffer
|
||||
// wait to recieve a message
|
||||
|
||||
windowing_system_buffer := buffer.search("XHorizon\0")
|
||||
|
||||
if windowing_system_buffer == 0 {
|
||||
} else {
|
||||
msg := "\{01}\0"
|
||||
msg_length := 2
|
||||
@eca(void, 3, windowing_system_buffer, msg, msg_length)
|
||||
}
|
||||
|
||||
update_ui := fn(window_id: WindowID): void {
|
||||
return
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
ui_lisp_text_example := "(text id_1)\0";
|
||||
|
||||
|
21
sysdata/libraries/ignim/src/application.hb
Normal file
21
sysdata/libraries/ignim/src/application.hb
Normal file
|
@ -0,0 +1,21 @@
|
|||
structures := @use("rel:structures.hb")
|
||||
version := @use("rel:version.hb")
|
||||
|
||||
// Refer to here https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkApplicationInfo.html
|
||||
ApplicationInfo := struct {
|
||||
sType: int,
|
||||
pNext: ^int,
|
||||
application_name: ^u8,
|
||||
application_version: int,
|
||||
engine_name: int,
|
||||
engine_version: int,
|
||||
api_version: int,
|
||||
}
|
||||
|
||||
new_application_info := fn(app_name: ^u8, app_version: int, engine_name: ^u8, engine_version: int, api_version: int): ApplicationInfo {
|
||||
app_info_type := structures.ApplicationInfoType
|
||||
|
||||
app_info := ApplicationInfo.(app_info_type, 0, app_name, app_version, engine_name, engine_version, api_version)
|
||||
|
||||
return app_info
|
||||
}
|
14
sysdata/libraries/ignim/src/errors.hb
Normal file
14
sysdata/libraries/ignim/src/errors.hb
Normal file
|
@ -0,0 +1,14 @@
|
|||
OutOfHostMemory := -1
|
||||
OutOfDeviceMemory := -2
|
||||
InitializationFailed := -3
|
||||
DeviceLost := -4
|
||||
MemoryMapFailed := -5
|
||||
|
||||
LayerNotPresent := -6
|
||||
ExtensionNotPresent := -7
|
||||
FeatureNotPresent := -8
|
||||
IncompatibleDriver := -9
|
||||
TooManyObjects := -10
|
||||
FormatNotSupported := -11
|
||||
FragmentedPool := -12
|
||||
Unknown := -13
|
10
sysdata/libraries/ignim/src/extends.hb
Normal file
10
sysdata/libraries/ignim/src/extends.hb
Normal file
|
@ -0,0 +1,10 @@
|
|||
Extent3D := struct {
|
||||
width: int,
|
||||
height: int,
|
||||
depth: int,
|
||||
}
|
||||
|
||||
Extent2D := struct {
|
||||
width: int,
|
||||
height: int,
|
||||
}
|
35
sysdata/libraries/ignim/src/instance.hb
Normal file
35
sysdata/libraries/ignim/src/instance.hb
Normal file
|
@ -0,0 +1,35 @@
|
|||
application := @use("rel:application.hb");
|
||||
.{ApplicationInfo} := application
|
||||
|
||||
structures := @use("rel:structures.hb")
|
||||
errors := @use("rel:errors.hb")
|
||||
|
||||
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkInstanceCreateInfo.html
|
||||
InstanceCreateInfo := struct {
|
||||
sType: int,
|
||||
pNext: int,
|
||||
flags: int,
|
||||
application_info: ^ApplicationInfo,
|
||||
enabled_layer_count: int,
|
||||
ppEnabledLayerNames: int,
|
||||
enabled_extension_count: int,
|
||||
ppEnabledExtensionNames: int,
|
||||
}
|
||||
|
||||
new_create_info := fn(application_info: ^ApplicationInfo): InstanceCreateInfo {
|
||||
create_info_type := structures.InstanceCreateInfoType
|
||||
enabled_layer_count := 0
|
||||
|
||||
create_info := InstanceCreateInfo.(create_info_type, 0, 0, application_info, enabled_layer_count, 0, 0, 0)
|
||||
return create_info
|
||||
}
|
||||
|
||||
// TODO
|
||||
Instance := struct {inner: int}
|
||||
void_instance := fn(): Instance {
|
||||
return Instance.(0)
|
||||
}
|
||||
|
||||
create_instance := fn(create_info: ^InstanceCreateInfo, allocator_callback: int, new_obj: ^Instance): int {
|
||||
return errors.IncompatibleDriver
|
||||
}
|
|
@ -1,7 +1,17 @@
|
|||
VK_VERSION_MAJOR := 1;
|
||||
VK_VERSION_MINOR := 0;
|
||||
application := @use("rel:application.hb")
|
||||
|
||||
init_vulkan := fn(): void {
|
||||
|
||||
return
|
||||
results := @use("rel:results.hb")
|
||||
errors := @use("rel:errors.hb")
|
||||
|
||||
offsets := @use("rel:offset.hb")
|
||||
extends := @use("rel:extends.hb")
|
||||
|
||||
rect := @use("rel:rect.hb")
|
||||
structures := @use("rel:structures.hb")
|
||||
instance := @use("rel:instance.hb")
|
||||
|
||||
version := @use("rel:version.hb")
|
||||
|
||||
init_vulkan := fn(): int {
|
||||
return errors.IncompatibleDriver
|
||||
}
|
10
sysdata/libraries/ignim/src/offset.hb
Normal file
10
sysdata/libraries/ignim/src/offset.hb
Normal file
|
@ -0,0 +1,10 @@
|
|||
Offset3D := struct {
|
||||
x: int,
|
||||
y: int,
|
||||
z: int,
|
||||
}
|
||||
|
||||
Offset2D := struct {
|
||||
x: int,
|
||||
y: int,
|
||||
}
|
7
sysdata/libraries/ignim/src/rect.hb
Normal file
7
sysdata/libraries/ignim/src/rect.hb
Normal file
|
@ -0,0 +1,7 @@
|
|||
offsets := @use("rel:offset.hb")
|
||||
extends := @use("rel:extends.hb")
|
||||
|
||||
Rect2D := struct {
|
||||
offset: offsets.Offset2D,
|
||||
extent: extends.Extent2D,
|
||||
}
|
7
sysdata/libraries/ignim/src/results.hb
Normal file
7
sysdata/libraries/ignim/src/results.hb
Normal file
|
@ -0,0 +1,7 @@
|
|||
// NonErrors
|
||||
Success := 0
|
||||
NotReady := 1
|
||||
Timeout := 2
|
||||
EventSet := 3
|
||||
EventReset := 4
|
||||
Incomplete := 5
|
61
sysdata/libraries/ignim/src/structures.hb
Normal file
61
sysdata/libraries/ignim/src/structures.hb
Normal file
|
@ -0,0 +1,61 @@
|
|||
ApplicationInfoType := 0
|
||||
InstanceCreateInfoType := 1
|
||||
DeviceQueueCreateInfo := 2
|
||||
DeviceCreateInfo := 3
|
||||
SubmitInfo := 4
|
||||
MemoryAllocateInfo := 5
|
||||
MappedMemoryRange := 6
|
||||
BindSparseInfo := 7
|
||||
|
||||
FenceCreateInfo := 8
|
||||
SemaphoreCreateInfo := 9
|
||||
EventCreateInfo := 10
|
||||
QueryPoolCreateInfo := 11
|
||||
|
||||
BufferCreateInfo := 12
|
||||
BufferViewCreateInfo := 13
|
||||
|
||||
ImageCreateInfo := 14
|
||||
ImageViewCreateInfo := 15
|
||||
|
||||
ShaderModuleCreateInfo := 16
|
||||
|
||||
PipelineCacheCreateInfo := 17
|
||||
PipelineShaderStageCreateInfo := 18
|
||||
PipelineVertexInputStateCreateInfo := 19
|
||||
PipelineInputAssemblyStateCreateInfo := 20
|
||||
PipelineTessellationStateCreateInfo := 21
|
||||
PipelineViewportStateCreateInfo := 22
|
||||
PipelineRasterizationStateCreateInfo := 23
|
||||
PipelineMultisampleStateCreateInfo := 24
|
||||
PipelineDepthStencilStateCreateInfo := 25
|
||||
PipelineColorBlendStateCreateInfo := 26
|
||||
PipelineDynamicStateCreateInfo := 27
|
||||
|
||||
GraphicsPipelineCreateInfo := 28
|
||||
ComputePipelineCreateInfo := 29
|
||||
PipelineLayoutCreateInfo := 30
|
||||
SamplerCreateInfo := 31
|
||||
|
||||
DescriptorSetLayoutCreateInfo := 32
|
||||
DescriptorPoolCreateInfo := 33
|
||||
|
||||
DescriptorSetAllocateInfo := 34
|
||||
WriteDescriptorSet := 35
|
||||
CopyDescriptorSet := 36
|
||||
FramebufferCreateInfo := 37
|
||||
|
||||
RenderPassCreateInfo := 38
|
||||
CommandPoolCreateInfo := 39
|
||||
|
||||
CommandBufferAllocateInfo := 40
|
||||
CommandBufferInheritanceInfo := 41
|
||||
CommandBufferBeginInfo := 42
|
||||
|
||||
RenderPassBeginInfo := 43
|
||||
BufferMemoryBarrier := 44
|
||||
ImageMemoryBarrier := 45
|
||||
MemoryBarrier := 46
|
||||
|
||||
LoaderInstanceCreateInfo := 47
|
||||
LoaderDeviceCreateInfo := 48
|
9
sysdata/libraries/ignim/src/version.hb
Normal file
9
sysdata/libraries/ignim/src/version.hb
Normal file
|
@ -0,0 +1,9 @@
|
|||
ApiVersion1_0 := make_api_version(0, 1, 0, 0)
|
||||
|
||||
make_version := fn(major: int, minor: int, patch: int): int {
|
||||
return major << 22 | minor << 12 | patch
|
||||
}
|
||||
|
||||
make_api_version := fn(variant: int, major: int, minor: int, patch: int): int {
|
||||
return variant << 29 | major << 22 | minor << 12 | patch
|
||||
}
|
1
sysdata/libraries/pci/README.md
Normal file
1
sysdata/libraries/pci/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# pci
|
25
sysdata/libraries/pci/src/lib.hb
Normal file
25
sysdata/libraries/pci/src/lib.hb
Normal file
|
@ -0,0 +1,25 @@
|
|||
PCIAddress := struct {
|
||||
bus: u8,
|
||||
device: u8,
|
||||
function: u8,
|
||||
}
|
||||
|
||||
find_device := fn(vendor_id: int, device_id: int, pci_address: PCIAddress): int {
|
||||
return 1
|
||||
}
|
||||
|
||||
scan_bus := fn(): void {
|
||||
}
|
||||
|
||||
config_read32 := fn(bus: u32, device: u32, func: u32, offset: u32): u32 {
|
||||
// construct address param
|
||||
address := bus << 16 | device << 11 | func << 8 | offset & 0xFC | 0x80000000
|
||||
|
||||
// write address
|
||||
//Port::new(0xCF8).write(address);
|
||||
|
||||
// read data
|
||||
//Port::new(0xCFC).read()
|
||||
|
||||
return
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
.{math, memory} := @use("../../stn/src/lib.hb");
|
||||
.{dt_get} := @use("../../dt_api/src/lib.hb");
|
||||
.{IVec2} := @use("rel:lib.hb")
|
||||
|
||||
Color := struct {b: u8, g: u8, r: u8, a: u8}
|
||||
|
@ -19,16 +20,13 @@ light_blue := Color.(255, 0, 0, 255)
|
|||
light_magenta := Color.(255, 0, 255, 255)
|
||||
light_cyan := Color.(255, 255, 0, 255)
|
||||
|
||||
// fb_width := 1024
|
||||
// fb_height := 768
|
||||
// fb_pixels := fb_width * fb_height
|
||||
// fb_bytes := fb_pixels << 2
|
||||
// might not work for some resolutions, but needs to be comptime because...
|
||||
copy_pixels := 0xC000 >> 2
|
||||
// partitions := fb_pixels / copy_pixels
|
||||
// total_pages := 1 + fb_bytes >> 12
|
||||
|
||||
ctx := @as(Context, idk)
|
||||
|
||||
// some of these are redudant holdovers from fb_driver
|
||||
// will keep them for future work if necessary
|
||||
Context := struct {
|
||||
fb: ^Color,
|
||||
bb: ^Color,
|
||||
|
@ -42,8 +40,8 @@ Context := struct {
|
|||
}
|
||||
|
||||
init := fn(): void {
|
||||
width := @eca(int, 3, 6, "w\0", 2)
|
||||
height := @eca(int, 3, 6, "h\0", 2)
|
||||
width := dt_get("framebuffer/fb0/width\0")
|
||||
height := dt_get("framebuffer/fb0/height\0")
|
||||
// width := 1024
|
||||
// height := 768
|
||||
pixels := width * height
|
||||
|
@ -52,7 +50,7 @@ init := fn(): void {
|
|||
pages := 1 + bytes >> 12
|
||||
back_buffer := create_back_buffer(pages)
|
||||
ctx = Context.{
|
||||
fb: @eca(^Color, 3, 6, "p\0", 2),
|
||||
fb: dt_get("framebuffer/fb0/ptr\0"),
|
||||
bb: back_buffer,
|
||||
buf: back_buffer,
|
||||
width,
|
||||
|
@ -186,8 +184,8 @@ put_line_low := fn(p0: IVec2, p1: IVec2, color: Color): void {
|
|||
dy := p1.y - p0.y
|
||||
yi := 1
|
||||
if dy < 0 {
|
||||
yi = 0 - 1
|
||||
dy = 0 - dy
|
||||
yi = -1
|
||||
dy = -dy
|
||||
}
|
||||
D := 2 * dy - dx
|
||||
y := p0.y
|
||||
|
@ -210,8 +208,8 @@ put_line_high := fn(p0: IVec2, p1: IVec2, color: Color): void {
|
|||
dy := p1.y - p0.y
|
||||
xi := 1
|
||||
if dy < 0 {
|
||||
xi = 0 - 1
|
||||
dx = 0 - dx
|
||||
xi = -1
|
||||
dx = -dx
|
||||
}
|
||||
D := 2 * dx - dy
|
||||
x := p0.x
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
.{pci, memory, string, log} := @use("../../stn/src/lib.hb");
|
||||
.{IVec2} := @use("rel:lib.hb")
|
||||
// .{pci, memory, string, log} := @use("../../stn/src/lib.hb");
|
||||
|
||||
Color := struct {b: u8, g: u8, r: u8, a: u8}
|
||||
white := Color.(255, 255, 255, 255)
|
||||
|
@ -76,16 +76,5 @@ sync := fn(): void {
|
|||
}
|
||||
|
||||
init := fn(): void {
|
||||
b := memory.request_page(1)
|
||||
bus := 0
|
||||
device := 0
|
||||
loop if bus == 256 break else {
|
||||
loop if device == 32 break else {
|
||||
a := pci.config_read(0, 0, 0, 0)
|
||||
log.info(string.display_int(a, b))
|
||||
device += 1
|
||||
}
|
||||
bus += 1
|
||||
}
|
||||
return
|
||||
}
|
1
sysdata/programs/dt_buffer_test/README.md
Normal file
1
sysdata/programs/dt_buffer_test/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# dt_buffer_test
|
11
sysdata/programs/dt_buffer_test/meta.toml
Normal file
11
sysdata/programs/dt_buffer_test/meta.toml
Normal file
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "dt_buffer_test"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
|
||||
[dependants.binaries]
|
||||
hblang.version = "1.0.0"
|
||||
|
||||
[build]
|
||||
command = "hblang src/main.hb"
|
14
sysdata/programs/dt_buffer_test/src/main.hb
Normal file
14
sysdata/programs/dt_buffer_test/src/main.hb
Normal file
|
@ -0,0 +1,14 @@
|
|||
dt_api := @use("../../../libraries/dt_api/src/lib.hb");
|
||||
.{dt_get} := dt_api
|
||||
|
||||
main := fn(): int {
|
||||
dt_api.dt_get("framebuffer/fb0/width\0")
|
||||
dt_api.dt_get("cpu/cpu0/architecture\0")
|
||||
|
||||
// Checking if the first detected serial port is memory mapped or port mapped
|
||||
// 0 -> memory mapped
|
||||
// 1 -> port mapped
|
||||
dt_get("serial_ports/sp0/mapping\0")
|
||||
|
||||
return 0
|
||||
}
|
3
sysdata/programs/horizon/README.md
Normal file
3
sysdata/programs/horizon/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Horizon
|
||||
The Horizon Windowing system server. This is the component that spawns/layouts and renders windows.
|
||||
For the api look in libraries/horizon_api.
|
11
sysdata/programs/horizon/meta.toml
Normal file
11
sysdata/programs/horizon/meta.toml
Normal file
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "horizon"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
|
||||
[dependants.binaries]
|
||||
hblang.version = "1.0.0"
|
||||
|
||||
[build]
|
||||
command = "hblang src/main.hb"
|
6
sysdata/programs/horizon/protocol/lib.idl
Normal file
6
sysdata/programs/horizon/protocol/lib.idl
Normal file
|
@ -0,0 +1,6 @@
|
|||
alias HostID = u64;
|
||||
|
||||
struct WindowID {
|
||||
host_id: HostID,
|
||||
window_id: u64
|
||||
}
|
12
sysdata/programs/horizon/src/main.hb
Normal file
12
sysdata/programs/horizon/src/main.hb
Normal file
|
@ -0,0 +1,12 @@
|
|||
stn := @use("../../../libraries/stn/src/lib.hb");
|
||||
.{string, memory, buffer} := stn
|
||||
|
||||
horizon_api := @use("../../../libraries/horizon_api/src/lib.hb")
|
||||
|
||||
main := fn(): int {
|
||||
a := buffer.create("XHorizon\0")
|
||||
loop {
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
1
sysdata/programs/horizon_testing_program/README.md
Normal file
1
sysdata/programs/horizon_testing_program/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# horizon_testing_program
|
11
sysdata/programs/horizon_testing_program/meta.toml
Normal file
11
sysdata/programs/horizon_testing_program/meta.toml
Normal file
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "horizon_testing_program"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
|
||||
[dependants.binaries]
|
||||
hblang.version = "1.0.0"
|
||||
|
||||
[build]
|
||||
command = "hblang src/main.hb"
|
35
sysdata/programs/horizon_testing_program/src/main.hb
Normal file
35
sysdata/programs/horizon_testing_program/src/main.hb
Normal file
|
@ -0,0 +1,35 @@
|
|||
stn := @use("../../../libraries/stn/src/lib.hb");
|
||||
.{string, memory, buffer, log} := stn
|
||||
|
||||
horizon_api := @use("../../../libraries/horizon_api/src/lib.hb");
|
||||
.{create_window} := horizon_api
|
||||
|
||||
ignim := @use("../../../libraries/ignim/src/lib.hb");
|
||||
.{errors} := ignim
|
||||
|
||||
main := fn(): int {
|
||||
windowing_system_buffer := buffer.create("XHorizon\0")
|
||||
|
||||
// TODO: get WindowID
|
||||
create_window(windowing_system_buffer)
|
||||
|
||||
program_name := "Horizon Testing Program\0"
|
||||
program_version := ignim.version.make_version(0, 1, 0)
|
||||
engine_name := "None\0"
|
||||
engine_version := ignim.version.make_version(0, 0, 0)
|
||||
api_version := ignim.version.make_api_version(0, 1, 0, 0)
|
||||
|
||||
app_info := ignim.application.new_application_info(program_name, program_version, engine_name, engine_version, api_version)
|
||||
|
||||
create_info := ignim.instance.new_create_info(&app_info)
|
||||
|
||||
instance := ignim.instance.void_instance()
|
||||
|
||||
// TODO: recursively follow this https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Instance
|
||||
ret := ignim.instance.create_instance(&create_info, 0, &instance)
|
||||
if ret == errors.IncompatibleDriver {
|
||||
log.error("Driver Incompatible with Vulkan\0")
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
|
@ -13,7 +13,7 @@ example := fn(): void {
|
|||
render.clear(color)
|
||||
render.sync()
|
||||
if (color.b & 255) == 255 | (color.b & 255) == 0 {
|
||||
n = 0 - n
|
||||
n = -n
|
||||
}
|
||||
color.b += n
|
||||
}
|
||||
|
|
|
@ -15,10 +15,10 @@ example := fn(): void {
|
|||
render.clear(render.black)
|
||||
|
||||
if pos.x == 0 | pos.x == width - 100 {
|
||||
vel.x = 0 - vel.x
|
||||
vel.x = -vel.x
|
||||
}
|
||||
if pos.y == 0 | pos.y == height - 100 {
|
||||
vel.y = 0 - vel.y
|
||||
vel.y = -vel.y
|
||||
}
|
||||
|
||||
pos += vel
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.{example} := @use("./examples/amogus.hb")
|
||||
.{example} := @use("./examples/colors.hb")
|
||||
|
||||
main := fn(): void {
|
||||
@inline(example)
|
||||
|
|
1
sysdata/programs/svga_driver/README.md
Normal file
1
sysdata/programs/svga_driver/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# svga_driver
|
11
sysdata/programs/svga_driver/meta.toml
Normal file
11
sysdata/programs/svga_driver/meta.toml
Normal file
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "svga_driver"
|
||||
authors = ["able"]
|
||||
|
||||
[dependants.libraries]
|
||||
|
||||
[dependants.binaries]
|
||||
hblang.version = "1.0.0"
|
||||
|
||||
[build]
|
||||
command = "hblang src/main.hb"
|
41
sysdata/programs/svga_driver/src/device.hb
Normal file
41
sysdata/programs/svga_driver/src/device.hb
Normal file
|
@ -0,0 +1,41 @@
|
|||
pci := @use("../../../libraries/pci/src/lib.hb");
|
||||
.{PCIAddress} := pci
|
||||
|
||||
SVGADevice := struct {
|
||||
pciAddr: PCIAddress,
|
||||
ioBase: u32,
|
||||
fifoMem: ^u32,
|
||||
fbMem: ^u8,
|
||||
fifoSize: int,
|
||||
fbSize: int,
|
||||
vramSize: int,
|
||||
deviceVersionId: int,
|
||||
capabilities: int,
|
||||
width: int,
|
||||
height: int,
|
||||
bpp: int,
|
||||
pitch: int,
|
||||
}
|
||||
|
||||
svga_device := fn(): SVGADevice {
|
||||
pci_addr := PCIAddress.(0, 0, 0)
|
||||
|
||||
return SVGADevice.(pci_addr, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||
}
|
||||
|
||||
/*
|
||||
struct {
|
||||
uint32 reservedSize;
|
||||
Bool usingBounceBuffer;
|
||||
uint8 bounceBuffer[1024 * 1024];
|
||||
uint32 nextFence;
|
||||
} fifo;
|
||||
|
||||
volatile struct {
|
||||
uint32 pending;
|
||||
uint32 switchContext;
|
||||
IntrContext oldContext;
|
||||
IntrContext newContext;
|
||||
uint32 count;
|
||||
} irq;
|
||||
*/
|
33
sysdata/programs/svga_driver/src/main.hb
Normal file
33
sysdata/programs/svga_driver/src/main.hb
Normal file
|
@ -0,0 +1,33 @@
|
|||
device := @use("rel:device.hb")
|
||||
pci := @use("../../../libraries/pci/src/lib.hb")
|
||||
|
||||
stn := @use("../../../libraries/stn/src/lib.hb");
|
||||
.{string, memory, buffer, log} := stn
|
||||
|
||||
reg := @use("rel:reg.hb")
|
||||
|
||||
PCI_VENDOR_ID_VMWARE := 0x15AD
|
||||
PCI_DEVICE_ID_VMWARE_SVGA2 := 0x405
|
||||
|
||||
init := fn(): void {
|
||||
svga_struct := device.svga_device()
|
||||
|
||||
if pci.find_device(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_SVGA2, svga_struct.pciAddr) {
|
||||
log.error("No VMware SVGA device found.\0")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
write_reg := fn(index: u32, value: u32): void {
|
||||
}
|
||||
|
||||
SVGA_disable := fn(): void {
|
||||
write_reg(reg.SVGA_REG_ENABLE, 0)
|
||||
return
|
||||
}
|
||||
|
||||
main := fn(): int {
|
||||
init()
|
||||
|
||||
return 0
|
||||
}
|
4
sysdata/programs/svga_driver/src/reg.hb
Normal file
4
sysdata/programs/svga_driver/src/reg.hb
Normal file
|
@ -0,0 +1,4 @@
|
|||
SVGA_REG_ENABLE_DISABLE := 0
|
||||
SVGA_REG_ENABLE_ENABLE := 1
|
||||
SVGA_REG_ENABLE_HIDE := 2
|
||||
SVGA_REG_ENABLE_ENABLE_HIDE := SVGA_REG_ENABLE_ENABLE | SVGA_REG_ENABLE_HIDE
|
|
@ -17,17 +17,29 @@ resolution = "1024x768x24"
|
|||
|
||||
[boot.limine.ableos.modules]
|
||||
|
||||
[boot.limine.ableos.modules.tests]
|
||||
path = "boot:///tests.hbf"
|
||||
# [boot.limine.ableos.modules.tests]
|
||||
# path = "boot:///tests.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.0serial_driver]
|
||||
path = "boot:///serial_driver.hbf"
|
||||
# [boot.limine.ableos.modules.0serial_driver]
|
||||
# path = "boot:///serial_driver.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.diskio_driver]
|
||||
path = "boot:///diskio_driver.hbf"
|
||||
# [boot.limine.ableos.modules.diskio_driver]
|
||||
# path = "boot:///diskio_driver.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.render_example]
|
||||
path = "boot:///render_example.hbf"
|
||||
# [boot.limine.ableos.modules.render_example]
|
||||
# path = "boot:///render_example.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.serial_driver_test]
|
||||
path = "boot:///serial_driver_test.hbf"
|
||||
# [boot.limine.ableos.modules.serial_driver_test]
|
||||
# path = "boot:///serial_driver_test.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.horizon]
|
||||
# path = "boot:///horizon.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.horizon_testing_program]
|
||||
# path = "boot:///horizon_testing_program.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.dt_buffer_test]
|
||||
# path = "boot:///dt_buffer_test.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.svga_driver]
|
||||
path = "boot:///svga_driver.hbf"
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
/// a b c
|
||||
void main(){}
|
||||
|
||||
// Generated documentation below
|
|
@ -1,2 +0,0 @@
|
|||
(label "Documentation")
|
||||
(label "")
|
27
sysdata/ui_lisp/sample.uil
Normal file
27
sysdata/ui_lisp/sample.uil
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
the following snippet lays out the following.
|
||||
10 11
|
||||
*/
|
||||
(vertical
|
||||
(label "10")
|
||||
(label "11"))
|
||||
|
||||
|
||||
/*
|
||||
Each button must have an ID. This ID must be unique per button or the buttons with the same
|
||||
ID will be treated as the same button.
|
||||
*/
|
||||
(button id:8)
|
||||
|
||||
|
||||
/*
|
||||
This unique ID rull applies to any interactable element.
|
||||
*/
|
||||
(label interactive:true id:9)
|
||||
|
||||
|
||||
/*
|
||||
The ID is used to send a message to the buffer of the process that handles UI.
|
||||
The following code will handle displaying text locally and also sending the delta change to the buffer.
|
||||
*/
|
||||
(line-edit id:10)
|
|
@ -1,7 +0,0 @@
|
|||
(vertical
|
||||
(horizontal
|
||||
(label "Function main")
|
||||
(button "goto declaration" (on_click "src/main.c:2")))
|
||||
(label "takes void")
|
||||
(label "returns void")
|
||||
(label "a b c"))
|
|
@ -1,5 +0,0 @@
|
|||
- container
|
||||
- horizontal
|
||||
- vertical
|
||||
- framebuffer
|
||||
-
|
Loading…
Reference in a new issue