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