找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 11732|回复: 3

[半原创]PS2 Mouse驱动 and 测试程序(DOS)

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。8 [8 D$ \/ s4 ^/ L5 Y" b
8 g3 H9 [) z- T# h0 U8 z% K, X
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;. _, L& C' I5 J1 [# R1 I' b8 W" x
  2. ;          Ufoit PS2 Mouse test program   Ver 0.94 J9 Q8 [1 E/ W! {
  3. ;                                         By Bini.Yi 易祝兵* m- H, F2 X- Y1 m! }$ h; T
  4. ;                                         http://www.ufoit.com 计匠网+ l* g. g* u/ v- I
  5. ;                                         2002/04/06 YYYY/MM/DD
    ( i! X6 `/ u; `5 }  z6 ?  j7 f) P
  6. ;
    8 T/ m# |; `# n  K+ R6 B2 ~0 R
  7. ;         
    - u% j' P4 N9 \; ~$ Z3 F
  8. ;          This program  test the mouse button  click and move.
    & C% h5 A4 T! `4 Z; B
  9. ;& F6 ?* p: K+ n% \) H' w+ x

  10. ! e9 a/ s8 \- G' }+ H( ~
  11. .model tiny
    : v$ U' Q* M4 s. a5 P- K
  12. .586( \! J4 h6 B$ B/ @- H- m0 M3 s4 C
  13. .code9 Y: j6 S6 B4 \
  14. .stack  100h3 x( \) f5 D. F1 z& d$ `
  15. .startup
    - K9 t. V) {- j- d8 t$ D4 I
  16. pusha! v/ q9 o5 x& [, M4 ~8 K/ v
  17. mov ax, 3533h
    / F  {5 u/ K( W$ L1 _' h  s; q1 o' |
  18. int 21h
    / H6 ~; |( Y" y
  19. mov word ptr cs:[old331],es
    ; j) n" o6 n( Y$ U3 i* r! I( \
  20. mov word ptr cs:[old332],bx1 f& y6 c5 Y+ Z& g( r" C' R5 y+ Y
  21. mov ax, 3574h
    ) \. Y, O1 [+ M9 Q- a: ^- X
  22. int 21h% n3 v% N+ N+ r# O7 F( ~) H
  23. mov word ptr cs:[old741],es
    " s6 l8 p* H8 S* x, C; v7 a9 P  M7 z
  24. mov word ptr cs:[old742],bx
    4 L' k7 g+ c) @  ^
  25. popa- a1 a% e/ r8 w3 e- M- i- {
  26.         call    memmouse
    1 @5 P0 {$ x1 x" `7 N' t4 \8 ?; J
  27.         mov ah, 00
    + S9 @1 N6 w# @
  28. mov al, 03; d$ W; J2 l$ [2 t! r4 f* P8 x
  29. int 10h+ A2 n: |* N. o2 P9 m3 T! @0 I# P& }
  30. mov ah, 06
    . A" f' z/ V$ r$ i- ]3 h
  31. mov al, 02 N  A) e5 h4 @) I8 A
  32. mov cx, 0- ]% Y, ]+ u5 K  \5 \4 k5 x: L
  33. mov dh, 24
    9 L* }1 }3 _& z4 j! l9 d3 e% [1 N
  34. mov dl, 79
    . z) b  }  X  x# j
  35. mov bh, 07h5 R2 I, n2 L7 B* f+ _1 o7 J
  36. int 10h5 A# u) k) Q; a) k+ N! n& E
  37. mov ax, 0000
    * E  W5 |  B1 u# f
  38. mov bx, 0002
    % B' m& w6 L) h8 M2 X
  39. int 33h
    - R5 P4 b9 h4 @1 F" b- O
  40.         cmp     ax, 0000           ;if no mouse drive install
    " n+ M8 P5 X4 J3 E: b
  41.         je      errormsg           ;show error MSG' U2 ]" D1 J' f3 E$ u5 l, K- ^" D
  42. mov ah, 02- j8 Q. q3 k, k! u; l- c& g" {8 P
  43. mov bh, 00  J; C' Y4 i$ e+ {9 b! i, x* t
  44.         mov     dh, 25             ;Move point out screen
      C; a2 d( u2 [! N
  45. mov dl, 798 e+ {' K  n8 D; K
  46. int 10h7 H) }% J. _9 O; C: S# m' j2 l! o% h
  47.         call    showmsg            ;Show info
    $ w: V( l; L5 V% l3 L' l2 K
  48. mov ax, 0001
    ( N, \+ V' H2 l8 `) w8 {" Y, C
  49. int 33h
    3 D* }$ x* a: C$ z% K! |
  50. ; mov ax, 000ah
    0 J' e9 _$ r1 Q7 t
  51. ; mov bx, 00000 `! {+ M  S" n$ S; q, k2 a
  52. ; mov cl, 0h
    : s" `0 @7 g- ^2 [
  53. ; mov ch, 0F0h: T2 B1 N, M, \7 i7 f" h; t2 h, C- b
  54. ; mov dl, 0h
    1 P! y: b8 G5 Z+ |; _
  55. ; mov dh, 0F0h) J6 Y( O- P" u4 k0 J$ e4 h
  56. ; int 33h7 C8 X) [: W# x6 \* K- c
  57. mov ax, 0004h* Y# @! y6 f2 g0 @' z
  58. mov cx, 0319
    7 N: Q9 m1 B- G: E$ m& \! ]9 R
  59. mov dx, 01035 D# G0 i/ ?: l+ V3 n8 t
  60. int 33h0 n) E/ t/ |5 s2 |6 T6 Z9 H/ [
  61. casemo:                           ;Case button click and point move ! i  K/ b! b6 n+ @% |( S9 L
  62.         mov     ax, 000bh         ;and keyboard press* w' }, F( l. h# g/ f
  63. int 33h" p( H# C4 F- S  e# N
  64.         cmp     cx, 00h           ;if point move....X
    # @! \) A! v+ N! A+ D
  65. jne xmov* Z+ K& M, ?3 }. N, s. }
  66.         cmp     dx, 00h           ;if point move....Y
    0 t: o/ l$ L$ n! I4 A. a+ c+ t
  67. jne ymov
    6 m1 `, I7 e  P  }1 Z% k* v3 ~4 ~
  68. xymovend:                         ;X.Y move end
    ; g8 e2 z: T& ?5 ~" B  K
  69.         mov     ax, 0003         
    # @* j7 a' W- v$ A
  70. int 33h! b! `+ I7 f( p, P9 W* O" K
  71.         cmp     bx, 0001          ;if left button click  show ON
    * a  V. G2 ^" u* _- l7 J: ]0 N
  72. mov si, 1828$ i. o1 g3 s- Z, `9 p
  73. je listl2 w! Y/ P- @% Q
  74. mov si, 1828# s: s9 c) M/ _- w. U# @
  75.         jne     nlistl            ;if left no click show OFF  g; l4 N  j5 O( R
  76. testr:& ^2 r0 L! x- a) r( s( u
  77.         cmp     bx, 0002          ;if right button click show ON  d/ x# }) E1 q% S0 C" V& M! p
  78. mov si,1842
    * K) t5 Y0 m" j" I2 C& f
  79. je listr
    8 |8 `) |4 y) ~5 c/ c! b0 P1 L
  80.         mov     si,1842           ;if right no click show OFF
    - a5 ?  h1 T! G1 q
  81. jne nlistl
    ! d4 }3 R1 H( t
  82. casekey:0 I0 @0 u6 u; _3 O
  83.         mov     ah, 01            ;if any key press jump check/ E0 Z8 X9 w4 B
  84. int 16h
    . d6 O9 A' u) s) u6 x/ |
  85. jne kpress
    " t) o8 W, }: L* f: r: I
  86.         mov     al, [chkl]        ;check x flag+ m% q& d( W' Z; j4 ~$ v1 \- J5 |
  87. cmp al, 02h
    4 h, c  _) M7 A7 G; ^2 [- u
  88. jnb chkok
    0 N' e/ h8 t) e7 E
  89. jmp casemo
    - x$ k% w2 q9 v4 f7 y. t
  90. xmov:                             ;if X moved, get the X flag+13 M% L6 n+ Q( L' \; J* ?
  91. mov al, [chkl]
    + P+ L, z/ J1 ~3 A$ q, R. r
  92. inc al
    ; D5 {4 c2 z* q) k% t) O
  93. mov [chkl], al% Y; W7 c7 I6 Y
  94. call passok: M( ?2 g6 L7 E
  95. jmp xymovend0 t5 t1 x% i2 w. p# ^; d. w/ n
  96. ymov:                             ;if Y moved, get the X flag+1  |+ ?2 y) J9 g4 h. i* l% `
  97. mov al, [chkr]
    + }& x6 A. z& V$ a& d9 N5 e
  98. inc al
    # ]/ \9 }! P# @6 M) a& R
  99. mov [chkr], al
    7 Y, W$ o8 K7 S" Y; o5 U7 P
  100. call passok
    * R  b8 |1 E4 @
  101. jmp xymovend6 r1 I0 F5 x+ y! [$ I

  102. ' z5 X  d7 B+ Y1 \4 |; \0 W
  103. passok proc near
    - R- Y$ _- A, U$ h3 E
  104. mov al, [okcheck]
    3 R* f: |' e& a8 b" I2 j& q
  105. cmp al, 1
    / j- Y+ ]; `$ R; O( w
  106. je let0; u% S% L  M7 S" o
  107. jmp passret
    " S, ~2 ]/ ?* t( w- A6 x
  108. let0:
    , ]* ^' g3 [( X. Y6 i. J- o: r9 c# l
  109. mov [pass], 1
    : h' v) d! Y* L. A2 @# E
  110. passret:+ Q$ @5 p9 O! I; }7 o' a
  111. ret! F  f5 ]4 r8 l& u# ]: z0 k0 z2 m
  112. passok endp 3 P' k9 }. E/ Y7 k0 H

  113. & Z) C, }. n7 C" U# L
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS! c& u& Y# |( f2 |# U
  115. mov al, [chkr]- Z9 i' l7 o- R3 F* A& F; o8 v/ ^
  116. cmp al, 02h) L) J( B7 q- b
  117. jb casemo2 O5 o$ O* i% s
  118. mov al, [lk]
    : g; w" Z, X# e& m
  119. cmp al, 1
    . m) u% Q1 Z+ x& h/ K6 W: F
  120. jne casemo
    , C) U1 M* W' `$ C1 B
  121. mov al, [rk]9 I* L  ]; T7 K5 {, R
  122. cmp al, 1
    8 l7 u5 _. N" t' z# j, [
  123. jne  casemo
    5 H" P: D3 P- O' q  _7 ^. r
  124. mov [okcheck], 1
    0 R0 X+ y  D2 D. Z# [
  125. mov al, [pass]
    ' j2 ^6 E2 f, m2 t% O% E6 V' m# k
  126. cmp al, 1$ v# W% S! o( s
  127. jne  casemo* }: R! ?/ p; w) s& S# p: m
  128. mov ax,0002h
    " D7 @1 \3 W% A& h
  129. int 33h8 D/ r7 b9 c/ S7 X3 H
  130. call cleascr% X  y/ J0 ]/ I" F( V. B" d( k

  131. 7 @% W2 G3 S. j+ L- }2 k
  132. call oldint9 B& R% B6 f3 g* s/ n! s
  133. mov ax, 04c00h7 q1 c( i9 r; `( f7 o4 a
  134. int 21h$ I( s9 Y) E. t1 K. }- L

  135. $ f! L" [0 V6 u5 O
  136. okexit:4 X6 _9 d* w4 R0 S
  137. mov ah, 4ch
    ( D( h1 \9 ~; I5 M2 C
  138. mov al, 0: {' \. `  |$ L" D7 K8 \3 F  _; a
  139. int 21h% f0 r3 n& O, S8 P  k
  140. listl:                                 ;Show ON
    0 z' t- c+ A# a( _
  141. pusha4 O# z' @$ z3 y1 |
  142. mov ax, 0b800h
    ; w) D6 _" b+ {; n4 Z" N% @  F
  143. mov  es, ax
    & w- L" ^7 }4 @: r# ^
  144. mov ah, 47h/ l9 B* C" H0 p" _' S+ d. R
  145. mov al, 20h
    4 ~2 ^0 O; e4 @/ U3 a( F
  146. mov es:[si], ax
    3 X$ n3 J: D- W5 k  U$ W% p
  147. add si, 02
    . ?8 ]- E4 f7 D$ Z3 P; i1 x* N
  148. mov  al, 4fh
    + P+ v: h, u2 X; G: E
  149. mov es:[si], ax0 j6 n; ?" o" \* M; W" ?
  150. mov al, 4eh
    9 u, k6 w7 ^( `' y* P; ~
  151. add si, 02
    ) g% I, _* H7 {6 u4 U1 t& }
  152. mov es:[si], ax
    % a* A3 @# f2 r$ e7 i. Z
  153. mov [lk], 11 Z( G4 p2 e$ A, \& G+ |$ B. |
  154. popa# {# T' E: |5 {9 G. ]' @
  155. jmp testr$ U* A* ?4 M5 d+ R. I
  156. listr:                                 ;Show ON! u4 s, ^" {3 _' X6 j6 S
  157. pusha! l/ U. s* f% h) C" S
  158. mov ax, 0b800h' F; B6 A4 l6 l, p+ {
  159. mov  es, ax
    . H* ^2 x1 E: I+ }! Y7 J0 \/ B, f
  160. mov ah, 47h4 j. Z$ K4 \/ q3 N
  161. mov al, 20h
    1 y# T. Q+ \8 P5 G; y
  162. mov es:[si], ax+ p# i. W; o1 G2 q; U( z4 C
  163. add si, 02
    - _3 j6 Y& Z) _1 p# L. A( z3 O& \
  164. mov  al, 4fh  s* i$ N+ S1 |  B$ P
  165. mov es:[si], ax' s$ p/ p$ V: O% K- l# n
  166. mov al, 4eh
    + w8 }" z1 o. q, a: `, A3 M: v
  167. add si, 02
    ; a3 o) a% z* Z
  168. mov es:[si], ax
    ! i7 e7 y4 w  O, P  n) J0 T
  169. mov [rk], 1  s; l7 X8 W1 C6 }$ A2 X1 F; F
  170. popa
    - V8 u! j: G9 X2 R" K
  171. jmp  casekey
    8 g% ]" a; d/ w, J' T

  172. 5 T" P1 t6 ?% d, x; ^
  173. nlistl:                              ;Show OFF
    # u& a& X9 l4 q/ C$ \  R6 a0 y
  174. pusha   
    - V6 [+ `" z7 a, Q% w1 m* M6 [; C
  175. mov ax, 0b800h
    6 C( V% s  w; ]( t+ v
  176. mov  es, ax
    4 ~; H& s1 F  L2 ?8 |1 S
  177. mov ah, 17h
    " _  ?& q# {" I
  178. mov al, 4fh
    8 S6 V+ |% u* m- R3 o8 L( t
  179. mov es:[si], ax4 s; U; P' _! G* ^5 G& X" S/ e
  180. add si, 02
    ! y: Q' y! a7 B. ?1 w1 @
  181. mov  al, 46h
    / c+ @1 q  ~* W9 i! J! v, k0 H
  182. mov es:[si], ax7 d+ {: ]1 @8 p" Q5 e
  183. mov al, 46h
    . \8 g( J/ o0 b" i
  184. add si, 025 W3 m( ?3 U  m" P3 V
  185. mov es:[si], ax; K5 Y  A0 L% }. w8 l7 r4 X8 U
  186. popa, T9 s! r- _$ R, I
  187. cmp si, 1840
    : @) l% Y4 J1 T7 y
  188. jae casekey$ e* Q& q$ ?9 }6 y6 `
  189. jmp testr
    $ J8 w( E& ^2 ~- V8 ]7 o9 o2 O

  190. 1 {2 g0 x% O5 l
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    . ~+ O$ F+ R2 |# F7 L2 Y( d
  192.         cmp     ah, 01h             ;and return a error
      K* c1 u* i& @& v8 x: [, A, Q" t  m
  193. je exit1
    . [6 \; ]2 X- j: k. Q# Y# e
  194.         mov     ah, 0ch             ;if press other key then clear  b$ n/ O4 L! S: b/ R( h  R' P: g
  195.         mov     al, 00              ;keyboard buffer
      j+ G9 I: W% M3 i6 L5 L, E9 @
  196. int 21h9 x6 n& i* Z& y4 W
  197. jmp casemo " [: s% i) m' o
  198. ! V8 r2 d- l- @5 y  b* a* j4 b+ J
  199. errormsg:                           ;if mouse driver no install
    & m4 c4 E2 [4 q- m* b
  200. call oldint2 t. \* g7 I. I& K0 n( Y
  201. lea dx, offset emsg
    8 [. }1 v, _( ~. y3 _: X* ~* M
  202. mov ah, 09h
    1 D$ j5 {3 E/ s* C% \" N' W
  203. int 21h& o7 M; S8 \; _7 M* W
  204. mov ah, 4ch" ^; f9 X4 K2 m( B4 c. H3 S0 t
  205. mov al, 2# H2 v" }4 \+ D, L+ t' B  W, o
  206. int  21h
    - z7 u* B* B/ h% w
  207. # S6 b4 \6 E8 D; W$ H8 y: ^: U) T
  208. exit1:                              ;error exit
      ~3 Q% j/ m" J6 b' F
  209. mov ax, 0002h' s/ o( a& b0 k# |2 i8 J
  210. int 33h
    4 ]$ N0 D" P0 W4 b2 |7 l
  211. call  cleascr
    # i5 T! o1 U: Y) O( g9 A) f  i/ c
  212. call  oldint
    ) @0 x4 P$ j1 M$ f, ~7 y8 P
  213. mov ah, 4ch
    ) A* S/ q1 B! k, H4 @
  214. mov al, 01
    " A! }" ?: v# p  v& @
  215. int 21h
    # N0 U/ ]: [6 G2 E' c" C. \
  216. * |# U9 t* H4 b; U& h( J& R
  217. cleascr proc    near                ;clear screen+ j; S, w: W" ~' d. @- L$ y
  218. pusha( i* c; o( Q, T  y9 g# T1 U
  219. mov ah, 06
    * O' y/ L4 i! q- C
  220. mov al, 0
    " k! H0 Q) c4 o& x) W
  221. mov cx, 0
    1 ?5 F# i6 k. W7 m$ ~5 H
  222. mov dh, 24' A( c, q$ G( E4 p) C" r, A4 u
  223. mov dl, 79
      a4 Y4 C& b+ r+ |+ w
  224. mov bh, 07h; ^) s. ]' T, Z2 [0 v9 V# D" A, y
  225. int 10h5 z. U9 \" q* J# q) e* }
  226. mov ah, 02
    + G3 T8 C& H' |; _) u$ a
  227. mov bh, 00" F4 b! T0 y* h1 u0 _, Y$ c
  228. mov dh, 0& A. f4 }9 j6 C0 V3 i  ]( }! F
  229. mov dl, 04 v; L$ r: d/ M( x
  230. int 10h
    ! I) m" g- l. G+ x' W
  231. popa; p6 I6 D8 |/ D
  232. ret
    ! E" T+ \4 ~: n! V# s) `& A
  233. cleascr endp# W6 i$ {3 m4 P$ B, S* I

  234. , F' _: E- W( F) W
  235. showmsg proc    near               ;Show info
    ' `# n+ _+ ~: }( o0 |  B  @% s( E- o  W
  236. pusha; k8 \, _% A5 G/ a3 f2 g: N
  237. lea di, offset showms
    & ~5 V6 a2 F  r; C
  238. mov ax, 0b800h
    ( V1 |4 ^6 Q4 E, H5 K
  239. mov es, ax) _0 b6 n* D8 G( q0 ~0 A* l
  240. mov si, 0
    ! h% {2 w* ?& \
  241. mov cx, 480) r; ^; W) d) ~! E# ]; X8 _
  242. mov ah, 07h" b* z- ^; D* F) o
  243. @@:
    8 w# @, B8 n* g
  244. mov al, 20h0 u8 W: Q0 _/ m$ A7 B
  245. mov es:[si], ax
    ( _4 `; O8 h+ ]3 o/ v* m3 n' h* A
  246. add si, 2
    $ }- O3 Q0 R' ~" U1 L
  247. loop @b
    - ~) n  n5 T' z7 b
  248. mov cx,880+ W- r9 k5 u7 `. N* L
  249. @@:8 P6 a3 m  R' }8 [' g5 z, j: i7 v
  250. mov al, [di]7 l1 P# C9 ~* ^5 L& H
  251. inc di- x* X7 o& i5 w& s. d2 R  W( [' D
  252. cmp al,20h) J. B. |: R& \+ u; U* b
  253. je showch1. ^8 U7 o; U8 F
  254. mov ah, 17h- G2 K( C: }( C# i. S
  255. jmp showch3
    + u: g' U! S! Z. u8 |
  256. showch1:
    " c/ A% s3 h7 B# H- q
  257. mov ah, 07h + L* e+ _! P* k& I' h
  258. showch3:8 f2 r& G. E' M! e
  259. mov es:[si], ax, ]; @$ _! s  e6 ~- V
  260. add si, 29 T2 Q  m! c5 I" g  a
  261. loop @b  \9 o8 @* B' U" }
  262. popa
    " @0 Z- u7 Y+ }+ x7 p% h$ ~
  263. ret1 R8 C* x) y# M& w/ H0 X& z  a
  264. showmsg endp
    4 O5 f9 ~* b0 a8 a+ w7 }

  265. ) X3 S( W7 ?) V8 _% A
  266. oldint proc
    2 o! U8 Z% {1 Y5 w
  267. pusha
    - q* T# g, \8 m; \2 o2 X9 e
  268. mov ds, word ptr cs:[old331]
    , {# V: T: l# x# Q+ E! ?  W, L# C
  269. mov   dx, word ptr cs:[old332]
    7 f) G3 d. |0 b& V' Y, W
  270. mov ax, 2533h
    , V1 t7 u  }. j$ I
  271. int 21h3 F  `3 p3 f+ q7 z$ z# q
  272. mov ds, word ptr cs:[old741]' F! \  J4 h+ o+ g, d* O6 A' ]
  273. mov dx, word ptr cs:[old742]/ L7 ?4 \# ~: M' g) }
  274. mov ax, 2574h
    4 U, i( s* ^1 C- E$ j6 j
  275. int 21h: D9 L6 Q- e, K1 E' S  g
  276. popa( Z. v' C. Y; b
  277. ret
    % {7 k. [2 t8 N# E' k9 B
  278. oldint endp
    3 n3 [9 W% ?. f4 @" I# J4 I( g
  279. 8 j% r) M: k6 Q! V- K
  280. memmouse        proc
      t4 v" Q) M4 b3 K) c& z! |. V
  281.         xor     ax,ax/ q% F# `6 v" W2 d+ c
  282. int 33h
    8 \. ]+ Z' g+ D* q5 p0 r( C1 ]
  283. cmp ax,0ffffh
      R2 r* ~' A  B5 ]- R
  284.         jne     not_loaded
    , M9 w) C4 m+ A* G& W. d
  285. mov [memcopy], 18 n) E) C. x, E. ?
  286. ret
    ) g1 T. X; R4 C: u( Q9 p& x
  287. 9 N8 j5 p/ ]! J: |- y2 s
  288. not_loaded:
    6 c, A5 g; @" ~4 e
  289. + Q) p; v0 O( O/ ~: m& X5 w" V5 k2 a
  290.         mov ax,2574h* I7 M& s7 }2 f& p, }
  291.         mov dx,offset new_isr
    , J1 Q, W% E! ^4 Q1 Z0 C
  292.         int 21h
    ; \9 @9 n! `  u+ z/ {
  293. * h' b% e( h6 U" @1 o0 m& Y( f
  294.         mov ax,2533h
    , }) J4 s8 u' M2 n
  295.         mov dx,offset new_33/ F/ I2 [8 }$ t% r: j, \
  296.         int 21h
    8 H& D/ S- [- u, g

  297. 1 E. [9 Q0 l% |
  298.         cli
    - B. N1 j& b6 o2 U$ I

  299. 1 {! p2 g4 Q* ~) v) t! @: c
  300.         mov bl,0a8h
    / j+ ^/ T: t* O" X7 ~- _: ^
  301.         call keyboard_cmd
    # {2 _, N! @3 H5 Z. f' ~. V- ~
  302. 1 c; m& z9 T0 a) |: Z+ D/ U2 {
  303.         mov bl,20h
    5 m& \" V  F$ v8 D. j6 S9 ?
  304.         call    keyboard_cmd
    , D* K$ Q' R  i* T$ ?' \) o+ O$ U
  305.         call    keyboard_read- g7 I# r# h# A6 x: F
  306.         or      al,2
    $ k7 }  R: D: K- i3 u/ U, H7 e/ F* y
  307.         mov     bl,60h( M+ S: z! }  O% q
  308.         push    ax
    0 U% `# ?5 _% e$ ~) e
  309.         call    keyboard_cmd* _* P7 l) A% q# l, Z# L. ^6 }9 L
  310.         pop     ax' `4 C' [& e  o8 ?1 V0 q9 h
  311.         call    keyboard_write
    7 i0 _' z* M. k
  312. 9 M9 y+ E4 |4 t5 U
  313.         mov     bl,0d4h
    $ n' V0 G' |# }, t5 i$ H8 z
  314.         call    keyboard_cmd% S. s/ Z, {1 e* c
  315.         mov     al,0f4h
    5 _( |8 d9 P" u- y3 C
  316.         call    keyboard_write$ X3 g7 I. ^+ D6 z/ z, j
  317. * b1 H. v: G0 o/ m9 s( l
  318.         sti
    ; X, t. W/ ]' b0 ?$ O
  319.         ret
    ; Z  Q! q$ a, a% h5 S/ R) a; M
  320. call_user_isr:" t  t+ f; F* u; ~( y
  321. db      60h( b, V# s- q0 T. r  c7 X; U+ y
  322.         mov     cx,cs:[pos_x]
    1 S$ o' G( o1 k+ `
  323.         mov     dx,cs:[pos_y]
    + ]2 h9 P' \: t7 g  ?* w
  324.         mov     di,0 ;cs:[x_move]
    3 |% y% w' G/ L" ?
  325.         mov     si,0 ;cs:[y_move]4 g( i& H. [4 u" e
  326.         mov     word ptr cs:[x_move],0- X7 R$ P8 m$ F: N! P
  327.         mov     word ptr cs:[y_move],0
    : q/ R5 {3 b, g
  328.         mov     bl,byte ptr cs:[buttons]; N$ p9 U9 D5 J6 \+ W9 u$ d2 P" {
  329.         xor     bh,bh
    $ J% i8 g& Z2 S* w
  330.         call    dword ptr cs:[user_subroutine]
    5 ?4 ?( e: D! C
  331.         db      61h
    6 [5 l" e' z2 u* I  \# J6 |
  332. ret
    7 z$ c+ ?  M% [' e1 P
  333. new_isr:
    - z- I/ G5 k: d3 a; j) H' R9 n
  334.         pushf/ o; H9 i/ ?: p! `4 G/ q: ]- z, |
  335.         cli
    4 [; C& z; {- D/ P; W: d2 [* Q
  336.         push    ax
    - f& s( W/ G8 l- E
  337.         push    bx8 e& d0 ?" S0 x/ O
  338.         push    cx
    1 o, t3 [9 b" R3 r3 {5 y) Y
  339.         push    dx
    , e' R4 }. l+ ~5 }% ]8 K+ T% {* e
  340.         push    di
    : i5 v) S+ h' `! {* Y
  341.         push    si
    - C8 F1 x- z, W! C0 v
  342.         push    es! h, g8 I5 Z! d5 R
  343.         push    ds3 P( z8 a# |& a

  344. : N# U; M' A! A* o( I! P0 \5 c( ?! ?
  345.         push    cs
    + O8 T/ ^. q/ ^6 ~; E
  346.         pop     ds
    $ d+ I$ X/ k( A/ r: ~
  347. 3 {3 Z+ N4 e2 A8 o; p
  348.         mov     bl,0adh
    % v1 y% Y  A( y8 _# N4 I
  349.         call    keyboard_cmd
    & X9 a1 D. W/ e0 M  ?
  350. ' W3 u( f( f+ R6 L1 `- m7 ^+ B
  351.         cmp     byte ptr [first_time],0' z4 \& m# s5 K( r9 S' c
  352.         je      not_first_time
    $ o) ?% m0 B, R( i* {1 u
  353. " K0 k+ j# W$ l" {7 S! T4 N
  354.         mov     byte ptr [first_time],0$ N, H5 G$ m; Y9 l  }+ u' d- `
  355.         call    keyboard_read
    % J7 @5 g0 L" [1 t3 @4 e
  356.         call    keyboard_read. Q/ C& q9 i" b' e' P6 g. h
  357.         call    keyboard_read# G5 @3 A* Z* Z5 l
  358.         jmp     no_show5 m( H1 `$ [/ M" o; z9 H; Y

  359. : {, j; B: F. Z; N3 t- w
  360. not_first_time:
    8 ], Y9 l- l( t3 k2 o) s5 x. f: x+ t
  361.         mov     word ptr [temp_mask],0
    * h% S2 Q5 z% A; F, Q, Y0 N

  362. ; F5 C) \9 z3 F  \$ ^0 |, z
  363.         mov     cx,[pos_x]
    2 O3 h5 j9 q) G% p  s8 T$ T
  364.         mov     dx,[pos_y], W! K8 b0 E. |2 `+ \+ R+ W* _
  365. " ?& J* X* [  n9 ^  ?% o& E" s
  366.         call    keyboard_read
    $ {8 h# O: ^5 T
  367.         and     al,7 ;3' ?; @8 ~: K! h6 K/ _- r9 z
  368.         mov     ah,[buttons]0 d) g( j. N( |: M6 I
  369.         mov     [buttons],al
    ' o1 O2 B  A: d6 |
  370.         cmp     al,ah$ a8 d: c0 @0 n- ^1 w. O
  371.         je      no_button_change
    ' W% y: E7 O$ ]# ^; w) |
  372.         and     al,3
    ) q. P- }1 a7 b# B7 B1 F
  373.         and     ah,39 p0 F7 o" B" p% j/ n; u" n
  374.         xor     al,ah4 [6 B# _& |0 ?9 d4 V
  375.         xor     bx,bx
    1 X: G; Q4 F" n0 t5 J- g) {6 G  @
  376. * o/ P2 q9 K. G; l  L& x
  377.         push    ax) ^9 t* H- }" j# E
  378.         test    al,2
    - N& H3 p9 U& s8 C$ C- [% ~
  379.         jz      no_right_button_change& O! ^" M# _7 Z/ I4 A. o: J
  380.         and     ah,2, Y8 K+ J2 I" ?% t" [6 F. A* ?
  381.         jz      right_button_pressed( a5 ]2 n: d; ~( I1 X% C  l
  382.         or      bx,164 r7 d( k6 S( |! c1 M/ B' U! u
  383.         jmp     no_right_button_change& H( @$ J* x' C% I( U
  384. right_button_pressed:
    + v; a0 |2 U- Y" e8 p6 }
  385.         or      bx,82 J) M5 E9 O  q/ U7 w& T
  386. no_right_button_change:
    $ x6 _/ M8 W. E# z
  387. - b8 A  I/ h2 z& O
  388.         pop     ax
    5 {6 ^4 Z9 S8 i1 J5 `9 v+ Z

  389. & S9 u; j9 D6 l1 t
  390.         test    al,1
    : q/ K+ P+ I) |6 L
  391.         jz      no_left_button_change; t" e1 i" O/ z$ t0 M
  392.         and     ah,13 z0 c8 _, n. T7 E( Q; ~, v
  393.         jz      left_button_pressed: w. p2 ]4 x8 }/ Y. E; ^" G
  394.         or      bx,41 f, s/ C! l4 ^
  395.         jmp     no_left_button_change
    % A  a  o9 n5 G" w  `
  396. left_button_pressed:
    ( @9 F; a0 G6 f* ]
  397.         or      bx,2- ^, W4 J! R& e! T5 W
  398. no_left_button_change:
    ' E( c: F$ P/ o* ^, H) A( F- a
  399. 6 o. H7 C+ E" U
  400.         mov     [temp_mask],bx
    ! c3 o: L3 V% `. m& v

  401. 1 z* }6 e8 a0 c+ Y& I
  402. no_button_change:* T- _, R# ]: H3 P
  403.         call    keyboard_read+ K5 c, N9 t6 M( d
  404.         cbw
    / A3 n4 t% ~7 W# n; F) `- E3 _
  405.         add     [pos_x],ax
    5 ^3 B6 H% f3 m2 ]0 X) }
  406.         add     [x_move],ax
    8 |$ k+ }; P. C
  407.         mov     ax,[x_min]
    $ Z! g' Z" j8 w0 f, i, h
  408.         cmp     [pos_x],ax; U  Z8 \) F  W
  409.         jg      good_hor10 i& ]! M. O- e+ U% \  w8 Q- q5 S
  410.         mov     [pos_x],ax
    ! W" }; Y( ~( i+ S9 f% J5 @
  411. good_hor1:
    4 Y( F$ [: S' M  k3 d
  412.         mov     ax,[x_max]' m0 Q4 U  x+ \5 I1 ?' L# k  i
  413.         cmp     [pos_x],ax; @: k' E0 w3 f3 H, q; R; M1 H. y
  414.         jle     good_hor2
    ) R# g4 J/ @' @% f' R) y/ ]
  415.         mov     [pos_x],ax
    8 u: y  Y) o) s. ]4 d
  416. good_hor2:
    5 A, \9 F* _5 g/ h

  417. - y1 Z2 U3 \: b) X
  418.         call    keyboard_read5 N: @( d- O) i5 h& O; q
  419.         neg     al' E# I( }& A$ Y! [7 ^$ g7 j
  420.         cbw
    5 ^+ ?( h! d. _' f# Z1 [
  421.         add     [pos_y],ax6 e& C  e. D' k& P. i
  422.         add     [y_move],ax, d! t) [& x  D# N
  423.         mov     ax,[y_min]
    0 u7 u5 I, X* y" F! @0 G& O
  424.         cmp     [pos_y],ax
    + h7 |( \3 t6 X$ h
  425.         jg      good_ver1
    # q0 e) B  A+ L& X1 Z6 q
  426.         mov     [pos_y],ax; v6 L( I+ D0 Z% z8 H
  427. good_ver1:
    0 X- |. @; `- P' Y/ U' \9 r- ~% V7 ]- I
  428.         mov     ax,[y_max]
    - m/ M2 U) F0 a1 B+ O: v
  429.         cmp     [pos_y],ax$ ~. p7 t; y' T0 R( B2 F% J
  430.         jle     good_ver2
    ' d4 ^" {! {. O+ l5 V
  431.         mov     [pos_y],ax9 q  H2 E% T: k( v- Q: v
  432. good_ver2:" R/ O7 l" f& W* T# Z

  433. 6 g8 u; w) O% O  z! B
  434.         mov     ax,[x_move]
    " j5 w4 {. x1 p* S/ _
  435.         or      ax,[y_move]
    - y0 \. s, f  m+ J/ z' d  C
  436.         or      ax,ax
    1 b/ n  C" T8 k, L) n# g
  437.         jz      no_change_position
    " }, W! b: R1 s
  438.         or      word ptr [temp_mask],11 {: k8 [; v. ^( V6 U! b/ w
  439. no_change_position:
    4 Y  ?1 r+ |  l! |6 L  o- D, c

  440. 1 ~' r- |' Y( J4 U7 z& {$ h
  441.         mov     ax,[temp_mask]
    , r6 O: S# d( a. a) l& m
  442.         and     ax,[user_mask]. ], m" \5 Z" u) ^; t
  443.         jz      no_call_user' l( t' L# U- V8 b
  444.         call    call_user_isr
    ; o2 A2 C5 z1 g; ^" D& k. H+ O
  445. no_call_user:, C( U7 M- R5 Y3 j
  446. ; q, u2 E4 L! Z5 f6 R
  447.         cmp     byte ptr [sm_flag],16 L! Z' g& h1 a3 Y7 V3 k8 z# l
  448.         jne     no_show# D  E& J: T; ~' R  h/ X% {5 S- P
  449. : N1 y: q( u! _
  450.         shr     cx,3# v1 z6 t3 g' ?& c
  451.         shr     dx,3' K1 T4 ^1 L8 c& d
  452.         mov     ax,80
    7 p9 x/ X4 {. |: H! U6 y& S6 P9 A( ?
  453.         mul     dl2 v# u) @5 a# J# X
  454.         add     ax,cx5 @, G$ Y4 f2 t; B
  455.         shl     ax,17 ?! Y; }6 \7 d9 F7 P# q% R
  456.         mov     di,ax- e$ ]4 O* J& n( \: U& Y
  457.         mov     ax,0b800h0 K* m8 G- [. V. z" E2 ~) U2 A
  458.         mov     es,ax/ N) V& R8 I8 M/ V6 T
  459.         mov     ax,[save_char]/ C; \' z7 `4 J$ v: @( W/ X
  460.         stosw
    ' J% M8 W3 \; L

  461. ! M+ L" o6 ], `( X8 U' n, ?9 V
  462.         mov     cx,[pos_x]" e7 [1 s3 ?  b0 y+ J8 e1 k
  463.         mov     dx,[pos_y]' F1 Y5 q9 U, ~4 V9 d2 C
  464.         shr     cx,3, b/ w  A0 M& H) x
  465.         shr     dx,3: ~$ @# y% T2 B
  466.         mov     ax,806 Z4 B% s' t! \8 `, J
  467.         mul     dl1 y0 e: D- Z3 P
  468.         add     ax,cx. z! ?+ z  S% m/ r% t1 U( [
  469.         shl     ax,1
    9 K. I! {6 p8 y& v; F7 s
  470.         mov     di,ax( L! G/ h( v7 m& ^/ F
  471.         mov     ax,0b800h' Z0 Z. e( p1 }+ {# k& F
  472.         mov     es,ax5 ?$ _" x* B& ?6 E: ]; ^$ K
  473.         mov     ax,es:[di]
    6 k; v* u, ?2 @$ E
  474.         mov     [save_char],ax
    # J% z, y: A+ R: ^3 j' E* k$ o2 {
  475.         not     ah- n7 B3 t! F* t1 G1 L
  476.         and     ah,7fh" w+ i8 [! t1 q( x* l# C, |
  477.         stosw0 C5 h% f4 U* ]% `# f: g  M. q
  478. no_show:- Y8 c* F7 t1 N
  479.         mov     bl,0aeh
    , f( ~9 y7 A7 n  K0 k$ A
  480.         call    keyboard_cmd6 o  N5 Y% ]) o) ?# ^
  481. # H# Y. G. L0 H( Q. N; w+ i
  482.         mov     al,20h
    * `- d/ G0 @# V; P. P
  483.         out     0a0h,al  e- F7 R. K/ ]! M; t$ i
  484.         out     20h,al
    3 B( w. L% t; f2 @$ B
  485. ! J# ]5 C5 B* f5 C$ E
  486.         pop     ds
    , x4 u( a. L' @$ T1 q9 K
  487.         pop     es! B# C6 H7 B. N& C
  488.         pop     si& ]) Q& Q+ w3 I  b& L" ^1 B
  489.         pop     di( k6 F4 C  {9 K/ V6 l" p- B( _
  490.         pop     dx
    + t# q% w9 [: Z& e# |. J
  491.         pop     cx' i5 ?5 N- b* ?$ M* D
  492.         pop     bx
    / @7 B" [; @* B1 J. X9 Q
  493.         pop     ax! Y( Y" s! s3 V! a" m1 W
  494.         popf( e) o- U' Z( p
  495.         iret
    3 J3 [; k( \9 d2 E- ^' P
  496. 3 P2 K4 }; ~% N
  497. first_time      db      1
    9 i' L# b: @6 `0 c
  498. buttons         db      0
    : V1 }5 O; q$ A: Q# X
  499. pos_x           dw      0( ~$ t0 s8 u! I/ M( R
  500. pos_y           dw      0% v2 W0 G! o' X4 B
  501. sm_flag         dw      0
    8 H3 L. r4 r) w' z" s0 _0 g
  502. save_char       dw      0
    $ E( U2 w8 V: H; p, G9 ~
  503. x_move          dw      0
    $ |/ p+ B# H; F" r
  504. y_move          dw      0
    & E4 f1 G7 Y3 q& ~! P: q* {
  505. x_max           dw      6397 j. E1 N& {; n. W
  506. x_min           dw      05 _6 T% n6 ]4 _
  507. y_max           dw      1999 k$ D5 u. e; f8 e$ N; G' L6 Z9 w
  508. y_min           dw      02 h9 m5 u/ k' B
  509. user_subroutine dw      0,00 s' i' ?' ]  g9 s6 `
  510. user_mask       dw      0: E' s) h- S4 X& Q
  511. temp_mask       dw      0
    2 [" V8 W# [7 g) \: s
  512. + e$ C% }, j  f* g
  513. keyboard_read:2 x0 Z8 n. u1 l& L4 f+ Q
  514.         push    cx
    , e$ O/ A8 H% T5 v# J' ]( p4 C4 K
  515.         push    dx
    6 }$ N: i1 `- k, p' P/ F. @6 z
  516.         xor     cx,cx
    8 g3 N- d1 ?7 a+ |) _
  517. key_read_loop:
    6 I5 s3 B4 \! D7 R/ a2 y
  518.         in      al,64h
    $ q7 u& Q& I( `7 q1 N8 E
  519.         jmp     $+2
    9 T, b: F, f) E+ m0 o  u
  520.         jmp     $+2
    & {6 Y" |, k' e$ i. V* g5 G5 m
  521.         test    al,1  E1 x! B# ]+ d* i& T
  522.         jnz     key_read_ready
    ' {& N5 q; Q2 z2 M
  523.         loop    key_read_loop
    " V/ W$ M4 e( X7 B4 L0 v) z2 Y
  524.         mov     ah,1& e, N% t- g& g0 j; b1 U
  525.         jmp     key_read_exit
    7 f3 O) U) i6 [3 I
  526. key_read_ready:5 n* X: q5 Z% I. N
  527.         push    cx
    8 c" e: O6 p3 A6 u+ K( Z
  528.         mov     cx,32
    1 p2 ~0 ?7 c: |
  529. key_read_delay:
    6 k- ~. }/ a/ o; J, d* C; f
  530.         jmp     $+28 l# M. R" e( K8 j) K, F$ V
  531.         jmp     $+2
    " h' U+ }2 k0 V9 g3 O  `) z
  532.         loop    key_read_delay
    ! X, Q* Z) I: [2 B$ q
  533. 4 Q, D( D6 n: b/ F* q) ~: l! G
  534.         pop     cx
    $ T. C. y1 U; ~1 \/ e  l9 \. j
  535. 0 P" ]! r! i) B0 W# \) k
  536.         in      al,60h
    ! k5 c. ~7 c4 h2 C
  537.         jmp     $+21 e) T% P( b: D9 Q0 J' d
  538.         jmp     $+2
    6 H+ `& v1 V. u; W7 s# d2 ]  Y
  539.         xor     ah,ah: g& y/ Y  T9 M) V3 W; Q
  540. key_read_exit:! E) M8 c/ s5 G/ i8 Q) }" H) B5 b) t
  541.         pop     dx  r* r, t6 k" f
  542.         pop     cx
    - s5 D: T- X, k: e7 I; R2 c% I
  543.         ret
    & s) j5 Y/ U* n1 ]

  544. 1 P6 ~% C5 q* A; v$ K
  545. keyboard_write:
    * a8 v6 ~) m" ?9 v6 g' \4 ], H  {
  546.         push    cx$ n% M/ R0 S' Z8 P$ u, X/ h
  547.         push    dx9 p8 A0 y( ~& p( I& q
  548.         mov     dl,al' ]6 y5 v, R: V: S# M
  549.         xor     cx,cx. I  e6 l' w7 e
  550. kbd_wrt_loop1:
    & n  _* ]! B4 g# M2 d# U
  551.         in      al,64h
    , c% R7 P& f* a, o( x
  552.         jmp     $+27 E# {% v9 q% V
  553.         jmp     $+2
    * U, G3 M0 y' h" _; B# G
  554.         test    al,20h
    $ V/ ^0 d3 v5 h& u
  555.         jz      kbd_wrt_ok1
    % p' U, U! F% ^. i( f: l

  556. ) n* v6 t7 @4 Y% y: m7 Y# O
  557.         loop    kbd_wrt_loop1
    ! l9 }+ v1 p- ~+ c+ j

  558. ' X- Z4 G6 y2 \9 d' h8 J! o" `
  559.         mov     ah,1
    % K4 |: Z) R1 A0 Q% ]
  560.         jmp     kbd_wrt_exit
    2 j$ h% L& ^6 D; R1 g
  561. ; a. {+ q$ K' _1 b+ g$ e1 c
  562. kbd_wrt_ok1:
    + D5 e( b1 v/ E2 H8 n0 |
  563.         in      al,60h# R" n$ }9 S' H) K1 B

  564. " P3 s' M' e5 e- O  k: S
  565.         xor     cx,cx- H4 l! E4 S# N
  566. kbd_wrt_loop:5 T6 b, Z5 I+ n; P  _1 ~, A, C% r( ^
  567.         in      al,64h" M8 d8 Q) r! l7 I
  568.         jmp     $+2
      i" g( n* j" s
  569.         jmp     $+2
    2 R9 r/ n; R- h. R$ K. g
  570.         test    al,2$ c  n  {; b$ o! e% h+ P9 r6 N
  571.         jz      kbd_wrt_ok$ H" Z$ p# {1 C- q; ]' }

  572. / |8 K4 ~" D! X
  573.         loop    kbd_wrt_loop
    - t3 B1 o( o, Y1 g& Z  i% i% [

  574. 5 u! I' R  {/ S- N0 t) R
  575.         mov     ah,12 S& D2 d! y9 T% D- N4 L  M8 W
  576.         jmp     kbd_wrt_exit/ t% f0 k+ u& K) {, E3 j0 j* C' I
  577. ( T  G& i9 I7 ^
  578. kbd_wrt_ok:2 u0 C3 Q9 Z2 }# A( u- I
  579.         mov     al,dl; q; P) L5 |; ^2 {4 A; M
  580.         out     60h,al
    5 L$ d5 |- T, J6 H3 X) \
  581.         jmp     $+2  d% V4 f, o  ~4 Y- C6 O
  582.         jmp     $+27 f) h- f# R3 F( n1 s- g* {8 J

  583. 4 q* u5 E$ `, x: x1 F2 Y
  584.         xor     cx,cx
    ( A5 B, ~1 E) s' J# `  O) I6 |
  585. kbd_wrt_loop3:0 Y1 u) R2 S# z* m1 o
  586.         in      al,64h5 I0 U* \4 S. j5 x
  587.         jmp     $+2
    & B" g4 U1 Z& ^. v: p; E# r( [: U
  588.         jmp     $+26 p$ I8 A1 d. x- E# T
  589.         test    al,22 h7 ]2 j3 r. K$ E! S
  590.         jz      kbd_wrt_ok3
    ; m/ X) f% t9 Z4 l' \- {

  591. 1 [. [( Y( \  [' l  \: \# Q
  592.         loop    kbd_wrt_loop3
    4 b. V5 \9 `" _3 R

  593. 3 @- W+ X: b) q" t
  594.         mov     ah,16 D/ [. e6 ]7 i" A! r9 E
  595.         jmp     kbd_wrt_exit
    1 L( V, n+ }7 }
  596. + \, V. N5 [: @& p, R( u7 D, r* }
  597. kbd_wrt_ok3:
    ' J7 o2 J' N) R9 b' f
  598.         mov     ah,88 Z" U9 d4 k! S! m3 e: K
  599. kbd_wrt_loop4:
    1 ~2 d) g3 A* B
  600.         xor     cx,cx% n/ L' B( n% a2 I
  601. kbd_wrt_loop5:6 _  }8 B7 n6 F# s3 _+ M$ C
  602.         in      al,64h
    7 Y* K. |4 G$ e7 r
  603.         jmp     $+24 J, x  f9 k, F& P7 @* D, `' x
  604.         jmp     $+2; v* L& \; \5 H) j/ |
  605.         test    al,1
    ) X' ~  k3 U8 u9 D0 B
  606.         jnz     kbd_wrt_ok4$ }, t( {2 I! _
  607. 2 K& ~! v) U- U- F9 Z) X
  608.         loop    kbd_wrt_loop5
    : N# @/ d  ~( v7 s

  609. / q; }$ N6 k- O$ j7 j$ {
  610.         dec     ah
    4 C5 S: g6 I; l+ Y1 W
  611.         jnz     kbd_wrt_loop4
    1 A- l$ f- ^  l# O* m1 _
  612. / R1 _4 {( i, {6 W: u3 R
  613. kbd_wrt_ok4:/ q3 R) i' o  X' ]5 k" y
  614.         xor     ah,ah
    ' I  M0 F3 r$ Q, u9 V
  615. kbd_wrt_exit:1 ?; Z* G. Z2 S- A6 t& \  H
  616.         pop     dx
    9 E2 f/ Y: X" P! U8 {8 o  L
  617.         pop     cx- M- f5 _5 f8 W. C3 W9 L. K
  618.         ret+ u. X% D/ u0 ^
  619.         $ ]( z8 d6 Z/ T9 ?* ?  k+ }  y
  620. keyboard_cmd:
    - S6 Y: \/ e# B: f8 P( n
  621.         xor     cx,cx
    ; g* w4 c; M9 v0 k+ S% D2 M5 m, ?. z
  622. cmd_wait:
    : v# v7 K6 K, q7 p; k/ x
  623.         in      al,64h7 k/ g" w! h- \, w' h3 M$ s
  624.         jmp     $+2
    ! z+ g3 f" M! b$ P, g
  625.         jmp     $+2/ @' a+ R1 G  x
  626.         test    al,25 a6 v. r" z, U: [
  627.         jz      cmd_send
    ( ]8 C- g; L; ?( G
  628.         loop    cmd_wait  B& W6 u) Y4 c0 D+ |+ ]; T" v; ?7 n
  629. ; ?" ~/ Y4 z& U6 H8 }+ K+ p, k% T5 t8 g, z
  630.         jmp     cmd_error3 m: I9 Y$ Q6 J8 r% I  n

  631. . H$ b' N4 Q( o7 a$ g" H7 A
  632. cmd_send:  m+ _0 l9 Z4 D- J3 V: v
  633.         mov     al,bl4 ^1 {( R$ Q1 Y
  634.         out     64h,al0 l9 ^5 O* }# `
  635.         jmp     $+2
    2 q$ g+ D, _. f' O* g. R5 _3 e: `& S
  636.         jmp     $+2
    " x% O0 \7 o9 ]$ K1 e& m

  637. . o6 t5 C$ ^0 [3 n: X$ Z2 i- V' k/ ~
  638.         xor     cx,cx
    2 j( I1 {* _! N& H* d) S9 J( u0 S
  639. cmd_accept:7 Q6 Y. j; Z/ A
  640.         in      al,64h- g% k, k7 q  x& [
  641.         jmp     $+26 E9 \3 {  |6 d0 u
  642.         jmp     $+25 h( A: f* c! Y; l: ~, X6 `/ Y
  643.         test    al,2  C' n6 U% t4 R  Z
  644.         jz      cmd_ok
    , T3 H/ P: t. E8 Y) D
  645.         loop    cmd_accept3 p! G" E  K* {- t
  646. ) z/ M+ ^6 g( \; X4 B- c; _" ~
  647. cmd_error:
    0 M1 b( J) S) k: {1 i
  648.         mov     ah,1* F0 o0 F! p' A1 t
  649.         jmp     cmd_exit. ^8 f+ s" P0 J! `6 s* }
  650. cmd_ok:2 w& H; ]7 s2 K: N+ b# v$ F
  651.         xor     ah,ah2 p) V2 k# \- A
  652. cmd_exit:
    : N. C( g9 l4 x- L% G
  653.         ret& k& V2 B# ]0 ?, c

  654. ( C9 J1 H2 w4 s" T8 C6 t. H
  655. new_33:4 s7 q; z) x  E+ C% X- _! e# P
  656.         cli; T! P5 f. [9 W8 f7 D" g% U
  657.         cmp     al,0
    ' P, x" Z/ C) O2 i3 \6 ^* V7 {
  658.         je      reset_mouse" _& q0 K1 `- P0 P# w4 k
  659.         cmp     al,1
    ; ~! A& U* n& e3 p6 D
  660.         je      show_mouse
    4 f& |" M; i! ]9 {/ b5 A9 d
  661.         cmp     al,2) S: k" z2 j+ n( _+ o/ K3 \- y2 H, K
  662.         je      hide_mouse1 [5 L* v- ]( ]2 ^$ C
  663.         cmp     al,3
    , m8 @  h+ t; s4 B7 `: J8 o
  664.         je      get_pos0 N7 Q- p6 v2 c( c. u5 Y. i
  665.         cmp     al,4' V4 P% ^2 t2 K7 m. T8 p
  666.         je      set_pos
    , P5 ~. `9 |5 j# W( i# G! @
  667.         cmp     al,7
    : w& ^% {# o1 P, n: t3 Y
  668.         je      set_hor_pos
    + ^8 {& [3 F6 v# {4 q/ B/ k7 ~% P9 e: v
  669.         cmp     al,82 T1 m9 s3 A+ G2 z
  670.         je      set_ver_pos/ _9 d- j& ]- Z( I( l$ f9 E2 f
  671.         cmp     al,0bh& C( c1 p; ]% H6 ~: J. N* I2 @* n
  672.         je      get_mouse_movement2 r+ n. [' r8 A6 }% v& C
  673.         cmp     al,0ch* ^- F/ C8 b7 \2 M
  674.         je      set_subroutines
    7 }, O2 W# I. G
  675.         cmp     al,14h, [; b" _# a1 p$ G' T) c
  676.         je      swap_subroutines% M7 |5 [6 S4 b9 p2 Y* v
  677.         iret
    5 |0 ^8 e, ?' d: w& S. B7 U
  678. ) R* X. L8 K" E3 Y$ V( C- ?1 V
  679. reset_mouse:% S+ o  v. Z+ L; e8 c& j0 v
  680.         jmp     _reset_mouse
    ( |9 ]4 p( p, \8 q% b; ?
  681. show_mouse:) p9 R6 G. q6 U
  682.         jmp     _show_mouse8 F! `2 }/ `- N2 ^  r6 W
  683. hide_mouse:  s3 F* }" i- ^  P8 U- r: |
  684.         jmp     _hide_mouse# C; x$ N' S; K! d( ]4 `$ _9 q
  685. get_pos:
    : E4 g; F& C# N, d! O9 k
  686.         jmp     _get_pos
    ' K, s9 ?- J# n, H6 G8 y6 S% ^
  687. set_pos:
    3 V$ ~% ]7 ~' o( {8 i' I8 S
  688.         jmp     _set_pos# I. U" ?- W( Q" c2 Y9 M" o
  689. set_hor_pos:8 J9 a0 `/ h/ S% c
  690.         jmp     _set_hor_pos( y* e2 m/ N8 m: m
  691. set_ver_pos:
    " b% o) K$ w8 k1 I7 K5 g
  692.         jmp     _set_ver_pos
    6 l: z+ A1 M. g6 x8 r- Q* K
  693. get_mouse_movement:
    ; K9 }2 X% C3 t( e$ P  I9 }$ y! ?
  694.         jmp     _get_mouse_movement" e) W; t: k2 M+ k* h
  695. set_subroutines:
    , N! ^3 S" Q2 m2 u" Z
  696.         jmp     _set_subroutines' T1 Y  r) ~7 ~& ~( Q* j
  697. swap_subroutines:
    $ E) M5 e; g, s! P
  698.         jmp     _swap_subroutines6 f7 x, \/ N* m0 U- Z, N- u+ y
  699. / M5 F: J6 T! ^+ v0 r( Y; h  J
  700. _reset_mouse:
    9 f' a& Y2 f9 i4 s& o2 k+ i' ]. x
  701.         mov     byte ptr cs:[buttons],0+ k3 L0 Z3 U7 E
  702.         mov     word ptr cs:[pos_x],0
    # R5 q7 y1 I4 u/ @6 p! K* S' y
  703.         mov     word ptr cs:[pos_y],0, }' W# s6 m) I7 S9 `1 L3 K$ k
  704.         mov     word ptr cs:[x_move],0/ |: @  ?; V3 O7 X' _( R
  705.         mov     word ptr cs:[y_move],0
    0 l  M& p" x; X2 o* i
  706.         mov     word ptr cs:[x_max],639! {/ \3 `0 z% y- j. O
  707.         mov     word ptr cs:[x_min],0
    6 E# C* v3 G0 c
  708.         mov     word ptr cs:[y_max],199
    & ^- t6 M! K* F+ U# Q9 u6 B7 p
  709.         mov     word ptr cs:[y_min],0
    $ R% Z) Z( T2 h' S" y1 j6 K
  710.         mov     word ptr cs:[user_mask],05 _4 G. L1 @7 y+ w8 N6 V! b
  711.         mov     word ptr cs:[user_subroutine],08 H2 }) ~* X/ q2 H- b& y# b5 H7 m
  712.         mov     word ptr cs:[user_subroutine+2],0
    1 T1 z. h; e* W1 b+ v, m
  713.         mov     ax,0ffffh
    $ a+ m! P' @8 Y9 u9 _- g% w
  714.         mov     bx,3
    5 E$ x9 d. E, ~) _
  715.         iret
    / }6 I1 d3 A8 p9 q9 j* [( K0 X* F

  716.   P( y: O2 A! P0 t
  717. _get_pos:3 Y9 l' q" c* z1 A
  718.         mov     cx,cs:[pos_x]6 q; ^  i5 |- a
  719.         mov     dx,cs:[pos_y]
    ) c- {( w: ]: I9 S( t. d9 e
  720.         mov     bx,word ptr cs:[buttons]2 l- e% H- u' b
  721.         xor     bh,bh
    3 b0 @3 n& w0 W2 ^2 k# ]; Q" v
  722.         iret
    7 ?+ S4 y  c0 H5 q

  723. 8 S, N# x+ \1 }, X6 I3 |* Z$ c$ C
  724. _get_mouse_movement:  C, w9 f  T; _7 `: A2 C$ |
  725.         mov     cx,cs:[x_move]1 V: m4 g/ K, i4 `( E! v. W! X) q
  726.         mov     dx,cs:[y_move]
    3 U4 s( W! p+ e3 S. Y2 d
  727.         mov     word ptr cs:[x_move],0
    " y# ~: r) i" n# a' @' ]0 v3 l
  728.         mov     word ptr cs:[y_move],00 L1 \% h# P- P) v1 Y: l3 n
  729.         iret9 s5 x/ n% Z) c5 b; r( C: [! o) i

  730. # q) ?: d; ^( n* e
  731. _show_mouse:& |4 e5 c" Q/ B. _# s/ m
  732.         push    ax
    1 |* i1 q# B$ d& z8 g5 u1 x
  733.         push    bx, ^+ w. I8 _: k) n8 q
  734.         push    di
    1 c; L2 n- X/ [) I5 Q8 t% u
  735.         push    es
    - u: ?1 Y: l6 H
  736.         mov     byte ptr cs:[sm_flag],1
    ) S3 `$ ?- L  l& a4 c( G& v  M9 _
  737.         mov     ax,cs:[pos_y]; R3 f$ D' X9 ~
  738.         shr     ax,3
    $ h1 c' R9 X9 [& T3 Q
  739.         mov     bl,80
    : F: a& e# Z$ Q+ o! n' x
  740.         mul     bl
    ' [. Z' V" K# n9 b3 c
  741.         mov     bx,[pos_x]
    ' W0 B* O! A- r( T- M
  742.         shr     bx,3
    + C$ |" I  k- L3 o
  743.         add     ax,bx* l  W  t7 R  |) v  |( s% N) ~
  744.         shl     ax,1
    - V. l" x4 I- [9 X  m
  745.         mov     di,ax0 K/ n$ X, ~& {, E
  746.         mov     ax,0b800h
    : N: ^+ q4 O/ h6 M
  747.         mov     es,ax0 j; c9 _: s2 G+ U
  748.         mov     ax,es:[di]
    0 Y; {. O/ f* I8 U2 R: z4 d' E
  749.         mov     cs:[save_char],ax: }- {# S- M! [' f9 `# E( ]
  750.         not     ah1 I  `9 N1 w) L8 r
  751.         and     ah,7fh8 p: V$ u3 m( s7 Y' q
  752.         mov     es:[di],ax+ l. b1 a( s$ H9 p# E0 M
  753.         pop     es3 F. \0 J: Z; [- B+ l+ f
  754.         pop     di
    0 M0 x! W1 j! E4 s: e
  755.         pop     bx  @. d4 Q: S: c' c4 a
  756.         pop     ax$ C3 m1 h. f  `  q$ K' }
  757.         iret
    3 X: L6 h; S6 m$ J% [( c( `8 W

  758. 9 T! b. U3 a/ o9 F# n1 x
  759. _hide_mouse:( g; Q7 m4 m& I: U$ l8 k
  760.         push    ax
    - H& T+ x; g' p% C" }8 _* |
  761.         push    bx  v/ o. H3 k" w# u/ Q$ J9 B
  762.         push    di8 \" }! T. O, b" @) \' ~2 T! M
  763.         push    es
    " E. {7 E, ]: d/ d0 P
  764.         mov     byte ptr cs:[sm_flag],08 j% S" ?6 X2 P7 i& B
  765.         mov     ax,cs:[pos_y]
    4 l& |* M* W6 n- R4 u: B# C
  766.         shr     ax,3; j; r, B& K$ T# H; t
  767.         mov     bl,80( |6 b1 G) S1 q: @6 B
  768.         mul     bl4 ^- N, h* R1 ^- ?
  769.         mov     bx,[pos_x]
    . A" E  Q5 B5 a3 V5 O
  770.         shr     bx,3
    0 `1 T8 O( G9 d: L* s/ L
  771.         add     ax,bx
    ( i. P( B, D& n2 X! T3 v6 @/ ^- Q
  772.         shl     ax,1
    " ]1 U' ~% A7 q! O! B9 B
  773.         mov     di,ax
    , {- v6 Q, U* e* C
  774.         mov     ax,0b800h
    ' k; m) A1 V/ [- ?3 U# p2 P+ X  E
  775.         mov     es,ax
    ! ~' n2 Z- Q2 o- z; ]; h+ F; h
  776.         mov     ax,cs:[save_char]" D) j0 C( c1 K, C6 V9 T7 F
  777.         mov     es:[di],ax. \; }5 W* Z; F2 Z. M
  778.         pop     es: i4 |7 Y, O& A
  779.         pop     di8 l0 Y3 q/ P0 ~- v& E5 N/ G, n9 n
  780.         pop     bx
    7 y, e" U; O3 n) R% S, Y. ]. B; E
  781.         pop     ax5 Y. ~9 [# y+ y1 ~
  782.         iret
    4 T- v5 h( {- I5 T3 {
  783. 4 ?- b6 N$ ~9 R
  784. _set_pos:# v6 }* o9 `2 K' K
  785.         mov     cx,cs:[pos_x]
    : ?0 g7 }1 s0 ^& Z) L
  786.         mov     dx,cs:[pos_y]
    2 A, Z" A1 x+ T7 A. b
  787.         mov     word ptr cs:[x_move],01 r* S+ U7 |/ k
  788.         mov     word ptr cs:[y_move],0
    ( H- @( `8 j" y$ A" ~
  789.         iret
    * l' r, o7 ^, Q. j; [4 V
  790. : F  I: L$ Y# E' T( H
  791. _set_hor_pos:
    , \9 c. P* I2 q& O3 V
  792.         call    max_min7 e! a. B! P) ?% \: @
  793.         mov     cs:[x_min],cx
    , _- x; |' g1 k+ |+ l
  794.         mov     cs:[x_max],dx
    & m0 \' e" f8 N  k; l5 c
  795.         cmp     cs:[pos_x],cx
    8 d. O7 S( a; ^4 y2 I2 t
  796.         jge     good_hor_min
    $ N* z' h& i$ d& m/ u# j
  797.         mov     cs:[pos_x],cx
    & R9 D3 [/ i; I2 S( H6 e
  798. good_hor_min:  w# r# X* q' p9 \# c% y6 R! |
  799.         cmp     cs:[pos_x],dx# P- k# m. e0 k% S+ J; t- W% ~$ k! O
  800.         jle     good_hor_max6 T) D3 i. o+ H
  801.         mov     cs:[pos_x],dx. l6 M. R; Q( e
  802. good_hor_max:
    0 g" O" j, B3 m  p* N5 k$ u) `1 m
  803.        iret
    1 @% B+ M, h5 T

  804. $ E. d' E# w$ b+ n
  805. _set_ver_pos:
    - l7 v* R# M( k: _; {
  806.         call    max_min
    - M% b1 ~1 r. K9 s% `3 U
  807.         mov     cs:[y_min],cx" ^7 {8 p) P0 a3 F7 r; _7 j. j- ~
  808.         mov     cs:[y_max],dx
    ! w2 F# X' ~0 x) w8 W
  809.         cmp     cs:[pos_y],cx
    9 L, T2 p( C& t* _; p! l" W* h
  810.         jge     good_ver_min
    ! N- D+ \: A) R4 H3 l/ R8 H
  811.         mov     cs:[pos_y],cx
    * R; X  @  ]" E: {  p* c
  812. good_ver_min:4 D  ?" Z5 i; O: C. I; B9 n
  813.         cmp     cs:[pos_y],dx  n9 M1 w0 x: ~/ o& h
  814.         jle     good_ver_max' b+ J; l8 I4 O  R
  815.         mov     cs:[pos_y],dx
    * B8 p) U; M* C5 t# C" Y/ ]
  816. good_ver_max:1 {& W% p2 ^1 w. e
  817.         iret! o6 F% T) c$ J3 Z3 J
  818. & p' i4 X2 C1 B, H- N; @) ]
  819. max_min:/ \( c* h  S+ Y+ D' U! T
  820.         cmp     cx,dx5 `8 ]+ ^" t2 S4 e/ g  |. p
  821.         jle     no_swap2 Z8 K/ M$ w# b+ ^
  822.         xchg    cx,dx
    4 N7 P* I& m3 B$ X+ e2 }9 F
  823. no_swap:
    8 ?6 ?4 r3 M  W9 \/ R& i$ T8 S
  824.         ret
    8 c% y- O, i6 F! I5 A
  825. & h1 `. A, l6 ^, i( N, C& b  Q' W% g
  826. _set_subroutines:8 f  k* m! x1 G. n- y3 G1 }
  827.         mov     cs:[user_subroutine],dx3 d: w% r& K6 t; M4 i
  828.         mov     cs:[user_subroutine+2],es6 v0 x3 Q. i. w" P! F
  829.         mov     cs:[user_mask],cx0 O6 I/ q5 n) ]+ ^& r$ n4 P
  830.         iret  R% n6 v3 @2 B, R. o1 h! g

  831. 6 G+ s5 f+ I, i: {; @9 }
  832. _swap_subroutines:; L9 V( h: O$ V3 {" p
  833.         push    word ptr cs:[user_mask]1 Z6 k4 o' x: a3 W9 H& ^# ^
  834.         push    word ptr cs:[user_subroutine+2]2 R+ x- c! v, X/ ~6 K- N+ X
  835.         push    word ptr cs:[user_subroutine]& ?; [: C' d0 ~1 l0 |) V- x
  836.         mov     cs:[user_subroutine],dx( Y; n0 |6 @# y5 z- I& B
  837.         mov     cs:[user_subroutine+2],es
    / F; o3 i$ G8 k6 S8 j5 n
  838.         mov     cs:[user_mask],cx2 @$ L1 S3 n& f, W) ~) l
  839.         pop     dx
    2 ~* T8 R$ n- m  K3 |3 q
  840.         pop     es
    - Z. C4 L9 J2 r
  841.         pop     cx
    8 h8 _# E: q) x* N% |
  842.         iret' a) f" G2 u3 {# ~
  843. : r; S. s. P4 ^' r9 X& F4 j
  844. memmouse        endp
    1 x, ]( x' b. e7 x% S) H3 H
  845. * }& o" w6 `; {: {
  846. endof_start:, Y( }8 X% ~( `$ z5 {% h

  847. : T" s: X' D/ \/ k5 D& a* G% \
  848. emsg db 'No mouse driver install error!$'
    8 P$ C3 P3 [& p5 ~
  849. old331 dw 01 Y4 U5 H5 W3 t: g0 i) Q+ l. S
  850. old332 dw 0( z- Z) q1 f4 i, C! Y
  851. old741 dw 0
    * V! b3 w' ?  U6 M% T/ ?5 w: S. V0 N
  852. old742 dw 0
    1 }2 I) {  L, m, w: g/ [- u$ U: Y
  853. memcopy db 0: t( O4 Q1 ~+ ~$ M# B; g
  854. okcheck db 0
    5 X1 E. `5 w- p+ \& P. J- z
  855. pass db 0: b) F7 V6 w9 r- e$ ?& U" u7 }
  856. chkl db 0
    * h% k6 [9 w% _5 z& i
  857. lk db 0: ~% J" V0 l2 B0 C7 M6 |6 ^( _
  858. chkr db 0
    7 j1 ^0 r9 j) c8 a2 i1 X7 b
  859. rk db 0
    ) D0 D9 U  U" c; a2 O
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    , G7 y" R0 \/ y
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    , E0 S! n* _0 y9 _
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    . ~9 O2 O% h* z' Z+ d* I
  863. db '                                                                                '
    3 {, I4 @) f, Z
  864. db '                                赏屯屯簧屯屯突                                  ', _: Y/ W" |0 X. U
  865.         db      '                                ?OFF汉OFF?                                 '
    1 S' @  N4 N3 z- Z- ^8 c( J
  866. db      '                                韧屯屯既屯屯图                                  '
      u1 S5 ^4 B2 j
  867. db '                                                                                '
    6 `5 @/ e" m  z+ N
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '# [- m6 D4 p# d" X1 R: ]$ }
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ' E# Y% U' _, ], d  }$ c4 ^
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    & V. u: k0 C$ j* q5 \* _' e3 H
  871. , W% x* }: D7 e1 t6 A1 J' G  F
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
1 |- p. B  Q. T哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... & x" x4 ~- M# a8 e$ M* m. t9 J

: V' p! }1 u$ L1 {谢谢!
回复

使用道具 举报

发表于 2008-12-24 16:20:13 | 显示全部楼层

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-6-29 04:06 , Processed in 0.119497 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表