1413 lines
40 KiB
NASM
1413 lines
40 KiB
NASM
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Mouse Module ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
Jumps
|
|
.386P
|
|
|
|
; MouseRecord Structure...
|
|
; Area DW Left, Top, Right, Bottom
|
|
; Condition DB ?
|
|
; Flags DB ?
|
|
; ObjectNumber DW ?
|
|
; Function DD DWord FunctionPtr
|
|
;
|
|
; Condition bits
|
|
; Bit 0: Mouse moved
|
|
; Bit 1: Left button pressed
|
|
; Bit 2: Left button held
|
|
; Bit 3: Left button released
|
|
; Bit 4: Right button pressed
|
|
; Bit 5: Right button held
|
|
; Bit 6: Right button released
|
|
;
|
|
; Flags
|
|
; Bit 0-1: Condition test
|
|
; 0 = equal
|
|
; 1 = result when ANDed
|
|
; 2, 3 = reserved
|
|
; Bit 2: NOT of condition test
|
|
; Bit 3: Off - Cursor within area
|
|
; On - Cursor outside area
|
|
; Bit 4: Always call, ignore area
|
|
|
|
include switch.inc
|
|
|
|
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Externals ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
Extrn S_SetSequencer:Far, S_ResetSequencer:Far
|
|
Extrn S_SetDirectMode:Far
|
|
Extrn S_GetDestination:Far
|
|
|
|
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Globals ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
Global InitMouse:Far, UnInitMouse:Far
|
|
Global MouseCharacterGenerationOffset:Word
|
|
Global RestoreMouse:Far, DrawMouse:Far
|
|
Global MouseSecondSetEnable:Far, MouseSecondSetDisable:Far
|
|
Global RestoreMouseGraphics:Far, MouseToggle:Far
|
|
Global MouseInput:Far, AddMouseQueue:Far
|
|
Global SetKeyboardLock:Far, GetKeyboardLock:Far
|
|
Global MouseSaveEvents:Far, MouseRestoreEvents:Far
|
|
Global MouseAddEvent:Far, MouseClearEvents:Far
|
|
Global MouseRemoveEvents:Far, MouseSetXY:Far
|
|
Global MouseGetStatus:Far, NewCharacterSet:Far
|
|
Global MouseUpdateEnable:Far, MouseUpdateDisable:Far
|
|
Global SetMouseCursorType:Far, CmdLineDisableMouse:Far
|
|
Global ForceMouseRestore:Far
|
|
|
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
|
|
|
Segment Mouse PARA Public 'Code' USE16
|
|
Assume CS:Mouse, DS:Nothing
|
|
|
|
CREATENEWLOGFILE EQU 0
|
|
include debug.inc
|
|
|
|
; Assumes 80x50 display (512 characters, 8x8 pixels per char.)
|
|
|
|
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Variables ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
STARTINGCHARACTER EQU 247 ; Use last 9 characters
|
|
QUEUEELEMENTSIZE EQU 8
|
|
MAXXPIXEL EQU 639
|
|
MAXYPIXEL EQU 399
|
|
|
|
MouseCharacterGenerationOffset DW 512*32
|
|
MouseAvailable DB 0
|
|
MouseDisplay DB 1
|
|
MouseEnabled DB 1
|
|
|
|
MouseCursorType DW 0
|
|
|
|
MouseCursorOffset DW 0
|
|
MouseCursorWidth DB 0
|
|
MouseCursorHeight DB 0
|
|
|
|
NewMouseX DW 40*8
|
|
NewMouseY DW 30*8
|
|
MouseX DW 40*8
|
|
MouseY DW 30*8
|
|
MouseXHotSpot DW 0
|
|
MouseYHotSpot DW 0
|
|
|
|
OldCharacterData DW 9 Dup (0)
|
|
Label EndOldCharacterData
|
|
CharacterTypes DW 247, 248, 249, 250, 251, 252, 253, 254, 255
|
|
|
|
OldBitmapData DB 9*8 Dup (0)
|
|
NewBitmapData DB 24*4 Dup (0)
|
|
|
|
OverWriteSecondSet DB 1
|
|
RestoreGraphicsRequired DB 0
|
|
LockKeyBoard DB 0
|
|
UpdateScreen DB 0
|
|
|
|
MouseCursorHotSpot Label
|
|
DB 0, 0
|
|
DB 4, 3
|
|
; DB 8, 16
|
|
|
|
MouseCursorTypes Label
|
|
DW Offset MouseCursorArrow
|
|
DW Offset MouseCursorCrossHairs
|
|
; DW Offset MouseCursorDownArrow
|
|
|
|
Label MouseCursorArrow
|
|
DW 0011111111111111b, 0000000000000000b
|
|
DW 0001111111111111b, 0100000000000000b
|
|
DW 0000111111111111b, 0110000000000000b
|
|
DW 0000011111111111b, 0111000000000000b
|
|
DW 0000001111111111b, 0111100000000000b
|
|
DW 0000000111111111b, 0111110000000000b
|
|
DW 0000000011111111b, 0111111000000000b
|
|
DW 0000000001111111b, 0111111100000000b
|
|
DW 0000000000111111b, 0111111110000000b
|
|
DW 0000000001111111b, 0111111100000000b
|
|
DW 0000000111111111b, 0111110000000000b
|
|
DW 0000000011111111b, 0100011000000000b
|
|
DW 1011000011111111b, 0000011000000000b
|
|
DW 1111100001111111b, 0000001100000000b
|
|
DW 1111100001111111b, 0000001100000000b
|
|
DW 1111110011111111b, 0000000000000000b
|
|
|
|
Label MouseCursorCrossHairs
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111011111111111b, 0000000000000000b
|
|
DW 1100000111111111b, 0000100000000000b
|
|
DW 1000000011111111b, 0011111000000000b
|
|
DW 1100000111111111b, 0000100000000000b
|
|
DW 1111011111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111111111111111b, 0000000000000000b
|
|
|
|
Comment ~
|
|
|
|
Label MouseCursorDownArrow
|
|
DW 1111111111111111b, 0000000000000000b
|
|
DW 1111000000001111b, 0000000000000000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 0000000000000000b, 0000011111100000b
|
|
DW 0000000000000000b, 0111111111111110b
|
|
DW 1000000000000001b, 0011111111111100b
|
|
DW 1100000000000011b, 0001111111111000b
|
|
DW 1110000000000111b, 0000111111110000b
|
|
DW 1111000000001111b, 0000011111100000b
|
|
DW 1111100000011111b, 0000001111000000b
|
|
DW 1111110000111111b, 0000000110000000b
|
|
DW 1111111001111111b, 0000000000000000b
|
|
|
|
~
|
|
|
|
MouseEvents DB 100 * 16 Dup (0)
|
|
MouseEventStack DW 8 Dup (0)
|
|
MouseEventStackPointer DW 0
|
|
MouseEventStart DW Offset MouseEvents
|
|
MouseEventEnd DW Offset MouseEvents
|
|
|
|
MouseStatus DB 0 ; Same as conditions...
|
|
|
|
MouseQueue DW 128 Dup (0)
|
|
MouseQueueStart DB 0
|
|
MouseQueueEnd DB 0
|
|
|
|
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
;³ Functions ³
|
|
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc RestoreMouse Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Cmp MouseDisplay, 0
|
|
JE RestoreMouse1
|
|
|
|
Call RemoveMouseCursor
|
|
|
|
RestoreMouse1:
|
|
Ret
|
|
|
|
EndP RestoreMouse
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc RemoveMouseCursor ; Given ES=cursor to remove
|
|
|
|
Assume DS:Mouse
|
|
Mov BX, Offset OldCharacterData
|
|
Mov DI, MouseCursorOffset
|
|
|
|
|
|
Mov DX, Word Ptr MouseCursorWidth
|
|
Test DH, DH
|
|
JZ RemoveMouseCursor3
|
|
Test DL, DL
|
|
JZ RemoveMouseCursor3
|
|
|
|
Mov CL, STARTINGCHARACTER
|
|
|
|
RemoveMouseCursor1:
|
|
Push CX
|
|
Push BX
|
|
Push DI
|
|
Mov DL, MouseCursorWidth
|
|
|
|
RemoveMouseCursor2:
|
|
Mov AX, [BX]
|
|
Test AH, 8
|
|
JNZ RemoveMouseCursor4
|
|
|
|
Cmp [ES:DI], CL
|
|
JNE RemoveMouseCursor8
|
|
Mov [ES:DI], AX
|
|
Jmp RemoveMouseCursor8
|
|
|
|
RemoveMouseCursor4:
|
|
Or RestoreGraphicsRequired, 1
|
|
|
|
RemoveMouseCursor8:
|
|
; Add DI, 2
|
|
ScasW
|
|
Add BX, 2
|
|
Inc CX
|
|
Dec DL
|
|
JNZ RemoveMouseCursor2
|
|
|
|
Pop DI
|
|
Pop BX
|
|
Pop CX
|
|
|
|
Add CL, 3
|
|
Add BX, 6
|
|
Add DI, 160
|
|
|
|
Dec DH
|
|
JNZ RemoveMouseCursor1
|
|
|
|
RemoveMouseCursor3:
|
|
Ret
|
|
|
|
EndP RemoveMouseCursor
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc RestoreMouseGraphics Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Mov AL, RestoreGraphicsRequired
|
|
Cmp MouseDisplay, 0
|
|
JE RestoreMouseGraphics4
|
|
Cmp OverWriteSecondSet, 1
|
|
JE RestoreMouseGraphics4
|
|
Test AL, 10
|
|
JNZ RestoreMouseGraphics4
|
|
Test AL, 4
|
|
JZ RestoreMouseGraphics4
|
|
|
|
Or RestoreGraphicsRequired, 8
|
|
Test AL, 1
|
|
JZ RestoreMouseGraphics4
|
|
|
|
Call S_SetSequencer
|
|
|
|
Mov AX, 0A000h
|
|
Mov ES, AX
|
|
|
|
Xor BX, BX
|
|
Mov DH, MouseCursorHeight
|
|
Test DH, DH
|
|
JZ RestoreMouseGraphics4
|
|
|
|
RestoreMouseGraphics1:
|
|
Push BX
|
|
Mov DL, MouseCursorWidth
|
|
|
|
RestoreMouseGraphics2:
|
|
Mov AX, [OldCharacterData+BX]
|
|
Test AH, 8
|
|
JZ RestoreMouseGraphics3
|
|
|
|
; AL = character in extended set.
|
|
And AX, 0FFh
|
|
Mov DI, AX
|
|
Mov SI, BX
|
|
ShL DI, 5
|
|
ShL SI, 2 ; DS:SI points to OldBitMap table
|
|
Add SI, Offset OldBitMapData
|
|
Add DI, MouseCharacterGenerationOffset
|
|
; ES:DI points to output table
|
|
|
|
Mov CX, 8
|
|
Rep MovsB
|
|
|
|
RestoreMouseGraphics3:
|
|
Add BX, 2
|
|
Dec DL
|
|
JNZ RestoreMouseGraphics2
|
|
|
|
Pop BX
|
|
Add BX, 6
|
|
|
|
Dec DH
|
|
JNZ RestoreMouseGraphics1
|
|
|
|
Call S_ResetSequencer
|
|
|
|
RestoreMouseGraphics4:
|
|
Ret
|
|
|
|
EndP RestoreMouseGraphics
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SaveMouseCursor
|
|
Assume DS:Mouse
|
|
|
|
Push CS ; ***
|
|
Pop DS ; ***
|
|
|
|
PushF
|
|
ClI
|
|
Mov SI, NewMouseX
|
|
Mov AX, NewMouseY
|
|
PopF
|
|
|
|
Mov MouseX, SI
|
|
Mov MouseY, AX
|
|
|
|
|
|
; Mov AX, MouseY
|
|
ShR AX, 3
|
|
|
|
Mov DX, 50
|
|
Sub DX, AX ; CX = height
|
|
|
|
Cmp DX, 3
|
|
JB SaveMouseCursor1
|
|
|
|
Mov DL, 3
|
|
|
|
SaveMouseCursor1:
|
|
Mov MouseCursorHeight, DL
|
|
|
|
Mov BL, 160
|
|
Mul BL
|
|
; Mov SI, MouseX
|
|
ShR SI, 3
|
|
|
|
Mov CX, 80
|
|
Sub CX, SI
|
|
Cmp CX, 3
|
|
JB SaveMouseCursor2
|
|
|
|
Mov CL, 3
|
|
|
|
SaveMouseCursor2:
|
|
Add SI, SI
|
|
Mov MouseCursorWidth, CL
|
|
|
|
Add SI, AX
|
|
Mov MouseCursorOffset, SI
|
|
Mov DI, Offset OldCharacterData
|
|
Xor EAX, EAX
|
|
|
|
Mov DWord Ptr [DI], EAX ; Clear buffer first.
|
|
Mov DWord Ptr [DI+4], EAX
|
|
Mov DWord Ptr [DI+8], EAX
|
|
Mov DWord Ptr [DI+12], EAX
|
|
Mov Word Ptr [DI+16], AX
|
|
|
|
SaveMouseCursor3:
|
|
Push DI
|
|
Push SI
|
|
Push CX
|
|
|
|
SaveMouseCursor4:
|
|
Mov AX, [ES:SI]
|
|
Mov [DI], AX
|
|
|
|
Add SI, 2
|
|
; Add DI, 2
|
|
ScasW
|
|
Dec CX
|
|
JNZ SaveMouseCursor4
|
|
|
|
Pop CX
|
|
Pop SI
|
|
Pop DI
|
|
Add SI, 160
|
|
Add DI, 6
|
|
|
|
Dec DX
|
|
JNZ SaveMouseCursor3
|
|
|
|
; Now get bitmap data...
|
|
|
|
Call S_SetSequencer
|
|
|
|
Push ES
|
|
|
|
Mov AX, 0A000h
|
|
Mov ES, AX
|
|
|
|
Mov BX, Offset OldCharacterData
|
|
Mov DI, Offset OldBitmapData
|
|
|
|
SaveMouseCursor5:
|
|
Mov AX, [BX]
|
|
Mov SI, AX
|
|
And SI, 0FFh
|
|
ShL SI, 5
|
|
Test AH, 8
|
|
JZ SaveMouseCursor6
|
|
|
|
Mov AL, RestoreGraphicsRequired
|
|
Test AL, 1
|
|
JZ SaveMouseCursor8
|
|
Test AL, 10
|
|
JZ SaveMouseCursor7 ; JNZ 8
|
|
; Test AL, 4
|
|
; JZ SaveMouseCursor7
|
|
|
|
SaveMouseCursor8:
|
|
Add SI, MouseCharacterGenerationOffset
|
|
|
|
SaveMouseCursor6:
|
|
Mov EAX, [ES:SI]
|
|
Mov [DI], EAX
|
|
Mov EAX, [ES:SI+4]
|
|
Mov [DI+4], EAX
|
|
|
|
SaveMouseCursor7:
|
|
Add DI, 8
|
|
Add BX, 2
|
|
Cmp BX, Offset EndOldCharacterData
|
|
JB SaveMouseCursor5
|
|
|
|
Pop ES
|
|
|
|
Test RestoreGraphicsRequired, 10
|
|
JZ SaveMouseCursor9
|
|
|
|
And RestoreGraphicsRequired, Not 14
|
|
|
|
SaveMouseCursor9:
|
|
Ret
|
|
|
|
EndP SaveMouseCursor
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc GenerateMouseCursor
|
|
Assume DS:Mouse
|
|
|
|
; Push CS ; ***
|
|
; Pop DS ; ***
|
|
|
|
; Has to work out new table and write chars
|
|
Mov SI, Offset OldBitMapData
|
|
Mov DI, Offset NewBitMapData
|
|
Mov DX, 3
|
|
|
|
GenerateMouseCursor1:
|
|
Mov CX, 8
|
|
|
|
GenerateMouseCursor2:
|
|
; Mov Byte Ptr [DI], 0
|
|
Mov AL, [SI+16]
|
|
Mov [DI+1], AL
|
|
Mov AL, [SI+8]
|
|
Mov [DI+2], AL
|
|
Mov AL, [SI]
|
|
Mov [DI+3], AL
|
|
|
|
Inc SI
|
|
Add DI, 4
|
|
Loop GenerateMouseCursor2
|
|
|
|
Add SI, 16
|
|
|
|
Dec DX
|
|
JNZ GenerateMouseCursor1
|
|
|
|
Mov BX, MouseX
|
|
And BX, 7 ; CX = MouseX % 8
|
|
Mov CX, 8
|
|
Sub CX, BX
|
|
Mov EDX, 0FF000000h
|
|
ShL EDX, CL ; EDX = 0FF000000h << (8 - shift);
|
|
Mov CX, BX
|
|
|
|
Mov SI, MouseCursorType
|
|
; Add SI, SI
|
|
Mov SI, [MouseCursorTypes+SI]
|
|
; DS:SI points to masks.
|
|
Mov DI, MouseY
|
|
And DI, 7
|
|
ShL DI, 2
|
|
Add DI, Offset NewBitMapData
|
|
|
|
Mov BX, 16 ; Cursor height = 16
|
|
|
|
GenerateMouseCharacter3:
|
|
Mov AX, [SI]
|
|
ShL EAX, 16
|
|
Mov AX, 0FFFFh
|
|
RCR EAX, CL
|
|
Or EAX, EDX
|
|
And [DI], EAX
|
|
|
|
Mov AX, [SI+2]
|
|
ShL EAX, 16
|
|
ShR EAX, CL
|
|
Or [DI], EAX
|
|
|
|
Add SI, 4
|
|
Add DI, 4
|
|
Dec BX
|
|
JNZ GenerateMouseCharacter3
|
|
|
|
; Lets write the characters!
|
|
|
|
Push ES
|
|
Mov AX, 0A000h
|
|
Mov ES, AX
|
|
|
|
Mov BX, Offset OldCharacterData
|
|
Mov SI, Offset NewBitmapData+3
|
|
|
|
Mov DL, 3
|
|
|
|
GenerateMouseCharacter7:
|
|
Mov DH, 3
|
|
|
|
GenerateMouseCharacter4:
|
|
Mov AX, [BX]
|
|
; Get DI = char to write to...
|
|
Test AH, 8
|
|
JZ GenerateMouseCharacter5
|
|
|
|
Cmp OverWriteSecondSet, 0
|
|
JNE GenerateMouseCharacter6
|
|
|
|
And AX, 0FFh
|
|
ShL AX, 5
|
|
Add AX, MouseCharacterGenerationOffset
|
|
Mov DI, AX
|
|
Jmp GenerateMouseCharacter9
|
|
|
|
GenerateMouseCharacter5:
|
|
Mov AX, [BX+18]
|
|
ShL AX, 5
|
|
Mov DI, AX
|
|
|
|
GenerateMouseCharacter9:
|
|
; ES:DI points to character map memory
|
|
|
|
Mov CX, 8
|
|
Push SI
|
|
|
|
GenerateMouseCharacter8:
|
|
MovsB
|
|
Add SI, 3
|
|
|
|
; Mov AL, [SI]
|
|
; StosB
|
|
Loop GenerateMouseCharacter8
|
|
|
|
Pop SI
|
|
|
|
GenerateMouseCharacter6:
|
|
Dec SI
|
|
; Inc SI
|
|
|
|
Add BX, 2
|
|
Dec DH
|
|
JNZ GenerateMouseCharacter4
|
|
|
|
Add SI, 35
|
|
; Add SI, 32-3
|
|
|
|
Dec DL
|
|
JNZ GenerateMouseCharacter7
|
|
|
|
Cmp BX, Offset EndOldCharacterData
|
|
JB GenerateMouseCharacter4
|
|
|
|
|
|
Pop ES
|
|
|
|
Ret
|
|
|
|
EndP GenerateMouseCursor
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PlotMouseCursor
|
|
Assume DS:Mouse
|
|
|
|
Push CS ; ***
|
|
Pop DS ; ***
|
|
|
|
Mov DH, MouseCursorHeight
|
|
And DH, DH
|
|
JZ PlotMouseCursor4
|
|
|
|
Mov AL, STARTINGCHARACTER
|
|
Mov BX, MouseCursorOffset
|
|
|
|
PlotMouseCursor1:
|
|
Push AX
|
|
Push BX
|
|
|
|
Mov DL, MouseCursorWidth
|
|
|
|
PlotMouseCursor2:
|
|
Test Word Ptr [ES:BX], 800h
|
|
JNZ PlotMouseCursor3
|
|
|
|
Mov [ES:BX], AL
|
|
|
|
PlotMouseCursor3:
|
|
Inc AX
|
|
Add BX, 2
|
|
Dec DL
|
|
JNZ PlotMouseCursor2
|
|
|
|
Pop BX
|
|
Pop AX
|
|
Add BX, 160
|
|
Add AX, 3
|
|
|
|
Dec DH
|
|
JNZ PlotMouseCursor1
|
|
|
|
PlotMouseCursor4:
|
|
Ret
|
|
|
|
EndP PlotMouseCursor
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc DrawMouseCursor ; Given ES to write to.
|
|
|
|
Call SaveMouseCursor
|
|
Call GenerateMouseCursor
|
|
|
|
Call S_ResetSequencer
|
|
|
|
; Write block...
|
|
Call PlotMouseCursor
|
|
|
|
Ret
|
|
|
|
EndP DrawMouseCursor
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc DrawMouse Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Cmp MouseDisplay, 0
|
|
JE DrawMouse1
|
|
|
|
Call DrawMouseCursor
|
|
|
|
DrawMouse1:
|
|
Ret
|
|
|
|
EndP DrawMouse
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseInterruptHandler Far
|
|
|
|
PushF
|
|
|
|
ClI
|
|
CLD
|
|
|
|
PushAD
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Mov NewMouseX, CX
|
|
Mov NewMouseY, DX
|
|
|
|
Xor BH, BH ; BH = new status.
|
|
Mov BL, MouseStatus
|
|
|
|
Test AL, 1 ; Mouse moved
|
|
JZ MIH1
|
|
|
|
Or BH, 1
|
|
Or RestoreGraphicsRequired, 4
|
|
|
|
MIH1:
|
|
Test AL, 2 ; Left pressed
|
|
JZ MIH2
|
|
|
|
Or BH, 2
|
|
Jmp MIH4
|
|
|
|
MIH2:
|
|
Test AL, 4
|
|
JZ MIH3
|
|
|
|
Or BH, 8
|
|
Jmp MIH4
|
|
|
|
MIH3:
|
|
Test BL, 6 ; If last status had press or
|
|
JZ MIH4 ; held...
|
|
|
|
Or BH, 4 ; Set held
|
|
|
|
MIH4:
|
|
Test AL, 8 ; Left pressed
|
|
JZ MIH5
|
|
|
|
Or BH, 10h
|
|
Jmp MIH7
|
|
|
|
MIH5:
|
|
Test AL, 10h
|
|
JZ MIH6
|
|
|
|
Or BH, 40h
|
|
Jmp MIH7
|
|
|
|
MIH6:
|
|
Test BL, 30h ; If last status had press or
|
|
JZ MIH7 ; held...
|
|
|
|
Or BH, 20h ; Set held
|
|
|
|
MIH7:
|
|
|
|
Mov MouseStatus, BH
|
|
|
|
Cmp MouseDisplay, 0
|
|
JE MouseInterruptHandler1
|
|
|
|
Mov SI, MouseEventStart
|
|
|
|
Cmp UpdateScreen, 0
|
|
JE NoUpdateCursor
|
|
|
|
Test BH, 1 ; Moved?
|
|
JZ NoUpdateCursor
|
|
|
|
PushAD
|
|
Mov AX, 0B800h
|
|
Mov ES, AX
|
|
Push ES
|
|
Call RemoveMouseCursor
|
|
Call RestoreMouseGraphics
|
|
Pop ES
|
|
Call DrawMouseCursor
|
|
PopAD
|
|
|
|
NoUpdateCursor:
|
|
Add CX, MouseXHotSpot
|
|
Add DX, MouseYHotSpot
|
|
|
|
MouseInterruptHandler2: ; BH = status
|
|
Cmp SI, MouseEventEnd
|
|
JAE MouseInterruptHandler1
|
|
Mov AX, [SI+8] ; AH = flags, AL = conditions
|
|
; AH: Bit 0-1 = test case
|
|
; 0 = equal
|
|
; 1 = result when and
|
|
; Bit 2: NOT of test case
|
|
; Bit 3: Inside/outside area
|
|
; Bit 4: Ignore area
|
|
Test AH, 10h
|
|
JNZ MouseCheckCondition
|
|
|
|
Cmp CX, [SI]
|
|
JB MouseAreaOutside1
|
|
Cmp CX, [SI+4]
|
|
JA MouseAreaOutside1
|
|
Cmp DX, [SI+2]
|
|
JB MouseAreaOutside1
|
|
Cmp DX, [SI+6]
|
|
JA MouseAreaOutside1
|
|
|
|
Test AH, 8
|
|
JZ MouseCheckCondition
|
|
Jmp MouseInterruptHandler3
|
|
|
|
MouseAreaOutside1:
|
|
Test AH, 8
|
|
JZ MouseInterruptHandler3
|
|
|
|
MouseCheckCondition:
|
|
And AH, 7
|
|
Cmp AH, 1
|
|
JB MouseCheckCondition0
|
|
JE MouseCheckCondition1
|
|
|
|
Cmp AH, 5
|
|
JB MouseCheckCondition4
|
|
JE MouseCheckCondition5
|
|
Jmp MouseInterruptHandler3
|
|
|
|
MouseCheckCondition0:
|
|
Cmp AL, BH
|
|
JE MouseEventOK
|
|
Jmp MouseInterruptHandler3
|
|
|
|
MouseCheckCondition1:
|
|
Test AL, BH
|
|
JNZ MouseEventOK
|
|
Jmp MouseInterruptHandler3
|
|
|
|
MouseCheckCondition4:
|
|
Cmp AL, BH
|
|
JNE MouseEventOK
|
|
Jmp MouseInterruptHandler3
|
|
|
|
MouseCheckCondition5:
|
|
Test AL, BH
|
|
JNZ MouseInterruptHandler3
|
|
; JZ MouseEventOK
|
|
; Jmp MouseInterruptHandler3
|
|
|
|
MouseEventOK: ; Call function!
|
|
Mov AX, [SI+10]
|
|
Call DWord Ptr [SI+12]
|
|
And AX, AX
|
|
JZ MouseInterruptHandler1
|
|
|
|
MouseInterruptHandler3:
|
|
Add SI, 16
|
|
Jmp MouseInterruptHandler2
|
|
|
|
MouseInterruptHandler1:
|
|
Pop ES
|
|
Pop DS
|
|
PopAD
|
|
PopF
|
|
|
|
Ret
|
|
|
|
EndP MouseInterruptHandler
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc InitMouse Far
|
|
|
|
Cmp CS:MouseEnabled, 0
|
|
JE InitMouse2
|
|
|
|
Trace " - Determining mouse availability"
|
|
|
|
Xor AX, AX
|
|
Mov ES, AX
|
|
|
|
Mov Byte Ptr [ES:449h], 6 ; 'Setting' display mode
|
|
|
|
Int 33h
|
|
|
|
Cmp AX, -1
|
|
JE InitMouse1
|
|
|
|
Mov MouseDisplay, 0
|
|
|
|
InitMouse2:
|
|
Ret
|
|
|
|
InitMouse1:
|
|
Trace " - Setting Mouse extents"
|
|
|
|
Mov MouseAvailable, 1
|
|
|
|
Xor CX, CX ; X Limits
|
|
Mov DX, MAXXPIXEL
|
|
Mov AX, 7
|
|
Int 33h
|
|
|
|
Xor CX, CX ; Y Limits
|
|
Mov DX, MAXYPIXEL
|
|
Mov AX, 8
|
|
Int 33h
|
|
|
|
Mov CX, MouseX
|
|
Mov DX, MouseY
|
|
Call MouseSetXY
|
|
|
|
Trace " - Installing mouse handler"
|
|
|
|
Push CS
|
|
Pop ES
|
|
Mov CX, 1Fh ; Call on mouse move
|
|
; left button press, release.
|
|
; right button press, release.
|
|
; Ignores central button (if any)
|
|
Mov DX, Offset MouseInterruptHandler
|
|
Mov AX, 0Ch
|
|
Int 33h
|
|
|
|
Ret
|
|
|
|
EndP InitMouse
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc UnInitMouse Far
|
|
|
|
Xor AX, AX
|
|
Int 33h
|
|
|
|
Ret
|
|
|
|
EndP UnInitMouse
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseSecondSetEnable Far
|
|
|
|
Mov CS:OverwriteSecondSet, 0
|
|
Ret
|
|
|
|
EndP MouseSecondSetEnable
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseSecondSetDisable Far
|
|
|
|
Mov CS:OverwriteSecondSet, 1
|
|
Ret
|
|
|
|
EndP MouseSecondSetDisable
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseToggle Far
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Cmp MouseAvailable, 0
|
|
JE MouseToggle1
|
|
|
|
Xor MouseDisplay, 1
|
|
JNZ MouseToggle1
|
|
|
|
Mov AX, 0B800h
|
|
Mov ES, AX
|
|
Call RemoveMouseCursor
|
|
Mov MouseDisplay, 1
|
|
Or RestoreGraphicsRequired, 4
|
|
Call RestoreMouseGraphics
|
|
Mov MouseDisplay, 0
|
|
|
|
MouseToggle1:
|
|
Mov AX, 1
|
|
Ret
|
|
|
|
EndP MouseToggle
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseSetXY Far
|
|
|
|
PushF
|
|
|
|
Mov NewMouseX, CX
|
|
Mov NewMouseY, DX
|
|
|
|
Cmp CS:MouseAvailable, 0
|
|
JE MouseSetXY1
|
|
|
|
ClI
|
|
|
|
Mov AX, 4
|
|
Int 33h
|
|
|
|
Sub CX, MouseXHotSpot
|
|
JNS MouseSetXY2
|
|
|
|
Xor CX, CX
|
|
|
|
MouseSetXY2:
|
|
Sub DX, MouseYHotSpot
|
|
JNS MouseSetXY3
|
|
|
|
Xor DX, DX
|
|
|
|
MouseSetXY3:
|
|
Cmp CX, MAXXPIXEL
|
|
JB MouseSetXY4
|
|
|
|
Mov CX, MAXXPIXEL
|
|
|
|
MouseSetXY4:
|
|
Cmp DX, MAXYPIXEL
|
|
JB MouseSetXY5
|
|
|
|
Mov DX, MAXYPIXEL
|
|
|
|
MouseSetXY5:
|
|
Mov MouseX, CX
|
|
Mov MouseY, DX
|
|
|
|
Or CS:RestoreGraphicsRequired, 4
|
|
|
|
MouseSetXY1:
|
|
PopF
|
|
|
|
Ret
|
|
|
|
EndP MouseSetXY
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseSaveEvents Far
|
|
|
|
PushF
|
|
Push DS
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Cmp MouseAvailable, 0
|
|
JE MouseSaveEvents1
|
|
|
|
ClI
|
|
|
|
Mov AX, MouseEventStart
|
|
Mov SI, MouseEventStackPointer
|
|
Mov [MouseEventStack+SI], AX
|
|
Add MouseEventStackPointer, 2
|
|
|
|
Mov AX, MouseEventEnd
|
|
Mov MouseEventStart, AX
|
|
|
|
MouseSaveEvents1:
|
|
Pop DS
|
|
PopF
|
|
|
|
Ret
|
|
|
|
EndP MouseSaveEvents
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseRestoreEvents Far
|
|
|
|
PushF
|
|
Push DS
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Cmp MouseAvailable, 0
|
|
JE MouseRestoreEvents1
|
|
|
|
ClI
|
|
|
|
Mov AX, MouseEventStart
|
|
Mov MouseEventEnd, AX
|
|
|
|
Sub MouseEventStackPointer, 2
|
|
Mov SI, MouseEventStackPointer
|
|
Mov AX, [MouseEventStack+SI]
|
|
Mov MouseEventStart, AX
|
|
|
|
MouseRestoreEvents1:
|
|
Pop DS
|
|
PopF
|
|
|
|
Ret
|
|
|
|
EndP MouseRestoreEvents
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetKeyboardLock Far ; AL = lock state
|
|
|
|
Mov CS:LockKeyBoard, AL
|
|
Ret
|
|
|
|
EndP SetKeyboardLock
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc GetKeyboardLock Far
|
|
|
|
Mov AL, CS:LockKeyBoard
|
|
Ret
|
|
|
|
EndP GetKeyboardLock
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc AddMouseQueue Far ; AX, CX, DX
|
|
|
|
Push DS
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
Mov BH, QUEUEELEMENTSIZE
|
|
Mov BL, MouseQueueEnd
|
|
Add BH, BL
|
|
Cmp BH, MouseQueueStart
|
|
JE AddMouseQueue1 ; No space left on queue.
|
|
|
|
Mov MouseQueueEnd, BH
|
|
And BX, 0FFh
|
|
Mov [MouseQueue+BX], AX
|
|
Mov [MouseQueue+BX+2], CX
|
|
Mov [MouseQueue+BX+4], DX
|
|
Mov [MouseQueue+BX+6], DI
|
|
|
|
AddMouseQueue1:
|
|
Pop DS
|
|
Ret
|
|
|
|
EndP AddMouseQueue
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseInput Far
|
|
|
|
PushF
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
|
|
ClI
|
|
|
|
Cmp MouseDisplay, 0
|
|
JE MouseInput1
|
|
|
|
Mov CL, MouseQueueEnd
|
|
Mov BL, MouseQueueStart
|
|
Sub CL, BL
|
|
JNZ MouseInput2
|
|
|
|
Cmp LockKeyBoard, 0
|
|
JE MouseInput1
|
|
|
|
Mov AX, 2
|
|
PopF
|
|
Ret
|
|
|
|
MouseInput1:
|
|
Mov AX, 0
|
|
PopF
|
|
Ret
|
|
|
|
MouseInput2:
|
|
And BX, 0FFh
|
|
Mov SI, BX
|
|
|
|
Add MouseQueueStart, QUEUEELEMENTSIZE
|
|
|
|
MouseInput3:
|
|
Mov BX, [MouseQueue+SI]
|
|
Mov CX, [MouseQueue+SI+2]
|
|
Mov DX, [MouseQueue+SI+4]
|
|
Mov DI, [MouseQueue+SI+6]
|
|
|
|
Mov AX, 1
|
|
PopF
|
|
Ret
|
|
|
|
EndP MouseInput
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseAddEvent Far ; Given DS:SI to event
|
|
|
|
PushF
|
|
|
|
Cmp CS:MouseAvailable, 0
|
|
JE MouseAddEvent1
|
|
|
|
Push SI
|
|
Push ES
|
|
Push DI
|
|
|
|
ClI
|
|
CLD
|
|
|
|
Push CS
|
|
Pop ES
|
|
Mov DI, CS:MouseEventEnd
|
|
|
|
Mov CX, 8
|
|
Rep MovsW
|
|
|
|
Mov CS:MouseEventEnd, DI
|
|
|
|
Pop DI
|
|
Pop ES
|
|
Pop SI
|
|
|
|
MouseAddEvent1:
|
|
PopF
|
|
Ret
|
|
|
|
EndP MouseAddEvent
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseClearEvents Far
|
|
|
|
Mov AX, CS:MouseEventStart
|
|
Mov CS:MouseEventEnd, AX
|
|
Ret
|
|
|
|
EndP MouseClearEvents
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseRemoveEvents Far ; AX = number to remove
|
|
|
|
ShL AX, 4
|
|
Sub CS:MouseEventEnd, AX
|
|
Ret
|
|
|
|
EndP MouseRemoveEvents
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseGetStatus Far
|
|
|
|
Mov AL, CS:MouseStatus
|
|
Ret
|
|
|
|
EndP MouseGetStatus
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc NewCharacterSet Far
|
|
|
|
Or CS:RestoreGraphicsRequired, 2
|
|
Ret
|
|
|
|
EndP NewCharacterSet
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseUpdateEnable Far
|
|
|
|
Mov CS:UpdateScreen, 1
|
|
Ret
|
|
|
|
EndP MouseUpdateEnable
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MouseUpdateDisable Far
|
|
|
|
Mov CS:UpdateScreen, 0
|
|
Ret
|
|
|
|
EndP MouseUpdateDisable
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetMouseCursorType Far
|
|
|
|
PushF
|
|
Push DS
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Mouse
|
|
ClI
|
|
|
|
Mov MouseCursorType, BX
|
|
Mov AX, [MouseCursorHotSpot+BX]
|
|
Mov CX, MouseX
|
|
Mov DX, MouseY
|
|
|
|
Add CX, MouseXHotSpot
|
|
Add DX, MouseYHotSpot
|
|
|
|
Mov Byte Ptr MouseXHotSpot, AL
|
|
Mov Byte Ptr MouseYHotSpot, AH
|
|
|
|
Sub CX, MouseXHotSpot
|
|
JNS SetMouseCursorType1
|
|
|
|
Xor CX, CX
|
|
|
|
SetMouseCursorType1:
|
|
Sub DX, MouseYHotSpot
|
|
JNS SetMouseCursorType2
|
|
|
|
Xor DX, DX
|
|
|
|
SetMouseCursorType2:
|
|
Cmp CX, MAXXPIXEL
|
|
JB SetMouseCursorType3
|
|
|
|
Mov CX, MAXXPIXEL
|
|
|
|
SetMouseCursorType3:
|
|
Cmp DX, MAXYPIXEL
|
|
JB SetMouseCursorType4
|
|
|
|
Mov DX, MAXYPIXEL
|
|
|
|
SetMouseCursorType4:
|
|
; Mov NewMouseX, CX
|
|
; Mov NewMouseY, DX
|
|
|
|
Call MouseSetXY
|
|
|
|
Pop DS
|
|
PopF
|
|
Ret
|
|
|
|
EndP SetMouseCursorType
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc CmdLineDisableMouse Far
|
|
|
|
Mov Word Ptr CS:MouseDisplay, 0
|
|
Ret
|
|
|
|
EndP CmdLineDisableMouse
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc ForceMouseRestore Far
|
|
|
|
Call MouseUpdateDisable
|
|
ClI
|
|
Call RestoreMouse
|
|
Or RestoreGraphicsRequired, 4
|
|
Call RestoreMouseGraphics
|
|
StI
|
|
Jmp MouseUpdateEnable
|
|
|
|
EndP ForceMouseRestore
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
|
|
|
EndS
|
|
|
|
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
|
|
|
End
|