Выбор типа курсора мыши по нажатию на клавиши - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы