368 lines
5.4 KiB
Plaintext
368 lines
5.4 KiB
Plaintext
|
|
|
|
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
|
|
|
|
; mov r1, 0
|
|
;.loop_body:
|
|
; mov r2, r1
|
|
; add r2, 32
|
|
;
|
|
; add rsp, 4
|
|
; mov [rsp-4], r1
|
|
; mov [rsp-2], r2
|
|
; call term_putc
|
|
; mov r1, [rsp-4]
|
|
; sub rsp, 4
|
|
;
|
|
; add r1, 1
|
|
;.loop_cond:
|
|
; cmp r1, 127 - 32
|
|
; mov r0, rfl
|
|
; and r0, fl_lt
|
|
; jnz r0, .loop_body
|
|
|
|
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, 93 ; 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
|
|
|
|
|
|
|