vc3/kern/main.asm
2025-04-01 05:25:34 +02:00

141 lines
1.9 KiB
NASM

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