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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。/ L6 _+ W7 F8 b* k. ~

0 ]( e/ x! K% O) g! V0 j# X0 M代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    : F* C1 N! W* n0 h% p
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    - M% k4 T) }# [: k2 O' b
  3. ;                                         By Bini.Yi 易祝兵2 v9 S4 P) P1 S" H, N! l
  4. ;                                         http://www.ufoit.com 计匠网
    ; Z, v* b  i$ a, i' z( g7 \/ x% z
  5. ;                                         2002/04/06 YYYY/MM/DD
    : z+ Z/ e) }7 E& V+ d, n9 T. ^
  6. ;
    ( S, X1 M( K% p  [
  7. ;         
    0 b8 W6 P$ h8 j' H  v& e
  8. ;          This program  test the mouse button  click and move.. i8 T( [1 m7 l* X2 T) z4 W
  9. ;
    3 Z& ?: B+ Z# b2 K: |1 R' ~, ]

  10. ; R7 U2 U& p1 P0 E0 V0 q
  11. .model tiny: n+ p8 x: H3 a+ @; S; ^
  12. .5869 o2 s7 R% s7 c
  13. .code
    3 P7 F8 ^( M9 Y* l
  14. .stack  100h, \% a+ s, w2 r; R: |/ x% b
  15. .startup
    : l. t+ q3 [9 u, M- {
  16. pusha
    3 i7 W7 ~8 J# d% o/ Y' X; l( V
  17. mov ax, 3533h
    & I) z; z* f1 y0 x
  18. int 21h
    2 E: }3 i% |0 B2 Y( {
  19. mov word ptr cs:[old331],es
    1 `0 q& a; C8 O  H. u9 S
  20. mov word ptr cs:[old332],bx
    : y. @0 w: k9 o7 w, Y  @9 `
  21. mov ax, 3574h
    % w! D$ s5 O8 q% W9 ^: A
  22. int 21h4 d  S4 o- m1 f3 }- I4 h
  23. mov word ptr cs:[old741],es
    " D% b8 N9 q1 x. [
  24. mov word ptr cs:[old742],bx5 B1 G; _% h/ \( Q# W, v
  25. popa
    2 M" Y3 W% H/ O4 g8 ^  O3 J7 N
  26.         call    memmouse
    ) }2 X! j7 P3 C
  27.         mov ah, 00" [) N$ x2 U7 C7 W
  28. mov al, 03* @2 T* D' M% s
  29. int 10h, d4 s* m) G: G% y
  30. mov ah, 06
    / _* {6 `& R# V5 j: e! w1 b( t" B
  31. mov al, 0
    . |2 P4 t5 n' @( `/ X
  32. mov cx, 04 Z) R( c0 c. H& @6 a# }' l
  33. mov dh, 24% H8 {' c( t$ U9 {1 N
  34. mov dl, 79
    % X, ]+ r+ S3 i5 ]2 r! M* I
  35. mov bh, 07h
    1 `: T" g) D7 K! X+ n- e3 p
  36. int 10h- X' A0 o8 m0 q+ I" e% v. }
  37. mov ax, 0000( w' M5 j: [+ d: O' a, c
  38. mov bx, 0002
    / R* a8 [9 U% ^3 V- y: V3 l. M/ ~
  39. int 33h. t! K6 a* N) Y7 n# l" f% l
  40.         cmp     ax, 0000           ;if no mouse drive install( |* ?! ], J7 W2 |0 ]# o
  41.         je      errormsg           ;show error MSG
    5 {+ y" \, s2 s
  42. mov ah, 02
    7 c2 e, Q$ I2 E! g' a5 }% j6 h0 f
  43. mov bh, 00, @' c: C& {6 t' _
  44.         mov     dh, 25             ;Move point out screen
    , c4 \: ^4 M1 y# v# Z/ t
  45. mov dl, 79. d1 n" h" x& G. U+ D
  46. int 10h
    ' @; U5 O0 O/ k/ e  R
  47.         call    showmsg            ;Show info
    , m1 ^8 {% ~" F- ^
  48. mov ax, 00016 j$ T4 q: S4 o! e6 T+ |, R
  49. int 33h
    ; u5 O) \. w) h1 r- H! A9 P0 Z* i: K
  50. ; mov ax, 000ah
    ( A/ Q1 Q# A: p
  51. ; mov bx, 0000) O8 Y7 X9 U* e0 M# x3 V0 Z2 h
  52. ; mov cl, 0h
    ) w* a5 f% g1 \4 I- O
  53. ; mov ch, 0F0h
    : J8 Y0 x1 I5 w( x! c3 P  U- C
  54. ; mov dl, 0h
    4 r' ]9 D$ L. k- D$ _( n
  55. ; mov dh, 0F0h
    % q7 C0 O. g" M7 b4 g+ Z3 ]8 W
  56. ; int 33h
    ( m, R* E) F$ \+ o$ O' n
  57. mov ax, 0004h
    5 f3 R" X2 @8 f/ e
  58. mov cx, 0319+ O( U; ]/ j; v' R/ {
  59. mov dx, 0103. `5 g6 k; ?( }
  60. int 33h
    # B# J' }# k5 @$ e! b$ k
  61. casemo:                           ;Case button click and point move ; C' s7 o! D  O* S
  62.         mov     ax, 000bh         ;and keyboard press6 `5 p) `  e- N7 N! e3 y; _
  63. int 33h; L- f( x/ |+ x! b3 R! w' A4 E' D
  64.         cmp     cx, 00h           ;if point move....X. c6 w7 f% q8 {# _/ V. O; h
  65. jne xmov
      ?1 d" m2 N0 V0 q& [, H$ A7 }
  66.         cmp     dx, 00h           ;if point move....Y! W+ c7 {1 J7 e# D( u. V2 Q9 d
  67. jne ymov: c# v0 s; ^1 L3 {& H
  68. xymovend:                         ;X.Y move end
    7 G* m9 A4 C3 T7 |
  69.         mov     ax, 0003          9 K# {( Z$ }6 q( c1 W3 |
  70. int 33h% L: w. W; w9 @3 n3 X
  71.         cmp     bx, 0001          ;if left button click  show ON- r$ W9 M2 t2 h4 m" {$ U
  72. mov si, 1828- ^" l6 l0 b) }1 \
  73. je listl  T2 p$ l# A2 L9 h& {9 c6 ]
  74. mov si, 1828/ ]5 E0 n5 J) N# x
  75.         jne     nlistl            ;if left no click show OFF6 j+ O" {+ Z' X, M" i" D
  76. testr:0 M6 x% O4 ]7 r9 ~# _
  77.         cmp     bx, 0002          ;if right button click show ON: F4 |0 {7 Z! y1 q9 G
  78. mov si,1842* y- n7 `+ r5 S$ a
  79. je listr
    & b! r1 A: G, |4 C
  80.         mov     si,1842           ;if right no click show OFF
    - r' n8 x% K# M: Z' \
  81. jne nlistl+ O* I) J& C! z, x: B! q2 q
  82. casekey:
    ! I7 L6 Z- W% c0 g& y& H" q
  83.         mov     ah, 01            ;if any key press jump check
    & x% l2 g6 |! v7 A: o
  84. int 16h
    4 G1 u6 H" Y6 k4 n" }* i& [
  85. jne kpress" t' F9 e- X  Q/ m
  86.         mov     al, [chkl]        ;check x flag
    $ c6 Z, ?. A8 N4 ~- |7 |1 R2 ?
  87. cmp al, 02h
    4 P) |, S- \. J' r
  88. jnb chkok
    ; t$ i/ m. y8 b. y% s" H
  89. jmp casemo
    # E6 Q0 ~$ k' c
  90. xmov:                             ;if X moved, get the X flag+1
    7 q' d+ J  `  J; D" {$ a$ ?
  91. mov al, [chkl]1 o. L0 U# A3 g% O. n
  92. inc al2 i6 d# Q7 k" U3 g; O& e
  93. mov [chkl], al7 e( p8 o- X, {5 u3 N' V, Q0 r9 t
  94. call passok
    ! e9 N3 a! g3 i8 G* i# x
  95. jmp xymovend
    % y. s5 ?( k8 m. U' X; s- G
  96. ymov:                             ;if Y moved, get the X flag+1
    + J9 ~7 |# ^5 w( p: y  t
  97. mov al, [chkr]
    % j; l) L2 z* _. v# Z' E
  98. inc al
    2 V; {4 |' M) S" k
  99. mov [chkr], al
    ! {* q: @2 A* X& M" u/ K' S2 q
  100. call passok
    9 `0 k6 g& P" ]8 ~! S& L2 ]. }
  101. jmp xymovend4 c( B$ i1 q/ _" s
  102. ( B: j3 }2 w7 |( J& Z' u
  103. passok proc near0 [9 k1 Z9 N" M& T
  104. mov al, [okcheck]
    8 b/ |0 M, G0 x
  105. cmp al, 1
    * M7 ?2 j4 X% |6 \
  106. je let0
    - f/ x3 m! s: m
  107. jmp passret
    3 U  R! l0 p' m8 C
  108. let0:
    0 \" l3 L7 \5 I% D. j' o, W
  109. mov [pass], 18 N& P# ^0 q% b0 r
  110. passret:2 d9 q. b3 w( n( z/ p  R
  111. ret
    3 d* Z$ e- ?- C0 }
  112. passok endp 4 z: c1 d4 {6 w0 @
  113. - ~/ k4 m3 |* y1 l( n- P. {
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    3 F! z2 Y$ W7 g4 m# X
  115. mov al, [chkr]+ u8 k4 y1 X- w3 J0 K6 [2 x
  116. cmp al, 02h
    3 O4 V! J0 R: ?3 P; Y
  117. jb casemo
    # Q6 ~3 t: O; h, _; n
  118. mov al, [lk]) B( c# a% v: W4 l) C2 x9 Z
  119. cmp al, 1
    ( \% A* |6 N8 f4 ]! i0 q
  120. jne casemo
    9 h! @4 q8 R9 ^
  121. mov al, [rk]; S( }, C" z& C' y, ]/ H! |0 u1 e
  122. cmp al, 1; f* X" \) a2 N' n& W
  123. jne  casemo
    $ g3 X2 O6 Q' |$ A4 {
  124. mov [okcheck], 1
    # k5 z6 o7 i5 T
  125. mov al, [pass]0 d3 L$ g9 y$ \$ G: H; K7 z
  126. cmp al, 1
    9 Z% L2 c# a' G- F) @4 \
  127. jne  casemo$ ~# n; L4 S9 e; r7 k# _1 w1 M2 [
  128. mov ax,0002h
    2 I! N; S# B: F% R: K) E9 X/ d7 A) a
  129. int 33h
    ' W" d/ h( i8 t, Q
  130. call cleascr
    ( V: E+ t+ z$ X  i
  131. 5 J: U( b/ d) {! J
  132. call oldint
    / U  h- f3 |  R5 H' T% i: g
  133. mov ax, 04c00h# ^1 j5 p0 u- z% c, }% F6 E9 c
  134. int 21h
    + P  |( U' A. `; a5 w6 l

  135. 8 O3 D6 W+ O' M2 R, k- c2 [
  136. okexit:- y. j0 f) i4 m5 @5 l6 t
  137. mov ah, 4ch+ j& }, d) n, S7 ?8 O
  138. mov al, 06 ~  H8 f  Q7 i2 V9 T& ?6 U
  139. int 21h. p* |2 o4 Q$ t/ Z( B9 a0 c
  140. listl:                                 ;Show ON
    & D0 Z' \0 H* J- o$ H
  141. pusha0 I+ n$ Q. M& L" }% o5 l8 a
  142. mov ax, 0b800h
    1 y- [+ f0 |3 ^$ K
  143. mov  es, ax, w/ o: D1 [' X5 b+ ^5 P
  144. mov ah, 47h
    * b9 Z" K0 a; d& p9 M1 ]
  145. mov al, 20h5 ^) ^- L5 d8 U" m
  146. mov es:[si], ax; y! ]1 F7 t/ c' m
  147. add si, 02
    2 z: g5 f, e4 e
  148. mov  al, 4fh
    1 H6 z/ S; V9 V8 H/ P5 Q
  149. mov es:[si], ax# b+ K. E" x0 r
  150. mov al, 4eh$ k# O$ E& v$ O! s4 w. o
  151. add si, 02
    7 R7 p4 x2 Y  l% a6 T
  152. mov es:[si], ax( n/ z6 s" Y6 f
  153. mov [lk], 10 n6 T, i7 O. R; G" ~6 ~% k9 S
  154. popa) v0 p( S5 ~9 z3 Y+ K: ~
  155. jmp testr
    6 `( _6 o7 X1 B
  156. listr:                                 ;Show ON; v0 Y+ H2 \$ `# Z
  157. pusha  ?( G9 w5 r+ s- K8 i; a
  158. mov ax, 0b800h
    6 S6 A/ N4 N$ N2 k; O
  159. mov  es, ax
    ! t& t0 w9 r& i
  160. mov ah, 47h
    7 o+ I& C% K7 E. {  O
  161. mov al, 20h
    # x* W  N' m+ o- z% O$ ?
  162. mov es:[si], ax3 i. J0 c, F3 A6 @, k2 m- W6 |
  163. add si, 024 O5 y: q% O5 V& W  r" ?; R
  164. mov  al, 4fh2 @' X" @! H* [
  165. mov es:[si], ax
    4 \! w1 h+ {: k3 A) A& V' n) z
  166. mov al, 4eh, J& R9 }( |( R  R% V2 o2 W
  167. add si, 028 u% W& Z& q$ ^3 Y
  168. mov es:[si], ax: t' P7 k4 t! |6 c) x0 s/ _
  169. mov [rk], 1% O! c) c; F0 c/ x; U
  170. popa3 b: G: ?9 [' u7 {0 \9 U7 F
  171. jmp  casekey
    ! L' e' K; |; D# r( m

  172. $ C8 N' b, l9 M% a" J7 u( s  j
  173. nlistl:                              ;Show OFF! E7 r$ q! R  j2 Z& P! v$ e# c
  174. pusha   0 w. b2 g: v  L0 o' c
  175. mov ax, 0b800h8 i0 f3 \. c, ~( V1 a" I
  176. mov  es, ax
    6 d. N# ]- d* o: u
  177. mov ah, 17h
    & ^! ^. n1 C' g! z! `. l( Q2 v
  178. mov al, 4fh
    : t1 U5 |7 I" h8 A6 D$ p
  179. mov es:[si], ax
    0 i, n" o- r' y% R6 W
  180. add si, 02$ Q+ s. z+ g$ ^3 _& l. o
  181. mov  al, 46h$ y9 N0 z8 ^# P9 I
  182. mov es:[si], ax# I$ z" ~" B" j7 C
  183. mov al, 46h8 e0 x6 X* R) d) q
  184. add si, 02
    : v5 d& L) L' k
  185. mov es:[si], ax4 v! b9 T; f( N3 N+ M
  186. popa
    2 ^1 y+ ^: y7 m1 g
  187. cmp si, 18407 e9 R( e/ T5 V: Y0 f, X) I
  188. jae casekey* ]+ N* ~/ v0 ~
  189. jmp testr
    ) x% [  b0 R8 v) m1 E

  190. ( j, k+ p$ V3 k& B
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    * m- f$ ^; N1 z- v4 }
  192.         cmp     ah, 01h             ;and return a error
    . q4 S: ?, v/ d7 r0 o) V1 f, f
  193. je exit17 P7 t5 d0 }$ v( ^: E+ o
  194.         mov     ah, 0ch             ;if press other key then clear
    - [' W1 @# j2 C- W5 l
  195.         mov     al, 00              ;keyboard buffer* V, B: N. c: |3 _& s! z
  196. int 21h
    & s% n* |2 `9 M0 T4 k
  197. jmp casemo
    & s8 g9 i8 O" F0 }" i+ e' [; t
  198. 3 n! a6 r8 f+ m: ~1 b" I7 \0 M
  199. errormsg:                           ;if mouse driver no install
    & G; Q) _3 W! V* a9 ^$ L( P
  200. call oldint0 j  P2 D2 _& n4 ]) D, x4 t3 i5 G
  201. lea dx, offset emsg
    8 d% u7 R- V+ o2 @
  202. mov ah, 09h
    % x" F  O- J% O% n. X
  203. int 21h
    ; @' `8 w# ~2 i+ E1 z6 ^/ }8 P
  204. mov ah, 4ch& L9 x9 X( B* A; k, s0 G5 K
  205. mov al, 2" \8 T6 u% Z$ K, h' j8 \
  206. int  21h
    ! g+ C/ V* F- T0 Y; f6 `% t
  207. 6 ~# z) j' g& U) J; }
  208. exit1:                              ;error exit  o* h! I4 x7 @
  209. mov ax, 0002h6 P3 L- P) m8 C. J
  210. int 33h" |, [6 ~0 X6 V' h
  211. call  cleascr! ]9 g' ~" m/ a* p5 I
  212. call  oldint( ]7 ~" R/ _- Y; F7 i1 X9 X8 H
  213. mov ah, 4ch" [% y0 d' d! L$ Z! C: K
  214. mov al, 01
    2 ]) W& N# ~: v0 p3 H5 C5 Q
  215. int 21h* t7 W6 z2 x( B8 M4 N6 f2 h

  216. # L$ ~! Q( s4 B
  217. cleascr proc    near                ;clear screen9 N' i" C4 F: A2 E  H
  218. pusha  w' n. Q5 y7 f7 g$ N% c- B3 G
  219. mov ah, 06/ u( S' o! g* K7 a8 ?' |4 u7 {% f
  220. mov al, 00 o" q+ N$ F* n; ~0 f( a2 N
  221. mov cx, 0
    ( x% @7 t& q( w% u) Y, }, k/ M$ e
  222. mov dh, 24
    0 G3 [! j6 y2 V+ v- w1 ?
  223. mov dl, 79# |5 ~/ e) \- J/ K+ A5 W/ z  c
  224. mov bh, 07h
    9 y0 V5 I6 J5 l7 x9 i8 q; {2 u
  225. int 10h5 _' F2 R  G* U& _, C
  226. mov ah, 022 A+ n( m0 `2 ?
  227. mov bh, 00+ A( T$ m0 M# ^" m
  228. mov dh, 08 L/ Y+ v2 |, o
  229. mov dl, 0
    ( W( G3 L/ z  |
  230. int 10h! ~, G0 C7 k: D- T. F! j
  231. popa
    2 `% U3 i, q; P1 P) Q# _; K- M
  232. ret
    # Y7 J8 \- P6 R9 w$ P/ b
  233. cleascr endp3 w/ B2 b3 ?3 y6 a. z  o' W0 Q
  234. ; a3 m: T- v* u# Y0 L! z/ w
  235. showmsg proc    near               ;Show info1 c0 Q) {. O! H: s
  236. pusha
    - J- a0 z& v' F
  237. lea di, offset showms
    5 E2 u9 O  ]" z' p5 ~/ `9 ?
  238. mov ax, 0b800h/ X& z/ E- @. r( L/ q1 o2 |
  239. mov es, ax
    ) q9 R, o8 H1 O$ X( y
  240. mov si, 0
    9 K" d$ k0 [- @
  241. mov cx, 480$ \2 q$ b+ M, n& A( j- f/ w
  242. mov ah, 07h2 ]( ]2 j1 p. s. g7 H
  243. @@:1 _- `" _: j! c5 U, d* u
  244. mov al, 20h& j1 d8 M! }0 R1 q
  245. mov es:[si], ax" r0 e2 P2 `! I" [; s9 ?
  246. add si, 2
    - X2 g0 q6 b% D/ S" r5 `8 \& w, j
  247. loop @b
    ' c& {$ E8 R3 u. Y* U  I) D  L
  248. mov cx,880
    $ F, r# U3 e! E6 k: j3 G% i7 A
  249. @@:
    ( B  M. r$ R" W5 D  i
  250. mov al, [di]) S- a' d5 `  C
  251. inc di" ?& D4 h( W) O" a& p, s# s
  252. cmp al,20h7 ~4 e+ P6 P% ^! R6 c, Q/ I
  253. je showch1+ j$ U3 n, a5 a( G$ f. V
  254. mov ah, 17h9 A5 ]4 n. w! d3 r+ ]: }
  255. jmp showch3
    4 S2 l* J4 A) R! b3 G
  256. showch1:  r6 `1 D$ a4 r
  257. mov ah, 07h : C, O( e1 Y- O$ Z: i3 }
  258. showch3:
    ' G# Y# a; t: I$ W4 [0 S
  259. mov es:[si], ax
    0 Y2 w! [  I9 U+ X
  260. add si, 2! @. W  G* ~% K3 g# H
  261. loop @b
    . f, f, q0 v5 E" `7 \( X) x
  262. popa# \4 S& v, V2 h4 g/ Q
  263. ret
    : d* I" ^8 ]# r; z6 F$ L# P- o) ?- c
  264. showmsg endp
    $ d$ Z, f& c  I

  265. : m3 K# F8 V0 R9 s
  266. oldint proc6 c* f5 G5 _# i* M, e
  267. pusha1 I7 P( O6 y- b2 V
  268. mov ds, word ptr cs:[old331]/ c, D; |7 n  |9 z) Y' |( _/ V; U
  269. mov   dx, word ptr cs:[old332]
    ; l. S" B- A  ]% x. S
  270. mov ax, 2533h
    ; {  M, P5 r& [+ }; U6 b
  271. int 21h
    1 u% K4 S0 I, j* B; x
  272. mov ds, word ptr cs:[old741]7 J1 l; I: ]9 J# L/ m8 t5 k+ S
  273. mov dx, word ptr cs:[old742]
    % F/ L) F6 V9 A6 A- C* C8 D
  274. mov ax, 2574h5 q! o# r& D. Q
  275. int 21h
    . l* Q+ u  ]& }3 \' E4 s
  276. popa7 L) V! o6 S! \
  277. ret6 M( o( u' ^  u* f5 A
  278. oldint endp
    9 ~' {3 o  j' n( d$ Y

  279. ( q5 S7 }( y- }
  280. memmouse        proc
    , w6 i7 X4 A8 {7 L3 A( V/ i
  281.         xor     ax,ax
    " {, L* ^* ^7 `" K
  282. int 33h
    ' `" w/ D: ^1 P) |/ v( m: u: M3 D) G
  283. cmp ax,0ffffh
    6 ?7 H6 ^: S) c- v$ t0 U
  284.         jne     not_loaded4 V& [* L7 @0 w; O
  285. mov [memcopy], 19 ^: a  f6 t+ v% q: q9 M6 B9 o
  286. ret
    . [% T6 r7 j) C2 Z

  287. ! L5 s! M  {6 `  k4 H: t- Z
  288. not_loaded:
    : K& l+ d0 T' U

  289. 7 d6 T1 n) N0 t8 \$ D
  290.         mov ax,2574h. ^+ M" I( T9 |8 _6 w& M
  291.         mov dx,offset new_isr8 W: G  `/ w1 j' I
  292.         int 21h
    " U% U  W2 g# |
  293. ) v/ O- B3 u, ~' E4 {' _7 t3 z! X$ @
  294.         mov ax,2533h
    - R* B9 u8 M+ K
  295.         mov dx,offset new_337 x) \" k5 }- T1 H/ p4 b, O. C- ]
  296.         int 21h
    - N- L' c- a3 l

  297. & B9 c6 H$ x6 Y( O8 P
  298.         cli
    * U5 v) c; E7 K* U# z
  299. 6 j, a) a/ W1 {3 A% H
  300.         mov bl,0a8h8 j0 I5 a5 s5 x' U( b
  301.         call keyboard_cmd
    & C, {& m  h. Y

  302. 8 c* X2 G2 K: I4 ^: Y
  303.         mov bl,20h7 {3 m3 f  U8 F
  304.         call    keyboard_cmd$ r" q' N, s6 Q! G' c
  305.         call    keyboard_read
    ' D) X% P, b$ S3 {3 H
  306.         or      al,2
    # J7 T9 I6 C* b0 w4 F
  307.         mov     bl,60h9 ^2 B. A/ F0 a# n, }4 S7 y5 z' {
  308.         push    ax+ E/ d  z( ^$ I3 Y& r
  309.         call    keyboard_cmd3 b% b; ^' F8 f& Z  r6 E. j
  310.         pop     ax3 l8 e9 W# d& N6 _  r  _  M' q
  311.         call    keyboard_write6 }0 _- }3 [  ~; {. q5 B
  312. $ g' N9 ?' y. @: q; E
  313.         mov     bl,0d4h* s; Z6 P0 d' s0 r1 W
  314.         call    keyboard_cmd
    1 N+ z/ z2 e0 b; i
  315.         mov     al,0f4h
    5 G; a9 L% f) r1 J
  316.         call    keyboard_write
    1 s& p8 j, \! s9 m  q
  317. # x% C8 l$ V( t; z
  318.         sti
    $ B" e5 q  S) A
  319.         ret
    - t; b* g! l/ }6 m
  320. call_user_isr:. L+ |( y' l2 j( s8 F* u. s+ z# r
  321. db      60h- P  Y# s1 j. |8 k  J+ q
  322.         mov     cx,cs:[pos_x]
    ' Z5 Z' Z6 i- s% z2 R. q+ @! W
  323.         mov     dx,cs:[pos_y]
    ( Y! @9 a( e; _3 Y3 v! x% @
  324.         mov     di,0 ;cs:[x_move]
    ) @6 k% W3 B9 \, Z: _/ ]
  325.         mov     si,0 ;cs:[y_move]+ T% z" X- I% X0 I/ h% d+ y
  326.         mov     word ptr cs:[x_move],0$ V# T- ]9 L% L; Q3 C
  327.         mov     word ptr cs:[y_move],0
    ' L# X6 Y. A! Z( [' R1 j; B
  328.         mov     bl,byte ptr cs:[buttons]8 g1 C* Z. c  i4 q
  329.         xor     bh,bh
    ( N* ^, `+ U5 A' [; a) E
  330.         call    dword ptr cs:[user_subroutine]
    7 z6 _% e2 e: J8 b
  331.         db      61h
    3 ^% Y, \) i' F1 ]3 U
  332. ret; \0 J. e2 ^7 g" M
  333. new_isr:
    - n* S" x% m  ^: S$ V
  334.         pushf& s. u4 o# h, \
  335.         cli
    + X5 O# }& g3 r% Y* r
  336.         push    ax
    & R; H  n+ x# x  f) _8 ^
  337.         push    bx3 O& i8 ^4 A4 M
  338.         push    cx
    6 i) c+ C) b$ A$ U4 _2 |  h' {
  339.         push    dx
    2 |8 G2 L% p* J6 v7 W. `+ M
  340.         push    di
    $ P3 @* J2 ~0 Q: _
  341.         push    si
    ( g& w1 o; s& n. _) E% E- a
  342.         push    es
    0 S9 R, g! ^/ H& m9 a
  343.         push    ds
    " @! e7 ^5 O9 Z& k, ]
  344. 6 B  s; v% ]% r
  345.         push    cs
    5 s9 Q$ Z3 |* o3 i* s# \# ]
  346.         pop     ds0 b1 U. P; W# |. L9 R

  347. 3 f" L# m6 K. T/ H! d' T9 ]
  348.         mov     bl,0adh
    6 h& ^: i3 S! i2 l' F
  349.         call    keyboard_cmd" z( {" z8 T$ ^# n! C! k

  350. . q( X4 s# G. f- a$ h; V8 g# W' a$ G( i
  351.         cmp     byte ptr [first_time],0/ ~- W" B! ~& R: \$ \, `4 q( i6 [
  352.         je      not_first_time+ e2 p7 B1 X  H

  353. ) N9 m% p. y7 |* f
  354.         mov     byte ptr [first_time],0( t: I7 j# @) ~* f- \8 |+ w, `" s
  355.         call    keyboard_read
    4 m! y! o2 o- m( \4 Q5 S
  356.         call    keyboard_read
    ( X7 s; r: U7 o1 T
  357.         call    keyboard_read
    8 }! M8 X$ G$ \/ Z
  358.         jmp     no_show+ m- h* F, a% d
  359. ; T. J$ D) |! N( B0 ]' [' B6 E
  360. not_first_time:/ ]8 v9 A& i: l0 \' Y3 E4 k# A) \
  361.         mov     word ptr [temp_mask],08 f: C  s9 K" S8 ?5 a5 l5 s  O
  362. 3 }' K; W+ G% |; E% s0 w5 M
  363.         mov     cx,[pos_x]
    / e6 V3 U  p1 ~3 U7 m0 a
  364.         mov     dx,[pos_y]
    ! I8 B' M& d! o

  365. $ p9 k2 P; i/ T5 @
  366.         call    keyboard_read& \. n$ O& N! R
  367.         and     al,7 ;3
      T$ Y& |6 ^% f6 M8 W6 K7 u
  368.         mov     ah,[buttons]3 t% }9 d7 n5 |& }, n- i
  369.         mov     [buttons],al2 q' b9 u9 M+ Z5 x4 o
  370.         cmp     al,ah
    9 i5 I" I; Z+ @7 @- o7 M% E
  371.         je      no_button_change
    ' U9 g, ?* B5 F+ r0 P8 d1 `/ w
  372.         and     al,3, c0 J$ i- ^* X5 N% s9 c
  373.         and     ah,3
    , Y% F/ F! F; e' c5 f' V
  374.         xor     al,ah
    ! f+ M. B# N3 E
  375.         xor     bx,bx
    % |& Q# h9 _/ e/ |
  376. 3 @# a9 s2 v, l+ X0 R/ }  N
  377.         push    ax% R. I  I) k) ^$ P
  378.         test    al,25 R0 T% Q8 o* P9 J( z
  379.         jz      no_right_button_change
    ! N# m% s3 Q2 e9 t* e
  380.         and     ah,2
    $ `3 Y0 I1 p1 k6 r, Q0 K) m$ {
  381.         jz      right_button_pressed( I" b  G; d" {' g
  382.         or      bx,16. {6 \; y! W% K" A& t
  383.         jmp     no_right_button_change
    * ]$ H1 A& N6 `6 ^; b; }0 ]4 l7 A
  384. right_button_pressed:
    8 K! S" k9 R( z: G' B' x
  385.         or      bx,8# T' ?: t3 z! Q, w
  386. no_right_button_change:
    " v+ s/ \6 I! @) {. V

  387. ' d3 D0 Y9 W# J- W
  388.         pop     ax
    2 o+ n- E6 o( ~# M1 z* m2 W& s( C
  389. & s, o0 |9 ^5 `/ c: Z# V4 U
  390.         test    al,14 m9 ?3 M1 [% N% F
  391.         jz      no_left_button_change
    $ W- V  X) q4 A3 r
  392.         and     ah,1
    % b# P& _' {+ L: A# a
  393.         jz      left_button_pressed
    2 \3 q7 m, M( |  h2 A( P2 g# v
  394.         or      bx,4
    : p' y/ S* R5 [) D) r, o3 u1 b
  395.         jmp     no_left_button_change& s! H5 ?! ^" r3 h
  396. left_button_pressed:) [  L% h( K8 f+ d, ]9 A
  397.         or      bx,2* h6 P7 f" _- u  W: p9 F$ r
  398. no_left_button_change:
    0 Y# p4 c: P9 z

  399. ' i' Q: N# b+ ~4 f# K* n
  400.         mov     [temp_mask],bx
    & t( G+ x7 [! g8 k
  401. 4 j8 f; c' s1 [" \7 |
  402. no_button_change:* I0 ^( t8 y! x7 L
  403.         call    keyboard_read
    7 E& S; B" l* k7 l) I0 P$ |' {
  404.         cbw1 K6 e( l1 d' @9 H
  405.         add     [pos_x],ax
    , ~3 g( m7 }( J) T
  406.         add     [x_move],ax
    0 E" i) `! x% F& H; ^& |
  407.         mov     ax,[x_min]
    7 Z6 z- N2 t4 i
  408.         cmp     [pos_x],ax" |) m9 w* [" l( I3 K6 j, i9 _. t9 x
  409.         jg      good_hor1. P% T+ p- O% D, M5 {/ J
  410.         mov     [pos_x],ax
    0 l& ]5 |( i" K# Y' b) E
  411. good_hor1:( A; V9 y3 c, Y" m
  412.         mov     ax,[x_max]/ O2 N- }5 [( A: F( w
  413.         cmp     [pos_x],ax
    8 k9 _$ G+ @3 W3 g7 M4 F- d/ m' [
  414.         jle     good_hor27 G3 {$ `! Q$ U* P" B
  415.         mov     [pos_x],ax& F/ }: b+ Z. \' B
  416. good_hor2:; |# c1 z! P3 L8 P; z
  417.   F( N: Q; m4 f/ @4 y
  418.         call    keyboard_read
    : d% r# Z9 G2 P! X+ k
  419.         neg     al$ a7 |8 g9 m; s6 \
  420.         cbw& T- {- T0 Y6 y  m, y
  421.         add     [pos_y],ax8 `8 k" P( U+ M- d
  422.         add     [y_move],ax8 x' ]! K7 D8 d2 S% C
  423.         mov     ax,[y_min]: n- v1 n  |3 o$ i; b
  424.         cmp     [pos_y],ax
      ^8 g8 w5 [1 _# g
  425.         jg      good_ver1
    % c" p  _: j4 z
  426.         mov     [pos_y],ax
    2 Y$ b/ k5 a) Y- c* A
  427. good_ver1:0 q2 A7 H2 |6 I8 q' S
  428.         mov     ax,[y_max]3 s$ ]8 z& H$ M' J) V
  429.         cmp     [pos_y],ax
    3 X" S' r( q. y2 l4 a7 d& m
  430.         jle     good_ver25 \5 D! D% }, U
  431.         mov     [pos_y],ax! o# o7 A7 @+ V; U
  432. good_ver2:- D- K7 F- b& ]) W/ [8 A/ }

  433. 0 q* I) `% t5 `2 j1 d* |) e' J
  434.         mov     ax,[x_move]
    2 a2 y7 Q9 t* S% M* D$ H4 {
  435.         or      ax,[y_move]. f5 W2 C) X% \# d7 _: Z
  436.         or      ax,ax
    : l5 s# n' g$ A  j) f
  437.         jz      no_change_position' ?3 F, Z4 {" s! }1 ~
  438.         or      word ptr [temp_mask],12 W/ K& n7 K. Y, r3 m
  439. no_change_position:; [: Y2 ?. K& d4 E1 q3 S( y

  440. / ^: l# u8 s; k
  441.         mov     ax,[temp_mask]) U, h' Z6 p+ V* E" q. W6 l
  442.         and     ax,[user_mask]* o4 M$ M" i* p3 e# Y1 T
  443.         jz      no_call_user
    + u0 |/ E% U) ~& H8 i# s* V
  444.         call    call_user_isr& ?. R( x' U! |% {5 ^
  445. no_call_user:
    0 _* V; N; p5 s( Z

  446. , i4 i) |, h* S" O% K, S) t+ }+ r5 o
  447.         cmp     byte ptr [sm_flag],1$ i2 o' c; g4 J+ f" F
  448.         jne     no_show  c- ~6 Y. \& Q: @8 i
  449. ; k9 Y" L1 ?: e5 S5 l" k9 u* Q' \& m/ D
  450.         shr     cx,3) E7 l% T9 w  S8 ^/ F1 O2 Z
  451.         shr     dx,3
    * M) p+ f6 L6 ?7 ?
  452.         mov     ax,80
    " {5 z3 I! z. Q/ Q
  453.         mul     dl, f- [9 c' W4 {- s4 b1 g
  454.         add     ax,cx
    - S- {  Z: u- e. ^+ t
  455.         shl     ax,1* I* b4 y7 W5 ^2 ~6 `# S  T2 H7 t
  456.         mov     di,ax3 j" A$ b7 r2 r  R% T% c- o4 C
  457.         mov     ax,0b800h8 ^' r2 t# J. a: ~8 N/ f1 P4 L
  458.         mov     es,ax2 I8 ]. w# O/ y+ Y' ~
  459.         mov     ax,[save_char]& G& ^7 \2 d% c) C8 A6 c6 [) {
  460.         stosw" {# n% ^: S& ^% Q! b

  461. " T4 M4 b  y0 Y
  462.         mov     cx,[pos_x]+ J2 I0 T9 B8 B4 g
  463.         mov     dx,[pos_y]3 A1 K6 V8 P' c' y% g) }2 b
  464.         shr     cx,32 Z+ [2 c* }4 w  G8 `+ Q, \
  465.         shr     dx,37 c" T! N! A( ^1 ^
  466.         mov     ax,80
    8 G1 B7 D5 T3 D! ]: q
  467.         mul     dl) z; h; f9 W$ |$ O; m5 h
  468.         add     ax,cx3 T5 a  l$ T8 _8 A5 J/ `! b( {. m
  469.         shl     ax,1
    . ~: F9 A. r4 ~+ C+ o
  470.         mov     di,ax
    ' X. h$ j. S/ T: t' {
  471.         mov     ax,0b800h7 U0 C# p* W( Q  O8 L
  472.         mov     es,ax: Q8 `, W9 G$ F
  473.         mov     ax,es:[di]
    8 p7 Y0 Q* q) d0 K
  474.         mov     [save_char],ax
    * d4 v' \% P' u1 g/ Y
  475.         not     ah. o# G/ P+ M! O; n0 I
  476.         and     ah,7fh: h3 Z) w! ?, R3 i# H- g/ E
  477.         stosw; R# `5 _) E7 s) ^, b
  478. no_show:$ G$ k# T6 [; o* ~1 _
  479.         mov     bl,0aeh
    3 f7 z6 F7 @' z
  480.         call    keyboard_cmd
    % G# ^2 E/ Q  `# P. Y. u# z

  481. ) y0 Q5 {( o: a, B
  482.         mov     al,20h; E0 c( j" K8 I& n- e5 y- x
  483.         out     0a0h,al
    : W$ x( c+ Y+ K
  484.         out     20h,al' p' E( O. v; \. W& D+ F

  485. 0 L6 d$ U$ B8 T, {1 G; x
  486.         pop     ds
    4 e* b$ O/ ~. A$ ~6 _/ }
  487.         pop     es0 Y" C9 R. g' s
  488.         pop     si
    $ ]9 d! v% e3 S0 ?4 {
  489.         pop     di
    * Z( p/ D/ B# l% V" Z9 R
  490.         pop     dx
    * x7 |; r0 C2 ?
  491.         pop     cx
    ! V( e9 f/ M5 c# [
  492.         pop     bx: V' m' J2 d$ c5 n5 a8 Q* P8 H: q
  493.         pop     ax
    - Y3 L7 I/ J/ c& i2 O% f
  494.         popf
    ; G6 {  Z5 m/ O( C
  495.         iret
    1 x' }" n* q$ ^' S" W
  496. 7 i( M. ]6 ]/ L1 F4 t; [) J9 [3 j
  497. first_time      db      1
    " _" o4 h" {2 h% e( V
  498. buttons         db      0$ H2 L! |* k7 ?: S
  499. pos_x           dw      0
    4 W6 V# x$ o. o
  500. pos_y           dw      0+ u! E9 n9 ?& M8 E* C
  501. sm_flag         dw      0+ d' [2 m9 [: m/ x; Z, K. ~
  502. save_char       dw      0% B; o4 }, L& C& G
  503. x_move          dw      0
    : K8 H; _  T7 S8 ?
  504. y_move          dw      09 u# F% a% D: w' c* d
  505. x_max           dw      6396 |/ W% F$ R/ d: J1 }
  506. x_min           dw      0
    ' c7 Y! c/ v# v; M) }
  507. y_max           dw      199. \2 [2 V# p; m( X" @3 n. w5 X$ l
  508. y_min           dw      0
    0 f& l! g5 M0 N- Q/ i- S
  509. user_subroutine dw      0,0+ F2 ^# u# l4 t
  510. user_mask       dw      0
    & S- Z" w2 V8 C
  511. temp_mask       dw      0
    + _! [0 z: v& c. \& x  m

  512. ! ~- X% r4 N( F8 I. H
  513. keyboard_read:
    3 O! r  o: }; ?/ e; ?: H+ F" r
  514.         push    cx6 O2 ?# p7 x( b6 X) x- a1 Y
  515.         push    dx
    $ C  i7 v+ C1 s. ~; V
  516.         xor     cx,cx
    ) w4 e5 ?4 ?" G7 S* A0 U" E
  517. key_read_loop:* ~  f' k* B, G7 A4 t2 O7 G# M
  518.         in      al,64h
    , o/ y( C+ e9 t  T' @, Q# t; ~# H
  519.         jmp     $+2
    ) z2 ]: ^0 T% \- x' Y
  520.         jmp     $+29 a7 V: b" P# Z* c( @0 t
  521.         test    al,1
    $ F8 ~; g: z" V2 Q. ^
  522.         jnz     key_read_ready. E6 q9 c$ K. K) h& S
  523.         loop    key_read_loop
    / {+ w. `5 a' d8 D5 C
  524.         mov     ah,16 [9 Y" n0 D2 {2 n' L
  525.         jmp     key_read_exit
    8 y2 B0 ]5 U  A) g; k, @
  526. key_read_ready:" \0 \; P1 f& ~
  527.         push    cx
    % `2 Y7 g: ^. t% o6 S+ Q, m# _
  528.         mov     cx,32- O: h! z: Y- a% d* ?5 J; O
  529. key_read_delay:
    - V, O8 c( D7 |; J% P! R
  530.         jmp     $+2
    : v. f) z0 I5 Y7 U
  531.         jmp     $+2; E! a' H- j" }1 g8 D/ M
  532.         loop    key_read_delay
    / W0 F$ z& u  ~
  533. ! X) l- Y, o2 u$ v2 [
  534.         pop     cx/ K& N0 q; S5 [. o3 Q* ~
  535. 2 D" T( N+ B/ Z' q9 [. c# n
  536.         in      al,60h
    ; R; ]7 ]' j# j; k0 s& n$ s
  537.         jmp     $+25 t) c! W. s* h& C
  538.         jmp     $+28 ?" k* V8 S8 F( {7 ]1 s
  539.         xor     ah,ah* O3 e0 G0 U. n' a! l, ^0 f7 y
  540. key_read_exit:
    4 N9 Y& K4 e. p3 h& D% p
  541.         pop     dx) @. S; ^  C# C1 o; Y
  542.         pop     cx% A& |( O7 n0 g$ G( }- t8 M1 b
  543.         ret# i2 V" g) w) R  D  z9 j
  544. + g& {; m1 c6 E6 D( M6 t
  545. keyboard_write:
    0 n/ e$ q( m4 ?+ k- h% E) h
  546.         push    cx
    * W. b/ b$ K4 _5 d; e( N9 m
  547.         push    dx
    * Z0 ~+ {- z: [/ r1 q) P3 k
  548.         mov     dl,al  ~/ @: O0 @& g
  549.         xor     cx,cx- R5 R- s0 M+ L4 W- }* r
  550. kbd_wrt_loop1:
    2 c8 K+ u* [! c* r' L: H
  551.         in      al,64h7 {" [7 b9 J7 R/ d0 h- x) p
  552.         jmp     $+2
    . I2 z! ~  [, C2 k1 \0 ^
  553.         jmp     $+2
    8 U* Z  u( r1 W
  554.         test    al,20h( E' n  ?, z) Y: H
  555.         jz      kbd_wrt_ok1) P9 X1 A% P4 X5 j0 z$ ?; j" ?2 t
  556. # d/ q2 n+ N. I3 Y, s8 q! }) ~
  557.         loop    kbd_wrt_loop1
    9 u& ]- @( o. V. c9 j6 @* m5 h: k( ]
  558. ' Y! ~9 V) J. @5 V/ y9 @
  559.         mov     ah,16 p. Y" q' f/ O$ b4 T7 j
  560.         jmp     kbd_wrt_exit! L+ M7 p6 _( o8 A$ }& V
  561. 7 p% \% ~) n3 @4 Q6 m3 n2 H
  562. kbd_wrt_ok1:
    7 o: ~8 j  \% C+ u
  563.         in      al,60h4 q1 M  j4 N: S3 I

  564. 1 m2 w" d; n( P$ d+ f4 w
  565.         xor     cx,cx
      F7 I- T& @$ k! C& W
  566. kbd_wrt_loop:  X- n* C( b2 q: @$ W
  567.         in      al,64h) ?8 P- b  h' V2 R
  568.         jmp     $+2. u4 B+ u8 s! c) g
  569.         jmp     $+2
    , l& v* Z" X5 Y7 ?+ `: Q% V
  570.         test    al,29 _0 B% n5 h9 }
  571.         jz      kbd_wrt_ok! j3 K. @; S& t" O/ O  o
  572. 0 [6 C( W3 w; _: m1 m
  573.         loop    kbd_wrt_loop, e7 s* Y+ x" B) a# z9 }: N2 y+ B% V
  574. " B& l, H* \8 K# p6 @
  575.         mov     ah,1
    ' l! c5 u* m* m$ r
  576.         jmp     kbd_wrt_exit# A3 _1 d4 l6 y/ @6 H3 h; `
  577. 0 l3 M0 a" M& I
  578. kbd_wrt_ok:6 I9 ?% r% w4 G" N9 D$ I
  579.         mov     al,dl
    : a7 @* E8 ~7 ?- G3 t) W
  580.         out     60h,al
    9 Z4 @5 ]' r# y- r9 S! @7 a
  581.         jmp     $+2
    ' D. Y: `' E1 |" i0 F
  582.         jmp     $+2
    6 m) X, o% o; h6 K6 d

  583. % V& _1 z8 c- ]" `
  584.         xor     cx,cx7 p4 Q7 f. _( f- _
  585. kbd_wrt_loop3:6 j6 `* E# \7 M! }6 N  f
  586.         in      al,64h
    / _7 U% T7 ^) U/ W5 w
  587.         jmp     $+2
    / G) t* A; M0 ~: ?- v' j, c: v( C' W; i
  588.         jmp     $+2
    " D. w# Q/ I5 ~; z3 A8 F
  589.         test    al,2' r" z! m0 P' H
  590.         jz      kbd_wrt_ok3
    ) h) k+ W: p: S4 N" A7 @  n- {4 y
  591. 0 a% J0 w6 ~) A# c
  592.         loop    kbd_wrt_loop3) q6 Z0 a  i0 m5 L7 e

  593.   p  |7 y4 U3 Z
  594.         mov     ah,10 T* ]9 P8 w9 a$ o6 i* L
  595.         jmp     kbd_wrt_exit
    0 l3 W4 f1 V. ^" W6 S5 d
  596. 1 I1 d( r& G% D8 `, M# A' t3 N3 `
  597. kbd_wrt_ok3:8 l1 v2 z! R! r6 V* [9 ^3 E7 T
  598.         mov     ah,85 H/ E8 @* M8 K) |/ ~& m, x( m
  599. kbd_wrt_loop4:( ^! n- I& a) v1 E5 M
  600.         xor     cx,cx
    2 i7 Q' i6 t: O" ~5 Y
  601. kbd_wrt_loop5:% c! o# o2 a$ W+ v% v
  602.         in      al,64h
    8 H* q% T8 [/ b( U- L9 C( H+ g
  603.         jmp     $+2
    5 f$ f& j; B3 m& Z
  604.         jmp     $+24 b5 l* g2 S9 J2 R
  605.         test    al,1+ l4 O! t7 `) f% b7 Z0 R8 j
  606.         jnz     kbd_wrt_ok4
    % R2 H4 J" |1 v

  607. # e) V" @8 E5 C. x0 E4 x
  608.         loop    kbd_wrt_loop5
    7 i9 d  E! }& V7 ^0 z) g6 S

  609. 7 @6 T0 q' S3 v( ^; E' X/ c
  610.         dec     ah6 d" K, R1 J+ H2 \( z5 `7 v. V( U
  611.         jnz     kbd_wrt_loop4& F' z( M' ^; ], }  b
  612. $ i1 c- @* i, p1 d: E
  613. kbd_wrt_ok4:" ^1 D6 I' o5 k* D. n. y  F$ u
  614.         xor     ah,ah: D( e) }% y) D( }$ {
  615. kbd_wrt_exit:3 Q0 U* P7 |( l" d. T
  616.         pop     dx
    4 V& [8 r" z( Z
  617.         pop     cx; ^% `/ f3 V- o0 l# l/ |
  618.         ret$ D( \  N; a( R% E2 _
  619.         " H  M, w. ^! m+ o+ x5 F7 `5 R
  620. keyboard_cmd:
    1 d( d  ^6 [4 E# b$ z$ h) F
  621.         xor     cx,cx& ~! j8 q( |; K( Q" k6 G* u4 }
  622. cmd_wait:
    " ~5 L: t/ ]# @0 C6 Q
  623.         in      al,64h1 Y$ G( ]6 ^, C9 [: z
  624.         jmp     $+2) z1 i8 f4 ]" d
  625.         jmp     $+2
    # ]7 R1 `9 s( J0 ^3 c& L
  626.         test    al,2
    5 p* ^6 a5 x1 H( A( e
  627.         jz      cmd_send
    ! O7 o* \! Q- c9 M5 {: W) N, T
  628.         loop    cmd_wait
    . _1 V: g. `3 s) ]) c; ]

  629. 8 p8 x. f* ?) z, k$ r
  630.         jmp     cmd_error; @# k, O3 I! y2 U
  631. + R( r3 }# B/ O: p( z( }+ H" o; Q9 e
  632. cmd_send:8 z/ y' ^6 Q9 R; m# J
  633.         mov     al,bl
    + Q0 ?; b- l9 Z' |/ X& q1 U
  634.         out     64h,al$ X* F- X  U7 K: t
  635.         jmp     $+2
      Y; [" Z, ~) [% Y
  636.         jmp     $+21 a: H# v' z% P' q( w

  637. 0 @" i5 {6 I0 e, g* ~5 U
  638.         xor     cx,cx% ?  |2 J4 i3 f% j2 b8 Q
  639. cmd_accept:
    " X$ }# H; D& T' e+ K- ?% ?: `
  640.         in      al,64h) b- n& O  m6 f+ U# ~. r/ \
  641.         jmp     $+22 q3 y4 [3 G! j+ X6 Q- w) e
  642.         jmp     $+2) I4 Q; Z' h- N% h* z. [
  643.         test    al,2  {" S& }; [6 _" F+ {2 V3 y
  644.         jz      cmd_ok7 K! c, D5 b5 S0 g
  645.         loop    cmd_accept
    ! a* V8 \" d0 I
  646. + i4 H! l* ?& E: e( F% i
  647. cmd_error:
    . o# ]: j% G: V) b
  648.         mov     ah,15 |4 k: \3 u1 k: `; ]# n! t! }
  649.         jmp     cmd_exit$ _* {9 z4 v$ T0 t
  650. cmd_ok:
    3 W3 K; h' B! G* G1 K; d
  651.         xor     ah,ah0 \' J; P1 P- G% H
  652. cmd_exit:, ?# Z0 L0 b, L. f; I( k2 m, N2 u' g
  653.         ret
    8 T2 K/ S/ T# n- V
  654. 9 W! ~  u8 J* H3 F+ |
  655. new_33:8 W. p3 Y% @, Q8 e8 Y  }
  656.         cli( J( k0 o8 U( S
  657.         cmp     al,0
    - ^( d6 p9 @* x7 x" b: N
  658.         je      reset_mouse
    * e+ z& L3 L7 z" d6 Y4 s
  659.         cmp     al,1
    , T9 K' V8 |9 u1 k1 a4 z% S* D
  660.         je      show_mouse
    ! y& o/ G1 B$ O
  661.         cmp     al,2
    9 \* |& E" o4 I9 _/ R
  662.         je      hide_mouse
    8 z- L9 p1 C; |9 \
  663.         cmp     al,3
      a* k. D; t. h, e' e
  664.         je      get_pos
    / t9 j- }# K* [" |; d  |
  665.         cmp     al,4
    1 z& |- C- V2 Y; i; O* h9 p, u8 m
  666.         je      set_pos  T. M7 k9 f; C/ D- a# H+ o
  667.         cmp     al,7
    8 k; f* @, _  }' d
  668.         je      set_hor_pos
    ) z# \8 `- I" J& S
  669.         cmp     al,84 \2 c. }% v6 |( M! O5 m
  670.         je      set_ver_pos0 L! L6 k" R) p/ L' S
  671.         cmp     al,0bh
    ( }9 l5 _5 ]( m; l6 [( W
  672.         je      get_mouse_movement9 j# c' b! A9 k8 L% q% v, I. }
  673.         cmp     al,0ch
    3 ~2 b" [, {; Z# w
  674.         je      set_subroutines
    " s7 |. G" Z2 M& b" S' n
  675.         cmp     al,14h! I; Q; Y3 k* \$ z
  676.         je      swap_subroutines
    1 S, X+ U# O( }, E
  677.         iret
    : _7 X5 T) m. o7 o/ c

  678. $ i1 l4 R( ~6 Y$ e& U
  679. reset_mouse:, c; e& }* T% T9 Q% M2 U
  680.         jmp     _reset_mouse. g% f, a7 b8 j
  681. show_mouse:
    ; d, W( Y- |1 X1 U3 ~) P1 A1 p0 ~& Z
  682.         jmp     _show_mouse
    ! f5 E% s1 \' [+ |
  683. hide_mouse:* L9 b  C' v4 L+ A* V( x
  684.         jmp     _hide_mouse/ w' F9 [% S4 `% O
  685. get_pos:8 G  o8 e9 ?9 h7 D
  686.         jmp     _get_pos
    5 P0 M8 f$ A* F- \6 T# U9 l" k
  687. set_pos:: t3 E; |' P2 l# ~. }
  688.         jmp     _set_pos
    # X; C5 l" J) P8 V0 M, b" R
  689. set_hor_pos:# K) H1 w; E) O% j% q) h( ^. `! r
  690.         jmp     _set_hor_pos3 k# ~6 H+ m9 g: q* L7 h
  691. set_ver_pos:/ _) M8 ^9 ~, l+ W* j" `6 b3 y
  692.         jmp     _set_ver_pos
    ( }' h' U1 `/ ~+ q' g" e. g% K
  693. get_mouse_movement:
    $ K, D( V+ s) c  E0 q  _0 T' }
  694.         jmp     _get_mouse_movement
    , {3 B3 S* Z. z" w
  695. set_subroutines:) X7 z, M6 x( H
  696.         jmp     _set_subroutines# D" I7 ^7 X4 ^( r# D1 T; l* J) q* x, d
  697. swap_subroutines:
    % A8 x, p, a4 Z* U
  698.         jmp     _swap_subroutines
    . z' ]. }8 E/ p" Y8 ]! z, [$ e

  699. : B2 k- Z4 Q8 z! W( y% w( c& m
  700. _reset_mouse:
    " A2 n4 D$ p; x6 S6 d3 l
  701.         mov     byte ptr cs:[buttons],0
    6 z! d& M8 e% _$ [* n- X& ?+ A( q* P
  702.         mov     word ptr cs:[pos_x],0: |2 J4 [( E) _7 p. H6 j
  703.         mov     word ptr cs:[pos_y],07 N7 o# ], k0 y0 j$ b
  704.         mov     word ptr cs:[x_move],0# K3 {& T' Y" `6 R( w
  705.         mov     word ptr cs:[y_move],0! Y) ?! M# w2 A# T( _+ s- ^
  706.         mov     word ptr cs:[x_max],639
    ; S0 x* o/ _. l* m
  707.         mov     word ptr cs:[x_min],0) `8 n/ p$ o. \! u+ A) k( z8 M
  708.         mov     word ptr cs:[y_max],199( G' J" J0 B4 o0 Y
  709.         mov     word ptr cs:[y_min],0
    4 m9 S8 b" K2 O3 D8 W, c  @
  710.         mov     word ptr cs:[user_mask],06 t6 d2 Q# n/ }) s- B# m9 r4 L
  711.         mov     word ptr cs:[user_subroutine],05 H# B! q$ s' j5 ~
  712.         mov     word ptr cs:[user_subroutine+2],0
    . u; F, y4 \* j. k- Z
  713.         mov     ax,0ffffh4 i) u" Q9 }- O3 X4 f
  714.         mov     bx,3
    / N5 r& z3 E" v2 \) ^4 c5 Z! L
  715.         iret2 i" u8 i, g+ N& o0 F7 e8 a
  716. 8 L, s4 ?. T7 d" d# s: F
  717. _get_pos:
    / j% [- U6 r- E0 p. L) O
  718.         mov     cx,cs:[pos_x]$ G2 g2 J6 `5 x9 F& ^' j+ h
  719.         mov     dx,cs:[pos_y]$ w! h; o  ^' H  h8 I
  720.         mov     bx,word ptr cs:[buttons]/ z4 z: J* G! n- @+ N$ U7 d
  721.         xor     bh,bh
    3 Z* p/ i0 {6 O3 i
  722.         iret
    8 t- t3 H# J* x4 O
  723. # w5 L  r( X: z1 i$ S, t$ s
  724. _get_mouse_movement:
    - S' M) Q" @$ @1 b9 j" W+ k
  725.         mov     cx,cs:[x_move]7 {0 S/ l- N+ M  x8 o2 ?8 e5 a
  726.         mov     dx,cs:[y_move]7 E+ D. c/ _3 @* g- S& E: {. s
  727.         mov     word ptr cs:[x_move],0
    * z; c5 }1 w" g5 I9 b0 f+ ~
  728.         mov     word ptr cs:[y_move],0# R( a4 ^, G1 T* |: b# }9 b
  729.         iret. V3 e7 T$ a4 D0 K( R
  730. - r0 w1 |8 n' l; v5 D+ X) i5 ], j% C
  731. _show_mouse:
    9 \  q9 g. H, C# L/ J* d1 Y
  732.         push    ax- Z+ p" Q9 f) |- F6 ~# g4 c
  733.         push    bx
    6 m0 C' l# D# Y2 P, `3 Q  B- U, B# I
  734.         push    di
    ! q+ O8 U* L& B/ B
  735.         push    es
    1 Q4 v9 ?6 j: B; P9 T
  736.         mov     byte ptr cs:[sm_flag],1- h- A$ u- m* e6 ]6 U) s1 E  d$ R4 M
  737.         mov     ax,cs:[pos_y]4 l& M3 `$ h4 W# X- P. M. j
  738.         shr     ax,3
    & u6 p) F* N0 O" z9 R# W2 H8 j
  739.         mov     bl,80' h, ]% D6 i+ F/ k3 W8 Z3 W3 S
  740.         mul     bl
    1 S7 F1 R& ~- Z( H
  741.         mov     bx,[pos_x]
    ; X4 Q! q5 I/ w5 f8 u7 L" q- k
  742.         shr     bx,3& s+ T) p' j3 j5 c2 T( q
  743.         add     ax,bx
    * E' g; ?+ U& g. r' v7 v
  744.         shl     ax,1
    ( i3 B$ ]# S- l1 ]9 r
  745.         mov     di,ax
    # \6 q! J# E, K
  746.         mov     ax,0b800h  v3 v8 X' R$ ^' c6 m) Y" a+ @6 ~' O
  747.         mov     es,ax# s) b- S- S9 M8 @
  748.         mov     ax,es:[di]
    0 N  i& S; F* y8 s5 l
  749.         mov     cs:[save_char],ax
    # e4 g5 a! V+ ]/ Y) [' t
  750.         not     ah
    : D! T, G9 f$ Z
  751.         and     ah,7fh
    # h4 F7 N  }5 ]2 X8 b$ w
  752.         mov     es:[di],ax% o0 \7 O  o. g1 x" A
  753.         pop     es
    - [/ H- l) o; N3 \" X
  754.         pop     di
    + P5 ^9 H" {; t
  755.         pop     bx
    7 s+ h9 k/ Y: r. W
  756.         pop     ax
    # ~! e( `4 e5 T! u! i
  757.         iret
    % M6 k4 I5 U7 n* p0 a+ c" {6 K
  758. 7 z9 `  Q1 i* a5 `
  759. _hide_mouse:2 J% v& ^' n3 L  B
  760.         push    ax
    9 I! {% E% V" G: L3 p" T
  761.         push    bx
    1 a) D& M& |) i  q9 c, d, \& w. S
  762.         push    di
    7 G/ }; J$ R5 A, g- g
  763.         push    es8 \+ @. ?9 ~: x0 b! K
  764.         mov     byte ptr cs:[sm_flag],00 s  l, y- R* Q. q( S
  765.         mov     ax,cs:[pos_y]+ o; B9 B5 N2 s3 B
  766.         shr     ax,3
    ) F( y# u( P) Q# ]
  767.         mov     bl,80
    / |" m( @5 _! E: U' l0 S1 R
  768.         mul     bl
    4 c# U8 c; ?0 t( ~1 `( T8 K
  769.         mov     bx,[pos_x]2 G, B3 G3 K/ k7 w. p
  770.         shr     bx,3
    . a+ ]$ ^: ~+ D9 l7 B- X7 ]
  771.         add     ax,bx
    " T' D' w" O% B, U
  772.         shl     ax,1. G' J) O) T+ d( G/ d  m9 u
  773.         mov     di,ax
    8 d% j  P9 h3 v7 A$ F* }1 \
  774.         mov     ax,0b800h
    & F* r' G4 F6 N: J
  775.         mov     es,ax' c: a7 r; H& u9 R! ?3 |6 H
  776.         mov     ax,cs:[save_char]
    8 S8 d  }$ H) Q1 Q; E3 j
  777.         mov     es:[di],ax
      [7 J: U" I- x# U  @
  778.         pop     es
    . ?5 ]7 g$ \" ^# M
  779.         pop     di3 M+ G' L( M. q3 \5 F
  780.         pop     bx
    $ [+ z' y: O( Z
  781.         pop     ax
    - R8 o5 _: ^& f5 g$ I/ D0 n
  782.         iret. [. c) \1 h. U5 l9 M8 C

  783. % {' Z' c, o5 X1 d6 Q
  784. _set_pos:" @/ d; f" k. l/ l7 }! L
  785.         mov     cx,cs:[pos_x]
    # M% |* N, e6 {
  786.         mov     dx,cs:[pos_y]
    8 y7 E& `! m! b' D! N
  787.         mov     word ptr cs:[x_move],05 ~3 O. k5 u/ I0 b: `2 T
  788.         mov     word ptr cs:[y_move],0
    / x& t: ]4 n5 p$ v- V
  789.         iret
    , o4 y. {; ~4 \+ Z7 z

  790. 6 G8 @" b( r9 L' c' e( F, p
  791. _set_hor_pos:9 Z/ X7 u0 K5 P) d
  792.         call    max_min% X$ Y7 }% [4 J" j  x3 R
  793.         mov     cs:[x_min],cx- L# ~, X( ]# D5 o( _1 F, Q+ b' H
  794.         mov     cs:[x_max],dx! E/ J0 q, }/ G6 c$ P) z
  795.         cmp     cs:[pos_x],cx$ c, @% o: x* [1 Y
  796.         jge     good_hor_min
    5 M5 {# w; r! b
  797.         mov     cs:[pos_x],cx
    ( c" T1 B. ?4 l) u9 x
  798. good_hor_min:9 L1 u  @0 A& ^: V
  799.         cmp     cs:[pos_x],dx$ \, J0 j1 K$ e/ }
  800.         jle     good_hor_max
    4 E. }+ [0 t) {; C  J7 |
  801.         mov     cs:[pos_x],dx) d5 O9 z/ D% f
  802. good_hor_max:
    3 [9 D$ {; v- K  A* ]" ?+ y% [
  803.        iret
    2 {4 d2 y7 Y& H" T" Y6 j2 {
  804. ; z* h9 x3 j7 H5 m/ @  e/ \) A9 z
  805. _set_ver_pos:' R2 X7 x  F6 x' t, g
  806.         call    max_min
    " @. ]" U8 G" r* v: t7 \) P
  807.         mov     cs:[y_min],cx$ _9 a7 K( |$ j
  808.         mov     cs:[y_max],dx9 i/ Z& w3 s; C9 O+ _
  809.         cmp     cs:[pos_y],cx
    2 P: }! q5 a: m; n: o+ M
  810.         jge     good_ver_min
    # |+ j+ y" E# I$ i! |) X% r* c% f
  811.         mov     cs:[pos_y],cx
    : l( ^  G( I( N# P) n8 Q% K
  812. good_ver_min:
    # y- _( b$ a. p
  813.         cmp     cs:[pos_y],dx
    . g" v+ f, K" W! \
  814.         jle     good_ver_max& i6 Y$ [: j# G+ e& X; a5 j7 U  j  C
  815.         mov     cs:[pos_y],dx* l6 L9 w) v- g' y8 E
  816. good_ver_max:7 r1 p6 h" f6 O/ `
  817.         iret4 M0 E; d% d+ V2 u9 y* ~6 r4 E0 n
  818. 3 }1 S5 [3 ~) m3 c' ?
  819. max_min:! [7 s. T* g8 s1 S. N" G7 g% i
  820.         cmp     cx,dx$ |0 W- T1 [+ r. k% L( [
  821.         jle     no_swap
      n7 [/ {+ s' d+ s2 ^; N1 N
  822.         xchg    cx,dx
    6 N% M) E( q0 q8 d! t! k
  823. no_swap:
    : V* v: k0 C  e, e" `
  824.         ret) c* d+ f3 D1 c7 F2 W6 k

  825. , y3 i0 t- X/ z, g$ ~
  826. _set_subroutines:
    * x, H# |3 }6 w# p0 k! x+ N7 x
  827.         mov     cs:[user_subroutine],dx% }4 [' b2 G0 e, g. }9 Z( f5 z' t
  828.         mov     cs:[user_subroutine+2],es" ?. _0 u2 @+ x: }
  829.         mov     cs:[user_mask],cx5 I+ w; P* N7 Y8 \
  830.         iret
    ' a' L, }+ @/ H/ D  g
  831. ! ~* u7 k+ j5 q6 t
  832. _swap_subroutines:# ?2 p* \6 q' [) M% O. u
  833.         push    word ptr cs:[user_mask]
    * X! V8 @) S' b7 T
  834.         push    word ptr cs:[user_subroutine+2]6 x  w! P/ n0 @+ V% G- ~
  835.         push    word ptr cs:[user_subroutine]
    : q) o" Z* R2 k  w) `
  836.         mov     cs:[user_subroutine],dx
    ! W8 L4 r! }/ X0 `( z
  837.         mov     cs:[user_subroutine+2],es
    " B, A$ C- B4 v/ _
  838.         mov     cs:[user_mask],cx
    2 L: x' R) @- Z/ u8 ?$ X
  839.         pop     dx
      ]1 p4 r6 }8 s( Y* D$ \* K! Q0 d- C
  840.         pop     es* x* F/ g/ ?3 L& W: K: i
  841.         pop     cx
    , d; D( b( w3 u
  842.         iret/ P0 F, q7 S) A/ a3 C( X, t
  843. ) ]1 e1 x7 p) v; f
  844. memmouse        endp  |# i: \/ n1 S$ H: T/ ^
  845. * m5 w, a# }; H
  846. endof_start:
    8 M" V9 y% P4 y7 n9 F, f

  847. * }! o: r9 v% n' q* M: v
  848. emsg db 'No mouse driver install error!$'
    ! [- b7 l- N5 U( \
  849. old331 dw 0
    ! F0 V9 |5 Z5 w4 u+ q1 h( [2 L
  850. old332 dw 0
      ]# m* T9 a1 P6 t3 _
  851. old741 dw 0
    ' R/ ?2 C! {' _2 c- P& r" s
  852. old742 dw 02 i, m) x1 l  E
  853. memcopy db 0  R9 ]& v  H' v# U- _5 @, g
  854. okcheck db 0# P/ ~; F6 t/ u' R& p8 O
  855. pass db 0' x* P. g% I, g! I  h' @% r
  856. chkl db 0
    1 o9 w# O  E5 B, j" r4 E
  857. lk db 0
    2 H+ O; k  j1 P
  858. chkr db 0* J2 b$ H+ `2 {$ E4 w2 t- Y( ]
  859. rk db 0/ q: n/ y* z. b; d' @
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '4 ^3 g; j1 A" M' u
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '( }' n3 ?$ z$ U; e5 I1 ~
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '  L  Y3 B( x/ ?/ `
  863. db '                                                                                '5 M) `+ B7 {4 w& k+ E  e
  864. db '                                赏屯屯簧屯屯突                                  '
    # z9 ?  D' e5 R
  865.         db      '                                ?OFF汉OFF?                                 '
    % Y; H. w3 ]+ \* ]. f' }
  866. db      '                                韧屯屯既屯屯图                                  '' w( _. k4 c0 v. o$ l' s5 w. B
  867. db '                                                                                '
    ; B0 `' X/ @+ ^- b& r  s' a
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    5 O1 q$ Q  g% z6 C8 @' Q( A/ Y
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 0 F  G4 Q3 H% L
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '- @! G# `+ m1 A1 |+ t6 Z

  871.   s4 Z$ w2 s5 ]) M
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!' c4 i. P+ Y) n
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
: Y- Y; V0 s& l+ L" V
' P# D0 f/ o6 U* I谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 06:47 , Processed in 0.025335 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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