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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
, F8 ?' C7 T' s+ @4 j% a1 [, P8 O* n) D* |1 U' ^
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    6 _% q) P3 Y2 p; Z
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9, ?' U6 U7 U0 d0 w2 P5 N' i/ e, n! Q
  3. ;                                         By Bini.Yi 易祝兵
    7 C& _: W6 |3 B1 y& V
  4. ;                                         http://www.ufoit.com 计匠网
    3 f( w6 m/ U* x2 c& S
  5. ;                                         2002/04/06 YYYY/MM/DD, j. C& w5 Q2 ^% l
  6. ;, ~# a) N# g6 _9 B+ h1 T
  7. ;         
    / @9 d8 E1 T* h3 D, G( ?! {  i3 j
  8. ;          This program  test the mouse button  click and move.
    ' G5 c3 J4 z* }4 R# g% ?
  9. ;
    & }8 R1 F( B, b7 E% n

  10. & r# U/ c6 ~5 E, B! ~. e$ ?
  11. .model tiny
    ' U% }  H, ?, [+ T  x- Q- ^! \
  12. .5867 v$ t/ Y# p7 B
  13. .code0 H; g' I8 j/ O: H4 Y& F" U$ G
  14. .stack  100h& o7 d# A- M. o4 K3 A. N
  15. .startup  m1 l( Z: K7 A% u5 H$ {' E- s
  16. pusha6 U5 p* |9 h2 ^. f% e
  17. mov ax, 3533h
    / y/ x1 M3 Z( t7 P
  18. int 21h7 w/ {* b+ E5 `9 _1 d
  19. mov word ptr cs:[old331],es9 z+ @& Y9 \2 b& V
  20. mov word ptr cs:[old332],bx
    + p8 F% t! [& _- h+ _% d$ \
  21. mov ax, 3574h
    7 t- m" f- G% ?; T' ?* }
  22. int 21h
    3 a1 ]8 L$ F" x0 f# S* ?, W
  23. mov word ptr cs:[old741],es
    + }. e7 ~4 d8 J; K( g
  24. mov word ptr cs:[old742],bx* h# o9 o: ?" `7 \
  25. popa
    ! C# N% G! p5 w/ G" d0 N
  26.         call    memmouse8 V5 v8 n* z  v/ c1 d; h
  27.         mov ah, 00
    7 f5 A- W) S  U+ H( P: V5 Z# d
  28. mov al, 03
    9 |* y3 \; T, b3 Y+ W2 n
  29. int 10h
    2 X5 U0 E+ d$ Q$ l  B
  30. mov ah, 06
    # L' D) W. g0 n2 h+ b+ ~
  31. mov al, 0
    $ w7 f) m  S+ k0 T" \
  32. mov cx, 0
    3 \; d9 V8 H3 q+ j
  33. mov dh, 24& Y4 v, k$ H* P3 K+ p, y! G: \
  34. mov dl, 791 M: M7 ?* b# M8 o( s$ z
  35. mov bh, 07h
    " R+ V/ _+ p1 t
  36. int 10h' B; h  @+ W+ e" Z) T! W
  37. mov ax, 0000; [& n5 f' W: A2 }% G4 S
  38. mov bx, 0002
    2 p: |) U1 _8 F$ B; Y& U2 x
  39. int 33h
    8 s) F& e( f% J: x
  40.         cmp     ax, 0000           ;if no mouse drive install, T: e1 d6 Q7 D/ u3 U! b8 Y
  41.         je      errormsg           ;show error MSG
      b8 K: I8 l7 r
  42. mov ah, 02
    4 k3 }7 v: i- ?% l% r9 K5 S' ^
  43. mov bh, 005 L) `  d# Q1 {/ ^  R- s0 Y
  44.         mov     dh, 25             ;Move point out screen( b3 B* y  e# W. A
  45. mov dl, 79
    9 z; Q9 t2 T+ t
  46. int 10h
    / ?1 b7 A& t- P2 P
  47.         call    showmsg            ;Show info
    : S! H$ G/ n) ^1 m! ?7 m* ~1 u
  48. mov ax, 0001
    ) ?5 b& v( a; ?5 P7 m$ K
  49. int 33h
    0 c  N) w  @: G' T  {' M
  50. ; mov ax, 000ah
    $ L+ A1 `! L( |
  51. ; mov bx, 0000
    $ S* e2 v* c5 T. U8 L
  52. ; mov cl, 0h/ i8 x! L+ N8 V; R0 s2 x5 |" V) _
  53. ; mov ch, 0F0h
    + O2 U2 B) j( {* D
  54. ; mov dl, 0h0 Z4 V: V/ _' F) }
  55. ; mov dh, 0F0h6 o# c& I6 T1 t- l' _7 B) F/ ^
  56. ; int 33h
    ( x7 t$ k1 D) }' u
  57. mov ax, 0004h
    # }; Q# b( u/ q4 X
  58. mov cx, 0319
    # |, j' R9 I$ A' R' e# G5 @
  59. mov dx, 0103
    : Q1 e8 ~9 t2 ~" F5 g
  60. int 33h
    ( e6 H# |8 b# v2 G+ {
  61. casemo:                           ;Case button click and point move
    6 h, N# s  f4 _
  62.         mov     ax, 000bh         ;and keyboard press
    / f# ~; Q' E1 L0 V1 k$ |% ^
  63. int 33h, r  U, f: `# O
  64.         cmp     cx, 00h           ;if point move....X9 z, h; f5 N( q% q# \
  65. jne xmov
    ; E* B" X5 k1 I8 B" a0 M
  66.         cmp     dx, 00h           ;if point move....Y8 `" F$ q) i% ]) L* T8 A
  67. jne ymov' i6 P4 s/ C! `# |
  68. xymovend:                         ;X.Y move end
    $ }1 S# b- U$ [' R5 i9 P
  69.         mov     ax, 0003          . c% ?! e- x3 u/ d3 Z, A
  70. int 33h% W% D6 z9 W+ z
  71.         cmp     bx, 0001          ;if left button click  show ON5 x0 r; R% k' I( ~  n; m
  72. mov si, 1828$ f  q' H& }1 p
  73. je listl6 Z$ t6 A5 `; ]7 S
  74. mov si, 1828
    # B7 {- X1 ?  x
  75.         jne     nlistl            ;if left no click show OFF
    7 G+ B+ F0 U  ^
  76. testr:! ?  o6 a7 ?0 y/ s0 C, E; Z0 I2 [
  77.         cmp     bx, 0002          ;if right button click show ON% e; q# D; \; p; d2 M4 b
  78. mov si,1842
    ' g$ y' R+ r9 M& Q
  79. je listr8 K/ z9 M; k; X
  80.         mov     si,1842           ;if right no click show OFF' V  `4 u4 d8 F- S
  81. jne nlistl$ z6 J# Z7 |# a! s# ^
  82. casekey:
    + o( s0 Z3 ^0 d) t1 t6 A" `
  83.         mov     ah, 01            ;if any key press jump check' U' z' V( f  E3 j1 J  y+ E
  84. int 16h! T! \! T- ]: \! u
  85. jne kpress6 E* {8 f) A8 w0 b
  86.         mov     al, [chkl]        ;check x flag9 F1 f( \. [8 ?
  87. cmp al, 02h/ o1 V+ e* b" A4 P8 O" w  u. ~* t! j
  88. jnb chkok5 ^& e' b. k" M9 {" u
  89. jmp casemo$ ]" Y+ g" ]% b0 a- }
  90. xmov:                             ;if X moved, get the X flag+1( T2 b7 m2 \: ~' Y4 V4 k+ i& S
  91. mov al, [chkl]
    2 X# ~  K8 S1 d* j) b$ g: q; n
  92. inc al
    % q9 J3 q) w; S% z: s& g6 B8 _
  93. mov [chkl], al' k7 D. w8 C8 ~  p3 \, p: ]
  94. call passok+ }( b& j* e$ p& u: v' d
  95. jmp xymovend- z" \! }" F! j
  96. ymov:                             ;if Y moved, get the X flag+1" K! |. J+ S6 V6 Q
  97. mov al, [chkr]
    " I: p' S6 l3 ]0 [: ?% V' z; e
  98. inc al* {% M. e7 V  _" j$ O6 {0 r
  99. mov [chkr], al
    + n! u- P$ O4 G% h5 Y
  100. call passok
    2 @! {0 `9 c; G' o7 D! F/ i
  101. jmp xymovend
    2 t: A2 I$ g3 w  A

  102. 0 n; j6 I4 @- E' ^
  103. passok proc near
    0 b  g5 J4 R& d# O
  104. mov al, [okcheck]' m* ]- R* ~- h7 Y
  105. cmp al, 1
    ! h; ~1 w7 k- U0 Y6 ]
  106. je let0. M  x5 |$ ^; F* h" [) |6 X
  107. jmp passret3 `3 E! g- p7 _! x' q# z1 }/ H' H
  108. let0: " A* G4 b2 J+ [7 ~1 Z
  109. mov [pass], 19 [8 H4 f2 h4 n$ _" s' q, g
  110. passret:! K9 n# M  i# c8 O
  111. ret9 Q1 R  _/ W' P0 w  J0 P- j1 w& g
  112. passok endp $ i- }. G0 I/ M2 P0 m* H6 n% N

  113. , \, k' w- q. w
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    , r0 n5 ~6 F# ^6 g+ w% L
  115. mov al, [chkr]
    6 c3 J* P1 e3 Z7 o' @/ g0 {
  116. cmp al, 02h
      \% X& n( f6 e. g4 w
  117. jb casemo9 Y0 U9 E) D: x) q# L
  118. mov al, [lk]
    & n2 r' j; k8 `, A3 C# q5 i
  119. cmp al, 1; H- i* a2 V, ~" d+ J
  120. jne casemo5 ?* z1 D* }+ E* \: S
  121. mov al, [rk]
    0 Z" ]# W9 h- o% U
  122. cmp al, 1
    2 T% l9 X5 n2 P  i
  123. jne  casemo
    & ^- A8 r4 B) _* ?
  124. mov [okcheck], 19 ~& D$ N" G( S! ^' J5 Z3 W2 [
  125. mov al, [pass]; O9 v  k8 o4 ~% W7 o
  126. cmp al, 1
    2 _% \! b1 w- i& E2 [: h6 b
  127. jne  casemo4 K1 \5 R9 p4 c
  128. mov ax,0002h* a" J  @6 O5 N+ @. h6 M3 y0 O/ b3 x, `
  129. int 33h
    # @! w& g) w+ T$ {5 n/ Q
  130. call cleascr# W+ [5 v( j0 n# F( |, x$ k
  131. 2 K1 D( n5 _# x  F
  132. call oldint
    5 D2 l- e5 V- X* K! n. Y( W6 U
  133. mov ax, 04c00h
    ; z6 {- s% R5 I. a; }! R1 i
  134. int 21h: J' |' l# z7 J
  135. 8 }  K. G: v' O+ S- N
  136. okexit:5 e+ u. ?* _; Z: |0 Q. M7 p
  137. mov ah, 4ch
    : L: G+ y+ }! e2 S
  138. mov al, 0( k9 K: L4 O9 K
  139. int 21h+ z3 x$ I, V, y( b
  140. listl:                                 ;Show ON
    6 n$ V1 \/ X, v: V. U- {0 E
  141. pusha
      g* e/ a* u  L- H6 @( o
  142. mov ax, 0b800h
    2 X# o: }9 @" C+ Z% K; v8 @" ]0 o
  143. mov  es, ax
    4 S, j7 o6 P7 m! v5 n$ h6 k) v' q
  144. mov ah, 47h/ H9 x* j  ~  _
  145. mov al, 20h6 q  a- Q9 ~* _- v0 @. q
  146. mov es:[si], ax
    2 z$ k7 \  Z* \8 M# t
  147. add si, 02% }. r/ n% B& y
  148. mov  al, 4fh) ?5 [: }/ n+ p. Z$ |1 n3 f. j" A
  149. mov es:[si], ax
    ; Z$ k8 V9 y2 Q
  150. mov al, 4eh
    5 j3 {0 F7 a) J6 e
  151. add si, 02: e/ Y6 G8 N% d
  152. mov es:[si], ax
    : v$ v1 a$ n' d, N+ O7 x3 |' r
  153. mov [lk], 1
    . Y: B0 t) n! X% b
  154. popa/ M! i/ p- K2 k( v+ d
  155. jmp testr
    ; H4 f0 o6 K# t7 N
  156. listr:                                 ;Show ON
    + S  I: D+ B. v: C( _4 G+ y
  157. pusha
    * f+ s9 k. Y5 s3 [" l
  158. mov ax, 0b800h; q. ~( d4 p& y- W  k3 ^+ t$ w
  159. mov  es, ax
    0 i" C! M8 @# I( Q1 q
  160. mov ah, 47h
    0 r1 S# D% o% ?5 D$ t8 V1 t
  161. mov al, 20h' L) F1 Q& z* S  ?; z6 Z
  162. mov es:[si], ax
    0 V* m# E! A& k3 x
  163. add si, 02
    4 W! ^& G8 b: x) e
  164. mov  al, 4fh( @+ r6 {) U* M. \9 ?. K. d
  165. mov es:[si], ax8 ?/ C6 X: g5 j
  166. mov al, 4eh9 G6 R4 j* x! D. t5 I$ }6 }
  167. add si, 02
    6 G1 r& u1 ]! ]4 j. u
  168. mov es:[si], ax
    $ }  c3 K! h8 x' [) U0 E
  169. mov [rk], 1) @2 j$ t) d& ~4 U
  170. popa
    2 B5 k6 U" u+ {8 M
  171. jmp  casekey
    " I& c  L$ i& S$ y. a8 J. T9 S8 e

  172. 5 T9 X' a; v& x6 y) p
  173. nlistl:                              ;Show OFF
    $ `& C" V; |0 |' E7 p
  174. pusha   : q+ T5 \% p- w  |- j
  175. mov ax, 0b800h6 m2 l% k7 Y, D5 C
  176. mov  es, ax5 X) o, M9 x8 V' ]! P6 s" W8 S
  177. mov ah, 17h" R5 u4 H% E, t' r, N  y
  178. mov al, 4fh
    $ f4 i0 P2 d& E/ B( c
  179. mov es:[si], ax; E2 s9 M/ ?: O7 d
  180. add si, 02
      s) Q9 g4 c  A7 \* f- n5 \- L, w/ {
  181. mov  al, 46h0 M' x. n( x4 v+ l* s
  182. mov es:[si], ax
    7 v$ t$ P, W4 h- m9 G9 q
  183. mov al, 46h" W# D# `( k5 G/ Z# F2 Y- ^
  184. add si, 02
    0 Y" P" q% X; o, d
  185. mov es:[si], ax- U5 S1 i7 U' {9 j1 s4 R) z" U
  186. popa
    4 \9 [$ h; R& _$ s# q& j
  187. cmp si, 1840
    2 m9 x! b! D% [( E7 \+ n
  188. jae casekey; f3 B! d' x  I8 K/ c3 Y( v
  189. jmp testr$ K+ B* [( n8 t  R3 X' f5 e

  190. ; a3 H- r) g5 W
  191. kpress:                             ;Check key press if press<ESC> then EXIT( X4 U5 a( E  z0 U7 N
  192.         cmp     ah, 01h             ;and return a error, z& @" |; l; F8 |6 b
  193. je exit1" R2 o1 n; G* ]1 T" u
  194.         mov     ah, 0ch             ;if press other key then clear: P# [5 N2 U8 U0 T, b
  195.         mov     al, 00              ;keyboard buffer9 Y' W* D( A: C
  196. int 21h
    ' \- h2 a2 H2 P# x+ \
  197. jmp casemo
    , O3 X4 j* z. _0 ]
  198. 8 n/ `+ M) x9 `6 m( _; k" [
  199. errormsg:                           ;if mouse driver no install9 u: w0 P4 y: M" Z+ W+ m& h' S
  200. call oldint& N. z* h! H9 i  W* F( p
  201. lea dx, offset emsg
    ! H$ V8 g4 }2 i) ^& i  b, ~
  202. mov ah, 09h
    4 K! l7 x5 J+ Z1 q+ m- m
  203. int 21h+ F" D" `5 a+ Q% P/ P
  204. mov ah, 4ch
    + Z  e0 L" _! t6 b8 F
  205. mov al, 2
    * H4 p# ^! q# c5 T6 S. u& K
  206. int  21h
    5 I7 k8 j- P4 `3 J; u+ a

  207. 9 z9 }/ b4 ?# ]7 }) ^- q
  208. exit1:                              ;error exit0 B3 e; C  \0 T$ y! ]$ N" I7 H! l4 z
  209. mov ax, 0002h
    . n6 g+ f7 `. \8 X0 k$ H! ]
  210. int 33h/ ^: D  x: p! A" `% x  i/ J8 z
  211. call  cleascr
    " P* X3 C8 D- e
  212. call  oldint/ j, l' C! [5 i" S; g5 R
  213. mov ah, 4ch4 ]* I% P( B0 z; {+ `
  214. mov al, 01
    ; I2 }0 a( a- s0 q- d* s/ |  o' F
  215. int 21h" l8 [& C) m! E

  216. ! [  o+ X! h% e0 H+ `$ a. n" ]: ^
  217. cleascr proc    near                ;clear screen( b$ m: N, e' S
  218. pusha
    ; W( r7 v# D% I. r7 f6 s) [) Y
  219. mov ah, 06" o* A3 r  {! d- x0 X% U, K
  220. mov al, 0
    % C0 P6 R: S4 g$ d6 p$ h
  221. mov cx, 0! T1 Z. ?* w' z6 n* T# W
  222. mov dh, 24" J3 n+ v/ ?' E$ m$ a8 O
  223. mov dl, 79
      D: u# m0 _, e* f' W$ _
  224. mov bh, 07h
    7 O; r: U) B4 I" S; v
  225. int 10h
    3 ]1 n7 i% E) t/ W  j  @0 @/ z+ i; |
  226. mov ah, 02
    # [0 |7 g8 C; C4 ~0 B& g( H4 J8 P* ~
  227. mov bh, 00
    , o/ |5 n( {  t- V/ r
  228. mov dh, 0
    0 I2 l. d( A4 W' o/ U
  229. mov dl, 0
    ( d! t  `" g2 {5 [; Y) m
  230. int 10h
    & M3 N8 P& \0 t. U4 N$ K" V
  231. popa
    ( n" j2 m6 t/ i$ k- C' Q
  232. ret) R3 R3 x" R1 `. v, \0 p5 U" y
  233. cleascr endp
    ! y' S, H, y8 Z; Y

  234. 8 i+ V6 |; s. P# i5 ]5 E$ ~1 O
  235. showmsg proc    near               ;Show info
    / ~. Z% c- B( t: ]
  236. pusha: Z; G5 c; G5 c, y2 o. S
  237. lea di, offset showms; b2 ?4 @0 J, O2 L
  238. mov ax, 0b800h9 `2 Z7 w. b9 {
  239. mov es, ax
    : B1 m6 @  f0 Y) t7 t
  240. mov si, 0
      o7 R) k8 G8 o/ _, c" A/ j2 `
  241. mov cx, 480
    1 ~' H" S! b3 V6 ~4 @
  242. mov ah, 07h
    1 N8 I& q7 E& A8 S( a4 I
  243. @@:
    - D7 p+ q. m  g" A2 l) L
  244. mov al, 20h/ U  s+ @) j% I4 N1 N6 U
  245. mov es:[si], ax
      Z- ?1 y0 C: ^. U8 @- T  n
  246. add si, 26 _: m! t0 }1 j! x: L
  247. loop @b
    7 Y+ O: G( C( E: P& H  o
  248. mov cx,880
    5 y5 v$ O/ u# q0 }; S
  249. @@:
    & \& m, d/ |& T' y; w& X* s6 O9 L) w6 k
  250. mov al, [di]% k1 O' Z" U. Y$ Q" F
  251. inc di
      @2 H/ @0 S1 u4 R0 S7 o7 ?" x
  252. cmp al,20h/ s1 q/ |5 D9 ?9 C
  253. je showch1! I( _: X- h/ V. R% O0 R
  254. mov ah, 17h
    8 f0 o# e2 r- J) x7 H0 Z7 f, a  [+ u
  255. jmp showch3
    * g1 T% S0 b$ l0 F+ o
  256. showch1:! z3 F' J- A2 V3 R6 U! q
  257. mov ah, 07h
    ; h% P; Z: c4 p5 I* P
  258. showch3:
    / n6 e. _$ `+ }# i/ ~2 n
  259. mov es:[si], ax
    8 q' J. t) [% x5 L% v
  260. add si, 2
    . L# X2 [7 I' r& n; u0 V& Z( Z, s
  261. loop @b
    ! \: C* \3 J; }: y
  262. popa
    0 F6 L" W' Y/ }, u. j2 J6 c
  263. ret: S( k% [' m  i# v" n/ |
  264. showmsg endp! n2 X. K; g& ]
  265. 8 P- J+ b5 S: U8 [* T
  266. oldint proc8 r" r1 w7 W9 ?/ @& C4 ?
  267. pusha7 Y6 Q1 N+ g: s" e, Y
  268. mov ds, word ptr cs:[old331]
    0 x  D- i% g4 I6 J3 }" U+ T7 I' Z
  269. mov   dx, word ptr cs:[old332]+ u" K: Y1 Z1 x6 A2 J* I: B
  270. mov ax, 2533h
    8 g3 s5 G: \- G. o' m4 ]
  271. int 21h
    8 ?/ q% Y. Q& W3 O' c  S
  272. mov ds, word ptr cs:[old741]
      G% Y' X( a8 d5 h- L0 ]
  273. mov dx, word ptr cs:[old742]
    2 B8 f* w9 x; S& N' V, }7 K% z
  274. mov ax, 2574h8 J/ I( i3 D3 i  N* Q% t# Q( P
  275. int 21h
    8 I" t$ m, @- Y7 Y, @8 `. E) S
  276. popa
      N% T% _: M4 W/ B0 H9 Y
  277. ret8 c7 _, e7 x8 H: O1 h& w1 b; x
  278. oldint endp
    ! Q% l1 d  P/ R% g# L2 F: R% M

  279. ) X$ @: e5 O! U6 c8 W0 D
  280. memmouse        proc
    & s2 [# P) S% `/ u  b$ h1 n! p
  281.         xor     ax,ax
    - x& G% e0 F# B3 i- b
  282. int 33h( u/ ?! _# W# [; ?  L
  283. cmp ax,0ffffh# w1 B+ z# O6 p5 Q9 |( N4 b/ K
  284.         jne     not_loaded
    * U+ I3 O$ r& t- }  X
  285. mov [memcopy], 1
    + _2 _* x  Y" V0 |
  286. ret3 k! i. M4 Y' J* B  L4 m$ @1 [
  287. / h0 s+ a7 C- e: _, T( }5 @
  288. not_loaded:! F2 h4 X' P3 s! X) y

  289. ! h* F, C+ k4 n2 O4 X
  290.         mov ax,2574h
    ( K; D* U/ }+ E# g* f% f
  291.         mov dx,offset new_isr
    5 c. y2 l0 g& M, ~& |: c
  292.         int 21h
    % h; [' P* p4 }( g
  293. / N7 a9 _# y# v: ]# ]
  294.         mov ax,2533h
    - Z* I+ [3 g% Z6 B) N& B* N& v
  295.         mov dx,offset new_33
    . ?, y/ N5 c& s
  296.         int 21h1 I& H7 v9 x6 `/ Y. o, ]

  297. $ `+ _9 {! X' M: d% A
  298.         cli
    & c% A( t$ C0 J' w7 j. B2 p6 L

  299. & _& T$ J* O' z( T) L
  300.         mov bl,0a8h6 o. O, h1 y! r$ W
  301.         call keyboard_cmd
    1 H4 X3 G0 p( k0 F- p& G/ ~  |3 O
  302. . W/ K- e* B% H7 x
  303.         mov bl,20h9 v! n' _7 ?$ ?) d4 c  d- j: G
  304.         call    keyboard_cmd0 A  }  X" J9 M8 T
  305.         call    keyboard_read
    5 T/ M6 N9 t; t. ]
  306.         or      al,2
    - G" `  p, p: |7 g
  307.         mov     bl,60h
    5 `% M2 \. o5 k! L. D* n
  308.         push    ax5 ^" t. O; e* [0 G! e
  309.         call    keyboard_cmd; d) S% O( G' ~0 B
  310.         pop     ax
    , g; |' y$ O8 s0 D5 R
  311.         call    keyboard_write# Y4 V1 w/ ~0 |! j

  312. ( R  P& e. ^- P2 x: h
  313.         mov     bl,0d4h
    , _, A% a! K5 {
  314.         call    keyboard_cmd5 n! D( M. I6 E) I( f0 h
  315.         mov     al,0f4h& ^# [% ]: D; c. t$ r6 O
  316.         call    keyboard_write8 I" F2 ~) F  D3 a  L
  317. % b  q+ m; t  H7 L5 \+ G: y
  318.         sti" C& [6 I. Q0 Y
  319.         ret+ T% P8 y6 ~$ }, A- n
  320. call_user_isr:
    : |0 d! G1 K/ d! t* @: w7 x
  321. db      60h
    $ c* D9 B7 O. ]' a( I. \
  322.         mov     cx,cs:[pos_x]
    + ^1 u7 r6 W$ _( h2 x
  323.         mov     dx,cs:[pos_y]
    : r) T) }& [* f* J  T: S) Z) T
  324.         mov     di,0 ;cs:[x_move]
    ' _7 l! p  }8 ?7 \1 r; V
  325.         mov     si,0 ;cs:[y_move]1 I" t9 }- l$ Z( n: r! s
  326.         mov     word ptr cs:[x_move],0* F% H; O* i# F4 G1 O* P
  327.         mov     word ptr cs:[y_move],0
    6 \, u, A6 z: O' i6 x+ p
  328.         mov     bl,byte ptr cs:[buttons]
      \$ Y0 ]  A, d7 j
  329.         xor     bh,bh: O- c& q" M+ R+ T
  330.         call    dword ptr cs:[user_subroutine]) n2 f* N2 q, C1 I1 o
  331.         db      61h
    ! V' m+ j8 u7 i) t5 m$ F
  332. ret
    " c  X' F! M  s' A
  333. new_isr:* O8 x' }# O; W
  334.         pushf
    . o2 E5 |& p0 q' G% o& a
  335.         cli. x5 |: e( n; z% F: L
  336.         push    ax; H: y6 ^# u- J: c
  337.         push    bx
    ' b4 \$ }& C2 Z8 O" v( v
  338.         push    cx- P% `: X9 P) m4 U9 ^7 E9 \5 H
  339.         push    dx& k& Q2 g" H, C2 o
  340.         push    di, G% j* c1 F) h( @- d) p3 D0 M, H
  341.         push    si
    / y( Z7 Y/ O8 w' @  A9 h
  342.         push    es
    3 a4 X, J- ^( X
  343.         push    ds+ X% Y9 J3 v$ y1 u4 d( j5 f

  344. * p% F4 O) E; P- n; T
  345.         push    cs
    0 `# h/ B9 }- ^; \
  346.         pop     ds& {" z6 i( D4 e# P& Q1 `4 I

  347. ! h: E* `. @% v6 u. `
  348.         mov     bl,0adh" H3 M/ h$ U* m7 _* C  J
  349.         call    keyboard_cmd
    2 f" x* T6 \- }# t! E  l

  350. - @7 f/ O; z# |  A0 B
  351.         cmp     byte ptr [first_time],0
    9 i# x7 P! \6 G" T/ b8 l
  352.         je      not_first_time
    ) Q* w, U8 E9 n

  353. 5 _# ?! @# ]* V: U
  354.         mov     byte ptr [first_time],0
    % K  J$ @, P" e/ A& y2 n# I/ v
  355.         call    keyboard_read
    & K; k  Z! c7 ^: e5 Q: F; ]  D
  356.         call    keyboard_read
    ; T- }- L! a: i9 X
  357.         call    keyboard_read' l4 f* J/ N1 a( u. }6 w* ]8 f
  358.         jmp     no_show
    0 T9 U9 n: k3 V  z- n

  359. 0 i  A% K9 i( @+ Q% n5 b4 \; `& i) y
  360. not_first_time:# m9 ^: H4 z5 U4 o) q) O
  361.         mov     word ptr [temp_mask],0
    - R. d: j& v4 E# P# ]% d' m
  362. : z$ W* l' s1 x0 y/ E  ?- [
  363.         mov     cx,[pos_x]
    / s2 Z* e8 h  R8 G: K" T8 m) o& J1 [4 u
  364.         mov     dx,[pos_y]
    . z0 g( y& m: e3 m4 w3 ?

  365.   N% X- u6 S5 X# |  Z1 C
  366.         call    keyboard_read5 a4 b; Q3 K! ?7 \
  367.         and     al,7 ;3
    , A2 a) U2 p% V5 ^
  368.         mov     ah,[buttons]
    , Q: P) G* W' W' c( H; ^# j0 z
  369.         mov     [buttons],al/ h* g! j! e; ?1 M/ Z. P6 i
  370.         cmp     al,ah
    4 a8 b( b0 R$ F0 R7 b4 H2 x
  371.         je      no_button_change  B& R$ r  s" f; y
  372.         and     al,3
    1 K6 V2 z) G7 j9 v1 a/ W+ O
  373.         and     ah,37 C4 y! B% ^7 H  t0 _! j
  374.         xor     al,ah
    * ?! c3 I. [2 Z  g! J
  375.         xor     bx,bx. b: D3 p2 q1 e) G6 x1 p; M0 T: H) _  f

  376. % I* S5 c7 }9 H7 z7 P: `
  377.         push    ax5 N, X4 ~# t% P" U' V& L
  378.         test    al,2
    : \  y% ~! ]  M: H
  379.         jz      no_right_button_change3 S' j: K3 H$ p
  380.         and     ah,2
    " G: M* a% W1 T7 {
  381.         jz      right_button_pressed
    & ~, s; O, k; r" {/ t
  382.         or      bx,16
    / R- y7 m2 r$ L% s
  383.         jmp     no_right_button_change& |. D4 S  n* _" `8 [
  384. right_button_pressed:- C1 F4 b0 f  r2 \  C
  385.         or      bx,8
    / j$ E, P: Z, y" N* p( m
  386. no_right_button_change:
    . v# P" B  b5 D( L

  387. - G. L2 v# X& b8 J
  388.         pop     ax
    - r, Y( [2 q: c2 m

  389. . k$ y( j$ D8 w
  390.         test    al,1  d+ m3 T1 i' ~3 B0 k0 B- n
  391.         jz      no_left_button_change
    5 {: z3 x) j! T* E
  392.         and     ah,1
    7 Q7 m1 r- R1 v# c# l6 D
  393.         jz      left_button_pressed! j, x  @5 c4 D) ^
  394.         or      bx,4' Y& x+ q$ A! d5 X0 N7 H5 A3 W1 ~: r8 L
  395.         jmp     no_left_button_change/ E6 M7 H- k* J' v4 E
  396. left_button_pressed:' f3 O% Q0 @* R. ~' S- Q* h; o
  397.         or      bx,2
    : ^% N/ l- |4 u& x8 Y! \
  398. no_left_button_change:
    " Q' }7 {; s- b1 o1 _
  399. 9 m" G8 @9 {  s( ?9 b
  400.         mov     [temp_mask],bx5 I0 K  L7 d* u" v7 F; K
  401. 1 N9 U& @7 z4 M) e7 F
  402. no_button_change:
    0 k  j7 g  n; E  K7 n" |
  403.         call    keyboard_read
    - v, a" g7 J9 K! l+ }1 K0 m
  404.         cbw
    0 r  g5 [( i9 [3 ]
  405.         add     [pos_x],ax
    + s1 \" V  P1 T6 j( J: r. c
  406.         add     [x_move],ax4 m) \+ C$ n$ C- r9 L) p& V
  407.         mov     ax,[x_min]
    ) B4 T0 [& m8 Z6 A6 ]" x
  408.         cmp     [pos_x],ax
    : F8 \4 x. k! _9 ~5 d3 n
  409.         jg      good_hor1, F: I4 h6 v3 z" _. K# g3 ^
  410.         mov     [pos_x],ax3 K# [8 J) P3 P. @+ z( {( c
  411. good_hor1:
    ; p6 l2 B& I: b/ }3 b
  412.         mov     ax,[x_max]
    ) y( D1 U5 H6 a: P
  413.         cmp     [pos_x],ax( o' K% |, X9 Y
  414.         jle     good_hor2; n* i+ r, M2 _, A2 w( {
  415.         mov     [pos_x],ax# K5 `6 K  M& i/ b. m' s) i
  416. good_hor2:
    & x8 f  [$ M0 \5 _/ Z

  417. 3 H2 h% x' i# y* R
  418.         call    keyboard_read( z5 i2 }4 I% S# `6 M/ W2 D: Z
  419.         neg     al
    # b/ S3 N# k, N  @% o
  420.         cbw" h. J" A. V0 _" k) h, O+ @
  421.         add     [pos_y],ax$ b, m; J( E% n0 T
  422.         add     [y_move],ax
      o' }. }1 e8 ~
  423.         mov     ax,[y_min]
    . L; Z4 ?1 n0 o0 K  j( T
  424.         cmp     [pos_y],ax6 ]4 a3 F8 ^2 H) |& o; g
  425.         jg      good_ver13 U" n/ Z* `; v- n, P4 o
  426.         mov     [pos_y],ax9 ~# _" i! v  m1 w! C/ U
  427. good_ver1:
    ; e( K. Z6 n# Y$ x
  428.         mov     ax,[y_max]0 ^3 \2 x1 }; [. |. @6 G
  429.         cmp     [pos_y],ax% P; j! q" l- G1 c; ^
  430.         jle     good_ver2
    8 w- F/ |# o" @5 E' \
  431.         mov     [pos_y],ax, G8 u+ s' r3 Z
  432. good_ver2:
    % r: F5 n; I4 p; _8 ?, C
  433. ; f3 h4 H1 w) W$ T5 F( g* d
  434.         mov     ax,[x_move]
    , H$ q: f3 v5 B
  435.         or      ax,[y_move]
    6 n! V- t0 O7 g" K
  436.         or      ax,ax% Z. y) p2 L! P
  437.         jz      no_change_position0 E! C; A" H3 `2 a8 C; Y7 m& E
  438.         or      word ptr [temp_mask],1
    , {; ?; ^4 S. e. s0 ?% y) }
  439. no_change_position:
    - E' Y) i" S/ t) d, v/ x/ h

  440. ' }8 A4 C* F$ R7 t$ C
  441.         mov     ax,[temp_mask]
    + i+ u, z% |8 |  G7 r1 n$ _$ B
  442.         and     ax,[user_mask]% r( |# D. l4 ?# f( J7 ]6 G: A
  443.         jz      no_call_user
    % w0 Q  o, Z& }8 @2 I& e! Q/ l, I
  444.         call    call_user_isr
    - y% }# s5 M0 J7 }. x
  445. no_call_user:
    1 V  q) H9 J% F2 P- o$ Z
  446. ' i0 w, u! k4 Y( a' c! n& {) R
  447.         cmp     byte ptr [sm_flag],1
    . w* s5 W; M4 q) J6 d
  448.         jne     no_show$ Q1 Q/ x, o- k9 l+ W6 ~9 I( U

  449. 3 |" z4 p. `; ^' q; L
  450.         shr     cx,3
    2 X% D/ i7 j+ Y2 e. |
  451.         shr     dx,3( _6 D4 B2 @4 p# J, {% Y  \
  452.         mov     ax,80
    $ C- v. q" X+ n9 R" c
  453.         mul     dl
    . B, y- b$ z" G& _" h6 X* g! d. k
  454.         add     ax,cx
    6 k, g( V7 t/ C& e1 v( S) V
  455.         shl     ax,1
      a7 [5 `( K2 j; O$ g
  456.         mov     di,ax+ u* B1 p) A  B" H
  457.         mov     ax,0b800h
    * _# L: o) z" b7 G1 G
  458.         mov     es,ax; O; L; i2 ]6 U# {* k% Y
  459.         mov     ax,[save_char]; r0 Y( D2 y. ?
  460.         stosw- z. d5 C, {" w! r

  461. 3 V7 o) m+ J$ n/ n' S+ u# ~
  462.         mov     cx,[pos_x]& G& q/ ~/ ]4 J* [- h
  463.         mov     dx,[pos_y]
    ' z# c4 c9 t+ N1 Y- U) r
  464.         shr     cx,3
    1 A( ~( n7 O: j, N& E: M
  465.         shr     dx,36 ~' l8 [/ L* ?1 L5 _7 {
  466.         mov     ax,808 j* [  ^( S! d% c1 a! ^% Y
  467.         mul     dl; y0 l3 k' j, U: S" M5 Y5 Z6 g
  468.         add     ax,cx: b* S3 Y; X  k5 _9 K
  469.         shl     ax,1
    6 [! H2 e; D4 t- o& O) L
  470.         mov     di,ax
    ) ~9 y8 X  J$ \4 K& p
  471.         mov     ax,0b800h' K3 p) ?4 `% u0 f, B3 h6 D- S
  472.         mov     es,ax
    0 E. m# j% i# ~8 B) _4 h- t
  473.         mov     ax,es:[di]9 a" K+ K0 _" G1 Z* s; R
  474.         mov     [save_char],ax9 h) y& |% Y2 C* Z/ H) t6 |
  475.         not     ah' _* M# s: g- G5 o% u) t
  476.         and     ah,7fh
    : K( L1 n# W  W- m
  477.         stosw/ U; F, N# G! g5 s) Q+ w, e
  478. no_show:5 T3 G6 N: {2 U: O+ L
  479.         mov     bl,0aeh
    6 X/ V: r. _" R: g
  480.         call    keyboard_cmd' d' J1 }4 z$ E4 _

  481. 9 U6 Q, O) I/ o
  482.         mov     al,20h
    9 N6 s! m3 j! H) A  P4 @
  483.         out     0a0h,al
    , d) p- m, Y# y$ ?: h3 f5 B
  484.         out     20h,al
    ! o: Z1 N! m4 d5 p7 M% o7 v, D
  485. % y" {1 a, B( x% h. `9 E3 E; F* F
  486.         pop     ds4 U  {' u! ^% g
  487.         pop     es
    " d/ Q; M+ [' m+ Z$ t
  488.         pop     si+ j' n; u/ b* J; r" V' z
  489.         pop     di5 F  r6 S3 O8 i; V1 g0 b
  490.         pop     dx
    : m( G% s8 w+ G! q; b1 C# ~
  491.         pop     cx7 O4 g7 H2 Z" Q: ^! @+ b
  492.         pop     bx- s. ~/ N4 {( ^0 m$ U$ U
  493.         pop     ax8 x% b& z# r/ V2 A8 T
  494.         popf
    ) }0 P" {- Q4 f2 X* m2 k8 N5 @
  495.         iret
    ) G3 v% N2 [2 T  O0 x2 w
  496. ( @" x* y) |- Q8 X4 ~1 W4 I
  497. first_time      db      1
    0 N4 v3 M1 I4 N" Y4 M& J0 u
  498. buttons         db      0
    0 U1 j; A5 ~. m* Y8 p, M, o
  499. pos_x           dw      0
    . I4 j. `' f! D+ O; H9 D# r
  500. pos_y           dw      0" }$ }6 f+ R8 c! I* v+ A
  501. sm_flag         dw      0
    $ K3 O' |' e% u8 i" g; {! p
  502. save_char       dw      03 z) c6 t6 U0 I* X
  503. x_move          dw      0
    ( |. t; \& Z& a$ }. i
  504. y_move          dw      0
    ; j7 B; z1 J" O1 p- k1 U& o" L' l
  505. x_max           dw      639
    + A1 s* c9 m: @+ O
  506. x_min           dw      0; A# h8 t* u  I' J5 }5 Z& b
  507. y_max           dw      199
    0 a! L' h4 y# K/ c" ?, ?8 X' R
  508. y_min           dw      0! _7 a  W+ N% O9 x+ s0 W; X
  509. user_subroutine dw      0,0
    2 i* C: u  b2 ^) a4 D( T
  510. user_mask       dw      0
    % A% z& L' \# H" o! M5 _* X2 C
  511. temp_mask       dw      0
    9 X1 s1 m1 n6 \

  512. ) E, `& Z' G9 |! A- |+ W
  513. keyboard_read:
    % }" ~2 z' F0 p3 v' f2 W9 m
  514.         push    cx
    / O2 f& m' a4 f% {
  515.         push    dx
    ) ?! W1 w5 m# ~4 R
  516.         xor     cx,cx
    , E5 I* A+ B) y* C8 l7 Y  p1 O  R
  517. key_read_loop:2 h4 U' y6 t  H5 L: V0 Q5 B% C
  518.         in      al,64h! W/ E2 P# q; l" ?! E, i0 J
  519.         jmp     $+2# g$ x" g' Q! \# s" D( |3 G1 a) |7 L
  520.         jmp     $+2
    - M# _& G) x. L. G( w
  521.         test    al,10 |8 a) r4 ~2 Z
  522.         jnz     key_read_ready
    / H( M" d% V7 b5 v, N4 p
  523.         loop    key_read_loop5 V* z& {) `# I' z
  524.         mov     ah,1
    % f7 g6 J4 l- h' |
  525.         jmp     key_read_exit
    4 r( R, T3 B# ]3 i, P; R0 j- s
  526. key_read_ready:
    % `9 S& x* Y5 D) x
  527.         push    cx4 _& h# G! ]  G9 l. q( l6 D# `& y. N
  528.         mov     cx,32
    0 l1 s$ g4 V8 y2 q
  529. key_read_delay:
    9 G' f& I5 L* d: a
  530.         jmp     $+2
    " d  J3 M5 o8 J$ E* u  b* j5 b
  531.         jmp     $+2/ z* c& `1 U$ M" U# u+ M: |
  532.         loop    key_read_delay5 Q  o7 E1 E+ v% j2 D

  533. + I7 I  Y: U+ R2 w1 V" q; a# U+ u' O
  534.         pop     cx
    # ^# v# {5 [* L; L0 |, E

  535. * S, E2 a6 N% V- K7 H9 V6 c! H( S4 T
  536.         in      al,60h
    ' T$ I, L- G- ^1 r
  537.         jmp     $+2
    2 r  |+ p& K' T% w5 F  k9 h
  538.         jmp     $+2
    * u5 Z1 a6 q$ \  m" q$ V* z; S
  539.         xor     ah,ah
    ) g$ }" u* e' n  x3 N
  540. key_read_exit:
    ( _  i  F0 E, ]! M, x% b* c2 ^
  541.         pop     dx
    ' R# a5 D5 y* \$ r* g# `# F
  542.         pop     cx
    2 b: r% b/ f8 W8 L
  543.         ret
    $ ^0 C& i$ g% J: w  b, j* K7 d

  544. " X8 }6 T7 C( ^# J1 \0 w( r
  545. keyboard_write:
    9 R+ S% h6 i) D. z( X
  546.         push    cx1 h7 H1 {. i. @3 J
  547.         push    dx
    5 h9 m: ?, k* r2 u- T1 ~0 M! g
  548.         mov     dl,al( f# f/ {" C$ e, p- E
  549.         xor     cx,cx8 A8 V3 t: W# d- ?9 E  l7 V+ _# e
  550. kbd_wrt_loop1:
    ; r" ?& ?  d- ~0 a. c
  551.         in      al,64h3 f9 r% M: g  O% L% p4 ?
  552.         jmp     $+2
    8 x  V6 H& ^" f8 `) t$ q8 ]
  553.         jmp     $+2: T  o2 t% c8 G5 C
  554.         test    al,20h
    3 I) o8 K. c5 h' Q3 Y8 L
  555.         jz      kbd_wrt_ok1
    9 g" `& o" O" V. a! M; C

  556. : _6 \& J- R# Z" Q' x& i
  557.         loop    kbd_wrt_loop1; c( l" R0 I, Z0 x0 ~9 b

  558. 7 x6 k) k% y1 f7 k' Q- \9 r
  559.         mov     ah,1
    ' e% p  M4 ?8 z! p" w' k
  560.         jmp     kbd_wrt_exit
    3 c) y; h+ U/ v3 m
  561. 5 g- @% B/ f$ Y( ?# X+ V
  562. kbd_wrt_ok1:
    2 I9 {; J2 d  p' U4 Y; _# O3 n) j
  563.         in      al,60h) Y/ K- p3 N' B, `$ b) B

  564. 5 B, d5 h# v1 Q3 v; F
  565.         xor     cx,cx5 I2 a7 @7 j0 X7 r- a" k# i/ H# ~5 i
  566. kbd_wrt_loop:; z8 ?; x# d4 ~# u
  567.         in      al,64h
    - y+ a% N+ m2 R& Y
  568.         jmp     $+2
    % N' ^7 s% {, F3 H
  569.         jmp     $+2
    9 R/ V7 r9 ^: \( t" Y' ?
  570.         test    al,2/ E$ w. |2 T( n1 O2 |2 f6 N
  571.         jz      kbd_wrt_ok; u! S/ d$ F+ l2 q
  572. & f; |0 n  L; K
  573.         loop    kbd_wrt_loop9 A2 S9 v4 i  d0 J

  574. - x3 B; r$ _1 a, O
  575.         mov     ah,1( b& Q$ R" }* r9 t% e4 G( g
  576.         jmp     kbd_wrt_exit
    4 G. c) \' J1 l0 O' h
  577. 8 _5 x4 I1 _* j8 }& a0 ~" \, x+ Z
  578. kbd_wrt_ok:
    1 j2 [/ I$ X2 H. _! J, s- H
  579.         mov     al,dl
    ' G  n; {9 q7 Q2 _  E
  580.         out     60h,al% G7 T% D! b8 k
  581.         jmp     $+2
    ! ]" R4 n& v: w6 e% k0 W
  582.         jmp     $+2
    ) r- f& Y% x# {
  583. # r. z: k# \8 r) \, w* D
  584.         xor     cx,cx
    # m1 F$ d2 J6 [" l4 v
  585. kbd_wrt_loop3:
    8 D' m* J* q6 n( a5 F  V  J
  586.         in      al,64h
    " ~! q3 t- j' o6 q/ A
  587.         jmp     $+2* a3 x& l' N& }8 ?# u
  588.         jmp     $+21 K/ t4 Y. ]* f# `. _% |5 N
  589.         test    al,2
    6 T+ m$ z9 n$ D& J) v$ Y
  590.         jz      kbd_wrt_ok3
    + C1 k' j6 z% ]
  591. 7 }6 c7 @; I1 {$ W2 {
  592.         loop    kbd_wrt_loop3
    0 L1 Y1 v* Z2 X

  593. " `& E. Q- F/ s  P. ]5 ^
  594.         mov     ah,1( W# M: A7 P  g. Y5 {
  595.         jmp     kbd_wrt_exit& ^" k- }& c. @5 y! k3 U9 S% ]- b

  596. 4 a6 V- Q: D. }# z/ C9 Q/ S3 A
  597. kbd_wrt_ok3:
    , M8 Y# o# P# N% Y8 N
  598.         mov     ah,8
      u! l+ Z6 }* _: o: Z! u. I
  599. kbd_wrt_loop4:
    6 _" ?4 ^2 |5 s
  600.         xor     cx,cx
    / J& Y* w2 I( T6 A' l
  601. kbd_wrt_loop5:- D* H5 n' ~7 ^0 @7 N# [! s0 i
  602.         in      al,64h. S5 L/ k2 @" R6 }# z
  603.         jmp     $+25 A: S" ~9 k1 o" V
  604.         jmp     $+2( u- o9 d  J( _
  605.         test    al,1
    & Y6 J# I; h2 l* K8 K5 a
  606.         jnz     kbd_wrt_ok4
    ! r& K4 c% o" x8 G0 {
  607. 9 j3 {* _5 B3 X" G) m
  608.         loop    kbd_wrt_loop5
    ) s. d. e" h+ d( Q5 t
  609. ' m: S. `7 s( ?" q- V
  610.         dec     ah  {1 O1 R9 {; T/ `
  611.         jnz     kbd_wrt_loop47 D4 D7 \$ ?( L8 a5 u
  612. " u0 B, e) z, B1 k5 s% Y
  613. kbd_wrt_ok4:
    4 A! w3 C# T8 H* j" E2 `
  614.         xor     ah,ah
    9 G) y( l/ y) l( n# v1 s% T
  615. kbd_wrt_exit:) [' ?4 @4 S; q! I' h% u
  616.         pop     dx
    : _0 @5 X; L5 n3 x7 }5 V6 H9 f1 Q
  617.         pop     cx
    ; B7 E8 d) O4 U+ a+ A$ ]
  618.         ret
    : w2 x, ?1 g+ \. Q/ @# H( ^. ~
  619.         ; C2 w2 O* {" B6 O3 Q* @9 \) R
  620. keyboard_cmd:
    , M; {2 @4 }" S; `4 e* O% I
  621.         xor     cx,cx% q% J; Y4 `% n1 T
  622. cmd_wait:
    1 s" |1 ~; v) b6 m
  623.         in      al,64h
    % m; @$ w, x8 L6 J; @4 q( b0 ~6 [. r
  624.         jmp     $+2% N1 L% x% G2 g, w6 d4 Z
  625.         jmp     $+2
    . _# u. Q! I* H- ]  c
  626.         test    al,24 P# ]' u; u1 R3 E
  627.         jz      cmd_send: Y" E7 C  V! L
  628.         loop    cmd_wait2 C7 ?- e  W  @2 N* Q4 ~1 Y$ g

  629. 4 F. C* f. y2 c$ j
  630.         jmp     cmd_error  O" ?& M2 e9 |% T5 H- s, C. Y
  631. ! V1 c3 @* |( e  ~1 @1 N5 i2 F
  632. cmd_send:% X* ^+ ]' r3 ^0 d
  633.         mov     al,bl1 Q6 b$ y" D6 v0 X7 \+ t4 p
  634.         out     64h,al
    5 }0 O) N2 P# x1 ^5 a0 K
  635.         jmp     $+23 y" \+ u4 P  T' r
  636.         jmp     $+2
    ! s2 d5 }& Z* r/ P8 l. q: f
  637. $ m2 b' Q* C7 R& Z7 x, r" c) W
  638.         xor     cx,cx$ V! g0 q- J$ f2 c/ [! B
  639. cmd_accept:
    * ]5 O3 {! y9 s% c; C1 w
  640.         in      al,64h- `7 k/ M$ l! n; N
  641.         jmp     $+24 ^, P. A# H* n6 H6 x* j% f: _; x
  642.         jmp     $+2
    $ l( s& y; ]1 Y5 F- ~
  643.         test    al,2
    ! K% r5 y- j. \& i4 j# G( i3 G; a7 z
  644.         jz      cmd_ok
    1 G- c7 e9 k1 R' r* [0 ]
  645.         loop    cmd_accept& p; A. L  ?  ~* E
  646. ) b# T/ y7 i& y
  647. cmd_error:- P) V; E/ q6 a% M* G1 C- C+ [
  648.         mov     ah,1% k$ s" r5 ?9 j* r% Q6 r
  649.         jmp     cmd_exit
    . A# s" r/ a/ t, t
  650. cmd_ok:
    ( X5 Q! R5 v8 g  H' I
  651.         xor     ah,ah
    6 P& c2 Q" i% O  Q  J9 T, |' s
  652. cmd_exit:
    : x3 L, p* c! ^
  653.         ret
    8 j8 d3 S5 M! D1 x$ z7 B4 q3 k5 y
  654. 7 r6 X( [3 U1 R% B8 j! [- S
  655. new_33:
    3 S; r; m" x& w% o' k- s5 u
  656.         cli9 I* t1 x8 k+ G, v
  657.         cmp     al,0
    + x/ R0 w* z1 B9 x" ]; U: S/ l
  658.         je      reset_mouse
    / ^( _9 f* i: C
  659.         cmp     al,1
    + T* t, _4 O+ O0 s, n6 y, [$ w$ s7 t
  660.         je      show_mouse5 o: S  q! _% Y  }5 H4 w
  661.         cmp     al,2, H; p1 v5 t8 V, Q9 U* E
  662.         je      hide_mouse
    ; U1 [( i. K) t, M0 O; @0 x
  663.         cmp     al,3. h4 @% {% z; G3 R/ H) @% o
  664.         je      get_pos
    7 ^( s3 j8 s' E& {' a  M
  665.         cmp     al,4
    $ r% T% N  L! Q: m. I
  666.         je      set_pos% I+ T" c0 w. |( L3 V4 V
  667.         cmp     al,7
    / T2 K- z$ Y- i" t5 m, H) y
  668.         je      set_hor_pos
    % k- Q/ d3 _7 I0 y1 V
  669.         cmp     al,8
    9 y* @; D( d) r# ?: a2 P& N
  670.         je      set_ver_pos6 e  v  W  g: g
  671.         cmp     al,0bh  \7 }( I7 b2 _' S$ `$ W
  672.         je      get_mouse_movement
    8 E! d: E# V/ Y& n
  673.         cmp     al,0ch
    ) o. N" r/ U+ J5 c1 W  q' u0 M
  674.         je      set_subroutines: K4 {2 }& X4 s1 ]
  675.         cmp     al,14h9 G1 @- J. B( e4 q
  676.         je      swap_subroutines! p. c; p' T* G+ R* H, W! `
  677.         iret6 y+ H" C5 e, E/ g! W. x7 D

  678. 1 J: |7 e& i: W" ~
  679. reset_mouse:
    + m0 i, {; c6 H4 ]2 N
  680.         jmp     _reset_mouse7 r$ ?7 k; u% H& Y: x: @& E
  681. show_mouse:  J7 L) k* I, W4 ?1 T$ K
  682.         jmp     _show_mouse
    4 m* _. H& A2 C1 U# R! H, k' b, L
  683. hide_mouse:
    ' S! X6 Z7 ^5 W/ R0 J$ F
  684.         jmp     _hide_mouse. g2 }/ R8 w! @
  685. get_pos:) j7 O( w1 Q1 g! Y) J7 i
  686.         jmp     _get_pos
    - N. U  X- K! l
  687. set_pos:
    " U* z+ |3 o0 P7 K, X+ X
  688.         jmp     _set_pos
    ! d1 Z1 m. z! d* e$ j2 B6 z( n) J) T
  689. set_hor_pos:. ^+ c' Y/ r" a; O! c$ Z" M
  690.         jmp     _set_hor_pos* D8 B( s# ?3 `/ L- d- ~' p. k
  691. set_ver_pos:
    4 O  J$ }9 U0 P3 ?) L- i
  692.         jmp     _set_ver_pos
    # l# c8 {, g  |& e) F% K
  693. get_mouse_movement:  V$ }- {' s5 b. W
  694.         jmp     _get_mouse_movement
    . M5 q% e* f4 `$ p  [/ J+ O
  695. set_subroutines:1 Q+ h3 x' @( e- ]$ [4 a9 _
  696.         jmp     _set_subroutines! N3 [$ ^4 T, `$ O
  697. swap_subroutines:7 A, T3 F8 K$ H5 F0 Z  p( ?3 `
  698.         jmp     _swap_subroutines3 o$ o2 w" s! z5 P7 J; w% Q1 b
  699. 6 n% Y0 S- i: {* i" r* m# B
  700. _reset_mouse:. s. ~' h2 Y) ?
  701.         mov     byte ptr cs:[buttons],0
    % G; b. K4 R5 G- A$ O$ o, M
  702.         mov     word ptr cs:[pos_x],0. b# |/ _# P  }5 B7 }. a6 u- Z0 }4 a
  703.         mov     word ptr cs:[pos_y],0; y  Y& c8 t5 q
  704.         mov     word ptr cs:[x_move],0! w- T6 b6 M9 f5 V, d1 n
  705.         mov     word ptr cs:[y_move],0
    - h9 H6 o4 n+ Y
  706.         mov     word ptr cs:[x_max],639
    : g$ M. C# C0 ?3 C% K. I$ ^
  707.         mov     word ptr cs:[x_min],0# K4 M& i: F( I4 g2 F& u
  708.         mov     word ptr cs:[y_max],199
    ' `" j9 c, y! r! Q% z( y8 N
  709.         mov     word ptr cs:[y_min],0
    4 S( _3 X, j' y
  710.         mov     word ptr cs:[user_mask],0: e# h0 P3 s; k9 l/ V0 b' s# U5 m
  711.         mov     word ptr cs:[user_subroutine],0
    , G8 L4 y1 P% q* Y
  712.         mov     word ptr cs:[user_subroutine+2],06 E( e: z2 d5 t1 H/ T9 x  G
  713.         mov     ax,0ffffh
    . _3 k  c9 S0 v# ^7 G  q& W
  714.         mov     bx,3; I6 a, M8 ^+ @1 t1 b
  715.         iret  K9 f% O" S/ D+ q% l
  716. " `- y- `! ?9 p$ z& V( F+ z
  717. _get_pos:' w+ ^1 K: R( \2 ]
  718.         mov     cx,cs:[pos_x]
    & Y/ k4 L8 ^6 t5 a& h
  719.         mov     dx,cs:[pos_y]
    ) I" m( j1 F- [
  720.         mov     bx,word ptr cs:[buttons]
    3 _/ D! |# ]! p, R$ h3 G' x
  721.         xor     bh,bh! ~- U2 L: s) b4 x( g/ F; k
  722.         iret
    ! u# z% @3 ~6 a8 K4 `8 _. T

  723. . K0 r5 D- k* q/ i- S( I6 U& S
  724. _get_mouse_movement:
    - t# M" C/ B+ k5 G
  725.         mov     cx,cs:[x_move]: w: E& B% @1 \! A; h% Z% F0 O
  726.         mov     dx,cs:[y_move]
    + J) ?! H$ Y" j. c% `+ p( ]
  727.         mov     word ptr cs:[x_move],06 |$ Z% o) K- x: V  q+ k
  728.         mov     word ptr cs:[y_move],0& O2 u& n& o. n1 u$ m+ D- k
  729.         iret( H3 W" E- A$ ~4 S* G0 \6 E3 V
  730. ( a3 e+ L: t, ~. M  k: j# D
  731. _show_mouse:
    # U1 @, g" S" V6 T9 U
  732.         push    ax! w! S( C& C7 `8 Q, D$ O
  733.         push    bx/ _1 d- b+ z* z/ K: k
  734.         push    di
    8 ^- l4 |0 ]1 i3 z6 t6 H2 L
  735.         push    es& s0 @: |+ ^5 L4 `+ n7 \# H' e
  736.         mov     byte ptr cs:[sm_flag],1) O2 U* j  I! D( f' c( ^) a  [( d
  737.         mov     ax,cs:[pos_y]
    ( ~$ u# F7 h; ]- Y+ _; S
  738.         shr     ax,3
    ( ~- }- ~1 d' G
  739.         mov     bl,80/ Q3 ^9 I# ~. l# k; |8 q5 Q6 p
  740.         mul     bl
    3 S. I7 [0 v5 G, w& J
  741.         mov     bx,[pos_x]* E6 H; `$ {& G8 Z. p
  742.         shr     bx,3( C4 ]3 c7 x' |
  743.         add     ax,bx
    . T$ _5 c8 J0 V" O
  744.         shl     ax,1( C* e3 H3 \8 z9 y  n: H
  745.         mov     di,ax
    ' u& A4 a  J: Q0 s% X1 b2 c2 w
  746.         mov     ax,0b800h* s3 U% I, r% l1 W/ d1 }
  747.         mov     es,ax
    ) k, M& a- P3 Y5 |$ C
  748.         mov     ax,es:[di]5 l3 W) n1 c8 F( d  g8 T- I
  749.         mov     cs:[save_char],ax( _5 O$ g7 B. V7 x% r) K
  750.         not     ah' g; w; g2 T( t3 d) D! w( {
  751.         and     ah,7fh
    0 ]; H# E" l, a' }% W" k% j
  752.         mov     es:[di],ax
    9 w: g! s+ u5 j5 \: E2 u$ L7 i& D
  753.         pop     es- M* o, a  I1 H$ o  r4 b
  754.         pop     di
    ! Q2 C/ Q- ^/ V; Z! [0 X4 l
  755.         pop     bx
    % L2 i" F# Y, X! w, n3 u& M5 u0 [/ N
  756.         pop     ax
    ( o& Q" c( p9 o8 S5 ?; S% u2 w- B
  757.         iret
      Z9 g5 C& |: |' A, g  w+ z/ \7 w% _; O$ f
  758. ; Q  z! H0 ], R. F/ p5 G% J9 k5 U  W
  759. _hide_mouse:2 e/ A1 A: j9 O' U* ?: K% P* a
  760.         push    ax+ o0 v' Z" Y" _$ Z+ z
  761.         push    bx
    6 P$ ]$ p' M0 T9 M5 Q
  762.         push    di  Y1 n( P, c+ L6 Y5 j9 H# {9 y5 Q
  763.         push    es
    ' R% {5 d! }. x' k2 `
  764.         mov     byte ptr cs:[sm_flag],0
    1 e7 Y; h3 a2 |
  765.         mov     ax,cs:[pos_y]' }: \9 I* K# e: g1 R% K
  766.         shr     ax,3
    % t5 W" s8 D+ _3 T  C/ A% \! N3 G
  767.         mov     bl,80
    ' h! c; P3 O0 X
  768.         mul     bl
    6 l& @4 \/ K) z4 n. B: D2 U+ i" s/ |
  769.         mov     bx,[pos_x], N# o1 O. k: z& g
  770.         shr     bx,3
    0 t: _6 G/ l+ C  o
  771.         add     ax,bx
    6 f* T& H* D' |" Y
  772.         shl     ax,1
    8 |' v) ]4 I/ ~& ]  }; g; A2 k
  773.         mov     di,ax
    0 c/ T5 ?# A  q6 O) H0 j
  774.         mov     ax,0b800h% T1 E8 V0 [: V! r
  775.         mov     es,ax
    / b: N7 u9 V% {1 B$ ]$ d; J9 c
  776.         mov     ax,cs:[save_char]
    2 ~* j+ {; z7 |" }& ~% e
  777.         mov     es:[di],ax
    - k2 z: J, u; v$ G  E" ~
  778.         pop     es; A5 e( t8 x% w0 w. o  c
  779.         pop     di
    3 W% [9 s9 f, V0 d1 Q% J" ~# ]
  780.         pop     bx
    6 s) b+ V# t! I( n7 ^
  781.         pop     ax9 F3 m) L; I2 O7 V9 c% M
  782.         iret
    2 ^$ m8 ]- g+ L
  783. : f( _7 A- D6 o. ^$ M+ y
  784. _set_pos:
    1 x8 N! I2 _% l+ _* O6 {  a: Y% J
  785.         mov     cx,cs:[pos_x]4 r8 ^5 D1 }5 f% e4 o5 T& f/ c
  786.         mov     dx,cs:[pos_y]
    ) [+ A% A* l: K* [, D; @
  787.         mov     word ptr cs:[x_move],0$ j8 d) w  }2 K& g% Q, n! V
  788.         mov     word ptr cs:[y_move],0
    2 y! g+ f5 H1 p7 P7 P( y) T1 h
  789.         iret
    & U2 y5 A5 t0 f
  790. , G5 A9 P6 S) v  R0 p$ y
  791. _set_hor_pos:8 s; y# F; A9 {: T# {4 p
  792.         call    max_min
    2 u3 f; }4 }" K6 x/ T0 E4 P9 Z
  793.         mov     cs:[x_min],cx) G1 |! ^* o. h1 m( f
  794.         mov     cs:[x_max],dx6 Y- \6 V6 P2 ~9 D# j
  795.         cmp     cs:[pos_x],cx
    6 W/ Z, {: x" A4 n
  796.         jge     good_hor_min
    5 J) K% J% Y2 ]* W1 w) A0 I, t
  797.         mov     cs:[pos_x],cx
    $ w- j  s7 `& ^0 b. S* p
  798. good_hor_min:! A) [3 Z& I" d& j
  799.         cmp     cs:[pos_x],dx2 j8 g& f) x5 q/ F8 Z1 H. x
  800.         jle     good_hor_max
    $ w" h2 j5 A# w2 _
  801.         mov     cs:[pos_x],dx; h0 @$ P- a( N) _! @, @& ]. E
  802. good_hor_max:
    ( O2 v& c0 F: P- m" T4 ?
  803.        iret
    8 ?8 ~; S" ]' E- @( @$ l5 R
  804. . S) e; e: w" k
  805. _set_ver_pos:8 }* c! C) y& S% f) d+ e% M
  806.         call    max_min
    " ]0 H; M7 e* b0 F& b6 ?
  807.         mov     cs:[y_min],cx
    % d" h, d8 _2 z; @
  808.         mov     cs:[y_max],dx
    ) e5 h- g* u; X% F1 ~+ k
  809.         cmp     cs:[pos_y],cx9 x' l! ?; f+ ~& K8 j
  810.         jge     good_ver_min
    $ d/ h7 s9 l( l$ o+ q
  811.         mov     cs:[pos_y],cx
    + d7 Y, W9 ]+ z. V. z
  812. good_ver_min:
    9 u; k5 o5 s; b: T: @2 f" ?
  813.         cmp     cs:[pos_y],dx
    ( ^7 q7 {5 P) c2 G6 T
  814.         jle     good_ver_max
    ! k5 H; g9 c" R9 F( P9 Y
  815.         mov     cs:[pos_y],dx
    2 g$ Y+ T' u8 p. Z
  816. good_ver_max:* f( `9 n6 u3 q4 W5 N
  817.         iret  e% S0 m' ~2 v. ~$ J

  818. $ H" ?* C. S9 h2 B* S5 I$ x! q
  819. max_min:) o% [( w+ Y3 e% Z! a1 N
  820.         cmp     cx,dx0 b" g% z2 P4 w- j+ M, ]
  821.         jle     no_swap7 m, h$ i) D3 [& g0 Z1 a7 Z
  822.         xchg    cx,dx/ w: ~, m, C( r, R: ]# e+ X8 E
  823. no_swap:0 Y' w; G* _8 K3 y! R
  824.         ret
    6 h; [6 u9 k- m: Z, |

  825. 7 y! e: j- U0 y! P6 k, `
  826. _set_subroutines:
    3 G1 m( M& M6 X/ o9 B
  827.         mov     cs:[user_subroutine],dx* n$ s5 P0 F7 v4 V' s
  828.         mov     cs:[user_subroutine+2],es% r* i$ V3 q* ~3 T0 g& z! f
  829.         mov     cs:[user_mask],cx+ {& h' B. |4 H" X! @2 B
  830.         iret' w; h" I7 @' D: G! F

  831. ) n; L. f2 S1 s8 Q4 ?
  832. _swap_subroutines:( \% ^4 s# X! G
  833.         push    word ptr cs:[user_mask]
    , t/ x( S6 `5 q) O" j; ~, n
  834.         push    word ptr cs:[user_subroutine+2]5 z, l" j2 |1 u5 T6 w& V8 l( {
  835.         push    word ptr cs:[user_subroutine]. K" S( C( H& u7 A' b
  836.         mov     cs:[user_subroutine],dx. {2 Z; B$ w8 ?5 x$ v
  837.         mov     cs:[user_subroutine+2],es
    2 F7 d- Z8 v3 N: i
  838.         mov     cs:[user_mask],cx- i/ R9 X+ d! R9 I' D2 x
  839.         pop     dx4 [! S* {9 R3 h2 V: t5 V
  840.         pop     es/ N+ W' J2 M& e" O/ @: V
  841.         pop     cx
    0 d  e5 K6 B+ `9 I" L# P# F7 ]
  842.         iret
    $ T" ]+ J2 v+ O( i; [, h; v, J( G
  843. 6 y5 C7 Y1 ~- [( L: \8 I
  844. memmouse        endp8 v, \. R5 }' Z: [+ \
  845. 8 e8 ~( @: |! P2 ^
  846. endof_start:5 }* R: c$ d  R' G; G  Z

  847. 0 x% t  ?! \8 X
  848. emsg db 'No mouse driver install error!$'/ h8 c: `# u8 I
  849. old331 dw 0
    6 I5 q" \- j+ _2 e
  850. old332 dw 0- A5 F8 q6 j7 p* e% u8 R% e
  851. old741 dw 0
    ; v  x2 ~# Z' K+ r  \
  852. old742 dw 08 `: N( C! D3 u& W
  853. memcopy db 0! i; m, Q& R) k$ x: z. M  a
  854. okcheck db 0" q! d: B; y$ l1 s
  855. pass db 0( ~0 ^8 N7 j, v: E
  856. chkl db 0( R! D, g5 b3 [4 t
  857. lk db 0
    1 q& {% ]  h; a/ |. v/ d
  858. chkr db 0, b( |" {/ L5 q& Q
  859. rk db 09 ]2 G# a7 V3 F$ j
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    1 B, J6 n! U: N- l/ ]
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    $ z- u2 u1 M. p, N" {
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    $ Z# ^+ F  G# n! B
  863. db '                                                                                '
    $ ]; ]9 c3 j8 f" S- Z5 c
  864. db '                                赏屯屯簧屯屯突                                  '. y- f8 m6 z% f+ s
  865.         db      '                                ?OFF汉OFF?                                 '
    . z  N9 B+ B3 `. N$ C
  866. db      '                                韧屯屯既屯屯图                                  ') T: f4 h# i1 U: t! G) l
  867. db '                                                                                '
    ; W5 z8 F5 [  t6 [# ~' }
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '5 n# _0 n4 [* p7 X& d+ K. i! a( K* z
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    # N' V. v) v* R/ x. {+ g( U
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     ', p9 B, ^% [# }" D3 ^
  871. ! Z; A: a# L/ i. f
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!' [8 M0 ?# M/ N
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 3 K! A3 k/ @: |+ B$ v& q% n* U5 F

# V7 Z1 [4 Q8 W' a* K. L8 c8 Z谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 18:03 , Processed in 0.072012 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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