vc3/kern/main.asm
2025-04-01 15:47:25 +02:00

173 lines
2.6 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
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, 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, ' '
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
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 << 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, 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
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