vc5/programs/boot.vc5asm
2026-02-15 22:13:00 +01:00

371 lines
5.5 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] key press interrupt handler
; [addr + 6] key release interrupt handler
mov r0, kbd_status
mov [0x702 + 0], r0
mov r0, kbd_code
mov [0x702 + 2], r0
mov r0, key_press_int
mov [0x702 + 4], r0
mov r0, 0
mov [0x702 + 6], 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