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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
2 C. a& O8 L3 s8 f( b
1 b2 w' p# V  C, g* c$ |' P2 I" ?代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;3 n+ d' o) r: }  n! I' o4 Q
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9" }  _' S) ~7 O0 A
  3. ;                                         By Bini.Yi 易祝兵' G  e0 d) o" j& Z% s! S3 Y' u
  4. ;                                         http://www.ufoit.com 计匠网; m& ?7 h! l. L
  5. ;                                         2002/04/06 YYYY/MM/DD. i2 p; F) N" J5 |8 W: R. @7 [
  6. ;
    * V" s6 {: ~. b
  7. ;         
    % j3 M3 D0 {1 S. ~6 O
  8. ;          This program  test the mouse button  click and move.
    * f! m5 \- G: `) R0 k) B
  9. ;
    7 A, T" z- X, W  P8 Z
  10. ! x5 A& J: m4 D% Q- {
  11. .model tiny! N0 z6 y; i+ g8 R+ U8 _1 m
  12. .586
    ; x* J5 s; x; G& h
  13. .code7 J! j. C2 \! A2 c5 c/ p/ V
  14. .stack  100h: F8 q4 x/ x2 f) |. O" {
  15. .startup
    8 h. }, v" b. M
  16. pusha* I" r+ n+ }( [
  17. mov ax, 3533h
    + W. P1 B3 G/ [/ T0 d9 F
  18. int 21h
    9 y% Z. a! e) \3 ~' y
  19. mov word ptr cs:[old331],es
    * F. h2 Z. n7 b6 R  X+ Q- A
  20. mov word ptr cs:[old332],bx
    7 x* j& I# c: g2 B. v2 U7 v$ b* M
  21. mov ax, 3574h
    / H/ p% m0 ]$ ^
  22. int 21h& b3 h2 H& i- T* c
  23. mov word ptr cs:[old741],es
    0 u$ d& L" z6 P) Q7 X* _0 H9 T
  24. mov word ptr cs:[old742],bx
    % @& \) G! Y  f# h
  25. popa; S( t4 m3 F0 C9 b) F$ f# v) X
  26.         call    memmouse5 X% F+ x7 U( @
  27.         mov ah, 00
    1 i1 Q4 _, {* Q2 Z* T1 a
  28. mov al, 03" g) T& |( f5 p1 H5 M
  29. int 10h
    2 P  k3 H! y' h9 Y' S* P# Z8 h1 {5 k
  30. mov ah, 06
    - v, F/ E/ y* d
  31. mov al, 0! z7 w2 k/ E5 z6 V. \9 y) M2 J
  32. mov cx, 0
    % n8 Z% ~! Y. t0 d" s( X8 \
  33. mov dh, 24
    * C6 Z. R' r( k: ]" ^* F
  34. mov dl, 794 |' A8 U% O( C& r- u% m
  35. mov bh, 07h; }* G; M& Y1 p
  36. int 10h$ a7 r, B( n( i: X) o
  37. mov ax, 0000
    + j) Y# v" i( S
  38. mov bx, 0002  k4 i9 i/ ]) r! D8 a+ s
  39. int 33h
    / p9 y7 m8 T1 I2 s/ l* ]
  40.         cmp     ax, 0000           ;if no mouse drive install( q. }6 F1 H" @( c
  41.         je      errormsg           ;show error MSG4 ]% u, V9 \* D0 @! S
  42. mov ah, 02' d; C" `% }$ G- q( l
  43. mov bh, 000 C; W, q& `' P& x3 K' @
  44.         mov     dh, 25             ;Move point out screen
    ) b  H6 P( S7 a( y, l2 M
  45. mov dl, 79
    & y- {9 M5 Q" ]2 c' s
  46. int 10h6 y3 `0 B  G" E3 d, B3 s; d5 G0 J# [' n
  47.         call    showmsg            ;Show info/ b5 u# `; h6 e' C1 F3 F+ s: p
  48. mov ax, 00017 f' L4 w3 y# k. x( t4 c" M# ^
  49. int 33h
    & D5 A% G/ b1 Y
  50. ; mov ax, 000ah9 s, g, B9 C" |/ x, u  ~4 \
  51. ; mov bx, 0000
    # c# W$ r, T7 X" T$ F3 U, w! n
  52. ; mov cl, 0h6 N. m/ T! |/ J
  53. ; mov ch, 0F0h
    9 j6 |( M' y0 t" X
  54. ; mov dl, 0h
    8 Y0 v2 r4 r( v& @+ Q) |
  55. ; mov dh, 0F0h; {+ }; S# i0 Z# E3 [4 ^% F. S7 x8 R
  56. ; int 33h
    ' H8 @0 T. @% E
  57. mov ax, 0004h
    * R) b2 l0 W4 m* @! Q7 S
  58. mov cx, 0319
    ! E! \5 I/ H% k4 K
  59. mov dx, 0103
    7 \1 P( _" c/ b) s6 u& {
  60. int 33h
    ) {  J. Q5 ?& w9 }# v! q4 c
  61. casemo:                           ;Case button click and point move
    8 w4 u4 L+ P) O
  62.         mov     ax, 000bh         ;and keyboard press
    1 X% E& H  n5 G0 q3 ~
  63. int 33h
    . @, ]& Z% p# |# _7 |6 ~
  64.         cmp     cx, 00h           ;if point move....X
    - }: e- W; V9 }+ Y( ~" H
  65. jne xmov0 E: ~3 f7 P) v' W
  66.         cmp     dx, 00h           ;if point move....Y) u( c( N; }/ ]5 G$ d
  67. jne ymov8 v8 Q- S: G! m
  68. xymovend:                         ;X.Y move end0 d$ l0 d8 n8 G% @
  69.         mov     ax, 0003         
    3 D6 n* B: w3 U7 m
  70. int 33h
    , A& |0 \$ J2 P4 b  Z
  71.         cmp     bx, 0001          ;if left button click  show ON( {0 @% x# T4 G4 S7 \
  72. mov si, 18280 ]$ Z0 {8 Y# t  L4 U8 K; y
  73. je listl
    5 l9 p/ R* Q6 {" V( ^/ Z- |
  74. mov si, 1828
      i& P. \" I' Q. z. S3 y
  75.         jne     nlistl            ;if left no click show OFF, o8 a# x+ M1 s& o# i5 K% D
  76. testr:, i4 Z2 Y. |/ H3 {
  77.         cmp     bx, 0002          ;if right button click show ON& e- J  }* S4 y
  78. mov si,1842! q) F6 s7 B, X1 u: N2 N# W- d  e
  79. je listr
    2 o. p, n6 _/ U- x. v4 R
  80.         mov     si,1842           ;if right no click show OFF! j6 z/ E5 n2 Y. M% l7 z
  81. jne nlistl
    6 [/ g9 A' }: r8 o, N
  82. casekey:6 ~; H- G( C2 k; D
  83.         mov     ah, 01            ;if any key press jump check& U$ W' w5 s$ ~# h  k0 R3 j+ R
  84. int 16h
    0 j) A4 [; G' t) j0 a1 s1 b" D
  85. jne kpress
    ' Q5 }' ?/ e4 N0 }
  86.         mov     al, [chkl]        ;check x flag9 J; W+ r- v) k# s( [" W
  87. cmp al, 02h
    % c% g/ O# t) m- i
  88. jnb chkok
    5 T$ n5 V" H) W' g0 ~3 Z: Q: y
  89. jmp casemo
    . ^! e/ n! H9 i$ D5 \+ ~
  90. xmov:                             ;if X moved, get the X flag+1
    & w$ l* d2 x/ A% w" l; e2 T
  91. mov al, [chkl]) t  f7 \  Y' j0 N( w
  92. inc al
    # s1 v! j+ |: {* o) O
  93. mov [chkl], al
    $ b2 v) R# a. D) ^
  94. call passok
    , O+ W; E: C# D3 h. Q
  95. jmp xymovend) r8 z9 T/ E9 ~
  96. ymov:                             ;if Y moved, get the X flag+1
    0 N& c) I/ p. I, |1 V. g
  97. mov al, [chkr]9 F: Y; k8 ~* F5 A- h- h
  98. inc al. c5 N) z; E9 @  t
  99. mov [chkr], al- y6 Q7 c: ?/ h% M8 M! d6 |
  100. call passok
    1 O: U' F2 A" S( v7 V! n) q* ~
  101. jmp xymovend
    5 }$ p7 f: r. e" ?$ Z( R4 }2 e0 B
  102. # u# X: d: H+ d8 j/ n2 G7 k
  103. passok proc near+ P3 u+ X0 [4 b* f- s% ^
  104. mov al, [okcheck]8 ~: h, l2 T8 [1 x8 c
  105. cmp al, 1
    3 G. S; m5 t& D- q5 ^
  106. je let0
    $ U% C% A2 Z1 N5 U+ w5 `- t+ k
  107. jmp passret
    2 p6 ^- e$ v) E; j& z$ R1 _
  108. let0: + L8 [1 ^* Y  G* F0 b$ q8 k! i
  109. mov [pass], 1
    + J- `$ r; t" a/ k
  110. passret:/ I  g# x+ q6 A) g, `3 T6 i$ `
  111. ret& R; D. @0 I* [0 i0 K
  112. passok endp
    " ^# \; i1 n1 F5 L& E  z

  113. 0 t6 @9 b/ y& x- h9 V
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    3 n8 I  Z9 Z8 `" Y
  115. mov al, [chkr]6 u0 i4 i( Z" V
  116. cmp al, 02h" N! U  }; p0 [) A0 f+ |. k
  117. jb casemo) n; r7 }$ G4 A* V6 ?
  118. mov al, [lk]1 J3 V4 |, J* T3 {7 ^+ r& A
  119. cmp al, 1) d0 r# o" b1 @+ z! h
  120. jne casemo2 o/ s  q( R+ _, n& V- y
  121. mov al, [rk]
    0 X  [6 v4 U, O
  122. cmp al, 1! f! m; h- ^/ v
  123. jne  casemo, l0 L5 [! b5 X- E
  124. mov [okcheck], 1+ J- i8 F: ?/ i6 o: V
  125. mov al, [pass]
    ( B+ U* J% y8 A3 V# ?# L
  126. cmp al, 1
    7 q) s& w/ C3 }" A8 h4 \
  127. jne  casemo
    / i& f4 o( q6 f( P0 G; a
  128. mov ax,0002h
    ! D6 z# u* k5 k) O! S8 N1 X4 S* i
  129. int 33h
    6 d9 g1 O7 H% s" X) e" `% @" L7 `) p1 h
  130. call cleascr, W. O+ W6 I9 V' C/ W

  131. . V. R, U: j# S4 J
  132. call oldint
    " [* ?$ F) z/ i' Z. l# F2 o
  133. mov ax, 04c00h7 i9 N3 U9 V$ ^* T" n8 N: J6 r
  134. int 21h
    8 m& W& k$ F% B+ X

  135. 7 a/ @+ J2 T2 R9 g+ U+ ^: z  @) B
  136. okexit:
    . i+ d+ g9 o& a. y
  137. mov ah, 4ch
    + X0 x2 W5 T" _2 H+ V
  138. mov al, 06 @8 e& N% u' ?
  139. int 21h: j0 K# {2 E- u
  140. listl:                                 ;Show ON
    6 g2 w) U, B" ~# `4 y
  141. pusha0 h! g/ N$ W# w1 y8 E1 o/ y
  142. mov ax, 0b800h
    3 Y5 C' r- \" b, t
  143. mov  es, ax( i+ z: @! R, C
  144. mov ah, 47h/ v) n. v, C% Y$ ]! J
  145. mov al, 20h1 y* d, B. o7 k- a  b
  146. mov es:[si], ax9 ]3 Z9 U  Z4 B# k5 A) U
  147. add si, 02
    % ]$ C# u2 d4 d5 U$ n: }( M  q
  148. mov  al, 4fh
    / [, X" w' H. ~( l* P
  149. mov es:[si], ax) S& c- J8 g9 q! ~' e0 G
  150. mov al, 4eh
    - i- O+ m5 q7 ?% I1 B3 e. G" G
  151. add si, 02
    ! w$ H; t! B9 g1 P; f# x
  152. mov es:[si], ax0 m/ R2 ^+ z6 }& y0 b0 q3 j
  153. mov [lk], 1
    + u. g& `, f$ D7 y+ I$ ]9 X
  154. popa
    . y' I: P- c8 g/ H& x7 _. a
  155. jmp testr& c# o; n; f; g) @+ @, i5 C0 C
  156. listr:                                 ;Show ON
    * J$ u! }4 P$ b+ F/ ?5 r- v
  157. pusha
    0 L0 I% G' u  U/ R
  158. mov ax, 0b800h( m+ L& X6 K/ D% p1 ^
  159. mov  es, ax
    7 E' E! T3 V. t! \
  160. mov ah, 47h* A$ D$ C: J; E7 H$ r9 k( a2 B; d
  161. mov al, 20h6 X. \2 c7 e) X) R% X: M
  162. mov es:[si], ax( V' k- k1 o8 Y
  163. add si, 02
    8 D; R/ m0 N, M% S7 D- y6 t
  164. mov  al, 4fh
    ! ^* _8 @/ c# _- K9 }  F
  165. mov es:[si], ax9 x# Y+ L; m6 y# S; F
  166. mov al, 4eh
    9 h" j$ D2 b8 ]/ W6 r9 [' }
  167. add si, 023 C! J4 T: j8 y
  168. mov es:[si], ax
    9 v9 D6 k+ a+ y
  169. mov [rk], 15 t3 K" ~* K& T% K/ X( q
  170. popa4 z  ?" I& x: |+ W3 H
  171. jmp  casekey
    ' D7 a: J; n$ g, _# ^

  172. & j# t* X& D+ z7 |6 N7 e
  173. nlistl:                              ;Show OFF
    $ V8 \& q1 I& g' ^9 j
  174. pusha   7 C3 E! l) m% j# ~2 c% G: Q2 _; D
  175. mov ax, 0b800h. b5 c+ c# l, `1 N% _
  176. mov  es, ax. A$ ^+ |1 W( g% w
  177. mov ah, 17h
    % t8 l4 E8 n! |/ |6 n" v9 ]5 a" B
  178. mov al, 4fh( c0 a* z% G, O- m% n0 K
  179. mov es:[si], ax
    1 Q4 x6 N  e) h3 w( Z0 N* c# B
  180. add si, 02. |' c: l% a" ~8 F5 T; C
  181. mov  al, 46h+ |+ h# C* g" W& P0 m: |
  182. mov es:[si], ax
    " B6 G; q" u1 R) E- W% V# R" X
  183. mov al, 46h: v( y. V  |- A6 i7 Q1 ?) X
  184. add si, 02
    2 x9 F  o" M, W! y' s: @. e, ^2 o
  185. mov es:[si], ax
    ! C+ ?- \9 J0 i/ Q) G
  186. popa6 \, l; B. l! G( E' c, j" S
  187. cmp si, 1840
    & t" H4 \& ]" R
  188. jae casekey
    ; z# ]6 o1 K- A- `- H9 U
  189. jmp testr
    ; B4 x2 y% ?$ Z
  190. ) s$ [8 ^: n- ~% u5 w* y& M
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    + Q' b: v& A  \/ N
  192.         cmp     ah, 01h             ;and return a error
    ) ~9 j) G  I( ^, x* d3 s& J
  193. je exit1
    ( ]! S! S! c8 S6 ^8 m
  194.         mov     ah, 0ch             ;if press other key then clear
    7 M1 z, l3 E0 z$ \6 A  k* B" B9 Q' m
  195.         mov     al, 00              ;keyboard buffer
    2 ?! r7 W  F8 w9 g5 N  V6 q5 f
  196. int 21h' `( Z5 d! G2 f
  197. jmp casemo
    $ V+ s! u4 Z8 k
  198. ) g* t& \, l" n3 p( k9 j& D: C
  199. errormsg:                           ;if mouse driver no install
    2 @$ w% L1 x  g2 O( y: I, |9 J
  200. call oldint
    6 y- D' U- _# r6 F8 k* K
  201. lea dx, offset emsg/ S: J7 u0 z7 u: K
  202. mov ah, 09h
    , N$ r# A, u) U( J: W  R
  203. int 21h* s3 A- p" ]: f7 h% I6 M- ?9 C
  204. mov ah, 4ch
    : U( `' A, T/ w' J
  205. mov al, 2, _0 x" {  E  l& Q* N% b2 `
  206. int  21h
    / u" h; i# Y/ C% e7 n9 C
  207. : F' z8 ?$ U0 J. |+ Q* O+ C
  208. exit1:                              ;error exit6 @2 J* c/ }. {2 K: K0 c! s
  209. mov ax, 0002h
    1 r$ e: S- @3 W  [+ j' I9 P
  210. int 33h
    - W. J: M6 I( p
  211. call  cleascr# w. I7 c. a! d; v) e
  212. call  oldint
    2 G0 j. H( h1 u
  213. mov ah, 4ch  d# G* x5 D$ u1 I/ C* A% `
  214. mov al, 01& M. s0 R4 i8 a- V/ z9 s1 N
  215. int 21h
    ; u) T1 y6 R" T+ s/ t
  216. 5 o' @! s( ?: ~5 c& O3 A1 R9 U% o
  217. cleascr proc    near                ;clear screen
    # W0 H$ T: u6 Y0 _# _+ q' |
  218. pusha* Y: ^4 c8 j: H4 z" x( n
  219. mov ah, 06) a& u, K2 o: w2 I# O& R* y
  220. mov al, 0/ O6 i1 _+ D$ W0 l
  221. mov cx, 03 S5 ]& k: f) o& u) ~
  222. mov dh, 24
    7 y3 O0 h% u! S
  223. mov dl, 799 i! f+ u0 D5 r4 i
  224. mov bh, 07h
    , X" @/ z# t# |2 V0 H% t! _
  225. int 10h! x3 Q3 m! q8 h0 S
  226. mov ah, 029 H/ e! {+ ~0 e  X7 T" f" K/ C, W
  227. mov bh, 00  k- @- U) E+ U5 U0 s" v  D
  228. mov dh, 0! ~$ {: U* {' a
  229. mov dl, 06 p1 L' x! P" @5 b! P. r  Q, J. b
  230. int 10h
    $ \0 k) O1 A- i; F# P( s
  231. popa0 Q- K6 l( p- v
  232. ret
    , j! k0 S5 o& L& {
  233. cleascr endp- b; d6 n# i1 G; J3 [

  234. : h4 U, N) b1 ^' O
  235. showmsg proc    near               ;Show info% a0 l: D3 ^' @; o! b  V* G
  236. pusha
    % X# T# d4 g. U, f% u# p
  237. lea di, offset showms/ h: y9 A+ m% z9 _
  238. mov ax, 0b800h; ]6 `3 ^5 J( O% U+ k
  239. mov es, ax6 V/ s' Y" C7 U) i# J/ B4 v
  240. mov si, 0
    9 K$ |+ t# m% a; p
  241. mov cx, 480$ L5 F# l" k8 c, V0 ?: D
  242. mov ah, 07h
    * x: V+ T! X& w8 v* I
  243. @@:' V; J0 W# V0 E/ V4 W2 b
  244. mov al, 20h" N1 m) n' J# ^* ]8 j
  245. mov es:[si], ax
    ! g3 x, l2 k( y( T! t1 i" ?8 S
  246. add si, 2
    4 \" w1 D# }* N
  247. loop @b
    8 z% a( b$ D$ `2 X8 x7 Z
  248. mov cx,880
    % u0 }0 O& X+ ~& x- b. d7 J
  249. @@:6 }# X7 S' n! f& X+ _7 d
  250. mov al, [di]
    * ^( g* Q; K, y  i, _, z
  251. inc di0 A; X; I$ O; N! e) V
  252. cmp al,20h
    & s' J( w6 i, u2 q3 S
  253. je showch13 C1 E) ]1 j2 Q' ?
  254. mov ah, 17h% d8 H# Q% F! W0 G' X4 Q
  255. jmp showch3 ; B- ^( P. m5 d/ N8 _9 p5 o' i
  256. showch1:% D2 y: K6 ~7 S
  257. mov ah, 07h 4 V- A1 p" Q( w& ^$ I- B- f& J! ?$ C
  258. showch3:  n6 g# o  b3 Q% q+ l
  259. mov es:[si], ax! i0 k+ k" R" H* T6 ^; u: L
  260. add si, 2
    9 q' H. \! J' V& Z- }
  261. loop @b
    ! R% y, ^2 X: w8 i9 Y
  262. popa1 q! {# a* ?% e3 H$ ~" t
  263. ret; ~  W( n) z+ Q' Y" W" \) G; |
  264. showmsg endp
    " o' L5 `  z, o" E
  265. + U% }8 U( x  c
  266. oldint proc
    " {6 h/ A. N, m! l) ?" x2 D
  267. pusha
    # X; a4 p  `* ]9 Z& @: A
  268. mov ds, word ptr cs:[old331]; ?/ |/ T; \: }( M" C
  269. mov   dx, word ptr cs:[old332]
    & |  M4 [4 _- k# ~5 h: v+ f, Q7 R6 S8 V
  270. mov ax, 2533h
    1 X5 e0 X# ^2 v
  271. int 21h
    5 Y. o! v6 u$ \
  272. mov ds, word ptr cs:[old741]' U' E% T. o4 l
  273. mov dx, word ptr cs:[old742]
    4 N& T. V$ l  z; ]
  274. mov ax, 2574h. @+ h1 n9 s- T. Y' b
  275. int 21h
    9 Y  ]. X4 O0 j' {, W
  276. popa
    7 B8 X! F3 N7 ?5 e. v
  277. ret
    ; j! n/ @# k! }, f2 r- _
  278. oldint endp
    5 ~) @, D4 b# X1 p8 `8 V

  279. 1 E' s) G- v% Y9 Y/ V6 q8 V
  280. memmouse        proc
    ' x- E! V6 s/ y$ f  v: L9 p  e
  281.         xor     ax,ax
    ) s% x3 r% U" p7 d# y
  282. int 33h+ {5 |& c0 H, j
  283. cmp ax,0ffffh: b: V1 z* ^& N2 L6 ?7 K2 v
  284.         jne     not_loaded8 V9 K8 }% F& X, S3 O, }) N
  285. mov [memcopy], 1
    1 ]6 I' w( R, q8 {+ g. O" u5 L
  286. ret
    + ]3 w1 s' D# k. C1 c
  287. & u2 h' g0 l/ M. \; W# \% X
  288. not_loaded:
    8 U0 {& A& |7 g! e, G* e

  289. 9 R3 f5 ^2 a" R9 X* Q  x9 M; |* W; G2 S; @
  290.         mov ax,2574h/ f. L  _* Q; p" F% _) ~' C
  291.         mov dx,offset new_isr
    5 l9 Z) o1 U3 o5 W/ S5 L. w% d
  292.         int 21h& {' r" Q- X  B8 |2 P# A# R

  293. 2 B. P5 _, r- H$ k- H
  294.         mov ax,2533h
    5 [# Z4 C- J5 E; t( n
  295.         mov dx,offset new_33
    5 y# {6 Q" J% e: c
  296.         int 21h
    / R+ l. P0 C# T' u

  297. ' D  n7 B0 H% z2 h' P3 d, P/ x
  298.         cli
    0 S# r; ?% e1 M" g3 {' J
  299. . ?) `0 w0 f: E$ u, E
  300.         mov bl,0a8h) F$ m" ~5 ?, o# |/ s. T
  301.         call keyboard_cmd
    8 o) T+ F7 ^" N

  302. ( a, u# }& O. z0 Q/ @5 x( V% f, C8 e7 |
  303.         mov bl,20h
    / h1 V" T7 N. x+ V- i
  304.         call    keyboard_cmd
    ( S4 D* l6 W; L# Q5 K: N$ q' p0 c
  305.         call    keyboard_read3 l/ ?2 Q) t; t3 N  n( ]& G3 W0 c
  306.         or      al,2* r5 T$ N4 O0 G0 f. T8 C- e
  307.         mov     bl,60h# T5 [) |, C$ {# N3 w7 j  t
  308.         push    ax6 |: y4 W0 G0 e
  309.         call    keyboard_cmd+ x: t( J; n) Q
  310.         pop     ax
    8 t) ^7 N3 l% ~, `' |
  311.         call    keyboard_write6 \' h2 x: _. ?& K1 i$ R# p
  312. ; r; s" ^% A7 q4 @+ ?
  313.         mov     bl,0d4h) @+ }& @, |# J6 ~! ^, O' K
  314.         call    keyboard_cmd8 g4 I+ R8 x4 `4 x
  315.         mov     al,0f4h
    ' ]$ S  ~4 I7 v* H1 I0 S/ l( {- `' y
  316.         call    keyboard_write
    4 R* ~3 W0 A' J( A, h
  317. $ {0 C. g, b3 e& G! E6 y- ?
  318.         sti
    ; s6 T0 k8 l6 \, e
  319.         ret
    6 I* t. X: U$ ~. Y, N- _
  320. call_user_isr:  g: K8 D! A8 g; I
  321. db      60h+ |# V) V# v2 U, T5 o
  322.         mov     cx,cs:[pos_x]
    ' z/ E" f/ y% \; O
  323.         mov     dx,cs:[pos_y]- v) p3 j" j, f  I! r
  324.         mov     di,0 ;cs:[x_move]4 N. u+ O+ b* t# F. a3 ^# H
  325.         mov     si,0 ;cs:[y_move]1 x* U: R( Z  j: D$ L) P% m
  326.         mov     word ptr cs:[x_move],0
    / t6 H8 Y# o/ Y% v
  327.         mov     word ptr cs:[y_move],0
    3 p1 z" j; u' z  j% j  E: B
  328.         mov     bl,byte ptr cs:[buttons]' i0 p9 q$ Q! ?, ^6 ^8 B. i5 e
  329.         xor     bh,bh6 R1 q3 }" z6 r2 Z
  330.         call    dword ptr cs:[user_subroutine]& P& F6 z. l9 z" q+ b- W
  331.         db      61h* j) b8 d) R& ~, x4 {
  332. ret' D' D7 T) R) w. D+ x: x
  333. new_isr:2 ~! V' E5 w/ ^2 C  d  z' f/ |
  334.         pushf
    7 N* I. `! F- m+ F* a9 S% H
  335.         cli/ U7 \4 h4 e7 m" t2 z* @+ Y
  336.         push    ax
    8 q* b6 e( T3 k
  337.         push    bx
    % U6 ], p( b2 k( X
  338.         push    cx7 M. ~* ^# J( s, |& a
  339.         push    dx! H4 y% p$ |2 i+ \8 P4 C
  340.         push    di( j' y/ c+ t# k+ V% j
  341.         push    si
    $ Q  a: R' o  U4 n- B7 z
  342.         push    es. P. m; k' Q4 ~7 r7 h9 r  I" Y
  343.         push    ds
    * x4 m0 m& N1 ^! I. R) m3 w

  344. - h+ e7 [0 A$ L3 d( H* b
  345.         push    cs
    : [% W, b  b- z# z- m
  346.         pop     ds
    & F' Z1 f2 W: j% [

  347. 4 J/ N9 m0 X' }6 e4 e0 w
  348.         mov     bl,0adh
    ' E0 J# f6 n5 ~7 Q7 |  [# z+ d4 _
  349.         call    keyboard_cmd8 ]& d$ d( l' i

  350. * M3 B8 M3 @! a* }0 }7 R
  351.         cmp     byte ptr [first_time],0, G3 F; Z# f& `2 M/ X' V0 p- k. K
  352.         je      not_first_time( z) _# {  Z- J. \$ z

  353. 9 j  q9 q& T* D. b4 [; Q
  354.         mov     byte ptr [first_time],0
    6 ^& a6 v) m/ H3 g+ k) [% e9 C
  355.         call    keyboard_read
    ) P3 |: ~* x$ `- W! v
  356.         call    keyboard_read" E1 {& O2 `1 v3 K% L
  357.         call    keyboard_read6 T+ M8 Z0 Y5 l0 X9 c
  358.         jmp     no_show
    4 q4 Z6 q# K7 ?7 b
  359. , [; h' [- q" d4 z  z5 n4 k
  360. not_first_time:% H: o  ^# q2 X2 T+ _2 x
  361.         mov     word ptr [temp_mask],0
    ) W) u! q  g/ @% N$ Z+ u0 n- `

  362. & X; f# g5 a1 D
  363.         mov     cx,[pos_x]
    # }$ H) Y8 v* Q0 W
  364.         mov     dx,[pos_y]
    , j: F: w# Z. x0 z$ X, e* V8 O

  365. 3 b9 |3 F4 o1 V0 h5 J" M% S
  366.         call    keyboard_read; E# I: u) w$ }5 a  n2 e5 Q! g' M
  367.         and     al,7 ;3
    ) R& R8 A5 Z. i( ?/ I. W
  368.         mov     ah,[buttons]* p% z* S. s) A4 X* r8 z7 T9 o+ V
  369.         mov     [buttons],al( d8 s7 b; r6 l9 x; n! ^8 D
  370.         cmp     al,ah
    8 m8 |  i1 i8 @1 J
  371.         je      no_button_change
    2 T. U% ?/ M2 x: H
  372.         and     al,3
    & X* q4 H. ~) R1 E2 u$ R
  373.         and     ah,3% l/ j8 u5 I9 S7 g1 s' N4 x
  374.         xor     al,ah, T. T) p/ M5 w# K, R
  375.         xor     bx,bx* S; [1 Q( i& K

  376. 1 }5 k4 a. b. J9 M+ {; F
  377.         push    ax
    2 _5 e6 l1 @; U: z" h
  378.         test    al,27 C; z& @$ R4 @& o0 r0 K
  379.         jz      no_right_button_change1 g/ @& D; I4 N, q
  380.         and     ah,2& v6 o  r  ]9 s/ O# s
  381.         jz      right_button_pressed: Q8 t2 L; q4 _1 o" e) }! s8 e' @
  382.         or      bx,16/ ?- ^6 h. z, {* q. @" j& C1 D4 @
  383.         jmp     no_right_button_change
    # h5 E) l4 K! z! U
  384. right_button_pressed:
    . ?0 Z% G! x2 H6 r& b* Q
  385.         or      bx,8
    3 l! h/ `4 f4 @( [1 D
  386. no_right_button_change:
      w9 l! |2 o/ R0 N9 K8 N+ \
  387. # h5 x3 d7 h4 I" b! e6 Q
  388.         pop     ax
    . m, p9 x0 q3 Z& y1 S7 M

  389. % S9 k+ H! D# p
  390.         test    al,17 Z8 r6 A& C+ _  P% \0 N( {3 f# \" e  g5 }
  391.         jz      no_left_button_change
    ) l1 N" F8 o. n- S$ c5 e/ d# {
  392.         and     ah,1! ~# D- w2 p$ K6 R7 F
  393.         jz      left_button_pressed  m5 \5 |1 `5 g7 f4 g4 k+ |
  394.         or      bx,4  i" J" v6 a6 A
  395.         jmp     no_left_button_change# @" G# U& l" G
  396. left_button_pressed:
    * L' E% \' b/ Y3 y7 K4 N
  397.         or      bx,21 E) A- A1 [2 b  b
  398. no_left_button_change:
    ( K3 T( p9 |* ~6 p, `; G  q/ a

  399. / S2 f) ?# t5 e: m3 c6 x) L; F- E
  400.         mov     [temp_mask],bx, i1 F5 m: ?! B6 W3 _8 ^; B
  401. - `" V" o2 `1 ~! k
  402. no_button_change:  h  _9 C/ [) v" u( S# B$ R
  403.         call    keyboard_read
    : I9 l* q: h. e  F  k
  404.         cbw+ \% P+ k2 O0 b
  405.         add     [pos_x],ax
    1 r: a) B1 c  X( [2 K6 Y" w1 G
  406.         add     [x_move],ax; d- S2 r" o4 \/ M8 M/ E0 M
  407.         mov     ax,[x_min]) v1 F4 H+ L. s8 Z
  408.         cmp     [pos_x],ax
    % o* v, E! `. H& T$ S
  409.         jg      good_hor1
    % s  v1 F* m8 `6 G
  410.         mov     [pos_x],ax' I1 f, }4 k/ ^% o4 ?
  411. good_hor1:
    ( }( g# \& Z1 B/ E! U- k
  412.         mov     ax,[x_max], n# h+ Z' v/ \* z' `; }
  413.         cmp     [pos_x],ax
    8 V  E: O; J$ d
  414.         jle     good_hor2
    6 ~+ g- \# B; n! w* z: x
  415.         mov     [pos_x],ax$ l! @/ S6 K8 s
  416. good_hor2:
      R/ Y0 {9 u5 T# m- O
  417. : ~& ]' G  T1 q3 P/ C- `5 E
  418.         call    keyboard_read
    $ d/ Y9 i4 C4 X" x+ N6 b' N
  419.         neg     al& t/ n  ~! q- y. {( o1 Y! L
  420.         cbw0 k, [& q' M# J  _
  421.         add     [pos_y],ax
    ( _  ?. n7 o6 g7 ?1 i
  422.         add     [y_move],ax+ H' N+ K# [, g$ n+ d* U
  423.         mov     ax,[y_min]9 A/ L5 O) a0 d  F& S
  424.         cmp     [pos_y],ax
    6 N& A; i* y5 a6 X1 I0 u0 q/ n1 T
  425.         jg      good_ver1
    " K. C/ |# M. i9 L
  426.         mov     [pos_y],ax- n# B/ q8 t; U
  427. good_ver1:' K: B# X) a8 p* k, B( N
  428.         mov     ax,[y_max]
    9 L8 A- ~/ _% M6 |7 g
  429.         cmp     [pos_y],ax
    3 W  H. ~: g% m
  430.         jle     good_ver2. W9 A& Z6 D! b
  431.         mov     [pos_y],ax' H* M) d+ h. D$ d& x
  432. good_ver2:8 u; Y5 x& X% @, e9 Q1 S1 \+ z

  433. 5 i3 I9 r' W3 T- ~
  434.         mov     ax,[x_move]
    6 b  s4 V# R; i, k. O! R% R
  435.         or      ax,[y_move]
    ; X& w0 |9 m0 N# R
  436.         or      ax,ax
    ' n  z, c' e/ v+ P9 {( H" o9 h
  437.         jz      no_change_position
    7 ~. T- C4 V( \, ?4 j1 G
  438.         or      word ptr [temp_mask],1
    + j2 P2 T( G+ K# A4 v9 Y
  439. no_change_position:
    5 B! d7 k3 L: o7 E4 T( i: W' i
  440. 7 f* ?! @$ C$ g+ Y
  441.         mov     ax,[temp_mask]
    8 `& T9 d* ?8 N# U8 ~5 U; _
  442.         and     ax,[user_mask]
    $ j2 w. }/ U9 M3 I
  443.         jz      no_call_user
      n& z6 K' f6 K& H
  444.         call    call_user_isr
    & ^( Y1 G6 H1 k$ Z' ~
  445. no_call_user:  B9 ^! S/ ]5 p* J" _: V. G8 H
  446. * d, f2 G( v: h$ F
  447.         cmp     byte ptr [sm_flag],1- \7 o* @, ?% X
  448.         jne     no_show# l8 Z6 X7 C% x& W5 ~% X
  449. 8 j! I5 Y/ v+ \' D, z. [5 M0 M
  450.         shr     cx,3' _  r; b: Y0 B
  451.         shr     dx,3% [# ^5 A3 K. y4 k6 m
  452.         mov     ax,80# {2 S1 Z, v9 d* ]% E
  453.         mul     dl
    ! t/ X; K  ^- j; e# L: R. t4 x2 o
  454.         add     ax,cx
    ' Q6 C. T3 D% t" S) h
  455.         shl     ax,1, D; E7 F. w; z( }8 s4 \5 M
  456.         mov     di,ax
    2 q+ z& L# i6 @, I+ a& g% _. D
  457.         mov     ax,0b800h7 N. g: U2 O& [6 \3 }) x, v* |" m
  458.         mov     es,ax
    0 h, W8 E9 u$ o3 I  G6 }
  459.         mov     ax,[save_char]8 L( g; b% i! X9 G& P% j& A
  460.         stosw1 x$ P) ~( P# o# U
  461. ' i0 r9 g' c! q( t# l: ~2 E+ K
  462.         mov     cx,[pos_x]
    - y& M4 }* v! q0 ]9 B1 z
  463.         mov     dx,[pos_y]8 ]' K: j' A7 A( S
  464.         shr     cx,3. G8 ~3 e/ X2 l7 D, T7 n: l( Y
  465.         shr     dx,3$ a1 l7 G6 ]7 M" ^- {+ ~  x+ e
  466.         mov     ax,80
    % x" I, o) g' p8 N
  467.         mul     dl
    , E/ R' r# @1 [  L. w. j! B- {
  468.         add     ax,cx
    " n) n- A5 {! M1 J) A* c! o
  469.         shl     ax,1
    9 j6 b, E( ?+ ~8 x* \: F
  470.         mov     di,ax! Y' u7 k/ C. g& M" \  a
  471.         mov     ax,0b800h
    : V% T$ Y$ R5 _( b( _
  472.         mov     es,ax
    6 Q. }7 f5 Q! _1 m: w* z9 S. J
  473.         mov     ax,es:[di]" L5 k0 X% p8 j# Z
  474.         mov     [save_char],ax
    , I" V# O6 c7 D3 L0 k) f( n
  475.         not     ah
    7 l9 k2 t# }8 r
  476.         and     ah,7fh
    : \; b' _  B( x4 r& A
  477.         stosw4 s3 x& ]. e, {* X6 C/ z( P& F# X& t
  478. no_show:2 C. A, P1 }2 o7 q$ @
  479.         mov     bl,0aeh7 u9 |) n! {5 t; b. f1 p* L3 J
  480.         call    keyboard_cmd6 V. w7 r% W% K, u* e. z

  481. ' Z, u; P+ g2 y$ A* T% c5 ^8 S; A
  482.         mov     al,20h' [7 z4 f' \/ Q2 H
  483.         out     0a0h,al! o0 N% {* W1 @5 \: `; @/ l% N
  484.         out     20h,al
    . r+ ]1 x) B& S: g
  485. ( t: p6 _2 L& b, F, \5 e
  486.         pop     ds- @- I1 O% d6 M# j7 P8 [  r
  487.         pop     es' R& P, d# g! K! M% s, k* G
  488.         pop     si2 E0 B: {) h) ^" }$ P! S4 Y5 w4 a& X$ _
  489.         pop     di! H) [% A- S$ S2 `2 J3 e3 u, N% i
  490.         pop     dx+ ~1 {6 I) |- I! _  w0 i
  491.         pop     cx
    - Q) j5 E+ k! |/ A/ k
  492.         pop     bx
    ! I8 h( l, @9 M5 P1 Y
  493.         pop     ax
    , `3 m0 m! r! d" N6 U. c
  494.         popf4 T: i7 @/ I7 w+ N# x$ X5 ^6 d
  495.         iret2 Y* }: `! I1 T; e4 L- D9 U
  496. # @8 a* C( a# a: j# G% ]9 Z) N
  497. first_time      db      1
    8 z9 i$ N! s7 d0 \' a
  498. buttons         db      0
    . F3 b+ l* L) M7 f8 y
  499. pos_x           dw      0
    9 P4 ?2 S: t* V" V% o) t
  500. pos_y           dw      04 z# ]5 ]- g2 F/ |6 @
  501. sm_flag         dw      0
    1 W( F: }' @: |$ K7 s% C
  502. save_char       dw      09 N: T9 J+ f) U3 O+ p: B+ d
  503. x_move          dw      0
    $ n' V( @$ u- u: M3 M" N% k. Q
  504. y_move          dw      00 U! D/ }; k" T  r2 F& I
  505. x_max           dw      6399 Z& x6 z" e$ r
  506. x_min           dw      0
    ) ?6 F) f9 n4 h7 N# r
  507. y_max           dw      1993 S- X. h& P8 w- j: I. x' t4 ?* H
  508. y_min           dw      0! _/ m# _0 L0 x& a& D! `( p- L
  509. user_subroutine dw      0,0
    8 Q- Y: q) w3 [& i: ~0 v. R
  510. user_mask       dw      01 j' W7 c1 @" {8 x
  511. temp_mask       dw      0
    & F" v& U3 g* J5 m# U
  512. 5 `, A- X' r' F7 Q9 J
  513. keyboard_read:
    ( d* `  p# Q; t( g' z
  514.         push    cx. C2 J* v5 |$ F8 L5 J" C% u" U; F
  515.         push    dx
    ! _: K9 \5 I: c9 `3 M# F" t
  516.         xor     cx,cx
    ' r, W2 {/ E1 ?
  517. key_read_loop:
    2 \* D, x& d9 g2 H7 l
  518.         in      al,64h
    5 U$ G0 @- ^, A1 @$ [2 b  T
  519.         jmp     $+2
    1 y! I4 N& ~: K% {8 }$ _
  520.         jmp     $+2- G: ]2 q& X/ E4 @; \6 j6 x
  521.         test    al,1
    0 z1 p: x6 L/ c; h+ y$ e
  522.         jnz     key_read_ready- S) k% }( j) V- w8 I! S  \7 \) O
  523.         loop    key_read_loop7 A, o% U# L$ K; n; L# i
  524.         mov     ah,1
    5 H& n- i) F1 Q; {1 X7 z; ?- r- X
  525.         jmp     key_read_exit
    5 |  q1 D* \% s8 [
  526. key_read_ready:4 o1 V- S* E$ c) D# z6 _
  527.         push    cx$ h& s" `' e0 |( G/ Y, [
  528.         mov     cx,32* v6 S) c: A+ S# M' U$ s# G6 u
  529. key_read_delay:
    $ n5 k/ @) V' t4 f
  530.         jmp     $+2/ A+ |+ x2 ]1 |
  531.         jmp     $+27 y% V1 j' v; X6 J1 f
  532.         loop    key_read_delay6 P0 ~) I' m7 L  w+ Q/ X
  533.   ?$ b6 Q$ n7 ?, D, j: Y# ?# M
  534.         pop     cx
    * t6 M6 l  C8 G( s

  535. 7 B& |! d) Q; `7 {+ ]
  536.         in      al,60h
    9 m. \, d& t8 z% ?6 {+ a
  537.         jmp     $+2
      A8 A6 I" w5 ]2 H
  538.         jmp     $+2: G7 w! b7 O+ ^- v9 f
  539.         xor     ah,ah0 G8 `9 [" b3 D" [3 @8 q2 g, l
  540. key_read_exit:) E4 n( V1 T/ Z
  541.         pop     dx( C  q, H/ M2 ^) h( [+ W% `
  542.         pop     cx
    ( B. M- b# k" Q. l9 K8 b
  543.         ret
    3 \; @# R* b5 |6 g$ c6 V) n6 n  u1 h' A

  544. 4 t/ X, ]; N) P0 r; i* x2 p2 T9 r+ q
  545. keyboard_write:
    5 p7 T! K7 i! d* M1 P
  546.         push    cx0 d- i  M8 Z3 P; ~7 p7 @
  547.         push    dx
    * {6 H& b" V% u0 A% X
  548.         mov     dl,al3 j/ ?  r3 @0 `! a  f$ A
  549.         xor     cx,cx
    . w4 P5 s) J4 p* O
  550. kbd_wrt_loop1:% `/ A$ P: h. H+ m1 f& f1 ^$ f
  551.         in      al,64h
    9 ^' ~; N" M+ G: K# a, x* N. i4 U
  552.         jmp     $+2; v) D+ v& R7 X5 D$ N; B
  553.         jmp     $+2
    6 \' t" Z! v/ o' C( M% v+ Y
  554.         test    al,20h5 `6 ^2 J. w6 y
  555.         jz      kbd_wrt_ok1
    , i. R, h- g% x

  556. 4 I& c; R  Z7 j# U7 M2 K
  557.         loop    kbd_wrt_loop1
    3 R  M5 T( y: R7 S
  558. # }* e3 X; y7 ?/ Z- {3 O( n
  559.         mov     ah,1
    % b7 U' y  ]$ F- a( H
  560.         jmp     kbd_wrt_exit
    7 E0 t5 W1 m( y, R! U

  561. . m# `8 Q2 w* Y, K
  562. kbd_wrt_ok1:# t: f4 k7 }- ?" v9 S' d
  563.         in      al,60h$ W! j/ J5 T( Q" L3 N& V
  564. $ y/ @+ G: i" u  A" x
  565.         xor     cx,cx: c9 t5 e# _7 P5 }; k
  566. kbd_wrt_loop:% K( K+ Q# O% O& c( _
  567.         in      al,64h7 r+ `' J' s7 ]6 W1 m/ D
  568.         jmp     $+2! ]" a; E3 O. [9 c. L: @$ K6 t
  569.         jmp     $+2* }, m0 G( M3 G  m. n+ o
  570.         test    al,2' {. F  h$ I+ x- j* i. o& @8 z
  571.         jz      kbd_wrt_ok: `% v: |4 M- }
  572. * d3 k! s/ o0 s8 i7 P
  573.         loop    kbd_wrt_loop* d- s9 A- t: S' ?5 k
  574. ; d/ g! S) M% e) g4 T
  575.         mov     ah,1
    . B+ R0 M. h4 P3 a. E1 Y! t
  576.         jmp     kbd_wrt_exit
    9 E; @( Y# \( y, j- ~* f
  577. # D% m% @2 {! V! |4 m, |$ ]$ }
  578. kbd_wrt_ok:
    7 d! H( w; S1 p( D* H! P
  579.         mov     al,dl. i" N1 ?) G" c! R; w2 ]
  580.         out     60h,al
    7 D# g3 c9 C# Y- |
  581.         jmp     $+2
    0 ~% r  b/ `+ M7 W4 e
  582.         jmp     $+2
    & c! j! G6 q6 T1 S, D( k% x: u& U
  583. 9 L6 Q( m! i) i* ^
  584.         xor     cx,cx
    % A" `( e( \* R' M! C$ V
  585. kbd_wrt_loop3:, K9 i1 `7 _' k) U; F/ H* f$ A
  586.         in      al,64h
    6 l9 _9 D, T) C1 m* Y, n, J3 p* t1 K
  587.         jmp     $+2
    % y! s$ K1 Z2 g  E7 r! O
  588.         jmp     $+26 N; Z" p! E/ ?& t5 L1 W
  589.         test    al,2
    - i3 u9 l6 N2 A5 a( W2 Q: @0 N$ h
  590.         jz      kbd_wrt_ok3/ L) v) V6 ~1 Z

  591. : i+ a& F( J4 E: U+ X
  592.         loop    kbd_wrt_loop3
    5 j. b0 C# K5 v2 v7 n; s

  593. 9 c" d+ t# P7 |, q
  594.         mov     ah,1
    + B  D" i, P( m# ~
  595.         jmp     kbd_wrt_exit1 h( Y8 l* @- B: q. U
  596. 7 M/ E% p" @, l. O6 }' v* D+ h6 W# x% @
  597. kbd_wrt_ok3:
    . k4 ~/ ?2 B/ y' Z8 n! l" Y" x0 }
  598.         mov     ah,8
    ) q' i8 T/ Q0 {& l
  599. kbd_wrt_loop4:
    , o" v8 O7 e" [& g! [- u
  600.         xor     cx,cx
    $ K: ]5 @5 Z) M) @9 k* }, x% p; O
  601. kbd_wrt_loop5:5 u& ?9 R) G8 ?! E9 D3 o9 j: d# `$ j
  602.         in      al,64h. J  S6 C# \$ f: z8 L2 A7 F. d
  603.         jmp     $+2
    ! `/ L" a- J0 W& f4 j
  604.         jmp     $+25 T& [$ }2 q# ~0 J. v
  605.         test    al,1; D* H1 l: P" R) [5 p, D9 t! v5 J
  606.         jnz     kbd_wrt_ok4& K2 A% D) {+ }% G* i, f

  607.   \8 f5 C+ B& A1 Q2 x- N+ L
  608.         loop    kbd_wrt_loop53 v  O' y$ E3 G
  609. 5 y. _9 Z* }2 a4 E& v+ r* m
  610.         dec     ah6 Y1 ]/ ^/ |+ d9 G4 _. O! P) M7 s
  611.         jnz     kbd_wrt_loop4
    6 ^' f3 }: z4 T! X

  612. : v6 L( @9 H; [4 K  S2 P, P+ t  g8 D  e
  613. kbd_wrt_ok4:( @0 f2 L. a0 x! _; g( f, _
  614.         xor     ah,ah
    : h+ [# \# i7 F% e" k8 X6 b
  615. kbd_wrt_exit:
    6 W; N8 d  C) z5 x' x8 Q
  616.         pop     dx
    " x0 t- n. s  y1 i: H1 W2 x) j. h. t
  617.         pop     cx
    2 k5 I* d0 f$ V4 I  P/ J
  618.         ret
    $ I# d* d- A# {: c$ P  n6 o
  619.         
    ' C6 P  ?/ |# z+ t6 V6 f
  620. keyboard_cmd:
    & b: R/ C6 K0 ~8 u8 C: w7 r
  621.         xor     cx,cx
    - T) t2 ~, p4 d3 W; \
  622. cmd_wait:
    ) e' E( \  o  U; C
  623.         in      al,64h
    $ R+ K  ]1 F" ?; k. E) [1 v/ o, n
  624.         jmp     $+2
    ( B% y( L1 b; v8 e' b$ u: y* X
  625.         jmp     $+2
    - Q1 Y8 a# W8 _" l: V7 d
  626.         test    al,20 o6 m  F0 v  ^, `& A/ z+ h
  627.         jz      cmd_send& F' T* T- N* b( a! ?
  628.         loop    cmd_wait$ y" |5 x0 a: W7 J" B
  629. - Q8 ^- O: J; l+ d1 E
  630.         jmp     cmd_error! D# u6 d# _& C1 q. D! f) q- U$ s
  631. + ?& J: H/ |% k& e' x8 E
  632. cmd_send:
    , T+ y  C! V& Q* I2 W% o1 J" k
  633.         mov     al,bl
    6 z* m& u( T, W/ T  [6 g
  634.         out     64h,al# Q. _' x) B  ]  @* D5 [9 u3 z9 \
  635.         jmp     $+26 n# l$ O( w* j
  636.         jmp     $+2
    3 s; M' _" M! X) Z) J, d
  637. : J# g. L4 h! U1 c0 f- b3 F
  638.         xor     cx,cx
    & E1 d. n4 ~0 p6 n: k
  639. cmd_accept:3 h, q# E/ e" R$ V% g
  640.         in      al,64h
    ) Z; C6 F! E- j8 q! |
  641.         jmp     $+2
    4 j" \% V% z& Z( ^: J0 o
  642.         jmp     $+2* b5 Y; w" \3 |7 m( K% f% d% C5 C
  643.         test    al,24 j  H- k7 g- V! u
  644.         jz      cmd_ok8 f" I3 a) T. @8 z& @& [5 f
  645.         loop    cmd_accept+ M; n4 h3 ]6 x& Q" G. ^
  646.   U/ G0 h# H$ A7 q4 B
  647. cmd_error:
    1 r4 e$ L0 x8 g, L( ]# y
  648.         mov     ah,11 X  F( ]& |$ ?; o/ G  u
  649.         jmp     cmd_exit. m4 X, Q; m5 I% ]" V" d1 [3 b2 l0 y4 b
  650. cmd_ok:
    $ p2 ?: w2 M4 Y- W
  651.         xor     ah,ah( j2 G9 x* l) A. _" J/ t
  652. cmd_exit:% s( A1 f9 E. |% _3 x6 o8 g
  653.         ret4 p& b& ]. q8 B8 F" n2 j! t- f" u
  654. ! F& L* \* _+ h( L, ^
  655. new_33:& ~; I; F* j# n4 z- B% @8 b
  656.         cli
    , {8 t4 W% T2 |) Z% o8 Q" `# P
  657.         cmp     al,0. d6 S6 x7 k! |+ @
  658.         je      reset_mouse3 q* [- c. H% R
  659.         cmp     al,1+ _/ h6 }1 w- A7 K# }6 x. o9 O
  660.         je      show_mouse& a* d, Q1 a/ W
  661.         cmp     al,2
    , B8 x/ u, d0 S. ?
  662.         je      hide_mouse: q7 X, u4 t. i9 z! k. ^
  663.         cmp     al,3
    ) _% u' @4 G6 u
  664.         je      get_pos: H  y1 e% l  \7 _5 p$ K4 w8 ]
  665.         cmp     al,4
    4 N; g% g1 x+ s
  666.         je      set_pos2 ?, E6 B' e  L# i$ d
  667.         cmp     al,7
    % E  \9 ?0 R5 T" X- F
  668.         je      set_hor_pos5 v  p6 z- O" P3 z/ s. G; n
  669.         cmp     al,8
    ( @3 w# n6 e) z5 z% E
  670.         je      set_ver_pos
    . d# Q, Y! R4 C. F; B
  671.         cmp     al,0bh
    1 W+ G( T+ @5 p6 x
  672.         je      get_mouse_movement
    1 U* c7 b& B- o* K' k7 ?, @
  673.         cmp     al,0ch
    ! O+ C, U" A8 m+ R& M3 \
  674.         je      set_subroutines
    7 D( u8 Y  N1 u" \4 _( G, w
  675.         cmp     al,14h
    % P( q1 m8 o* z& a0 X# v3 D. ^" e
  676.         je      swap_subroutines9 A! z+ w  ?0 v4 Z4 c0 w
  677.         iret/ o- M& t$ k' K% q' z

  678. - r9 P$ N, D6 p* A- J  J9 J! s! c
  679. reset_mouse:
    # o' X% a/ `+ k. Q9 ^$ l$ v
  680.         jmp     _reset_mouse# T; l$ ^# L& d# n7 V
  681. show_mouse:
    8 j! M" K; @9 h, x( n; }
  682.         jmp     _show_mouse6 K9 B! _+ Y/ k# y
  683. hide_mouse:
    + t5 t7 v* ?6 W4 Q5 h
  684.         jmp     _hide_mouse
    , s6 v5 r" u: r, z" q' b! ~
  685. get_pos:# \5 B# }! a8 P5 C8 N' i) x' H$ t! e
  686.         jmp     _get_pos
    1 l5 d  @% E$ c  i" W
  687. set_pos:
    2 @: I6 j! i- M/ E
  688.         jmp     _set_pos
    1 i& Z/ J; a+ h% w; Y
  689. set_hor_pos:
    - o6 Y; [  a2 @& u6 N
  690.         jmp     _set_hor_pos6 p4 N2 R5 t2 R7 ?8 @
  691. set_ver_pos:
      @; `8 T6 [; N; a) x# @
  692.         jmp     _set_ver_pos
    % f% r8 {/ j& y# \" r, t. N
  693. get_mouse_movement:0 P2 A  U: Q* `: N, I0 c& b3 Y  c
  694.         jmp     _get_mouse_movement
      G. X7 ~. o2 u9 u1 R7 A+ v
  695. set_subroutines:' m' z0 A: H8 E0 D* n: }" A
  696.         jmp     _set_subroutines: X% I- w3 A% G& Q7 v
  697. swap_subroutines:1 y* M( W/ G, A8 n, E: V$ ]  N
  698.         jmp     _swap_subroutines
    9 k& Z* y2 V  h7 F# s. b2 Y

  699. 9 o, ^) p; k; R, I5 h$ p
  700. _reset_mouse:
    6 ?$ O" v2 t: |5 A
  701.         mov     byte ptr cs:[buttons],0
    % S9 I+ D. e( q+ _1 v
  702.         mov     word ptr cs:[pos_x],0* v: }2 ~6 g- C2 H6 M7 F
  703.         mov     word ptr cs:[pos_y],0
    3 ~; v; h7 b. p# K  w* I
  704.         mov     word ptr cs:[x_move],0; c7 r9 R; J$ j
  705.         mov     word ptr cs:[y_move],0
    2 N. G( ]' [- }$ n# u  z( D
  706.         mov     word ptr cs:[x_max],639
    . y% c6 {/ p3 V( {) v. ?
  707.         mov     word ptr cs:[x_min],06 a# n# {! V8 j  e
  708.         mov     word ptr cs:[y_max],1996 ^* I+ m6 }1 e, L% U( P; `
  709.         mov     word ptr cs:[y_min],0
    " \  Q8 [( \9 N. Z
  710.         mov     word ptr cs:[user_mask],0- J3 p5 ]  T1 M
  711.         mov     word ptr cs:[user_subroutine],0
    . c* p8 j  e' J; Z
  712.         mov     word ptr cs:[user_subroutine+2],0
    % r0 i9 K$ [! z% d# ]# |
  713.         mov     ax,0ffffh
    / ^; h# ?1 N# s1 }9 |
  714.         mov     bx,30 x2 X) u# K. ~* {
  715.         iret
    ! ^- w3 I; X; q" _( R- Z( i
  716. . G$ z5 k4 F+ m/ y2 ~- _
  717. _get_pos:
    0 j% h7 s& a( r# c
  718.         mov     cx,cs:[pos_x]" a# l+ `0 k5 j2 ~# S/ V
  719.         mov     dx,cs:[pos_y]) t* c' f# N# J1 m  H% {1 n0 N
  720.         mov     bx,word ptr cs:[buttons]' j+ m6 a  |: _- b0 d3 n9 k
  721.         xor     bh,bh
    * K/ C9 K# N" D/ l: T1 ]
  722.         iret9 \! S3 H* v) u3 ?7 a+ M; q) F
  723. : |, F( I. a$ c' @# w
  724. _get_mouse_movement:4 H6 w2 c6 L8 }! i
  725.         mov     cx,cs:[x_move]
    " M2 j3 A0 r9 g7 R: |
  726.         mov     dx,cs:[y_move]
    " A* A& e5 U, W5 t  z$ L
  727.         mov     word ptr cs:[x_move],0$ Q1 C. U! \% X& p' i- U- H/ Q2 i( y
  728.         mov     word ptr cs:[y_move],0  G" k1 ]7 }$ [! R: p) Q- Z" `
  729.         iret$ E$ y* w" {1 c: O9 c

  730. 5 j- f$ R* u2 w/ f# E
  731. _show_mouse:
    . `# m9 e! L& d9 i( i4 Y) V
  732.         push    ax8 l3 X$ J) J4 w7 a3 b+ {# |! Y6 M
  733.         push    bx
    2 a7 ^# s3 @$ G0 z: O
  734.         push    di
    # o8 g2 v  ]% c/ Z8 v7 A
  735.         push    es
      L  [7 T- C9 v9 w
  736.         mov     byte ptr cs:[sm_flag],15 w9 `( o* _1 Y+ Y( R( A+ I
  737.         mov     ax,cs:[pos_y]0 R$ G8 C. r1 b( r7 H3 E6 M$ |) F
  738.         shr     ax,3
    : c, Q, H, R0 E1 G' w$ u
  739.         mov     bl,80
    ) `' R2 u8 D1 F+ z4 y% m2 A
  740.         mul     bl
    5 S; H* N' M/ g
  741.         mov     bx,[pos_x]
    2 s0 Z; Z7 x, @3 Y3 S
  742.         shr     bx,3
      a& I: p3 G1 N! o7 W" W" M) P
  743.         add     ax,bx2 s- B" k; I: }- E, y
  744.         shl     ax,1
    - G# a& r" b- H* u
  745.         mov     di,ax
    $ i5 Y! z6 C' b% c8 V$ b
  746.         mov     ax,0b800h
    % x  t3 t$ j- x5 [9 `/ ~
  747.         mov     es,ax1 [2 w1 J3 e5 d) P
  748.         mov     ax,es:[di]( M9 K+ f# S& h5 b
  749.         mov     cs:[save_char],ax
    ) \6 q/ B1 s! v" r& y7 J1 [
  750.         not     ah' m) [( ^! f5 F; c( H( P, k0 @
  751.         and     ah,7fh
    " x3 s1 d/ k% W, W% A4 n: T5 L
  752.         mov     es:[di],ax. E" \  G& T' c- k  j8 b
  753.         pop     es. }4 O& y" U) r  L) O( Z
  754.         pop     di
      |: `( A2 e8 ]& \
  755.         pop     bx* p0 R6 K$ F4 U- X: n9 Z# Q
  756.         pop     ax
    / o# S! F! s2 J' A2 b7 ^
  757.         iret* T, |8 S  s% `) z0 ~

  758. ) _9 c* o  r1 K6 ]
  759. _hide_mouse:
    6 D  K# ]8 e& g& q. ?+ N: e: Z! \
  760.         push    ax% n9 V9 @5 Y; n
  761.         push    bx
    # `% d$ X) u, W2 X! Y) w% T" B, A
  762.         push    di
    . h" t8 p" u! k) R
  763.         push    es
    0 O& b5 v: H" o
  764.         mov     byte ptr cs:[sm_flag],0
    $ I+ z) {! H3 q7 V
  765.         mov     ax,cs:[pos_y]% q% s5 C; Y7 x8 e6 x! j
  766.         shr     ax,3
    & U! o& d- `- n$ t2 ?: g* I6 _, F' B3 c
  767.         mov     bl,80: G4 y" u4 O2 o6 j7 u
  768.         mul     bl
    : ?% l/ R2 O, Z+ |4 a% X
  769.         mov     bx,[pos_x]# d  k& X% r3 s6 d
  770.         shr     bx,3
    ( i/ r4 |( i# R8 _3 i7 a
  771.         add     ax,bx
    ' c& F' F+ k# Y1 _( a
  772.         shl     ax,1
    9 `4 A( Z4 w7 u& O( S
  773.         mov     di,ax# h" Q( O# e0 z" P: v6 z1 f
  774.         mov     ax,0b800h2 l# `* C( ~7 G5 G. M+ m; C
  775.         mov     es,ax4 p& `, Q% T: w0 Z- Q9 k- C% `- X
  776.         mov     ax,cs:[save_char]$ n& I$ L1 w7 V, z7 B7 {2 M
  777.         mov     es:[di],ax
    4 g4 \$ l! Y# U1 j+ B# O
  778.         pop     es
    " j: u$ c" Z, h5 i- p8 @, j' C
  779.         pop     di# u. r( Z! n- a0 p5 ]
  780.         pop     bx
    6 x2 l' K3 @7 {( W
  781.         pop     ax
    / |" s$ V' S9 Q! B+ _7 j" Q
  782.         iret/ U6 I8 Q7 V: y" n/ ?) R
  783. 8 i, V4 n; G. ^% l
  784. _set_pos:+ ], Y' d* F, K! t! ]" T
  785.         mov     cx,cs:[pos_x]
    , g+ y  L7 g, q8 ~1 q
  786.         mov     dx,cs:[pos_y]' W# O* e4 R) I4 F4 \
  787.         mov     word ptr cs:[x_move],02 Z+ e; X" Z0 M! s- I
  788.         mov     word ptr cs:[y_move],0; g; ]- A9 u. o5 u" n8 S/ S9 C; E
  789.         iret$ T% b% A7 d- d- m$ q+ r6 H

  790. 7 X* n9 W7 [  ^- x8 Y7 f
  791. _set_hor_pos:! F4 z9 Y/ n) m2 J% k8 [, f: H
  792.         call    max_min9 @5 Y; W8 w- q' w
  793.         mov     cs:[x_min],cx
    2 h7 ^; f& ?% D: C
  794.         mov     cs:[x_max],dx
    ; E+ g- N; ]8 R" b% e/ p2 _
  795.         cmp     cs:[pos_x],cx
    6 Q" @( |3 ]8 g' ^( m9 G, M, J) e
  796.         jge     good_hor_min
    9 ]( M  a8 P* E! P+ X$ X
  797.         mov     cs:[pos_x],cx
      I1 [: ~! r5 l# n/ V0 s. ]
  798. good_hor_min:
    ; ~/ A6 k- G3 D( H" K5 ]
  799.         cmp     cs:[pos_x],dx
    & L- {1 y( d$ t; E; _5 {3 t
  800.         jle     good_hor_max
    0 D- [7 e) n+ b' ~& z# S
  801.         mov     cs:[pos_x],dx
    / v; B* m% F7 T
  802. good_hor_max:" C+ f( @. J8 z) o1 ?( Q+ B. ?
  803.        iret9 @9 Q# u( T3 n4 Y* m

  804. 3 l5 c' _2 L0 s
  805. _set_ver_pos:
    2 u) M* @" S+ `8 y5 f
  806.         call    max_min
    4 B% F! T$ m" z
  807.         mov     cs:[y_min],cx
    3 Q% f2 J. j% r$ K, T# U3 @
  808.         mov     cs:[y_max],dx0 e) {2 v' P) m$ c. l( W
  809.         cmp     cs:[pos_y],cx+ x, P3 n' q7 [! j# o6 |2 }* A
  810.         jge     good_ver_min
    ) B! u, H# p* F& O, d
  811.         mov     cs:[pos_y],cx7 B: S) b2 y8 G: o: i* m2 V; f* t
  812. good_ver_min:
      h: t: v/ G3 w4 J  o) M: c- `
  813.         cmp     cs:[pos_y],dx
    6 d, M/ O: v; N4 T  P% t
  814.         jle     good_ver_max
    / j1 |% S/ h- u% i- N- e% n
  815.         mov     cs:[pos_y],dx  s4 p. Y5 ?0 f8 k5 [( z1 d+ D
  816. good_ver_max:
    0 [# m2 J- h) {: F
  817.         iret
    # C( u/ F$ q: k4 Y" u3 F
  818. ) f5 S3 P4 w  F% T
  819. max_min:
    + p* A2 v0 _  l5 I4 d
  820.         cmp     cx,dx/ C/ u  p* B$ u2 _" E! y0 @
  821.         jle     no_swap. r8 m6 o6 Q% E( o5 y1 w
  822.         xchg    cx,dx! E' T4 m5 I) F$ D; D8 G& I6 m" J
  823. no_swap:, N' E4 Y! [7 f2 ~# D# \+ p3 Y, Y. ?' D
  824.         ret% o. S6 i# x  i: M3 I

  825. ( k9 J, f1 y7 h) x2 s) l
  826. _set_subroutines:3 F! I" O$ I$ L6 K% g8 `, n9 D
  827.         mov     cs:[user_subroutine],dx
    4 ]8 x) g. C& N
  828.         mov     cs:[user_subroutine+2],es
    / U. e6 ]; \7 C3 m2 j, t
  829.         mov     cs:[user_mask],cx
    0 o7 y4 w7 r" F
  830.         iret% ?/ g" M" Y/ g; {" z7 E0 T

  831. - M! x$ @7 z( ]  C' F
  832. _swap_subroutines:
    ' A0 V. F/ K& t. C: p. d
  833.         push    word ptr cs:[user_mask]+ N8 F) T$ c+ P* R0 n! ~" G
  834.         push    word ptr cs:[user_subroutine+2]: {  X5 [3 }' X% k0 k/ ?4 K8 U+ O
  835.         push    word ptr cs:[user_subroutine]
    ( J+ w3 z* O0 c! j
  836.         mov     cs:[user_subroutine],dx& {* U5 A1 ?* B" L; y7 `
  837.         mov     cs:[user_subroutine+2],es
    ) i$ [; P7 a. Q4 @: s- s1 w, M
  838.         mov     cs:[user_mask],cx
    " M/ l( Q- z8 g: @- i. M% H
  839.         pop     dx* M( j" {9 z8 r. q6 P/ C0 L5 b7 _
  840.         pop     es; J" C* v6 i9 f
  841.         pop     cx
    1 U' z8 j3 O: T( P3 s2 z% P( Y2 G
  842.         iret
    . d% O7 i& ~2 |' Z7 v! N/ v
  843. + |/ Y, S' f5 p: m1 C0 j7 y- I
  844. memmouse        endp; q7 d  a. t( l% s4 B

  845. - }3 q# O+ U" e( P' u4 _
  846. endof_start:
    , s% }# n+ T5 v; a* m

  847. " k' }- l) J; `  V$ `  Z( Z
  848. emsg db 'No mouse driver install error!$'
    & V* b$ R5 Q  x( d
  849. old331 dw 07 f0 q) N0 B( r# ~
  850. old332 dw 09 }- q( D& \; p+ @# b/ F% H
  851. old741 dw 0
    % u4 q; D9 G& Y. _7 x
  852. old742 dw 0
    * J' j- N- w( O& a2 d. @$ T) g1 [
  853. memcopy db 0
    % p5 x( b7 b4 b, E3 Z8 `3 ]
  854. okcheck db 0
    8 O! z- b( I- [# b
  855. pass db 00 {! k2 B5 e, F$ Z3 s; f
  856. chkl db 0
    9 |- Y9 S3 O9 S5 I
  857. lk db 0" C5 X8 [/ T: w/ U! m4 ?
  858. chkr db 0
    7 P2 w9 q' y6 T& o; P( i- S
  859. rk db 0
    . ^1 ^( p; A; c5 t( U, k
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ; s1 d) t  _$ ^
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '9 z3 o1 r# s5 V& e- q  B2 Z
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    & @. d: J, y8 V  l3 V
  863. db '                                                                                '  z% @) W# \" F' ~
  864. db '                                赏屯屯簧屯屯突                                  '
    : s% W8 S2 u, K7 |
  865.         db      '                                ?OFF汉OFF?                                 '
    % S2 }8 ?1 p2 [* w
  866. db      '                                韧屯屯既屯屯图                                  '
    6 U+ b: P0 i3 P% ]* C# b
  867. db '                                                                                '
    ; y& L9 m2 I2 I( |' |" `- [. J  ]
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '- O: Q/ U4 U2 F# ~
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    / q+ a+ |2 ^  r( C9 Z
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    - `: e' t! z. E# J! A/ ]& y. R

  871. 7 d* e! N8 M0 u* @- S% V
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!* B; B5 ~, c/ w0 W! r9 g3 x
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... . V% J6 \) o. l& Y

0 i. r( g5 ?( X6 L谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-23 00:16 , Processed in 0.122777 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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