const fl_zero 0x1 const fl_eq 0x2 const fl_be 0x4 const fl_lt 0x8 const fl_err 0xa 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, .incr ; add r1, 61 ; mov byte [r0], r1 ;.incr: ; mov r0, [counter] ; add r0, 1 ; mov [counter], r0 jnz r2, .print_space add r1, 61 ; scancode letter -> ascii mov [rsp], r0 add rsp, 2 call print_char jmp .leave .print_space: mov r0, ' ' mov [rsp], r0 add rsp, 2 call print_char .leave: reti print_char: mov [rsp], rbp mov rbp, rsp add rsp, 2 mov r1, [rbp-6] add r0, vcd_base mov r1, [kbd_code] cmp r1, ' ' mov r2, rfl and r2, fl_eq jnz r2, .incr add r1, 61 mov byte [r0], r1 .incr: mov r0, [counter] add r0, 1 mov [counter], r0 .leave: sub rsp, 2 mov rbp, [rsp] ret ;print_int: ; mov [rsp], rbp ; add rsp, 2 ; mov rbp, rsp ; add rsp, rsp, 2 ; ; mov r1, [rbp-2] ; ; mov r2, 10000 ; mov r3, 0 ; jmp .c_10000 ;.b_10000: ; add r3, 1 ; sub r1, r2 ;.c_10000: ; cmp r2, r1 ; mov r0, rfl ; and r0, fl_eq | fl_lt ; jnz r0, .b_10000 ; add r3, 48 ;scancode_to_char: ; cmp r1, 61 ; ; mov r2, rfl ; and r2, r2, FL_LT ; jnz .not_letter ; ; ; if r1 > 86 { goto .not_letter } ; cmp r1, 86 ; mov r2, rfl ; xor r2, 0xffff ; and r2, r2, FL_EQ | FL_LT ; ; ; mov r4, rfl ; and r4, r4, FL_EQ ; shr r4, r4, 2