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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
/ b! r+ e, j$ I, r5 Y, f( Y4 A6 b" M- E, R5 k
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;2 n# Y) I! Y: C2 r' {
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    / Z7 u& B' ]* F, j6 R1 g
  3. ;                                         By Bini.Yi 易祝兵
    8 h& X6 w5 O! h2 s, a
  4. ;                                         http://www.ufoit.com 计匠网
    * W# K8 o) S0 ?8 Y: g
  5. ;                                         2002/04/06 YYYY/MM/DD) k1 m+ l9 t, ]
  6. ;- t8 n/ D4 k5 Q7 _; _9 ^9 K* P
  7. ;         
    % D/ o/ [4 R2 V( e+ ]
  8. ;          This program  test the mouse button  click and move.
    5 ?- ^# `% f$ G" M/ s
  9. ;
    * Y3 R7 {- Z: q8 u& J
  10. 7 m6 {1 Y- T  b' f1 y' {9 x0 z! e' U
  11. .model tiny
      _* W4 J9 B; z: r3 @) i6 b# P
  12. .586
    ; {, k( C( n1 N5 m/ O& |) w
  13. .code
    ' F5 Y4 K6 z. e" _3 C+ u# K8 V
  14. .stack  100h
    " `! E/ A$ H$ V6 V; b
  15. .startup
    # h- v/ M8 O  ?! V6 _4 j; w0 m
  16. pusha
    ' `8 g: s! D3 L5 ]; `+ P2 Y5 w
  17. mov ax, 3533h- F( `" {- x2 Z8 g& q$ ]1 ]& u
  18. int 21h' J/ _' q5 e, S3 s
  19. mov word ptr cs:[old331],es5 ~+ \. e/ \8 d$ X1 t
  20. mov word ptr cs:[old332],bx3 ?( l- U/ u- f5 `  u, \- ?: Z
  21. mov ax, 3574h: k2 s% x/ n% D& k% V5 H
  22. int 21h  l! A% \. r. @  }$ |5 I
  23. mov word ptr cs:[old741],es: j* x; z% x7 f/ k) ~) c4 }
  24. mov word ptr cs:[old742],bx
    ! e! ~& [1 g- n3 @; u3 v
  25. popa
    1 a5 b' S) K# _0 u
  26.         call    memmouse- _6 m; }: b: s6 ~$ K/ K; d
  27.         mov ah, 007 I% b' x6 e8 F" u0 P! }1 \4 T. z
  28. mov al, 039 ?1 I+ G6 `2 v" D, m
  29. int 10h: n" `4 }6 }% x: `
  30. mov ah, 061 K. w6 D4 n6 c
  31. mov al, 0/ }' K7 D: z' ]4 Q# ^0 q1 L
  32. mov cx, 0+ ?, `  j8 j0 L/ M8 y. C# b
  33. mov dh, 24! Q/ `' M9 n* D1 u8 S: ^
  34. mov dl, 79, ^% q7 l4 J- _$ n; c
  35. mov bh, 07h
    9 y7 K+ [( f* W
  36. int 10h7 F( u& Z; L$ t" _4 Y! m
  37. mov ax, 0000# X, N* h0 t6 h' D6 `3 }
  38. mov bx, 00023 p/ y' y& @" k* _: e0 Q7 J) ]6 k: @
  39. int 33h
    " y3 K7 d9 l7 F- k4 t- I
  40.         cmp     ax, 0000           ;if no mouse drive install
    ) s  E# {% {; M; E$ t: A8 r
  41.         je      errormsg           ;show error MSG* }% _8 G# t* ~: R6 ]; q7 L" O/ h; a
  42. mov ah, 02
    6 L/ I- G' B1 o3 s0 T" t/ j6 ]
  43. mov bh, 00
    : [9 `4 W/ v' j: w
  44.         mov     dh, 25             ;Move point out screen
    # c6 Z- l9 i9 B8 q, r  B7 q
  45. mov dl, 79
    1 c. f6 _( }# ]+ e3 c# R; L
  46. int 10h
    , C. c' F# \. g* w
  47.         call    showmsg            ;Show info8 C7 o: e, j* l! X
  48. mov ax, 00010 }* s2 n4 _( o8 M- N2 S1 a
  49. int 33h
    . F  |; @) e' I& d
  50. ; mov ax, 000ah
    6 Q/ c( Z+ Q. h9 P# c
  51. ; mov bx, 0000
    4 p0 ^1 D! |  x3 {( s
  52. ; mov cl, 0h8 z% K% B: q8 i# F
  53. ; mov ch, 0F0h  t/ [& M. l. }
  54. ; mov dl, 0h
    3 N+ s) p! Q/ e, X1 A  c. m7 }( g/ @
  55. ; mov dh, 0F0h" x- _( _: L( T0 J3 J3 K
  56. ; int 33h$ y  I& d8 h! o" W, d8 ]* ]
  57. mov ax, 0004h
    / ~$ T0 F9 H3 W1 \3 ]9 I
  58. mov cx, 0319
    1 Z* N. }' E* f/ y! ~
  59. mov dx, 0103
    , F/ @9 n+ q) B" g! E9 S7 o* g
  60. int 33h# Q; z3 D" B9 ^0 C. i
  61. casemo:                           ;Case button click and point move 2 V4 i1 ?+ B" p- P5 M1 d; E& ?
  62.         mov     ax, 000bh         ;and keyboard press
    ) |/ _% ^, _+ \& |  M
  63. int 33h/ @- Y' |+ h  m6 e% G! a1 y
  64.         cmp     cx, 00h           ;if point move....X# F4 @8 |& Y5 A( R( _) \/ z; u! `! X
  65. jne xmov
    : I1 e  _  o1 r1 U) o- e3 n+ R
  66.         cmp     dx, 00h           ;if point move....Y0 V2 v! G' ]! ?( n
  67. jne ymov
    2 I3 U3 M) w# t" ?$ |  q7 Q( t" M: _
  68. xymovend:                         ;X.Y move end4 }+ @9 l2 i2 b) H9 Q6 c( v2 ~
  69.         mov     ax, 0003          + s8 ?$ l* u" z4 A
  70. int 33h
    4 ^5 a$ F, R6 u0 P5 O
  71.         cmp     bx, 0001          ;if left button click  show ON
    2 i9 B- I; ]  Y+ f8 |8 e
  72. mov si, 1828
    7 _3 J, p7 g9 C3 `3 e  u
  73. je listl  A  V5 h8 }3 W' q  z) g: R7 a
  74. mov si, 1828
    8 I8 [: \3 [1 C5 @
  75.         jne     nlistl            ;if left no click show OFF- \% z4 J2 M) H9 v- o9 l4 M
  76. testr:
    / R9 J5 h' ^. N
  77.         cmp     bx, 0002          ;if right button click show ON
    8 Q. A& l1 v& U9 b7 C
  78. mov si,1842
    , q, g, K7 s! y: C( P
  79. je listr
    8 J* s, Q. o  F, s$ a
  80.         mov     si,1842           ;if right no click show OFF
    - a% @: I. T! n+ a
  81. jne nlistl
    $ p) X8 L: s& D6 |
  82. casekey:: e" ]2 |% C0 L% X
  83.         mov     ah, 01            ;if any key press jump check. w& d9 [7 a; J
  84. int 16h5 ~9 F0 p/ }; C6 U
  85. jne kpress4 S3 H3 n$ w& T9 D! X
  86.         mov     al, [chkl]        ;check x flag
    * P/ j' L( h, ]  J
  87. cmp al, 02h
    # r6 T8 y9 F* V; @4 g, w0 O: W" H
  88. jnb chkok
    3 o* a8 |- o  m5 F; M
  89. jmp casemo5 w' L8 m4 p: Y
  90. xmov:                             ;if X moved, get the X flag+1
    ' m  ~& E# H; F
  91. mov al, [chkl]; u  t* r! f$ A% O% a4 z& G
  92. inc al- g& N+ N& J/ q9 I( n9 I
  93. mov [chkl], al& e* E8 }' }: n6 H
  94. call passok7 X2 L2 v2 e( Q3 A+ ~7 d
  95. jmp xymovend( [4 _8 g& f. s- Q, v2 T2 ^5 e
  96. ymov:                             ;if Y moved, get the X flag+1
    - Q# q) L, k/ m# c0 c) L5 C
  97. mov al, [chkr]
    " O2 C' o4 Z9 B. y4 ?* b; j
  98. inc al0 u5 z. j! A& E+ F2 k' P
  99. mov [chkr], al- ^8 W% e0 G6 L) |/ }; O
  100. call passok
    * I* `# W# P4 }3 `& @+ \; X
  101. jmp xymovend
    . Z* e/ J, R1 O# m; |( h

  102. 1 A2 I% W& A6 [  s' O  K
  103. passok proc near
    * ?* b: o0 ~& ?2 ]1 g+ ?' X" N
  104. mov al, [okcheck]
    # S( i; z. i* U7 j4 `
  105. cmp al, 1' x9 J; J8 G, a. _( G! c8 ~1 b' W
  106. je let0/ f3 {9 K0 M+ J- D- z* z! s. Q
  107. jmp passret6 j& y8 Y+ j3 J) ^5 Z0 ]8 L
  108. let0: 7 ^3 l& r% g+ K/ O4 Z
  109. mov [pass], 1
    - c; ^! a3 n  z  m) }# j  k  e; n
  110. passret:
    + D9 `' d8 @- d4 ?
  111. ret7 j. d8 D& ~( i+ L1 Q
  112. passok endp
    8 A/ N5 T. Z& a1 X1 a* K/ d

  113. 9 W5 r0 g/ H: Y, h$ ^
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    $ Z0 e* b. t' {* f1 F: S2 G2 S
  115. mov al, [chkr]
    ; T0 P: R0 R, ?) a  d3 c0 |
  116. cmp al, 02h
    * B2 u8 a4 V1 E& O5 j
  117. jb casemo( Y  o! V8 b8 g0 h8 A
  118. mov al, [lk]6 U$ o, _) Q6 e* C& r0 {' h1 o, ]% i
  119. cmp al, 11 N4 O! G' [& W
  120. jne casemo/ _9 {6 z' c) i, P  i# R3 Y( B7 V
  121. mov al, [rk]& }3 L7 B- `% m) P
  122. cmp al, 12 g' C5 ^8 h9 }1 x0 N% j
  123. jne  casemo
    & u  ]: X. b' x9 K
  124. mov [okcheck], 1/ F7 H; w  U" m* _' G
  125. mov al, [pass]
    & g8 f6 f" o5 x" ^& A$ {" {
  126. cmp al, 1  o0 F' y. k9 a4 i! v1 M0 }
  127. jne  casemo: u$ H3 @( F0 }* p% m/ p
  128. mov ax,0002h* e0 c/ q$ E" w3 T
  129. int 33h/ t6 y- {# x7 C! k% }
  130. call cleascr
    , ~! o$ d5 Z) ]( u0 y. b# t; t% k

  131.   t& t  w+ D. f% _
  132. call oldint
    / E, a5 S- s/ t# k2 [
  133. mov ax, 04c00h# Z% _! c7 _( E6 f) |' |
  134. int 21h
    : V" R, w$ w1 c

  135. $ C/ R. ~( X6 Y' E9 C8 r4 }
  136. okexit:
    4 v# J& w: ^3 Q4 P- h0 [( \
  137. mov ah, 4ch
    ; I% D& q" M3 K. H" O+ M+ G9 G# |
  138. mov al, 0
    ) Y& @' j1 B8 _2 M5 p# m4 W( C
  139. int 21h
    . B5 }( Z. e" A# J2 C5 S
  140. listl:                                 ;Show ON% u# x$ C0 q" o' l, H
  141. pusha
    0 y( I! H% }: ^
  142. mov ax, 0b800h; W' G& ?( J3 [; O
  143. mov  es, ax
    # s4 p- A  _+ i' D/ m
  144. mov ah, 47h; V, l+ W# i: R1 B* Q: f( Z' c6 T
  145. mov al, 20h
    9 l& k" b5 s, f! c& S7 N( D" P
  146. mov es:[si], ax) @7 }+ f$ n( f' @) S% O
  147. add si, 028 `9 p- m: N- n/ k( b- G" F1 u/ [
  148. mov  al, 4fh
    8 \2 h0 l2 o& @' T! g
  149. mov es:[si], ax
    $ N% @8 N; W( e0 `5 o: X
  150. mov al, 4eh. I) q1 c" K9 ~2 `4 ^( m8 o
  151. add si, 02
    0 M' @# r( T, C5 p
  152. mov es:[si], ax" q, D9 `* g% _5 W
  153. mov [lk], 1
    % x5 U8 D. J0 r$ |1 e
  154. popa. z$ ~0 P8 ~/ g8 X* s. Q; h! Q5 I9 Y' G
  155. jmp testr
    1 x/ G6 v, V* t* Z: K& A/ Q% o/ z
  156. listr:                                 ;Show ON+ P% P( Y) \0 F# u8 b! f! x
  157. pusha
    2 \5 [, {) Y8 J1 Q
  158. mov ax, 0b800h
    7 L2 t/ j# Z( ]" @: C
  159. mov  es, ax
    / H  ^8 B  J3 `; s( Y8 a/ F; p
  160. mov ah, 47h
    / C$ U/ d5 S  T2 \7 s0 P+ R
  161. mov al, 20h, \3 k3 B' v6 V' w& P: R* }; P
  162. mov es:[si], ax! f0 ~) v6 Q- O: R6 S9 d! a: T$ X
  163. add si, 02
    9 w7 l: P1 n4 m" p4 Y2 ?6 ^& d
  164. mov  al, 4fh
    ) h0 ^( U6 M  w/ h/ V8 l" ^) y3 J" R- Z
  165. mov es:[si], ax0 B$ k- k0 @! ]. s" ^
  166. mov al, 4eh2 D) D" y$ G8 `( }9 d+ o& t+ Z- D
  167. add si, 02, i  D  q+ |% ?
  168. mov es:[si], ax
    $ `' _* N$ w* o2 B
  169. mov [rk], 1
      W% f2 f1 N- _! t% q9 L
  170. popa
    0 G4 T# m6 T7 _1 l
  171. jmp  casekey7 Z2 ^; i4 H1 t' j6 R1 D  J
  172. 7 A: A/ {# _8 _/ h% `0 H
  173. nlistl:                              ;Show OFF
    4 Z# L0 A) M8 D( @5 Q! W
  174. pusha   / s! \' r! q  m3 w
  175. mov ax, 0b800h
    ) }: \! {6 F& y9 M9 w
  176. mov  es, ax9 a2 B6 M# o7 d0 D$ B+ q% L- s8 F! [
  177. mov ah, 17h
    " t- h* n4 o% v% m  S
  178. mov al, 4fh& D- h; D- K6 u4 u" Z
  179. mov es:[si], ax
    6 U& A' ?; b. i; R8 i4 y3 _0 f
  180. add si, 024 }2 D/ f1 P2 _2 Y. n. C/ v
  181. mov  al, 46h6 O4 w# L8 W5 \( J- U% M9 h
  182. mov es:[si], ax
    $ y0 ]' {3 \  J- G1 C' R
  183. mov al, 46h
    ( Z" p! W% o' c* A$ j
  184. add si, 02) A0 h3 ]# E$ k; k" L$ m2 l! s) G8 n
  185. mov es:[si], ax
    , @: ~" V4 s) P1 p% H# T
  186. popa; \/ b6 M6 j  m" ^8 E
  187. cmp si, 1840
    8 J4 R! m' b" M& V/ N
  188. jae casekey8 ^- I0 p- O$ {- t' d8 j
  189. jmp testr& e0 D, |; O; Z6 }! _; B* ^0 t
  190. " W9 ?& B' r4 e3 F# ]' q
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    3 S5 Z: T6 E6 Y  ]7 I9 S1 X" H
  192.         cmp     ah, 01h             ;and return a error
    & T. F! F0 t! l# f' G6 ?0 V( p+ ~8 F
  193. je exit1
    ' y( f; U! B* \) T5 |- |3 @
  194.         mov     ah, 0ch             ;if press other key then clear. k% l& m  ?0 f7 {- R
  195.         mov     al, 00              ;keyboard buffer
    ( e' A' K3 ?- o9 n/ H" ?
  196. int 21h: o- r/ t. b. g$ R8 e  V8 k
  197. jmp casemo
    $ O* |+ @) m; T4 ]1 F

  198. 8 \' l! Z/ q% G" U& L# s
  199. errormsg:                           ;if mouse driver no install
    : Q# e+ S! ~* t# F9 x. f. q$ H, y( w
  200. call oldint
    ; Q- N' Q2 M% P6 J% O
  201. lea dx, offset emsg
    ( W, o; i: X$ F( q5 @
  202. mov ah, 09h
    0 {4 c1 L% x5 f2 t& d% s
  203. int 21h' @; ]# z8 m% ^7 j" v1 y
  204. mov ah, 4ch0 ?1 W8 X8 T1 Z" V; v
  205. mov al, 2( v. h/ m) P4 |/ d- q5 W4 E4 m' g
  206. int  21h
    " S8 E$ R9 \" o5 D" o! c# u6 X

  207. % J' z8 F( h7 ^
  208. exit1:                              ;error exit
    / L: i- o" i6 o
  209. mov ax, 0002h
    , C( i) F& T' t5 d  }! C
  210. int 33h
    " d  Q7 S0 K; q
  211. call  cleascr
    & N0 @5 b0 {0 O, D+ V
  212. call  oldint
    % l  k  K0 `8 w$ P$ h
  213. mov ah, 4ch
    4 A0 p! u6 M9 w) l( r; U4 _
  214. mov al, 01
    . ?7 P7 V& w. `" L" e
  215. int 21h0 S' T; s4 N0 F: X! R1 S
  216. 7 }& }* T  w7 q) ?% N1 H" z" X
  217. cleascr proc    near                ;clear screen
    $ C, h" X" V  u, ~4 A$ E
  218. pusha
    ) A; ], Q6 c+ b/ {; j
  219. mov ah, 06
    5 C( l1 Z) b6 C1 U# C
  220. mov al, 0
    2 W9 T1 E* n% \5 y' K/ f$ N
  221. mov cx, 0
    ( f; `+ o' `7 d! y
  222. mov dh, 247 ^* d$ \  Y  {1 M
  223. mov dl, 79
    3 k+ j7 h7 K! j; O
  224. mov bh, 07h
    ) Q6 g) Z2 s9 e9 K. z! m0 d; T
  225. int 10h: E7 D: i) g6 h5 o. z1 U
  226. mov ah, 020 O5 q1 L. ^* ^. R3 W" g
  227. mov bh, 00
    0 L/ ?" F7 |3 \% m
  228. mov dh, 0
    6 f1 A% w+ n, Z; [# M! y  T0 P2 Q
  229. mov dl, 06 f' ~; \- I4 t& u" e* G6 E. w9 c5 i
  230. int 10h8 f' z) N3 s6 F- i& d
  231. popa& r9 f. A$ l1 n  h: F
  232. ret
    / H2 M% b7 N/ o' b4 B
  233. cleascr endp# ]0 F( @7 ^( R

  234. 0 C6 s! T' R: I
  235. showmsg proc    near               ;Show info; ^8 J& L! H$ _: Z& ^0 K$ d
  236. pusha
    * _) N7 `: D1 ]' {& I; {
  237. lea di, offset showms
    * _( g* U  P0 p/ n4 R
  238. mov ax, 0b800h" p" C* a: ^$ g; D" u2 \& S
  239. mov es, ax& w6 Q' \" X9 k& E  [
  240. mov si, 0
    3 @0 f% H5 k3 _  s' n' ^2 G
  241. mov cx, 480
    ' E3 X  C& J. l0 ]. W  j, E
  242. mov ah, 07h
    , ~5 M, ?3 @$ r& o5 H
  243. @@:
    : z3 J- ^$ G' Y, w, C4 q
  244. mov al, 20h/ i% s: s" k! c4 T8 q
  245. mov es:[si], ax" j% j. p9 b, s% r" R1 N3 H
  246. add si, 2
    - A) f/ S+ j8 Z( A1 i' h- }* C& m
  247. loop @b; v' ?6 @" [; {) y* C" W7 M
  248. mov cx,880
    + L" u. I  E$ [
  249. @@:
    . @9 F5 j: w; A& \4 r* C9 t" I
  250. mov al, [di]
    2 J( G8 t0 d$ c6 p3 m
  251. inc di) W% d- T( d( J2 k
  252. cmp al,20h6 P5 N4 j* ^: P5 b
  253. je showch1
    , l: c6 N6 s/ d( w2 V) Q
  254. mov ah, 17h8 }' x( c1 f+ Q$ z9 K
  255. jmp showch3
    & u& D$ T. H+ {: H4 ~
  256. showch1:4 m" p: ]$ g: K0 H; u
  257. mov ah, 07h 4 K0 q# U& p9 ^4 x0 _# {
  258. showch3:. I& E) ?' n6 |3 M
  259. mov es:[si], ax
    & ]2 D2 P8 X" x% e2 @6 G7 H+ E$ V
  260. add si, 2
    ' D  X- W) @- i& v0 p5 `' w
  261. loop @b
    1 x. o, D* l1 R" m6 F4 |
  262. popa" Z7 p+ S; g, P2 [+ m. y8 ^
  263. ret: M& J+ `& d" O8 ]
  264. showmsg endp% p0 r) g/ _' [

  265. 0 f8 s: x, J- B% V6 P
  266. oldint proc# h: Q; Y7 A* k5 G; N
  267. pusha
    9 C: F( Y" B  t' B/ e$ [
  268. mov ds, word ptr cs:[old331]- F0 f- M% m2 q! W
  269. mov   dx, word ptr cs:[old332]
    3 b* B# f+ Z# T- m: O
  270. mov ax, 2533h
    ' h( x7 i7 {) O1 ~
  271. int 21h7 }( g2 F; m; d) n0 p8 u
  272. mov ds, word ptr cs:[old741]
    . c! N6 \, v3 `2 E& ^( H% I+ k
  273. mov dx, word ptr cs:[old742]
    ( \. U/ Q# d: \+ |2 Z8 N
  274. mov ax, 2574h$ W! A- }  Z8 u3 W* _6 F8 [
  275. int 21h
    ) ?8 G6 p% G8 f8 j! E; ?
  276. popa
    # c- [, V4 F4 X1 S
  277. ret
    ' s8 a3 U( r9 {; A2 m* c' |
  278. oldint endp' ?6 X% R  A4 B" E4 ]- _' B1 p

  279. & L' H/ `  V4 o, S# C2 K9 l# W
  280. memmouse        proc
    0 ^. c1 d/ ^" s# B; \9 M0 w1 i
  281.         xor     ax,ax9 _" @  P# J& y, K% c% Y: U
  282. int 33h
    9 y7 E: w3 s; V* S( u( {3 H% x
  283. cmp ax,0ffffh- M: U3 l* G; g% M% O3 D
  284.         jne     not_loaded7 J$ Y$ O2 j# |. _1 p
  285. mov [memcopy], 1' c' N( q; Q/ S& q5 n  O! @6 h4 ?& h
  286. ret: H4 r' D8 b- u: S  Z

  287. ( L1 P5 N8 E: h, h$ |6 f6 m, p
  288. not_loaded:
    / U/ J( [; U' u6 R4 n& T

  289. - y9 [$ R( x: ]- c/ G6 N
  290.         mov ax,2574h
    7 H& i( G  x, h7 H; \  D
  291.         mov dx,offset new_isr' @; L8 J8 g1 N; M
  292.         int 21h3 D+ I& a, E" W2 k; S6 _

  293. + h1 M+ B3 ]5 i1 k5 g/ `8 A2 `
  294.         mov ax,2533h
    3 y, M4 b8 e5 @9 H* e9 Z
  295.         mov dx,offset new_33# G7 t8 j: }$ k% C4 z  Q: i
  296.         int 21h
    + l' Z' d3 C+ |+ Z) A. z
  297. % v. s8 r! N: r& X9 O* i) b7 l0 a
  298.         cli/ [+ `! V. F$ S4 M9 I4 k% h" O& c
  299. # l$ V6 x1 v* R! T- u
  300.         mov bl,0a8h4 ]9 W' D3 d: W7 A+ L2 B0 F
  301.         call keyboard_cmd& K7 q: l; L2 O& e  p' H( ?/ |

  302. & n+ c$ d: X7 `/ u. W/ q
  303.         mov bl,20h9 L5 P; w" I6 I9 s# E3 i3 S
  304.         call    keyboard_cmd
    1 m# K1 P9 c0 ?( U$ Q# C# f
  305.         call    keyboard_read) _7 \2 O4 L0 |0 z9 N  w/ T
  306.         or      al,2
    9 j  e  c5 g+ Y4 n: U
  307.         mov     bl,60h7 }( d! A( K6 e1 |
  308.         push    ax
    ! A6 h  h' [5 I# W
  309.         call    keyboard_cmd: S* j/ m& g: V) L
  310.         pop     ax6 e6 n. X/ V; ~3 M2 E" s% {" Q
  311.         call    keyboard_write' _% L% O* v; ~, @# E# N( @

  312. 5 _+ F; }* \1 Q9 _' E  w
  313.         mov     bl,0d4h1 A+ e% {6 G% r' F; x# ^4 B9 @
  314.         call    keyboard_cmd
    1 F/ A6 i! p6 Q( g( \
  315.         mov     al,0f4h# d* l6 \7 ~- M+ ^
  316.         call    keyboard_write
    . d' A2 q+ L9 a: h

  317. 2 z* L& W) N; d$ y, H9 p: z! X
  318.         sti
    / m# l; @- E. S
  319.         ret
    . W/ r& `0 ?: ]! H( k& s9 c
  320. call_user_isr:) V! F% k6 r5 c& ^
  321. db      60h
    , Y* ?# S% X: w  @$ g
  322.         mov     cx,cs:[pos_x]3 W" d9 q) f; l) A9 K6 U
  323.         mov     dx,cs:[pos_y]9 n$ _9 k5 M! `
  324.         mov     di,0 ;cs:[x_move]( T7 ^/ l9 {) D$ ^
  325.         mov     si,0 ;cs:[y_move]- `3 |- Z% j& ~
  326.         mov     word ptr cs:[x_move],0/ M# r1 G9 o( {/ b, n$ G
  327.         mov     word ptr cs:[y_move],0
    4 Q4 I2 x; D3 \( A: B9 ~( c
  328.         mov     bl,byte ptr cs:[buttons]
    . O9 t" \5 u% i6 ?! V
  329.         xor     bh,bh+ ^. Q2 x) R2 |+ n
  330.         call    dword ptr cs:[user_subroutine]2 `* C3 j* Y5 }  `$ G, o0 A
  331.         db      61h6 l# J3 z) J( w* c
  332. ret. D. F# e+ Z& s& q# [2 K, n) ]8 q6 w
  333. new_isr:9 @" V- E9 M1 B6 Q0 m: ?
  334.         pushf8 r; L& q/ H: ]$ R
  335.         cli
    " R6 Q% @( k  B/ ]
  336.         push    ax
    ( v1 ]* m2 V. H+ E( `1 h) F! }2 K! P
  337.         push    bx8 f) d3 E1 S& j# _
  338.         push    cx) C. J( Q1 p0 N; k$ c3 M0 r$ O: O
  339.         push    dx* e5 Q3 h! \  A( e9 M. M
  340.         push    di* I) j6 `  c5 P* c# m
  341.         push    si& j. l1 n1 x( a2 L8 n+ E7 C5 R& ^
  342.         push    es4 b" U' n  n4 f
  343.         push    ds
    - E- U0 `4 H# K4 r) U9 F
  344.   G/ _) R: _* |1 V. S8 P
  345.         push    cs
    & g! F* U+ f6 M5 ^% ?
  346.         pop     ds) V% _! @0 x) G' b7 P( j6 b: U% t
  347. + S0 I  C$ s! x  Y/ H* b
  348.         mov     bl,0adh) P/ P0 m" M8 J' W
  349.         call    keyboard_cmd7 U9 O5 e9 U( {4 z4 i; S

  350. ) z7 H* c  L1 w5 Y* z2 L, A
  351.         cmp     byte ptr [first_time],04 ~& Z! i$ B) ~0 }
  352.         je      not_first_time( d" h4 m& g4 A. m5 w0 a+ F; x
  353. 9 x. B; ^8 ~7 @3 f
  354.         mov     byte ptr [first_time],0- `7 ~: i* P" C1 g$ q
  355.         call    keyboard_read0 v9 r+ t: J+ f, m/ z$ o
  356.         call    keyboard_read
    # r" U4 D/ ?3 {# D- q6 H1 @
  357.         call    keyboard_read
    ! k: z) E- f( m; U0 d
  358.         jmp     no_show  A* g7 H: M+ X& X

  359. 8 |. v3 F# {0 k, ]) i$ k( T2 I
  360. not_first_time:
    % U% K6 v; r( w  j
  361.         mov     word ptr [temp_mask],0* U7 k4 q: h' a

  362. : A, c5 l6 }4 c6 X# G
  363.         mov     cx,[pos_x]
    0 g; ]7 z/ e* v% m& L" z
  364.         mov     dx,[pos_y]; ]7 r) q9 B9 {: x% U  c/ @, @; }5 c; [

  365. % w. g! y6 g% R; Q
  366.         call    keyboard_read5 H. _- Q9 \5 u$ p+ G5 d
  367.         and     al,7 ;3
    1 o7 }# [3 w/ Z# @7 m
  368.         mov     ah,[buttons]3 z1 J6 w/ y8 }+ ^3 L: o
  369.         mov     [buttons],al
    : ]( n  C% w' t' W* ~6 a: }
  370.         cmp     al,ah" Y0 ^- H* H; ~4 Z
  371.         je      no_button_change% {* \! h2 Z& L8 o
  372.         and     al,3
    , Q* X* f- D0 D  C  z! X
  373.         and     ah,3; k" c" l2 q! Y* G; C
  374.         xor     al,ah
    4 e6 N7 I: @+ w! a3 M: b
  375.         xor     bx,bx
    ! M# X% q( W; y# y

  376. / ^: |6 m2 p* C" \6 w- E
  377.         push    ax. ~: A' D- Q0 ]) t
  378.         test    al,2
    " q5 ?4 C, G5 o8 W
  379.         jz      no_right_button_change
    & q$ |; t( A) n( @- `0 X; J5 R  ~
  380.         and     ah,2/ N" T2 @% }9 B. t: E
  381.         jz      right_button_pressed2 O  r  m: z: L" t
  382.         or      bx,16
    & T8 q* q% T8 r4 K
  383.         jmp     no_right_button_change
    2 F3 m* [: X# i  a2 E
  384. right_button_pressed:
    ! k; l! z: r3 K2 f" m
  385.         or      bx,8# J: v0 I8 c- k, G
  386. no_right_button_change:
    4 w9 ^1 ?0 a: T
  387. # `1 t5 A6 e, a7 s5 P! q, b
  388.         pop     ax3 O% P9 t) }- O- ~3 D6 w
  389. ; y: l/ N. S& s( \6 r, M8 m
  390.         test    al,1
    7 j/ g* V( i8 _; Q' p# }% ~
  391.         jz      no_left_button_change8 X. n) U+ ]' l0 M' S( t) [
  392.         and     ah,1
    6 s2 j% N; ?6 Z3 d
  393.         jz      left_button_pressed
    ! |- r; O9 n- }" i' i1 q  @
  394.         or      bx,4( o5 A: |. J, ]7 a1 p  {
  395.         jmp     no_left_button_change
    4 v7 M' D) v* W7 p
  396. left_button_pressed:! [- G6 i7 v+ w- p$ V+ e6 A! @/ D) F$ X
  397.         or      bx,2  Q  u( M7 E- U" U1 x
  398. no_left_button_change:
    * b$ U7 M' s) ^
  399. ( i2 [% }( k. B% ]6 Y1 T
  400.         mov     [temp_mask],bx1 X1 n- R! r' {! I; F/ d' M4 C

  401. ' ?+ e3 B6 w+ ]. y4 P
  402. no_button_change:
    7 }. g7 p  r0 K+ U5 c' u. a
  403.         call    keyboard_read1 V+ X! i+ P' P
  404.         cbw
    - v6 r  k) f/ i
  405.         add     [pos_x],ax8 s& i' r; T7 I* D+ I/ O+ G, A
  406.         add     [x_move],ax
    7 o6 l5 @$ U  `) I; v5 K9 c. I9 F
  407.         mov     ax,[x_min]
    3 \- W/ {- S! G& m! M+ o+ [: `
  408.         cmp     [pos_x],ax4 N% |" t5 R! o; J5 x! G
  409.         jg      good_hor1# I* b$ z$ G" a# h8 H" s! J; i
  410.         mov     [pos_x],ax# M& G  F" T/ [1 }( }
  411. good_hor1:* U% l2 p/ h% \
  412.         mov     ax,[x_max], v) y, X' @% |) \, C' |6 K
  413.         cmp     [pos_x],ax& a) G6 [. k. B6 ]
  414.         jle     good_hor2  W9 V! p+ S% h* B+ o
  415.         mov     [pos_x],ax6 _* m6 t3 A5 P. c  A: u- |. ^
  416. good_hor2:
    + x8 z/ Z0 ~& G. u3 d& E) e8 A
  417. 9 F1 w3 X* c( F. z  W# J) P
  418.         call    keyboard_read
    $ Y2 z* n+ g  W$ p+ F: u) i8 ^
  419.         neg     al
    2 ]$ F8 o7 h" X8 ^0 P- R6 |# u( f
  420.         cbw8 ?* b; M6 b  M, Y- K7 D
  421.         add     [pos_y],ax- e0 |) l; I( I  E" T: f. j
  422.         add     [y_move],ax
    $ U0 D9 p" M1 n$ ~0 [6 t) l
  423.         mov     ax,[y_min]
    # H, T( B: C+ v
  424.         cmp     [pos_y],ax
    7 Y% |" v& a: e$ L( `5 c
  425.         jg      good_ver1% ^$ |+ ^9 K" I' _5 \1 Z. q
  426.         mov     [pos_y],ax
    ( Q8 K& Z, T7 T% a
  427. good_ver1:3 T6 ]% V5 B) ^4 `4 v5 X1 s
  428.         mov     ax,[y_max]$ e( D* S' q# z# q7 W+ b) S9 `) G9 a
  429.         cmp     [pos_y],ax
    2 n; r3 g6 ]0 f, K; w
  430.         jle     good_ver2
    + Q' y+ N7 Z5 D2 O
  431.         mov     [pos_y],ax
    0 m( T& R) g! D1 L2 b
  432. good_ver2:
    0 z" }! e: ]$ E( R& o$ X. A: c
  433. ; A4 D7 @. J* N$ B) C4 }" n8 z
  434.         mov     ax,[x_move]3 ^6 D0 Y. ?. F$ z  N
  435.         or      ax,[y_move]7 j/ O5 ?( g0 a- Z
  436.         or      ax,ax: z% C8 z- R. H( f! m0 s1 d8 E2 s
  437.         jz      no_change_position
    + H4 N3 y8 E, D. H/ l* o
  438.         or      word ptr [temp_mask],1( S: A+ J  B( p
  439. no_change_position:. C1 E9 x: O: i
  440. ) M5 c0 k2 H2 a
  441.         mov     ax,[temp_mask]2 S( i; N" C! B% _$ _
  442.         and     ax,[user_mask]/ S4 f0 S/ _2 F: N4 Z+ V6 K" K
  443.         jz      no_call_user" A( K1 p7 h. @
  444.         call    call_user_isr
    8 W9 p4 T7 P% I; K, h% B+ J6 b" N0 c7 F
  445. no_call_user:+ v( \/ D$ W! H% E. k9 x& e  b
  446. ; ?% H2 }+ n: g+ p
  447.         cmp     byte ptr [sm_flag],1
    ' i* |# ]9 Z+ B) S8 N
  448.         jne     no_show: t3 R, o  @# X: S& r

  449. : v% ]/ f% r/ \( }; t' C
  450.         shr     cx,3
      i, C# [% P: M4 \" C0 j
  451.         shr     dx,33 L' K; T1 d1 o  K% K7 a) {$ [
  452.         mov     ax,80' a* }" N3 ^3 f$ m7 U
  453.         mul     dl
    6 e0 s% t8 B. U, f3 b& k! [( z
  454.         add     ax,cx
    ( @* u' Q; @7 ]( O9 O9 j
  455.         shl     ax,1
    % S! ?: B/ q$ t4 ?
  456.         mov     di,ax
    9 u1 N+ r8 x1 H: O$ T
  457.         mov     ax,0b800h
    . ]6 j' c; N+ V9 Q6 G' w0 r
  458.         mov     es,ax0 @0 }+ V7 I' q/ U/ G
  459.         mov     ax,[save_char]" O- d+ l4 A9 f" g/ Z) R
  460.         stosw
    3 ]# V' R8 \* h( |( X
  461. + N: `! J0 C; |1 @
  462.         mov     cx,[pos_x]
    2 J5 j7 d) D. I# S2 {
  463.         mov     dx,[pos_y], `  T7 {2 x8 p8 ^1 f8 d
  464.         shr     cx,36 E) v7 T9 G  n, N* a
  465.         shr     dx,3
    * D" I9 p' C6 \3 n' A! t; q0 x
  466.         mov     ax,80
    ) A# r7 x8 z* c0 b  S: R: q% \$ }
  467.         mul     dl
    ) e' u1 `8 E) A" ~8 [/ Q
  468.         add     ax,cx$ R) g/ h  f& e$ r4 `( C7 |( a
  469.         shl     ax,1/ C! m* B5 Z( o/ [
  470.         mov     di,ax
    1 a9 ]9 U9 j. i( r; w, z
  471.         mov     ax,0b800h: C9 M9 d7 z1 j, [5 T
  472.         mov     es,ax8 T; k; S" X' }+ M4 I- w% N: u  d
  473.         mov     ax,es:[di]
    ! C* c1 n/ y2 g0 {/ ?* Q: F
  474.         mov     [save_char],ax
    2 O# E4 C) e/ \( R1 R3 o
  475.         not     ah
    ' k2 t/ V7 ]7 o8 Z+ q
  476.         and     ah,7fh
    - @" u& u% t+ C5 Y
  477.         stosw
    . Y3 @( V9 Y. _' G
  478. no_show:
      Z: |2 `0 u3 j6 |; `1 d1 T% }
  479.         mov     bl,0aeh
    0 G  v6 c- D/ \1 L; \, b" f. Y: a
  480.         call    keyboard_cmd4 D" @6 f% _4 b
  481. - I4 _6 w  V2 I) K1 B( V
  482.         mov     al,20h& w; l/ k( W+ W
  483.         out     0a0h,al' ~0 Z4 L' B4 w& w$ b+ f% V
  484.         out     20h,al3 }) F/ a% ?6 o- |/ n
  485. 9 _! a. |3 ^9 \5 x
  486.         pop     ds% F6 R* i/ G  t9 c8 r$ L6 m5 U
  487.         pop     es% f- J- y4 e! K2 u" C7 T" V
  488.         pop     si7 a" J2 n# W7 H/ a
  489.         pop     di6 M) N. c/ s9 e  I: V
  490.         pop     dx5 S9 Z$ d& ~% `! G9 Y9 z+ d
  491.         pop     cx8 x$ [  a  p/ j0 t6 q4 F% S
  492.         pop     bx
      z/ E- p! n$ Q8 E9 N' u& m* v9 g8 U
  493.         pop     ax  F; W9 R- z9 o. W
  494.         popf
    ' B' u) m- b" ~- M4 D+ U0 s) t% J
  495.         iret
      h9 h; i  ~9 ?/ v3 ]
  496. : O1 P  ?; v4 _4 ?3 x  r
  497. first_time      db      1
    8 r* F- g/ _* G0 L  s) S
  498. buttons         db      0
    * L; L" A& r3 U; ~& L: {( u5 _
  499. pos_x           dw      0; n+ m1 T# u2 v& _
  500. pos_y           dw      02 Y& P3 q) K- @5 e$ X
  501. sm_flag         dw      0. ]1 ~! Z. l& c  D$ A: f8 ^, M
  502. save_char       dw      0+ a3 F: n; a# f
  503. x_move          dw      09 D3 D) M1 \9 J5 T' j: w( H
  504. y_move          dw      0
    5 d' B, h+ L+ ]5 X3 o
  505. x_max           dw      639
    % R$ {& R% h4 u, A  x( Y: ^8 _
  506. x_min           dw      0
    1 i/ b. h* J7 {( S3 O- l
  507. y_max           dw      199
    ! j# Q5 r/ a: c: h
  508. y_min           dw      0+ a$ ~- }- n; J
  509. user_subroutine dw      0,0
    0 n* N! L) y  P$ }
  510. user_mask       dw      0* \+ J0 W: ^' L2 c7 f/ a+ g
  511. temp_mask       dw      0- U1 r; O9 _$ x4 Y& O

  512. 0 v# y2 \( ^, B8 [' n( J
  513. keyboard_read:2 u% m" `1 L9 ^& B* `. s
  514.         push    cx
    : d- r- k- a! w6 Z# @3 N
  515.         push    dx
    7 Q! ^+ S* B/ z; f5 \" o
  516.         xor     cx,cx8 p7 t/ T9 H9 V- c  i6 F% j
  517. key_read_loop:! @( d& X% o) z5 r1 `
  518.         in      al,64h& P. G* g3 I  z! C1 z* i2 \6 U
  519.         jmp     $+20 G& ~8 K1 i% ]7 j) Y4 S) b5 r: T% n
  520.         jmp     $+28 H: |. l3 n9 u: Z
  521.         test    al,1
    ' u0 w' Y' k! a: P5 a
  522.         jnz     key_read_ready
    5 A$ F: h: P% o! c; r: h
  523.         loop    key_read_loop
    . d7 h1 s* ]5 i- }
  524.         mov     ah,1
    $ o2 I6 r. w5 R
  525.         jmp     key_read_exit
    , X: \' t3 T$ e9 Y; w
  526. key_read_ready:. [) x+ U/ p$ l
  527.         push    cx2 i( \* W2 E& I
  528.         mov     cx,32
    : _! O% I/ c/ l( Y5 C
  529. key_read_delay:
    $ _' T  i7 M3 `: b
  530.         jmp     $+25 x: E) f5 y) k1 w1 y8 z
  531.         jmp     $+2
    % M- N9 x, j9 K
  532.         loop    key_read_delay
    ' s+ i; E) Q5 W' q; `& E* ^
  533. ) g( \% [# f8 V* @9 F& C# V
  534.         pop     cx
    ( o8 c6 ^$ r; ^' c
  535. ' Q: b  D. X' I
  536.         in      al,60h/ N) |. @5 |' Q1 e- w; \5 _! Y4 x
  537.         jmp     $+20 h0 U/ O) ]' L0 o+ T' o  y
  538.         jmp     $+2
    + F& b: ?6 O' I/ i
  539.         xor     ah,ah
    2 k4 v$ I9 _8 d0 q5 k
  540. key_read_exit:
    & Q! p3 g& h8 J$ K" D, ^" d
  541.         pop     dx& [' d. c: h6 F3 u2 n
  542.         pop     cx
    0 S; A/ s1 Z- ~$ J
  543.         ret( d8 f5 `/ l6 d& M" R' T! c
  544. " f4 p/ r$ T% k% h
  545. keyboard_write:( d/ c* n2 y% V
  546.         push    cx
    . a- D5 d+ y; P6 }) }
  547.         push    dx3 K4 J7 r$ E+ Q% M0 V
  548.         mov     dl,al, z4 R3 }! o0 w; p
  549.         xor     cx,cx
    7 C' o. s, W3 z! U) q
  550. kbd_wrt_loop1:: M  S  j5 ~& _- C8 V( [4 T: R3 v
  551.         in      al,64h- ?' z- ?$ W" [4 [( F
  552.         jmp     $+2
    ( l- M: y$ c- U( A
  553.         jmp     $+2
    5 d/ A* _$ u, H2 @. H0 \3 G- r
  554.         test    al,20h
    6 |1 y  p, T4 T  e" H+ _  W
  555.         jz      kbd_wrt_ok16 n* j0 _  H+ P0 X

  556. " S" s1 ?) D- i& F& B$ G8 j8 j
  557.         loop    kbd_wrt_loop1
    1 r1 ?6 R! c6 i/ \

  558.   p9 ~4 Y7 F* u' U: V( N. [; R9 b
  559.         mov     ah,1
    * p/ X. J+ l* n& s
  560.         jmp     kbd_wrt_exit
    ! @- a- r9 F/ N, q- O( e2 e

  561. ' n  V, b3 l5 }$ H
  562. kbd_wrt_ok1:
    $ Z( n3 ~0 K; H; C$ t
  563.         in      al,60h; ^$ j( b" T9 N: e" z

  564. ) I* T6 |, ]6 ?+ Y
  565.         xor     cx,cx
    , B. f8 ]! Z2 t& ^  o% d' V
  566. kbd_wrt_loop:0 E' s& d/ |, ?7 Y3 S; h. m
  567.         in      al,64h
    1 U5 I/ L. P6 [: m. L0 {
  568.         jmp     $+25 f) d8 W( M/ Y( q) b2 S
  569.         jmp     $+2
    - ?2 T! _' x- ~6 i' {! K
  570.         test    al,27 U4 [" R7 a  \; P* Y5 m) }
  571.         jz      kbd_wrt_ok
    % k& {- e- T6 s

  572. ! x% _5 O0 B1 M3 g1 o
  573.         loop    kbd_wrt_loop; ~- M* o! p1 G3 i) o( D0 c
  574. * O# Y, ]/ Q& u0 y
  575.         mov     ah,1( J9 r, B" x7 @- q7 C6 V, f
  576.         jmp     kbd_wrt_exit
    0 B' a! R' i# l4 X, G$ x4 H; X
  577. # C  j% Q+ F; F, W1 J
  578. kbd_wrt_ok:: T+ n0 d" L- z4 Y
  579.         mov     al,dl$ G5 p! u1 r. o$ O% T- k4 e
  580.         out     60h,al
    8 V6 F- e; t) M$ i4 a9 }
  581.         jmp     $+2. i. N) p, P- |$ u* Q  T
  582.         jmp     $+23 S9 J( Q$ ?; R4 l2 H
  583. 0 k' w2 N; _* b, A+ s7 V2 p
  584.         xor     cx,cx$ r  b* ?1 j5 ^" ]9 h! O; s
  585. kbd_wrt_loop3:
      N! n6 f* E. N0 Q! m9 `
  586.         in      al,64h$ x7 G: q& z7 |$ V
  587.         jmp     $+2
    & f, k/ z8 O6 P) c: d+ {# O3 M
  588.         jmp     $+2- }# L7 n1 o6 E$ {2 ]
  589.         test    al,2
    ) L: N0 H6 M/ H" i1 K
  590.         jz      kbd_wrt_ok31 b, c+ Y: E4 h, j6 b+ o

  591. 4 s6 H& U& y9 ]7 d  F; ~. p
  592.         loop    kbd_wrt_loop3
    ; G9 N) N1 i# L3 n5 g3 z6 `
  593. ( F2 X$ ^# Y) {7 |, w& }
  594.         mov     ah,1
    4 l9 q" c  l* _+ x" p4 c) d
  595.         jmp     kbd_wrt_exit; b$ _8 {8 m0 y: M$ G9 M7 n
  596. 7 i% x- |' n$ s/ s
  597. kbd_wrt_ok3:
    3 b( m8 t' U* q- c/ E
  598.         mov     ah,8. d/ L, }  M7 A
  599. kbd_wrt_loop4:" K0 I0 y* h1 r1 p  h
  600.         xor     cx,cx7 a, S; ~) y3 M8 X0 ^5 U
  601. kbd_wrt_loop5:4 m6 p' p4 a" u4 `: x
  602.         in      al,64h
    ; W" C" u* P6 R: z" S) j* G( F; y* d
  603.         jmp     $+2' K/ `4 _$ }5 X7 C# t6 u5 }; E- h
  604.         jmp     $+2/ b# H* [( `- u6 n7 H2 l
  605.         test    al,1+ K% K( g" A* p# h9 y; n
  606.         jnz     kbd_wrt_ok4
    8 d2 W) w. z* X  @" r3 {

  607. 4 P; f, U% \8 A$ O/ s
  608.         loop    kbd_wrt_loop5; Z. |. v! l8 l2 |  z9 ~
  609. 6 C" B0 Y# ^; l9 t5 ]$ s
  610.         dec     ah
    / f- t+ G( W( A6 s* V% l
  611.         jnz     kbd_wrt_loop4# a8 f7 o0 n3 Q; t1 J! D

  612. ! y5 I' `2 H5 W) T: J) S$ g
  613. kbd_wrt_ok4:
    % X; g) M* X* y& m
  614.         xor     ah,ah
    ' A" m; f3 M6 B/ u, y+ B
  615. kbd_wrt_exit:5 f( D, P$ B+ o: k: S# b6 X0 {
  616.         pop     dx3 G* e+ U$ J5 C7 m( w
  617.         pop     cx
    5 q* V  x5 O  @3 i; L. r2 l& T
  618.         ret; w2 I5 Y4 X2 h8 d  V: ]
  619.         2 l1 T- v1 S5 e- \3 h
  620. keyboard_cmd:, o6 H0 E2 d$ J- c  ]
  621.         xor     cx,cx
    9 J0 P: z8 c) V, }' z1 b+ V5 H& y
  622. cmd_wait:
    & m. d" C, i7 R- ]8 f
  623.         in      al,64h2 [' B5 G2 H2 m* J9 ]
  624.         jmp     $+2, d' [/ e! \$ ~
  625.         jmp     $+2
    + F# q  R9 N& a& b+ [
  626.         test    al,2
    " _* ^. e* m) N/ d- H& W: @# ]
  627.         jz      cmd_send: a! q. e$ t8 U( |2 U& ~
  628.         loop    cmd_wait
    : J0 `: h& x7 `4 P+ y
  629. ' G7 Y+ X; l; E% d" a
  630.         jmp     cmd_error
    7 ]  N: w) b- ?7 \3 g
  631. 7 @  |- ?6 a$ W8 z3 z. ?
  632. cmd_send:4 `9 A8 T. g& W' ^3 k  Y
  633.         mov     al,bl
    ) G9 |/ e1 A  r0 [6 C- a9 [
  634.         out     64h,al; F1 U7 O/ q5 [
  635.         jmp     $+2
    0 y5 z  _- m2 G2 k- o
  636.         jmp     $+2
    ! o1 C3 V4 S. L. z0 S6 a
  637. 1 S6 Y( j% K8 q8 w2 V1 J" X
  638.         xor     cx,cx- @3 k4 [0 h1 ~. y4 \. ~/ U
  639. cmd_accept:" w& q' \5 m+ i# I+ a' g$ R
  640.         in      al,64h6 M$ W& G& H# D6 u2 k- h
  641.         jmp     $+2
    ; M; l) C) X/ g7 D2 _4 s* y
  642.         jmp     $+2% w5 p( b5 J. }* e5 |3 ]5 r
  643.         test    al,2. C3 i: w5 B/ u' X5 n  U$ B
  644.         jz      cmd_ok
    . A" f4 U5 R: m+ U6 |
  645.         loop    cmd_accept: M1 l) C$ I; e% U

  646. : p; q) m9 X9 m: r) C4 e3 d; h
  647. cmd_error:, L1 I; j- G  d$ K( I" ?
  648.         mov     ah,1( F3 a7 }1 z1 `1 w1 B
  649.         jmp     cmd_exit
    & k* M! r3 m, `, S
  650. cmd_ok:9 q% E! M! A) \
  651.         xor     ah,ah
    6 f8 |  }6 b* N; b- t& v# c
  652. cmd_exit:
    0 |# ~  g5 J6 c0 S" P1 n$ U
  653.         ret
    + M. f0 G' r0 q; }5 ~5 @

  654. ) h! w  F- W0 n: i
  655. new_33:
    % p8 G8 h0 Y5 A1 `: ^% J
  656.         cli
    " v* G1 A0 b" m$ [* x" o
  657.         cmp     al,0
    7 N/ N- W8 [* e- A' d
  658.         je      reset_mouse
    ! j  q+ _. W* V- Y; A' a5 t
  659.         cmp     al,1
    * _( E4 `; f5 V: p# y( y
  660.         je      show_mouse( _$ k7 i+ l% A+ n2 _  l
  661.         cmp     al,2, ~9 L' N6 y; {, }. {% b9 Q
  662.         je      hide_mouse
    5 I, m$ s+ {) x4 n7 ?+ Z
  663.         cmp     al,3
    1 O% ~. b5 J" E
  664.         je      get_pos" f/ ?* ]: y8 D, l1 k: s
  665.         cmp     al,4; }8 v0 S$ M* X! w2 y3 K# m9 s, `* n# l
  666.         je      set_pos
    7 F" |' ~1 N& N% V* ]. x% v
  667.         cmp     al,7
    0 [/ _% F% h/ z
  668.         je      set_hor_pos0 E1 {: n8 _) f, @, f& j
  669.         cmp     al,88 a5 ~  j6 c; H0 R( V
  670.         je      set_ver_pos0 L3 f; v9 n( K" @+ {
  671.         cmp     al,0bh" L8 r* l  ]$ ^+ T0 f
  672.         je      get_mouse_movement
    3 r6 j9 i; g# I$ l9 N. A4 U
  673.         cmp     al,0ch0 ]* M1 k. Z3 \7 H
  674.         je      set_subroutines
    : ^' h6 l! n2 O; K  U. u
  675.         cmp     al,14h* w+ g) e. o; v$ b
  676.         je      swap_subroutines
    6 v( ]# |/ d, l& M
  677.         iret
    . @* k; A: {: L$ U8 Y: }
  678. 2 X4 S5 x5 d: \1 U+ i
  679. reset_mouse:. P6 {" _) |  b2 M' b
  680.         jmp     _reset_mouse
    7 j: O7 Q& m% n( |; b7 M0 Y
  681. show_mouse:6 I: A  f2 ^4 t' @' j- K. y9 b
  682.         jmp     _show_mouse
    & K$ S9 S4 S2 S9 V
  683. hide_mouse:5 o5 {- \2 Z* H. A7 h8 U. |
  684.         jmp     _hide_mouse
    $ V; I% ?0 l; v3 b7 a  m
  685. get_pos:
    5 f$ [" c# {$ ]5 M
  686.         jmp     _get_pos9 X7 e' l) u" ^; I
  687. set_pos:
    " b: E, T# i, u+ a1 H5 I" A0 C. F9 p
  688.         jmp     _set_pos
    & X7 H, w# V% [& ?& _5 k
  689. set_hor_pos:
    0 p) g1 z- z6 J. y6 q+ a
  690.         jmp     _set_hor_pos1 }6 J7 |9 R& u0 L7 e
  691. set_ver_pos:2 j* }2 {' ]; O* R* P+ h
  692.         jmp     _set_ver_pos
    3 o' @* C. ]! q$ E: w  e1 V- V! u# H! x
  693. get_mouse_movement:
    ; M7 T- p/ v: K, o1 F$ X' l6 Y
  694.         jmp     _get_mouse_movement
    ' h/ a  d& q! j) g
  695. set_subroutines:
    6 B2 U4 n4 A4 k1 }4 B8 z" }+ N$ b
  696.         jmp     _set_subroutines
    5 P5 O. n- k( B  c
  697. swap_subroutines:" R' U6 J1 F3 ?, r
  698.         jmp     _swap_subroutines& M- K. c% a( o2 ]6 _1 W3 U$ ~$ g
  699. % ]4 m, y7 I* d# ?$ O: j0 X
  700. _reset_mouse:1 w, U4 I) V2 |, Q% k" x
  701.         mov     byte ptr cs:[buttons],0
    7 V: e! ?4 N0 m7 \
  702.         mov     word ptr cs:[pos_x],0
    # t- L# S$ v4 |1 k, w/ m
  703.         mov     word ptr cs:[pos_y],0- n  \: N. ~7 A; G6 g
  704.         mov     word ptr cs:[x_move],0
    0 b- B* |! u( A- g% j/ p0 p0 f% R
  705.         mov     word ptr cs:[y_move],00 z1 r' ?$ K1 c: l9 B. @
  706.         mov     word ptr cs:[x_max],639; L) ?" s5 l$ H% {! s# P
  707.         mov     word ptr cs:[x_min],0' v% t& ^! L$ F  ^
  708.         mov     word ptr cs:[y_max],199( b4 ?  I+ b5 q, B/ p" M% V
  709.         mov     word ptr cs:[y_min],0
    # t. U; Z( H0 `- c* D# S( S: }
  710.         mov     word ptr cs:[user_mask],0' q# l: V, Q) X9 o- V
  711.         mov     word ptr cs:[user_subroutine],0
    ) j' v. a8 ?% h8 ^
  712.         mov     word ptr cs:[user_subroutine+2],0' Z6 e8 s# q4 L8 t( t+ M8 L* j
  713.         mov     ax,0ffffh- \( `" @, W% r6 C" J/ U9 t3 P- o
  714.         mov     bx,3$ {) i) M* ]" E, p
  715.         iret0 C: F8 b! ~1 r: U
  716.   j, [' Z' Z4 n+ l, `
  717. _get_pos:
    1 W. _9 W4 ^1 B6 p: q% G5 }
  718.         mov     cx,cs:[pos_x]+ ^$ I; O* m9 x3 m
  719.         mov     dx,cs:[pos_y]
      y% C! R7 y1 ~6 U2 ^8 T, g
  720.         mov     bx,word ptr cs:[buttons]
    ! P2 e, b: ?9 I  V  G+ }
  721.         xor     bh,bh
    ( ^3 ?7 T$ V5 W
  722.         iret
    , j' I& P' s! o7 e% ^" K

  723. 0 F  `& S/ c: i3 G
  724. _get_mouse_movement:
    8 y( L3 y( Z0 b( X
  725.         mov     cx,cs:[x_move]" z/ @. t* u7 ?6 e8 s$ m: b
  726.         mov     dx,cs:[y_move]
    # Y3 z$ P! C. s+ a, \& U
  727.         mov     word ptr cs:[x_move],0
    7 @# }. k+ i/ E1 `
  728.         mov     word ptr cs:[y_move],0& Y& h) Y; E. }
  729.         iret4 V- b. x- f. s2 ?& _
  730.   w( g3 X4 q  w/ q) d6 ~8 H
  731. _show_mouse:
    ! G3 R0 D& Q% `9 o/ Z! u
  732.         push    ax
    7 U5 h: K( _( U2 Q
  733.         push    bx+ n# N$ g3 U* ^# a; b
  734.         push    di
    & O; W2 b: J& g0 h# U
  735.         push    es
    . l& V9 [7 c: X" N9 ^2 X8 A$ y  G
  736.         mov     byte ptr cs:[sm_flag],1. c. `. p' V  v
  737.         mov     ax,cs:[pos_y]
    ' g8 g+ G+ V) _
  738.         shr     ax,3$ O+ q6 U; j, |. h) j6 r! y
  739.         mov     bl,80
    - g: X5 v7 o! ^2 y
  740.         mul     bl
    % I8 A* N' L9 j$ H& F; y
  741.         mov     bx,[pos_x]
    - D4 F0 h+ ?) z( D' b
  742.         shr     bx,3
      c: ]9 G/ m# _1 I' }  x' Z5 K+ p
  743.         add     ax,bx4 {, T* O( C$ Z( _' Y! A: x
  744.         shl     ax,1
    2 K/ k" w# H8 Z( a9 e2 G1 R% a# Q6 W
  745.         mov     di,ax7 {- [$ d7 n  z7 _
  746.         mov     ax,0b800h
    : O6 b! X+ h) [1 L
  747.         mov     es,ax
    9 u3 O) t6 s8 i, f: }2 _
  748.         mov     ax,es:[di]
    5 G0 ]2 A6 M7 A' t* P
  749.         mov     cs:[save_char],ax
    " S% M# ]/ Y  t6 B) N" R2 r* s
  750.         not     ah
    * w' E$ Q7 e! F& N' v* ^9 v! z7 W
  751.         and     ah,7fh- g. [  t1 T! ]. C& _
  752.         mov     es:[di],ax: F( _: u& c9 u! N
  753.         pop     es7 G# ~( o4 E* F+ l+ {9 ?
  754.         pop     di7 p/ H. c; I6 s9 `1 D0 g
  755.         pop     bx' O% W; K: u! F
  756.         pop     ax
    ! u; y$ W' v1 \
  757.         iret
    / v4 h( z0 _  {9 d9 r( w2 ?
  758. . g$ b, n% a1 I; a6 e
  759. _hide_mouse:0 O7 W+ s3 \: {" x/ o9 w( G
  760.         push    ax
    " d9 ^# k# e3 _6 D3 E( v# i
  761.         push    bx- }/ K, N% E1 S8 t
  762.         push    di
    / O0 \6 S* f: k& J7 ^8 C2 M
  763.         push    es/ E' e+ ^1 x! b# R9 n7 k' L% v. K. j
  764.         mov     byte ptr cs:[sm_flag],04 l2 _0 R' [3 A, j- {6 C8 g
  765.         mov     ax,cs:[pos_y]
    - Y, J3 [7 [" b( e
  766.         shr     ax,3# G  ~, D( \  d; O1 k3 E2 G! G
  767.         mov     bl,80
    8 p( Z8 g  \3 {8 T
  768.         mul     bl! O* C4 p3 G! u- J' Q
  769.         mov     bx,[pos_x]+ {# I( z- h7 w2 s
  770.         shr     bx,3. o# A+ j7 @1 U: W' I: {4 t' ]
  771.         add     ax,bx
    - c" m" ]+ I3 }' M: v) z3 w4 `! R
  772.         shl     ax,1
    / X% a8 {; k+ I  l4 K1 f% ]
  773.         mov     di,ax- I5 ?$ `4 H9 h2 ?: F
  774.         mov     ax,0b800h
    0 h" z; `2 U  s) R. E; K5 E" Q
  775.         mov     es,ax
    $ i6 |, ^% n: Y) n4 {, n% x
  776.         mov     ax,cs:[save_char]6 b8 X) U( E0 U4 h- a% A
  777.         mov     es:[di],ax6 B0 _+ ]! Q9 j5 l0 ]
  778.         pop     es
    - |4 C* G& c% W2 m. u* a" S
  779.         pop     di
      e" }0 m" U# j. v
  780.         pop     bx' \! b8 ^# V' F0 [
  781.         pop     ax
    5 K# s: `2 p7 {7 p; J# y$ N+ S( R# C
  782.         iret
    9 |2 T3 m+ `7 M3 x

  783. : a! K. N$ j" Y# [% V! x6 K) T/ S& ?
  784. _set_pos:7 ~3 v+ L2 A# i" f+ _
  785.         mov     cx,cs:[pos_x]/ f9 e% h# z" r# z, w
  786.         mov     dx,cs:[pos_y]
    ' D  O, A6 @$ |2 e: C
  787.         mov     word ptr cs:[x_move],0, p, L& y! a" {7 L
  788.         mov     word ptr cs:[y_move],0
    7 X( z9 X% l, n" `6 \! y
  789.         iret5 C) C$ J7 u# l# i" }- j2 X. ?, u7 y
  790. # [$ r5 p6 y2 E# g: W
  791. _set_hor_pos:
    ( K8 z% q: Z* }& S
  792.         call    max_min( Y1 \5 H/ T" _+ j& [  e
  793.         mov     cs:[x_min],cx
      r$ K" K2 B# @7 {- f4 _
  794.         mov     cs:[x_max],dx
    . k! w1 p9 u. z
  795.         cmp     cs:[pos_x],cx
    3 I& [% Y; ], s
  796.         jge     good_hor_min. s$ R! s8 _6 ^5 X5 M7 y3 [% E
  797.         mov     cs:[pos_x],cx
    + W7 u" q. W8 V
  798. good_hor_min:
    : {, m" ], w8 x. H* \3 _
  799.         cmp     cs:[pos_x],dx/ V9 u9 k* y, x  Q; J, P0 z8 a
  800.         jle     good_hor_max
      K! T6 f/ h$ V6 H
  801.         mov     cs:[pos_x],dx' P( v# I0 K& }6 e6 z
  802. good_hor_max:6 r: ]8 n1 ~0 N* N1 L' U  s
  803.        iret
    ! J. z' d, x9 R: @$ J0 q0 J

  804. ( E. a0 ]3 k6 ^( a+ e
  805. _set_ver_pos:, w6 B9 V7 K$ R) I0 q! {) f/ T
  806.         call    max_min, ~2 c: W7 `. r
  807.         mov     cs:[y_min],cx
    ! ^" s; W; V  P
  808.         mov     cs:[y_max],dx
    6 m% t+ F9 N/ R0 l
  809.         cmp     cs:[pos_y],cx
    9 M2 X- e6 M" y2 r! ^
  810.         jge     good_ver_min
    6 J$ ]- P9 O  l! ?) h
  811.         mov     cs:[pos_y],cx
    % S: x) w0 }1 O
  812. good_ver_min:
    : g3 ]1 e, P( O9 C# L
  813.         cmp     cs:[pos_y],dx5 A* l6 |9 B& s7 g
  814.         jle     good_ver_max
    + A8 ^5 w2 Q. M- f6 j7 R' L5 Y
  815.         mov     cs:[pos_y],dx9 g+ x! X( _  @% V2 H" _+ i
  816. good_ver_max:
    % w9 G, r; S1 ~, q& {+ }
  817.         iret) F: Z1 T& s' l! ~: ^  H

  818.   f( d; n* [0 G
  819. max_min:
    1 t& i* q9 Q/ f- X! d
  820.         cmp     cx,dx8 t' f1 C. y2 R; `) b
  821.         jle     no_swap
    - N6 u6 i- \" }& u. X7 @- Z
  822.         xchg    cx,dx
      _: f3 r$ Q* P7 P" U
  823. no_swap:
    / v# V" e% w4 N) X; E+ ?7 k
  824.         ret
    ' R8 C' J/ k% k# Z8 R

  825. , X. n7 T" B! k% S
  826. _set_subroutines:' ~8 m% e# ]$ S# d) H
  827.         mov     cs:[user_subroutine],dx
    # V  F' g( G: ]- q4 H9 R
  828.         mov     cs:[user_subroutine+2],es& Y7 f! }. l& J# ?4 f6 G; S6 A
  829.         mov     cs:[user_mask],cx/ q; ]2 z9 K( u
  830.         iret/ z* e+ L; r  S" O& I

  831. : N, o+ h1 I, j+ `) w3 c
  832. _swap_subroutines:! Q; h( v# U7 [; L
  833.         push    word ptr cs:[user_mask]1 w1 z: a: f7 k: j
  834.         push    word ptr cs:[user_subroutine+2]
    " l7 ?5 c8 h9 u( g& S
  835.         push    word ptr cs:[user_subroutine]+ j3 h& O' t0 k) P7 m( Y
  836.         mov     cs:[user_subroutine],dx
    2 L8 a7 O$ B1 ]5 T. f
  837.         mov     cs:[user_subroutine+2],es, D* f& X+ j) [3 s
  838.         mov     cs:[user_mask],cx6 f/ _) u5 c- x7 H0 V0 H: }
  839.         pop     dx" W) n; q- m0 X% R
  840.         pop     es+ Q  e( K0 g6 O6 h  |- }1 M
  841.         pop     cx
    , ]4 F7 ]/ L5 J
  842.         iret
    , U1 }: L9 j0 J! O, [9 w

  843. 7 o$ r$ R+ B2 s4 s/ \
  844. memmouse        endp
    / z8 X' |4 A  h7 `# ^
  845. 8 G. D% U. G+ |" T& k+ f1 p
  846. endof_start:4 M$ ]3 Z( V/ m+ x8 z8 Z& U
  847. 2 |9 u3 A- R& S" c* F
  848. emsg db 'No mouse driver install error!$'
    1 Y  H  q+ |8 X3 D2 V+ a* p) g
  849. old331 dw 0
    3 `' O+ S9 z& }! H
  850. old332 dw 01 ?/ p4 y- d2 `5 u5 H8 [/ }- Y+ h# b
  851. old741 dw 0
    # a6 v4 u/ T; |. U2 h. W$ w* J
  852. old742 dw 02 k$ l$ T/ |; H/ D2 \+ {0 J( W
  853. memcopy db 0
    5 u& i$ r) q) d" P: t
  854. okcheck db 0
    3 I/ [: J& |8 M" l" H! H8 e
  855. pass db 0
    # Y3 S* z! z1 ~6 O
  856. chkl db 0
    + J5 R9 z* p! s5 T* A
  857. lk db 0, n+ E8 n  q' l: [( a' {9 E& g2 Q! e6 ?7 G
  858. chkr db 0
    / Z4 f$ b2 r2 M# ^, h, R$ L0 [
  859. rk db 0
    8 y' P' ]* n1 f) @+ Z5 b% `4 P
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    : r$ v0 T' n3 X
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    1 ?$ d+ o! j# y3 x3 N$ Y6 N
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ') m$ O* T- b# G: u* C& D
  863. db '                                                                                '% F$ M* \  R' `, o! t
  864. db '                                赏屯屯簧屯屯突                                  '
    ' R3 H5 W' `& t  G: Y3 n9 a. p- f
  865.         db      '                                ?OFF汉OFF?                                 '
    4 l- }+ i5 z! U) j
  866. db      '                                韧屯屯既屯屯图                                  '
    " b  M) v( u+ p2 W( @5 o5 ^
  867. db '                                                                                '/ q. c1 T0 c- Q- q+ Y: k2 @  Q
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    * G; O9 z7 Y# f2 A+ p3 J
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    # d9 _( q" H8 K5 [% q1 J
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '' U8 v2 a: i5 f: d- h; X

  871. 1 P0 H& ~* E4 U1 l- I  T1 [
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!( e; [9 O7 z2 K/ l# u. r) a/ w
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... $ d. e1 n  a, @0 Z  Y/ |: o
, s; [: x' m; H* O# A
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:29 , Processed in 0.099139 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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