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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。3 K/ E/ v0 a" w* S5 F2 |
2 ^2 @4 \- u8 O4 K6 D' Z
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;$ w0 ^' O" A9 Y$ W: R
  2. ;          Ufoit PS2 Mouse test program   Ver 0.95 R5 {+ @+ y+ c+ ^
  3. ;                                         By Bini.Yi 易祝兵; H& t4 p4 W0 y7 `% W$ A
  4. ;                                         http://www.ufoit.com 计匠网
    ) Z: l( L1 D* _: C; r1 V
  5. ;                                         2002/04/06 YYYY/MM/DD! m: E  [1 a$ q. f) a
  6. ;
    + z$ D2 V# }* v( s# v
  7. ;          7 [7 I" N' d# |+ i
  8. ;          This program  test the mouse button  click and move.- V3 u: _' G) c; l3 W( X& O
  9. ;
    3 `3 S" S6 w9 p$ x. c+ G& r
  10. & d# h: v+ Q  Y! p1 f
  11. .model tiny. F% W8 P( f$ F8 n6 q8 j3 @/ M
  12. .586' d6 }0 N2 m/ g
  13. .code) J8 ~( Y+ I1 O* f" b  T
  14. .stack  100h- @, f. I; _4 \! C
  15. .startup! I# A* n" F- y
  16. pusha  @  `; g, q3 N
  17. mov ax, 3533h
    " G( m- ~3 I2 I. ?$ \! a! ~
  18. int 21h
    " {6 V+ A( t6 r1 C' L6 p, O
  19. mov word ptr cs:[old331],es
    0 l$ V$ |# L/ W$ Z' B
  20. mov word ptr cs:[old332],bx% m6 h2 c" A5 u6 `% d- X
  21. mov ax, 3574h$ d  T! L2 x$ O
  22. int 21h
    ; C/ }( b0 C5 c0 s5 k% t8 a: ^$ y
  23. mov word ptr cs:[old741],es
    % S: Z8 z" O+ @: V: y2 \) Q7 Z' k
  24. mov word ptr cs:[old742],bx8 _7 p$ x5 j3 d' _$ M+ Z, t
  25. popa' l5 N9 g: D' M  x) s- G. x, }
  26.         call    memmouse
    $ \3 \& f% a  [
  27.         mov ah, 00
      V8 d$ i% H& b
  28. mov al, 03
    3 s4 }0 v- |- R. q. f
  29. int 10h! T9 ?* H) E6 z, Q
  30. mov ah, 06! U6 C& N! U  o) A2 C1 \8 s8 t
  31. mov al, 0
    ' x' m* G, B) i! f
  32. mov cx, 0
    # i' l8 V7 j3 m: h* }, E: f  E
  33. mov dh, 24- \5 t( Y" ]5 v; M4 C; z
  34. mov dl, 79
      R) A( a( p9 }) V4 c+ Q' ?
  35. mov bh, 07h
    ; J+ m: s& ]) H/ G- l
  36. int 10h
    ' Y- X+ s# C0 L/ r% E* U
  37. mov ax, 0000+ x2 S' z( w6 J$ s9 G2 B: ?
  38. mov bx, 0002
    7 ]& q8 W+ s6 q- X; E' G2 l' \
  39. int 33h9 @5 B: Q0 q# Q* ]  F  k2 [
  40.         cmp     ax, 0000           ;if no mouse drive install% F. [' d* D% r0 a# n% m
  41.         je      errormsg           ;show error MSG. H9 ^) I' g1 c! ?4 ~, Z' K( S
  42. mov ah, 02- C: v( D" ]/ O6 R6 ?! B
  43. mov bh, 00
    , M3 _1 A; o8 g' i3 ]# T4 i$ E2 [
  44.         mov     dh, 25             ;Move point out screen" s/ r0 c0 g+ U+ @
  45. mov dl, 79
    : _: Z  r1 A+ [' _. @) c( \
  46. int 10h
    " h' Y0 _/ w- I: a- l0 ^
  47.         call    showmsg            ;Show info
    - e' y0 ]% \8 m' n! n+ n
  48. mov ax, 0001+ b& j2 f; _) b& N7 F: d: e( z
  49. int 33h
    $ ^! ~$ Q- h8 S8 w0 P+ {
  50. ; mov ax, 000ah4 s$ }- W# ^  L4 _' l0 `
  51. ; mov bx, 0000) V$ E* i+ q3 r7 h6 a
  52. ; mov cl, 0h
    / a7 T/ L. g  X+ b# R
  53. ; mov ch, 0F0h5 ]) M- I# Q' K8 E- a
  54. ; mov dl, 0h; u0 r4 r# `+ q9 E
  55. ; mov dh, 0F0h
    , p# @# g7 W$ p- }7 s4 A9 V! r
  56. ; int 33h
    $ t! e8 s+ S! h% c
  57. mov ax, 0004h0 Z2 d! h# R  j8 |6 E& }) H9 n1 ^
  58. mov cx, 0319
    + a( E9 K0 a" b) U% h. t2 F+ q
  59. mov dx, 0103
    2 b( H; ]% L; g# S
  60. int 33h* @6 |' e, M( M7 }- F
  61. casemo:                           ;Case button click and point move & g3 x/ w, M$ _6 G+ E; U
  62.         mov     ax, 000bh         ;and keyboard press3 s0 L2 [4 T6 Q
  63. int 33h- r: _* T. C7 M+ F! W
  64.         cmp     cx, 00h           ;if point move....X
    0 _6 I' A. @- |7 \& J' c9 l
  65. jne xmov- M) v: W/ m- O
  66.         cmp     dx, 00h           ;if point move....Y1 f+ Z9 |1 W! c) [
  67. jne ymov
    ; C* c) j  P+ l' Z/ B
  68. xymovend:                         ;X.Y move end( |$ S8 l: a' ^' @2 H3 v
  69.         mov     ax, 0003         
    ; E/ z) O0 r8 E; N
  70. int 33h
    ! ~" D1 a8 K  Q2 s# x  W5 ^: _; R5 Q
  71.         cmp     bx, 0001          ;if left button click  show ON
    ) U5 S* j( |/ }- \" O. n9 `
  72. mov si, 1828
    9 T; n  r/ }* e6 F+ q' i; ]0 j7 C
  73. je listl
    7 }! G3 ]' k5 d
  74. mov si, 18286 x' u' W! u6 ~& `' F
  75.         jne     nlistl            ;if left no click show OFF
    / x, o  h- q6 m* i( G8 A
  76. testr:
    / |5 I) D  ^7 z7 N, z& ~
  77.         cmp     bx, 0002          ;if right button click show ON
    + y4 L9 ~: A2 w0 Y
  78. mov si,1842( |3 k7 e+ h7 |* N
  79. je listr. }) {0 H4 X/ d& N. `7 z
  80.         mov     si,1842           ;if right no click show OFF/ {7 }: f" b- X, k, e6 D2 {! p, }
  81. jne nlistl
    / B' Y5 S* }, X0 |# \) m
  82. casekey:
    ! ^+ q* D7 {. Q* a5 H# v' h8 {
  83.         mov     ah, 01            ;if any key press jump check* R; d& T/ [. I( r. G
  84. int 16h5 w, R+ c1 @, v: J2 C7 }1 b' n( C
  85. jne kpress
    + |- W- B5 i1 r
  86.         mov     al, [chkl]        ;check x flag
    : e2 z" U2 X% V1 E# N6 G) `
  87. cmp al, 02h
    % I! u; R0 M) M: Y* q: ]. t
  88. jnb chkok
    ! z: z% H; n$ H# Q7 O5 t
  89. jmp casemo
    " w/ |! |7 n! h
  90. xmov:                             ;if X moved, get the X flag+1
    ; u) @" e+ U6 y: j
  91. mov al, [chkl]- u* B. G( k, |! B$ P# F
  92. inc al
    , q' T8 r: z+ q# X( g# Z6 g  Y, E; B! O
  93. mov [chkl], al
    1 Z6 f" X- u3 Y3 R
  94. call passok
    * @5 D+ N! }5 N, Y  A
  95. jmp xymovend
    ) w2 h" X$ ?4 f5 i2 D  T7 N
  96. ymov:                             ;if Y moved, get the X flag+12 @- c' @1 |: x6 b1 J3 j
  97. mov al, [chkr]
    0 q' n, R- v6 |1 \; ?
  98. inc al; [3 _: d$ j4 b! M. F; k
  99. mov [chkr], al* z' R$ w, Y3 Q  \  [9 v8 n
  100. call passok
    " \+ \% b2 c& \* `) \) G) B# m
  101. jmp xymovend
    6 \! b8 Q+ }& T3 h9 l  t, M

  102. 5 c# }0 p/ b3 q! L
  103. passok proc near) f0 e, x  V& ~: i% H, t
  104. mov al, [okcheck]
    7 Q; N8 B  D8 ^5 x$ a
  105. cmp al, 1# N# i) f! b" M! I! G) Y
  106. je let0
    2 w  D. D6 P0 y7 W# z. o
  107. jmp passret
    1 M: J+ d- s- g# ?
  108. let0: . G0 ?4 L2 \! u6 k* l+ T
  109. mov [pass], 12 q# A9 N$ |5 V7 n6 i
  110. passret:( }, }1 L. U: |# Z. s" [( P: U4 a
  111. ret
    8 s/ q, I6 d4 l' @& h7 r' \
  112. passok endp
    ( x5 h$ m. n8 @1 l  c  f
  113. * a0 X7 g( ?+ F; B6 n- D  s9 A
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    6 D# X4 I0 K( \+ z' B
  115. mov al, [chkr]
    4 |; q- p; H$ B3 m
  116. cmp al, 02h
    2 Z& w( K' u3 P0 d6 A, t4 K& }
  117. jb casemo
    7 ], ?) o7 p, f* u0 O3 a
  118. mov al, [lk]
    - I3 w/ K# J8 x' r
  119. cmp al, 1
    + `" Y' A+ C/ }( E
  120. jne casemo, K/ U7 [1 B7 p, ?& e$ w# M2 I# B
  121. mov al, [rk]" X: Z( y% R9 e* c0 d
  122. cmp al, 1
    ( P0 ^" ?/ ^" q
  123. jne  casemo# s3 U/ i' ^+ m3 [( P3 u2 l' O- p
  124. mov [okcheck], 12 u+ h$ W" w. X) M$ |! ?, m4 z) K
  125. mov al, [pass]
    3 D1 @7 G/ c3 G1 D
  126. cmp al, 1* x) Y" w6 @1 v3 P7 G+ ]
  127. jne  casemo
    - M3 ]& A$ S* `4 S1 P& q& g
  128. mov ax,0002h+ i+ J4 Q' ^$ b, b
  129. int 33h( X: ?- m) f# l0 [7 x" h, j
  130. call cleascr$ O  Y* T6 E1 ?% k4 P  s

  131. ; c$ {% y% _' {6 Z5 ?" C/ W
  132. call oldint
    9 ]3 {) ]; Q5 m8 M: }; H, S, }  h$ L
  133. mov ax, 04c00h. n% s7 _& P& J5 g# Q
  134. int 21h
    # q, a4 E7 V9 d/ }, w( c

  135. ( |$ N# W: _# u2 l6 _, b! [) j& P
  136. okexit:
    8 n* q# ~" m) y( @
  137. mov ah, 4ch' K; `5 M/ C$ c( E; ~' L
  138. mov al, 0) B, ^  Q2 s7 v3 G2 R7 ]$ Y
  139. int 21h
    * R( E& ^7 v0 n
  140. listl:                                 ;Show ON. H  S6 C* m& U+ U- N! E4 C0 l6 W! ?- M
  141. pusha6 o* n4 e5 h6 A5 |4 Z3 C& |
  142. mov ax, 0b800h" \/ r8 Z$ h2 U# K4 u7 C- _
  143. mov  es, ax, N4 _& G3 g/ E/ @# ?# b+ f9 k
  144. mov ah, 47h
    , c' ?5 Z9 C; R
  145. mov al, 20h
    $ G7 X% U3 y$ ]
  146. mov es:[si], ax6 ]8 b4 K/ f7 L% `6 `. q! I. l
  147. add si, 020 ?' s& C* r; p7 p; k% p
  148. mov  al, 4fh
    # X$ Y' w. s, V, V  p
  149. mov es:[si], ax
      W0 d+ v$ u4 j3 L
  150. mov al, 4eh
    ' S* h) q4 `# l- j1 ]
  151. add si, 02& g' D5 d# E5 c6 H
  152. mov es:[si], ax& r) Z) j1 d* @
  153. mov [lk], 1! _. g* D' i7 m2 D" I
  154. popa+ a. k8 n6 ?. j3 _
  155. jmp testr0 t" w) ~4 s* i$ ], ~+ ^3 I0 m
  156. listr:                                 ;Show ON+ g9 J# P7 E6 P2 ?1 j
  157. pusha6 Q4 z; S6 W% h
  158. mov ax, 0b800h) ^6 K3 G% a0 O6 i4 U
  159. mov  es, ax) y+ ?3 [. {1 d8 v! z7 S4 \
  160. mov ah, 47h
    2 M) H2 i: ^7 j0 Y+ j# W% x
  161. mov al, 20h
    . p$ z+ B+ z0 D8 v
  162. mov es:[si], ax
    9 Y: t, U# e' C, f- {8 o
  163. add si, 02' ~7 x& p2 p3 k2 _* m. [
  164. mov  al, 4fh
    + X% ?. J* n8 I& l
  165. mov es:[si], ax
    0 W+ T9 x- ]6 d
  166. mov al, 4eh
    0 `, E( _* ?8 E/ M
  167. add si, 020 l8 ?1 c% ~4 {
  168. mov es:[si], ax8 T# n, _- ^8 m3 [0 A' Y* B7 I/ X
  169. mov [rk], 1
    4 p, b  ?. H1 U2 R; O
  170. popa3 [! |9 O# h, x8 x5 v
  171. jmp  casekey
    ( P, O4 K' z' {  K* ~, P
  172. : C; z4 t1 m7 {2 W
  173. nlistl:                              ;Show OFF* J) j5 o3 g" u4 K& j2 o
  174. pusha   . R/ |7 t9 u- W0 e' D
  175. mov ax, 0b800h
    + a& E) r2 [' C& P8 u
  176. mov  es, ax  q% c4 \" j# {
  177. mov ah, 17h
    & W1 ^. G$ e2 K1 R" w! U6 y
  178. mov al, 4fh
    7 Q; w8 B6 w2 W' v
  179. mov es:[si], ax2 v* g% h; T7 e+ [
  180. add si, 026 S' I5 v$ V' b, L0 T) o5 v
  181. mov  al, 46h
    - B6 `- g/ ?0 ]$ q0 v$ G1 d
  182. mov es:[si], ax
    , J0 G/ j5 X: x5 n" H/ X" i
  183. mov al, 46h: X2 B* W9 W! @4 j) w
  184. add si, 02) X- D; z! C/ c0 x1 U6 S. L9 l
  185. mov es:[si], ax3 s! x5 @. K% F) \- ~2 E+ l
  186. popa- ?6 G& v# T% G: U3 o8 N2 ?
  187. cmp si, 1840: y' s9 s1 V, O/ m/ Z
  188. jae casekey
    / E9 E. N4 ]4 U# S
  189. jmp testr
    9 z/ ~% z% |" ~2 H

  190. ( J6 r1 ?- ]7 J( r9 o3 ~8 f9 ~
  191. kpress:                             ;Check key press if press<ESC> then EXIT- }. i# f" g: F, m0 m+ X: z5 j
  192.         cmp     ah, 01h             ;and return a error" G5 o8 R' U  w; o/ }
  193. je exit1" \9 P) P8 p6 X
  194.         mov     ah, 0ch             ;if press other key then clear8 Q( ?; t9 U: M# B
  195.         mov     al, 00              ;keyboard buffer
    . [& j) Q3 s3 `' g! t+ G( y
  196. int 21h% @5 V" n$ S' M/ u% C3 s; b
  197. jmp casemo
    + }9 w. M9 t+ F. C

  198. 1 D8 d, d& [  g4 C
  199. errormsg:                           ;if mouse driver no install) Q2 ]: x* e& _$ g) ^! j4 r! Z
  200. call oldint
    ( q, h0 E  D/ t$ o4 s4 B- S2 W
  201. lea dx, offset emsg4 E1 U4 |9 g: T8 B6 o. s8 [
  202. mov ah, 09h' t0 }2 i! Z" F; j% o9 k
  203. int 21h1 v1 D7 g; N* v$ C
  204. mov ah, 4ch0 |' l' k. J7 I- X* I
  205. mov al, 29 x# q$ a6 _6 ?' Y! E
  206. int  21h
    - n" N: Z9 H. E

  207. ! E8 T4 X- L; ~: L8 x2 B+ e- t
  208. exit1:                              ;error exit
    $ N( e( U; k) N6 F  a  H' t
  209. mov ax, 0002h
    4 W# C7 [+ @4 v6 i# O  `$ `
  210. int 33h4 _6 ^7 j! ?# E5 ^" M! L* K
  211. call  cleascr
    5 v. n7 O0 t7 w3 |  m
  212. call  oldint' ]  H7 i+ V/ q6 _% g$ ?# @
  213. mov ah, 4ch, I/ m8 N# O" i) n. U& R& b$ j
  214. mov al, 01
    % x! |, V) l& s; Z3 A% Y
  215. int 21h
    , w9 j8 Z" s8 A* {4 o3 m6 N

  216. + A: [1 v- I7 f8 Y* Q
  217. cleascr proc    near                ;clear screen8 z4 I5 k6 t  b( x2 S7 N
  218. pusha
      ~2 d- a9 I5 c  w; [) t5 m
  219. mov ah, 063 f' `0 r1 K- ~/ Z, ]4 @9 O( U
  220. mov al, 00 l6 ^  E& d. r' m- p$ U
  221. mov cx, 0
    ; q  y* i0 T; `% Z- H! x: y( f
  222. mov dh, 249 Y! j$ I# X$ Z; p* |' i, |5 z" B
  223. mov dl, 79
    8 w3 e+ C# ^4 r% V+ s$ }% r
  224. mov bh, 07h
    : Z0 W0 o, L' v4 U- @+ ?  w( R
  225. int 10h
    8 {$ C: ~, J4 c0 W. |  P, k
  226. mov ah, 02
    8 l/ P! S+ M9 V) O3 S1 p1 a
  227. mov bh, 00$ M0 }5 u5 W& s) R' b
  228. mov dh, 0
    ! Z# A+ j* y7 H$ D  I
  229. mov dl, 0. d3 o3 ?, ?- P- h! j" L& j
  230. int 10h
    + P& I6 u: j' i$ H8 m8 }' k$ `
  231. popa, g$ t6 Z. i& y' ^, j2 H
  232. ret
    ) D0 i; k. N7 T
  233. cleascr endp
    6 w5 t9 L0 r6 @2 t( u6 m; g4 m) z
  234. 9 v" r5 ~! t% Q/ ]4 S
  235. showmsg proc    near               ;Show info5 Q7 x) H3 Y; a2 r+ |! A* F
  236. pusha
    ( b' I' V/ }7 L& {6 A- A
  237. lea di, offset showms- o, J. L6 a$ _6 B: D3 J
  238. mov ax, 0b800h2 ^/ R0 W. w1 i7 r9 \3 ^
  239. mov es, ax* Q, P/ n$ @; n* M
  240. mov si, 07 k, w2 S* S3 t" N  ^; t- m, H
  241. mov cx, 480
    8 h9 T( _8 P+ {/ }# z
  242. mov ah, 07h& |% s  q0 N0 }9 q1 ]- j
  243. @@:+ t; {3 ^. q" s0 {5 i
  244. mov al, 20h
    % d8 a6 G# W9 w+ T% A0 v0 Z# F
  245. mov es:[si], ax  i) B: ?: P+ o0 x9 y
  246. add si, 2# B7 D- I( V, J3 u2 q/ m( M
  247. loop @b" h/ W; z" K* N1 O
  248. mov cx,880) v; s. Y$ \7 G* K
  249. @@:4 A4 \: E7 s3 B  T; w
  250. mov al, [di]8 i4 j7 W; m. T/ ]4 S" u& R
  251. inc di
    8 \9 k3 C9 E! T/ h; Q8 r
  252. cmp al,20h  J8 W, o) T3 n3 ~( `$ l
  253. je showch1! z0 C# C- q' A: p. i
  254. mov ah, 17h. W7 c1 G  ]0 \7 y( U4 ]
  255. jmp showch3
    * ]# E/ y2 S# p0 L% M# {
  256. showch1:
    4 {3 P, m# h5 f7 Q7 U
  257. mov ah, 07h   ^9 k9 u. g1 [9 n
  258. showch3:% r7 i: @( D7 ~8 }
  259. mov es:[si], ax" _( T/ G; h2 w3 @! Q( s
  260. add si, 2
    6 w' z3 ?1 K  Z2 _; B: q6 e
  261. loop @b, _& w( T7 p/ @8 H
  262. popa
    4 i* w; v- n6 F
  263. ret9 |  k2 K4 q4 S) E# g8 y
  264. showmsg endp/ I' d) J' ]+ b1 k

  265. 8 X, P# O: n8 @' ]" r6 i# L! K
  266. oldint proc* N% p% g0 C  \7 J# y
  267. pusha( N7 n$ Q: w0 t
  268. mov ds, word ptr cs:[old331]
    9 f3 `0 I0 B# }
  269. mov   dx, word ptr cs:[old332]1 N: G5 ~4 n$ h- ^6 r+ ^: h
  270. mov ax, 2533h( J! T! Z9 d6 B' X; M0 u6 K) S
  271. int 21h# S1 }: ]) N! X1 n& o+ G) ?+ H
  272. mov ds, word ptr cs:[old741]2 o% {: @. ]9 L4 |' q
  273. mov dx, word ptr cs:[old742]
    + p- O- Q) R1 x/ M$ j* u
  274. mov ax, 2574h
    2 e. L: G  M; U. G
  275. int 21h
    " w8 W0 C8 j+ U3 m1 w! G
  276. popa. p9 N- _. v9 v' |9 F" \! l0 t4 f
  277. ret
    # T. a- B) L  M% B' o
  278. oldint endp
      R. i4 n2 C+ s' }
  279. ' n0 l+ F3 X  b! U/ j6 A2 _1 ?
  280. memmouse        proc3 B3 ^5 q* S( Z
  281.         xor     ax,ax) U1 L( h' C# x. S
  282. int 33h
    7 k9 F) o9 N/ K, C% n$ V
  283. cmp ax,0ffffh
    " V+ s1 }6 P1 \; C1 X1 \4 f; `. }
  284.         jne     not_loaded; D: G; l' z% k6 \
  285. mov [memcopy], 1
    ) ^* ?, L2 Z8 T" q) T0 V
  286. ret
    / ~! x1 L) ^9 V$ ~
  287. 4 L: C) ^) G3 e+ O9 G- J6 R
  288. not_loaded:
    7 i( |3 L' h! Z/ o, s+ \4 M
  289. 5 B8 J7 d- v3 D% Y7 E# D) }
  290.         mov ax,2574h; B- J1 a5 s9 b) ^+ r- g8 |+ ^! V1 A
  291.         mov dx,offset new_isr
    2 j. \! `2 J* }" N) D
  292.         int 21h
    ( M8 }4 E) {- F" p

  293. 6 `* V3 @0 e' W5 Q8 j& r7 e0 M. v; \% [
  294.         mov ax,2533h4 L7 ?& [5 a4 \& T7 ~
  295.         mov dx,offset new_33* V, N3 S8 v: M' h" K0 @1 R6 J6 H# w
  296.         int 21h( s* r- s8 M2 i+ W

  297. : ~6 W4 W! W( v( X
  298.         cli
    % X7 f: Q5 b, Q

  299. 5 Z6 }7 I8 [1 |
  300.         mov bl,0a8h! O) f9 u) G/ h! X, z6 P
  301.         call keyboard_cmd! }+ I: a& \* ~0 e% t- [2 b

  302. 7 g3 c) k- t! f3 p0 d. r
  303.         mov bl,20h6 C% _9 d* e0 T7 I8 w9 V7 T
  304.         call    keyboard_cmd
    5 \7 h+ v8 j/ _8 }4 X9 R  Y( l
  305.         call    keyboard_read( E8 l, @; J4 c) t
  306.         or      al,2* V' _/ S+ T$ r  ^
  307.         mov     bl,60h7 U) i3 O0 z, Z9 N" ?
  308.         push    ax4 c' F/ R3 F, s# U
  309.         call    keyboard_cmd- X+ b) }( R3 ~6 w$ H1 b
  310.         pop     ax  f5 ?5 d% S  p6 ~$ r
  311.         call    keyboard_write9 s) ~$ U  H- v9 I8 I
  312. ; ~/ H8 q. ~. ]0 I5 }
  313.         mov     bl,0d4h: S, c! o' J" y/ v% `$ w7 Z  z
  314.         call    keyboard_cmd5 p# h* q) q" a0 Q5 v' f
  315.         mov     al,0f4h
    5 V% v. j6 ~+ a2 Q9 x; z# p2 P
  316.         call    keyboard_write
    ' C) ^6 P; ]$ ]. H( `

  317. * O' u+ B5 t6 W0 C5 r- T
  318.         sti
    ; F( B$ p% N( z' i  D) F; [
  319.         ret
    ' X0 F" n3 D; \  Y# a+ k, a! H  y
  320. call_user_isr:8 s# n. @' a1 u) {
  321. db      60h: ^1 x# R3 J" C5 `! t: k4 H9 w
  322.         mov     cx,cs:[pos_x]; R" h9 @$ M- d" i; x' M% a
  323.         mov     dx,cs:[pos_y]
    6 K& r6 M5 q/ t8 k, R. T% L' q
  324.         mov     di,0 ;cs:[x_move]
    9 T/ b2 f1 i' G3 P! V! F9 [  W" }4 ~( @
  325.         mov     si,0 ;cs:[y_move]
    ' s  f6 l& u8 E" V, N+ u% B
  326.         mov     word ptr cs:[x_move],0
    & k; T* L1 o& j* e6 n3 {0 |
  327.         mov     word ptr cs:[y_move],09 L7 K$ a% y8 D4 ^
  328.         mov     bl,byte ptr cs:[buttons]' u: ~; O" p* W- d
  329.         xor     bh,bh
    . A( i5 [4 l5 K+ ]4 E" g/ s; X. y
  330.         call    dword ptr cs:[user_subroutine]
    0 q+ ^6 [% [9 |9 X. H- M
  331.         db      61h
    , @: G: z  X8 N0 Q
  332. ret* z" D% Y# p. p+ z
  333. new_isr:& s- v4 ?' l* u; a- w$ N
  334.         pushf
    7 i6 v* S' T; v& O/ u- E
  335.         cli
    + h9 S) Z" d) l9 P- d3 k# z* L: R0 o4 W
  336.         push    ax
    ! N$ J5 O* P; ]6 @8 u( Y, a! b
  337.         push    bx
    % d9 Y1 i5 P3 G  I) h2 c
  338.         push    cx# Z" u7 c9 L3 }$ T
  339.         push    dx, I; K" b$ O/ v4 b4 z
  340.         push    di- q* [9 ?) p3 b$ @0 Z
  341.         push    si3 O5 Y4 F6 Z  c% t1 m; Y
  342.         push    es0 |8 Q' C, r: x2 _* J# B2 n
  343.         push    ds
    , J0 e$ T7 b  q, A
  344. / C( v" b4 @- c" R$ {8 F
  345.         push    cs, \' d0 ~5 y$ R- j- J( y% H, k( w
  346.         pop     ds2 k# P- L2 T$ O

  347. ! @+ @9 U0 U. _* H* w
  348.         mov     bl,0adh6 `% T/ E2 a3 c2 D6 L, r, B; q$ ]* M
  349.         call    keyboard_cmd
    - B, |% ^( X9 l0 r3 m3 I* x
  350. 9 j( I; i8 ~- Q: Z+ _' }4 A
  351.         cmp     byte ptr [first_time],0% p0 L2 ~  [3 B, B* e) Q' x) P7 V
  352.         je      not_first_time/ e) q7 r) W2 \1 o

  353. , `2 _0 w( v- }, ?( Z' j! o
  354.         mov     byte ptr [first_time],0
    + A8 F- ?  x3 j* Y
  355.         call    keyboard_read
    ' ^- M5 p0 h; {6 a  `% l
  356.         call    keyboard_read0 l( z' I! o* ~
  357.         call    keyboard_read) S  l8 E" a7 O% |! d% a( Z  d
  358.         jmp     no_show
    4 b; g  u9 C% {( @5 u$ q3 ~! J

  359. ) q4 j8 ]1 w" n  Q5 j3 @! {' H: {: W; x
  360. not_first_time:
    ( q, a6 J3 u# q7 r" b( u1 W
  361.         mov     word ptr [temp_mask],0
    * Y3 U  e& O( M) z% B. e7 Y6 ?

  362. 6 c4 }* ]  F4 `& V
  363.         mov     cx,[pos_x]
    . Y1 X0 C4 \* z) s" w
  364.         mov     dx,[pos_y]
    . d9 m7 ?2 q2 W8 u

  365. / A( I) i* _4 y) |$ @4 F. ]
  366.         call    keyboard_read
    ! v/ \( |8 ]/ u2 ]& v
  367.         and     al,7 ;3' ]* X: P: V. m% {# t0 |% p
  368.         mov     ah,[buttons]/ a- z* |6 _6 o9 x
  369.         mov     [buttons],al
    " z! `; s( L. F" _
  370.         cmp     al,ah  [! U. k1 n5 k/ I2 X+ s5 I
  371.         je      no_button_change) `& `" @4 r" p$ |& G) S9 Q: B
  372.         and     al,3: \8 C: u. d9 u6 {5 A; F
  373.         and     ah,3
    9 x" I% h$ `0 _1 _1 f$ g
  374.         xor     al,ah# g7 w1 [( x+ O0 j  n, w+ m
  375.         xor     bx,bx/ ^9 o; [4 u' r6 k3 V
  376. 9 d0 P, i- X2 A1 z) e
  377.         push    ax
    . ]4 L' J+ w3 ^, Y0 r3 T4 `
  378.         test    al,23 w% s2 r/ O2 M
  379.         jz      no_right_button_change
    $ n" E! Q) S# w8 E, H
  380.         and     ah,2  X6 @" D0 q/ P* c+ u
  381.         jz      right_button_pressed! z% S4 J4 Z1 C1 S5 b1 A1 x) r
  382.         or      bx,16
    ( ^* M0 X1 o$ {. i5 C8 T/ a
  383.         jmp     no_right_button_change
    % p% j" E! }6 z$ m5 R
  384. right_button_pressed:
    2 }7 p$ H% I4 T' S5 z2 b7 Q
  385.         or      bx,8
    6 o* J9 x  G' N! @( ]
  386. no_right_button_change:; L) s; j' C& c3 Z

  387. 0 J8 S0 |* |! i) w, ^  N
  388.         pop     ax
    ! ]+ E1 S% ?1 l/ G& M2 E$ I- H
  389. 1 `7 c/ q8 J; ~$ E0 |) W
  390.         test    al,1
    $ Q1 b4 }0 n+ J2 v6 t
  391.         jz      no_left_button_change
    " o3 S. N# y8 P: |  [. m
  392.         and     ah,1
    / ^: b3 B; i! Q2 I( K5 I" E- W5 A
  393.         jz      left_button_pressed9 k: G8 q) k. E! j
  394.         or      bx,4
    " m" S6 G# l& u5 n( f+ M9 w3 M# `
  395.         jmp     no_left_button_change4 g/ z" W; z% D# r: n
  396. left_button_pressed:# P9 K/ [5 ?4 O; e& k" M
  397.         or      bx,2: O) V- B  `; |( g
  398. no_left_button_change:7 T7 ]$ Z8 E( ^: q
  399. ! `( p/ F4 ^% e! w3 X" H; Z: _+ q
  400.         mov     [temp_mask],bx
    1 _* a; U7 j& _) W5 F

  401. ' t2 R" B2 w( f/ T
  402. no_button_change:
    - S7 e4 G7 q' z) y
  403.         call    keyboard_read. ^% D) X  E: x) ]1 i5 k; D$ L9 o
  404.         cbw; A9 B# A- k) s: Q1 T' N
  405.         add     [pos_x],ax
    9 ]# J$ T$ B- y) c/ {0 |
  406.         add     [x_move],ax
    ! u$ T/ d; M3 x) _1 ?( P  r% r, X
  407.         mov     ax,[x_min]
    : Z# P2 s& r/ f
  408.         cmp     [pos_x],ax
    ' c1 I  ?: J2 e) q2 }, E
  409.         jg      good_hor1
    # G4 M7 m" ~0 K. I- m5 a# y
  410.         mov     [pos_x],ax
    ' T, x1 K' s( J! F
  411. good_hor1:
    8 N) Y' O+ r: r5 I- C0 }
  412.         mov     ax,[x_max]" `$ n* U6 y- m; ~, k- ]/ Q; w
  413.         cmp     [pos_x],ax
    ( d8 v2 @, U* ~5 m+ m
  414.         jle     good_hor2" \+ u' ~/ s& U- `3 ?
  415.         mov     [pos_x],ax7 L! ~& @6 k/ ]( \- [
  416. good_hor2:
    ! }- X2 j+ H% _  e$ ]" V
  417. 2 b2 i0 q- V$ ]& s' O
  418.         call    keyboard_read
    5 A7 G7 n9 P. ~' Y) l7 s
  419.         neg     al
    3 q% P! L9 ]; T8 b9 Q% l
  420.         cbw
    9 M% X7 C6 y" y8 p, L0 g
  421.         add     [pos_y],ax6 y2 a6 M+ J1 o# N  w1 `" f$ G
  422.         add     [y_move],ax
    0 N& |- i/ k2 Y  X
  423.         mov     ax,[y_min]$ T, W( q* s" g6 N6 H& W
  424.         cmp     [pos_y],ax5 y/ v- C! ~7 A  S! p0 f) E6 E6 W0 ]4 i
  425.         jg      good_ver10 j5 F3 ^8 l' a0 Z( M
  426.         mov     [pos_y],ax9 b( d1 Q7 D$ h9 e5 o
  427. good_ver1:
    # q4 x# Q  k0 x, P1 k
  428.         mov     ax,[y_max]
    8 E+ O1 b2 K6 P# X
  429.         cmp     [pos_y],ax9 f$ P5 G( d6 U! m
  430.         jle     good_ver2; K- I$ n( |9 _9 {2 v
  431.         mov     [pos_y],ax1 ]/ G; k2 ~5 o. s. k6 T
  432. good_ver2:
    * f' a+ f9 c, n

  433. 9 A* D( X; U6 \# o+ w
  434.         mov     ax,[x_move]+ k7 {- D' I6 i7 H2 @
  435.         or      ax,[y_move]
    " ]' e3 y/ [8 o3 g% r" l' P3 a0 r
  436.         or      ax,ax# @, }4 U7 ^* j5 \& H
  437.         jz      no_change_position8 u- h. I1 J6 P0 Q" z6 R
  438.         or      word ptr [temp_mask],1
    7 i! r. k$ U4 b$ y4 W! G: f
  439. no_change_position:
    7 [( S8 u2 h! q% S4 R2 t2 ~
  440. ) @( r$ `* E) Z  J. H2 m3 v4 S2 ?7 }
  441.         mov     ax,[temp_mask]. {) z( ?, x+ Z; {: r& u
  442.         and     ax,[user_mask]
    ' {% S9 k" X% t( N" F% o* F6 P: F* B, ^
  443.         jz      no_call_user
    2 D8 ]# l3 Q% h! x( K& z1 W
  444.         call    call_user_isr
    2 ^" W* A- i2 |0 c. k
  445. no_call_user:* H8 ^4 X9 k, M; N

  446. : D. F! h9 H9 @4 |9 d# l
  447.         cmp     byte ptr [sm_flag],1
    5 j, ~" g, [9 k1 @* X& C0 A
  448.         jne     no_show
    ) ?" e% v2 U7 d  P
  449. 4 E% ^  `* Y2 q+ N# }# V; h  L6 ]
  450.         shr     cx,36 Y% n" a, a) s% s6 D! i0 s! ~8 l0 Q$ a
  451.         shr     dx,3- P8 l1 R  _$ P; ]8 c
  452.         mov     ax,804 i: k0 O' t- b2 d3 `- j; Y. `
  453.         mul     dl- ~" H8 r' L' ~1 Q; I% K: s
  454.         add     ax,cx* R; A& Z. C( Z
  455.         shl     ax,1
    ) c# i) }; l2 \  d2 \; b, F
  456.         mov     di,ax. S, T  v: Y# t- R- [2 w7 Q+ v
  457.         mov     ax,0b800h- B! }/ ]$ w! _+ z; [3 D. `  y  O( {
  458.         mov     es,ax
    , _. H- X$ h- Z2 N
  459.         mov     ax,[save_char]! }" v4 G# N- @9 g) x+ P8 l
  460.         stosw5 M& |# u# K7 M( A/ F8 U3 O) y% c
  461. # `+ G; s: i* ~) {. K$ V/ X, m2 A
  462.         mov     cx,[pos_x]: g1 g8 z: W- O# V+ w7 O
  463.         mov     dx,[pos_y]4 y8 Q9 Y/ r( g/ @
  464.         shr     cx,3# x& T; G/ H8 @! F8 I
  465.         shr     dx,3* {5 [7 E: U2 j! T/ j
  466.         mov     ax,80
    & Y% x0 W4 J1 P) z  t) w& Q2 J
  467.         mul     dl  W9 |, F5 v( g& v0 s
  468.         add     ax,cx; b  Z& y+ }. x
  469.         shl     ax,1% [  z! O6 c# Q' ^$ X/ B1 }
  470.         mov     di,ax+ T, J& l& U; V/ ^
  471.         mov     ax,0b800h
    2 X0 S8 m1 d" L& {! |* g5 X: o* b
  472.         mov     es,ax
    : ?& {7 Q: B; i
  473.         mov     ax,es:[di]# ]' Q& L) h# w/ l& A7 j/ n$ V
  474.         mov     [save_char],ax
    % o( Y/ D5 u6 P! Q
  475.         not     ah' `$ E* _" p! W/ K: V9 u9 e
  476.         and     ah,7fh' R& }+ S+ H$ Z
  477.         stosw$ P2 ]6 p0 R2 V* D2 I+ z# I1 ?" V
  478. no_show:
    2 M3 n7 }; M; g9 O8 m
  479.         mov     bl,0aeh& m0 r$ d3 `7 |  J  x3 D9 a
  480.         call    keyboard_cmd2 Y! S5 k- n( o

  481. $ p4 P9 l4 @6 c& t. i
  482.         mov     al,20h
    8 o% z* v7 ]1 d  p  o0 y4 P
  483.         out     0a0h,al- k, ~- I' {- z) O
  484.         out     20h,al0 \2 o/ B1 b4 Q+ }6 g

  485. , L2 a6 I$ V4 N% M0 |" k8 C% k
  486.         pop     ds
    7 i* L1 {- f/ E: l# _8 O, z" A# p
  487.         pop     es( S$ n# |% B" c! e0 H; K; s1 x
  488.         pop     si
    0 h- l9 U2 L' @" c7 O) o- G& X+ L
  489.         pop     di
    ( }3 r4 Q% V( Z# d2 N
  490.         pop     dx8 c5 q( U1 {/ n2 `! w/ K
  491.         pop     cx5 D: P; w! {' I, p9 J
  492.         pop     bx; p, G' }) r4 a
  493.         pop     ax4 n: b% y7 q- h
  494.         popf/ Y8 y' m% @" h: z" N; y
  495.         iret
    4 f: o/ E' y3 i

  496. ! m" d! U' L8 z( W8 R3 h, v
  497. first_time      db      1
    + U. G: t# i- X. {* U
  498. buttons         db      0% H3 s' @( _7 C' [# G, T9 q
  499. pos_x           dw      0+ s) P/ R; V9 V+ J
  500. pos_y           dw      0  Y$ w# [; v9 X" L
  501. sm_flag         dw      0
    $ h- ?& u! i. @
  502. save_char       dw      0
    . @1 J* Y* {  v; m% E0 n2 \$ P0 \
  503. x_move          dw      0
    4 ?& ]" l) K5 h* j  l
  504. y_move          dw      0' a: Y9 Y+ b0 X+ B/ D& W
  505. x_max           dw      639+ {# k/ k. k6 }# S- _
  506. x_min           dw      0- r7 o, t7 u3 p$ x
  507. y_max           dw      199
    + ?1 e# B3 [! E" o9 C: z  ~) L+ r
  508. y_min           dw      0
    % b% V2 g6 I6 ]# J
  509. user_subroutine dw      0,0
    4 H" ^& e6 f7 j9 D
  510. user_mask       dw      0
    % X; b( W5 S, K6 o0 E, ^
  511. temp_mask       dw      0
    / U0 m/ \; @. c% T4 j

  512. & d2 M; _6 h) o9 ~% f
  513. keyboard_read:
    , F# v. a' X3 O% |3 }$ y  G
  514.         push    cx
    ; M; W5 S4 f; f, m1 z
  515.         push    dx
    . r  g( I3 q0 w- `1 f# I9 C3 S
  516.         xor     cx,cx, A. B5 D* h, J; z# A
  517. key_read_loop:
    / E! T5 b0 i5 `8 }5 F  `
  518.         in      al,64h
    8 u9 h# e+ d- e/ U7 I& q/ z
  519.         jmp     $+2
    2 d# A( p# H; Y3 Z5 c- `
  520.         jmp     $+2
    1 s9 ]+ j$ x# I; C# |- _
  521.         test    al,1) n( ~9 W" Z; G) k1 h
  522.         jnz     key_read_ready
    , q8 F8 ]9 u9 k; H: j& F' Z
  523.         loop    key_read_loop+ ^) c' D6 t2 S! R" P+ D
  524.         mov     ah,11 p2 }# f( s- H( t+ I  v
  525.         jmp     key_read_exit
    : H* S* t- m1 D+ P& `5 B* w
  526. key_read_ready:
    : l  D! H/ `) j7 ]$ \
  527.         push    cx
    : L! `: ?2 {$ V, _
  528.         mov     cx,32+ _1 L' t5 J2 N9 B# n) h
  529. key_read_delay:
    1 q6 X3 Y( b+ }5 O: J4 @
  530.         jmp     $+2
    6 e9 e2 _0 u. o7 i" a/ }6 A. y
  531.         jmp     $+28 o, `( P0 |; I) y% ~7 d
  532.         loop    key_read_delay
    - J5 S; t, w, H5 M" U9 K- J
  533. 7 x, b7 W6 J  N- Y0 ?- [5 i% x
  534.         pop     cx
    8 _& ]7 ^' w, b$ b

  535. ; r3 m1 y4 F, i0 L" C
  536.         in      al,60h
    7 u( w3 q9 ~" i/ W& }
  537.         jmp     $+21 N  a" Z: y) M$ e0 T; V, h$ `. ~
  538.         jmp     $+2% u3 L& G1 c* A( k% Q( p
  539.         xor     ah,ah
    9 g# a( a; v3 i) G3 n3 m
  540. key_read_exit:
    - @; n+ N. E1 m8 r
  541.         pop     dx5 G' u. G/ h9 Q& G+ h9 A3 d
  542.         pop     cx; S& l+ [/ P6 Z, g- j, J
  543.         ret" D$ v. k) Z8 f, d; H2 ^
  544. 2 p$ t( Y9 Z  i/ ]# w. z
  545. keyboard_write:
    $ G2 H0 ^/ ]/ A6 l
  546.         push    cx' O. E  Q4 U; Z% I' M! C! G
  547.         push    dx" K. f( c+ \2 d/ R( C, _: ^
  548.         mov     dl,al
    ( b7 l& T& |  r9 p7 m+ ?! k( u
  549.         xor     cx,cx
    9 m% O0 n9 ?% ?6 Y
  550. kbd_wrt_loop1:
    $ P0 a6 X( @8 M& ~
  551.         in      al,64h
    : {' e8 M3 r; F0 x
  552.         jmp     $+20 D) m. E( s& u$ L
  553.         jmp     $+2
    $ ^- M" U7 V4 c3 ?
  554.         test    al,20h
    8 i* M/ _3 S8 e! |! P+ P8 S* B
  555.         jz      kbd_wrt_ok17 s+ B5 n! Q6 \( {* \) ?- a

  556. 6 x( G6 a/ d  q- B4 f
  557.         loop    kbd_wrt_loop18 b/ C, V' X% g: E# }' |
  558. 8 N6 P4 w1 I' H9 h! B3 F
  559.         mov     ah,1
    / R. I9 B, j% |7 S4 @
  560.         jmp     kbd_wrt_exit
    " z5 b1 a- f& [( u+ p( c9 `

  561. 7 |- W, x5 F+ b: Y
  562. kbd_wrt_ok1:7 |: Q# |8 a% S; d3 V. G8 ?: V
  563.         in      al,60h) M& N9 L/ r6 ~" j0 X* L5 C
  564. . [0 H" n  G4 C- b/ V% k
  565.         xor     cx,cx
    # o4 A) m% r& R8 F/ o
  566. kbd_wrt_loop:
    , \  ]  h) p6 J& e
  567.         in      al,64h
    " w; _* t7 S5 K0 G& L0 w8 p; V# U
  568.         jmp     $+28 O+ d0 o. c# D
  569.         jmp     $+2* u+ p* A: [, _5 R: o
  570.         test    al,2$ T" W# E/ Q: R" o! L( A- j; T+ {$ v
  571.         jz      kbd_wrt_ok, [; f. B1 R7 c4 H5 `
  572. 5 R4 B3 M4 i# A6 D5 j
  573.         loop    kbd_wrt_loop
    ) G' M" F/ {7 R* A! E. y# o
  574. / }8 x* Q* F. q5 ~7 j
  575.         mov     ah,1
    ( e- ?  x1 u5 e7 G3 S9 M: P
  576.         jmp     kbd_wrt_exit, J7 |5 `# L' G7 H
  577.   e" Z( c5 A: B
  578. kbd_wrt_ok:3 Z; ]6 I' k( J+ R
  579.         mov     al,dl
    , p5 [1 _" \% k7 m( H/ ]
  580.         out     60h,al
    + p( t' q5 \6 e
  581.         jmp     $+2
    : @' o. z7 X( w
  582.         jmp     $+2+ c2 P$ d6 G7 L. S/ m: x! e3 k5 |

  583. % P/ M5 ^( u! H& D4 z& o. U$ x
  584.         xor     cx,cx
    5 g. E1 {7 _2 D
  585. kbd_wrt_loop3:, Q; H: u1 q& x  _% }
  586.         in      al,64h5 Q$ C; J1 e* B4 Y
  587.         jmp     $+2: S6 u+ C( x4 S% t
  588.         jmp     $+2
    # R% f  }. u$ S6 V0 X" y' m( ~* A
  589.         test    al,2
    2 b$ @0 C* z( G
  590.         jz      kbd_wrt_ok34 l! P& d5 p: {* p
  591. 6 l$ o- q. X) y5 @' A8 H  {
  592.         loop    kbd_wrt_loop3
    ) [8 A( g" T; Q

  593. $ f9 i0 i* V+ z/ B
  594.         mov     ah,1
    ! s4 ~* V* a6 Z& z3 a- @1 |
  595.         jmp     kbd_wrt_exit
    8 ^) G- A" f6 g

  596. 9 W5 Z( d5 u. r  D, J5 \
  597. kbd_wrt_ok3:2 @; @3 @1 l; E  |
  598.         mov     ah,8
    ' L' {  B( O# m' t/ K! t; n
  599. kbd_wrt_loop4:
    ! E8 M! L1 B- x$ v% g% M. S  \
  600.         xor     cx,cx9 _# L1 H' Y8 D6 ]4 B3 i
  601. kbd_wrt_loop5:4 ^; `9 }& e5 i5 b
  602.         in      al,64h* r8 H. }5 U' \" P2 g: N
  603.         jmp     $+2. q3 s/ C, D8 e* W2 W% R  ~+ P) p0 V
  604.         jmp     $+2
    , M8 J' T0 j& y/ p
  605.         test    al,1
    $ U' W. F( r5 E1 Z. l' ~9 G% H$ N
  606.         jnz     kbd_wrt_ok4/ K2 S* U! d4 V2 S+ J

  607. $ l& Z6 O3 p; y2 N9 {! F5 O
  608.         loop    kbd_wrt_loop5$ T/ o; G3 o- v  D3 b
  609. 3 I1 l: T9 M$ @! K/ m. L; H! D
  610.         dec     ah% A6 c# h; a+ K5 g0 y+ {3 k
  611.         jnz     kbd_wrt_loop4
    2 p6 ?0 c# M6 l, A4 ~

  612. $ K  e* _" d. ~3 ^7 ~
  613. kbd_wrt_ok4:+ g% e' M( V/ M# M
  614.         xor     ah,ah# i5 I5 A, m* U5 ]' l& a& E' k1 i
  615. kbd_wrt_exit:
    0 S, z7 {# H4 s( B6 X1 ~. Z
  616.         pop     dx
    + N/ Z4 [; J) u% r; j
  617.         pop     cx7 k; a/ W9 R& s1 B
  618.         ret
    / ]) ~9 I  E& D4 ^( `
  619.         ) S* ], R, J/ s& s
  620. keyboard_cmd:
    4 |! x% C" a5 t4 B1 q
  621.         xor     cx,cx
    % _- m& f3 |- Q- a- g8 Z1 M
  622. cmd_wait:
    2 \; m- Q) f$ Q2 O
  623.         in      al,64h. h6 i6 v& s3 l9 i
  624.         jmp     $+2
    9 Z3 q4 T4 a& q0 B  M
  625.         jmp     $+21 U" }$ O2 E% ]* O& x8 u1 E) k
  626.         test    al,20 p2 s# P1 ^* b5 _1 ^; ]
  627.         jz      cmd_send
    9 p$ z( x  p8 g% M4 r9 z
  628.         loop    cmd_wait
    4 C1 C' g6 h' c8 p5 k1 I
  629. . Z% s( ?7 b. W7 c" T
  630.         jmp     cmd_error% H8 q. ]+ z/ \# h
  631. : y/ \4 o) F- v
  632. cmd_send:
    & E) ], B- M) |/ {1 D& {
  633.         mov     al,bl; d- P  A9 Y) u3 o( Y  c& P5 |! x
  634.         out     64h,al/ h. |$ a% s  a! R( D& T  W
  635.         jmp     $+2" t* D' Q. Z# O1 c) Q0 e3 f
  636.         jmp     $+2
    7 s* H% i8 K3 o- z* Y- T: C3 V
  637. ' q. W1 D; U( ]* ?+ x
  638.         xor     cx,cx
    7 [& v/ ^( w7 k" J9 R
  639. cmd_accept:
    - A5 \, T, t( w9 v: p
  640.         in      al,64h
      i( J! r& K% w" S- A) t/ v
  641.         jmp     $+28 m% S/ G$ e9 }$ k! j9 Z' g" E/ M
  642.         jmp     $+2" t1 ^! C0 p/ C3 O& c  M6 i
  643.         test    al,2* @9 Y, {" D, @: w) a& G
  644.         jz      cmd_ok! f' X* N0 _) [2 t9 H# K1 f
  645.         loop    cmd_accept) U- I/ p, u8 g% _) }

  646. : _( R1 S& I3 u% ^  P/ u, A
  647. cmd_error:
    . q/ ]5 `: k: x. e$ @4 K
  648.         mov     ah,1
    ' m% p; v) O- j4 w6 B' @6 r
  649.         jmp     cmd_exit3 Y/ M$ r) E1 y6 d9 b
  650. cmd_ok:
    ) z6 {* v. E8 l
  651.         xor     ah,ah
    # [7 D( Q% n' O+ j* _, `
  652. cmd_exit:
    * Z. Y: ]5 E, M! L/ \
  653.         ret
    1 T. q5 [7 C, T: H
  654. & s5 f' F/ m( `
  655. new_33:% A4 o( m5 K4 W% V; U$ y9 }
  656.         cli% \9 T0 j  @6 D+ d; F* v0 p2 U5 w0 F
  657.         cmp     al,0/ o+ i" ~" V! W8 \+ n/ A7 ^) P: @! Q
  658.         je      reset_mouse
    9 P6 s1 M! \3 i+ p+ A; x
  659.         cmp     al,1# ]; t- T) k, f9 B5 O9 a( i$ Y8 g
  660.         je      show_mouse, e+ ~% r* G" P1 ?5 M& s/ R
  661.         cmp     al,2
    . ]. C" x) I: v8 E- y+ B- A3 K7 M
  662.         je      hide_mouse' G  C, K, f, f) q9 c1 }9 w
  663.         cmp     al,36 w; L: o  W! j: c; l1 j+ ], I; o
  664.         je      get_pos8 S7 d' r( z0 u0 F4 W
  665.         cmp     al,4  O) F  O0 \" [0 n2 R' Z
  666.         je      set_pos
    8 Y2 f2 D8 ]! Z0 F1 L( n! D2 I
  667.         cmp     al,7
    , ~- P. U2 a& p& y
  668.         je      set_hor_pos0 g# N  B" b3 I
  669.         cmp     al,8
      `6 f9 W4 Z/ p5 O
  670.         je      set_ver_pos+ w" V/ X/ J. c/ \
  671.         cmp     al,0bh3 d+ i* M$ @5 L- c- C, K
  672.         je      get_mouse_movement
    - A7 q" j' D. m5 Y' G) u7 S& @. x, V
  673.         cmp     al,0ch
    . `* S5 O7 J# \0 Y1 x& n+ X
  674.         je      set_subroutines
    $ ^! e/ c8 L! M. ~' z6 {
  675.         cmp     al,14h
      j* m! ?: f; s5 H+ P
  676.         je      swap_subroutines$ G# D3 s6 i! M2 [
  677.         iret6 _" `' i- }  I
  678. ( ^. l# E# \- c3 |3 F' u( S
  679. reset_mouse:/ p, Q5 D1 e, T
  680.         jmp     _reset_mouse
    / o0 u4 v9 i9 t
  681. show_mouse:
    9 C( v6 B% U6 i' @1 j9 s8 J
  682.         jmp     _show_mouse. S7 B1 v# f% V+ `" [% m
  683. hide_mouse:$ u5 J0 f) }/ M# h
  684.         jmp     _hide_mouse+ e3 P2 K/ }* p: b& x0 b1 s* |
  685. get_pos:! f4 D6 ~% C4 B# x9 Q# q! z9 l
  686.         jmp     _get_pos
    $ C. T; B6 i) P/ _
  687. set_pos:
    # K; X( M& k$ c2 d4 u; r2 V
  688.         jmp     _set_pos+ W5 e( }5 c& ^- P
  689. set_hor_pos:
    4 H; W; w1 @" N; e7 P' m
  690.         jmp     _set_hor_pos
    . q: P( Z1 L" ?: F) S  ?/ f
  691. set_ver_pos:
    * m9 K9 G, m4 t5 @3 V/ }/ }; d
  692.         jmp     _set_ver_pos
    ( _' r5 r2 p5 {  E7 `
  693. get_mouse_movement:
    . d# f! [0 u; m
  694.         jmp     _get_mouse_movement
    ! _! {# h- D: z( s7 k2 X& n9 U
  695. set_subroutines:/ Z9 G9 h9 X" h& C
  696.         jmp     _set_subroutines
    & _+ C1 y2 ]! D" H) b5 U
  697. swap_subroutines:
    1 o! d0 N! T, K  P# m& ~+ L( X
  698.         jmp     _swap_subroutines
    . i- ^8 o7 V; Z0 y# }

  699. ' }( n- g% h* S6 x3 t* n4 I
  700. _reset_mouse:
    : z* s1 f0 _5 f8 I0 e
  701.         mov     byte ptr cs:[buttons],0
    $ g7 d$ s6 t! v9 T7 z
  702.         mov     word ptr cs:[pos_x],0
    * U% s9 |9 W% N. d, s5 D. ]
  703.         mov     word ptr cs:[pos_y],0
    - t( a. r$ X3 |+ b
  704.         mov     word ptr cs:[x_move],0
    1 W6 i) Y: Z: F# ?% a
  705.         mov     word ptr cs:[y_move],0
    9 H$ w9 [$ p0 k' n% J; x
  706.         mov     word ptr cs:[x_max],639
    1 S( j: _! ?0 B6 m& y: B' V
  707.         mov     word ptr cs:[x_min],0
    & I- z9 q) H- m1 u- w* i9 Q; X
  708.         mov     word ptr cs:[y_max],1997 I! C4 u* q; ?  G# \+ _+ T
  709.         mov     word ptr cs:[y_min],00 n* Z  s# x9 u0 j5 q% j/ u. X
  710.         mov     word ptr cs:[user_mask],0; G( e* G. ?3 u; R' u
  711.         mov     word ptr cs:[user_subroutine],0
    : i# a3 B8 Z0 \9 r4 T- r
  712.         mov     word ptr cs:[user_subroutine+2],05 ?6 _4 S2 o% m! y0 r2 P
  713.         mov     ax,0ffffh
    ; D! u/ B) G% C, d# p  T9 h; G0 c+ |- q
  714.         mov     bx,3  k5 g. J; {  x# {$ m
  715.         iret& C" I2 Z/ F& D/ T* R! u7 L: X% m( b% h* D4 C

  716. 8 o- }  i4 Y- w0 N' Z5 d. d( @
  717. _get_pos:
    3 Q+ S, P5 c- D$ p; j- P8 p
  718.         mov     cx,cs:[pos_x]
    ! e9 f- K! y2 j4 t2 j. _8 C$ L7 `
  719.         mov     dx,cs:[pos_y]
    - B3 m% [8 H5 G$ w7 o
  720.         mov     bx,word ptr cs:[buttons]! I! ]8 O4 v8 z; Z# _
  721.         xor     bh,bh
    9 m( E7 d. l8 s3 r5 L# e) @
  722.         iret
    4 e) @- Z# M6 V; D* X% ?5 K
  723. ' S. Q3 L7 K+ `/ L2 t
  724. _get_mouse_movement:! N2 `/ t9 o: h% G. L) g% b# V' s
  725.         mov     cx,cs:[x_move]! s: X; s* s8 i& F5 b) @" f* L
  726.         mov     dx,cs:[y_move]
    5 }2 U6 w1 b* T
  727.         mov     word ptr cs:[x_move],0
    ) O4 r8 \5 h3 L5 h# y
  728.         mov     word ptr cs:[y_move],08 d" R" r, \% ?; t3 U' I' N" ?
  729.         iret
    * S' t6 g: f: |3 z; q+ e
  730. 1 D8 v# I: d% H7 f7 p
  731. _show_mouse:7 X1 j9 t5 e) x. D! M. Z9 M
  732.         push    ax# s+ E: _, X/ X, z7 n
  733.         push    bx
    $ ^  j  i4 G5 o# @
  734.         push    di
    # Y5 C% L" u& M/ o
  735.         push    es
    2 B6 R# q; \0 |( a  i
  736.         mov     byte ptr cs:[sm_flag],1
    $ J( b, `2 `( i$ `% v; ]( _
  737.         mov     ax,cs:[pos_y]
    2 B8 f6 W) Y* u/ |
  738.         shr     ax,3% w  w0 y# Y- M
  739.         mov     bl,80
    - |6 c+ u+ ^6 U& _% s9 X' t
  740.         mul     bl
    3 P  }% A9 U7 m- C, x4 m
  741.         mov     bx,[pos_x]# m% D2 Q4 O, |% g8 i7 b3 C1 J
  742.         shr     bx,3
    6 i- |6 k5 V6 e4 p. J; Y9 T
  743.         add     ax,bx
    * D6 b8 e3 b0 `$ F3 \$ H
  744.         shl     ax,15 y0 t; R! o& l' H( }5 J& S
  745.         mov     di,ax
    8 D5 K( W/ |5 G7 Y# U
  746.         mov     ax,0b800h$ C* @% M) a+ K) b
  747.         mov     es,ax9 |, q. R$ v$ F4 [0 w% p
  748.         mov     ax,es:[di]
    ! m8 m' A- e  n2 W
  749.         mov     cs:[save_char],ax) q& h* y/ G& R3 n% Z
  750.         not     ah
    2 f- p# s2 D: b# g7 s5 j5 N
  751.         and     ah,7fh3 E0 G& \% |' z: o4 \  f: y
  752.         mov     es:[di],ax8 \1 I) R# \8 T" j+ r
  753.         pop     es
    , T5 D+ k5 ^; _2 V& {
  754.         pop     di( p) f! E4 n! k/ o
  755.         pop     bx
    3 N$ ?# ?$ {" L1 l2 g- s0 d  F% Z
  756.         pop     ax
    0 H; q: `! J  n3 n9 I( V. Q! `8 H
  757.         iret' K# _+ Z3 |8 ]8 E

  758. 8 V3 f" k2 @+ a, \. x( Y0 L
  759. _hide_mouse:* W1 q* I3 P; u( W
  760.         push    ax
    2 D. o% Q9 n6 G
  761.         push    bx- ~4 S) ]. ^! b2 b1 |
  762.         push    di7 w6 k: S) ^6 [* n
  763.         push    es" C" T- ]+ J8 {1 W$ G
  764.         mov     byte ptr cs:[sm_flag],0
    6 S% z+ C, G) L3 [
  765.         mov     ax,cs:[pos_y]5 N3 y4 c) c, s7 m
  766.         shr     ax,3
    6 y, x  P. m* D" D
  767.         mov     bl,80
    ) ~- r3 I% q* ^, V1 `4 e! b6 j# S, y3 G
  768.         mul     bl
      g# T( c2 p/ Q/ @. G
  769.         mov     bx,[pos_x]+ i: N+ N6 s2 X! c! a, U
  770.         shr     bx,3, ?) }7 `& m& M/ a( ?
  771.         add     ax,bx
    3 D. p3 o: {6 q4 `- X0 R
  772.         shl     ax,1; ^$ O" p+ L4 _/ Q6 h5 ]
  773.         mov     di,ax! C. h8 Y7 A  J
  774.         mov     ax,0b800h
    " p) k: G- `( h) I9 C/ t* z1 y
  775.         mov     es,ax
    4 d" `; f+ u. ]$ v( V- ]
  776.         mov     ax,cs:[save_char]0 s3 ~, s1 h: p+ ?( J
  777.         mov     es:[di],ax8 [6 J$ ^5 K! B7 s/ m6 c
  778.         pop     es
    , H% T3 J' x% T0 R" |' i
  779.         pop     di
    8 [- `' p, z9 I9 ~1 F
  780.         pop     bx/ A0 b6 H/ l4 ~) d; k8 s& m
  781.         pop     ax
    ! P2 x# C; b6 G% u$ T4 f7 u
  782.         iret
    3 U4 z( m" X1 A5 x/ D

  783. - l8 `" J# [% ~1 ~- y
  784. _set_pos:( y5 i! i1 s5 ]
  785.         mov     cx,cs:[pos_x]
    $ Z/ x  `6 _0 s4 V% Z' P* M
  786.         mov     dx,cs:[pos_y], O* ~) i9 \0 b) |' N" Y3 r
  787.         mov     word ptr cs:[x_move],06 {2 I' P& {3 I  Y
  788.         mov     word ptr cs:[y_move],0% }6 _3 r3 p$ n" x! z0 [' G1 I+ \% X
  789.         iret
    ! W8 r6 v. o! J, n
  790. 0 l, @3 d1 }* b  j4 w) }
  791. _set_hor_pos:$ V: K+ a( F  W. B5 |
  792.         call    max_min
    4 w: }- \  p! P( r' n0 r# e& {0 f
  793.         mov     cs:[x_min],cx
    . t5 K' K; V5 K6 l
  794.         mov     cs:[x_max],dx
      c+ E2 c" U3 B
  795.         cmp     cs:[pos_x],cx! o( S' ^! Z, q  d- ~/ e/ _
  796.         jge     good_hor_min
      I3 e0 f" ^- q& H* S6 e/ n
  797.         mov     cs:[pos_x],cx* x. ?. D. i' v8 o
  798. good_hor_min:
    0 P4 K, ~1 r- A5 p5 k! W
  799.         cmp     cs:[pos_x],dx  x) g1 ]" c. u* F3 t
  800.         jle     good_hor_max
    7 A: E/ \# y- Z, {0 T3 i0 d: b1 J
  801.         mov     cs:[pos_x],dx; y, W* `1 H0 ?5 Z( k! ~
  802. good_hor_max:
      A' a1 t# E/ [8 K2 A1 m
  803.        iret2 q' U4 |; T1 n- U5 T/ K0 W
  804. # v- B% }: z3 c& i3 L
  805. _set_ver_pos:! A% s9 G! e- l' ?1 w
  806.         call    max_min
    - g1 g5 l: O) {
  807.         mov     cs:[y_min],cx
    - T, z3 V4 V2 S$ l7 w
  808.         mov     cs:[y_max],dx( X2 X; c, l  A
  809.         cmp     cs:[pos_y],cx
    : P7 |4 {9 C& E+ J$ a
  810.         jge     good_ver_min
    # j: ^" }3 C. y" Z
  811.         mov     cs:[pos_y],cx
    % t* j  v) t! i' g& B2 V
  812. good_ver_min:
    4 w0 }. x* p' W
  813.         cmp     cs:[pos_y],dx4 b) x: L9 f9 N6 l" r4 G( @2 I: E
  814.         jle     good_ver_max
    5 l4 v# u2 m/ Z4 P
  815.         mov     cs:[pos_y],dx
    ' m8 K1 |1 J8 g
  816. good_ver_max:
    ' i  W, Z9 U; g0 B* M
  817.         iret4 _/ x$ w" g. b* d! x/ C+ ]( K

  818. " E' a3 r" v6 y7 N1 k' h5 X* d' W
  819. max_min:$ Q5 o2 @$ ^5 w4 U% g  K
  820.         cmp     cx,dx* ^2 h& C+ i3 h' n% C+ [( |3 Y
  821.         jle     no_swap/ D6 W7 H, |" B. U' j: N8 ?
  822.         xchg    cx,dx
    $ h* N0 u, `9 v5 j1 l- ^
  823. no_swap:- Y: R0 F9 w$ v1 G& P
  824.         ret
    2 W0 g7 d3 R7 V% `/ O7 n
  825. # ?- F/ p8 I: M7 ]+ q2 z
  826. _set_subroutines:
    & }) i6 t' t4 K! y
  827.         mov     cs:[user_subroutine],dx
    # U) t: P7 {" k6 ~/ A" @
  828.         mov     cs:[user_subroutine+2],es
    % U' C; y+ b( T) _4 C
  829.         mov     cs:[user_mask],cx( Z  y; a9 f$ R+ i
  830.         iret
    4 [2 O9 s/ z% }- o3 C) Q
  831. 0 D) w8 ~4 o/ C; H
  832. _swap_subroutines:
    ( B/ `2 R) Q+ _; ^
  833.         push    word ptr cs:[user_mask]
    + f: R4 v! P0 j( V, a
  834.         push    word ptr cs:[user_subroutine+2]- M; E* ]0 V/ _6 t) R
  835.         push    word ptr cs:[user_subroutine]
    & b' z6 ]9 [  Y
  836.         mov     cs:[user_subroutine],dx
    4 U: G. @( e8 H/ x1 q2 M1 s7 T
  837.         mov     cs:[user_subroutine+2],es2 L; d, r' X/ L  e( d6 K
  838.         mov     cs:[user_mask],cx; C3 A0 q3 V: G5 k; b3 o
  839.         pop     dx- G" b3 P9 n2 b! ?6 K$ u
  840.         pop     es& H& i$ J% l0 g2 N
  841.         pop     cx' c7 c/ u' g: e. G
  842.         iret) X) P% g: f; _& i
  843. ) V; Y3 z+ p1 |( @
  844. memmouse        endp7 c# m, m* s( p8 F) ]/ P, |
  845. , P; }( d" r. `0 ?
  846. endof_start:
    + B! {: ~8 ?' I' M- t

  847. 0 ~1 p+ b4 |# A1 \) n
  848. emsg db 'No mouse driver install error!$'
    1 ~% j5 T4 T4 Y; u0 ~
  849. old331 dw 0
    ( F. l7 O6 ^: r" }/ Y- b& R7 Q
  850. old332 dw 0
      @9 k& N$ _& T! t9 D
  851. old741 dw 0
    ; J; g) q2 @4 w. {$ n/ Z$ _
  852. old742 dw 0( l7 R" q- j3 ?" y2 F, \
  853. memcopy db 0
    + W9 q: K$ j4 C& t0 E8 Z) i
  854. okcheck db 0
      |1 U) E6 [. R" E8 m% ?' p; O8 r
  855. pass db 0
    ; J# S3 k8 ~) e6 U
  856. chkl db 0/ k- u3 P$ Y5 Z; G% X3 n
  857. lk db 03 h5 `5 A! t1 J
  858. chkr db 04 D' s) K3 Z, g% ~9 |1 D$ d
  859. rk db 0* }. \1 ?& K2 ~( Y
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ( y# S$ l" Z( J% c, X: U" g( }
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '* ~( a# Y, r0 `/ P
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    : R/ ?% |2 L' J9 X
  863. db '                                                                                '
    1 x3 s+ u5 s1 w' M& U0 ~! i# s
  864. db '                                赏屯屯簧屯屯突                                  '" V8 m( w' ^/ Q' L
  865.         db      '                                ?OFF汉OFF?                                 '
    8 W' `+ [% F1 ?( w% Q% N
  866. db      '                                韧屯屯既屯屯图                                  '
    ' [! l9 _8 {" ?: I; c2 J3 I) E
  867. db '                                                                                '
    " d6 ^& t3 h1 A# a& E
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '/ K, s7 d$ a: j2 Y& r0 W& M
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    . D: k$ i7 a$ s6 Y6 O' W2 e
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    " N+ g1 \2 A  _( @$ F3 e

  871. * U# a1 W7 k; s9 M) i- u+ J
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!  I' N4 V! S, n0 W3 _
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 7 S6 m, l# [3 y4 l7 O  @' g6 F
4 P0 d0 ]# Y0 s
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:05 , Processed in 0.038294 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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