vc3/kern/main.asm
2025-04-02 20:46:35 +02:00

143 lines
2.0 KiB
NASM

include "arch.asm"
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
mov r0, 512
mov r1, 1
int Int_DiskRead
main_loop:
hlt
jmp main_loop
interrupt_table:
; size
d16 1
d16 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
mov 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, u16 [screen_x]
cmp r1, 0
mov r2, rfl
and r2, r2, 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
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, u16 [screen_y]
mul r2, r2, 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, vcd_width_in_ch
mov r2, rfl
and r2, r2, 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
pop r2
mov rsp, rbp
pop rbp
ret
screen_x:
d16 0
screen_y:
d16 0
; vim: syntax=nasm