diff --git a/Cargo.toml b/Cargo.toml index b2b7429..3b7f648 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,10 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[profile.release] +debug = true + [dependencies] minifb = "0.19.3" image = "0.23.14" \ No newline at end of file diff --git a/kernel.asm b/kernel.asm index 329786c..41412c8 100644 --- a/kernel.asm +++ b/kernel.asm @@ -50,7 +50,8 @@ data image boo_os_small.png booos-small.png data image wallpaper.png wallpaper.png data ascii quit_label QUIT -data ascii diss_label JUMP +data ascii jump_label JUMP +data ascii diss_label DISS data buffer command_line_input 64 @@ -91,6 +92,11 @@ label strcmp: label shift_terminal: + + ; copy terminal 0 to terminal 1 + loadi $4 terminal[2] ;src + bcopy $4 terminal[3] ; dest + ; copy terminal 0 to terminal 1 loadi $4 terminal[1] ;src bcopy $4 terminal[2] ; dest @@ -107,9 +113,66 @@ label shift_terminal: ret +data ascii diss_load LOAD +data ascii diss_call CALL +data ascii diss_unknown UNKNOWN + +label _disassemble_cmd: + loadi $1 $20 + bappend $1 command_line_input ; space + + loadi $1 1c ; 28 bits + shift $4 $1 $2 ; + loadi $5 diss_unknown + + loadi $1 $3 + jneq +2 + loadi $5 diss_load + + loadi $1 $C + jneq +2 + loadi $5 diss_call + + label _disassemble_cmd_inner: + rload $5 $1 + loadi $2 0 + jneq +2 + ret + bappend $1 command_line_input + inc $5 + jmp _disassemble_cmd_inner label disassemble: + call string_to_num + ; $1 contains a actual address we want to diss + loadi $2 $FFFFFF; + jlt +2 + ret + rload $1 $8 ; + call shift_terminal + bzero command_line_input + loadi $6 7 + label _disassemble_inner: + tx $4 $8 ; temp store for command + loadi $5 4 ; number of bits to shift + mul $6 $5 $5 ; number of bits to shift command >> (count * 8) (3*8, 2*8, 1*8, 0*8) + shift $4 $5 $1 ; do the actual shift + loadi $5 $00000F + and $1 $5 $4 + ; clobbers 1 2 3 4 + call num_to_char; + bappend $4 command_line_input + tx $1 $6 + loadi $2 0 + jneq +4 + tx $4 $8 + call _disassemble_cmd + ret + dec $6 + jmp _disassemble_inner + +label jump: call string_to_num ijmp $1 ;;lol ret @@ -128,11 +191,23 @@ label do_shell: loadi $6 4 call strcmp loadi $2 1 - jneq +5 ; if the command is QUIT, then hlt the machine!! A shell is born + jneq +6 ; if the command is QUIT, then hlt the machine!! A shell is born loadi $4 @command_line_input loadi $5 5 add $4 $5 $4 call disassemble + ret + + loadi $4 @command_line_input + loadi $5 jump_label + loadi $6 4 + call strcmp + loadi $2 1 + jneq +5 ; if the command is QUIT, then hlt the machine!! A shell is born + loadi $4 @command_line_input + loadi $5 5 + add $4 $5 $4 + call jump ret @@ -204,6 +279,20 @@ label handle_keypress: tx $4 $2 call handle_keypress + + ; print some shell history + loadi $9 5; + loadi $A 180; + call set_pos + loadi $4 @terminal[3] + call draw_string; + + loadi $9 5; + loadi $A 190; + call set_pos + loadi $4 @terminal[2] + call draw_string; + loadi $9 5; loadi $A 1A0; call set_pos diff --git a/src/lib.rs b/src/lib.rs index d621721..788f625 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ pub const VRAM: usize = 640 * 480; pub const REGISTER_PAGE: usize = VRAM; pub const INPUT_PAGE: usize = VRAM + 64; pub const OFFSET: usize = INPUT_PAGE; -pub const MEM_SIZE: usize = 0x0FFFFF - OFFSET; +pub const MEM_SIZE: usize = 0xFFFFFF - OFFSET; pub const MEMORY: usize = OFFSET + MEM_SIZE; pub struct Machine { @@ -20,6 +20,33 @@ impl Machine { Machine { memory } } + pub fn hlt(&self, ip: usize, instruction: u32) { + println!("---"); + println!("{:x} {:x}", ip, instruction); + println!( + "REG 1:{:X} 2:{:X} 3:{:X} 4:{:X}", + self.memory[REGISTER_PAGE + 1], + self.memory[REGISTER_PAGE + 2], + self.memory[REGISTER_PAGE + 3], + self.memory[REGISTER_PAGE + 4] + ); + println!( + "REG 5:{:X} 6:{:X} 7:{:X} 8:{:X}", + self.memory[REGISTER_PAGE + 5], + self.memory[REGISTER_PAGE + 6], + self.memory[REGISTER_PAGE + 7], + self.memory[REGISTER_PAGE + 8], + ); + println!( + "REG 9:{:X} A:{:X} B:{:X} C:{:X}", + self.memory[REGISTER_PAGE + 9], + self.memory[REGISTER_PAGE + 10], + self.memory[REGISTER_PAGE + 11], + self.memory[REGISTER_PAGE + 12], + ); + panic!("hlt") + } + pub fn set_keypress(&mut self, char: u32) { self.memory[INPUT_PAGE + 1] = char } @@ -38,6 +65,7 @@ impl Machine { let instruction = self.memory[ip]; self.memory[INPUT_PAGE] += 1; + match instruction >> 28 { 0x0 => { match instruction >> 24 { @@ -132,7 +160,7 @@ impl Machine { let input_reg = ((instruction) >> 24 & 0x0F) as usize; let reg = (instruction & 0x000000FF) as usize; self.memory[REGISTER_PAGE + reg] = - self.memory[self.memory[REGISTER_PAGE + input_reg] as usize]; + self.memory.get(self.memory[REGISTER_PAGE + input_reg] as usize).unwrap_or_else(|| { println!("could not rload: {:x} {:x} {:x}", input_reg, reg, self.memory[REGISTER_PAGE + input_reg] as usize); self.hlt(ip, instruction); unreachable!()}).clone(); } 0x08 => { // TX R(In) => R(X) @@ -193,7 +221,7 @@ impl Machine { let result = source & bits; self.memory[REGISTER_PAGE + dest_reg] = result; } - // LSHIFT A >> B => C + // LSHIFT A << B => C 0xA7 => { let source_reg = ((instruction & 0x00FF0000) >> 16) as usize; let bit_reg = ((instruction & 0x0000FF00) >> 8) as usize; diff --git a/strings.asm b/strings.asm index 218cfec..04a8d5d 100644 --- a/strings.asm +++ b/strings.asm @@ -137,7 +137,8 @@ jneq draw_next_char ret -label num_to_char: + +label num_to_charset: loadi $2 HEX_TABLE add $2 $4 $4 rload 4 3; Load Arg 1 in 3 @@ -150,6 +151,19 @@ label num_to_char: tx $4 $1 ret +label num_to_char: + loadi $2 HEX_TABLE + add $2 $4 $4 + rload 4 3; Load Arg 1 in 3 + loadi $2 $20 ; Load Addr of [SPACE] in $2 + sub $3 $2 $1 ; Sub the Character From Space + ;loadi $2 2 + ;mul $1 $2 $1 ; Mull By 2 + ;loadi $2 char_space + ;add $2 $1 $1 ; Add to Char Space + tx $4 $3 + ret + ; $4 contains pointer to a null terminated hex string ; outputs num in $1 label string_to_num: diff --git a/util.asm b/util.asm index 2c85245..639d2df 100644 --- a/util.asm +++ b/util.asm @@ -16,7 +16,7 @@ label print_addr: loadi $2 $00000F and $2 $4 $4 - call num_to_char; + call num_to_charset; call draw_char; loadi $2 4 @@ -34,6 +34,6 @@ label print_addr: loadi $2 $00000F and $2 $4 $4 - call num_to_char; + call num_to_charset; call draw_char; ret \ No newline at end of file