const Fl_Zero 0 const Fl_Eq 1 const Fl_Be 2 const Fl_Lt 3 const Fl_Err 4 const Fl_Int 5 const Fl_Vcd 6 const Int_DiskRead 0 const Int_DiskWrite 1 const Int_Key 32 const Device_Keyboard 0 const vcd_ch_width 8 const vcd_ch_height 8 const vcd_width_in_ch 40 const vcd_height_in_ch 12 const vcd_px_width 4 const vcd_px_height 8 const vcd_width_in_px vcd_width_in_ch * vcd_ch_width * vcd_px_width const vcd_height_in_px vcd_height_in_ch * vcd_ch_height * vcd_px_height 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