add shell

This commit is contained in:
sfja 2026-01-30 00:02:19 +01:00
parent c1c8bcf0b3
commit 21234a882d
4 changed files with 103 additions and 21 deletions

View File

@ -60,29 +60,121 @@ key_press_int:
mov r0, [counter] mov r0, [counter]
add r0, vcd_base add r0, vcd_base
mov r1, [kbd_code] mov r1, [kbd_code]
cmp r1, 44 ; spacebar cmp r1, 44 ; spacebar
mov r2, rfl mov r2, rfl
and r2, fl_eq and r2, fl_eq
jnz r2, .print_space jnz r2, .print_space
add r1, 61 ; scancode letter -> ascii
cmp r1, 40 ; enter
mov r2, rfl
and r2, fl_eq
jnz r2, .print_newline
cmp r1, 55 ; dot
mov r2, rfl
and r2, fl_eq
jnz r2, .print_dot
add r1, 61 ; scancode letter -> ascii
mov [rsp], r1 mov [rsp], r1
add rsp, 2 add rsp, 2
call term_putc call term_putc
;call print_u16
sub rsp, 2 sub rsp, 2
jmp .leave jmp .leave
.print_space: .print_space:
mov r1, ' ' mov r1, ' '
mov [rsp], r1 mov [rsp], r1
add rsp, 2 add rsp, 2
call term_putc call term_putc
sub rsp, 2 sub rsp, 2
jmp .leave
.print_newline:
mov r1, '\n'
mov [rsp], r1
add rsp, 2
call term_putc
sub rsp, 2
jmp .leave
.print_dot:
mov r1, ':'
mov [rsp], r1
add rsp, 2
call term_putc
sub rsp, 2
jmp .leave
.leave: .leave:
reti reti
shell_start:
mov [rsp], rbp
add rsp, 2
mov rbp, rsp
.loop_body:
mov r1, .prompt
mov r2, 5
add rsp, 4
mov [rsp-4], r1
mov [rsp-2], r2
call term_puts
sub rsp, 4
hlt
jmp .loop_body
.leave:
mov rsp, rbp
sub rsp, 2
mov rbp, [rsp]
ret
.prompt:
db "C ABC", 0
term_puts:
mov [rsp], rbp
add rsp, 2
mov rbp, rsp
mov r1, [rbp-8]
mov r2, [rbp-6]
mov r3, 0
jmp .l1_cond
.l1_body:
mov r4, r1
add r4, r3
mov r4, byte [r4]
add rsp, 8
mov [rsp-8], r1
mov [rsp-6], r2
mov [rsp-4], r3
mov [rsp-2], r4
call term_putc
mov r3, [rsp-4]
mov r2, [rsp-6]
mov r1, [rsp-8]
sub rsp, 8
add r3, 1
.l1_cond:
cmp r3, r2
mov r0, rfl
and r0, fl_lt
jnz r0, .l1_body
.leave:
mov rsp, rbp
sub rsp, 2
mov rbp, [rsp]
ret
const term_width 20 const term_width 20
const term_height 12 const term_height 12
@ -163,8 +255,8 @@ term_scroll:
mov r0, term_width mov r0, term_width
mul r0, r1 mul r0, r1
add r0, r2 add r0, r2
mov r4, byte [vcd_base + term_width + r0] mov r3, byte [vcd_base + term_width + r0]
mov byte [vcd_base + r0], r4 mov byte [vcd_base + r0], r3
add r2, 1 add r2, 1
.l2_cond: .l2_cond:
@ -195,16 +287,6 @@ term_scroll:
ret ret
print_u16: print_u16:
mov [rsp], rbp mov [rsp], rbp
add rsp, 2 add rsp, 2

View File

@ -1015,16 +1015,14 @@ auto Parser::parse_align() -> std::unique_ptr<Align>
assert(test(TT::KwAlign)); assert(test(TT::KwAlign));
auto loc = m_tok.loc; auto loc = m_tok.loc;
step(); step();
if (!test(TT::Ident)) { if (!test(TT::Int)) {
error(current_loc(), "expected identifier"); error(current_loc(), "expected integer");
return nullptr; return nullptr;
} }
auto ident = m_tok.text;
step();
auto expr = parse_expr(); auto expr = parse_expr();
if (not expr) if (not expr)
return nullptr; return nullptr;
return std::make_unique<Align>(loc, ident, std::move(expr)); return std::make_unique<Align>(loc, std::move(expr));
} }
auto Parser::parse_line() -> std::unique_ptr<Line> auto Parser::parse_line() -> std::unique_ptr<Line>

View File

@ -102,7 +102,6 @@ namespace asmer {
struct Align { struct Align {
Loc loc; Loc loc;
std::string_view ident;
std::unique_ptr<Expr> expr; std::unique_ptr<Expr> expr;
}; };

View File

@ -58,6 +58,9 @@ constexpr uint64_t char_data(uint8_t ch)
case 'X': return 0x0066663C3C666666; case 'X': return 0x0066663C3C666666;
case 'Y': return 0x0066663C18181818; case 'Y': return 0x0066663C18181818;
case 'Z': return 0x007E7E0C18307E7E; case 'Z': return 0x007E7E0C18307E7E;
case ':': return 0x0018180000181800;
default: return 0x55AA55AA55AA55AA; default: return 0x55AA55AA55AA55AA;
// clang-format on // clang-format on
} }