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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
6 P( {% w5 x; I* o2 A. g, b
. U6 A! E1 u( n2 h& n8 y. @9 S3 k代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    6 C- ?$ t: Y0 _; E3 e' J5 X0 |
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9; K% z7 F8 R$ J
  3. ;                                         By Bini.Yi 易祝兵
    + v: M$ B6 ^* w
  4. ;                                         http://www.ufoit.com 计匠网+ p/ D' D8 g! j; o0 O
  5. ;                                         2002/04/06 YYYY/MM/DD
    " F, ^2 r# d8 i: J5 V
  6. ;
    3 R. M+ m( H! [! `
  7. ;         
    * s9 p1 p0 W8 b( h$ W7 Y0 F. n/ `" f0 U
  8. ;          This program  test the mouse button  click and move.6 k5 V- ^( t7 `( @( U9 L  n! |# t
  9. ;6 W3 L3 D/ d$ x, {
  10. 4 H3 b* H9 P# U. V- d( @
  11. .model tiny* Z4 d1 x) L6 T5 J8 }. s( N
  12. .586
    % A1 o( f: }! k
  13. .code; E4 K9 t6 C* {* J/ d$ W
  14. .stack  100h/ e$ _/ t" d+ ~  m* ^8 m9 I
  15. .startup
    2 L. ]) X% T" L$ c7 @
  16. pusha* Y; @% h3 N, i' W& V3 @0 I
  17. mov ax, 3533h
    ) a9 V% D# [6 \! A/ |
  18. int 21h( n* U3 R- p' T4 C* O
  19. mov word ptr cs:[old331],es
    , ?) s  i+ ]' l! e( D1 w. b
  20. mov word ptr cs:[old332],bx; l; |8 f; b$ I3 w5 s. F
  21. mov ax, 3574h
    3 ^9 ?5 ]2 e: i9 A, h
  22. int 21h1 r! Y$ D  n' V& O( @# T
  23. mov word ptr cs:[old741],es4 x) c" ^7 T; X# C  H
  24. mov word ptr cs:[old742],bx  [2 ?6 n+ C* J6 B# o# a& w
  25. popa
    . @! K% `) t0 G8 Q
  26.         call    memmouse
    * T, Z& h# z- I
  27.         mov ah, 00, L' H3 ]0 |% Z  G" k/ D" E) ]5 j  I
  28. mov al, 03
    ( Z+ c3 `5 k$ q- C) }2 F$ R
  29. int 10h  }! ~6 ]# X# \* [3 h
  30. mov ah, 068 b4 ~8 i/ x( @$ `
  31. mov al, 0( f) r( R- O3 w% t1 l
  32. mov cx, 0( U& q/ M  Y$ g% n) Q- i; j/ S! E
  33. mov dh, 242 u9 {! T" O0 }* k( o2 @# G1 w
  34. mov dl, 79
    6 A1 I1 E- U  O5 g) s
  35. mov bh, 07h
    " q/ i/ M" V' T0 y6 ~0 Y. }. E
  36. int 10h. Q& I$ B& z0 j& Y. J
  37. mov ax, 0000& U" h* |) e0 L6 j5 J7 W
  38. mov bx, 0002
    / X3 w: r+ _; G2 g; J( T8 ~2 O
  39. int 33h$ M) [1 P! c: c: p- |5 j
  40.         cmp     ax, 0000           ;if no mouse drive install
    4 o& _* P2 r* g* l( U* Z' ^
  41.         je      errormsg           ;show error MSG: O7 F$ B3 Y9 E% I. R) A
  42. mov ah, 02) v2 X* i& e! \! |
  43. mov bh, 00
    & Q- U0 p5 Q6 S/ e* P4 i% |
  44.         mov     dh, 25             ;Move point out screen
    ) G; I7 j6 z% [' \& Q) D: W3 \6 t
  45. mov dl, 79
    1 C4 z+ r+ K. C% S  D
  46. int 10h
      h5 p* U3 q3 m2 |  o
  47.         call    showmsg            ;Show info& j1 I! V  f, Q
  48. mov ax, 0001$ m& s2 T3 j, Q4 m
  49. int 33h0 a& U7 i( i2 v; R. }- f& g$ M- E
  50. ; mov ax, 000ah
    0 C3 y. Q. N* W% i
  51. ; mov bx, 0000
    $ g: R% {; m$ {; N
  52. ; mov cl, 0h
    6 j  h8 g( Y7 t/ n; p: ?
  53. ; mov ch, 0F0h
    & X2 ~; A/ B# _9 J( ~. \
  54. ; mov dl, 0h
    0 c: q5 _$ ?! s8 F7 G% V
  55. ; mov dh, 0F0h
    ) v" p6 V. p1 S' g5 D# X  Q: A
  56. ; int 33h5 u5 e, ~: D/ W9 I8 B
  57. mov ax, 0004h
      {; I7 z6 \: d, f
  58. mov cx, 0319, ]; n+ _# f3 [" i, t: d4 ?
  59. mov dx, 0103* V. b' j7 g3 |% W4 S) ?
  60. int 33h8 P1 q. b5 C" k& T
  61. casemo:                           ;Case button click and point move
    , h' A4 y" G7 N2 @  M3 A: W
  62.         mov     ax, 000bh         ;and keyboard press# a4 o4 o$ m( U5 Y, B2 f( d
  63. int 33h
    9 C/ p( ]) h* `$ e
  64.         cmp     cx, 00h           ;if point move....X
    $ {# w( f  n# D/ y7 d& R
  65. jne xmov6 r4 d) Q3 v' Z) s: {
  66.         cmp     dx, 00h           ;if point move....Y
      m) O1 S7 f& }. N6 x4 E6 S6 j- f
  67. jne ymov
    . O: |) V3 e% o. k
  68. xymovend:                         ;X.Y move end( y4 z5 }( e% @$ r
  69.         mov     ax, 0003          3 ?; |! a+ v+ d& b; g* ?" ^2 X
  70. int 33h
    # f+ z: }0 b; R; n4 |! Y
  71.         cmp     bx, 0001          ;if left button click  show ON4 ~* {  X1 Z' v. P* c$ w- B
  72. mov si, 18281 m6 [) L  {$ M" `* P0 O' J" t; Y' f
  73. je listl
    $ v' L+ g: d- k5 o3 w+ z) R, {
  74. mov si, 18288 F7 q) T! b; F
  75.         jne     nlistl            ;if left no click show OFF
    ( z/ C8 B5 N  I! x: D+ O% ~
  76. testr:. u  V+ ^( v: R! M1 o
  77.         cmp     bx, 0002          ;if right button click show ON2 N7 K* o; u0 D7 ~* o
  78. mov si,18420 C% C/ H2 G- Y1 t+ @
  79. je listr$ V6 c9 k8 \0 ^4 H* {6 P5 U
  80.         mov     si,1842           ;if right no click show OFF
    % P" _% h5 m3 H" g; b* U" o
  81. jne nlistl
    6 z; [. C) {6 o( X6 d9 d7 S
  82. casekey:
    3 o( r4 O2 F* e: A  U& W/ z. g4 _
  83.         mov     ah, 01            ;if any key press jump check
    3 E$ Z& G1 h$ N
  84. int 16h
    , X& M. q) d" M
  85. jne kpress
    4 r- x. M7 U7 Q# `% }2 g
  86.         mov     al, [chkl]        ;check x flag
    , ?' {$ c% D" c- L
  87. cmp al, 02h& ]: t( h3 s0 n
  88. jnb chkok0 j" I% W( H) \) v* K2 Z
  89. jmp casemo/ K4 S; l/ V3 j  f5 n, R
  90. xmov:                             ;if X moved, get the X flag+1
    1 a& c+ Z, G6 l4 G9 V5 L
  91. mov al, [chkl]& H. W2 a, @7 s: t$ ~& D
  92. inc al1 }! }/ X, q6 b' C. I
  93. mov [chkl], al
    : E; f: K% a& o3 |( x% I$ r
  94. call passok1 v1 ]3 Y/ A5 D1 `
  95. jmp xymovend
    9 ~. c; U6 z3 }
  96. ymov:                             ;if Y moved, get the X flag+1$ I- f- N5 w9 h) }4 c8 y
  97. mov al, [chkr]& ^+ k/ H6 G0 a$ d/ c
  98. inc al/ Q  r( A  S% b" \2 g
  99. mov [chkr], al
    ) A% A! |; x& e3 V" V
  100. call passok# Z" h  C3 l2 ?: T3 F
  101. jmp xymovend% f- ?- [0 A- V. s1 k7 K5 F: m
  102. ) Y/ k! H9 K! M, H
  103. passok proc near) y, G& j6 ]0 a0 c
  104. mov al, [okcheck]+ c0 f# F" y5 T+ A( G
  105. cmp al, 1& e/ o, S7 V/ {8 `) b
  106. je let0( p; B' P% g. a: A2 M+ M/ i! b" L7 P
  107. jmp passret. H3 J/ F$ F# b% \! }  u  p
  108. let0:
    ) h1 ~. D. o& Z- F
  109. mov [pass], 1  p2 u2 ~3 C6 P' R0 l: ]
  110. passret:
    5 I8 l5 }; z2 \8 Y& Z4 w( _3 k
  111. ret3 X! a# O  P* U) a, j* q- U7 \- `: {
  112. passok endp ' p( @0 w1 k4 ~, |0 g  s9 t. v
  113. ; \8 Q- x# H# [+ K/ J
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    2 u$ {' p/ [( w7 K4 D
  115. mov al, [chkr]9 |6 W# U2 o" H& n
  116. cmp al, 02h+ E  ]' r% X' d: I% F) f8 Z7 _
  117. jb casemo
    2 F' b. }! C2 `& J
  118. mov al, [lk]: F0 M; b  r) ~1 M9 J1 v3 t
  119. cmp al, 17 L' f. u! x; q/ ^
  120. jne casemo4 }0 r& Y: d: l4 Y9 i0 i& l
  121. mov al, [rk]3 A% T+ J: _. _6 j( e5 p6 W
  122. cmp al, 1
    8 e. F1 }% d1 L+ P) l( P: L
  123. jne  casemo
    $ E5 z4 }0 j0 @
  124. mov [okcheck], 1, X7 q4 W+ g6 N& d$ e' d1 M
  125. mov al, [pass]
    : q; x) W9 ~6 _! \
  126. cmp al, 1
    $ Q  E. Y4 o/ h  Q9 G* N
  127. jne  casemo
    , C" P! H; M9 u
  128. mov ax,0002h3 \: v/ F) ]3 K3 x5 H2 a7 S9 t3 g
  129. int 33h
    : ~. R( v) h, A, u
  130. call cleascr0 V7 P% \$ ^" |0 u
  131. 4 t3 V) b- J7 D5 ?8 Y1 G
  132. call oldint8 R( p/ b/ G: q/ _' F, q
  133. mov ax, 04c00h* R. o  X/ M2 [  z* J" ]
  134. int 21h
    % y8 z- F5 W% t* b  S+ }1 K8 {

  135. " f* O) x( U, E6 Y* n/ ]
  136. okexit:
    ( w& j. j# J2 T, z
  137. mov ah, 4ch
      K' M. f* E9 ]1 M7 ]4 h+ E- n
  138. mov al, 0% O+ ?6 Y+ }: R& i
  139. int 21h; ^" M1 g1 ^; d# d- i! x- E: S8 \
  140. listl:                                 ;Show ON
    , o) A  W7 V9 M. G1 P- a
  141. pusha  h) l5 \9 Z2 t8 _
  142. mov ax, 0b800h
    ' @2 d$ @* g5 m. D; q# k7 ]
  143. mov  es, ax
    - v8 i- p0 H: W$ a# ]( u
  144. mov ah, 47h
    $ n: u9 b, D5 a6 N) ~8 k
  145. mov al, 20h
    ; P7 q# b; _1 ^* d. C% ^* s$ v
  146. mov es:[si], ax
    . t1 _' Y3 b# _% i" T+ K
  147. add si, 02
    , ^  \/ f0 v  S
  148. mov  al, 4fh' |4 X; @& B# K: {4 Z
  149. mov es:[si], ax% j$ T& q# @0 A3 _# {5 g
  150. mov al, 4eh
      T# e) R4 |( c6 s$ w  F% P
  151. add si, 022 R+ g* J$ K- D+ D3 u
  152. mov es:[si], ax
    1 _! W% E# W. \. q, |( r  ~- C
  153. mov [lk], 1
    : q  u9 O0 K- A
  154. popa
    $ G/ m9 f: R8 S6 A
  155. jmp testr$ \7 e/ {) l( T4 G- E, Q
  156. listr:                                 ;Show ON
    5 h2 H. O- c7 {/ k' k4 d
  157. pusha# |3 E1 y0 K/ L/ l0 M$ e8 Z
  158. mov ax, 0b800h
    - B9 X6 x* z- t  l. h% @' @
  159. mov  es, ax
    7 y5 _8 J- u2 q; L+ a# O# m
  160. mov ah, 47h
    ; x) `  U, ?8 s5 h7 H. G
  161. mov al, 20h6 a6 l' U- m/ p+ j! _( }+ J/ V
  162. mov es:[si], ax, _) s/ M: x; f2 K9 d7 K
  163. add si, 02
    # {- ]  o4 _, c1 z1 i  r5 a( ]5 k
  164. mov  al, 4fh& ]; g, t0 V4 N1 Y+ k6 W
  165. mov es:[si], ax
    8 f! V2 t2 V3 I
  166. mov al, 4eh
    ' t4 B& x( l8 A  h: c0 u( V0 o
  167. add si, 020 a0 O, W/ l8 i7 d2 _# y7 F
  168. mov es:[si], ax% \4 Q% _) a, s. a3 k  d
  169. mov [rk], 1! ^4 ~0 v0 |1 Q" V3 f" _
  170. popa' Y( B5 B2 j8 z
  171. jmp  casekey5 O& k$ e4 q; t( W' p: {1 N8 |

  172. / f. K" v* E9 D( o! E- g
  173. nlistl:                              ;Show OFF" S, t7 [. F# A6 Q
  174. pusha   
    # K5 k% u6 D3 r0 I
  175. mov ax, 0b800h6 o0 \4 M4 W+ r6 W# U9 {4 N- b
  176. mov  es, ax3 J8 h, @7 y6 J: j( B$ B) x% x5 v
  177. mov ah, 17h9 ~6 j' j; V" y2 W; W
  178. mov al, 4fh5 |  p9 [; s& m
  179. mov es:[si], ax
    9 S$ _' d' J% d; ]8 s9 i
  180. add si, 02
    " F# I( y& d8 Q% d
  181. mov  al, 46h
    6 g4 ^2 q' t2 O
  182. mov es:[si], ax7 e4 m8 W: w8 z" |
  183. mov al, 46h. [; Y, u. z9 u
  184. add si, 02; u/ h5 {! c& P2 S. ~
  185. mov es:[si], ax
    . m  v8 m8 S( M: R' u9 W
  186. popa
    . x4 E3 M" q( u& Q: o  w( s
  187. cmp si, 1840( q! z/ V! C& a$ D' B% S3 _
  188. jae casekey1 ^# Q+ A7 h4 e- W  V% m: u
  189. jmp testr
    % h$ s. q' P) O
  190. ' \  Z0 G$ x3 @) }; J
  191. kpress:                             ;Check key press if press<ESC> then EXIT) M: ^2 Y7 Z7 C; C: C
  192.         cmp     ah, 01h             ;and return a error3 r7 g) l3 @) S* c
  193. je exit1/ Q! w+ I& [9 i* H
  194.         mov     ah, 0ch             ;if press other key then clear
    ; g) n4 e/ p* r* s& Y- t; [; R
  195.         mov     al, 00              ;keyboard buffer  n( J6 q$ ^! M- \% O
  196. int 21h0 E6 C7 e/ b6 E- P6 F& j( Q- }/ T: k
  197. jmp casemo 8 M1 n' W& t. I9 `
  198. 1 m1 E7 f- R) R: j0 M
  199. errormsg:                           ;if mouse driver no install
    0 [2 X4 K- k& [
  200. call oldint
    3 i. N' Z7 _4 o9 G( s8 H
  201. lea dx, offset emsg8 u3 u, ]# c- Q& t' V, X7 R% G
  202. mov ah, 09h
    4 m5 N) s' r+ I) M1 w2 P; u
  203. int 21h2 S# p. L1 A3 ~+ n; }* G
  204. mov ah, 4ch
    ) I( y7 P0 [* j: `$ l
  205. mov al, 2: i, u" @% ^. p* w
  206. int  21h
    ' q/ F, L) u3 D5 A  v2 k0 g

  207. ! P, `) ]0 z9 T' S: O9 j
  208. exit1:                              ;error exit+ g! P$ o0 ]6 _  T7 L+ t( K
  209. mov ax, 0002h6 [1 H5 l! H4 ^6 T
  210. int 33h; c& `, M1 x& P# C! z4 v% b  e) s
  211. call  cleascr
    ( H5 d. ^% M, k6 z# Q# D
  212. call  oldint# F+ Y! ]# \% i6 L* v
  213. mov ah, 4ch
    6 `4 r4 k( v- D4 I% ~, c
  214. mov al, 01
    2 W' Q% Z2 C; `  m6 i3 E
  215. int 21h7 H4 c" W2 W' Z9 }0 i

  216. 9 r. I. A! A1 Q" F
  217. cleascr proc    near                ;clear screen
    7 j: Q/ {9 I8 e3 p7 `1 M4 w
  218. pusha
    8 N  a# D+ o: `4 ]9 u$ \6 E
  219. mov ah, 06
    + A8 u4 P. r2 A# \; l
  220. mov al, 0
    ( e$ Q* u9 d' }, E: q
  221. mov cx, 0
    : u7 o' q8 M+ |% {& F$ Y
  222. mov dh, 24) l5 s4 v# }) _& D0 R) j6 d. D
  223. mov dl, 790 [( k8 V7 a& F
  224. mov bh, 07h
    " U0 m) `6 S5 b3 t% r" f7 _- M
  225. int 10h
    " `' L4 ~1 M( |+ |5 j
  226. mov ah, 02$ i5 j8 a, K& h% T
  227. mov bh, 00
    ( i4 u! o6 w# X7 B  R5 ~6 y
  228. mov dh, 0
    ( a6 t2 n& u1 _, ]1 N8 w
  229. mov dl, 0
    * F. q5 h# h( \, q
  230. int 10h& e) D6 u) r% F3 i
  231. popa+ N8 M* v! W, r+ u3 a' e
  232. ret
    ; w6 c# r6 t, }! _
  233. cleascr endp
    , G  f! J, \" U. S9 g4 P

  234.   h1 p! E5 j# x  s$ m5 P' c1 B
  235. showmsg proc    near               ;Show info' n# e! T8 V7 d$ q/ z
  236. pusha" g, Q+ i6 M# l: s% a
  237. lea di, offset showms  x( j' s# x0 r
  238. mov ax, 0b800h; @* u8 v, v( A, k0 f2 D
  239. mov es, ax5 ~( {4 B3 f; M+ I+ E- h8 U! W% A" u
  240. mov si, 0
    . {1 U2 W3 x! }3 a' P8 Z7 P4 T) @: D
  241. mov cx, 480
    % f, ]- ^) K9 w7 V' A8 k' ^9 Q  _
  242. mov ah, 07h
    ' m8 ~! X% O# H4 ^
  243. @@:; Q$ Z" R# T0 X) w6 ?7 N8 b0 D
  244. mov al, 20h1 J0 ~* b2 F! h) n6 Q2 G
  245. mov es:[si], ax
    & {; R" q# y* l  a9 Z! G9 N& a
  246. add si, 2/ c1 A3 x; D# s: P! `& _2 @/ a* Z
  247. loop @b
    . e# g9 s5 h  e# k% j
  248. mov cx,8809 Q( g' M# A- X) @% C9 S0 _
  249. @@:* s. d/ y6 p) k+ B7 T! ?
  250. mov al, [di]. {3 u+ i7 ?; X9 [0 d4 R0 Z( e
  251. inc di
    - u4 C8 B4 t1 X7 S% _+ F" i2 S9 K& l
  252. cmp al,20h
    & \% p- {% s3 q+ F( \$ _7 I
  253. je showch1
    2 h, r* T7 h. t3 Y- m- S
  254. mov ah, 17h4 q; g7 U) Q7 C( m+ e( l
  255. jmp showch3
    0 _. X# N+ M6 A2 o
  256. showch1:6 L# `% L/ A$ X7 y5 u
  257. mov ah, 07h 5 R( O# T" j( t: R2 a! B9 t
  258. showch3:
    % W$ x! K% r4 C2 O/ L
  259. mov es:[si], ax( B: S( X! |& H- H8 N
  260. add si, 20 a# z( g+ Z% ~7 Q7 R9 y" i9 D
  261. loop @b
    0 w# T( O; A/ w  c  l, {: G; i
  262. popa
      d* r2 j' u: l" L8 |! n- @
  263. ret) l' e+ P3 |+ F: v
  264. showmsg endp& q0 ^; M. {2 m! Z- Z

  265. 7 \1 T. t5 u# O9 i) j( c% m7 l2 o
  266. oldint proc
    7 G& G) m& \5 \) m* p
  267. pusha
    - }1 c1 K& \3 C  X  ?6 q, N3 H7 ~
  268. mov ds, word ptr cs:[old331]4 W! m3 Q/ B. q2 e
  269. mov   dx, word ptr cs:[old332]
    9 p# v( J2 Q. l# i9 G
  270. mov ax, 2533h
      ?( A* ~+ ]4 w' O3 L# T: L' y: H
  271. int 21h: k2 ]: [2 c) ?' s: {
  272. mov ds, word ptr cs:[old741]  [" R0 I8 N# F5 v$ Q) o) v! W
  273. mov dx, word ptr cs:[old742]
    9 K+ L) P  Q8 Y/ w+ t
  274. mov ax, 2574h" y1 ]. Q3 f9 L5 X- x) M& \
  275. int 21h
    " Z: Q5 G# \0 t% K- z
  276. popa
    * T. ]9 m& X! ^
  277. ret
    ' Y8 A2 ?& x. m
  278. oldint endp
    2 a$ g) n- B: y3 `

  279. ; ~; L6 @: w3 M& i
  280. memmouse        proc" s! j: j  r5 [+ ^8 }
  281.         xor     ax,ax! K' m# m3 Z! q- f7 v1 T5 B
  282. int 33h& i* v7 O& W2 D/ ~
  283. cmp ax,0ffffh- a7 z" Q9 r4 [: U
  284.         jne     not_loaded
    : D& ?. ?$ [4 s* j! J# m+ t
  285. mov [memcopy], 1
    ( `0 ]5 H) E  j" M
  286. ret+ m% o( C  `) H4 i2 X! o, D( Y
  287. 0 i/ c+ l& M9 e- v
  288. not_loaded:8 i0 o* b5 y# W2 {/ G, ]! |0 S

  289. 0 _  m# S! L0 m( W: ^, C
  290.         mov ax,2574h: H7 y* r1 e* F( G3 l
  291.         mov dx,offset new_isr: ?" v6 G5 P5 d9 M
  292.         int 21h
    7 p: {+ s6 J3 b) d4 E  M

  293. 6 V. X: @8 X3 h7 ?/ u
  294.         mov ax,2533h7 g  t3 y0 u7 c
  295.         mov dx,offset new_33
    3 S1 ~: }, `/ u" Y3 N" P, L
  296.         int 21h3 h, y* w! a5 t( @5 V
  297. " ]- p; c1 i2 }2 B% [+ m
  298.         cli
    ! B; a9 Y, s- g9 j) I

  299. ; }# ^5 k8 S. _
  300.         mov bl,0a8h/ v- X  q5 j0 ]& t5 S
  301.         call keyboard_cmd
    # s8 K' J0 ?% v, N7 S( [; M
  302. ( o; e9 C  C% X- ]  L  X
  303.         mov bl,20h
    " Y+ J4 l3 y+ ^) g! a* g
  304.         call    keyboard_cmd9 i& c' x) e- M+ E' a8 K+ w& S
  305.         call    keyboard_read. R8 k5 [2 k( @% |
  306.         or      al,21 H- v& F: n% p* @0 @4 z
  307.         mov     bl,60h; e. L/ S7 H$ @
  308.         push    ax
    + g6 ^! ?( h( t* M
  309.         call    keyboard_cmd
    3 W# I- E  e2 e$ r9 W) p
  310.         pop     ax9 r3 K, z! B$ p. `( L- v) g* a
  311.         call    keyboard_write3 |" z: N& b1 q* o0 l& r

  312. 5 W$ K0 }; b/ t; k, \
  313.         mov     bl,0d4h
      x/ R% B; F; C* `8 R2 j
  314.         call    keyboard_cmd
    : J% u% q6 o: P: Q  h
  315.         mov     al,0f4h
    ' |( N" G8 c9 C: Z( p6 H8 Y4 y; y
  316.         call    keyboard_write
    8 G. u7 ^- J" e" g
  317. % v6 `9 @% ]! X8 Q. F
  318.         sti' l  H. H) i: P& o" w5 l
  319.         ret& S& B& d( G+ A3 [8 s: N8 \1 m
  320. call_user_isr:
    4 t3 @# |6 Y' N2 _: ~: P
  321. db      60h; I' x7 W, Y% E/ J  d
  322.         mov     cx,cs:[pos_x]0 ?9 d8 Z- ?& ], B. k* v
  323.         mov     dx,cs:[pos_y]" a1 e; @+ P$ y
  324.         mov     di,0 ;cs:[x_move]
    ' o: ?6 t4 ]) q
  325.         mov     si,0 ;cs:[y_move]
    . r( p3 ^/ W7 o% O# t  x( ?. l; u0 ?
  326.         mov     word ptr cs:[x_move],0
    4 m$ A3 {7 I  \1 t. `' g
  327.         mov     word ptr cs:[y_move],0( F$ {7 Z2 J- |  j
  328.         mov     bl,byte ptr cs:[buttons]
    / y2 d5 l, W, K+ c: q* i) a
  329.         xor     bh,bh
    2 ]0 H& k) E* [8 J8 m
  330.         call    dword ptr cs:[user_subroutine]
    - u% u$ _1 S) K) G" T9 m
  331.         db      61h
    & H$ g* e5 Y0 R; m/ N
  332. ret$ X2 D  s1 }( x0 Z5 Z
  333. new_isr:
    2 f% ^+ [4 P8 F' l/ y0 R" o; h7 U2 X. h* j
  334.         pushf
    ' Z, K3 L9 _2 X/ h7 Z5 s
  335.         cli& ?* {; R! N6 y" P
  336.         push    ax3 Q* w& ^& A; F8 O8 r
  337.         push    bx4 y" h+ e8 s: W! M: f
  338.         push    cx) [5 W' W) N' {2 s! L. b# B1 F
  339.         push    dx$ W) }# N( E. ?* ~2 T8 M
  340.         push    di- M5 o3 h+ {& ?+ q8 P7 V% t
  341.         push    si
    6 g2 z; [' }' U: b) |8 _
  342.         push    es
    3 l* Q! _9 c( n& z
  343.         push    ds- X1 O" M, {3 J- ?* o
  344. . |7 K$ s9 r% a) R9 _$ _# f
  345.         push    cs- y: }2 q8 [9 d' \, @2 Z, q
  346.         pop     ds
    & d  v% A% n5 |! V

  347. 6 f  C1 T4 }6 y6 e  a7 O. O
  348.         mov     bl,0adh
    ; y2 g& e4 M& `: s9 M
  349.         call    keyboard_cmd) R* j4 P2 Q! \: R9 t: B
  350.   K4 a" z1 }, W& n" x
  351.         cmp     byte ptr [first_time],0
      U. ?7 P3 E  Y- t& O* W' y
  352.         je      not_first_time
    ! ~0 ?9 D5 }" F' ]

  353. 1 Z2 {1 F/ Z4 t) O4 i, o% E9 X
  354.         mov     byte ptr [first_time],04 g0 a4 q1 Z  }5 I
  355.         call    keyboard_read3 r) G& n- T. |# K. y: }
  356.         call    keyboard_read
    + q0 r4 V7 g3 Z1 o9 I" G* v( K# g
  357.         call    keyboard_read
    . {6 L- K: \; C# \
  358.         jmp     no_show  f/ u- T  w. [
  359. ' f2 c( [7 z3 w5 s0 {1 I8 B
  360. not_first_time:
    " J1 a8 x4 K/ V6 }; @# E* S
  361.         mov     word ptr [temp_mask],0% n: {/ I: t/ G& h2 A0 f
  362. ( v* w# `) O# ~" R  p. K5 Z
  363.         mov     cx,[pos_x]
    & E9 l0 ]+ v% T) u
  364.         mov     dx,[pos_y]
    ( n$ `5 g) s- M6 [& @0 S5 G

  365. ) [$ d7 G4 A* L; R) q8 v
  366.         call    keyboard_read* S0 N8 [3 j$ B
  367.         and     al,7 ;36 v, P4 _% S3 V" n
  368.         mov     ah,[buttons]8 R: x2 J( y& A" S3 F, W
  369.         mov     [buttons],al
    . a! {8 x5 w# Z- ]% g) K
  370.         cmp     al,ah' q8 [) v" L0 M- [* c: R! r
  371.         je      no_button_change% N. ~/ L2 h$ A" |% {5 N! k
  372.         and     al,3. C/ ?( Y; D+ m& E; K, @- ]3 H4 d
  373.         and     ah,33 `. R6 o( O& w5 D7 l
  374.         xor     al,ah1 i! t' O$ P+ e% w& S1 l
  375.         xor     bx,bx1 V2 [' P. G% w, m! {

  376. * D  L/ s! u! f0 ^: l9 s* q
  377.         push    ax
    5 M; {( F! G: o, v& i7 h/ B
  378.         test    al,2' K3 `. N  m% e/ k- L# s( [) M& e' ^0 e
  379.         jz      no_right_button_change
    0 ?7 s$ y0 s8 r9 T! U# f; P6 z/ h0 c, e3 U
  380.         and     ah,2( h( h  B  \1 S; o/ X7 L
  381.         jz      right_button_pressed' p& g. i- ~, {, J
  382.         or      bx,16
    6 ]7 Z# W* ^, r' s3 f' q
  383.         jmp     no_right_button_change
    3 n9 I/ Y( b$ J' {/ `7 M9 T3 _
  384. right_button_pressed:7 C6 j8 x# Y' M9 q. P2 O
  385.         or      bx,8& R1 P. F7 Q/ V6 h
  386. no_right_button_change:
    / y& X$ a5 B! B8 V; L$ P
  387. % Y, w* C6 I3 i0 ?/ ^8 P/ v
  388.         pop     ax
    . W; T+ X' ~, N
  389. 1 k& D. N6 Y/ d9 ?
  390.         test    al,1; F8 p; }# E' y
  391.         jz      no_left_button_change
    : `( q4 R# Z4 k$ w1 i
  392.         and     ah,1
    - G: h/ ~" c7 m; z3 R6 j
  393.         jz      left_button_pressed% }$ H$ B. V1 D- b3 ?5 v9 @3 h
  394.         or      bx,4- u/ s6 t$ u5 H# f
  395.         jmp     no_left_button_change
    " o, Z) Z) y0 W; H- ?: F7 |5 O0 _
  396. left_button_pressed:
    ( L. ^6 z1 p: p6 _6 }  W+ t, G2 x
  397.         or      bx,2
    $ j) E: W+ C6 v4 a" w' G5 S
  398. no_left_button_change:1 h# z( L/ i' N

  399. 3 n" g- `8 U5 y) ^' k. c, I
  400.         mov     [temp_mask],bx9 G& V4 E# W4 C' q" |) Y

  401. / k! a5 ]* o1 d: c; v8 M
  402. no_button_change:
      r+ N. k) ^& M% p8 h
  403.         call    keyboard_read3 Z, r! z4 X6 G! W1 n! J+ m
  404.         cbw8 r' M6 u) Q1 N+ T
  405.         add     [pos_x],ax& J" B  ?6 C& X8 v
  406.         add     [x_move],ax! J1 k8 @+ \' Z0 E
  407.         mov     ax,[x_min]7 r$ _: x; s. N
  408.         cmp     [pos_x],ax
    " v& t7 E8 ]/ X3 S. F( E; v
  409.         jg      good_hor17 |" c8 Z0 U1 C3 I, c
  410.         mov     [pos_x],ax
    2 L/ J" a( e% P" ?2 ~( t
  411. good_hor1:6 v" s/ L2 N  U; l
  412.         mov     ax,[x_max]8 p. ~6 B/ B, i6 a
  413.         cmp     [pos_x],ax
    8 {$ V) y, u" D% Q+ ]
  414.         jle     good_hor2; n& g# M; `3 _/ ^2 I! o
  415.         mov     [pos_x],ax& W" j$ X* K- {' x* ~" x7 I6 I
  416. good_hor2:# q6 [" K. L0 Z4 y. O  z; [

  417. + Q2 X% c4 ^: I. q) x  @$ W
  418.         call    keyboard_read
    2 J; r: O, Q; @0 |
  419.         neg     al" ~2 e; N* r  N" @
  420.         cbw5 b, y' U) X) ~  ~. @
  421.         add     [pos_y],ax( j% H: [0 {% _% @  ~% S
  422.         add     [y_move],ax0 }6 p, {1 _4 F% g
  423.         mov     ax,[y_min]
    : N: C  B' {" t" Y$ ^
  424.         cmp     [pos_y],ax
    % x: o/ Y# T# I# r  ^
  425.         jg      good_ver1* t1 H) x, k. F
  426.         mov     [pos_y],ax
    1 O; r0 K3 ^* E4 R, i  n6 x- Z
  427. good_ver1:
    ! h$ W; B( n7 c
  428.         mov     ax,[y_max]0 F% x$ X; K; z9 t! L! o1 C# d4 |
  429.         cmp     [pos_y],ax
    % e( l0 w  {! @7 Z' @! R" e* [
  430.         jle     good_ver2
    2 S0 N( E( q  ^6 i8 ^) X
  431.         mov     [pos_y],ax
    / j2 g+ P; _- C: P* Q
  432. good_ver2:9 `9 C4 u2 J9 K8 \

  433. 4 @2 d+ g# W* z& X
  434.         mov     ax,[x_move]
    1 X% `5 h, V9 H1 l
  435.         or      ax,[y_move]1 u5 i' q9 O# I& j! u0 c
  436.         or      ax,ax7 q4 L" j: P' E# g( O0 G; ]
  437.         jz      no_change_position
    ( h/ H' m/ S3 W8 Q3 [4 @
  438.         or      word ptr [temp_mask],16 p. C+ f% E+ }5 ^( w
  439. no_change_position:
    2 h& e1 l6 ^3 ^% w9 D& J" q

  440. 6 s; X7 U4 I; P
  441.         mov     ax,[temp_mask]6 H$ v, ^* W' g3 `. C+ V. u
  442.         and     ax,[user_mask]
    0 f  P$ q% D8 @7 \: u& w' b: K- s
  443.         jz      no_call_user. G9 `7 c7 M; d2 w3 Y% {
  444.         call    call_user_isr
      h4 R8 U- {! A# p! a' R
  445. no_call_user:
    # e' s+ ~& X# r- t# M( D
  446. ' c. M( }! C/ b: Q9 ~
  447.         cmp     byte ptr [sm_flag],1
    " o0 n  I( |% H/ R. e8 R
  448.         jne     no_show
    + l  v7 Q+ P4 g$ h$ ^9 i# ?
  449. 5 }, ]( }+ ]# c; n- E
  450.         shr     cx,3' U+ s0 _7 [: L5 q" C; w  G; K4 o
  451.         shr     dx,3
    3 ^8 K( R6 N! P1 M2 _9 w
  452.         mov     ax,809 s4 {* l& ~' s9 ]8 E" u  }1 E0 m
  453.         mul     dl- R$ N) W/ B% m; c$ @* t# N# @4 E
  454.         add     ax,cx
    ! H: `- H  X; ^' P+ |- X( L
  455.         shl     ax,1
    4 |% m+ }/ d3 @: _
  456.         mov     di,ax
    % {6 Q2 O5 m/ B; O+ {4 ~( \9 C8 l
  457.         mov     ax,0b800h: B# s9 h' Y" T1 g* F; z2 E2 c" O
  458.         mov     es,ax
    5 H& A$ G: O* ^( d
  459.         mov     ax,[save_char]8 Y- y/ m; V7 {0 x1 `9 A
  460.         stosw
    9 U( Y( H+ g$ X( @0 ^1 R2 Y
  461. : r! E, W8 F& T5 `
  462.         mov     cx,[pos_x]
    0 a% b1 A( B# n0 b8 N
  463.         mov     dx,[pos_y]- ^$ A# D" c  J8 q1 W  @
  464.         shr     cx,3
    ; Q: T4 C4 f7 J, L" B1 s4 K3 [3 b7 W
  465.         shr     dx,35 T) O3 C/ l# j. R8 i4 p+ D
  466.         mov     ax,802 z- F% y: @6 D  {1 {
  467.         mul     dl
    ( O8 r) q8 n2 t- t! B, ^% @1 l
  468.         add     ax,cx
    6 N( N. B/ Q+ h+ v7 }2 p3 }' f
  469.         shl     ax,1
    3 [& b0 F6 {5 a# J/ `
  470.         mov     di,ax
    ! O* H4 i( @4 [5 c! Y. i
  471.         mov     ax,0b800h6 Q" t4 R* k; t) q
  472.         mov     es,ax! o* ~8 U' q% c; g8 Z/ @+ q2 I
  473.         mov     ax,es:[di]$ p) {$ U8 t" g
  474.         mov     [save_char],ax
    & n- T+ q& d' I6 Z9 y
  475.         not     ah( ]$ ^6 q, B1 a/ G. n; Z7 P0 z
  476.         and     ah,7fh
    ) I1 H! B  D) \8 n5 F
  477.         stosw
    0 r# g4 G8 G3 n9 T2 g
  478. no_show:- [; i, E) o+ i2 `0 ^0 {
  479.         mov     bl,0aeh
    5 \. T4 k0 @/ V6 l5 Z$ R: k5 f( B
  480.         call    keyboard_cmd
    0 [2 O- b$ o7 [' K

  481. ; [! n3 ~( `6 X. }
  482.         mov     al,20h) c% A9 U' L' }' a( l1 H  D# f
  483.         out     0a0h,al' \4 d6 ?! ~: J. i3 B
  484.         out     20h,al1 V& ]- K( s. U! d* e* U
  485. ' ]: ]6 B3 r1 V; ^0 G  P4 y4 ?
  486.         pop     ds; y. t4 y: I& c1 [5 r7 Z
  487.         pop     es1 M, N. Z8 r' L' N  V  K- M
  488.         pop     si/ I! {' Z! z) }( F
  489.         pop     di
    # b& R6 `) g1 g/ `
  490.         pop     dx, M! c3 p, `- N/ J3 ^  y- T
  491.         pop     cx# H- W" C* ~8 F$ O$ [
  492.         pop     bx/ H4 v. G8 E. k& h
  493.         pop     ax
    * @1 U2 Y# D1 R) r! h$ A  L7 i
  494.         popf
    + D( ?2 d1 ?. ^
  495.         iret
    ! b# I5 u! C+ J6 C
  496.   a! m- u6 x  k% e) |: S- }
  497. first_time      db      19 @4 [  w# Y5 M5 W1 B% o
  498. buttons         db      0# n9 W) m$ h) w) i. E0 U
  499. pos_x           dw      0
    ! f3 S9 U4 C# b# {2 Y1 d8 P3 o
  500. pos_y           dw      0
    : E4 x6 w9 b' A8 V$ ^! t2 P# Y
  501. sm_flag         dw      0
    0 B: ]; H3 w% s8 @' @2 t
  502. save_char       dw      0
    2 s. S- s& |6 x" D
  503. x_move          dw      0- n8 _- q- t- y8 e6 {
  504. y_move          dw      0, V, E/ f7 t7 S# A
  505. x_max           dw      639- e0 c' k5 X  A& N) m$ @! h0 [# g( q
  506. x_min           dw      0
    6 E) F. g7 t1 o( u' M5 S' w
  507. y_max           dw      199
    $ k4 J" F: i& f' V: h5 U3 `
  508. y_min           dw      0; Y( i  w! ?. K3 B5 R. L4 ~. @
  509. user_subroutine dw      0,0
    - l- [0 I6 Y; b; y& Q$ Q
  510. user_mask       dw      0+ a4 n. ?! S5 i; j0 Q
  511. temp_mask       dw      0; b: e; P! m2 F% t% o# l
  512. 8 q1 j- s- G# c+ ]3 ]
  513. keyboard_read:
    ; c& p7 C3 _9 h6 `9 M
  514.         push    cx
    * y8 n! ^; _7 ^
  515.         push    dx
    ; t. q8 l, [5 [
  516.         xor     cx,cx" m5 S& m9 g1 n) F( ?6 S) P- U
  517. key_read_loop:6 C6 M) @( U" s
  518.         in      al,64h" f% _4 o; Q% a7 s
  519.         jmp     $+2
    9 _; t0 c2 \6 m2 D1 C( ]* b
  520.         jmp     $+2
    5 l! Z7 A5 P# e' f4 l
  521.         test    al,1
    9 l/ ^; X) o: N* o& d6 T! D; y
  522.         jnz     key_read_ready3 X7 X7 _3 R. _6 ?
  523.         loop    key_read_loop
    $ ~0 V# @2 @1 i8 x% U0 G
  524.         mov     ah,1, q. M/ M: k% C
  525.         jmp     key_read_exit6 {) L8 b% g& h5 s3 j
  526. key_read_ready:
    % p0 r: M3 L8 K- A6 A8 O) K, R
  527.         push    cx
      c+ C2 r1 T1 F: O6 e' v2 S
  528.         mov     cx,32
    - |! I) F: k; L, X
  529. key_read_delay:( U9 T: ~5 H2 I' u2 x% A
  530.         jmp     $+2
    8 x& `$ f+ }0 C: c' L
  531.         jmp     $+2
    ) G1 x* B3 M3 w1 n' H
  532.         loop    key_read_delay+ m. h0 [/ e( S0 f' {* {
  533. + G( z* H8 h6 c) H
  534.         pop     cx& v/ D' ?/ X7 s5 ~8 s

  535. 8 D( d) o! t& }5 M7 r& j
  536.         in      al,60h
    3 ^3 B" r+ C4 R
  537.         jmp     $+2
    " ^5 d7 X, z1 o' v
  538.         jmp     $+2( d# l9 W0 \2 |( ]
  539.         xor     ah,ah
    $ \- G9 S' P& I3 G% F9 \. ^. c9 e
  540. key_read_exit:
    6 P; X2 F- J# h0 R% o7 I6 T1 P* `1 P
  541.         pop     dx$ E- J2 ~' K) X8 m0 e, o
  542.         pop     cx4 r6 s! S0 P! G8 B, B
  543.         ret
    2 |4 G+ h0 Y' j  L$ z( g
  544. ) n& P) w+ z$ }( ?# x1 ]1 R, p4 [
  545. keyboard_write:
    ( U: z9 C" y5 J) Z/ A. n$ ~
  546.         push    cx# K, c# X+ O8 j" e0 ~. s
  547.         push    dx! i# H; Y: y! X  b$ p& M6 C' j
  548.         mov     dl,al! a( z6 S% F7 v  N" e
  549.         xor     cx,cx0 R2 H7 o& X) r
  550. kbd_wrt_loop1:: E9 f. o; @6 r& ^  a
  551.         in      al,64h
    ( Q7 _% ~6 C( e! v7 N
  552.         jmp     $+2) Y; E# T5 A% `( H
  553.         jmp     $+2
    % B6 z! `, b1 K4 [# a6 T
  554.         test    al,20h
    , b% S" j% p% ^7 h) w
  555.         jz      kbd_wrt_ok17 d0 c! W/ p  k$ p
  556. 0 r) d8 C# G4 D+ C
  557.         loop    kbd_wrt_loop1
    ! _2 y7 j+ y  I/ k0 ?+ u* b" f

  558. 4 T6 F! Q3 c+ O$ C6 t
  559.         mov     ah,15 R2 N3 ^% L' L+ K' Q; g5 T2 P
  560.         jmp     kbd_wrt_exit
    + F- w8 U; w0 P9 m, C! ]

  561. ! Q* B, L  q1 b6 P8 u
  562. kbd_wrt_ok1:( @0 J: `" ]9 R5 o& Z5 Z
  563.         in      al,60h
    8 t# \2 O" @6 l  r

  564. 8 h5 ^" c. e# X& j
  565.         xor     cx,cx
    # _4 K8 y7 P& W3 k
  566. kbd_wrt_loop:8 s, o9 P& l. h* _/ z# u8 {, a$ o
  567.         in      al,64h3 w! b5 v' h5 N/ I" l- P# \' Y
  568.         jmp     $+2
      ^0 b0 l1 }+ U( p
  569.         jmp     $+2
    ' m' u, n$ _% m0 ]8 \8 g0 x+ V
  570.         test    al,2+ Y( z3 h  i% Y
  571.         jz      kbd_wrt_ok) m2 m8 X* F( x0 T* M0 \

  572. % _9 J4 [# p# N7 o/ `
  573.         loop    kbd_wrt_loop
    0 C/ V6 q# O9 r) B2 X

  574. 2 D2 W1 e- M: Q, o5 e# f% e0 L
  575.         mov     ah,1
    5 j( `; G9 H% A- s0 Z$ T4 j- A
  576.         jmp     kbd_wrt_exit
    + @9 D) K: j  F( x9 ?% t

  577. ) }; M! d9 r: B6 j$ H  K
  578. kbd_wrt_ok:& [2 I6 p6 D- C/ M. f2 F! @
  579.         mov     al,dl
    6 E( o7 h2 \" z2 c
  580.         out     60h,al
    ( A9 U; D( C( H: l
  581.         jmp     $+2, a/ o% Z( \; o1 r4 f. L
  582.         jmp     $+2
    - ?# _2 @8 Y3 r& I# `
  583. : L/ U3 a% |2 c, m
  584.         xor     cx,cx9 n5 O# i) [7 s" G+ f
  585. kbd_wrt_loop3:
    # b! w8 I  K5 X, I
  586.         in      al,64h
    0 B3 r$ o+ x1 J. s
  587.         jmp     $+2
    6 G8 c4 V' k# b( k% Y- M+ S8 O+ o
  588.         jmp     $+2
    ) T. u1 }# h1 N/ h- Z
  589.         test    al,2
    2 ~# w& W' s( h! s/ F4 Z5 n" h
  590.         jz      kbd_wrt_ok3
    3 |4 J; L) f' q# m( A

  591. + f3 B6 q, p, z' q" D. t
  592.         loop    kbd_wrt_loop3) L, d  U6 S) ?+ k% ^
  593. ( \3 i! G9 \. }. z$ a
  594.         mov     ah,1
    # @+ S, u# G  p
  595.         jmp     kbd_wrt_exit9 O# A( c  O; `) s0 P, m8 T8 v

  596. & D! X+ l# t, ?
  597. kbd_wrt_ok3:
    - v* `! i$ O) L. ~' H# L5 O
  598.         mov     ah,8
    0 k* r% e; e( J1 t" d& G! ^
  599. kbd_wrt_loop4:
    , N  O/ T% H  a4 e6 S/ W4 L7 e
  600.         xor     cx,cx
    6 M1 I9 f4 ]' V3 d5 w" d8 w
  601. kbd_wrt_loop5:
    & f' ]  q# m% a$ Q, D. g3 a
  602.         in      al,64h
    2 ^2 ]* A& z- ^# n3 |2 g# |% d) A
  603.         jmp     $+2
    ( Z7 q/ ?# ~8 O# j# t
  604.         jmp     $+2
    : n1 Y  X$ w5 s- Y( A$ J
  605.         test    al,1/ r4 ^/ g% Y  k, Z/ F
  606.         jnz     kbd_wrt_ok47 o' [) X' W9 ~' K  W: |
  607. ' d, N9 q' B1 w2 i- f
  608.         loop    kbd_wrt_loop5
    ' {0 w2 J1 C% f4 N4 r8 {

  609.   Y* n: e0 H" c2 d) y" `1 o  X; P! J7 D1 p
  610.         dec     ah$ @' p, D5 S  j; r' L
  611.         jnz     kbd_wrt_loop4  `. D% h6 \3 q" C* o# E
  612. " _% H- a1 ~4 q4 S0 w8 j5 F
  613. kbd_wrt_ok4:
    0 U# E8 h. T2 x2 ?3 ~. Z
  614.         xor     ah,ah& X# k5 j. ~$ z9 ?
  615. kbd_wrt_exit:: c' j* g3 O! S, ^  ]1 d3 r. x
  616.         pop     dx/ {  D/ u' ~9 Z4 k7 i' T; h1 x
  617.         pop     cx7 B) x% Z" k3 R
  618.         ret) b( m. v( {6 n) |9 ?4 B
  619.         
    / ], F, q; ]  X) G" F8 ^2 K
  620. keyboard_cmd:1 T: q: M4 x0 f! D
  621.         xor     cx,cx+ c. P, s1 l6 i8 S* o7 w9 t6 U
  622. cmd_wait:5 h/ r$ |$ S) g5 S4 Y( H8 f" S
  623.         in      al,64h: ^: V0 l0 O" y2 T
  624.         jmp     $+2
    5 C: [7 F/ p  f
  625.         jmp     $+2
    5 q* d& N9 b) J5 [4 @8 u
  626.         test    al,2
      }: m+ t+ s9 j
  627.         jz      cmd_send
    ) W( Q1 M, ^! F' u; h' ~
  628.         loop    cmd_wait' H; o7 W' S; w4 u! L
  629. 1 c+ E# l5 Z; z; M- B
  630.         jmp     cmd_error
    ; x1 v/ \. m) K1 C% \
  631. 7 i# C& ]$ z$ j2 E9 \# W7 O
  632. cmd_send:0 d+ k# L4 g  d  C! X: G. g
  633.         mov     al,bl
    6 w! \. s, H% l0 D1 p& w. k* _
  634.         out     64h,al1 B- W8 Y2 u) a, t& A9 \1 X* Y
  635.         jmp     $+2: ~* z' \# K0 X( Z
  636.         jmp     $+2! c( K0 K/ Y2 L+ w+ @+ W
  637. 2 g% L1 m9 P" v  j. x! L/ h( I
  638.         xor     cx,cx
    ! E* a" G* d6 g8 c. _
  639. cmd_accept:
    , P, r+ b" _# f3 K0 N! {* F
  640.         in      al,64h
    4 `: c/ w8 o& p, v3 w
  641.         jmp     $+2
    ; q7 X$ s: Z7 Q. k, T  ?
  642.         jmp     $+2
    4 E3 o6 z0 C8 A! }0 d" v/ Z# ~" w
  643.         test    al,2
    , L3 k0 L5 b* L$ Q% h) f! Z) S
  644.         jz      cmd_ok; W. R& t  w- s
  645.         loop    cmd_accept$ K! ^, w& P% Q& t. q5 c& S
  646. 4 [1 ~' X" ~, L; U% y# f' M1 }- t
  647. cmd_error:
      l. E8 e5 `) n# ^: |
  648.         mov     ah,1
    3 Y8 p: J. g/ R) m9 M! w# V
  649.         jmp     cmd_exit# Z+ k2 \: C8 K- P  E
  650. cmd_ok:( n" a( L, ^- E2 T' X
  651.         xor     ah,ah
    & R( x3 p! L" P# w3 u- T5 T
  652. cmd_exit:- @% f' X# \, J5 _4 ?& P7 T
  653.         ret" i3 R( W' O! l" ?6 K- b  @0 G

  654. ! S8 @' I3 ]8 b& g3 a7 q' E
  655. new_33:$ e7 _8 Z4 d% x6 }, u
  656.         cli0 n; P6 t6 l' k3 l
  657.         cmp     al,0
    $ D$ b! a- e- Q
  658.         je      reset_mouse
    8 `1 r# R" j1 [
  659.         cmp     al,1% C/ e2 ?$ E3 i& n$ ^' v
  660.         je      show_mouse
    8 |% O4 r2 B# _) U& _
  661.         cmp     al,2
    ) R  L% s/ s  \3 U" |
  662.         je      hide_mouse4 _. p' ]6 Y  P* i4 X) Z1 n& z
  663.         cmp     al,3) ]3 j7 H' p  w* ?
  664.         je      get_pos
    : F4 _/ F! p8 k. x6 m
  665.         cmp     al,4- i/ [: ~! Z: f! [& P( m
  666.         je      set_pos9 S; i% T# N0 o" ~( I, X# T
  667.         cmp     al,7& j- V/ T, c# B2 r( M
  668.         je      set_hor_pos
    ! |  ~5 Z, |/ {0 S; ~
  669.         cmp     al,8
    ! S8 s( s  r9 o+ N0 p2 c2 h# W7 \
  670.         je      set_ver_pos
    ' V) g4 G9 W# `! B7 m# i& R
  671.         cmp     al,0bh* t6 Y) w5 B# [) K, o" Z
  672.         je      get_mouse_movement
    6 a9 j) K$ W& y5 J+ V
  673.         cmp     al,0ch2 w1 t3 O: M; @: _, W. c% Y$ h" q
  674.         je      set_subroutines, X/ i8 I7 i; @
  675.         cmp     al,14h, j# N' E7 C1 w0 r
  676.         je      swap_subroutines
    - j. w+ ^0 N$ p! Z+ R
  677.         iret! X& P9 V: g# _( K/ z
  678. 2 ?  T: {8 N1 K% Q" d
  679. reset_mouse:
    ; I: b8 D0 g5 e7 X+ ~% l
  680.         jmp     _reset_mouse' s, k! m8 o; ^2 m$ q" U
  681. show_mouse:
    # [0 G) E, ]$ w
  682.         jmp     _show_mouse
    ( h/ w& a9 W) j5 J8 x
  683. hide_mouse:
    1 D  t0 R* k2 |( c
  684.         jmp     _hide_mouse
    # D" j( Z; k* |- I! Q# S+ u
  685. get_pos:
    7 ~/ D9 n- N9 l( G6 I# W( ^8 J
  686.         jmp     _get_pos
    * V2 k0 m4 v- l! p: o0 d
  687. set_pos:( m. F+ r* ]$ P0 ^8 X" {
  688.         jmp     _set_pos
    9 a. Z! K. H" V. d# [, S9 K  h
  689. set_hor_pos:0 G* P2 g. p: r4 ^# f
  690.         jmp     _set_hor_pos
    ' c) T7 O$ H, ]9 f, Q
  691. set_ver_pos:
    ' T& c) X4 Q. Y8 Y
  692.         jmp     _set_ver_pos+ S  M( y6 ~! R/ P6 ?
  693. get_mouse_movement:/ \' j2 U7 u: }
  694.         jmp     _get_mouse_movement
    3 e1 G& c8 b! q5 K6 |/ n* \
  695. set_subroutines:! Z/ Z2 \, K# T; D" e- a7 A
  696.         jmp     _set_subroutines* X. |2 @7 ~5 M- D: |  H  b9 v+ j
  697. swap_subroutines:
    . r: o! x( \! d' |! D3 Y
  698.         jmp     _swap_subroutines8 ?. s! s- B. s6 _+ v' v

  699. ; x4 R- O+ b9 m( M0 j8 O/ r
  700. _reset_mouse:
    ) j4 |3 V, L5 Z, y- J
  701.         mov     byte ptr cs:[buttons],0* Z5 U7 w* D' y% _" ^, c
  702.         mov     word ptr cs:[pos_x],0" |) e$ z  `! q( K" b' B  T
  703.         mov     word ptr cs:[pos_y],0# Z( }" z1 k1 M) ?0 q5 y
  704.         mov     word ptr cs:[x_move],0
      g9 e  s: [; a; y+ I: J: C
  705.         mov     word ptr cs:[y_move],07 P6 @* h5 Q+ d6 W2 x* Z" }7 {0 J
  706.         mov     word ptr cs:[x_max],639$ E. m' w+ z8 H2 Y3 p8 P2 t& h
  707.         mov     word ptr cs:[x_min],0# ]. R: u8 N. }: m
  708.         mov     word ptr cs:[y_max],199
    " |$ |! Z$ d4 e1 g1 R1 _4 ^- O
  709.         mov     word ptr cs:[y_min],0$ d' Q7 w6 \$ \7 U
  710.         mov     word ptr cs:[user_mask],0" g) ?. C1 L' x" w+ }- f& P
  711.         mov     word ptr cs:[user_subroutine],0) a! d: n& P6 P( U3 X* N6 U$ p
  712.         mov     word ptr cs:[user_subroutine+2],0
    ! ^7 R  R, O! A4 t8 Y& n+ x$ {
  713.         mov     ax,0ffffh6 q, J4 ~  _1 h; U' [  M
  714.         mov     bx,3
    " ~; T: T8 g+ M! Y* P6 |0 L4 E
  715.         iret6 ^4 v% |$ j+ C5 S2 O3 g7 w5 Z
  716. ! f2 u) h  w/ Y4 S- V7 J# G
  717. _get_pos:5 t$ i. j% S; k/ ^$ X$ Z1 a
  718.         mov     cx,cs:[pos_x]5 ?% U: V7 O& A" C( f. I4 V
  719.         mov     dx,cs:[pos_y]7 e  K' f3 B  N# P6 u4 N) `
  720.         mov     bx,word ptr cs:[buttons]% K- a. w) Q8 J/ s! G- Z
  721.         xor     bh,bh. C* U( j3 E, w8 Q! F0 t( B* j
  722.         iret$ H+ s: X4 F" g

  723. 6 X! u$ h+ o: k0 B( }8 @9 |
  724. _get_mouse_movement:7 `' ?: e( p0 e, p
  725.         mov     cx,cs:[x_move]
    6 X/ m! m: d! B, S, m) I& l
  726.         mov     dx,cs:[y_move]
    7 I& d1 X  e# ~- i: L  s! n2 K/ X9 e
  727.         mov     word ptr cs:[x_move],0
    % B+ k7 Y- V: O( O- }* ?
  728.         mov     word ptr cs:[y_move],04 c4 a$ |( A6 j. t9 ]
  729.         iret
    , [9 ^  W. k4 m
  730. 9 V" x. B9 f& z4 {- h) ^
  731. _show_mouse:
    2 R* h' \& g7 r  d
  732.         push    ax
    * C' o* J- G$ x  C
  733.         push    bx. Y/ y( N  D0 d4 y) A# Y2 L
  734.         push    di* ]$ }* w' V/ y0 O0 l6 H# U
  735.         push    es# x! M1 o" f. T1 f, I; `
  736.         mov     byte ptr cs:[sm_flag],1
    + E/ a5 K- n: y2 u# E
  737.         mov     ax,cs:[pos_y]
    : `3 f3 ~3 \6 F6 c+ E9 |' f
  738.         shr     ax,3
    / b, X& }& m% g) Q+ {
  739.         mov     bl,80- |$ s* N0 g: }6 w3 S
  740.         mul     bl8 x5 ~6 P8 j2 F; Q: b* A) ?7 q+ P+ |
  741.         mov     bx,[pos_x]% p2 g/ D( b, S4 \& O, V$ R
  742.         shr     bx,3) u6 ]. c* F# Q6 a7 F
  743.         add     ax,bx
    " M1 }* A) Z+ Q6 n# V: n3 `8 L6 |/ ]
  744.         shl     ax,1
    $ h& A1 U% l: @$ l3 n( @
  745.         mov     di,ax
    2 T5 t1 i( Q7 `* @" s
  746.         mov     ax,0b800h
    6 S0 w+ }; z$ H( U/ z& o
  747.         mov     es,ax' y& G9 w6 w  J/ R1 O6 }1 D
  748.         mov     ax,es:[di]
    " B- W$ D6 t+ i. h- q! Q
  749.         mov     cs:[save_char],ax
    & n$ f2 @: q0 j6 I
  750.         not     ah
    : E5 ^: \2 c. y4 v! ?
  751.         and     ah,7fh
    ! W' t8 q3 A, W+ F( N# f
  752.         mov     es:[di],ax' i7 A# m* h% X. y) l
  753.         pop     es
    - v' I$ S- d8 p- |5 s: x
  754.         pop     di
    ' b( _0 N% g$ o" t
  755.         pop     bx6 h4 Y# u3 d* B6 b4 ~! x! T( C
  756.         pop     ax
    $ j: r% s- K, x) f6 m# w! Y
  757.         iret
    & m0 G' X5 z% B( i( o' {, b

  758. # S6 J' H  w4 b4 b) g# v, B9 f9 q
  759. _hide_mouse:
    $ h9 F8 w0 U0 ]4 B. w
  760.         push    ax
    # B$ S6 S2 t1 S7 n
  761.         push    bx
    6 v2 r* o/ B9 |
  762.         push    di, m; Q$ q& d  K( u& R# r: S/ P6 u
  763.         push    es
    # f% j$ d; Z; X: S' I5 q  m
  764.         mov     byte ptr cs:[sm_flag],0
    , G0 Z0 z$ Z+ [
  765.         mov     ax,cs:[pos_y]
    / O, A$ \' M/ {, t. Z6 Z: O
  766.         shr     ax,3
    . E% o6 i2 O* Y% o# o& [
  767.         mov     bl,800 q2 i: h' ^5 h. z5 A
  768.         mul     bl3 g  I. n( ]* K) h! T/ X8 H7 R: l! o
  769.         mov     bx,[pos_x]( f2 G$ S: b  M& i4 v' x7 u' W9 [6 Y
  770.         shr     bx,3# V# O8 e0 `2 _4 v
  771.         add     ax,bx
    , `% [, m; V0 S$ |
  772.         shl     ax,1
    % p3 B2 V, ]) g9 v$ s/ f
  773.         mov     di,ax
    9 \5 S/ i9 ?- h9 F8 N* E
  774.         mov     ax,0b800h
    ( ?7 M% _; O8 C3 E
  775.         mov     es,ax% g! ?9 p, F" _& ]
  776.         mov     ax,cs:[save_char]
    4 i  q0 G9 @4 a+ ~; n5 `
  777.         mov     es:[di],ax1 R0 C! A4 r4 r5 u
  778.         pop     es
    4 D  _: S9 R4 m
  779.         pop     di5 m8 K% I5 [  `& s) u& a3 I
  780.         pop     bx0 ?; W3 J- ?' w
  781.         pop     ax" @2 M; q, V: E" i' Z4 T$ N
  782.         iret
    # |3 ^' T5 ~  F
  783. 7 {7 X0 S+ H2 l! N% Q2 ~
  784. _set_pos:
    & T/ Y) }; I# E" x* P
  785.         mov     cx,cs:[pos_x]
      c5 i' o+ D& V1 p! `
  786.         mov     dx,cs:[pos_y]
    3 L# W6 p, s1 S1 y! n
  787.         mov     word ptr cs:[x_move],0
    , @  ?, k- g) d) b
  788.         mov     word ptr cs:[y_move],0
      X% D; o# y& }( }% M
  789.         iret
      J, O+ v1 O+ y

  790. 1 y- t5 R5 P7 \% ]
  791. _set_hor_pos:
    4 y5 V0 |5 f6 q7 A' k' M! j" e4 X
  792.         call    max_min" i4 W& p6 [3 Z; H( S) B
  793.         mov     cs:[x_min],cx3 H( L4 E  b: [' p8 w
  794.         mov     cs:[x_max],dx
    " r# \$ o4 ?& ?3 Y
  795.         cmp     cs:[pos_x],cx8 G' \' m# w" i
  796.         jge     good_hor_min
    8 A( ]; ~$ H: R! G7 ?" l+ X9 `  Q
  797.         mov     cs:[pos_x],cx
    . B# ~; s, w$ ]6 }) g
  798. good_hor_min:
    * E  Q4 B$ v# s$ ^- B. c* e  N
  799.         cmp     cs:[pos_x],dx: l( c, b, }. j. h9 i+ L# R
  800.         jle     good_hor_max
    5 ~+ \' I& i$ H: v# C1 X( ^
  801.         mov     cs:[pos_x],dx/ P# {, z0 [( [. u+ E+ _3 Z
  802. good_hor_max:
    9 i% P0 l2 T/ H$ ]
  803.        iret
    : y, j( {5 \2 W4 }" C
  804. 9 i' P6 y1 o* Y  U/ k- b/ e$ N
  805. _set_ver_pos:
    + A' z4 K" n4 c6 X7 n
  806.         call    max_min' n# ?/ C& S/ j0 S
  807.         mov     cs:[y_min],cx
    $ `! v+ Z/ C' [- s, n! O$ [
  808.         mov     cs:[y_max],dx+ {4 j! \  q! l8 @4 a( h' a
  809.         cmp     cs:[pos_y],cx
    7 o) m3 a$ k; u5 W, I+ X
  810.         jge     good_ver_min
    # ^) |" f5 a$ g0 n  r
  811.         mov     cs:[pos_y],cx- v3 O5 S  B, e7 ]
  812. good_ver_min:+ `  Z" M$ b- S1 j) D
  813.         cmp     cs:[pos_y],dx
    ' f8 N  Q( H: i" `% t$ ~
  814.         jle     good_ver_max
    4 v- M+ Q0 O. O1 k7 i4 A) y
  815.         mov     cs:[pos_y],dx7 q% A! r" f2 Y) E$ m8 H
  816. good_ver_max:0 A+ m# [+ p' P! G
  817.         iret
    - \7 G) g* P1 e2 P6 H: K. o

  818. 8 s/ X& u) c$ ^# Z: z" v/ x& B3 |1 ?
  819. max_min:
    6 T- k' ^) W5 {; f9 {8 T
  820.         cmp     cx,dx% ~7 m' w% S9 p' y, Z
  821.         jle     no_swap2 n1 m. t( v3 _) u7 [
  822.         xchg    cx,dx
    ! I, W1 y+ K( x% p! b' ^/ L+ _; K
  823. no_swap:
    / B5 K, t2 U8 N5 \5 s
  824.         ret1 t' L% o* J7 R/ S  j$ p( i

  825. 9 l4 y1 Y! [5 O) b! t& a8 d
  826. _set_subroutines:
    9 ?* I& L& `; Y7 r7 ^* x. h
  827.         mov     cs:[user_subroutine],dx
    ! d" H$ I1 o/ m: {5 c3 }. J9 E
  828.         mov     cs:[user_subroutine+2],es
    2 ]9 ^1 r* ?1 X. `/ B" ^
  829.         mov     cs:[user_mask],cx
      D1 A9 R2 A6 L7 D: l) w% f7 \  L
  830.         iret
    , ^+ r6 h; Q7 X# \6 [; ^+ k  @
  831.   S4 Q  O7 U) r
  832. _swap_subroutines:4 i. f, y+ m2 T' _9 t
  833.         push    word ptr cs:[user_mask]
    * ~4 @0 \4 L; ]: k- T
  834.         push    word ptr cs:[user_subroutine+2]: ~/ P) c  b" p6 B# N, _
  835.         push    word ptr cs:[user_subroutine]
    % J( @- N* s4 u
  836.         mov     cs:[user_subroutine],dx
    " V+ _" d7 ^3 a3 `+ {3 f
  837.         mov     cs:[user_subroutine+2],es
    5 y  G5 j; Z# L7 z; Q
  838.         mov     cs:[user_mask],cx! {: ]& F& R5 r1 y3 d+ Q
  839.         pop     dx# s) a: M1 T* L
  840.         pop     es
    & ]  y7 _: \, P1 `  U
  841.         pop     cx- d* x/ H) q# G  {. {9 C. l: X( H5 u
  842.         iret
    / s3 |0 z# e9 b7 @4 |0 E3 H
  843. 1 A5 [1 g% x! P# d% u
  844. memmouse        endp6 Y6 _$ N0 Q) h/ n2 \) I, o

  845. & n3 ]- w' X% x0 G, ~
  846. endof_start:
    ) j" |+ U8 h  I# ^: j4 s* t

  847. , t9 N- O& T/ K$ C/ H
  848. emsg db 'No mouse driver install error!$'7 l; k, F2 d/ w' R0 @! a" ~
  849. old331 dw 0! u; a0 i4 R, Q4 l/ {3 p
  850. old332 dw 0) W9 O8 S8 e! b* m
  851. old741 dw 0
    / j# v) h0 g7 _) d: q
  852. old742 dw 0
    ! j; k3 h/ Q" n1 j6 S  \
  853. memcopy db 0% z- S+ W" J5 q4 X& ]1 Y
  854. okcheck db 0$ f0 r- c& f- k' j% q
  855. pass db 0
    8 O2 M+ E, `) L: A* R: I* f
  856. chkl db 0/ A& B* J- `1 J* @( O
  857. lk db 0
    . \/ f2 B2 g( ]
  858. chkr db 0* F- {1 m7 _! h, E
  859. rk db 0( M7 I1 V( p; z/ H5 _
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '; w3 v, x* ^1 n) N/ f1 ]8 p: H" ~
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    + b5 Q( r; @+ x  t/ ]
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ') a/ [# q& _, r; i( _# _; p
  863. db '                                                                                '
    5 F! v" e! c- i1 s0 u
  864. db '                                赏屯屯簧屯屯突                                  ') f' Q0 V/ y; f8 s
  865.         db      '                                ?OFF汉OFF?                                 '6 A# F7 I) r$ b
  866. db      '                                韧屯屯既屯屯图                                  '5 e* H! R/ H' R" O7 D' b! G; O) H6 C
  867. db '                                                                                '
    % O& A; G$ P2 S" ^+ B0 c3 `* [( x6 k. Y
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    $ J: c( c* L. T5 N) ^
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    % X) M( y& d$ B" J% g) Y( c
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '' m) z8 K" y  t" G8 \" a- \

  871. ; I9 n  p0 z# {- V
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
( t4 Y2 H% Z( L3 L) d哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
$ E( G9 O: i# u; Y/ D
& }1 N+ J2 I& \- \( d& @谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:17 , Processed in 0.339663 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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