const fl_zero 1 << 0 const fl_eq 1 << 1 const fl_be 1 << 2 const fl_ab 1 << 3 const fl_lt 1 << 4 const fl_gt 1 << 5 const fl_err 1 << 6 const vcd_base 0x2000 const kbd_status 0x1ffc const kbd_code 0x1ffe const kbd_flag_is_release 0x1 const counter 0x600 _start: mov rsp, 0x1000 mov rbp, rsp mov r0, 512 mov r1, 1 dskr r0, r1 ; setup video character display (VCD) ; descriptor table structure: ; [addr + 0] memory map base mov r0, vcd_base mov [0x700], r0 lvcd 0x700 ; setup keyboard (KBD) ; descriptor table structure: ; [addr + 0] status address ; [addr + 2] keycode address ; [addr + 4] keyboard interrupt handler mov r0, kbd_status mov [0x702], r0 mov r0, kbd_code mov [0x704], r0 mov r0, key_press_int mov [0x706], r0 lkbd 0x702 ; character counter mov r0, 0 mov [counter], r0 main_loop: hlt jmp main_loop key_press_int: mov r0, [kbd_status] and r0, kbd_flag_is_release jnz r0, .leave mov r0, [counter] add r0, vcd_base mov r1, [kbd_code] cmp r1, 44 ; spacebar mov r2, rfl and r2, fl_eq jnz r2, .print_space 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 add rsp, 2 call term_putc ;call print_u16 sub rsp, 2 jmp .leave .print_space: mov r1, ' ' mov [rsp], r1 add rsp, 2 call term_putc 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: 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_height 12 term_y: dw 0 term_x: dw 0 term_putc: mov [rsp], rbp add rsp, 2 mov rbp, rsp mov r1, [rbp-6] cmp r1, '\n' mov r0, rfl and r0, fl_eq jnz r0, .next_row cmp r1, ' ' mov r0, rfl and r0, fl_eq jnz r0, .next_col cmp r1, '\0' mov r0, rfl and r0, fl_eq jnz r0, .next_col mov r0, [term_y] mul r0, term_width add r0, vcd_base mov r2, [term_x] add r0, r2 mov byte [r0], r1 .next_col: mov r2, [term_x] add r2, 1 mov [term_x], r2 cmp r2, term_width mov r0, rfl and r0, fl_lt jnz r0, .leave .next_row: mov r0, 0 mov [term_x], r0 mov r2, [term_y] add r2, 1 cmp r2, term_height mov r0, rfl and r0, fl_lt jnz r0, .increment_y call term_scroll jmp .leave .increment_y: mov [term_y], r2 .leave: mov rsp, rbp sub rsp, 2 mov rbp, [rsp] ret term_scroll: mov r1, 0 ; row jmp .l1_cond .l1_body: mov r2, 0 ; col jmp .l2_cond .l2_body: mov r0, term_width mul r0, r1 add r0, r2 mov r3, byte [vcd_base + term_width + r0] mov byte [vcd_base + r0], r3 add r2, 1 .l2_cond: cmp r2, term_width mov r0, rfl and r0, fl_lt jnz r0, .l2_body add r1, 1 .l1_cond: cmp r1, term_height - 1 mov r0, rfl and r0, fl_lt jnz r0, .l1_body mov r2, 0 jmp .l3_cond .l3_body: mov r0, ' ' mov byte [vcd_base + (term_height - 1) * term_width + r2], r0 add r2, 1 .l3_cond: cmp r2, term_width mov r0, rfl and r0, fl_lt jnz r0, .l3_body ret print_u16: mov [rsp], rbp add rsp, 2 mov rbp, rsp mov r1, [rbp-6] ; value to print mov r2, 0 ; place index jmp .digits_cond .digits_body: mov r3, .places add r3, r2 mov r3, [r3] ; place mov r4, 0 ; place occurences jmp .place_cond .place_body: add r4, 1 sub r1, r3 .place_cond: cmp r3, r1 mov r0, rfl and r0, fl_eq | fl_lt jnz r0, .place_body mov r0, r4 add r0, 48 add rsp, 4 mov [rsp-4], r1 mov [rsp-2], r2 mov [rsp], r0 add rsp, 2 call term_putc sub rsp, 2 mov r2, [rsp-2] mov r1, [rsp-4] sub rsp, 4 add r2, 2 .digits_cond: cmp r2, 10 mov r0, rfl and r0, fl_lt jnz r0, .digits_body .leave: mov rsp, rbp sub rsp, 2 mov rbp, [rsp] ret .places: dw 10000, 1000, 100, 10, 1