Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     section .text
  2.    
  3.     global _mouse_install, _mouse_handler
  4.    
  5. _mouse_install:
  6.     cli
  7.  
  8.     mov bl, 0xa8
  9.     call    keyboard_cmd
  10.  
  11.     mov bl, 0x20
  12.     call    keyboard_cmd
  13.     call    keyboard_read
  14.     or  al, 2
  15.     mov bl, 0x60
  16.     push    ax
  17.     call    keyboard_cmd
  18.     pop ax
  19.     call    keyboard_write
  20.  
  21.     mov bl, 0xd4
  22.     call    keyboard_cmd
  23.     mov al, 0xf4
  24.     call    keyboard_write
  25.  
  26. mouse_user_isr:
  27.     db  0x60
  28.     mov cx, [pos_x]
  29.     mov dx, [pos_y]
  30.     mov di, 0
  31.     mov si, 0
  32.     mov word [cs:x_move], 0
  33.     mov word [cs:y_move], 0
  34.     mov bl, [buttons]
  35.     xor bh, bh
  36.     call  dword [user_subroutine]
  37.     db  0x60
  38.     ret
  39.  
  40.  
  41. _mouse_handler:
  42.         pushf
  43.  
  44.         cli
  45.  
  46.         push    ax
  47.         push    bx
  48.         push    cx
  49.         push    dx
  50.         push    di
  51.         push    si
  52.         push    es
  53.         push    ds
  54.  
  55.         push    cs
  56.         pop     ds
  57.  
  58.         mov     bl,0adh
  59.         call    keyboard_cmd
  60.  
  61.         cmp     byte [first_time],0
  62.         je      not_first_time
  63.  
  64.         mov     byte [first_time],0
  65.  
  66.         call    keyboard_read
  67.         call    keyboard_read
  68.         call    keyboard_read
  69.  
  70.         jmp     no_show
  71.  
  72. not_first_time:
  73.         mov     word [temp_mask],0
  74.  
  75.         mov     cx, [pos_x]
  76.         mov     dx, [pos_y]
  77.  
  78.         call    keyboard_read
  79.         and     al,7 ;3
  80.         mov     ah,[buttons]
  81.         mov     [buttons],al
  82.         cmp     al,ah
  83.         je      no_button_change
  84.  
  85.         and     al,3
  86.         and     ah,3
  87.  
  88.         xor     al,ah
  89.         xor     bx,bx
  90.  
  91.         push    ax
  92.  
  93.         test    al,2
  94.         jz      no_right_button_change
  95.  
  96.         and     ah,2
  97.         jz      right_button_pressed
  98.  
  99.         or      bx,16
  100.         jmp     no_right_button_change
  101.  
  102. right_button_pressed:
  103.         or      bx,8
  104.  
  105. no_right_button_change:
  106.         pop     ax
  107.  
  108.         test    al,1
  109.         jz      no_left_button_change
  110.  
  111.         and     ah,1
  112.         jz      left_button_pressed
  113.         or      bx,4
  114.         jmp     no_left_button_change
  115.  
  116. left_button_pressed:
  117.         or      bx,2
  118.  
  119. no_left_button_change:
  120.         mov     [temp_mask],bx
  121.  
  122. no_button_change:
  123.         call    keyboard_read
  124.         cbw
  125.         add     word [pos_x],ax
  126.         add     word [x_move],ax
  127.         mov     ax, [x_min]
  128.         cmp     word [pos_x],ax
  129.         jg      good_hor1
  130.         mov     word [pos_x],ax
  131. good_hor1:
  132.         mov     ax,[x_max]
  133.         cmp     word [pos_x],ax
  134.         jle     good_hor2
  135.         mov     word [pos_x],ax
  136. good_hor2:
  137.         call    keyboard_read
  138.         neg     al
  139.         cbw
  140.         add     word [pos_y],ax
  141.         add     word [y_move],ax
  142.         mov     ax,  [y_min]
  143.         cmp     word [pos_y],ax
  144.         jg      good_ver1
  145.         mov     word [pos_y],ax
  146. good_ver1:
  147.         mov     ax,[y_max]
  148.         cmp     word [pos_y],ax
  149.         jle     good_ver2
  150.         mov     word [pos_y],ax
  151. good_ver2:
  152.         mov     ax,[x_move]
  153.         or      ax,[y_move]
  154.         or      ax,ax
  155.         jz      no_change_position
  156.         or      word [temp_mask],1
  157. no_change_position:
  158.         mov     ax, [temp_mask]
  159.         and     ax, [user_mask]
  160.         jz      no_call_user
  161.         call    mouse_user_isr
  162. no_call_user:
  163.         cmp     byte [sm_flag],1
  164.         jne     no_show
  165.         shr     cx,3
  166.         shr     dx,3
  167.         mov     ax,80
  168.         mul     dl
  169.         add     ax,cx
  170.         shl     ax,1
  171.         mov     di,ax
  172.         mov     ax,0xb800
  173.         mov     es,ax
  174.         mov     ax,word [save_char]
  175.  
  176.         stosw
  177.  
  178.         mov     cx,word [pos_x]
  179.         mov     dx,word [pos_y]
  180.         shr     cx,3
  181.         shr     dx,3
  182.         mov     ax,80
  183.         mul     dl
  184.         add     ax,cx
  185.         shl     ax,1
  186.         mov     di,ax
  187.         mov     ax,0b800h
  188.         mov     es,ax
  189.         mov     ax,word [di]
  190.         mov     word [save_char],ax
  191.         not     ah
  192.         and     ah,7fh
  193.  
  194.         stosw
  195.  
  196. no_show:
  197.         mov     bl,0xae
  198.         call    keyboard_cmd
  199.  
  200.         mov     al,0x20
  201.         out     0a0h,al
  202.         out     0x20,al
  203.  
  204.         pop     ds
  205.         pop     es
  206.         pop     si
  207.         pop     di
  208.         pop     dx
  209.         pop     cx
  210.         pop     bx
  211.         pop     ax
  212.         popf
  213.  
  214.         ret   ; iret
  215.  
  216. first_time      db      1
  217. buttons         db      0
  218. pos_x           dw      0
  219. pos_y           dw      0
  220. sm_flag         dw      0
  221. save_char       dw      0
  222. x_move          dw      0
  223. y_move          dw      0
  224. x_max           dw      639
  225. x_min           dw      0
  226. y_max           dw      199
  227. y_min           dw      0
  228. user_subroutine dw      0,0
  229. user_mask       dw      0
  230. temp_mask       dw      0
  231.  
  232. keyboard_read:
  233.         push    cx
  234.         push    dx
  235.         xor     cx,cx
  236.  
  237. key_read_loop:
  238.         in      al,64h
  239.         jmp     $+2
  240.         jmp     $+2
  241.         test    al,1
  242.         jnz     key_read_ready
  243.         loop    key_read_loop
  244.         mov     ah,1
  245.         jmp     key_read_exit
  246.  
  247. key_read_ready:
  248.         push    cx
  249.         mov     cx,32
  250.  
  251. key_read_delay:
  252.         jmp     $+2
  253.         jmp     $+2
  254.         loop    key_read_delay
  255.  
  256.         pop     cx
  257.  
  258.         in      al,60h
  259.         jmp     $+2
  260.         jmp     $+2
  261.  
  262.         xor     ah,ah
  263.  
  264. key_read_exit:
  265.         pop     dx
  266.         pop     cx
  267.         ret
  268.  
  269. keyboard_write:
  270.         push    cx
  271.         push    dx
  272.         mov     dl,al
  273.         xor     cx,cx
  274.  
  275. kbd_wrt_loop1:
  276.         in      al,64h
  277.         jmp     $+2
  278.         jmp     $+2
  279.  
  280.         test    al,20h
  281.         jz      kbd_wrt_ok1
  282.  
  283.         loop    kbd_wrt_loop1
  284.  
  285.         mov     ah,1
  286.         jmp     kbd_wrt_exit
  287.  
  288. kbd_wrt_ok1:
  289.         in      al,60h
  290.         xor     cx,cx
  291.  
  292. kbd_wrt_loop:
  293.         in      al,64h
  294.         jmp     $+2
  295.         jmp     $+2
  296.  
  297.         test    al,2
  298.         jz      kbd_wrt_ok
  299.  
  300.         loop    kbd_wrt_loop
  301.  
  302.         mov     ah,1
  303.         jmp     kbd_wrt_exit
  304.  
  305. kbd_wrt_ok:
  306.         mov     al,dl
  307.         out     60h,al
  308.         jmp     $+2
  309.         jmp     $+2
  310.  
  311.         xor     cx,cx
  312.  
  313. kbd_wrt_loop3:
  314.         in      al,64h
  315.         jmp     $+2
  316.         jmp     $+2
  317.  
  318.         test    al,2
  319.         jz      kbd_wrt_ok3
  320.  
  321.         loop    kbd_wrt_loop3
  322.         mov     ah,1
  323.         jmp     kbd_wrt_exit
  324.  
  325. kbd_wrt_ok3:
  326.         mov     ah,8
  327.  
  328. kbd_wrt_loop4:
  329.         xor     cx,cx
  330.  
  331. kbd_wrt_loop5:
  332.         in      al,64h
  333.         jmp     $+2
  334.         jmp     $+2
  335.  
  336.         test    al,1
  337.         jnz     kbd_wrt_ok4
  338.  
  339.         loop    kbd_wrt_loop5
  340.         dec     ah
  341.         jnz     kbd_wrt_loop4
  342.  
  343. kbd_wrt_ok4:
  344.         xor     ah,ah
  345.  
  346. kbd_wrt_exit:
  347.         pop     dx
  348.         pop     cx
  349.         ret
  350.  
  351. keyboard_cmd:
  352.         xor     cx,cx
  353.  
  354. cmd_wait:
  355.         in      al,64h
  356.         jmp     $+2
  357.         jmp     $+2
  358.  
  359.         test    al,2
  360.         jz      cmd_send
  361.  
  362.         loop    cmd_wait
  363.         jmp     cmd_error
  364.  
  365. cmd_send:
  366.         mov     al,bl
  367.         out     64h,al
  368.         jmp     $+2
  369.         jmp     $+2
  370.  
  371.         xor     cx,cx
  372.  
  373. cmd_accept:
  374.         in      al,64h
  375.         jmp     $+2
  376.         jmp     $+2
  377.  
  378.         test    al,2
  379.         jz      cmd_ok
  380.  
  381.         loop    cmd_accept
  382.  
  383. cmd_error:
  384.         mov     ah,1
  385.         jmp     cmd_exit
  386.  
  387. cmd_ok:
  388.         xor     ah,ah
  389.  
  390. cmd_exit:
  391.         ret
  392.  
  393. new_33:
  394.         cli
  395.         cmp     al,0
  396.         je      reset_mouse
  397.         cmp     al,1
  398.         je      show_mouse
  399.         cmp     al,2
  400.         je      hide_mouse
  401.         cmp     al,3
  402.         je      get_pos
  403.         cmp     al,4
  404.         je      set_pos
  405.         cmp     al,7
  406.         je      set_hor_pos
  407.         cmp     al,8
  408.         je      set_ver_pos
  409.  
  410.         cmp     al,0bh
  411.         je      get_mouse_movement
  412.  
  413.         cmp     al,0ch
  414.         je      set_subroutines
  415.  
  416.         cmp     al,14h
  417.         je      swap_subroutines
  418.  
  419.         ret  ; iret
  420.  
  421. reset_mouse:
  422.         jmp     _reset_mouse
  423. show_mouse:
  424.         jmp     _show_mouse
  425. hide_mouse:
  426.         jmp     _hide_mouse
  427. get_pos:
  428.         jmp     _get_pos
  429. set_pos:
  430.         jmp     _set_pos
  431. set_hor_pos:
  432.         jmp     _set_hor_pos
  433.  
  434. set_ver_pos:
  435.         jmp     _set_ver_pos
  436. get_mouse_movement:
  437.         jmp     _get_mouse_movement
  438. set_subroutines:
  439.         jmp     _set_subroutines
  440. swap_subroutines:
  441.         jmp     _swap_subroutines
  442. _reset_mouse:
  443.         mov     byte [buttons],0
  444.         mov     word [pos_x],0
  445.         mov     word [pos_y],0
  446.         mov     word [x_move],0
  447.         mov     word [y_move],0
  448.         mov     word [x_max],639
  449.         mov     word [x_min],0
  450.         mov     word [y_max],199
  451.         mov     word [y_min],0
  452.         mov     word [user_mask],0
  453.         mov     word [user_subroutine],0
  454.         mov     word [user_subroutine+2],0
  455.         mov     ax,0ffffh
  456.         mov     bx,3
  457.         ret  ; iret
  458.  
  459. _get_pos:
  460.         mov     cx,word [pos_x]
  461.         mov     dx,word [pos_y]
  462.         mov     bx,word [buttons]
  463.         xor     bh,bh
  464.         ret  ; iret
  465.  
  466. _get_mouse_movement:
  467.         mov     cx,word [x_move]
  468.         mov     dx,word [y_move]
  469.         mov     word [x_move],0
  470.         mov     word [y_move],0
  471.         ret  ; iret
  472.  
  473. _show_mouse:
  474.         push    ax
  475.         push    bx
  476.         push    di
  477.         push    es
  478.         mov     byte [sm_flag],1
  479.         mov     ax,word [pos_y]
  480.         shr     ax,3
  481.         mov     bl,80
  482.         mul     bl
  483.         mov     bx,word [pos_x] ; cs:
  484.         shr     bx,3
  485.         add     ax,bx
  486.         shl     ax,1
  487.         mov     di,ax
  488.         mov     ax,0xb800
  489.         mov     es,ax
  490.         mov     ax,word [di]
  491.         mov     [save_char],ax ; cs:
  492.         not     ah
  493.         and     ah,7fh
  494.         mov     [di],ax
  495.         pop     es
  496.         pop     di
  497.         pop     bx
  498.         pop     ax
  499.         ret  ; iret
  500.  
  501. _hide_mouse:
  502.         push    ax
  503.         push    bx
  504.         push    di
  505.         push    es
  506.         mov     byte [sm_flag],0 ; cs:
  507.         mov     ax,word [pos_y]  ; cs:
  508.         shr     ax,3
  509.         mov     bl,80
  510.         mul     bl
  511.         mov     bx,word [pos_x] ; cs:
  512.         shr     bx,3
  513.         add     ax,bx
  514.         shl     ax,1
  515.         mov     di,ax
  516.         mov     ax,0xb800
  517.         mov     es,ax
  518.         mov     ax,word [save_char]  ; []
  519.         mov     word  [di],ax
  520.         pop     es
  521.         pop     di
  522.         pop     bx
  523.         pop     ax
  524.         ret  ; iret
  525.  
  526. _set_pos:
  527.         mov     cx,[pos_x]
  528.         mov     dx,[pos_y]
  529.         mov     word [x_move],0
  530.         mov     word [y_move],0
  531.         ret  ; iret
  532.  
  533. _set_hor_pos:
  534.         call    max_min
  535.         mov     [x_min],cx
  536.         mov     [x_max],dx
  537.         cmp     [pos_x],cx
  538.         jge     good_hor_min
  539.         mov     [pos_x],cx
  540.  
  541. good_hor_min:
  542.         cmp     [pos_x],dx
  543.         jle     good_hor_max
  544.         mov     [pos_x],dx
  545. good_hor_max:
  546.         ret  ; iret
  547.  
  548. _set_ver_pos:
  549.         call    max_min
  550.         mov     [y_min],cx
  551.         mov     [y_max],dx
  552.         cmp     [pos_y],cx
  553.         jge     good_ver_min
  554.         mov     [pos_y],cx
  555.  
  556. good_ver_min:
  557.         cmp     [pos_y],dx
  558.         jle     good_ver_max
  559.         mov     [pos_y],dx
  560.  
  561. good_ver_max:
  562.         ret  ; iret
  563.  
  564. max_min:
  565.         cmp     cx,dx
  566.         jle     no_swap
  567.         xchg    cx,dx
  568.  
  569. no_swap:
  570.         ret
  571.  
  572. _set_subroutines:
  573.         mov     [user_subroutine],dx
  574.         mov     [user_subroutine+2],es
  575.         mov     [user_mask],cx
  576.         ret  ; iret
  577.  
  578. _swap_subroutines:
  579.         push    word [user_mask]
  580.         push    word [user_subroutine+2]
  581.         push    word [user_subroutine]
  582.         mov     [user_subroutine],dx
  583.         mov     [user_subroutine+2],es
  584.         mov     [user_mask],cx
  585.         pop     dx
  586.         pop     es
  587.         pop     cx
  588.         ret  ; iret
  589.  
  590. end_of_tsr:
  591.  
  592. ; compiled: nasm -f win32 -o mouse.o mouse.asm
  593. ;; E-O-F  Assembler mouse.asm
  594.  
  595.  
  596.  
  597. /* snippet from bootmain.c: */
  598. ...
  599. mouse_install();
  600. for (;;) [
  601.     mouse_handler();
  602. }
  603. ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement