Выбор типа курсора мыши по нажатию на клавиши - Assembler
Формулировка задачи:
Составить программу по управлению манипулятором "мышь". Выбор типа курсора организовать по нажатию на клавиши "q","w","r".
Решение задачи: «Выбор типа курсора мыши по нажатию на клавиши»
textual
Листинг программы
.model small .stack 100h .data ;коды клавиш KeyCode_Esc equ 1Bh ;Esc ;Константы событий "мыши" MouseEvent_None equ 0000h ;Удалить пользовательский обработчик MouseEvent_Move equ 0001h ;любое перемещение MouseEvent_PressLeftButton equ 0002h ;нажатие левой кнопки MouseEvent_ReleaseLeftButton equ 0004h ;отпускание левой кнопки MouseEvent_PressRightButton equ 0008h ;нажатие правой кнопки MouseEvent_ReleaseRightButton equ 0010h ;отпускание правой кнопки MouseEvent_PressMiddleButton equ 0020h ;нажатие средней кнопки MouseEvent_ReleaseMiddleButton equ 0040h ;отпускание средней кнопки MouseInitOk equ 0FFFFh ;инициализация мыши - успешна MouseInitFault equ 0000h ;инициализация мыши - мышь или драйвер мыши не установлены MouseButtons_Any equ 0000h ;количество кнопок у мыши - отлично от 2 и 3 MouseButtons_2 equ 0002h ;количество кнопок у мыши - 2 MouseButtons_2_ equ 0FFFFh ;количество кнопок у мыши - 2 MouseButtons_3 equ 0003h ;количество кнопок у мыши - 3 ;Параметры курсоров мыши ;Курсор - перекрестие MouseCursor_Cross dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh ;screen mask (AND mask) dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 00100h, 00100h, 00100h, 00000h ;cursor mask (XOR mask) dw 00100h, 00100h, 00000h, 0ED6Eh dw 00000h, 00100h, 00100h, 00000h dw 00100h, 00100h, 00100h, 00000h dw 7 ;column of cursor hot spot in bitmap (-16 to 16) dw 7 ;row of cursor hot spot (-16 to 16) ;Курсор - стрелка MouseCursor_Arrow dw 03FFFh, 01FFFh, 00FFFh, 007FFh ;screen mask (AND mask) dw 003FFh, 001FFh, 000FFh, 0007Fh dw 003FFh, 001FFh, 020FFh, 0707Fh dw 0F03Fh, 0F83Fh, 0FC3Fh, 0FE7Fh dw 00000h, 04000h, 06000h, 07000h ;cursor mask (XOR mask) dw 07800h, 07C00h, 07E00h, 07F00h dw 07800h, 04800h, 00C00h, 00600h dw 00700h, 00380h, 00180h, 00000h dw 0 ;column of cursor hot spot in bitmap (-16 to 16) dw 0 ;row of cursor hot spot (-16 to 16) ;Курсор - прямоугольник MouseCursor_Rectangle dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh ;screen mask (AND mask) dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh dw 00000h, 00000h, 03FFCh, 02004h ;cursor mask (XOR mask) dw 02004h, 02004h, 02004h, 02004h dw 02004h, 02004h, 02004h, 02004h dw 02004h, 03FFCh, 00000h, 00000h dw 7 ;column of cursor hot spot in bitmap (-16 to 16) dw 7 ;row of cursor hot spot (-16 to 16) ;сообщения программы msgMouseFault db 'The mouse or mouse driver was not detected.', 13, 10, '$' msgAbout db 'Select mouse cursor:', 0Dh, 0Ah db ' "q" - cross,', 0Dh, 0Ah db ' "w" - arrow,', 0Dh, 0Ah db ' "r" - rectangle.', 0Dh, 0Ah db 'Press ESC to exit.', 0Dh, 0Ah db '$' .code ;Ожидание нажатия клавиши на клавиатуре ;вход ; - нет ;выход ;ax - al - ASCII код нажатой клавиши, ah - скан-код ReadKey proc mov ah, 00h int 16h ret ReadKey endp ;Инициализация работы с "мышью" ;Выполняется аппаратный и программный сброс мыши и драйвера ;вход ; - нет ;выход ;ax - результат инициализации ; - 0000h, если мышь или драйвер мыши не установлены ; - FFFFh, если драйвер и мышь установлены ;bx - число кнопок ; - 0002 или FFFF - две ; - 0003 - три ; - 0000 - другое количество MouseInit macro mov ax, 0000h int 33h endm ;Показать курсор "мыши" ;вход ; - нет ;выход ; - нет MouseShowCursor macro push ax mov ax, 0001h int 33h pop ax endm ;Спрятать курсор "мыши" ;вход ; - нет ;выход ; - нет MouseHideCursor macro push ax mov ax, 0002h int 33h pop ax endm ;установить курсор мыши в графическом режиме ;Определение курсора мыши в графическом режиме ;int 33h ax=0009h: ;BX = column of cursor hot spot in bitmap (-16 to 16) ;CX = row of cursor hot spot (-16 to 16) ;ES:DX -> mask bitmap ;Format of mouse mask bitmap: ;Offset Size Description ;00h 16 WORDs screen mask ;10h 16 WORDs cursor mask ;Note: Each word defines the sixteen pixels of a row, low bit rightmost MouseSetCursur macro Cursor push ax push bx push cx push es mov bx, [Cursor+64] mov cx, [Cursor+66] mov ax, seg Cursor mov es, ax mov dx, offset [Cursor] mov ax, 0009h int 33h pop es pop cx pop bx pop ax endm ;основная программа main proc mov ax, @data mov ds, ax ;попытка инициализации мыши MouseInit cmp ax, MouseInitOk je @@MouseInitOk ;если инициализация не удалась - вывести сообщение ;и завершить программу mov ah, 09h lea dx, msgMouseFault int 21h jmp @@Exit @@MouseInitOk: ;установить графический режим mov ah, 00h mov al, 12h int 10h mov ah, 09h lea dx, [msgAbout] int 21h ;установить курсор MouseSetCursur <MouseCursor_Cross> ;показать курсор MouseShowCursor ;командный цикл ;цикл ожидания нажатия кнопки ESC @@WaitEscapePressed: call ReadKey cmp al, 'q' jne @@1 ;"q" - cross MouseHideCursor MouseSetCursur <MouseCursor_Cross> MouseShowCursor jmp @@WaitEscapePressed @@1: cmp al, 'w' jne @@2 ;"w" - arrow MouseHideCursor MouseSetCursur <MouseCursor_Arrow> MouseShowCursor jmp @@WaitEscapePressed @@2: cmp al, 'r' jne @@3 ;"r" - rectangle MouseHideCursor MouseSetCursur <MouseCursor_Rectangle> MouseShowCursor jmp @@WaitEscapePressed @@3: cmp al, KeyCode_Esc je @@Break jmp @@WaitEscapePressed @@Break: ;завершение работы с "мышью" ;спрятать курсор MouseHideCursor ;установить текстовый режим mov ah, 00h mov al, 03h int 10h @@Exit: mov ax, 4C00h int 21h main endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д