; simple mouse demo, x86, DOS, real mode, MASM syntax, mode 13h
; (C)2021-Jun-09 "The Almighty Pegasus Epsilon" <pegasus@pimpninjas.org>
; Distribute Unmodified - https://pegasus.pimpninjas.org/license
;
; C:\>ml /AT <this file>
.286
.model TINY
.code
ORG 100h
start:
; prepare to write to video memory
MOV BH, 0A0h
; BL = 0, therefore BX = A000h
MOV ES, BX
; reset mouse driver (also tells dosbox to capture cursor)
; AX = 0
INT 33h
; returns AX = FFFFh (mouse driver installed)
; returns BX = 0003h (three buttons)
; save old video mode
MOV AH, 0Fh
; AL = FFh, ignored
INT 10h
; returns AH = character columns (80, probably)
; returns AL = video mode (3, probably, this is all we care about)
; returns BH = active page (zero, probably)
XOR AH, AH
; AH = 0 (set video mode)
PUSH AX
; set new video mode 13h - 320x200
MOV AL, 13h
; AL = desired video mode
INT 10h
again:
; read mouse position
MOV AX, 3
INT 33h
; returns CX = column - 0 to 638 (319 × 2)
; returns DX = row - 0 to 199
; draw color at (CX, DX) based on buttons pressed
XCHG AX, BX
; AL = bitmap of buttons pressed
MOV DI, DX
SHL DI, 2
ADD DI, DX
SHL DI, 6
SHR CX, 1
ADD DI, CX
; DI = row * 320 + column
STOSB
; check for keypress in buffer
MOV AH, 1
; AL ignored
INT 16h
; AH = scan code, AL = character, but i don't care.
; ZF == Z, no keypress available
; ZF == NZ, keypress available
JZ again
; restore previous video mode
POP AX
; AH = 0 (set video mode), AL = saved video mode
INT 10h
; supposed to return something in AL, but AX is unmodified for me...
; remove keypress from buffer
; AH = 0, AL ignored
INT 16h
; returns scancode in AH, character in AL, but I don't care...
; exit (balanced stack, DOS or CP/M, TINY model)
RET
END start