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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。* V# m! H6 N) o
( f0 R8 R0 B, Q8 P9 P  V( V- v
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ! R1 \4 W  o0 \
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    " J. i, Y5 p$ S* i+ n, q
  3. ;                                         By Bini.Yi 易祝兵) K0 F/ W0 e# q. N
  4. ;                                         http://www.ufoit.com 计匠网
    4 c9 {9 @* p0 K' b" C
  5. ;                                         2002/04/06 YYYY/MM/DD
    $ H8 g0 ^  {$ Q( o0 g
  6. ;5 F2 S6 b9 Z% `8 y! j7 ^
  7. ;          ) D* a# K' n: k, s) N; j2 B
  8. ;          This program  test the mouse button  click and move.+ v: F$ _$ H4 x$ D! e( z8 X/ ^
  9. ;
    , h/ l' N) J# Y

  10. ! B. O" A4 n6 }2 d
  11. .model tiny
    1 m& K$ e! s3 s* h2 e1 T
  12. .586
    8 F8 B8 U' s, U2 X2 F
  13. .code
    8 w% ?, G% ^- |3 N) w: ?
  14. .stack  100h
    ; O! [# E2 W9 F( o# l
  15. .startup
    , T  b8 k! ~" X2 W
  16. pusha
    " k& `% q( Z4 F5 |
  17. mov ax, 3533h+ B5 D0 H( z9 R0 h# |4 ]
  18. int 21h
    3 _4 D% |5 f2 f7 h3 ^" D5 E, ]
  19. mov word ptr cs:[old331],es
    1 _( S% L& G' k0 w9 G  C
  20. mov word ptr cs:[old332],bx
    + s% |* J6 W; ~% L* h- E- d% N
  21. mov ax, 3574h& k, ~$ T. W* ^
  22. int 21h
    3 Q& ]& \* v, P! H+ N* i
  23. mov word ptr cs:[old741],es
    * t' `, l4 {7 i. h
  24. mov word ptr cs:[old742],bx2 q4 B, C8 H" M4 |) Y6 V
  25. popa8 Y7 O  d* L- d
  26.         call    memmouse; L. v2 j0 V3 @# b3 H
  27.         mov ah, 00
    % m; W# l! }8 i) v8 h, D! Z
  28. mov al, 03. n& L0 w* `" b% H% |
  29. int 10h) [$ E8 [+ @, p, c
  30. mov ah, 06
    7 [/ g9 O( F+ l7 h4 A
  31. mov al, 0% g2 u6 z4 m$ `) j! [" m) ~4 P
  32. mov cx, 0
    5 X7 \! u8 T6 X+ |% o/ }; B0 o
  33. mov dh, 24
    $ C0 `3 X- H% ~1 R) Q
  34. mov dl, 79
    $ ^' H% e5 X+ }' V( I
  35. mov bh, 07h
    - S2 }; G- v5 W1 Q& {
  36. int 10h+ q" P+ b( u; f2 b
  37. mov ax, 0000
    - L% a4 _2 |3 J
  38. mov bx, 0002  ]# d2 \4 u0 z3 y) T
  39. int 33h( A* f9 U7 Z2 r5 L
  40.         cmp     ax, 0000           ;if no mouse drive install/ |, p0 g) }( P
  41.         je      errormsg           ;show error MSG, Y  d* Q5 n$ X$ j: z  N$ e
  42. mov ah, 02& C" f* h7 @2 ?7 K9 {0 F: ^
  43. mov bh, 00/ p4 z2 W, ?5 A. P) E. {9 d2 g8 ~
  44.         mov     dh, 25             ;Move point out screen' N9 Q; l$ u. W- d; G2 u) |
  45. mov dl, 79) a2 C! A8 C, Z3 B2 V& J
  46. int 10h  l5 u' L2 y% Y+ z( {; G4 A
  47.         call    showmsg            ;Show info) Y! t: P- e; k8 l6 K7 G
  48. mov ax, 0001
    & f1 y6 n, [: J5 u. X
  49. int 33h
    ) v2 _: r. k( K+ G& T1 h0 p
  50. ; mov ax, 000ah
    # O: e% H' Y) K; ?
  51. ; mov bx, 0000
    6 V8 I8 L# V; O  g3 R4 U: i1 e
  52. ; mov cl, 0h
      _6 r" J& S( H9 n3 [
  53. ; mov ch, 0F0h
    ' k" x/ v5 q5 K5 g1 U, L. s
  54. ; mov dl, 0h
    , L3 `4 O/ U* c% P' h
  55. ; mov dh, 0F0h
    - J" E! w! Z% e+ m  a* K6 x, e
  56. ; int 33h2 v/ \# H- P0 ]4 D  v& s5 Q; j
  57. mov ax, 0004h* V. D4 s, W0 r( k7 n0 R" O
  58. mov cx, 0319
    ; W6 c4 d4 G5 I4 \3 }4 s; j" E& p
  59. mov dx, 0103
    7 _2 r2 `5 _) A; u5 z/ ~
  60. int 33h
    / I, Z$ ~7 ?6 Y$ @
  61. casemo:                           ;Case button click and point move
    " ]( |; T$ n) A8 f5 P  \( I+ J
  62.         mov     ax, 000bh         ;and keyboard press
    7 z1 D8 l4 z, t" r- |
  63. int 33h- n* _2 @0 E, X. x0 ?9 W
  64.         cmp     cx, 00h           ;if point move....X
    2 N- e8 @6 D( H4 u
  65. jne xmov
    ) }$ K. y, U  t! x" q, S6 |
  66.         cmp     dx, 00h           ;if point move....Y
    ' R7 t$ X; v9 z" X1 O7 ~  ?
  67. jne ymov$ R0 h3 K% q; J2 I3 O% o( h% g7 t
  68. xymovend:                         ;X.Y move end, C7 {/ ]0 T. E7 b' }
  69.         mov     ax, 0003          ( j$ r. u: h2 [+ W
  70. int 33h% x( d3 |; |' [+ E% v
  71.         cmp     bx, 0001          ;if left button click  show ON% y- v& ]- v' M$ d' ?
  72. mov si, 1828
    ( @* I+ T' T9 d
  73. je listl; }/ x) O! f9 [; F% V% n
  74. mov si, 1828" P( C' [9 Q2 R
  75.         jne     nlistl            ;if left no click show OFF
    4 }. F! Z7 N) c  ^5 ^; G1 a
  76. testr:- ^% y/ A+ `$ K' ~5 Q
  77.         cmp     bx, 0002          ;if right button click show ON
    : f1 o" U+ i7 J
  78. mov si,18428 I! `. x  d, u6 v
  79. je listr, p9 P: j+ k7 S6 Z/ y6 X" v
  80.         mov     si,1842           ;if right no click show OFF
    3 ^8 D: Q2 V4 M' U
  81. jne nlistl- N% E& h  C8 K9 x+ |9 ?# G) G
  82. casekey:
    % H0 i0 a& E; h7 U
  83.         mov     ah, 01            ;if any key press jump check7 P" g; z8 ~1 g  m. f) L! |
  84. int 16h
      F3 M8 N( O, ]
  85. jne kpress
    6 R  v! }& c) K, V; m
  86.         mov     al, [chkl]        ;check x flag1 K5 B5 ?) u( d  D* a2 b! M
  87. cmp al, 02h1 q- r+ S( F# U+ u4 t
  88. jnb chkok8 ~" E9 b) V9 q7 E  i# B% M- Q
  89. jmp casemo) {. Q9 D  Q* ~/ k- \/ `' A
  90. xmov:                             ;if X moved, get the X flag+1
    - ~7 W8 D7 d( }. C
  91. mov al, [chkl]9 k( x. ?9 v" Z! S# a8 a' I
  92. inc al, P5 i* h! Y- l' X7 x# N* _
  93. mov [chkl], al
    1 l; p# O8 b% X7 L. ~6 N! Z6 N
  94. call passok6 J+ B) @4 F$ {0 K; Y7 o& i
  95. jmp xymovend8 D/ U1 |2 b# w2 x! O( _
  96. ymov:                             ;if Y moved, get the X flag+1
    % z0 v2 n% i% f8 r
  97. mov al, [chkr]4 Z# n, ]4 [8 U% v
  98. inc al
    " l- {9 S/ R6 o5 b
  99. mov [chkr], al
    0 _* {+ h1 \" i
  100. call passok1 Q* w' P, J3 E
  101. jmp xymovend$ ?9 d3 m" |$ @) T, @& s
  102. 9 m# h! ^1 Z0 T8 q5 A3 j; F
  103. passok proc near5 p4 a! @* I" ^8 y$ L
  104. mov al, [okcheck]
    " {' W, {/ C* b' V
  105. cmp al, 1
    + Q. Q) H# Q9 \' a
  106. je let0
    % c4 A0 b# B% j4 a
  107. jmp passret
    , F; T; v3 M# B& C+ l' q
  108. let0: / B- i" u0 H% F& Z8 M' d$ @: [" s2 E, F
  109. mov [pass], 1
    " ~0 ?( V, Q* `6 {6 H0 _
  110. passret:
    5 {) k2 q$ }- f: L; j) _8 T
  111. ret+ }8 C, t- h( A8 [0 `% \
  112. passok endp ' N4 ^( z* L/ g4 q% W9 P7 b' t! ^

  113. 5 e1 V& @/ r$ ]3 h: x7 R9 I
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    + z5 {; T' \  `! n, ?2 l5 z6 P, p
  115. mov al, [chkr]
    / k5 o9 [# U4 S8 u+ i; l
  116. cmp al, 02h
    + I! d. }9 c( y( h- w- p/ [4 I8 b
  117. jb casemo
    " b2 z$ c  E, o/ P8 |) u
  118. mov al, [lk]1 Q, C- b0 A6 L3 ]
  119. cmp al, 1. B1 B# m: _$ X3 v
  120. jne casemo8 ]6 c; n& c) Z% W  |
  121. mov al, [rk]
    * q9 d+ s9 }4 R# Z( D" d3 J
  122. cmp al, 19 l/ x1 a- b9 B8 `
  123. jne  casemo
    8 I2 E/ J* Y- y6 Y. [
  124. mov [okcheck], 1& U1 Y* S/ _& O
  125. mov al, [pass]! L( r. a( v9 ]  [6 Z' Y
  126. cmp al, 1: _: f1 {. T& h' G/ ?/ o
  127. jne  casemo
    5 ~. F  z' x! \9 I1 ^' `+ n
  128. mov ax,0002h
    ( O6 P3 t6 ]- }) S
  129. int 33h$ s( L8 m+ K% Z6 A5 D( \; t3 P
  130. call cleascr' C0 ]  m# c$ |/ G& r; V

  131. ' o8 P+ U' _% ?" t6 h0 K4 _
  132. call oldint
    % @$ k5 j, k% g# L$ w; `
  133. mov ax, 04c00h
    " u. h1 p5 P7 A  n$ _# Z: T/ A8 G
  134. int 21h
    9 j  M" b$ T; X4 \5 J1 X2 ~7 P' _: p
  135. : _- e" ^4 E5 Z0 P7 d
  136. okexit:$ Z6 U5 w% G0 ]2 P# p3 E
  137. mov ah, 4ch, ^  U" `) e. g; t; _
  138. mov al, 0
    : W! ~  a& o# a0 Y1 l2 w
  139. int 21h
    9 s4 E2 o2 |, O& j" L' W( f( U: M" ]
  140. listl:                                 ;Show ON8 L+ B& I) o. K& \/ V5 I
  141. pusha
    # z# |$ E& C# B
  142. mov ax, 0b800h
    0 p. _6 M2 M! l! y1 o1 N) z
  143. mov  es, ax
    : x* C6 N; W$ `* F$ u
  144. mov ah, 47h! m5 X/ n7 N; x
  145. mov al, 20h
    / Y# `( m8 Q7 x- m
  146. mov es:[si], ax
    , L+ p, C) p$ X! X, q
  147. add si, 022 R7 H0 z/ f& H$ m3 ~7 b/ K* \
  148. mov  al, 4fh
    ; y$ `* ]( o7 O* T8 E" w
  149. mov es:[si], ax
      ?$ j* Z$ i" L; W
  150. mov al, 4eh6 f3 `" I9 P, R- w& U
  151. add si, 02
    . O. ]: A" U( _1 e
  152. mov es:[si], ax
    # R1 r0 C; I1 W8 s5 _; a
  153. mov [lk], 1
    ; y1 ?, u. w3 H. O9 S# \
  154. popa
    + j* f, ?6 P1 P, u' T6 S0 s# ^2 E
  155. jmp testr
    * [  E" }4 V+ h7 ?' Z0 _8 F/ F1 R
  156. listr:                                 ;Show ON
    ; Z5 `! Q5 }- s
  157. pusha
    & \; k3 \6 R; M! }2 }
  158. mov ax, 0b800h6 D( _; ^% H& T% t! c+ m
  159. mov  es, ax" O8 C; L' X8 a2 L& a
  160. mov ah, 47h
    4 T' F9 Y9 M- T: k9 N: C3 t
  161. mov al, 20h3 _0 s2 S8 r5 p5 O- g2 |7 A
  162. mov es:[si], ax
    5 \0 o2 w- H$ P/ [" a" w
  163. add si, 02( H- i! H2 F2 D
  164. mov  al, 4fh
    * }; S0 O2 N; V) z( w
  165. mov es:[si], ax
    $ ?+ ^( o% t9 p) O; l
  166. mov al, 4eh
    & E5 |2 R8 ^0 O, n; O. Y1 @
  167. add si, 02- j6 O; |- |$ G
  168. mov es:[si], ax
    , B5 P. _5 U7 e9 G
  169. mov [rk], 1$ ?2 `7 a) f/ ~6 x; r6 u
  170. popa
    " D+ S/ Q1 x( v+ {
  171. jmp  casekey
    ' u2 P) U: Z. ?# i5 s2 c
  172. $ {, V* |* O4 Y) o3 O& I
  173. nlistl:                              ;Show OFF
    % F+ g" Z/ L, }) D/ ?" w4 r, S
  174. pusha   ; T' u( E- k& `4 A
  175. mov ax, 0b800h: }/ i. c  R" v: l
  176. mov  es, ax
    + F/ L( Q1 Q9 v+ j) i
  177. mov ah, 17h
    4 \0 V2 t) [( A/ J% t% n
  178. mov al, 4fh
    7 v  H! Y0 T' U* L2 D  V5 Y6 \
  179. mov es:[si], ax4 t3 x( t6 X7 V+ F
  180. add si, 02
    3 ]! e; y' t$ i) e' m* j- P
  181. mov  al, 46h: I; S/ o& r. k5 c/ m  p; P$ ]( U' G, e
  182. mov es:[si], ax2 I8 L+ I8 S, x. ^. {* `8 S" ^) H
  183. mov al, 46h
    ; o+ b* w# M' E; f+ ]4 \0 Q
  184. add si, 02; j% D& S8 K' L1 b
  185. mov es:[si], ax
    # b9 o( h/ U7 @8 C, E
  186. popa
    1 w5 n& {# B. W, H% p
  187. cmp si, 1840. ]: o' d, C6 O; D) y4 R3 R  v
  188. jae casekey
    4 e* L" }1 |( @8 f9 i
  189. jmp testr
    # G6 p' e0 n8 O( @$ v2 I) c& |
  190. ! C9 y7 M% Y" `5 L0 B/ W
  191. kpress:                             ;Check key press if press<ESC> then EXIT( _. d. S: s3 m5 G& n$ X5 t1 [3 p
  192.         cmp     ah, 01h             ;and return a error- N# P' F& E4 _$ C+ L
  193. je exit1+ D4 A8 y9 M5 D/ F' b  c% N
  194.         mov     ah, 0ch             ;if press other key then clear
    0 f$ C, h* ^, `5 }
  195.         mov     al, 00              ;keyboard buffer
    3 m; s9 j+ r/ ~0 @
  196. int 21h
    / Y0 H4 U, _: x1 }! C; n4 N9 `8 F
  197. jmp casemo - `) N& Q8 ], a( f% L

  198. ) d1 l1 H% b/ p8 U0 Q& P7 d0 ]
  199. errormsg:                           ;if mouse driver no install
    / ]' E# k/ P6 h& ]. r! Y
  200. call oldint; c+ k- l0 H9 \' d4 L
  201. lea dx, offset emsg
    ( g9 w$ }" G' H/ [, D$ ?' P: ^
  202. mov ah, 09h
    6 C  a  }" }5 ]# s, A/ J# ?
  203. int 21h
    3 K; U) o# N& b" B4 Q) C" d1 Y
  204. mov ah, 4ch
    8 T- x2 R- X6 a2 f1 y8 s( Z8 G
  205. mov al, 2
    9 h/ k! \  v4 K- |+ n
  206. int  21h
    2 p7 n4 U$ H+ N" @4 a) z
  207. ) J) U& k2 O3 \( Q
  208. exit1:                              ;error exit% P7 O& `0 W+ _, P" v/ U
  209. mov ax, 0002h
    0 g$ ]: z2 r; e, B0 Z5 o
  210. int 33h6 i. A0 j6 J# y4 M" R& M' p
  211. call  cleascr
    4 J. g* c; E' N+ n" h' B' h! \
  212. call  oldint
    + H! S1 g6 Q4 H, d0 ~6 v) B
  213. mov ah, 4ch
    - [6 |% F8 w+ @# `; _9 x9 u+ r! r
  214. mov al, 012 r: F* ~6 }7 q+ M5 U8 }
  215. int 21h% R! M5 }2 \& Z( D6 ]9 q/ @
  216. 7 @  l$ K" h) S
  217. cleascr proc    near                ;clear screen
    # g) f/ W9 V9 a/ w! z' j2 j) s0 o! b/ Y: l
  218. pusha1 `% s9 X. b* |6 o0 o9 ^/ J
  219. mov ah, 06
    # @$ c  ~8 Z/ L  C
  220. mov al, 0
    - u; I" }& [" b2 j) f1 M
  221. mov cx, 0
    ! y/ J- U  G/ A, l* X8 D( s) M
  222. mov dh, 248 E. [* y! ^( u
  223. mov dl, 79! ~( E$ H! d2 O2 G
  224. mov bh, 07h/ z/ P( p' n; [2 H& h& ]1 h3 ^" C
  225. int 10h
    5 A+ K6 S5 c7 t, d% P
  226. mov ah, 02$ ]) u. n' Q) x, U
  227. mov bh, 006 O) m6 V' Y+ m; m
  228. mov dh, 01 p$ R1 ]* _* e
  229. mov dl, 0
    4 e1 C& X; X' M# h6 i8 ]  B/ j
  230. int 10h
    " M) ^& N0 M6 q$ ]1 Y& g
  231. popa
    & j1 Q6 |( R2 S' P8 [' S
  232. ret
    4 Z6 E3 [. z+ ?) A6 G* ^- p$ p  v
  233. cleascr endp6 O' Z# W; [6 Y. [# G6 T  N
  234. 3 X5 Q; c$ I! i$ H' I
  235. showmsg proc    near               ;Show info
    7 T6 T9 ~, {2 ~1 x5 V
  236. pusha& ^" P* [# o" T6 e% F" ?% h
  237. lea di, offset showms
    3 w. E. j; H( ~$ z& \" v
  238. mov ax, 0b800h
    . H$ z  C: j: T8 }. t# O% v
  239. mov es, ax
    & z: J- H. V, }; X0 K1 y
  240. mov si, 0( p6 f) [) s6 H) c
  241. mov cx, 480
    4 a& {$ x* G: P8 c+ |
  242. mov ah, 07h
    - k# Z, n: |8 B
  243. @@:$ I" I6 D+ L& g9 Y+ p5 A
  244. mov al, 20h
    3 N- p& z0 e1 R) `4 b2 R
  245. mov es:[si], ax4 r5 f  H5 p9 j6 I, e
  246. add si, 2% z" j. y+ r8 J
  247. loop @b. [. p( C) Q! d) @
  248. mov cx,880- p/ I7 V- Q1 h) N; U
  249. @@:
    3 i  }0 j2 a8 j6 [7 `
  250. mov al, [di]* n+ T3 Q7 \+ D" r
  251. inc di) i* q7 e  K0 T9 F3 x
  252. cmp al,20h4 v7 L7 L/ M1 v7 M+ q* i
  253. je showch1" K2 G: C" U* _3 j0 p4 u% j- u
  254. mov ah, 17h# p7 a6 h0 M( d  k, ~
  255. jmp showch3 ! b* L/ X  m. T( g6 S' G2 C
  256. showch1:, u; q( x4 b8 N9 m+ Z, W
  257. mov ah, 07h
    - p' s, h' v/ @5 X+ E
  258. showch3:
    : {' B' `. }6 l+ Z+ s1 W
  259. mov es:[si], ax0 J9 T4 ]- ~; ?: F9 ?1 X, A
  260. add si, 2  I5 {% P; q( Z% t- G3 `2 d' [$ c
  261. loop @b+ F, \) X5 n4 m# c% D
  262. popa& C9 @2 ~! d5 t  T) |& C
  263. ret
    $ o4 y# N( p. P  z! l
  264. showmsg endp! E; d/ e. S" R* Y/ _

  265. % ^9 q1 ]6 A, E
  266. oldint proc
    6 s8 t7 N1 f. W: P4 _
  267. pusha
    0 l3 B3 D, \8 |( _/ r
  268. mov ds, word ptr cs:[old331]- m( G5 B1 `, `+ g# z. f/ L4 C
  269. mov   dx, word ptr cs:[old332]: ^2 a  h# q" N# m% H# ]
  270. mov ax, 2533h5 }: U+ Y' P$ g. a- e: T5 A
  271. int 21h
    ! |0 L  B% C  _/ s: i1 }& u
  272. mov ds, word ptr cs:[old741]
    2 J" d* Y8 e4 }$ z) ^
  273. mov dx, word ptr cs:[old742]
    8 p7 l( b& Y& n3 H9 M& p! \( s8 Q. a
  274. mov ax, 2574h
    " E- f  |" Q, T6 t8 t7 S" z& r" [
  275. int 21h
    8 r0 P3 @' S0 I9 U
  276. popa; m  h$ f! K& X2 H' G: U
  277. ret8 k2 V' y5 u: t3 U6 J6 n
  278. oldint endp5 j6 K1 c/ [3 [# }$ z6 B
  279. 4 c% P5 Q; J- c1 i2 f# l  |6 G# H" r
  280. memmouse        proc% u$ {; k, l) Z. s) _
  281.         xor     ax,ax3 Q1 y+ T$ E2 _& F, H/ x. O: [
  282. int 33h8 w, M2 O% `, m
  283. cmp ax,0ffffh5 z8 }% X7 {; D- p" H
  284.         jne     not_loaded# `* A7 L( i1 v% P0 @
  285. mov [memcopy], 1
    2 X& t) M8 W+ X% E
  286. ret
    7 a! {0 B. U6 i% x5 n- @; @
  287. " `* V: `& F8 E* ]
  288. not_loaded:# c7 Y# e/ H" a: f

  289. % ?% C$ A5 n- W! O% f  K& Q
  290.         mov ax,2574h) M, t; R% L5 h# {% v, I# p
  291.         mov dx,offset new_isr
    ! Z. r4 E5 Z  G9 s1 Y
  292.         int 21h. J+ e2 a; \# N( D. X4 E
  293. $ `+ M. O" C$ r6 p0 Y$ o% @
  294.         mov ax,2533h
    4 z5 H/ P' \" Y3 s  P. i
  295.         mov dx,offset new_33" U$ V1 e$ D$ }. r; B( I
  296.         int 21h4 }( N8 e! `1 t' k# g; o! q7 c
  297. : E7 |6 _5 \) ?, Y& Y3 I$ P/ K4 {9 T
  298.         cli
    8 s9 R) E$ {, A1 P: ~

  299. ! l+ ]% x$ z( t, O+ S* ^6 [7 ~
  300.         mov bl,0a8h' S. \+ c) n6 A
  301.         call keyboard_cmd
    1 u3 {/ p$ _% O9 v
  302. 2 N9 b4 {/ s" m$ j" F+ e0 G+ ?
  303.         mov bl,20h
    ) Q+ Z- N: ^1 \: I& \* l
  304.         call    keyboard_cmd( G: k% |  g# I2 G
  305.         call    keyboard_read& V/ C$ y) i( }2 z5 Q. Z
  306.         or      al,2# z1 O6 j" i2 B& h3 n
  307.         mov     bl,60h+ y* V# n, g: w& D' h( A+ H
  308.         push    ax& @, H3 S! I3 h! Y  `
  309.         call    keyboard_cmd
    - d- r3 u3 f1 j3 T' ^1 A, F) z
  310.         pop     ax2 a' f7 L: @3 A4 N/ z% C3 ?; n4 V# X
  311.         call    keyboard_write
    $ \/ c0 ]6 n( U& f. Y5 o

  312. ; a6 {5 T* H+ R
  313.         mov     bl,0d4h
    / S8 b- s7 K4 x+ N' K# @
  314.         call    keyboard_cmd
    2 h! X# M8 U1 {; D
  315.         mov     al,0f4h& ?  s8 R; ]8 r" y2 T# i
  316.         call    keyboard_write
      Z  o9 r7 Q% c" L( k; k
  317. " ~1 V5 n* A* z: J
  318.         sti: d; r) |) J! G* H- w( B3 I
  319.         ret
    - Q$ t! q5 V5 p3 R
  320. call_user_isr:
    8 @& o/ G9 e2 M) p
  321. db      60h5 j% u& r2 u- j
  322.         mov     cx,cs:[pos_x]$ D6 o& x; X: z
  323.         mov     dx,cs:[pos_y]' a0 {) X6 F0 T  e
  324.         mov     di,0 ;cs:[x_move]% @6 q& [5 t4 k' B$ r( m
  325.         mov     si,0 ;cs:[y_move]2 `6 \4 `5 V1 b- o. a4 r1 J' J+ e; p
  326.         mov     word ptr cs:[x_move],0
      R. z& k6 A% b9 s! M/ Z
  327.         mov     word ptr cs:[y_move],09 ]  s' a7 q- {+ M. J, C
  328.         mov     bl,byte ptr cs:[buttons]. x2 i2 g* g" P- o) [
  329.         xor     bh,bh
    , ]( N1 t: T$ L/ T* h
  330.         call    dword ptr cs:[user_subroutine]( L0 j: Y) q1 m0 W4 E: [
  331.         db      61h2 t" U. K$ o; ]! l5 ~
  332. ret
    8 J. ^) `& |6 r- C, P3 U# I( m- O+ }" z
  333. new_isr:( e; l# g0 N4 E0 ^. ?' a0 Z
  334.         pushf8 F" K- }1 w2 I8 {$ I, g3 U
  335.         cli" }" C) Q' p5 u+ N- I6 L0 ?% f
  336.         push    ax
    3 q8 m5 U# q- g
  337.         push    bx! m; y8 T1 D6 Y2 F
  338.         push    cx" Q& `" F1 P/ `1 u
  339.         push    dx( {# K0 Q: V! T% a& L
  340.         push    di  C! \+ ^) H0 y3 z9 {* C
  341.         push    si
    1 X% K, \! i$ ]$ ?5 G. r
  342.         push    es7 M; k: Z, x# J1 z, H7 B4 d9 ?
  343.         push    ds
    # f5 T: q1 Z4 t8 I! j+ d9 }* [+ ~
  344. : [% t" E2 l5 d
  345.         push    cs
    , p/ m; V( e, [
  346.         pop     ds0 z4 r" v4 l2 ?6 g+ y! _. T- C/ ~
  347. # f& o# X# `+ l
  348.         mov     bl,0adh
    3 p7 p: N9 `* F$ s! T- }1 U) m
  349.         call    keyboard_cmd( \2 a/ y3 i. @0 `4 [& G: W
  350. 1 m/ e: c6 J) M9 c
  351.         cmp     byte ptr [first_time],05 q  ?8 Z- D2 N
  352.         je      not_first_time+ z; ?" ~0 v; z( k! R! U# t5 ^: `; j

  353. 3 y6 A0 i6 R! G# U( U8 S3 |, m
  354.         mov     byte ptr [first_time],0
    8 p: c& S2 ]4 h# w
  355.         call    keyboard_read
    2 b& L; R4 o, F+ x1 N
  356.         call    keyboard_read
    8 j" L0 Q+ _9 P
  357.         call    keyboard_read
    4 r/ N7 x6 ?5 _& r9 |7 T
  358.         jmp     no_show; D$ ]5 r6 Y! I1 f% a8 ]
  359. $ ~$ P/ k4 e5 r" f" J* J2 `: z9 A
  360. not_first_time:
    4 w9 z4 t# g; W  \" @5 D7 P5 N
  361.         mov     word ptr [temp_mask],0
    ! x5 c+ w( L% q' \2 s# n6 x3 [
  362. ; `: L: N2 b% _0 ~' N1 l/ K, @9 z# D
  363.         mov     cx,[pos_x]
    ! g% q! r9 P& Q/ x
  364.         mov     dx,[pos_y]$ u; E" D( q! F7 z8 S

  365. 5 G6 s2 }& C( @7 {8 j( w
  366.         call    keyboard_read
    9 Q4 [, M! X  {
  367.         and     al,7 ;32 k% u. J3 D' Q1 i+ D
  368.         mov     ah,[buttons]
    3 b7 ?0 y* J2 Z
  369.         mov     [buttons],al0 E2 a3 Y- b# r2 _( j
  370.         cmp     al,ah
    7 g; E" C5 a. j
  371.         je      no_button_change
    7 @5 ~, y5 y: B# }
  372.         and     al,3
    6 X$ w% |. i6 e5 R! A) {" M
  373.         and     ah,3
    ( s* @( T+ \2 z3 C; ~# f
  374.         xor     al,ah
    ; J" h' Z4 g1 Q; s* B- j
  375.         xor     bx,bx( `4 @4 J  G0 l9 D$ `
  376. & ~6 c" u: \$ q& |' _. \
  377.         push    ax  r1 D0 x* A2 E* B8 V
  378.         test    al,2
      o8 f+ Y( z' J1 ~3 E
  379.         jz      no_right_button_change
    9 U4 @, ~" ~. q& ]7 g' i7 H
  380.         and     ah,23 j# n% v$ Q) u" D" F, K, F$ E9 A
  381.         jz      right_button_pressed) V6 \& c4 l) `! ?
  382.         or      bx,16
    " \, D# [7 K2 [9 p1 P% e, _
  383.         jmp     no_right_button_change3 k: m/ f( J* A) d$ w
  384. right_button_pressed:7 G% {) H& ]8 ]
  385.         or      bx,8" i. B1 D! b  P0 w6 p. Q
  386. no_right_button_change:% m, J9 x* S) ]

  387. - x8 }+ C# |+ ]' Z
  388.         pop     ax* m, t# b. H  U

  389. ( \1 p) R. J$ k( O6 {
  390.         test    al,1
    , D$ Y, [! }- L- O9 V
  391.         jz      no_left_button_change; A( `9 n! y2 V3 T$ T
  392.         and     ah,1
    : p/ c, L8 y% ^
  393.         jz      left_button_pressed
    3 F- a: D3 J- h: @- W8 b1 g2 U3 v
  394.         or      bx,4, G6 |; q2 M, T( c5 O0 X0 D$ e2 h
  395.         jmp     no_left_button_change( d( ]% [. r1 H3 w5 ^
  396. left_button_pressed:- G+ Y: P" R8 U! ~
  397.         or      bx,2( Z! O! ]; ~$ I; m
  398. no_left_button_change:+ L3 L- y/ ]; @2 u
  399. , h3 F: |, E/ y4 N) }4 @
  400.         mov     [temp_mask],bx  @0 A! Z3 U# [9 y7 `5 j# h& @

  401. ' a1 {5 B" a+ t' Y) F; @: b2 ?- _
  402. no_button_change:
    ! N1 I8 a& e+ Q4 m; `
  403.         call    keyboard_read
    7 c% j7 v6 n$ Y5 v% f8 l
  404.         cbw! [/ R6 r# K0 S8 p8 R4 s
  405.         add     [pos_x],ax0 _3 \  D4 I+ q' j
  406.         add     [x_move],ax
    7 _" U$ X% U! p4 U* B
  407.         mov     ax,[x_min]7 b+ k1 I2 a! z& Q; N9 v2 X2 e
  408.         cmp     [pos_x],ax! m- ]1 s9 F. l9 {) p& I+ R: w7 d
  409.         jg      good_hor1: G1 k  r' D$ I' c
  410.         mov     [pos_x],ax
    2 C% {9 D- w: F& P% ^' y& I3 ^1 v
  411. good_hor1:  e. y) @/ H1 F% f
  412.         mov     ax,[x_max]+ u! x/ M. T( c8 s! ]
  413.         cmp     [pos_x],ax. L. d7 e; ?- R/ h( X$ J
  414.         jle     good_hor2) K9 G* I$ r- }! j4 y( |
  415.         mov     [pos_x],ax5 {- o  ]# o4 }8 T' F
  416. good_hor2:
    % U3 a; }1 c0 o+ }# L
  417. % \1 O0 Y+ |* E# x2 p
  418.         call    keyboard_read
    6 ?; P% W1 }8 d, t* Z9 i. T
  419.         neg     al
    , d! C6 ~/ c$ s$ b
  420.         cbw
    % k/ n4 x5 {3 o) J: @% ~* T8 N
  421.         add     [pos_y],ax! b+ T" @# j" R, H6 W9 ^( q
  422.         add     [y_move],ax! ]8 T. D2 r" U; R0 X0 `
  423.         mov     ax,[y_min]2 G% f% m$ u  Z$ B( N9 Y0 ?) J* H
  424.         cmp     [pos_y],ax' ~/ O( V' @6 r
  425.         jg      good_ver1/ Y4 l' V. U! S% O/ r, ?6 m# D! o
  426.         mov     [pos_y],ax- v, _4 r+ M/ R, ?2 [% M/ ^
  427. good_ver1:1 M: B$ u3 z/ o; K3 r) s
  428.         mov     ax,[y_max]6 _8 s8 T; S9 f3 j9 ]" A( ]( n
  429.         cmp     [pos_y],ax
    : v1 G9 b$ {7 i
  430.         jle     good_ver2
    $ _1 ^0 v" R/ b8 k  H* D" W& g; h
  431.         mov     [pos_y],ax$ k3 w8 G2 |- J/ w' I$ I- d
  432. good_ver2:
    2 b1 m+ T6 ^) G. l5 q3 f

  433. 6 X" B- S/ G: I  f9 t0 U* i8 a
  434.         mov     ax,[x_move]
    6 P; R9 a5 ~" o; v6 R( Q
  435.         or      ax,[y_move]9 S' z8 M) e2 e! H2 O
  436.         or      ax,ax
    1 E% }' r( D  q2 X3 ?0 T( Z
  437.         jz      no_change_position- @6 C$ E. q3 k8 S2 n0 M5 T; c& n
  438.         or      word ptr [temp_mask],19 Y: g6 z* R8 i" E  i+ G
  439. no_change_position:
    $ }8 |& a+ z1 l; p. A9 z" V

  440. 2 {/ t' I. F* X
  441.         mov     ax,[temp_mask]8 \7 e  [: Y' ?+ e
  442.         and     ax,[user_mask]
      X, J. P% p! r. D  r
  443.         jz      no_call_user& ~. G4 }$ `2 K. g5 x
  444.         call    call_user_isr
    4 c: ~* E. D6 e5 j, O9 |
  445. no_call_user:0 A( A  e. i+ T* D, a
  446. , t) \& B; ]1 A* ^) [# C; \6 ?4 s
  447.         cmp     byte ptr [sm_flag],19 t' c) W# N  _1 m( E/ @4 a$ h
  448.         jne     no_show
    $ `; l9 W, N$ v% C* c

  449. # q* p6 {: V# ~, L+ I  T4 T. m
  450.         shr     cx,3
    ( N+ [$ l. L! Y/ s% c7 G. @
  451.         shr     dx,3
    - b& U8 w1 M9 R- D* h; y$ d
  452.         mov     ax,80
    & l- C7 x! H/ O9 w, {* V7 |
  453.         mul     dl
    , O- k$ b4 h, F- D/ x
  454.         add     ax,cx
    + x) C9 ]) S, G7 F  n6 I$ ^
  455.         shl     ax,1
    + U" s1 e# X9 D
  456.         mov     di,ax/ t! f' r! h: ~' V! S3 A. U
  457.         mov     ax,0b800h
    ' S) }1 [- \, g7 }; i9 |; i  l
  458.         mov     es,ax
    % \! `8 ~; v; Y1 _( Z7 v- ^
  459.         mov     ax,[save_char]6 P1 _  `8 a* n# Q4 n" B
  460.         stosw
    * P) \& |' D- A2 N4 @! ?
  461. # h+ a- @, Y: u9 z! U. Y
  462.         mov     cx,[pos_x]
    3 |$ |% q# @! \. L
  463.         mov     dx,[pos_y]: u5 s+ b, _+ @4 D
  464.         shr     cx,3
    & i2 F1 v# i" ~8 F; D
  465.         shr     dx,3+ ~& D; r5 y; @' p6 A! p
  466.         mov     ax,80, k3 M  {- U6 c) W% r. p0 B! F
  467.         mul     dl
    ' y: Z7 K8 r! O2 }& F
  468.         add     ax,cx3 U) w2 O1 F) Z" v/ ~* H2 e
  469.         shl     ax,1
    ! [2 n( Y7 U8 z1 Q( i
  470.         mov     di,ax
    / o' m9 t2 ?* d3 i: ~& x; P$ }
  471.         mov     ax,0b800h
    ( b' S  x* \8 V5 _# q
  472.         mov     es,ax
    ' s9 m3 o* ^8 o' B5 e+ f
  473.         mov     ax,es:[di]. c9 U1 A# y9 k( Z
  474.         mov     [save_char],ax
    ! h  @* T0 f' L& m
  475.         not     ah
    7 ?' A' @6 G* @$ C0 W
  476.         and     ah,7fh
    * s1 u; O& R4 a' a& e, Y+ }2 m
  477.         stosw
    0 x, W4 v" |+ ^; `3 G7 l5 o' w
  478. no_show:, l0 t; _1 W% h  d
  479.         mov     bl,0aeh# j) Q7 N) Y1 t1 [' j( t) k
  480.         call    keyboard_cmd/ l' M+ z6 s2 r4 Y! ], E, a* `
  481. . Q; q+ t. q/ c# E8 }9 J
  482.         mov     al,20h7 G' K- o# a. ?. W  h
  483.         out     0a0h,al
    $ E; M1 P6 l: C' o+ M' _2 [. x
  484.         out     20h,al4 y. s; B/ K3 V. |) P1 C% l
  485. 6 O: G5 t% X0 M3 j( i9 o8 x
  486.         pop     ds
    9 z6 [' e1 k$ R4 R6 Q7 Q6 A, X- H& o
  487.         pop     es
      ^9 A1 t7 b. f9 T% P
  488.         pop     si
    - w+ \6 E9 S$ w4 `. H0 B) W0 y
  489.         pop     di
    $ P4 W, a) x3 H$ ]- c
  490.         pop     dx
    7 T6 t+ X# E( b
  491.         pop     cx" E( `; N1 F0 a) P! c$ ~* c* U( m
  492.         pop     bx
    ) G/ |" K5 e# _4 v' r5 K% z2 _: d
  493.         pop     ax
    - E4 s9 |! @2 y7 A/ L
  494.         popf3 h7 g+ |! X) B+ x$ D/ h  {
  495.         iret0 S# D) y, u5 m7 r: L

  496. - J2 i6 T1 ^; M
  497. first_time      db      16 K) h/ q) M' d! M, ^/ |$ o6 V! D/ c
  498. buttons         db      0
    % H1 V" @- d3 U# z% z) e9 V* D
  499. pos_x           dw      0
    8 Z! t% X; K5 @
  500. pos_y           dw      0
    7 Y  r+ s8 h1 }# x( T0 p8 P" V' c4 ^
  501. sm_flag         dw      0
    6 x7 V5 d9 v. \/ C. |8 F$ ?
  502. save_char       dw      0
    : u$ w$ r3 L$ g" O- @- X/ ~$ d
  503. x_move          dw      0
    5 ^1 p- H( y% s; c" a  x5 C
  504. y_move          dw      0. k& @/ w* U; a) |, N- [; ~
  505. x_max           dw      639
    8 s5 S# ~+ T$ Y* C0 D; j8 [
  506. x_min           dw      0
    5 O* N  K9 w) n9 {$ M
  507. y_max           dw      199
      Y8 ~0 _- y: r3 ~1 G! H9 @& R
  508. y_min           dw      0
    ( K0 Q& s! z+ s; _! j. O" i" a
  509. user_subroutine dw      0,0
    8 I1 x# v  c% {: E( z
  510. user_mask       dw      0* Z) J7 W) D+ M2 A
  511. temp_mask       dw      0: d9 l3 X) O8 g, p+ M. n6 w
  512. ( x4 j" K& u* z' r
  513. keyboard_read:/ ?! w5 V" G4 H+ x9 H
  514.         push    cx
    * S6 n; m0 K# }& b. U8 ]
  515.         push    dx
    & ^$ `9 A5 Z- s4 Q; v- `) E& i
  516.         xor     cx,cx
    7 ]$ y6 K1 L9 g9 A/ y# t4 Q
  517. key_read_loop:
    & h+ `" }2 S5 G) A- O) C+ N9 M
  518.         in      al,64h
    ( T. l6 w5 ?$ b2 d/ J* [  v
  519.         jmp     $+2# v4 M, |9 y# _/ X  @' C* U8 p8 p
  520.         jmp     $+25 b( H0 y4 U0 p: n3 v7 F
  521.         test    al,1! |" d$ o0 Q" X& h
  522.         jnz     key_read_ready
    ; f8 h0 y; `: V8 [1 J, [# N# J* r
  523.         loop    key_read_loop( F, t, @! o! d2 @
  524.         mov     ah,1
    ) _4 j. O& c0 t% G+ F! D0 W3 W# p
  525.         jmp     key_read_exit# L/ R6 H& m% [+ I( d9 Z
  526. key_read_ready:" P9 a  K8 @% U( ~! g% m
  527.         push    cx
    / J/ ]5 [( V1 p
  528.         mov     cx,32) l4 I. E9 ~) l3 l6 q( X
  529. key_read_delay:
    * x6 U+ v  e4 P0 S7 k: L. n! v
  530.         jmp     $+24 X! `& r8 }# v. t; q) e& H
  531.         jmp     $+2
    9 x: ~2 }/ Y2 E
  532.         loop    key_read_delay9 z( O) w7 D4 @# c! o% z  e" z

  533. & w3 I! v3 g- d- i+ N
  534.         pop     cx. t3 y+ k  T1 Q, O$ `
  535. 5 _4 f& X/ l0 [: [+ X
  536.         in      al,60h% [2 J8 _  y5 |1 l) {6 Y
  537.         jmp     $+2. w  g* H5 W. k
  538.         jmp     $+2) a8 A5 a: T8 Q% V: f9 W" g
  539.         xor     ah,ah
    ' }6 ~: P( Q* e5 f6 O' f( K
  540. key_read_exit:% y' t) R1 |" K! i3 [! k
  541.         pop     dx/ i. C( p; ?& [1 A9 ?
  542.         pop     cx
    ( f4 V0 T2 ^: U5 _( J9 ~! e( ~  B
  543.         ret# I: |! w' U+ w& \
  544. # c* P  R; _( q8 Q$ \
  545. keyboard_write:- W" B6 y# {( P: y0 p2 v: s$ m7 Y/ t
  546.         push    cx: ^$ U  M5 h" ?! m1 N
  547.         push    dx
      F) U1 n2 Y0 ~- r
  548.         mov     dl,al. x) p  f5 i! E, x. _
  549.         xor     cx,cx
    7 L: x# _# F) |2 [4 k, ~  z1 N
  550. kbd_wrt_loop1:3 ~# T1 g  Z. S+ Z0 Q6 h$ {
  551.         in      al,64h' _, B1 D2 B: F1 I
  552.         jmp     $+2
    2 O& [6 w5 g5 [7 [
  553.         jmp     $+2, W9 `- L* V2 D/ O, I( d! W
  554.         test    al,20h
      v1 |3 L' C  J9 A1 r9 @
  555.         jz      kbd_wrt_ok15 J4 A! _( @0 q- D- X

  556. 5 w7 W% A; z0 r% G
  557.         loop    kbd_wrt_loop1
    6 ~" N5 ]* q, E9 w5 p. g1 U

  558. ( w6 Q) V% w0 M. U& c/ u0 g6 ]
  559.         mov     ah,1
    % W5 Q) J' ^6 [/ G! B" A
  560.         jmp     kbd_wrt_exit
    ) |5 A  p' o8 U+ j  e
  561. ' ^8 \% |9 t' o% |; T
  562. kbd_wrt_ok1:- F' h8 k4 _, m7 C! L( E8 N
  563.         in      al,60h
    7 f1 d5 u) s. W; p
  564. ' B' k1 x0 t- r! [( E
  565.         xor     cx,cx4 y; [+ n2 J7 T3 z+ i
  566. kbd_wrt_loop:
    $ {9 B! m9 ?- K
  567.         in      al,64h
    9 p& w3 W0 I: ?
  568.         jmp     $+2+ y  y4 x7 \, v, _4 p, A
  569.         jmp     $+23 ~0 C) V  }/ [$ Z8 E) k! @
  570.         test    al,2
    7 @1 U" v  V& F. ^; U/ v9 h
  571.         jz      kbd_wrt_ok
    % b( |# s* V1 a! t, X# f/ s

  572. 6 t$ P: X; i1 N
  573.         loop    kbd_wrt_loop; y9 w, v% H. O' v

  574. * N) }4 a: L% @: Q, [
  575.         mov     ah,1
    % d/ m. y5 U( P
  576.         jmp     kbd_wrt_exit
    " O, d+ U: n( J% Q1 G3 O, K
  577. & S, {: ]4 `4 P( S) o3 \8 r
  578. kbd_wrt_ok:. D) x# T: y- J
  579.         mov     al,dl2 k) p9 y- [0 f3 Y2 ]
  580.         out     60h,al  Q. ]3 y& R- W
  581.         jmp     $+2
    : ]' g, v) `  w$ Q' _  u3 h
  582.         jmp     $+2: M- l( I( ?6 I3 w& V7 R
  583. 0 r3 m% E+ \0 k, {, l9 i5 j
  584.         xor     cx,cx
    0 N% {! t. q/ R3 _( L
  585. kbd_wrt_loop3:. l" `) s! ^* Z! W; ?
  586.         in      al,64h" B7 u% f8 G. m1 U( B) \
  587.         jmp     $+26 X% k/ U6 p# c, x1 Y( j0 e
  588.         jmp     $+2
    ( U0 Y6 m" Z" Q: ~6 l8 F
  589.         test    al,2
    7 d( ], @) p1 u% g
  590.         jz      kbd_wrt_ok3
    ; W. K2 C5 x/ w; q0 Z, Z
  591. : V- f* C. {/ N% h5 P' x& H
  592.         loop    kbd_wrt_loop3
    : b5 {! M5 a8 d' x* H- p! I7 i

  593. , D+ `" J4 d( t! {  h( l
  594.         mov     ah,1) I7 ^) G  a2 }$ p% n5 \- \+ ?
  595.         jmp     kbd_wrt_exit! K1 X! @, B6 f. C& y2 v
  596. / |. F' S. F/ |. b# n; M4 }
  597. kbd_wrt_ok3:4 t: }- q3 t* s( w
  598.         mov     ah,8/ _* U/ t7 b. z7 f4 `- t# [
  599. kbd_wrt_loop4:0 X. [7 p  c% w( v+ o. Q1 [7 S1 y8 d
  600.         xor     cx,cx( V' v' I+ y( ]
  601. kbd_wrt_loop5:
    - h7 B% r, P) M. y$ o, X3 k% f
  602.         in      al,64h5 q: N* R! F, g) u
  603.         jmp     $+2
    , E3 X0 K' `$ G4 E) \0 Q( G
  604.         jmp     $+2, Q, O' c: e3 P' O
  605.         test    al,10 o" l0 ^6 r! ]( ^
  606.         jnz     kbd_wrt_ok4& f$ p+ |7 G' H* g8 ^$ Y% x% H+ g
  607. / l) B  `& g, n7 @6 Y, a
  608.         loop    kbd_wrt_loop5
    + U8 \" z: G* h8 E! K% S

  609. " N7 p& Q# T3 J2 J- g8 P
  610.         dec     ah+ `; z. R; j7 y( i6 q
  611.         jnz     kbd_wrt_loop4; h5 M/ ]0 ~. d, r$ d

  612. 5 N7 o4 W6 L1 P2 ]: ^0 e$ s
  613. kbd_wrt_ok4:
    # ~+ T4 S: y6 ~7 R1 a* [
  614.         xor     ah,ah! @4 m# z2 x9 S7 ^8 w6 R
  615. kbd_wrt_exit:8 C  h  K; Y( u5 K
  616.         pop     dx& O# O1 |- v- y6 ]4 k
  617.         pop     cx
    ( ^# c; N# m( q. e* J
  618.         ret; `  B8 z0 }4 \' V& A/ m! u( U. @
  619.         . f! f: }* Q9 k3 K, G; d/ d
  620. keyboard_cmd:; i/ @, o3 K- @/ I( E% M* l# Z* }
  621.         xor     cx,cx% y7 b0 C; e) I* Q$ R, e
  622. cmd_wait:
    ' Q- U+ `4 b7 }% n
  623.         in      al,64h0 Y4 O# G0 u+ i. D& |+ \8 [1 ^
  624.         jmp     $+2
    % q$ R$ a6 M: o$ I9 j: `; t
  625.         jmp     $+2( R0 k7 d; M' S! B+ a" Y
  626.         test    al,2
    0 a8 E5 K, b) K; o
  627.         jz      cmd_send
    ( u6 }1 e9 [# v3 t2 f" o: L: e
  628.         loop    cmd_wait
    7 E; @8 L4 {2 c1 G! }1 I& _
  629.   Z+ d9 r; P: K- o" u1 ?3 T
  630.         jmp     cmd_error
      H- c( I$ D. v3 O3 l
  631. : e3 @% P% w: v2 q! X8 o* N2 l0 P
  632. cmd_send:) j7 W' K# Y- x" z
  633.         mov     al,bl
    - N/ u8 p: b) D, f: k2 q" w
  634.         out     64h,al) o' g/ F6 C+ {. K! j
  635.         jmp     $+2
    ( a" N- Y+ j* m- N
  636.         jmp     $+20 R5 ?7 M9 w4 E5 H7 ?2 f
  637. ( g0 @! S0 B5 \/ \
  638.         xor     cx,cx4 m4 T1 W1 I2 E) `" k/ ^8 y
  639. cmd_accept:
    8 u0 h. ]( l) u4 D2 ^- E
  640.         in      al,64h- \7 k# ]$ W: b
  641.         jmp     $+2& C8 \1 b: g( ~5 @
  642.         jmp     $+27 x+ T, I8 e- Z8 s# ]
  643.         test    al,2
    9 Q( [# G9 r* o; l$ L
  644.         jz      cmd_ok  c9 F, }. y( B; O
  645.         loop    cmd_accept1 z) W5 ?, \* z
  646. 7 H( A1 ]0 d4 v  }: i
  647. cmd_error:; ~4 B) e- \1 B
  648.         mov     ah,17 `- W4 L3 \/ Y* o* x; m# e
  649.         jmp     cmd_exit/ ~: U% z* w/ N0 I( p7 H
  650. cmd_ok:5 K  f; G( @. ?; L" v: |
  651.         xor     ah,ah
    ' f5 i% v5 f8 [& S# A2 H. t! d8 a% H
  652. cmd_exit:/ ]/ H' O5 z  ?' h$ I% R2 {
  653.         ret
    $ m/ ]$ S$ Z1 ]- O# ^4 X: B6 J) s

  654. & k5 k' x) G6 b# [
  655. new_33:
    + D, Z! Z$ t  \  A
  656.         cli
    7 Q- c6 |3 N; s" u  }$ z9 ?
  657.         cmp     al,0- L$ b' E: l0 L' m7 L
  658.         je      reset_mouse
    & ?! [5 }: K& f/ ]& c5 ?
  659.         cmp     al,1
    - M" R! V! ]( U/ f3 y2 D
  660.         je      show_mouse0 L. Y/ W9 p- C9 W3 R
  661.         cmp     al,2
      ?! T3 m3 e1 P6 F
  662.         je      hide_mouse
      x" A, M+ W, _) x
  663.         cmp     al,3
    * h) i& v* m1 X4 b& q. w" p
  664.         je      get_pos
    1 \; c) n& X" b1 g; ~
  665.         cmp     al,4
    % P0 Y0 @0 ?4 {$ |- h9 h% i
  666.         je      set_pos
    ( j$ i( h6 E" t. ?& \9 x
  667.         cmp     al,7; S- K+ c5 t7 T5 G
  668.         je      set_hor_pos3 k9 Q6 u, s/ n# b9 `
  669.         cmp     al,8. p0 ]. [" D0 K
  670.         je      set_ver_pos
    ! l1 P  d: A! y1 \1 p- l8 ~6 t
  671.         cmp     al,0bh
    # P- C' ]0 y' @) b! W, T3 I
  672.         je      get_mouse_movement
    7 V' W/ ?% v2 p& k
  673.         cmp     al,0ch, d1 K' t6 L, \8 ?" y0 y. D  w, H
  674.         je      set_subroutines
    $ ?& a# n2 i( ?
  675.         cmp     al,14h
    8 M; x* |3 H: x. V& H
  676.         je      swap_subroutines
    0 a$ j1 p  x$ r# M% l) l/ Q/ g
  677.         iret
    & T" ]9 O  |1 P6 y

  678. 4 @5 t. O! f  k3 G* S* j$ l
  679. reset_mouse:8 I/ F( H2 @. v  Q2 t) T% p7 o
  680.         jmp     _reset_mouse: f! U! {9 U+ n0 u' V
  681. show_mouse:
      L; ~9 i, l1 [
  682.         jmp     _show_mouse! [" i0 s% S% `+ V/ @4 O) h
  683. hide_mouse:* [7 @! X! P2 k& G- D
  684.         jmp     _hide_mouse
    4 E( b2 ^5 y3 j% o3 L
  685. get_pos:  _, H- c- L0 C2 x- y( k* t
  686.         jmp     _get_pos+ i/ ~2 v, `1 g( L" S7 g
  687. set_pos:) X- o* k1 H/ s; r' u
  688.         jmp     _set_pos5 m3 s/ S1 f, Y# H; z7 S
  689. set_hor_pos:/ c' X" T4 D( Q3 ~- {+ o( w( W9 u7 O
  690.         jmp     _set_hor_pos
    ) o0 A6 X. K' B7 Y! C
  691. set_ver_pos:  M% w  |" p/ J
  692.         jmp     _set_ver_pos
    8 C$ i5 {8 U0 u4 ?0 p. L/ H# d
  693. get_mouse_movement:
    5 e7 m2 \2 u( ~7 q
  694.         jmp     _get_mouse_movement  ]% X% Q0 Z  N6 M0 F
  695. set_subroutines:% u  x$ E8 C. o. d
  696.         jmp     _set_subroutines$ b* `0 N1 _" _6 `9 W
  697. swap_subroutines:
    , o! ~3 E% ]: N: s$ ?. f
  698.         jmp     _swap_subroutines
    2 h9 P% q2 F! }$ ~# H
  699. * }9 c2 o' w; Z* V8 g% A) k
  700. _reset_mouse:
    ! A0 A3 Y3 |; Z# d6 u+ G
  701.         mov     byte ptr cs:[buttons],0
    $ T# ~3 B0 I9 J2 W. S2 g5 |
  702.         mov     word ptr cs:[pos_x],0
    ! r1 t  E  c1 R4 h, \* }
  703.         mov     word ptr cs:[pos_y],02 X' A- @. X9 O! P% \
  704.         mov     word ptr cs:[x_move],0
    0 f) D0 n( I0 W5 C9 u3 q
  705.         mov     word ptr cs:[y_move],0( @* ^) ~/ {2 z) \& r
  706.         mov     word ptr cs:[x_max],639
    9 r' K3 j4 ~/ z0 I# ~- t
  707.         mov     word ptr cs:[x_min],0$ u9 g+ ?4 ^: @+ U+ U$ L2 q, B
  708.         mov     word ptr cs:[y_max],199% D/ u% o2 ^; i
  709.         mov     word ptr cs:[y_min],0! A: o7 F6 k% Z! x
  710.         mov     word ptr cs:[user_mask],06 r4 t* F: |5 N3 T$ M
  711.         mov     word ptr cs:[user_subroutine],0( ]) r' P: a: z
  712.         mov     word ptr cs:[user_subroutine+2],0% Z' R) k- C& o1 ?/ o  |. t
  713.         mov     ax,0ffffh
    8 R7 S5 b. G: A1 }0 l
  714.         mov     bx,3
    % D/ \/ z! E; O. [
  715.         iret5 U" m: D. h9 V5 r. g

  716. , T. g( g. Y3 `. K( a% y" X
  717. _get_pos:/ y5 X/ J" q6 ~, K' c& F
  718.         mov     cx,cs:[pos_x]
    * H+ y2 a+ R. x1 y3 D7 ~2 r
  719.         mov     dx,cs:[pos_y]. w- ~2 f9 P! B% a: R
  720.         mov     bx,word ptr cs:[buttons]$ E# \& _; B( S3 o7 D: P1 o
  721.         xor     bh,bh
    : n8 |: {0 Z2 p& E1 v. v& @
  722.         iret
    - v! w; T/ L( H; r7 f

  723. 0 H  u9 T8 g) {* \( X
  724. _get_mouse_movement:! ^1 A  }* Z. j) }
  725.         mov     cx,cs:[x_move]
    2 R$ e& R0 q3 q0 S2 C9 ]0 A3 k) c4 x
  726.         mov     dx,cs:[y_move]
    5 O5 M' y9 {- G
  727.         mov     word ptr cs:[x_move],0
    9 w3 C8 N4 t0 `! L+ s
  728.         mov     word ptr cs:[y_move],0
    " h" c; N4 ~2 A; P  F: K
  729.         iret
    ; L* s% y6 G) l# k' `8 b0 @$ r# y

  730. - t& p: c! ~( ^' m$ L  m
  731. _show_mouse:
    ! [: B" W. [, [; B8 N" F! T
  732.         push    ax3 ?/ ~' J+ Y6 x; [& t
  733.         push    bx! z  U/ U: L2 A: Q& ^
  734.         push    di
    , V- E9 X* o/ q
  735.         push    es  E. J0 _5 H9 [9 q: X9 P" c& K; b
  736.         mov     byte ptr cs:[sm_flag],19 r; {) h0 Q7 E* C5 I( s
  737.         mov     ax,cs:[pos_y]
    5 S' Q% i7 d$ y, n2 J9 N
  738.         shr     ax,3
    ( _6 w7 a# [3 m
  739.         mov     bl,800 m4 _% u. S6 w: x
  740.         mul     bl
    ' Q; @; L0 `( a) o% B+ x( Z
  741.         mov     bx,[pos_x]
    ' {" c  |0 D. `2 N+ H
  742.         shr     bx,35 D' }  P; E9 V) }/ R1 \
  743.         add     ax,bx
    , R0 d3 `- Y) C) a
  744.         shl     ax,11 I' s! V" K: k8 t
  745.         mov     di,ax6 X, o5 c5 I) C7 o) J
  746.         mov     ax,0b800h. W% _: v8 M7 I
  747.         mov     es,ax
    6 o: n* g, Z0 I4 m7 l, @
  748.         mov     ax,es:[di]
      B9 m+ Y- [2 N1 ]: Q9 D7 f
  749.         mov     cs:[save_char],ax, T, P; y# @" C! k: f
  750.         not     ah
    8 z3 m4 p% ^; f+ ^
  751.         and     ah,7fh
    ( N* G( y" x) O/ T, p/ b4 q9 b
  752.         mov     es:[di],ax9 ]7 O$ y! v! U, _
  753.         pop     es. Z$ w9 a2 _5 [, |$ g/ ]2 K9 E
  754.         pop     di4 T& R* U: E$ [" O9 g9 E4 G" y2 J
  755.         pop     bx+ R% L( `# \! ~3 Y  O0 N
  756.         pop     ax
    7 g: C9 _! c/ Z2 o# ]. H9 ~* z
  757.         iret& g9 L/ |) L! G: o; g

  758. 9 B* K3 A; j: c' f; T
  759. _hide_mouse:- w4 {( P9 o6 x" k* ?
  760.         push    ax
    ) S& n0 G; N" V- e% m9 {$ y- E
  761.         push    bx
    * \$ R! L6 G& j& y% W* _8 Y/ @
  762.         push    di
    ' I+ M- U  q. ^8 S' ^" A* N
  763.         push    es
    9 h% P0 `( M/ \- a
  764.         mov     byte ptr cs:[sm_flag],01 t1 r. f+ L' X8 b* E- [
  765.         mov     ax,cs:[pos_y]% J. `( t# H! e; ?6 r
  766.         shr     ax,3
    ' @7 t! k' T3 |$ j' j
  767.         mov     bl,80" |' x4 J" d4 n0 a5 v" T5 T! ]+ [
  768.         mul     bl
    ( N0 r5 z$ a- ?: Z! Q
  769.         mov     bx,[pos_x]
    5 n1 U1 \8 b. h
  770.         shr     bx,3
    $ J4 Y: g$ O4 q3 {4 O
  771.         add     ax,bx. K. h$ ^/ ]. X  u+ J0 F# D; k, _
  772.         shl     ax,13 |" S* H1 `; w6 P) O
  773.         mov     di,ax
    ' v6 f  W. ~6 h4 z
  774.         mov     ax,0b800h
    4 p  W+ U; j9 p5 V: g
  775.         mov     es,ax; S1 m4 d: Y7 m- [: _% S) q3 ]
  776.         mov     ax,cs:[save_char]
    1 O: P7 ~: Z' d
  777.         mov     es:[di],ax
    % @, F- j- P4 R) m) ?
  778.         pop     es/ j7 u. E4 e( W9 {, z3 z
  779.         pop     di
    ! p3 j* j, D3 D8 i
  780.         pop     bx. ~0 t+ O) w. D7 H, d3 R) s
  781.         pop     ax6 k: P8 L2 c. J4 p0 s" Y$ C4 A. k
  782.         iret
    7 @8 P! h! o1 p" G7 l$ {# f

  783. ) k/ [4 x( ~1 n" Q) z
  784. _set_pos:
    2 w2 |7 A" P7 F  ]- B7 q  `* `
  785.         mov     cx,cs:[pos_x]
    , T9 T) ]) S; g- q$ U
  786.         mov     dx,cs:[pos_y]( _3 O# n, o- L5 g3 M$ ^
  787.         mov     word ptr cs:[x_move],0+ n$ A2 J; L0 }! ?0 b: J
  788.         mov     word ptr cs:[y_move],0+ @/ h8 q% A/ B5 i$ D
  789.         iret
    / h! |( G! K5 p4 ~8 H. y

  790. 0 W% w  e3 S0 x, Y3 S. Q
  791. _set_hor_pos:
    + p5 s' M, Z# Z
  792.         call    max_min
    ( {" |% K; B3 G$ I
  793.         mov     cs:[x_min],cx  X1 Z# V) b! U( G1 @( a1 K
  794.         mov     cs:[x_max],dx, z2 o% @! @* Y( |* o3 W
  795.         cmp     cs:[pos_x],cx" f$ Z# X# x9 S* ~( Y
  796.         jge     good_hor_min0 K) Y4 j5 q" q) l* {$ q) t
  797.         mov     cs:[pos_x],cx7 n* V( X3 @& F4 G3 T& B9 `- n0 G
  798. good_hor_min:
    % _" N8 C" s% l8 B/ r1 _
  799.         cmp     cs:[pos_x],dx
    ) P& |# V1 W; K* T0 a
  800.         jle     good_hor_max* ~( R& b- Y3 P' r$ y' q; A0 R
  801.         mov     cs:[pos_x],dx% I- P, p8 x1 v
  802. good_hor_max:: _0 D' ~+ l/ r7 ]( H3 e8 c
  803.        iret) m* k# R/ z3 a0 K, I
  804. 4 |8 i) o  F9 Q7 h8 R. a+ o% U
  805. _set_ver_pos:
    * O; r5 A; B% R; ]* l5 _1 k
  806.         call    max_min3 l1 N* z$ M4 N0 E6 t4 W
  807.         mov     cs:[y_min],cx
    % e9 p. b: o8 N) S' l8 O
  808.         mov     cs:[y_max],dx
    ' D8 d! T( o6 q2 r" G" a
  809.         cmp     cs:[pos_y],cx' s  Q0 S( z+ g; H1 X4 E
  810.         jge     good_ver_min
    / [# `, w  A* `9 d# R0 Z. ^2 y
  811.         mov     cs:[pos_y],cx
    + {+ i: s3 A) q) e
  812. good_ver_min:  D4 j& K- n1 Z( y% d
  813.         cmp     cs:[pos_y],dx4 [) R6 K4 u7 T: ^
  814.         jle     good_ver_max: J/ [. p$ f2 y& o) r5 X
  815.         mov     cs:[pos_y],dx
    - ^; {/ d: w1 m* m2 ~) W" t
  816. good_ver_max:, z# E/ i/ }8 g; j
  817.         iret
    1 V& W; O9 b8 O& b. U$ j& W
  818. + J# Y: P7 A% A% r7 g
  819. max_min:
    - Y- o6 }% U+ r6 b$ M" ]; x0 p) q
  820.         cmp     cx,dx3 H! {7 b  D- c
  821.         jle     no_swap
    ! p$ I# o4 O; a
  822.         xchg    cx,dx
    ' d2 n) V+ i% Y
  823. no_swap:8 u; x& y, n+ @5 `7 \3 z  e$ V
  824.         ret
    ; [' l2 B! y, c5 i5 r
  825. 2 Y" i9 G0 }' R6 b' v6 N5 T& L
  826. _set_subroutines:
    ; F- d% S# _0 D
  827.         mov     cs:[user_subroutine],dx2 h! K% N$ h. J6 E3 s
  828.         mov     cs:[user_subroutine+2],es
    9 b, v; y0 h, V( a* w, Z
  829.         mov     cs:[user_mask],cx
    % R( J* A2 m" z5 G/ }2 f  ]
  830.         iret1 y& q  W9 C; w  J; J; P+ `

  831. % H6 t; p& w/ X' T
  832. _swap_subroutines:% O0 j9 w, ?3 @6 z: W! K( E
  833.         push    word ptr cs:[user_mask]7 e) {9 g: b0 Y  `6 ]& L
  834.         push    word ptr cs:[user_subroutine+2]
    7 n. A7 d- g( P- A% e7 Q3 h2 W# L
  835.         push    word ptr cs:[user_subroutine]3 s' i9 }) V# k7 K$ s3 ?
  836.         mov     cs:[user_subroutine],dx- _( R: w" V7 K7 A0 }% X$ U& B2 G
  837.         mov     cs:[user_subroutine+2],es
    ) ~. o1 X' u, c" _* m5 `$ }
  838.         mov     cs:[user_mask],cx
    8 Z) @8 m" R* i) h; @0 S
  839.         pop     dx
    , z  {. x! ]3 a
  840.         pop     es
    , d) t1 w9 V$ X
  841.         pop     cx" _& W5 J# L3 p
  842.         iret
    ( e8 O" M- s" A, z+ N9 _

  843. 9 C/ h1 P5 |% }
  844. memmouse        endp/ S$ f% i. Y9 A8 k" L& A
  845. $ o( ?* o: @* Q/ d
  846. endof_start:" i% v' n3 T# C/ O! }
  847. ) o8 Q% r4 P7 e) S- @, m7 @
  848. emsg db 'No mouse driver install error!$'
    ' z1 w) n: e2 I; q& K: |, k( |
  849. old331 dw 0
    ! Y  s' S) G4 n  G& f# j6 i
  850. old332 dw 07 R! z9 k0 M7 J
  851. old741 dw 0" ~( ^0 l+ z: ]% y9 ^$ q
  852. old742 dw 0
    7 Q3 c6 C7 A5 g7 x1 W/ r3 h7 K
  853. memcopy db 0* f' V8 t/ a. ~& s& x3 Y
  854. okcheck db 0
    6 o* Y9 G; E! Y1 X
  855. pass db 0
    4 Q* N! T. A2 M. N. A9 s8 c
  856. chkl db 0. b$ u* ^% b% V  C
  857. lk db 0
    0 K! _' `2 O) v5 [5 y& J& u* Q
  858. chkr db 0) N8 b0 a5 z1 h1 U
  859. rk db 0- F/ f3 I+ a: {% D, Z6 g
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    6 k: O6 B' H# K* w- L) P
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    # I4 t, U( S9 G( G0 _0 h5 M* H
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '0 H! O5 B, Q, j
  863. db '                                                                                '
    4 J4 ~& s$ b6 b) O+ h
  864. db '                                赏屯屯簧屯屯突                                  '
    & L$ O4 n' X8 H- Y0 K
  865.         db      '                                ?OFF汉OFF?                                 '
    2 L) X+ V  V- B' a& B
  866. db      '                                韧屯屯既屯屯图                                  '
    - N" p" o+ z( A( a* B, Y
  867. db '                                                                                '
    ! V9 r$ B5 G+ i
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '! S7 t( a5 X9 G* l9 H
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' " {6 V% R. c: n6 E" T
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     ') O& m9 x; ?0 P$ k0 T4 Q
  871. & A* u% d" M" Q" p. D
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
8 @: q$ W; C1 n% B& w哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
. A, Q6 H/ k" {# x. Z! H( L' B* v; Q
$ W; ~5 O# t2 ^# {谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 12:06 , Processed in 0.061600 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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