diff --git a/arch.md b/arch.md new file mode 100644 index 0000000..3fc980f --- /dev/null +++ b/arch.md @@ -0,0 +1,50 @@ +# Op Code Structure + +## Type 1 Register and Memory + +Opcode | Register | Address Mask +-------|----------|--------- +F | F | FFFFFF + +## Type 2 Register and Register + +Opcode | Register | Address Mask +-------|----------|--------- +F | F | 00000F + +## Type 3 Meta + +Opcode | Register | Address Mask +-------|----------|--------- +F | F | 000000 + +# Meta Instructions + +Opcode | Type | Descriptions +-------|------|------- +0x00 | 3 |NOP + +# 0x1 Store + +Opcode | Type | Descriptions +-------|------|------------------ +0x1N | 1 | Store word in Register N into Addr + +# 0x2 Load + +Opcode | Type | Descriptions +-------|------|------------------ +0x2N | 1 | Load word @ Addr into Register + +# 0x3 Load Immediate + +Opcode | Type | Descriptions +-------|------|------------------ +0x3N | 1 | Load Addr into Register N + + +# 0x9 Register Move (Transfer) + +Opcode | Type | Descriptions +-------|------|------------------ +0x7N00000R | 2 | Load word in Register `R` into Register `N` \ No newline at end of file diff --git a/kernel.asm b/kernel.asm index 6f0e6b9..5318a70 100644 --- a/kernel.asm +++ b/kernel.asm @@ -37,15 +37,18 @@ import charset.asm ; charset + hex strings import strings.asm ; draw_char, draw_string import util.asm ; print_addr import graphics.asm; draw_vline, draw_hline, draw_rect +import windows.asm ; Common Strings +data ascii TestWindow Test Window +data ascii TestWindow2 Test Window The Second data ascii boo_os_version Boo OS v0.0.1 data ascii prompt [sarah@boo] > data ascii Welcome !@#$%^&*()_+=-0987654321 data ascii Introspection We Can Now Do Introspection: data ascii label_rax RAX: data ascii label_rip RIP: -data ascii label_cycles Instruction Count: +data ascii label_cycles Allocated Memory: data ascii label_keypress Current Key Pressed: data image boo_os.png booos.png data image boo_os_small.png booos-small.png @@ -358,9 +361,39 @@ label handle_keypress: bappend $4 command_line_input ret +label window_1: + nop + +label window_2: + nop + +label kernel_windows: + nop + ; Kernel Begins @ $CB000: + loadi $4 2 + call FFFFF0 ; Allocate First Linked List + store $4 kernel_windows + + loadi $4 $30 + loadi $5 $30 + loadi $6 $A0 + loadi $7 $A0 + loadi $8 TestWindow + call make_window + store $4 window_1 + + loadi $4 $55 + loadi $5 $70 + loadi $6 $F0 + loadi $7 $A0 + loadi $8 TestWindow2 + call make_window + store $4 window_2 + + label kernel_loop: loadi $9 $0; 640-64 loadi $A $0; 480-64 call set_pos @@ -374,6 +407,14 @@ label handle_keypress: loadi $8 $222222 call draw_filled_rect + loadi $4 window_1 + rload $4 $4 + call draw_window + + loadi $4 window_2 + rload $4 $4 + call draw_window + loadi $9 $5; loadi $A $5; call set_pos @@ -465,10 +506,10 @@ label handle_keypress: call draw_string; updsp - jmp $CB000; + jmp kernel_loop; -; Very Very Watermark Allocator +; Very Very Basic Watermark Memory Allocator @ $FFFFF0: ; $4 contains a length which corresponds to number of bytes label allocator: @@ -478,5 +519,4 @@ label handle_keypress: loadi $2 $FFFFF0 sub $2 $1 $2 sub $2 $4 $4 - ret diff --git a/src/lib.rs b/src/lib.rs index 6e2a65d..48a1b8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -113,6 +113,7 @@ impl Machine { if ptr > 0 { self.memory[addr + 1] -= 1; self.memory[addr + 2 + ptr - 1] = 0x00; + self.memory[addr + 2 + ptr - 1] = 0x00; } } op => { @@ -156,7 +157,7 @@ impl Machine { self.memory[addr] = self.memory[REGISTER_PAGE + input_reg]; } 0x07 => { - // LOAD R(X) = MEM(R(In)) + // RLOAD R(X) = MEM(R(In)) let input_reg = ((instruction) >> 24 & 0x0F) as usize; let reg = (instruction & 0x000000FF) as usize; self.memory[REGISTER_PAGE + reg] = diff --git a/windows.asm b/windows.asm new file mode 100644 index 0000000..309986e --- /dev/null +++ b/windows.asm @@ -0,0 +1,84 @@ +; x,y, width, height; title +; returns the address of the window on the heap in $4 +label make_window + tx $D $5 + loadi $4 6 + call $FFFFF0 ; allocate 6 bytes on the heap + + rstore $D $4 + inc $4 + rstore $5 $4 + inc $4 + rstore $6 $4 + inc $4 + rstore $7 $4 + inc $4 + loadi $1 221122 + rstore $1 $4 + inc $4 + rstore $8 $4 + + loadi $1 6 + sub $4 $1 $4 + ret + +; 4 contains the address of the window + +label _draw_window + nop + nop + nop + nop +label draw_window: + tx $C $4 + inc $C + rload $C $4 + store $4 _draw_window + inc $C + rload $C $5 + store $5 _draw_window+1 + inc $C + rload $C $6 + store $6 _draw_window+2 + inc $C + rload $C $7 + store $7 _draw_window+3 + inc $C + rload $C $8 + call draw_filled_rect + inc $C ; now points to title buffer + + load $4 _draw_window + load $5 _draw_window+1 + load $6 _draw_window+2 + load $7 _draw_window+3 + loadi $8 020102 + call draw_rect + + load $4 _draw_window + load $5 _draw_window+1 + loadi $1 2 + add $4 $1 $4 + loadi $1 2 + add $5 $1 $5 + load $6 _draw_window+2 + loadi $1 4 + sub $6 $1 $6 + loadi $7 $A + loadi $8 554455 + call draw_filled_rect + + load $4 _draw_window + load $5 _draw_window+1 + loadi $1 4 + add $4 $1 $4 + loadi $1 4 + add $5 $1 $5 + tx $9 $4 + tx $A $5 + call set_pos + + rload $C $4 + call draw_string + + ret \ No newline at end of file