const KBD_STATUS 0x1ffc const KBD_CODE 0x1ffe const VCD 0x2000 const FL_EQ 0x2 const FL_EQ 0x4 const KBD_FLAG_IS_RELEASE 0x1 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 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 [0x600], r0 main_loop: hlt jmp main_loop key_press_int: mov r0, [KBD_STATUS] and r0, r0, KBD_FLAG_IS_RELEASE jnz r0, .leave mov r0, [0x600] add r0, r0, VCD mov r1, [KBC_CODE] cmp r1, 44 ; spacebar mov r2, rfl and r2, r2, FL_EQ jnz r2, .incr add r1, r1, 61 mov byte [r0], r1 .incr: mov r0, [0x600] add r0, r0, 1 mov [0x600], r0 .leave: reti ;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