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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。6 {% y2 \6 C& E) R
( q& U$ z: a! c! a! _
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    9 W$ Q" P8 Z1 Y: j
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9! u/ h* ]2 H- Y# a1 b
  3. ;                                         By Bini.Yi 易祝兵. A% S/ I5 c: l6 C' x3 p- x) \
  4. ;                                         http://www.ufoit.com 计匠网! P9 m/ M$ ?0 e, U; h1 [* {$ d, g
  5. ;                                         2002/04/06 YYYY/MM/DD5 q% H% x" G( G2 M+ E: p6 M3 \3 W
  6. ;( t2 M0 a: j, ]/ a" R" q6 s
  7. ;         
    3 _' m6 x" p% L# G. [
  8. ;          This program  test the mouse button  click and move.: P$ N/ m2 D& \% T3 o
  9. ;
    . A$ I+ O7 {  S0 E4 K

  10. 8 P- e5 n7 S# B0 P& w
  11. .model tiny' \% l6 z9 W' J+ [
  12. .586
    , o5 t( R; y/ e4 m% z
  13. .code
    - i/ D& W) J8 v" v% U* D
  14. .stack  100h) @% {* N3 {+ u" z4 g( j' j4 j
  15. .startup
    9 k6 U% S' p2 z% Q- v
  16. pusha' f5 H4 |6 a' v+ H
  17. mov ax, 3533h( H- `8 l; f/ ^. ]
  18. int 21h% i" s3 y9 I2 M
  19. mov word ptr cs:[old331],es2 m4 ~& I) I" u! @) n! l
  20. mov word ptr cs:[old332],bx% h) M( T& d8 c
  21. mov ax, 3574h
    4 w0 L6 a* ]9 P& D5 i
  22. int 21h7 g0 Y6 T3 m- O8 h( O
  23. mov word ptr cs:[old741],es
    & I% C3 X8 v# x2 L3 E4 m3 H" P
  24. mov word ptr cs:[old742],bx, l0 B) K% F" }' O
  25. popa/ }$ n( a  B/ L, r6 E: h( b
  26.         call    memmouse
    3 S4 I0 s! E) r. |) J7 Y
  27.         mov ah, 00/ V  P, ^% X3 [- H5 Z
  28. mov al, 03
    / ]9 ?3 K# T" G8 c, R
  29. int 10h
    3 f7 C( j5 `9 k& ?( _
  30. mov ah, 06" z7 d+ B* `6 y1 D. D/ ]6 G, K
  31. mov al, 0
    4 a; N4 R  O4 y% C& q
  32. mov cx, 0' w; V3 F9 A* h0 o0 I# \+ I" [
  33. mov dh, 24
    & I- u( F+ M+ Q$ H
  34. mov dl, 79
    8 v/ [  I$ P7 u3 f2 z( ?
  35. mov bh, 07h4 a+ s. x- f. F" H& x6 V7 q5 X
  36. int 10h
    + V1 ?3 A0 _) f/ T, L
  37. mov ax, 0000! W" y4 a( s: V+ h8 R
  38. mov bx, 0002$ F7 R, j0 f5 i9 ]$ s" S5 v
  39. int 33h3 e5 O. O+ C( c+ {' s
  40.         cmp     ax, 0000           ;if no mouse drive install2 i9 y8 Y! P0 l, g1 t
  41.         je      errormsg           ;show error MSG" k. q7 ~6 g$ S- c; j
  42. mov ah, 02! w. J/ ]. @# Y9 P
  43. mov bh, 00
    ! z& H2 U! h( i/ H1 K, F. t9 T
  44.         mov     dh, 25             ;Move point out screen$ _5 T! b; d8 P0 B; h* e
  45. mov dl, 79
    . q0 m( _, D- K8 t- |1 o- j
  46. int 10h
    , ~  K1 p8 u% D& A( N6 J
  47.         call    showmsg            ;Show info
      q3 f9 S7 @# E
  48. mov ax, 00010 t' v& d& Z' K% V
  49. int 33h- M% b, k1 ^/ B" V* ~% `! ?5 k# M
  50. ; mov ax, 000ah
    / [  l" A: k  s# s  s6 q
  51. ; mov bx, 0000; s! p# Z8 f$ Q0 A
  52. ; mov cl, 0h5 v1 b# _& M% y% {( b4 X5 P' L( r
  53. ; mov ch, 0F0h
    8 Q% ~* \4 Z6 F) M! Y+ X$ `
  54. ; mov dl, 0h& Z1 N6 t4 u, H1 c* R
  55. ; mov dh, 0F0h) H# m; y- x' S' ^) D
  56. ; int 33h+ A: r! ?4 {9 v; p9 M9 g, ?5 L& Z- d
  57. mov ax, 0004h. \2 p- Q; h" ]/ ]! t% N
  58. mov cx, 0319
    7 u( n# d: Z, ^7 h$ N# y0 H
  59. mov dx, 0103# v/ x, d$ k2 G+ N. [
  60. int 33h6 C/ K9 }5 m( z
  61. casemo:                           ;Case button click and point move 8 z6 C9 Q' w6 {3 }, J
  62.         mov     ax, 000bh         ;and keyboard press
    + e; L" O5 `8 b) Z6 Q. O
  63. int 33h
      o3 v* m# @. D) g0 A; ]
  64.         cmp     cx, 00h           ;if point move....X
      _% c6 _+ H  h( D* h
  65. jne xmov/ |8 R( D# E7 ~* D
  66.         cmp     dx, 00h           ;if point move....Y
    4 D. D( X. w1 k. o4 {# q& c
  67. jne ymov
    ( g) I" w. N" d8 l; C. L9 A7 |" W
  68. xymovend:                         ;X.Y move end* I+ \0 N7 Z8 _4 |' T
  69.         mov     ax, 0003         
    ' ~8 Y) B4 X/ j( R9 O9 c; v- p
  70. int 33h; G+ T1 y5 f+ l4 c
  71.         cmp     bx, 0001          ;if left button click  show ON. i# w' t& r) U, l4 G/ K
  72. mov si, 18285 D$ ^4 c+ ?5 ?" N" m  m
  73. je listl7 K" _4 `/ [# {. F/ J$ r, x
  74. mov si, 1828
    # C: o0 }( J8 e" K: C
  75.         jne     nlistl            ;if left no click show OFF5 k) m1 t' L- J! c3 f0 ?. Y9 S
  76. testr:9 B8 W6 {8 e* k) A
  77.         cmp     bx, 0002          ;if right button click show ON% }& H4 R, q0 F) T
  78. mov si,1842
    / e( Q" W3 R. q, }9 ]/ N
  79. je listr
    7 D; n: H7 a! Z. p# ?+ V
  80.         mov     si,1842           ;if right no click show OFF
    " N. p* p0 x4 {! N5 v: L
  81. jne nlistl  V0 j$ Z0 A4 m; w/ Z
  82. casekey:. c; z0 q9 H9 L( D+ ?
  83.         mov     ah, 01            ;if any key press jump check
    + S4 @1 |! \7 U  g* h( U9 i. u. n4 ~
  84. int 16h
    7 k/ _' u9 R( ]
  85. jne kpress$ ?7 y1 p! G8 b& i# I: c2 o
  86.         mov     al, [chkl]        ;check x flag
    ' `' g/ F/ ~8 O2 p
  87. cmp al, 02h$ }7 n; f2 e8 ]' N4 {
  88. jnb chkok6 G" s4 Q! b6 |, k( x
  89. jmp casemo
    ; e6 F% Y- H  E  J: N
  90. xmov:                             ;if X moved, get the X flag+1
    4 H! i! E: V& W+ J+ J  G" n5 v& F
  91. mov al, [chkl]
    : {. T& X. v- Z5 X# z% `! M
  92. inc al
    1 ^- O# d( M0 m+ P/ {. p6 r6 R1 l& q
  93. mov [chkl], al; B4 H. Y* v& R
  94. call passok
    ( _' t- P; ^1 I" ~2 E& }; B+ Q
  95. jmp xymovend& ~, I1 O: R* ?2 s2 J
  96. ymov:                             ;if Y moved, get the X flag+1& }% M6 q% s2 n0 ]
  97. mov al, [chkr]! ^0 o* z8 B7 k+ n2 ]% B( ~3 q
  98. inc al
    4 n2 S' Y) [$ k& {
  99. mov [chkr], al. N5 C' K7 G' u) b4 O% N
  100. call passok
    ( O" {5 }% h& I. U
  101. jmp xymovend
    ; u$ t) m, y+ M, n4 _/ D

  102. 6 H7 C9 G2 N2 o4 z' G$ S3 z9 p; w
  103. passok proc near; r. b8 P4 ], T5 ]4 Z
  104. mov al, [okcheck]0 w" ~6 k) ]' t; |. i
  105. cmp al, 1' J- ?: O' z% I$ Y2 T! E
  106. je let04 V7 s6 s7 Z9 K  _
  107. jmp passret
    + j; |! E% \0 F
  108. let0: ) W, l3 Z( C' S9 {' w
  109. mov [pass], 1% P2 J; m9 m& {3 f/ E1 k
  110. passret:
    4 q4 K) ]) ^) _* ]# d5 [2 @
  111. ret
    # E3 I7 B1 j$ W( y9 n
  112. passok endp " L* s1 p  V& b; n9 L( X

  113. ) S; Q  \' G# N# o" h
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS/ Q- e8 g- K! L2 @# X, G/ }
  115. mov al, [chkr]
    1 i6 t& k* k7 @4 v/ S
  116. cmp al, 02h$ x6 O$ K  g4 d( |6 I$ _' {) k
  117. jb casemo
    0 D5 Q) E, u" c+ d; K' y
  118. mov al, [lk]: u# H) I0 D: J, M6 I
  119. cmp al, 1
    , C. Y9 X2 ?' P, P; k: _, m. {
  120. jne casemo' `- ~2 V4 d- x$ G& v
  121. mov al, [rk]2 B6 y+ P. {7 l% S# d
  122. cmp al, 10 c, k$ t' L- Q. Z/ J0 }
  123. jne  casemo
    . J6 x# |5 X6 `/ p4 \* H
  124. mov [okcheck], 1
      b7 L% P4 @- D' H: X
  125. mov al, [pass]
    4 B$ s% @7 @( ^( f& _# ]: i. b
  126. cmp al, 1
    & `7 R) U, l4 J) i5 z0 O3 z6 A
  127. jne  casemo
    ( y3 B& \. F6 S% R
  128. mov ax,0002h
    # |) m1 Y1 u5 i0 L
  129. int 33h8 k. ~/ l  N4 `- f0 y
  130. call cleascr* q2 d+ g. U) J# P7 h7 a9 u
  131. , Q& n) c: E8 ^) c  U
  132. call oldint" Y# e& v8 P5 Y- \9 I
  133. mov ax, 04c00h
    0 B: g! H# P6 @5 Y6 v2 @; E. S+ O3 j
  134. int 21h
    : V; k3 h0 m5 @" @  q* _9 M

  135. 9 J9 S5 b2 g5 x3 r
  136. okexit:2 }  \; h: O) v" ]
  137. mov ah, 4ch9 `2 E2 B1 @# Z9 q( Y, I8 F; c
  138. mov al, 0
    + {5 M) C( Z9 O8 T* e) x: D
  139. int 21h* H  ]) F# H" c) ^3 m
  140. listl:                                 ;Show ON/ o3 }9 N1 I! A5 g
  141. pusha
    * H: V+ r: Z, H2 N7 [
  142. mov ax, 0b800h
    ; H. N* j& o2 X
  143. mov  es, ax
    ! m5 z) R! m( B, P, [$ x$ ]
  144. mov ah, 47h
    8 \. z4 T8 x# e/ K7 ]2 f" O
  145. mov al, 20h- ?) ~- Y' @2 q! [$ U$ l; p
  146. mov es:[si], ax
    # O3 M: C: O1 b; U$ Q
  147. add si, 02) _& _, R/ q  u+ k) r' {
  148. mov  al, 4fh
    $ D1 [/ M/ }1 u: t
  149. mov es:[si], ax
    8 t7 |7 d5 a* g5 n
  150. mov al, 4eh" L' n2 u. o7 Y2 [! E) K- l8 g: D
  151. add si, 02+ v" Q8 T' Z7 p" R' h4 y  b
  152. mov es:[si], ax
    2 z# }% j3 B% E! p7 |  E  B3 p
  153. mov [lk], 1
    0 s6 M' u+ j& C& }" ?: E3 l# x
  154. popa- j9 S% s+ ^+ I- w2 Q( @
  155. jmp testr: ~  U2 K/ G6 z2 f2 v
  156. listr:                                 ;Show ON
    , j; G9 Y/ _5 l/ i  H
  157. pusha
    5 N+ z8 x) L! ?% q0 C3 K
  158. mov ax, 0b800h
    % w# e4 h) d- C) x% w# A
  159. mov  es, ax( {7 P9 J$ S$ F% j. R% x! T
  160. mov ah, 47h
    ( d( I" }) F/ a
  161. mov al, 20h# o: b  g3 Q) j) h  c
  162. mov es:[si], ax
    ' t% y3 H3 T: U
  163. add si, 023 |) K, O# y! Y9 d% @# h! x
  164. mov  al, 4fh6 }3 z- ^1 ?7 m+ d0 V; @' T  g  A
  165. mov es:[si], ax
    7 u, b+ y6 E' v9 C9 o5 J
  166. mov al, 4eh
    7 @0 S! ^) n& H0 V3 m* W/ ~
  167. add si, 02+ _" r# o! e; ^2 L
  168. mov es:[si], ax
    2 m, e' O: K( h) W
  169. mov [rk], 1
    0 Z: [* b; }) B1 g( T
  170. popa2 M: c+ L! H* ]& [8 G; b
  171. jmp  casekey9 }' U/ ?$ P% Z

  172. " A- O5 N7 b* Y9 ?
  173. nlistl:                              ;Show OFF5 W# ]( Q' H+ X3 R# N+ k
  174. pusha   # X3 D$ ~: J; z7 j& ^
  175. mov ax, 0b800h
    8 f1 |8 m. M% Y1 Z
  176. mov  es, ax& d, R/ X5 r# W1 t5 R# c# t" w
  177. mov ah, 17h2 k! }( u* ]" E8 x
  178. mov al, 4fh, k+ L: q8 y) }* b  F+ h
  179. mov es:[si], ax
    * b0 p% t4 ^7 i& V
  180. add si, 02
    ; J8 d% n2 e1 ^5 I% [6 W
  181. mov  al, 46h% j' _1 {0 |$ b2 ~
  182. mov es:[si], ax. `! L( }) U2 V1 J
  183. mov al, 46h$ k: N- f2 K, G2 L+ }
  184. add si, 02
    5 B: D& K1 |7 {! Y& r5 i
  185. mov es:[si], ax
    1 p! X% j7 \4 a9 D1 t& y
  186. popa
    ( x& _" O3 J1 v
  187. cmp si, 1840! p2 f& T4 f  m. Z2 M, ~2 r0 @% o
  188. jae casekey
    / X- ~( C: ?1 _0 b) e
  189. jmp testr% z2 h& a2 c$ ^/ W+ R0 w) S1 d$ f- ^
  190. % ~0 K& g( m: B
  191. kpress:                             ;Check key press if press<ESC> then EXIT7 H: B8 I% n: m
  192.         cmp     ah, 01h             ;and return a error
    0 _* T$ ?# Q* O- R
  193. je exit1
    + b$ v$ b5 B  \8 \  q! ^
  194.         mov     ah, 0ch             ;if press other key then clear2 l7 P: R9 r6 H( W0 e
  195.         mov     al, 00              ;keyboard buffer9 P; _  h- l5 F7 `. y$ {& G
  196. int 21h
    9 q. Q! L: s$ L- X: k
  197. jmp casemo 5 j  R! C! n# d6 x  j

  198. 9 i' M9 R- S) G7 C, e( h* @9 N
  199. errormsg:                           ;if mouse driver no install
    # G: m) `! ~/ P
  200. call oldint6 w- n5 }0 f( z# b) e1 v7 O
  201. lea dx, offset emsg! S0 {3 w9 G2 E9 l
  202. mov ah, 09h& X' A! W1 O; H  ]; Y% \3 y
  203. int 21h
    6 `# B9 p9 m% K* e) _& c* I1 q/ v
  204. mov ah, 4ch
    - U$ `$ K2 _( L3 i# _
  205. mov al, 2
    9 q- y' ~" ^: r" c; j, @
  206. int  21h
    7 J( Y* d% Y9 Q! s; v1 S1 \
  207. . h2 F# l! w& ]' }) n( W
  208. exit1:                              ;error exit
    ! G/ S% f( r: E6 n2 [' b
  209. mov ax, 0002h
    5 z: I* e( q  n1 _' h( Q
  210. int 33h* {$ ]' c8 R. A& f  X7 g( K9 r1 ]; p
  211. call  cleascr
    3 G6 p: ]: m0 |0 k" f% ]( V
  212. call  oldint
    & T. \2 [  X  _& P: q) D7 Q
  213. mov ah, 4ch$ n7 y9 n! }% ^  Z5 U% p3 `% O- A: q% u
  214. mov al, 01
    " g" x  y" N: W
  215. int 21h
    % b/ V% I- v7 i7 ~' o

  216. : w0 l4 T( U) B' D
  217. cleascr proc    near                ;clear screen
    $ C+ y6 c# v  P3 _7 o) @& I7 ^
  218. pusha! i% b. i4 |# k! D2 b% y0 ?
  219. mov ah, 065 A, m/ l. Y7 L, p1 I# d" U+ D, W! W
  220. mov al, 0
    - u# p+ U4 b) W
  221. mov cx, 0
    : e0 M* }# b3 B; Z7 o
  222. mov dh, 24) q" ~: K5 w6 l2 [3 R
  223. mov dl, 79$ y) O% l( l% I) b# ]# _
  224. mov bh, 07h
    1 m% s9 _- J- ~4 B% `8 J+ l+ i
  225. int 10h" b: m& W# F$ Q# U2 R/ b
  226. mov ah, 02
    ! [- i( B" Z8 n
  227. mov bh, 00' r2 ~4 Z, b/ G' v8 t- t2 Y! Y
  228. mov dh, 0
    3 z8 T0 u; F% e/ N
  229. mov dl, 0- @8 X8 p& }2 P6 m
  230. int 10h) l2 W' X2 R4 \! r, _5 l
  231. popa
    . X' C2 U3 c. Z1 L
  232. ret- t) \( m# O6 _/ W2 z& t8 _: z4 a
  233. cleascr endp) s( x3 i( O  X  E/ h1 V

  234. 6 N% C! f  g# |! B0 a( K& L! W" |3 h9 m
  235. showmsg proc    near               ;Show info' Y2 d. R! {& r, R
  236. pusha- K* y0 U8 ~/ B$ Q* S
  237. lea di, offset showms
    5 b3 F- U- G- M6 g! R1 A
  238. mov ax, 0b800h0 [# g& ?! @7 l$ M+ u1 q  K( ?
  239. mov es, ax0 P4 R( j; R4 |) v- k0 p: V
  240. mov si, 0! ~* I0 {: b" i" d; |) M
  241. mov cx, 480
    + B- h3 f9 T0 W. b7 j5 L8 x
  242. mov ah, 07h2 w( S7 a' r  k; Z* [" F+ N5 l0 l" ~( I* f
  243. @@:# F& ~* o0 w) o$ ]% D& F5 y: |9 B
  244. mov al, 20h. L7 X3 `/ Q! H$ X% A& R8 c
  245. mov es:[si], ax$ v/ q5 z# o  I9 l* A
  246. add si, 2+ X" b& y( U. M9 N
  247. loop @b& z# \' s$ c3 `8 _0 F% X
  248. mov cx,880
    7 m5 ^+ ^' b8 c% X3 L% h& f
  249. @@:
    5 A7 W+ f+ d/ i3 u( f
  250. mov al, [di]
    3 N; p8 ?& W! V1 V9 X
  251. inc di
    9 |. g1 O0 C# S+ m4 r# Q
  252. cmp al,20h
    8 I; D) K  A/ l: N' n% z
  253. je showch1
    + ^/ q+ D/ j4 c
  254. mov ah, 17h
    + s) \) P! I2 A. _" N
  255. jmp showch3
    & E3 c4 i( _4 y. x
  256. showch1:5 }" ?8 w3 I6 k2 r
  257. mov ah, 07h # d6 N+ |: J2 b  ]0 x2 N
  258. showch3:, Y7 e! q# Z! S) K8 |0 l$ b; Z, y
  259. mov es:[si], ax0 k7 |6 `. n. b' g. v
  260. add si, 2
    ! V' }: l' Q1 Q+ z  |1 V6 x4 Q2 X
  261. loop @b
    ; X- C3 A$ L" ]- o# D
  262. popa
    , q7 t8 w, g5 e2 g# ?: H+ ~1 }% J% M
  263. ret
    ( R  y+ E+ k$ G; y1 I
  264. showmsg endp
    : `# O, r# l- t) z1 W5 t2 X
  265.   _4 W# }/ V. X0 u, j7 D1 e3 H
  266. oldint proc6 N, P8 Z4 @0 T. i
  267. pusha' d' S7 }+ p9 ~
  268. mov ds, word ptr cs:[old331]
    - a3 ~- j3 e' Y0 ~3 m
  269. mov   dx, word ptr cs:[old332]4 q/ W, E, z) H& d
  270. mov ax, 2533h* Y7 B) }0 M. D" I& O% `4 m3 r
  271. int 21h7 \* v1 I, F0 r
  272. mov ds, word ptr cs:[old741]6 f/ K. ^" h8 o0 Y  y) i" y1 O4 R1 Z
  273. mov dx, word ptr cs:[old742]
    # ?; N+ X. P: E( k& d) s4 _
  274. mov ax, 2574h  l$ f; n1 B" p2 t) s: u
  275. int 21h$ {6 H; H1 @4 t9 F" x6 B6 d8 |
  276. popa9 d. y- D1 c+ T5 i, g
  277. ret' Z% z" ~: X6 c
  278. oldint endp
    3 M% E& K! g7 E/ m1 O
  279. 3 b. j9 a: T) l9 T0 e( t, j$ ]
  280. memmouse        proc# j1 W, O+ {; @  z+ W( ~
  281.         xor     ax,ax
    2 |+ k$ o4 ]! W
  282. int 33h# K" \3 K' z3 B& {4 Z- A
  283. cmp ax,0ffffh: `( o& I8 n5 y; }) s8 t( `
  284.         jne     not_loaded
    , b4 S7 {7 n, A1 @
  285. mov [memcopy], 1
    : c" G) a/ L3 l) U0 @8 X
  286. ret: U& U' L' b& Q& B
  287. % Z% e  {! e+ G- i3 g
  288. not_loaded:; _: I  `; A+ X
  289. 8 F( p' s4 V- D8 P# y) `; [) v, i
  290.         mov ax,2574h
    + s8 n: H# u5 W$ p4 K
  291.         mov dx,offset new_isr. n- w" J" o- p8 t" y* G
  292.         int 21h
    * [+ A* d; R" S

  293. 1 ~1 v2 H+ W/ F" u4 X' n$ R
  294.         mov ax,2533h
    7 Z) j+ c1 `' C
  295.         mov dx,offset new_33& l' O( t0 |7 M8 L
  296.         int 21h. N: G5 n) q# h# v; k
  297. 5 S. Y: {  D9 b) B6 D
  298.         cli
    / R7 j& N4 V) L9 w  g5 [
  299. $ Z. k: G- [* l1 y
  300.         mov bl,0a8h, h; A4 h& y: w" x) l3 o+ s
  301.         call keyboard_cmd
    ) ~; _. |. M6 p6 n' R0 i( B
  302. 2 p) ^1 O  u* M% u% ^* n, f( E! z
  303.         mov bl,20h1 }, d' T9 ~9 w2 v2 }
  304.         call    keyboard_cmd
    3 i+ H, x4 A5 Y
  305.         call    keyboard_read
    $ u( m: ?. l( P
  306.         or      al,2
    ) J+ n5 F4 r. b3 z" B* I
  307.         mov     bl,60h; o0 W- y0 z& p0 L; R2 p  [) N
  308.         push    ax
    7 F/ R% d+ |( j8 y+ b/ A9 m
  309.         call    keyboard_cmd
    6 e) l  H, _8 Q1 n) w
  310.         pop     ax) B# q- f( q, e7 d
  311.         call    keyboard_write# {2 B$ r: ^, k9 Q7 ]  Y8 p$ \
  312. * [$ [$ v9 Y; ?) P
  313.         mov     bl,0d4h( R, {+ \/ L- V7 q" A
  314.         call    keyboard_cmd6 i! a" s9 G( u2 Q; ~
  315.         mov     al,0f4h9 S+ E* V& g+ V9 Z- K3 T
  316.         call    keyboard_write0 t9 x: M+ s& H! |3 r
  317. / T; [( c% S" C2 {: F! P- T% g
  318.         sti
    & B+ A! k9 ^  A* `4 I/ _- a5 q1 q% s
  319.         ret
    8 V0 K: T" L' _2 S0 z
  320. call_user_isr:
    5 {* t: s! `8 g3 K- G0 Q8 o; H! \7 z
  321. db      60h7 a0 ~9 g. Q; [% u/ m  _, v: s
  322.         mov     cx,cs:[pos_x]$ @  j4 z2 k8 p
  323.         mov     dx,cs:[pos_y]
    3 Q" a/ L6 g5 B! \
  324.         mov     di,0 ;cs:[x_move]
    , b( M$ O+ K0 o5 `5 y9 M
  325.         mov     si,0 ;cs:[y_move]
    + o. q5 F+ e) R$ V
  326.         mov     word ptr cs:[x_move],0
    3 _/ U8 N& K- I7 V! T! f% _5 K  k
  327.         mov     word ptr cs:[y_move],0, Q* ~4 t: v* v  h% [0 H
  328.         mov     bl,byte ptr cs:[buttons]: d4 s& W) @( X7 ]* y
  329.         xor     bh,bh
    4 x2 Z' N8 B" g- W& t6 r- b7 d
  330.         call    dword ptr cs:[user_subroutine]
    / q, O3 a+ i0 |: {  l
  331.         db      61h! V7 [9 B  v7 p4 L/ c" J
  332. ret
    ! O  ?$ {, A. e$ ^
  333. new_isr:7 A$ L3 Y, V1 T, U2 o
  334.         pushf
    . H- g5 o( I" p7 l4 P
  335.         cli
    & b$ L0 z" h- n/ @* H9 ?
  336.         push    ax" D! \$ [, |5 t5 G) j
  337.         push    bx
    : G9 |/ H0 k8 Z$ O% |2 U3 F
  338.         push    cx) j2 K: i: r$ T
  339.         push    dx$ o! E6 w& u# W  Y' o& V, r
  340.         push    di
    3 K8 d* E' T  s; B
  341.         push    si
    - q% {. O; k  Z7 `' P: d
  342.         push    es
    / ^% r/ O3 u, ~3 P$ _; S
  343.         push    ds
    , \  [( H) M0 u! E8 @8 k8 M
  344. * b0 y  q; N+ @/ N4 S8 ]2 D1 _
  345.         push    cs1 t* f! @% [: r3 J8 j
  346.         pop     ds  T; `$ r; B# G$ Q) I/ D
  347. / i  Q2 ^% H* J/ [* t
  348.         mov     bl,0adh) L4 U7 X& E2 s* u  q- h# q
  349.         call    keyboard_cmd% P5 X- y% ]5 I! k! u) |/ {3 y0 R

  350. 5 d& g1 M5 w3 S4 d' C- _% c
  351.         cmp     byte ptr [first_time],0' f: h, @5 J/ |1 Z6 r+ T( Y# C
  352.         je      not_first_time# W* k6 `' P2 A

  353. ! W) Z! @5 {' s/ G, Y' S0 _
  354.         mov     byte ptr [first_time],0
    3 T" m4 q8 T- D& ]
  355.         call    keyboard_read9 T; m/ J" o/ z2 m6 t5 F
  356.         call    keyboard_read
    + V' J! h" U) g6 S+ t# R2 ~
  357.         call    keyboard_read
    * K/ S& w5 q! Z5 H$ W
  358.         jmp     no_show
    % W$ X" G7 U0 d% y: N) N( Z  ^
  359.   y6 q1 x5 ]; ^
  360. not_first_time:
    7 V2 e1 \' q, \, q# o
  361.         mov     word ptr [temp_mask],0
    $ ~# l* N. Y# \6 e
  362. * q( o8 h" `2 o% s- y
  363.         mov     cx,[pos_x]
    $ W6 H3 k; I4 E+ v& ~
  364.         mov     dx,[pos_y]
    * ]) F' O1 X$ }/ M. ?1 A
  365. 5 f% a+ ?1 ?6 C$ w. M! E! `( l" r
  366.         call    keyboard_read+ Z* `; s, E* y+ U6 M3 p& I4 d/ \5 V
  367.         and     al,7 ;34 k  N, @  l1 A: E8 E2 Q+ t
  368.         mov     ah,[buttons]
    ; f% Z( B2 Q* ]+ N! }, G
  369.         mov     [buttons],al, l3 S% h$ c6 ?, w+ ~$ K- V5 x) X
  370.         cmp     al,ah5 Z( j- t& C+ z# W0 ^0 H( ?1 a
  371.         je      no_button_change# p) P6 k' P' }# x  a6 x6 l& X
  372.         and     al,3! I) l" R" {6 K, F
  373.         and     ah,3. O8 x, ]' z& d
  374.         xor     al,ah0 ~5 c5 u4 s" |& _/ z
  375.         xor     bx,bx2 c% y, m: g$ A& i8 }1 X

  376. * }: B5 c4 E+ L5 g
  377.         push    ax
      Z! d4 E2 v5 h% x# B
  378.         test    al,2
    ; c9 Y# f" ^: N5 [1 A0 o
  379.         jz      no_right_button_change
    : {. t9 l2 y5 ]9 }7 y6 M( Z+ ^5 p
  380.         and     ah,2
    2 f( H" `; e  O8 y! a
  381.         jz      right_button_pressed
    % h$ J  ?/ S- C& J
  382.         or      bx,16! \6 w* {8 o: @* t1 b
  383.         jmp     no_right_button_change
    5 S+ ]: v* |# P. H+ h
  384. right_button_pressed:
    0 u6 P$ N. O! ]
  385.         or      bx,8
    1 x6 k9 \  @2 h. U% F
  386. no_right_button_change:, a% N: u5 P$ E- K0 c) @% M

  387. - p0 h" h. D  c6 F  W7 T! W
  388.         pop     ax. w6 W7 f4 k7 E/ C+ g$ r  e

  389. % x; m/ j* o+ D0 h/ T! {$ w$ v
  390.         test    al,1% u$ n+ u- d% f0 t. g# x4 H
  391.         jz      no_left_button_change! D6 ?2 W" j: H: T7 l
  392.         and     ah,1
    - O6 k$ s, s% x. r/ `1 r* J) W6 l% f1 O
  393.         jz      left_button_pressed; p2 i/ x2 w" C  Y* @  p4 T
  394.         or      bx,4
    8 F: e' Z. [5 y
  395.         jmp     no_left_button_change+ T4 T" m1 j; |. d0 E" c, \4 `
  396. left_button_pressed:
    # P! I3 |/ L; ^* y, C
  397.         or      bx,2  a( R; i) K. X4 F4 c& P
  398. no_left_button_change:5 g- U  l7 C/ O) l3 z
  399. " a! m- j8 I0 F3 @6 v1 x7 M( [* A
  400.         mov     [temp_mask],bx& F& Q- G" [! n# I( }! B& M: ~1 `
  401. ! @  K$ I: c! _
  402. no_button_change:/ J: S: ~  V: @
  403.         call    keyboard_read8 \. g& Z# C$ i1 A" @& @
  404.         cbw
    2 x0 n4 a; q7 I# W1 j
  405.         add     [pos_x],ax
    % e0 t* w4 [9 o) C7 Y; x
  406.         add     [x_move],ax0 d. M; L+ o+ E
  407.         mov     ax,[x_min]
    2 o: V$ ^" d6 \1 e
  408.         cmp     [pos_x],ax3 Z1 Y2 [  X" F% S& A
  409.         jg      good_hor1
    % ?9 d: U5 o, f6 u% |: G
  410.         mov     [pos_x],ax" |. J. B6 q! N* z, ^/ v0 ]/ W
  411. good_hor1:2 w( `& n# i) G
  412.         mov     ax,[x_max]
    . S8 u8 ^0 |" {# [$ F3 I: H# e) k
  413.         cmp     [pos_x],ax
    - o: ^/ w& j+ w
  414.         jle     good_hor23 R$ `) ~6 f; W- Z% R
  415.         mov     [pos_x],ax
    / |7 k% x" W5 c9 P* l* R
  416. good_hor2:/ `! f* w2 _' y- p
  417. % Z3 B, A7 R* @+ T8 @
  418.         call    keyboard_read
    ' R+ c$ w2 v& C" ?$ T; j
  419.         neg     al
    6 N3 h$ Z3 g. |6 d5 u4 B
  420.         cbw
    - H2 L2 F5 w! k! l) o/ B1 O
  421.         add     [pos_y],ax0 m( J; t; g& Q$ [- M/ F. \- h
  422.         add     [y_move],ax. L' H& q* A1 E; _4 U
  423.         mov     ax,[y_min]
    $ {% Y5 {3 N- R" L8 x
  424.         cmp     [pos_y],ax/ @# S, [8 j3 c6 N; d7 _
  425.         jg      good_ver1! }2 p  @' Y7 E* r1 w
  426.         mov     [pos_y],ax! j" s+ A) d5 k/ q$ u- N! o2 z
  427. good_ver1:& Y. Y. J) H! k" g( N3 l( H
  428.         mov     ax,[y_max]# H8 q3 q2 `1 |( a4 s; P( ]
  429.         cmp     [pos_y],ax2 O3 P0 ]/ E% y2 N
  430.         jle     good_ver2
    / L6 B/ _! S8 c% H8 x, u
  431.         mov     [pos_y],ax, k4 E3 }) E( `8 B0 _# I
  432. good_ver2:4 \# ?1 b7 Q. v5 N$ ]* k0 f1 t3 L3 t+ j4 R

  433. : J" G) H8 h5 G' ~  t8 k8 c, s9 B8 ?2 k3 U
  434.         mov     ax,[x_move]
    & o& X6 D' X) l
  435.         or      ax,[y_move]- y$ B- `! i6 c* T
  436.         or      ax,ax
    ( j' M; T3 B3 r+ S5 P* U  z
  437.         jz      no_change_position# f+ b; `4 i; ^
  438.         or      word ptr [temp_mask],1/ ^3 M5 j  h- b$ j5 E) b+ d0 s# k/ g
  439. no_change_position:
    * b% D3 ]+ o% _* U' A

  440. / X& M* T+ }5 A. H+ F9 m9 Q  E
  441.         mov     ax,[temp_mask]* F2 J. @) e  [/ i3 l6 y
  442.         and     ax,[user_mask]* [. Z# R+ q0 @' A
  443.         jz      no_call_user4 E! ?; l% i6 y+ Z" h* f  `& y
  444.         call    call_user_isr; I" x; D$ N) N6 P6 _7 _
  445. no_call_user:8 G7 A3 P- p# h' F+ a6 X! j

  446.   _( l' W5 ]) B; S3 c  \
  447.         cmp     byte ptr [sm_flag],1
    - X2 z, ?5 {/ ~# y& ?% ]
  448.         jne     no_show6 K4 `3 p$ n6 u% a2 }# g9 b( p; d
  449. 1 J% W! b4 s5 o1 T* `
  450.         shr     cx,3
    4 r/ A( L8 q) M2 e- d
  451.         shr     dx,3
    1 y0 Y% S( B$ I% R
  452.         mov     ax,80- L' F$ ]8 f. `' ]+ Q: n7 p
  453.         mul     dl0 N' L+ s2 P7 }' R% x* Z2 c  d
  454.         add     ax,cx  f. A- x4 K  V9 v/ F7 O, h
  455.         shl     ax,1
    ; T+ J+ W! C" p- d  r  q
  456.         mov     di,ax
    0 @0 V2 v# t- A' V3 k
  457.         mov     ax,0b800h! R7 h( X, a& u& P) B4 `, Y" I
  458.         mov     es,ax
    % _& |: e/ A- o; l
  459.         mov     ax,[save_char]1 f6 K1 }- x7 \: v
  460.         stosw: e. c" O) N* O, {
  461. ; |* m0 `9 ~' h& s3 S
  462.         mov     cx,[pos_x]  l9 J9 q0 }! G5 c
  463.         mov     dx,[pos_y]) ~2 L% X& J$ d% M
  464.         shr     cx,3! D( r) @+ \3 c& t; w
  465.         shr     dx,3
    " c7 l' B; Y$ I8 Z' Y! E
  466.         mov     ax,80
    % Q( N) E( E: P2 n3 z
  467.         mul     dl( G: L3 M3 B. M2 h0 Q; P; d! J
  468.         add     ax,cx
    9 f  K; ]6 n6 l, }( S; x
  469.         shl     ax,1& h3 \/ O( V/ @! Z8 M6 v1 M) H
  470.         mov     di,ax
    , N; ?# C: L( g9 h) l
  471.         mov     ax,0b800h# s; ~! S9 U; R( Z7 |' ^$ z* f
  472.         mov     es,ax
    - b- }5 X: x, @0 f& O" m4 M
  473.         mov     ax,es:[di]+ M9 r5 O/ j' z) ?7 ]/ c4 U* v
  474.         mov     [save_char],ax+ D! e" F& T) B9 k: n& [7 |) M
  475.         not     ah
    ! _' r* ^" i9 x0 b7 y
  476.         and     ah,7fh, V' O1 Q" H  m& C4 B! b! M
  477.         stosw
    / L' v* p* c( p- r6 a' j
  478. no_show:( E& h% O0 N) J2 N
  479.         mov     bl,0aeh
    % X+ u8 G4 N7 ^9 A9 B. v
  480.         call    keyboard_cmd
    * ^# W! D; w9 q9 M
  481. + n. w! `' [# ~6 l# s
  482.         mov     al,20h
    9 @' W) c9 r+ g0 H. }
  483.         out     0a0h,al% Z2 Z, Y- T& X! F$ H) y
  484.         out     20h,al5 ^# K' O- y) z7 A7 f& d4 x

  485. , a$ a" P, U; A* S. S
  486.         pop     ds
    $ z2 o, ~4 O& x- G$ ^
  487.         pop     es- A" W& s) m: F) v0 k% C+ Y
  488.         pop     si
    ( T+ k: |8 I- S; z! L
  489.         pop     di
    ( L( |- A  g- D5 s+ r
  490.         pop     dx
    0 P( N' u7 x6 t6 [1 i' C
  491.         pop     cx, n9 L5 b8 d9 e* C1 G
  492.         pop     bx
    8 b1 \' p3 o$ X9 ^8 `
  493.         pop     ax
    4 U- h/ {" N0 N$ j
  494.         popf0 z- z+ g& W! U1 {- L. k
  495.         iret
    7 D/ W9 i# ]! w* o# H
  496. , h. r1 U. J% }* f
  497. first_time      db      17 Q# g$ r% r8 Z% n0 N) y5 X
  498. buttons         db      00 A( A+ j* Q1 s0 ]4 d9 [+ d( W
  499. pos_x           dw      0
    0 n+ y; j. y# Y
  500. pos_y           dw      0
    / u" H# E% C5 Y- ~/ T6 F% b* p
  501. sm_flag         dw      08 U7 R# X) E/ ?3 p
  502. save_char       dw      0" r5 W* _: O- h+ O- I( T
  503. x_move          dw      0
    8 _$ t, z7 a1 E0 G9 R0 i
  504. y_move          dw      0
      y8 z7 W4 b6 J. C
  505. x_max           dw      639
      t3 T' d, n) l* n( v- y# \
  506. x_min           dw      01 e, n& \# D; Z4 d& @! X! R8 e
  507. y_max           dw      199' k5 Y- c: w# |7 {! ]% B
  508. y_min           dw      0, h& z# U1 W, k/ d* G
  509. user_subroutine dw      0,06 k3 {: c( d4 [
  510. user_mask       dw      0. `) O  o2 ]1 g* N. W+ v8 J
  511. temp_mask       dw      0* d% O) C: C. K/ S* \7 ]; F
  512. 0 d; A: t# q/ H; u6 l; e2 A8 B3 c
  513. keyboard_read:
      D  e8 c& _* \; X  d1 D' [
  514.         push    cx% @9 x$ f: Q9 |4 J( R) O
  515.         push    dx7 L- ~4 X* \0 J) I
  516.         xor     cx,cx1 a/ s) y2 t" M1 N1 g7 j! z) R. Z
  517. key_read_loop:
    7 e' I" G' S4 q6 W: n2 e
  518.         in      al,64h
    / n& x: p# Q2 L1 w. l
  519.         jmp     $+2
    4 s6 O( p6 ^1 I. \
  520.         jmp     $+2  Q; L- ~! }4 Y" P
  521.         test    al,1
    ( r2 O5 @0 N+ t5 V! ]& F4 J- ?7 w
  522.         jnz     key_read_ready6 _; f) o# \) Z) q
  523.         loop    key_read_loop
    ' h1 U4 `1 y! b3 O& i
  524.         mov     ah,1$ y! E9 k4 S0 V) Y; D/ I' T" R
  525.         jmp     key_read_exit' u7 F. {0 v7 V+ r; z
  526. key_read_ready:. a5 Y# f* L8 w1 @& {
  527.         push    cx* v4 z) U; B* z8 C6 C' r. v
  528.         mov     cx,32# T5 X& a, q) V3 o' f8 z  B
  529. key_read_delay:
    ) M  j& J5 |4 T# Q; g7 o% ?
  530.         jmp     $+29 W( z1 l+ I' T. x9 ?" ^
  531.         jmp     $+2
      D4 H, r2 R% o. k5 L/ l* J
  532.         loop    key_read_delay
    $ {, e, W1 P9 f# ~" S5 X- z, r
  533. * k5 x9 \* ~  ]" s3 @3 F
  534.         pop     cx. }3 k+ [7 \; ~0 W4 T

  535. 5 S3 S* g* e. G- n7 \( L  R4 ^; f
  536.         in      al,60h
    ) n6 d" j2 d  Y& c
  537.         jmp     $+2
    % M! T0 b( T: Z0 M- c1 O/ i$ ^
  538.         jmp     $+2
    4 D/ @, @1 N( A4 l( c) m  |
  539.         xor     ah,ah2 q+ \  [% _7 ~7 ]9 k% ]# f
  540. key_read_exit:
    % a. s- `& X7 u# L% j  G8 ]1 v9 K: \
  541.         pop     dx
    3 G; H  P9 r" \, \: D; a$ H; W
  542.         pop     cx2 L% ~2 n0 g  a! |. e, [( Z7 g* Z
  543.         ret+ K' o) Z! r* m3 _* Q' J3 a1 W

  544. ( d4 f! v" S) y% f' E
  545. keyboard_write:
    9 T6 Y. F* C9 D- j: Y( A0 ~
  546.         push    cx
    * W7 G( h( D. ^; H/ w
  547.         push    dx
    2 a( h' n& N- r( T! q$ P1 k& b
  548.         mov     dl,al
    : L& n% q: s. {$ u8 d  m2 D( X7 W
  549.         xor     cx,cx" ^0 D. j9 W- m- J8 y
  550. kbd_wrt_loop1:
    / W! W7 \$ T; v4 b- G% _, ^! u2 f
  551.         in      al,64h
    8 B( G6 o9 A8 L; f5 m; B: R% x4 ~
  552.         jmp     $+2
    . h* H  F$ h+ C' Z4 J
  553.         jmp     $+21 ~3 a. v* ^* b" k! a% k
  554.         test    al,20h9 R+ O6 s3 d* M: @
  555.         jz      kbd_wrt_ok1) ~. y& f0 k! e
  556. * @1 M- o/ }# z  w
  557.         loop    kbd_wrt_loop1
    1 L8 S4 C5 |7 y# W8 I% F
  558. 0 C1 T; x; M. O- V- R
  559.         mov     ah,1. y5 p7 M! g- g# @  W, {; T9 n
  560.         jmp     kbd_wrt_exit
    6 v0 m" D1 `  Y" A+ p$ V! D7 f

  561. ) H5 h. j- `( K  \0 O
  562. kbd_wrt_ok1:
    % u+ o# @1 o& p# P1 g4 V
  563.         in      al,60h
    ; \: J- W7 F( j

  564. 2 V9 t- t( W; `7 c" }2 v" B! M
  565.         xor     cx,cx1 m" Z2 F' y1 p. O  Z
  566. kbd_wrt_loop:" e0 @! D& A2 L" M$ s
  567.         in      al,64h
    3 B4 [( X2 o2 ]
  568.         jmp     $+2
    8 l1 _2 Y9 v7 d; x4 O' ~; N# P
  569.         jmp     $+22 O, j) S5 a+ N
  570.         test    al,2
    8 e6 O4 S5 z4 J( W) C
  571.         jz      kbd_wrt_ok: ?- U& R- d2 R& b

  572. : H( B" b1 U2 Y* b
  573.         loop    kbd_wrt_loop
    * H0 f. L) U2 t) }  R

  574. / X4 R4 V( }% A( n6 i* N, y" g
  575.         mov     ah,1
    0 C2 k  Z0 P' I7 y  b
  576.         jmp     kbd_wrt_exit. d* I5 y+ Y6 |7 ~& p) R3 C
  577. % E) y8 x, u! H$ P8 j
  578. kbd_wrt_ok:6 l3 W) a" l8 f! `8 Z$ L
  579.         mov     al,dl
    ( `3 a4 |6 @( `+ k7 u* A
  580.         out     60h,al- ?& S/ X' i( L2 q
  581.         jmp     $+23 I0 H$ C# N2 R
  582.         jmp     $+2! Z4 D' a  c( _" x
  583. ; o/ {. a4 a) _  ?/ y3 V3 a2 T% A
  584.         xor     cx,cx  y+ X, v! b& t5 n, m: x
  585. kbd_wrt_loop3:
    ( s+ B# P! X% f8 K9 Z
  586.         in      al,64h/ q) D# S# m' e, |
  587.         jmp     $+27 n1 C  u/ w. c3 z8 p( ?2 d
  588.         jmp     $+2  I0 m: v0 Q" Q0 U6 R6 j9 H
  589.         test    al,2* }0 ^/ k( i% c2 `/ ]( |
  590.         jz      kbd_wrt_ok3
    - H8 `, C. Q+ o9 B2 h4 `

  591. + O1 t2 @7 R1 x+ l
  592.         loop    kbd_wrt_loop33 i1 B# |, [4 S. [/ A

  593. / g8 z$ K* v5 t  k0 [! Z/ i
  594.         mov     ah,1
      }" Z) [, t4 ]$ P) u
  595.         jmp     kbd_wrt_exit( v+ Q8 d6 b9 E$ ~0 ]0 T3 \

  596. / h# A$ f/ [: W# X2 |
  597. kbd_wrt_ok3:
    ) ~8 h% G9 A9 l' k, B
  598.         mov     ah,8; V# C$ X5 U' A) Q. J( R7 c8 V9 l
  599. kbd_wrt_loop4:
    : U8 f1 [: j" P& `
  600.         xor     cx,cx
    2 p8 o- D$ L! m+ U# m9 b2 k. V
  601. kbd_wrt_loop5:9 {' [2 V3 V5 F. q
  602.         in      al,64h8 `) T) c0 O, Q! b6 x
  603.         jmp     $+2# z: `, J+ `& a/ g1 y3 U! A8 i
  604.         jmp     $+2
    & E9 x2 ^3 |  ]6 B
  605.         test    al,1
    * T8 T" ^9 `0 k, V  |% o* {' {
  606.         jnz     kbd_wrt_ok4
    1 A  T3 f( P/ g3 I2 [8 D+ Q( V

  607. / f5 B" U/ O- `: B+ C( J
  608.         loop    kbd_wrt_loop5
    % ?7 N: m/ J0 f

  609. 7 O2 Y1 P; V7 g
  610.         dec     ah
    2 G, W7 Z* B/ k1 I/ H
  611.         jnz     kbd_wrt_loop48 z! o* m+ @3 X  u3 ^$ X

  612. 8 x, X  L3 o* z4 P
  613. kbd_wrt_ok4:2 e* `. }$ U1 O
  614.         xor     ah,ah
      U( i2 ]* s/ g7 v0 z) T! t
  615. kbd_wrt_exit:
    ' W6 |& l6 ^) |. g
  616.         pop     dx
    " a  a% F/ Y; y# D5 \' H* u
  617.         pop     cx
    % l; j* A# \5 l: d9 V
  618.         ret
    6 r0 w  o2 {  R
  619.         
    : X+ p6 \5 P+ g0 w
  620. keyboard_cmd:
    7 l) P" K# \9 b+ A+ R: g* \
  621.         xor     cx,cx
    & q! w8 {3 e  x# l  j# r
  622. cmd_wait:) |1 o% o. c" i
  623.         in      al,64h
      |/ E8 H' \7 z- Q4 ^) W9 c
  624.         jmp     $+2
    ; |) W% J% s- p8 q: O
  625.         jmp     $+2: A2 w: c1 D! {
  626.         test    al,2
    / _. r( n# L$ v$ h! l, t
  627.         jz      cmd_send
    $ ~. N4 ?! I. p7 \, U& k) @& [9 W$ |
  628.         loop    cmd_wait
    6 W' K7 s  F! |  E$ g8 h  N) q1 D

  629. ! w2 ^& w& {1 K
  630.         jmp     cmd_error
    , {" K* v( K. H- L  k
  631. : w* a  X6 \4 O: Z
  632. cmd_send:/ r0 j0 G7 F$ l# O
  633.         mov     al,bl
      U: `$ a; z* y* O
  634.         out     64h,al) P# \! @! W6 I6 d0 y$ o
  635.         jmp     $+2+ B* U3 Z2 |' x# P/ a* f4 l" q
  636.         jmp     $+2
    - k9 c% s3 l4 l" p& U" g0 H7 S

  637. 4 ^* M4 ^7 L$ b3 q5 W0 Z
  638.         xor     cx,cx# ?0 L& H4 A% U. C, f: z
  639. cmd_accept:
    . `4 v# ?  v) u5 y6 j  G1 z# ]
  640.         in      al,64h9 k* G: b5 n7 t/ @
  641.         jmp     $+2
    ' I' x/ s: t. R, c2 m- }
  642.         jmp     $+2" U& ~) Z* b, Q% Q: }
  643.         test    al,2% O! v- q0 L. w
  644.         jz      cmd_ok( \0 e. |) c* H$ V* k' l. M: d9 j
  645.         loop    cmd_accept
      c: u: S0 z1 J2 O' Z
  646. 8 d1 {) F5 H- m& }" w
  647. cmd_error:
    7 z0 w: h4 I- Y/ F1 q: J
  648.         mov     ah,1* x! y) o, S3 c! k* P
  649.         jmp     cmd_exit
    2 Q) v/ ?, [% H! W2 g+ V: J
  650. cmd_ok:" q) w  s: B& t2 B9 c7 g6 O  T. x0 D
  651.         xor     ah,ah
    2 a+ M) \* D# C4 Y& n& U$ e  N
  652. cmd_exit:
    6 Z5 \- V% {6 R4 `: T0 Y5 j
  653.         ret5 t: W. Q8 ~; T( l. g  R

  654.   t: p! v7 F2 v$ z) a/ h  r5 c# S
  655. new_33:) N+ O% j- [4 L0 H" x9 p
  656.         cli2 c$ G5 c! d1 K0 w6 g$ J
  657.         cmp     al,08 b) M' y2 b# V
  658.         je      reset_mouse
    9 g5 ~% J( L% e$ [* [) b2 o+ l
  659.         cmp     al,1
    ( V# a: g* t+ S, c( |( ?- T
  660.         je      show_mouse
    5 B) ^2 m* Y# {
  661.         cmp     al,21 u' W& h0 N  ^; E$ ]
  662.         je      hide_mouse
    9 c5 \  A9 v4 H* R, z" b
  663.         cmp     al,3" z+ L* y& F& q9 |- R& `
  664.         je      get_pos
    ( X6 h1 w# f$ R# |8 N2 o) q( R
  665.         cmp     al,4
    0 `$ v' w, ?5 u  ~
  666.         je      set_pos2 V) C. N, i! L$ B/ W/ c* s
  667.         cmp     al,7
    / E: H3 U9 }$ {' Q! O
  668.         je      set_hor_pos
    2 g& G, g! d6 {( ]0 P
  669.         cmp     al,8) l; m/ b2 p. x
  670.         je      set_ver_pos
    8 h; ^- A# W  U( s" J6 {, z6 P
  671.         cmp     al,0bh
    ( i# G" j1 {. T
  672.         je      get_mouse_movement: }0 N* _4 g* Y6 ~
  673.         cmp     al,0ch  b! L! t8 Z* i! I1 Y* b" |3 f
  674.         je      set_subroutines$ B* A' _3 K) y) W
  675.         cmp     al,14h' B% c" ^4 ?( G9 [
  676.         je      swap_subroutines9 A0 V8 }5 y6 D2 Y4 V7 B  q
  677.         iret% D/ `8 _5 y# W5 O0 X+ k4 B
  678. 9 V/ L* e# n' [4 r% f" n
  679. reset_mouse:
    # p3 a& y4 M9 w
  680.         jmp     _reset_mouse$ s& j7 e9 i3 N; B
  681. show_mouse:+ y% U& o$ E8 h: z+ j+ G
  682.         jmp     _show_mouse
    % W  z) n7 c/ C) c
  683. hide_mouse:/ b8 m$ V/ J6 X3 b% [* s4 _
  684.         jmp     _hide_mouse
      o0 T/ p$ Q" c+ W
  685. get_pos:+ Y6 y; b/ u7 X1 ]/ A/ P
  686.         jmp     _get_pos+ p7 j6 c3 }8 x2 I5 z) m2 o
  687. set_pos:
    : ]- {' ^. e2 x; o: ^, c; F
  688.         jmp     _set_pos
    7 {4 l& S2 b( R, `, i7 d
  689. set_hor_pos:; I' |. I* `- p: Z
  690.         jmp     _set_hor_pos
    0 w. W9 n+ i. I+ h2 D& i& P$ T9 E% o
  691. set_ver_pos:- W" c, P1 M5 q4 J
  692.         jmp     _set_ver_pos
    # E( h3 k( w: {* [: \. ]
  693. get_mouse_movement:
    / o7 g4 x( k- l+ R: P. B
  694.         jmp     _get_mouse_movement$ w2 M0 m4 r/ D8 [/ ~3 b
  695. set_subroutines:2 J0 H  Y7 u' O* l* e8 R
  696.         jmp     _set_subroutines4 Z: i) X, H* s" {+ ~
  697. swap_subroutines:
    + l7 x9 X6 \; w: m9 ^
  698.         jmp     _swap_subroutines
    " {  _/ l( k3 i. @2 _' o! T

  699. ; l' w3 F+ ]: T
  700. _reset_mouse:: ]% c( f7 S! B- Z7 ~1 g
  701.         mov     byte ptr cs:[buttons],02 }5 p1 R/ R2 q+ M% N" ], P& P- J" d
  702.         mov     word ptr cs:[pos_x],0# \" I) c2 o; S& f% j1 o$ t+ e* V
  703.         mov     word ptr cs:[pos_y],0; b) B4 ^4 ~) S+ Q5 v
  704.         mov     word ptr cs:[x_move],0
    * r3 X5 T5 q+ s' S. F  H
  705.         mov     word ptr cs:[y_move],0' O2 ^! w5 n9 L# u2 f9 ~
  706.         mov     word ptr cs:[x_max],639; {- A. \  S+ `' W
  707.         mov     word ptr cs:[x_min],0* N9 m2 ]& h1 |6 M, n- n2 s5 b
  708.         mov     word ptr cs:[y_max],199
    3 L$ Z9 k9 F/ _
  709.         mov     word ptr cs:[y_min],0
      ~% I: Z3 n. e2 }6 i' v
  710.         mov     word ptr cs:[user_mask],0  n4 I4 E4 }( J1 M
  711.         mov     word ptr cs:[user_subroutine],0, B1 |2 i% y0 v7 w# q# ]+ @& E
  712.         mov     word ptr cs:[user_subroutine+2],0
    $ ]# e: \' S; @- T) _
  713.         mov     ax,0ffffh2 P9 I8 Y) k( R# }
  714.         mov     bx,3/ o$ X, D2 `% I: w1 k- ~; ?
  715.         iret
    / N% G/ {0 q# K, B9 `6 m# \
  716. 9 x7 ~' O3 }$ l- T) ~/ B; \& B7 p0 u
  717. _get_pos:3 o' t. F7 a; z7 l/ e1 }0 ~
  718.         mov     cx,cs:[pos_x]0 m/ {" p  Z$ G
  719.         mov     dx,cs:[pos_y]
    ) `) ^/ a; i5 G* H
  720.         mov     bx,word ptr cs:[buttons]9 B# d$ |+ ~9 z$ Y8 y
  721.         xor     bh,bh9 e* Y: |' u6 D$ I. z, [, D5 t
  722.         iret
    $ f! B, I! J' ^( ~) ^" E

  723. 6 l. u$ o# u9 I& m7 @
  724. _get_mouse_movement:
    + e1 b. T7 O& {5 R! V; l8 t
  725.         mov     cx,cs:[x_move]
    : ?, M9 \  T3 {/ ]6 E1 k) V
  726.         mov     dx,cs:[y_move]4 w- ]8 M; d* w
  727.         mov     word ptr cs:[x_move],0+ G: h* J7 k, W! `
  728.         mov     word ptr cs:[y_move],0
    : \; n! L  W; Q3 V" P
  729.         iret
    4 u) d  Z8 S. o; u8 K8 c0 ?
  730. 0 B4 z( i& A/ s7 L4 v5 b
  731. _show_mouse:
    ' X, c( q7 ^4 k; j1 E
  732.         push    ax
    . `6 n1 ?5 g# ~3 ?4 _/ ~0 _
  733.         push    bx) _- _: \. z9 u) k1 l
  734.         push    di
    ' [, v, q+ P6 D) P2 I, F- n- n
  735.         push    es: K3 f# h6 K8 `) E  Q0 V3 D
  736.         mov     byte ptr cs:[sm_flag],1% L- P) i5 j5 ~7 \
  737.         mov     ax,cs:[pos_y]
    ; V% T5 j- b) L- `& s/ O- b
  738.         shr     ax,33 ~  k# y, Q" s& U
  739.         mov     bl,80
    # q) z- M) q7 g& j3 e/ M+ G
  740.         mul     bl
    9 [0 g6 k+ S: Z2 V' I
  741.         mov     bx,[pos_x]
    % s9 T( C6 q0 O3 [' \, C! y
  742.         shr     bx,3
    1 K: J( V$ O9 u- k5 s* O
  743.         add     ax,bx; ~) \2 Y0 Q/ v& c
  744.         shl     ax,1! C. E3 P6 w0 r  H. Z
  745.         mov     di,ax
    5 E2 _; v) n; V; s
  746.         mov     ax,0b800h% y$ Y0 z5 `0 A% k% _$ B
  747.         mov     es,ax
    , |' s) e' K: ]7 [! O7 S
  748.         mov     ax,es:[di]
    + ?0 r- {3 D1 J/ {& F$ F& P
  749.         mov     cs:[save_char],ax' W' b, H" R# o! i5 k
  750.         not     ah
    1 T+ k& ^; o& g  k4 @) f2 H9 N1 T
  751.         and     ah,7fh+ d3 `: @/ T7 D4 V8 Q# D
  752.         mov     es:[di],ax& d8 ]1 o) a5 D" C
  753.         pop     es0 p/ G" V! D5 a: \# [  s  F
  754.         pop     di
    $ M  R6 K. q  J5 i8 P
  755.         pop     bx
      N, p# c5 {. e
  756.         pop     ax
      Z# D. A5 ^* K/ r
  757.         iret+ p; h7 Y1 i* A8 j( ?
  758. 1 ]* s. J2 g. e* p, O
  759. _hide_mouse:: U8 y; [/ r7 u9 A6 [" N  J2 T* _, o
  760.         push    ax
    % C/ _! \6 l8 M; b& e
  761.         push    bx% X9 w  w. S" S: c
  762.         push    di! h9 h9 C+ X9 P$ k+ e8 k( g
  763.         push    es5 q2 g2 p: ]% @5 ^+ ?5 g+ Z7 p+ b
  764.         mov     byte ptr cs:[sm_flag],0
    + G% o$ g! O9 c
  765.         mov     ax,cs:[pos_y]8 b9 Z; ?4 \) C; W5 q+ X0 r. e9 }
  766.         shr     ax,3; Z7 W- W$ C0 @% V6 T
  767.         mov     bl,80
    9 Z$ p0 Z# Z3 w" q) g
  768.         mul     bl
    5 S2 x9 @7 F0 q2 E6 i. c3 E
  769.         mov     bx,[pos_x]7 ?2 J. w* |8 A, j* g9 x6 f
  770.         shr     bx,3
    ) ]/ m3 n/ M9 n  X6 e
  771.         add     ax,bx& e+ I8 J4 N4 w, O/ M5 P" r) S
  772.         shl     ax,1% j6 r& \8 n6 w) l+ _7 d/ l& L
  773.         mov     di,ax4 ]- h% E( d) ]; H) O. y
  774.         mov     ax,0b800h  Q  l9 q* |: u5 _' W% w1 v1 @
  775.         mov     es,ax
    * @  \3 J, k5 J; z, t7 {( h* H% E
  776.         mov     ax,cs:[save_char]
    9 m/ M4 T7 w  T# ^
  777.         mov     es:[di],ax
    . b+ O- k6 X: `5 N& c3 u7 A) d
  778.         pop     es
    * b2 Q6 a( J% D/ s
  779.         pop     di6 y' |5 K' U& ^) H5 o6 z
  780.         pop     bx0 j2 u1 d3 E0 z" e) S9 I
  781.         pop     ax
    - B% y# J6 z9 a4 b! q
  782.         iret
    ; m! D% g0 n* g, C0 M

  783. 8 @' }9 s) M: u8 J
  784. _set_pos:# \, N' C& l/ P* X
  785.         mov     cx,cs:[pos_x]/ s# z; i% m9 R* k
  786.         mov     dx,cs:[pos_y]$ l$ A& Z3 \1 q' ~+ [; Z# k4 f
  787.         mov     word ptr cs:[x_move],09 N+ s6 S! O$ a2 e1 O
  788.         mov     word ptr cs:[y_move],0
    / A$ B; J3 K6 Y5 E7 o& K
  789.         iret
    8 u1 e$ P- a( @7 W$ V

  790. # O. k- O- r% y9 p0 B3 l
  791. _set_hor_pos:
    . I- p3 U% Y+ W3 f+ N( w
  792.         call    max_min% I. O' h$ ]7 V. g2 E* {1 Q
  793.         mov     cs:[x_min],cx
    ) j; s8 _0 n7 x
  794.         mov     cs:[x_max],dx
    4 ?1 q: o- P" f6 M- }
  795.         cmp     cs:[pos_x],cx
    + v) R9 v5 e+ _
  796.         jge     good_hor_min
    : ^( i: T- T$ M; _0 m/ `! Y  x; J
  797.         mov     cs:[pos_x],cx
    8 `- O, x( F& w1 f( v4 {) K
  798. good_hor_min:
    # v! h& k/ [6 l9 x5 H! g! u9 _
  799.         cmp     cs:[pos_x],dx
    5 ^5 K; ~) M0 h; O
  800.         jle     good_hor_max2 N9 n" Q9 T5 P) o; A; ^! }' a
  801.         mov     cs:[pos_x],dx
    + A, H$ U* h$ ^6 }& X
  802. good_hor_max:* m2 U0 g* T; b% N& Q
  803.        iret
    % Y9 i( T* R# v3 ?! Z( I
  804. # r9 a# B4 S2 K9 y* N  I
  805. _set_ver_pos:4 R1 s$ S; p( Y. v* T. l0 @$ Y; i
  806.         call    max_min
    5 S' h% T  F0 X0 _: @; ~" P
  807.         mov     cs:[y_min],cx
    # U0 C# g7 E/ J- O: }: K% p2 z
  808.         mov     cs:[y_max],dx
    6 g; \' ]* Q- D* _8 d  C
  809.         cmp     cs:[pos_y],cx
    $ x# L# c( F3 m4 ^6 a& M" Z
  810.         jge     good_ver_min
    8 Q7 V) q' w& g0 }8 V
  811.         mov     cs:[pos_y],cx
    7 C" j; \& a+ F+ k
  812. good_ver_min:
    8 b# r. m- a/ D& o) K% o
  813.         cmp     cs:[pos_y],dx
    * w' j3 p" Q4 i( V! {- d% |+ C
  814.         jle     good_ver_max. Y) W/ J) a) e" c6 l
  815.         mov     cs:[pos_y],dx$ V) i" ^5 n; z' S% V9 S
  816. good_ver_max:
    * D; s, J% Q" {0 N3 V' E
  817.         iret
    / e; q; o7 h, z$ v* o
  818. ( [+ M, f: u/ v% A! N, `/ Y$ v0 U
  819. max_min:
    ; g- S6 H+ O6 N9 |+ w* A: h$ |& Q; Q" G; p
  820.         cmp     cx,dx
    ) l# e, x7 y/ {' R( ?1 z
  821.         jle     no_swap
    1 H5 k  K$ w4 U4 ~0 i
  822.         xchg    cx,dx
    + D8 ~5 K9 b. T) X
  823. no_swap:
    ; P; O) r1 s" I9 t1 {
  824.         ret
    2 e1 R7 @. }. ^: m7 H8 }$ q' C' A( G

  825. 1 F. g. I5 p0 o2 B0 ^/ h% K
  826. _set_subroutines:
    7 N7 M% ?0 u( w$ z+ d3 l: @" k- Z
  827.         mov     cs:[user_subroutine],dx
    0 }& x6 L1 }3 C8 |
  828.         mov     cs:[user_subroutine+2],es6 h  N1 I) k6 m& E' R
  829.         mov     cs:[user_mask],cx
      ]7 w2 m" ~* o* N" O
  830.         iret
    ! A# b1 j" U6 @+ r/ u4 I

  831. : r& E9 ?# R& s8 n" j, O& @
  832. _swap_subroutines:2 h; Z$ U7 U9 ]( o+ s# `
  833.         push    word ptr cs:[user_mask]
    5 Y: N6 U# ~8 S' Y7 H* V
  834.         push    word ptr cs:[user_subroutine+2]" W( ^. k( x, N1 n, ]1 d/ r$ [
  835.         push    word ptr cs:[user_subroutine]
    ( ~: |& _4 t2 o0 e5 `/ m
  836.         mov     cs:[user_subroutine],dx
    - y( {9 m: i0 C7 P- F
  837.         mov     cs:[user_subroutine+2],es2 H  ]0 z' R4 k& [1 l- H
  838.         mov     cs:[user_mask],cx
    9 @  r0 q# a4 m
  839.         pop     dx8 Y: e+ R4 ~" c4 n
  840.         pop     es# T: E5 L% M  J8 c
  841.         pop     cx6 i8 b7 U, J8 V4 E8 c2 n
  842.         iret
    1 w6 s; F; U  h- ]  a3 V1 G
  843. + \$ |/ h. e2 \2 c
  844. memmouse        endp
    , G, a) i7 q+ U
  845. # K* S. C5 \5 t2 g
  846. endof_start:
    7 G; Y: n5 ~+ F0 N# Q5 \

  847. 3 y9 j  Q* I2 W( z
  848. emsg db 'No mouse driver install error!$'& Q( V' B" v5 Z8 n9 H4 ~; [: }
  849. old331 dw 0
    ' @7 C6 L# d8 F. |9 P+ c5 ]2 t" X
  850. old332 dw 08 |# p$ V% o8 t+ b* [' C+ \
  851. old741 dw 0
    4 w% e& A6 \% S' x
  852. old742 dw 0
    9 _' C  a( m2 S3 k. U% ]9 P
  853. memcopy db 0
    0 a, l6 ^- u4 Q/ M$ C! @
  854. okcheck db 06 r% C# u3 }7 Q% G3 L9 ]
  855. pass db 0
    : w5 v* u# Y5 Q, ]
  856. chkl db 0
    0 ?$ H3 K2 I7 Z- e
  857. lk db 09 \6 r7 i$ l; S: [5 \: f
  858. chkr db 0; Z( f0 ?' |; g5 T0 {( R- W
  859. rk db 0
    ; D1 h4 |* G; @; d9 u6 h/ H
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    7 ~% L1 ?$ Q- B, F
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    % K0 c) E& A% X* H5 x: v
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    2 G) L  l+ I# C# K/ e) I1 |2 U+ H) ?: m
  863. db '                                                                                '
    2 g! {- U4 g9 V# p, Q/ M
  864. db '                                赏屯屯簧屯屯突                                  '
    * |8 b; }3 p# P
  865.         db      '                                ?OFF汉OFF?                                 '6 i: o' x5 O' r9 c0 G0 g, S
  866. db      '                                韧屯屯既屯屯图                                  '
    / f3 h  t9 S/ A8 F
  867. db '                                                                                '
    / W5 F* O$ d3 R9 E
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    ( n  q) |* y, Z  r* C
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' " ]; Y& c: _: }, E! A& h: |5 k/ }
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '& U9 M. T0 a5 E

  871. + N  q5 G) g9 v3 ^% [
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!0 J2 |( K0 X# B3 [( C1 I0 q
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 7 _$ ~7 I, q% j1 m( q9 u
& B" q" {- i1 }) f. z$ Z2 f
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:00 , Processed in 0.153853 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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