152 lines
2.4 KiB
Plaintext
152 lines
2.4 KiB
Plaintext
|
|
|
|
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
|
|
|
|
|
|
|