mini-shell for 3 cmd. we have to implemente it now

This commit is contained in:
wescande 2018-02-15 19:38:27 +01:00
parent e72afcd086
commit 0e7b73e2fa
4 changed files with 82 additions and 25 deletions

View file

@ -4,13 +4,13 @@ extern kmain
section .text
bits 32
x86_start:
; we should clear register but it does not work
; mov ax, 0
; mov ss, ax
; mov ds, ax
; mov es, ax
; mov fs, ax
; mov gs, ax
; we should clear register but it does not work, it's okay with 0x10 instead of 0
mov ax, 0x10
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; PRINT OK
; mov dword [0xb8000], 0x2f4b2f4f

View file

@ -91,24 +91,18 @@ pub fn kbd_callback() {
Some(b"\0\0") => {
match scancode {
0x2A | 0x36 => {SHIFT = !is_release},
0x38 => {ALT = !is_release; println!("atl")},
0x1D => {CTRL = !is_release; println!("ctrl")},
0x38 => {ALT = !is_release},
0x1D => {CTRL = !is_release},
0x0F if !is_release => {
CONTEXT.switch_term();
CONTEXT.current_term().flush();
},
0x0E if !is_release => {
CONTEXT.current_term().backspace();
}
_ => {}
}
},
// Some(b"2@") if ALT => {
// CONTEXT.switch_term();
// CONTEXT.current_term().flush();
// },
// Some(b"1!") if CTRL && !is_release => {
// CONTEXT.switch_term();
// CONTEXT.current_term().keypress('>' as u8);
// CONTEXT.current_term().flush();
// },
Some(ascii) if !is_release => {
let mut terminal = CONTEXT.current_term();
if SHIFT {

View file

@ -25,7 +25,6 @@ mod cpuio;
///
/// If reboot failed, will loop on a halt cmd
///
#[allow(dead_code)]
fn reboot() {
//TODO disable interrupt here something like : asm volatile ("cli");
@ -47,13 +46,19 @@ fn reboot() {
///
/// If shutdown failed, will loop on a halt cmd
///
#[allow(dead_code)]
fn shutdown() -> ! {
cpuio::outb(0xf4, 0x00);//TODO doesn't work :(
println!("Reicv shutdown command. System cannot shutdown properly yet, he is now halt\n");
cpuio::halt();
}
/// Print the kernel stack
///
fn print_kernel_stack() {
println!("It's a stack print");
}
#[no_mangle]
pub extern fn kmain() -> ! {
unsafe { CONTEXT.current_term().color_code = ColorCode::new(Color::White, Color::Cyan); }
@ -73,7 +78,8 @@ pub extern fn kmain() -> ! {
format_args!("{: ^80}", r#" ' ,/ ; | .' "#),
format_args!("{: ^80}", r#" '--' `---' "#));
unsafe { CONTEXT.current_term().color_code = ColorCode::new(Color::White, Color::Black); }
print!(">");
unsafe { CONTEXT.vga1.prompt();CONTEXT.vga1.flush(); }
unsafe { CONTEXT.vga2.prompt(); }
loop {
keyboard::kbd_callback();

View file

@ -44,32 +44,75 @@ pub struct Writer {
pub buffer_pos: usize,
pub color_code: ColorCode,
buffer: [u8; BUFFER_ROWS * BUFFER_COLS],
command: [u8; 10],
command: [char; 10],
command_len: usize,
}
// enum shell_command {
// "reboot" => super::reboot();
// }
const NULL: [char; 10] = ['\0'; 10];
const REBOOT: [char; 10] = ['r', 'e', 'b', 'o', 'o', 't', '\0', '\0', '\0', '\0'];
const HALT: [char; 10] = ['h', 'a', 'l', 't', '\0', '\0', '\0', '\0', '\0', '\0'];
const SHUTDOWN: [char; 10] = ['s', 'h', 'u', 't', 'd', 'o', 'w', 'n', '\0', '\0'];
const STACK: [char; 10] = ['s', 't', 'a', 'c', 'k', '\0', '\0', '\0', '\0', '\0'];
impl Writer {
pub const fn new() -> Writer {
Writer {
buffer_pos: 0,
color_code: ColorCode::new(Color::White, Color::Black),
buffer: [0; BUFFER_ROWS * BUFFER_COLS],
command: [0; 10],
command: NULL,
command_len: 0,
}
}
pub fn prompt(&mut self) {
let color_code_save = self.color_code;
self.color_code = ColorCode::new(Color::Blue, Color::Black);
self.write_str("> ");
self.color_code = color_code_save;
}
pub fn backspace(&mut self) {
if self.command_len > 0 {
self.command_len -= 1;
self.command[self.command_len] = '\0';
self.erase_byte();
}
}
pub fn keypress(&mut self, ascii: u8) {
match ascii {
b'\n' => {
self.command_len = 0;
self.write_byte(b'\n');
println!("{:?}", self.command.iter());
self.write_byte(b'>');
// println!("{:?}", self.command.iter());
match self.command {
SHUTDOWN | HALT => {
super::super::shutdown();
}
REBOOT => {
super::super::reboot();
}
STACK => {
super::super::print_kernel_stack();
}
_ => {
let color_code_save = self.color_code;
self.color_code = ColorCode::new(Color::Red, Color::Black);
println!("Command unknown !");
self.color_code = color_code_save;
}
}
self.command = NULL;
self.prompt();
}
byte => {
if self.command_len >= 10 { return };
self.command[self.command_len] = byte as char;
self.write_byte(byte);
self.command_len += 1;
}
@ -77,6 +120,14 @@ impl Writer {
self.flush();
}
pub fn erase_byte(&mut self) {
self.buffer_pos -= 2;
let i = self.buffer_pos;
self.buffer[i] = b' ';
self.buffer[i + 1] = 0;
self.flush();
}
pub fn write_byte(&mut self, byte: u8) {
let i = self.buffer_pos;
@ -98,6 +149,12 @@ impl Writer {
}
}
fn write_str(&mut self, s: &str) {
for byte in s.bytes() {
self.write_byte(byte)
}
}
fn flush_cursor(&self)
{
let cursor_position = self.buffer_pos / 2;