vc3/kern/main.asm
2025-04-02 03:08:13 +02:00

173 lines
2.7 KiB
NASM

start:
; rsp points *at* the top element
mov rbp, 2048
mov rsp, 2048 - 2
lit interrupt_table
or rfl, rfl, 1 << 5 ; Fl_Int
or rfl, rfl, 1 << 6 ; Fl_Vcd
mov r0, 512
mov r1, 1
int 0 ; Int_DiskRead
main_loop:
hlt
jmp main_loop
interrupt_table:
; size
d16 1
d16 keyboard_interrupt
nop
keyboard_interrupt:
and rfl, rfl, !(1 << 5) ; Fl_Int
; push rbp
add rsp, rsp, 2
mov u16 [rsp], rbp
mov rbp, rsp
; push r0
add rsp, rsp, 2
mov u16 [rsp], r0
; push r1
add rsp, rsp, 2
mov u16 [rsp], r1
; push r2
add rsp, rsp, 2
mov u16 [rsp], r2
; push r3
add rsp, rsp, 2
mov u16 [rsp], r3
in r0, 0 ; Device_Keyboard
cmp r0, 44
mov r1, rfl
and r1, r1, 1 << 1 ; Fl_Eq
jnz r1, .L0
cmp r0, 42
mov r1, rfl
and r1, r1, 1 << 1 ; Fl_Eq
jnz r1, .L1
cmp r0, 40
mov r1, rfl
and r1, r1, 1 << 1 ; Fl_Eq
jnz r1, .L2
jmp .L3
.L0:
mov r0, ' '
call put_char
jmp .L4
.L1:
mov r1, u16 [screen_x]
cmp r1, 0
mov r2, rfl
and r2, r2, 1 << 1 ; Fl_Eq
jnz r2, .L4
sub r1, r1, 1
mov u16 [screen_x], r1
mov r0, ' '
call put_char
mov r1, u16 [screen_x]
sub r1, r1, 1
mov u16 [screen_x], r1
jmp .L4
.L2:
mov r1, u16 [screen_y]
add r1, r1, 1
mov u16 [screen_y], r1
mov r1, 0
mov u16 [screen_x], r1
jmp .L4
.L3:
add r0, r0, 'A' - 4
call put_char
jmp .L4
.L4:
; pop r3
mov r3, u16 [rsp]
sub rsp, rsp, 2
; pop r2
mov r2, u16 [rsp]
sub rsp, rsp, 2
; pop r1
mov r1, u16 [rsp]
sub rsp, rsp, 2
; pop r0
mov r0, u16 [rsp]
sub rsp, rsp, 2
mov rsp, rbp
; pop rbp
mov rbp, u16 [rsp]
sub rsp, rsp, 2
or rfl, rfl, 1 << 5 ; Fl_Int
iret
put_char:
; push rbp
add rsp, rsp, 2
mov u16 [rsp], rbp
mov rbp, rsp
; push r1
add rsp, rsp, 2
mov u16 [rsp], r1
; push r2
add rsp, rsp, 2
mov u16 [rsp], r2
mov r2, u16 [screen_y]
mul r2, r2, 40 ; vcd_width_in_ch
mov r1, u16 [screen_x]
add r1, r1, 0x0c00
add r1, r1, r2
mov u8 [r1], r0
mov r1, u16 [screen_x]
add r1, r1, 1
mov u16 [screen_x], r1
cmp r1, 40 ; vcd_width_in_ch
mov r2, rfl
and r2, r2, 1 << 1 ; Fl_Eq
jnz r2, .L0
jmp .L1
.L0:
mov r1, u16 [screen_y]
add r1, r1, 1
mov u16 [screen_y], r1
mov r1, 0
mov u16 [screen_x], r1
.L1:
; pop r1
mov r1, u16 [rsp]
sub rsp, rsp, 2
; pop r2
mov r2, u16 [rsp]
sub rsp, rsp, 2
mov rsp, rbp
; pop rbp
mov rbp, u16 [rsp]
sub rsp, rsp, 2
ret
screen_x:
d16 0
screen_y:
d16 0
; vim: syntax=nasm