mk321

MASM

Dec 7th, 2013
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586P
  2. .MODEL flat, STDCALL
  3. ;--- z pliku ..\include\windows.inc ---
  4. STD_INPUT_HANDLE                     equ -10
  5. STD_OUTPUT_HANDLE                    equ -11
  6.  
  7. KEY_EVENT   EQU 1h ; zdarzenie klawiatury
  8. MOUSE_EVENT EQU 2h ; zdarzenie myszy
  9. MENU_EVENT  EQU 8h
  10. FOCUS_EVENT EQU 10h
  11.  
  12. RIGHT_ALT_PRESSED   EQU 1h ; Alt prawy
  13. LEFT_ALT_PRESSED    EQU 2h ; Alt lewy
  14. RIGHT_CTRL_PRESSED  EQU 4h ; Ctrl prawy
  15. LEFT_CTRL_PRESSED   EQU 8h ; Ctrl lewy
  16. SHIFT_PRESSED       EQU 10h ; Shift nacioniety
  17. NUMLOCK_ON          EQU 20h ; Num Lock w31czony
  18. SCROLLLOCK_ON       EQU 40h ; Scroll Lock w31czony
  19. CAPSLOCK_ON     EQU 80h ; Caps Lock w31czony
  20. ENHANCED_KEY        EQU 100h ; klawisz jest zwolniony
  21. FROM_LEFT_1ST_BUTTON_PRESSED    EQU 1h ; przycisk lewy
  22. RIGHTMOST_BUTTON_PRESSED    EQU 2h ; przycisk prawy
  23. FROM_LEFT_2ND_BUTTON_PRESSED EQU 4h ; przycisk srodkowy
  24. FROM_LEFT_3ND_BUTTON_PRESSED EQU 8h ; przycisk trzeci z lewa
  25. FROM_LEFT_4ND_BUTTON_PRESSED EQU 10h ;przycisk 4-ty z lewa
  26. MOUSE_MOVED EQU 1h ; mysz przesuwa sie
  27. DOUBLE_CLICK    EQU 2h ; podwójne klikniecie
  28. MOUSE_WHEELED   EQU 4h ; poruszenie kó3kiem myszy  
  29.  
  30. ;--- struktury ----------
  31. COORD   STRUCT
  32.     X   DW  ?
  33.     Y   DW  ?
  34. COORD   ENDS
  35.  
  36. MOUSE_EVENT_RECORD STRUCT
  37.   dwMousePosition   COORD <> ; wspó3rzedne X, Y kursora myszy
  38.   dwButtonState     DWORD ? ; znaczniki nacioniecia przycisków myszy
  39.   dwControlKeyState DWORD ? ; znaczniki nacioniecia klawiszy steruj1cych
  40.   dwEventFlags      DWORD ? ; znaczniki przesuwania i podwójnego klik-niecie myszy
  41. MOUSE_EVENT_RECORD ENDS
  42.  
  43. KEY_EVENT_RECORD STRUCT
  44.       bKeyDown DWORD ?  ; znacznik nacioniecia któregokolwiek klawisza
  45.       wRepeatCount WORD ? ; ilooa powtórzen kodu przy d3ugim nacionieciu
  46.       wVirtualKeyCode WORD ? ; wirtualny kod klawisza
  47.       wVirtualScanCode WORD ? ; scan-kod klawisza
  48.       UNION
  49.             UnicodeChar WORD ?  ; UNICODE kod klawisza
  50.             AsciiChar BYTE ?        ; ASCII kod klawisza
  51.       ENDS
  52.       dwControlKeyState DWORD ?     ; znaczniki klawiszy steruj1cych
  53. KEY_EVENT_RECORD ENDS
  54.  
  55. WINDOW_BUFFER_SIZE_RECORD STRUCT
  56.   dwSize  COORD <>
  57. WINDOW_BUFFER_SIZE_RECORD ENDS
  58.  
  59. MENU_EVENT_RECORD STRUCT
  60.   dwCommandId  DWORD      ?
  61. MENU_EVENT_RECORD ENDS
  62.  
  63. FOCUS_EVENT_RECORD STRUCT
  64.   bSetFocus  DWORD      ?
  65. FOCUS_EVENT_RECORD ENDS
  66.  
  67.  
  68. INPUT_RECORD STRUCT
  69.       EventType WORD ?
  70.       two_byte_alignment WORD ?
  71.     UNION
  72.       KeyEvent KEY_EVENT_RECORD <>
  73.       MouseEvent              MOUSE_EVENT_RECORD          <>
  74.       WindowBufferSizeEvent   WINDOW_BUFFER_SIZE_RECORD   <>
  75.       MenuEvent               MENU_EVENT_RECORD           <>
  76.       FocusEvent              FOCUS_EVENT_RECORD          <>
  77.     ENDS
  78. INPUT_RECORD ENDS
  79.  
  80. ;--- funkcje API Win32 z pliku  ..\include\user32.inc ---
  81. CharToOemA PROTO :DWORD,:DWORD
  82. ;--- funkcje API Win32 z pliku ..\include\kernel32.inc -----------
  83. GetStdHandle PROTO :DWORD
  84. WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  85. AllocConsole PROTO
  86. FreeConsole PROTO
  87. SetConsoleTitleA PROTO :DWORD
  88.     ;;BOOL SetConsoleTitle(
  89.     ;;LPCTSTR lpConsoleTitle    // address of new title  
  90.     ;;);
  91. SetConsoleTextAttribute PROTO :DWORD,:DWORD
  92.     ;;BOOL SetConsoleTextAttribute(
  93.     ;;HANDLE hConsoleOutput,    // handle of console screen buffer  
  94.     ;;WORD wAttributes  // text and background colors
  95.     ;;);
  96. GetLargestConsoleWindowSize PROTO :DWORD
  97.     ;;COORD GetLargestConsoleWindowSize(
  98.     ;;HANDLE hConsoleOutput     // handle of console screen buffer  
  99.     ;;);
  100.     ;;typedef struct _COORD { // coord.  
  101.     ;;SHORT X;      // horizontal coordinate
  102.     ;;SHORT Y;      // vertical coordinate
  103.     ;;} COORD;
  104. FillConsoleOutputAttribute PROTO :DWORD,:DWORD,:DWORD,:COORD,:DWORD
  105.     ;;BOOL FillConsoleOutputAttribute(
  106.     ;;HANDLE hConsoleOutput,    // handle to screen buffer
  107.     ;;WORD wAttribute,  // color attribute to write
  108.     ;;DWORD nLength,    // number of character cells to write to
  109.     ;;COORD dwWriteCoord,   // x- and y-coordinates of first cell
  110.     ;;LPDWORD lpNumberOfAttrsWritten    // pointer to number of cells written to
  111.     ;;);
  112. SetConsoleCursorPosition PROTO :DWORD, :COORD
  113.     ;;BOOL SetConsoleCursorPosition(
  114.     ;;HANDLE hConsoleOutput,    // handle of console screen buffer
  115.     ;;COORD dwCursorPosition    // new cursor position coordinates  
  116.     ;;);    
  117. ReadConsoleInputA PROTO :DWORD,:DWORD,:DWORD,:DWORD
  118.     ;;BOOL ReadConsoleInput(
  119.     ;;HANDLE hConsoleInput, // handle of a console input buffer
  120.     ;;PINPUT_RECORD lpBuffer,   // address of the buffer for read data
  121.     ;;DWORD nLength,    // number of records to read
  122.     ;;LPDWORD lpNumberOfEventsRead  // address of number of records read
  123.     ;;);
  124. FlushConsoleInputBuffer PROTO :DWORD
  125.     ;;BOOL FlushConsoleInputBuffer(
  126.     ;;HANDLE hConsoleInput  // handle to console input buffer  
  127.     ;;);
  128. WriteConsoleOutputCharacterA PROTO :DWORD,:DWORD,:DWORD,:COORD,:DWORD
  129.     ;;BOOL WriteConsoleOutputCharacter(
  130.     ;;HANDLE hConsoleOutput,    // handle to a console screen buffer
  131.     ;;LPCTSTR lpCharacter,  // pointer to buffer to write characters from
  132.     ;;DWORD nLength,    // number of character cells to write to
  133.     ;;COORD dwWriteCoord,   // coordinates of first cell to write to
  134.     ;;LPDWORD lpNumberOfCharsWritten    // pointer to number of cells written to
  135.    ;;);
  136. ExitProcess PROTO :DWORD
  137.     ;;VOID ExitProcess(
  138.     ;;UINT uExitCode    // exit code for all threads  
  139.     ;;);
  140. wsprintfA PROTO C :VARARG
  141.  
  142. ClearScreen PROTO
  143.  
  144. ;--- biblioteki ---------
  145. includelib .\lib\user32.lib
  146. includelib .\lib\kernel32.lib
  147. includelib .\lib\masm32.lib
  148.  
  149. ;--- sekcja danych ------
  150. _DATA SEGMENT
  151.  
  152. hout dd ?
  153. hinp dd ?
  154. rout dd ?
  155. komunikat db "Naciskaj klawisze (pod spodem powinny sie pokazywac, albo wywalic program):", 13, 10, 0
  156. rozmK dd    $ - komunikat
  157. YX COORD <>
  158. zapis INPUT_RECORD <>
  159. nzdarz dd ?
  160. symb db ?
  161.  
  162. _DATA ENDS
  163. ;--- sekcja kodu ---------
  164. _TEXT SEGMENT
  165. start:
  166.     push    STD_INPUT_HANDLE
  167.     call    GetStdHandle    ; wywołanie funkcji GetStdHandle
  168.     mov hinp, EAX
  169.    
  170.     push    STD_OUTPUT_HANDLE
  171.     call    GetStdHandle    ; wywołanie funkcji GetStdHandle
  172.     mov hout, EAX
  173.    
  174. ;--- tworzenie konsoli ---
  175.  INVOKE FreeConsole
  176.  INVOKE AllocConsole
  177.  
  178.  invoke WriteConsoleA, hout, OFFSET komunikat, rozmK, 0, 0
  179.  
  180.     powt:
  181.         INVOKE FlushConsoleInputBuffer,hinp ;czyszczenie kolejki komunikatów
  182.         INVOKE ReadConsoleInputA,hinp,OFFSET zapis,1,OFFSET nzdarz ; odczyt komunikatu zdarzenia
  183.  
  184.         ;--- sprawdzanie typu zdarzenia
  185.  
  186.         cmp WORD PTR [zapis.EventType], KEY_EVENT
  187.         je @F
  188.             jmp powt
  189.        
  190.         @@:
  191.         ;--- komunikat od klawiatury ---
  192.         klaw:
  193.             cmp (KEY_EVENT_RECORD PTR [zapis.KeyEvent]).bKeyDown, 0 ; porównanie z zerem
  194.             jne @F
  195.                 jmp powt ;jeśli nie ma naciśnięcia
  196.             @@:
  197.                 mov AL,(KEY_EVENT_RECORD PTR [zapis.KeyEvent]).ASCIIChar
  198.                 mov symb,AL ; zapisywanie znaku
  199.                 mov YX.X, 0
  200.                 mov YX.y, 1
  201.                 INVOKE WriteConsoleOutputCharacterA,hout,OFFSET symb,1,COORD PTR [YX],rout ;wypisywanie znaku
  202.     jmp powt
  203.     ; na powtórzenie
  204.  
  205. ;--- zamkniecie konsoli
  206. kon:   
  207.  INVOKE FreeConsole
  208. ;----- wywołanie funkcji ExitProcess ---------
  209.  INVOKE ExitProcess,0
  210. _TEXT   ENDS
  211. END start
Advertisement
Add Comment
Please, Sign In to add comment