forked from offtopia/ponydos
Draw mouse cursor
This commit is contained in:
parent
dc0ddf3ab9
commit
0692c75eab
1 changed files with 86 additions and 24 deletions
110
ponydos.asm
110
ponydos.asm
|
@ -3,6 +3,9 @@ bits 16
|
||||||
|
|
||||||
org 0x7c00
|
org 0x7c00
|
||||||
|
|
||||||
|
COLUMNS equ 80
|
||||||
|
ROWS equ 25
|
||||||
|
|
||||||
jmp 0:start
|
jmp 0:start
|
||||||
start:
|
start:
|
||||||
cld
|
cld
|
||||||
|
@ -47,7 +50,7 @@ initialize_mouse:
|
||||||
int 0x15
|
int 0x15
|
||||||
jc .error
|
jc .error
|
||||||
|
|
||||||
jmp mainloop
|
jmp .done
|
||||||
|
|
||||||
.error:
|
.error:
|
||||||
; https://www.ctyme.com/intr/rb-1601.htm
|
; https://www.ctyme.com/intr/rb-1601.htm
|
||||||
|
@ -55,14 +58,87 @@ initialize_mouse:
|
||||||
int 0x15
|
int 0x15
|
||||||
jmp initialize_mouse
|
jmp initialize_mouse
|
||||||
|
|
||||||
mainloop:
|
.done:
|
||||||
; TODO: everything
|
|
||||||
|
initialize_screen:
|
||||||
|
mov ax, 0xb800 ; VGA text video memory
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
|
; Clear screen with asterisks and 15-0 background-foreground
|
||||||
|
mov ax, 0xf000 + '*'
|
||||||
|
mov cx, 25*80
|
||||||
|
xor di, di
|
||||||
|
rep stosw
|
||||||
|
|
||||||
|
; Disable text cursor
|
||||||
|
mov dx, 0x3d4
|
||||||
|
mov al, 0xa
|
||||||
|
out dx, al
|
||||||
|
inc dx
|
||||||
|
mov al, 0x20
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
xor ax, ax
|
||||||
|
call flip_mouse_cursor
|
||||||
|
|
||||||
|
mainloop:
|
||||||
|
mov bx, [mouse_x]
|
||||||
|
mov cx, [mouse_y]
|
||||||
|
cmp [mouse_x_old], bx
|
||||||
|
jne .update_cursor
|
||||||
|
cmp [mouse_y_old], cx
|
||||||
|
jne .update_cursor
|
||||||
|
|
||||||
hang:
|
|
||||||
hlt
|
hlt
|
||||||
;mov ax, 0x0e00 + '.'
|
jmp mainloop
|
||||||
;int 0x10
|
|
||||||
jmp hang
|
.update_cursor:
|
||||||
|
mov ah, [mouse_x_old]
|
||||||
|
mov al, [mouse_y_old]
|
||||||
|
call flip_mouse_cursor
|
||||||
|
mov ah, [mouse_x]
|
||||||
|
mov al, [mouse_y]
|
||||||
|
call flip_mouse_cursor
|
||||||
|
|
||||||
|
mov [mouse_x_old], bx
|
||||||
|
mov [mouse_y_old], cx
|
||||||
|
|
||||||
|
jmp mainloop
|
||||||
|
|
||||||
|
; in:
|
||||||
|
; ah = column
|
||||||
|
; al = row
|
||||||
|
flip_mouse_cursor:
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
push es
|
||||||
|
|
||||||
|
mov bx, 0xb800
|
||||||
|
mov es, bx
|
||||||
|
|
||||||
|
; Column
|
||||||
|
xor bh, bh
|
||||||
|
mov bl, ah
|
||||||
|
shl bx, 1
|
||||||
|
|
||||||
|
; Row
|
||||||
|
mov cl, COLUMNS*2
|
||||||
|
mul cl
|
||||||
|
add bx, ax
|
||||||
|
|
||||||
|
; Swap foreground and background colours
|
||||||
|
inc bx
|
||||||
|
mov al, [es:bx]
|
||||||
|
mov cl, 4
|
||||||
|
ror al, cl
|
||||||
|
mov [es:bx], al
|
||||||
|
|
||||||
|
pop es
|
||||||
|
pop cx
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
|
||||||
Y_OVERFLOW equ 0x80
|
Y_OVERFLOW equ 0x80
|
||||||
X_OVERFLOW equ 0x40
|
X_OVERFLOW equ 0x40
|
||||||
|
@ -70,8 +146,6 @@ Y_NEGATIVE equ 0x20
|
||||||
X_NEGATIVE equ 0x10
|
X_NEGATIVE equ 0x10
|
||||||
BUTTONS equ 0x03
|
BUTTONS equ 0x03
|
||||||
|
|
||||||
COLUMNS equ 80
|
|
||||||
ROWS equ 25
|
|
||||||
X_MAX_VALUE equ COLUMNS-1
|
X_MAX_VALUE equ COLUMNS-1
|
||||||
Y_MAX_VALUE equ ROWS-1
|
Y_MAX_VALUE equ ROWS-1
|
||||||
|
|
||||||
|
@ -108,10 +182,6 @@ mouse_handler:
|
||||||
jnc .x_end
|
jnc .x_end
|
||||||
mov word [mouse_x], 0
|
mov word [mouse_x], 0
|
||||||
.x_end:
|
.x_end:
|
||||||
mov ax, [mouse_x];debg
|
|
||||||
call hexprint16;debg
|
|
||||||
mov ax, 0x0e00 + ' ';debg
|
|
||||||
int 0x10;debg
|
|
||||||
|
|
||||||
test bl, Y_OVERFLOW
|
test bl, Y_OVERFLOW
|
||||||
jnz .y_end
|
jnz .y_end
|
||||||
|
@ -134,21 +204,10 @@ mouse_handler:
|
||||||
jb .y_end
|
jb .y_end
|
||||||
mov word [mouse_y], Y_MAX_VALUE
|
mov word [mouse_y], Y_MAX_VALUE
|
||||||
.y_end
|
.y_end
|
||||||
mov ax, [mouse_y];debg
|
|
||||||
call hexprint16;debg
|
|
||||||
mov ax, 0x0e00 + ' ';debg
|
|
||||||
int 0x10;debg
|
|
||||||
|
|
||||||
and bl, BUTTONS
|
and bl, BUTTONS
|
||||||
mov [mouse_buttons], bl
|
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 ds
|
||||||
pop bp
|
pop bp
|
||||||
pop bx
|
pop bx
|
||||||
|
@ -195,4 +254,7 @@ mouse_x resw 1
|
||||||
mouse_y resw 1
|
mouse_y resw 1
|
||||||
mouse_buttons resb 1
|
mouse_buttons resb 1
|
||||||
|
|
||||||
|
mouse_x_old resw 1
|
||||||
|
mouse_y_old resw 1
|
||||||
|
|
||||||
_bss_end:
|
_bss_end:
|
||||||
|
|
Loading…
Reference in a new issue