ponydos/ponydos.asm

165 lines
2.0 KiB
NASM

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
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
mouse_handler:
push ax
push bx
push bp
mov bp, sp
; status
mov bx, [bp+16]
; X negative
test bl, 0x10
jz .no_x_negative
mov ax, 0x0e00 + '-'
int 0x10
.no_x_negative:
; X overflow
test bl, 0x40
jz .no_x_overflow
mov ax, 0x0e00 + 'o'
.no_x_overflow:
; X
mov ax, [bp+14]
call hexprint8
mov ax, 0x0e00 + ' '
int 0x10
; Y negative
test bl, 0x20
jz .no_y_negative
mov ax, 0x0e00 + '-'
int 0x10
.no_y_negative:
; Y overflow
test bl, 0x80
jz .no_y_overflow
mov ax, 0x0e00 + 'o'
.no_y_overflow:
; Y
mov ax, [bp+12]
call hexprint8
mov ax, 0x0e00 + ' '
int 0x10
; Left mouse
test bl, 0x01
jz .no_lmb
mov ax, 0x0e00 + 'L'
int 0x10
.no_lmb:
; Right mouse
test bl, 0x02
jz .no_rmb
mov ax, 0x0e00 + 'R'
int 0x10
.no_rmb
mov ax, 0x0e00 + 13
int 0x10
mov ax, 0x0e00 + 10
int 0x10
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