diff --git a/ableos/Cargo.lock b/ableos/Cargo.lock index de00b7be..ab715c3b 100644 --- a/ableos/Cargo.lock +++ b/ableos/Cargo.lock @@ -2,10 +2,31 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ab_glyph" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61caed9aec6daeee1ea38ccf5fb225e4f96c1eeead1b4a5c267324a63cf02326" +dependencies = [ + "ab_glyph_rasterizer", + "libm", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" +dependencies = [ + "libm", +] + [[package]] name = "ableos" version = "0.1.0" dependencies = [ + "ab_glyph", "bootloader", "cpuio", "externc-libm", @@ -13,6 +34,7 @@ dependencies = [ "linked_list_allocator", "lliw", "pic8259", + "pretty-hex", "qoi_rs", "spin", "uart_16550", @@ -161,6 +183,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "owned_ttf_parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef05f2882a8b3e7acc10c153ade2631f7bfc8ce00d2bf3fb8f4e9d2ae6ea5c3" +dependencies = [ + "ttf-parser", +] + [[package]] name = "parity-wasm" version = "0.42.2" @@ -176,6 +207,12 @@ dependencies = [ "x86_64", ] +[[package]] +name = "pretty-hex" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5c99d529f0d30937f6f4b8a86d988047327bb88d04d2c4afc356de74722131" + [[package]] name = "qoi_rs" version = "0.1.1" @@ -203,6 +240,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "ttf-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccbe8381883510b6a2d8f1e32905bddd178c11caef8083086d0c0c9ab0ac281" + [[package]] name = "uart_16550" version = "0.2.15" diff --git a/ableos/Cargo.toml b/ableos/Cargo.toml index 18dcda3b..b1f2ff56 100644 --- a/ableos/Cargo.toml +++ b/ableos/Cargo.toml @@ -31,8 +31,15 @@ lliw = "0.2.0" qoi_rs = "*" spin = "0.5.2" vga = "*" +pretty-hex = "0.2.1" + + +[dependencies.ab_glyph] +default-features = false +features = ["libm"] + [dependencies.wasmi] default-features = false features = ["core"] diff --git a/ableos/assets/fonts/LICENSE.txt b/ableos/assets/fonts/LICENSE.txt new file mode 100644 index 00000000..75b52484 --- /dev/null +++ b/ableos/assets/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ableos/assets/fonts/Roboto-Black.ttf b/ableos/assets/fonts/Roboto-Black.ttf new file mode 100644 index 00000000..43a00e0d Binary files /dev/null and b/ableos/assets/fonts/Roboto-Black.ttf differ diff --git a/ableos/assets/fonts/Roboto-BlackItalic.ttf b/ableos/assets/fonts/Roboto-BlackItalic.ttf new file mode 100644 index 00000000..5082cdc4 Binary files /dev/null and b/ableos/assets/fonts/Roboto-BlackItalic.ttf differ diff --git a/ableos/assets/fonts/Roboto-Bold.ttf b/ableos/assets/fonts/Roboto-Bold.ttf new file mode 100644 index 00000000..37424579 Binary files /dev/null and b/ableos/assets/fonts/Roboto-Bold.ttf differ diff --git a/ableos/assets/fonts/Roboto-BoldItalic.ttf b/ableos/assets/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 00000000..e85e7fb9 Binary files /dev/null and b/ableos/assets/fonts/Roboto-BoldItalic.ttf differ diff --git a/ableos/assets/fonts/Roboto-Italic.ttf b/ableos/assets/fonts/Roboto-Italic.ttf new file mode 100644 index 00000000..c9df607a Binary files /dev/null and b/ableos/assets/fonts/Roboto-Italic.ttf differ diff --git a/ableos/assets/fonts/Roboto-Light.ttf b/ableos/assets/fonts/Roboto-Light.ttf new file mode 100644 index 00000000..0e977514 Binary files /dev/null and b/ableos/assets/fonts/Roboto-Light.ttf differ diff --git a/ableos/assets/fonts/Roboto-LightItalic.ttf b/ableos/assets/fonts/Roboto-LightItalic.ttf new file mode 100644 index 00000000..3ad14fa7 Binary files /dev/null and b/ableos/assets/fonts/Roboto-LightItalic.ttf differ diff --git a/ableos/assets/fonts/Roboto-Medium.ttf b/ableos/assets/fonts/Roboto-Medium.ttf new file mode 100644 index 00000000..e89b0b79 Binary files /dev/null and b/ableos/assets/fonts/Roboto-Medium.ttf differ diff --git a/ableos/assets/fonts/Roboto-MediumItalic.ttf b/ableos/assets/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 00000000..a5a41d3d Binary files /dev/null and b/ableos/assets/fonts/Roboto-MediumItalic.ttf differ diff --git a/ableos/assets/fonts/Roboto-Regular.ttf b/ableos/assets/fonts/Roboto-Regular.ttf new file mode 100644 index 00000000..3d6861b4 Binary files /dev/null and b/ableos/assets/fonts/Roboto-Regular.ttf differ diff --git a/ableos/assets/fonts/Roboto-Thin.ttf b/ableos/assets/fonts/Roboto-Thin.ttf new file mode 100644 index 00000000..7d084aed Binary files /dev/null and b/ableos/assets/fonts/Roboto-Thin.ttf differ diff --git a/ableos/assets/fonts/Roboto-ThinItalic.ttf b/ableos/assets/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 00000000..c1733896 Binary files /dev/null and b/ableos/assets/fonts/Roboto-ThinItalic.ttf differ diff --git a/ableos/src/arch/x86_64/drivers/vga.rs b/ableos/src/arch/x86_64/drivers/vga.rs index c42817fa..ee5a1b23 100644 --- a/ableos/src/arch/x86_64/drivers/vga.rs +++ b/ableos/src/arch/x86_64/drivers/vga.rs @@ -94,7 +94,18 @@ impl Writer { } pub fn backspace(&mut self) { - self.column_position -= 1; + let col_pos = self.column_position; + if col_pos == 0 { + } else { + self.column_position -= 1; + + let blank = ScreenChar { + ascii_character: b' ', + color_code: self.color_code, + }; + + self.buffer.chars[BUFFER_HEIGHT - 1][col_pos - 1].write(blank); + } } } impl fmt::Write for Writer { @@ -114,6 +125,7 @@ lazy_static! { use core::fmt; use lazy_static::lazy_static; use spin::Mutex; +use vga::writers::Screen; use volatile::Volatile; #[macro_export] diff --git a/ableos/src/arch/x86_64/interrupts.rs b/ableos/src/arch/x86_64/interrupts.rs index 4892250a..7f3775c0 100644 --- a/ableos/src/arch/x86_64/interrupts.rs +++ b/ableos/src/arch/x86_64/interrupts.rs @@ -1,5 +1,6 @@ use crate::{ arch::{drivers::vga::WRITER, gdt}, + kernel_state::KERNEL_STATE, kmain::KEY_BUFFER, print, println, relib::clparse, @@ -91,14 +92,19 @@ extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStac // Backspace 8 => { WRITER.lock().backspace(); - print!(" "); - WRITER.lock().backspace(); + // print!(" "); + // WRITER.lock().backspace(); } + 0x12 => { + KERNEL_STATE.lock().shutdown(); + } + // Enter - 10 => { + 0x0A => { let xyz = crate::kmain::KEY_BUFFER.lock(); // println!("{:?}", clparse::Command::parse(xyz.to_string())); + print!("{}", char::try_from(character).unwrap()); } _ => { print!("{}", char::try_from(character).unwrap()); diff --git a/ableos/src/kmain.rs b/ableos/src/kmain.rs index 6daba8aa..aa4afe09 100644 --- a/ableos/src/kmain.rs +++ b/ableos/src/kmain.rs @@ -1,16 +1,26 @@ #![allow(clippy::empty_loop)] +use alloc::format; + +use crate::relib::network::socket::Socket; + use { crate::{ arch::{drivers::graphics::GraphicsBuffer, init, sloop}, driver_traits::graphics::Graphics, - experiments::systeminfo::{KERNEL_VERSION, RELEASE_TYPE}, + experiments::{ + info::master, + systeminfo::{KERNEL_VERSION, RELEASE_TYPE}, + }, + log::LOG_STATE, relib::math::rand::RAND_HANDLE, scheduler::{test_fn, Thread, ThreadList}, + vga_e, + }, + alloc::{ + string::{String, ToString}, + vec, }, - crate::{experiments::info::master, log::LOG_STATE, vga_e}, - alloc::string::{String, ToString}, - alloc::vec, lazy_static::lazy_static, }; @@ -61,9 +71,35 @@ pub fn kernel_main() -> ! { println!("$RED$hi$RESET$"); } } + { + use crate::relib::network::socket::SimpleSock; + use crate::utils::type_of; + let mut xyz = SimpleSock::new(); + xyz.write(vec![0, 0, 1, 0]); + xyz.close(); - // vga_e::test_it_fucko(); - // KERNEL_STATE.lock().shutdown(); + println!("type of socket: {:?}", type_of(&xyz)); + println!("contents: {:?}", &xyz.read()); + + println!("length: {:?}", xyz.read().len()); + drop(xyz); + } + + { + use pretty_hex::*; + + let v = vec![222, 173, 190, 239, 202, 254, 32, 24]; + assert_eq!(simple_hex(&v), format!("{}", v.hex_dump())); + + println!("{}", v.hex_dump()); + } + + // + + info!("新着情報"); + + print!("$GREEN$able$RESET$@$LIGHTBLUE$stAble$ $RED$->$RESET$"); + vga_e::draw_q(); // stack_overflow(); sloop() diff --git a/ableos/src/lib.rs b/ableos/src/lib.rs index de34d09b..d52e3194 100644 --- a/ableos/src/lib.rs +++ b/ableos/src/lib.rs @@ -40,6 +40,8 @@ pub mod relib; pub mod scheduler; pub mod wasm; +pub mod utils; + pub extern crate alloc; pub extern crate externc_libm as libm; diff --git a/ableos/src/relib/mod.rs b/ableos/src/relib/mod.rs index 02edbf59..49aebe33 100644 --- a/ableos/src/relib/mod.rs +++ b/ableos/src/relib/mod.rs @@ -1,8 +1,8 @@ pub mod clparse; pub mod image; pub mod math; +pub mod network; pub mod time; - pub struct VectorTwo { pub x: i32, pub y: i32, diff --git a/ableos/src/relib/network/mod.rs b/ableos/src/relib/network/mod.rs index e69de29b..d22cc845 100644 --- a/ableos/src/relib/network/mod.rs +++ b/ableos/src/relib/network/mod.rs @@ -0,0 +1 @@ +pub mod socket; diff --git a/ableos/src/relib/network/socket.rs b/ableos/src/relib/network/socket.rs new file mode 100644 index 00000000..dd61b47b --- /dev/null +++ b/ableos/src/relib/network/socket.rs @@ -0,0 +1,38 @@ +use alloc::vec; +use alloc::vec::Vec; + +pub type Stream = Vec; + +pub trait Socket { + fn new() {} + fn read(&mut self) -> Vec; + fn write(&mut self, stream: Stream); + fn close(&mut self) {} +} + +pub struct SimpleSock { + stream: Vec, +} + +impl SimpleSock { + pub fn new() -> Self { + Self { stream: vec![] } + } +} + +impl Socket for SimpleSock { + fn new() {} + fn read(&mut self) -> Vec { + let mut return_vec = vec![]; + for x in &self.stream { + return_vec.push(x.clone()); + } + return_vec + } + fn write(&mut self, stream: Stream) { + for byte in stream { + self.stream.push(byte); + } + } + fn close(&mut self) {} +} diff --git a/ableos/src/utils.rs b/ableos/src/utils.rs new file mode 100644 index 00000000..615fd90f --- /dev/null +++ b/ableos/src/utils.rs @@ -0,0 +1,8 @@ +//! Small generic utilities +//! +//! +//! + +pub fn type_of(_: &T) -> &str { + core::any::type_name::() +} diff --git a/ableos/src/vga_e.rs b/ableos/src/vga_e.rs index 278a4908..e0df08fe 100644 --- a/ableos/src/vga_e.rs +++ b/ableos/src/vga_e.rs @@ -27,6 +27,7 @@ pub fn test_it_fucko() { mode.draw_line((80, 420), (540, 420), Color16::White); mode.draw_line((540, 420), (540, 60), Color16::White); mode.draw_line((80, 90), (540, 90), Color16::White); + for (offset, character) in "ableOS".chars().enumerate() { mode.draw_character(270 + offset * 8, 72, character, Color16::White) } @@ -45,3 +46,27 @@ pub struct Buffer { resolution: (u64, u64), // pointer } +pub fn draw_q() { + let mode = Graphics640x480x16::new(); + mode.set_mode(); + mode.clear_screen(Color16::Black); + + use ab_glyph::{point, Font, FontRef, Glyph}; + + let font = + FontRef::try_from_slice(include_bytes!("../../ableos/assets/fonts/Roboto-Black.ttf")) + .unwrap(); + + // Get a glyph for 'q' with a scale & position. + let q_glyph: Glyph = font + .glyph_id('q') + .with_scale_and_position(24.0, point(100.0, 0.0)); + + // Draw it. + + if let Some(q) = font.outline_glyph(q_glyph) { + q.draw(|x, y, _c| { + mode.set_pixel(x as usize, y as usize, Color16::LightBlue); + }); + } +} diff --git a/aos_wasm_stress_test/src/main.rs b/aos_wasm_stress_test/src/main.rs index 115efee9..1ba8b8f0 100644 --- a/aos_wasm_stress_test/src/main.rs +++ b/aos_wasm_stress_test/src/main.rs @@ -1,13 +1,13 @@ #![no_std] #![no_main] -use core::panic::PanicInfo; - pub struct Command {} fn _start(_command: Command) {} - +/* +use core::panic::PanicInfo; #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop {} } +*/ diff --git a/facepalm/Cargo.lock b/facepalm/Cargo.lock new file mode 100644 index 00000000..b3c338d0 --- /dev/null +++ b/facepalm/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "facepalm" +version = "0.1.0"