cpu 8086 bits 16 org 0x7c00 jmp 0:start start: cld cli ; Set up segments and stack mov ax, cs mov ds, ax mov es, ax mov ss, ax mov sp, $$ sti ; Clear BSS mov di, _bss_start mov cx, _bss_end - _bss_start xor al, al rep stosb initialize_mouse: ; Initialize mouse ; https://www.ctyme.com/intr/rb-1601.htm mov ax, 0xc205 mov bh, 3 ; TODO: This is the usual PS/2 mouse packet size, but is it correct here? int 0x15 jc .error ; Set handler address ; https://www.ctyme.com/intr/rb-1603.htm mov ax, 0xc207 ; es is already set correctly mov bx, mouse_handler int 0x15 jc .error ; Enable mouse ; https://www.ctyme.com/intr/rb-1596.htm mov ax, 0xc200 mov bh, 1 int 0x15 jc .error jmp mainloop .error: ; https://www.ctyme.com/intr/rb-1601.htm mov ax, 0xc201 int 0x15 jmp initialize_mouse mainloop: ; TODO: everything hang: hlt ;mov ax, 0x0e00 + '.' ;int 0x10 jmp hang Y_OVERFLOW equ 0x80 X_OVERFLOW equ 0x40 Y_NEGATIVE equ 0x20 X_NEGATIVE equ 0x10 BUTTONS equ 0x03 COLUMNS equ 80 ROWS equ 25 X_MAX_VALUE equ COLUMNS-1 Y_MAX_VALUE equ ROWS-1 mouse_handler: push ax push bx push bp push ds mov ax, cs mov ds, ax mov bp, sp mov bx, [bp+18] ; status test bl, X_OVERFLOW jnz .x_end .x: mov ax, [bp+16] ; X test bl, X_NEGATIVE jnz .x_negative .x_nonnegative: add [mouse_x], ax cmp word [mouse_x], X_MAX_VALUE jb .x_end mov word [mouse_x], X_MAX_VALUE jmp .x_end .x_negative: neg al sub [mouse_x], ax jnc .x_end mov word [mouse_x], 0 .x_end: mov ax, [mouse_x];debg call hexprint16;debg mov ax, 0x0e00 + ' ';debg int 0x10;debg test bl, Y_OVERFLOW jnz .y_end .y: mov ax, [bp+14] ; Y test bl, Y_NEGATIVE jnz .y_negative .y_nonnegative: ; Y-axis is inverted sub [mouse_y], ax jnc .y_end mov word [mouse_y], 0 jmp .y_end .y_negative: neg al add [mouse_y], ax cmp word [mouse_y], Y_MAX_VALUE jb .y_end mov word [mouse_y], Y_MAX_VALUE .y_end mov ax, [mouse_y];debg call hexprint16;debg mov ax, 0x0e00 + ' ';debg int 0x10;debg and bl, BUTTONS mov [mouse_buttons], bl mov al, [mouse_buttons];debg call hexprint8;debg mov ax, 0x0e00 + 13;debg int 0x10;debg mov ax, 0x0e00 + 10;debg int 0x10;debg pop ds pop bp pop bx pop ax retf hexprint16: xchg ah, al call hexprint8 xchg ah, al hexprint8: push ax push cx mov cl, 4 shr al, cl call hexprint4 pop cx pop ax hexprint4: push ax and al, 0xf cmp al, 10 jb .digit09 add al, 'a' - '0' - 10 .digit09: add al, '0' mov ah, 0x0e int 0x10 pop ax ret times 510-($-$$) db 0 db 0x55 db 0xaa section .bss _bss_start: mouse_x resw 1 mouse_y resw 1 mouse_buttons resb 1 _bss_end: