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

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

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

. B* ]) F1 u. E2 G代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;/ _5 y& F: o' U; \4 i- r: H
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9+ r- B* {1 m% d# S  f
  3. ;                                         By Bini.Yi 易祝兵8 C; C4 w/ p1 e% N
  4. ;                                         http://www.ufoit.com 计匠网' e0 s- R9 N- I1 o
  5. ;                                         2002/04/06 YYYY/MM/DD7 X; {" F4 u2 W  ^8 c; M; u
  6. ;3 f8 W% ~9 ?! Z5 l+ i. q+ O# N
  7. ;         
    / ^! [! ]* X- |' n+ N
  8. ;          This program  test the mouse button  click and move.
    3 l' o9 Q+ j/ l$ G# R! G
  9. ;. }% q" p3 J! u6 U: Z

  10. 2 X5 v. [5 ^# _
  11. .model tiny
    " ?4 z) [# W$ W5 K
  12. .586
    + I- k! X3 U: C! A7 Q0 u. o/ l  o
  13. .code0 Q6 |& p: ~! _% u  u: A% v
  14. .stack  100h5 |+ P! B1 }; B( w- I
  15. .startup, c; V! t; S  ]# U5 [6 t
  16. pusha+ u" q+ m) ~! E6 i( i3 X5 x4 \; t1 u3 I4 n
  17. mov ax, 3533h
    0 ~9 X( s! m9 q. o5 [3 e" ~
  18. int 21h  k  b) ]& n5 {% \% e3 W
  19. mov word ptr cs:[old331],es( Z4 ~) U3 K% r# S
  20. mov word ptr cs:[old332],bx
    ) i. K  T! S& k8 n& l" w
  21. mov ax, 3574h
    - G0 E8 J/ Y# h; Q
  22. int 21h; `2 a9 }% N+ D* v
  23. mov word ptr cs:[old741],es
    ; ^# E# A' N4 z) E1 u) Q) D. e
  24. mov word ptr cs:[old742],bx
    , |8 n+ a0 }$ s
  25. popa
    / m, x" V7 J: h, |
  26.         call    memmouse
    . @( `# H/ Q( l# z2 k. \  h1 I" Q
  27.         mov ah, 00& i: @6 W% z1 |- v" \
  28. mov al, 03, r9 K2 ^0 w0 a/ ~; T
  29. int 10h# l1 s6 W+ {8 C9 v
  30. mov ah, 06
    2 |( `4 ]0 h/ V/ D, T' i4 G
  31. mov al, 0
    " E* d" |3 F$ P1 s; T
  32. mov cx, 0
    / C5 f' P7 ^& i8 B1 L
  33. mov dh, 24
    , L( y  e3 @3 N" c- y. G3 ~& P# X
  34. mov dl, 79
    . t# H. z9 r1 ?# I
  35. mov bh, 07h. P& d6 |9 V2 N; p
  36. int 10h) n/ x0 C  r8 M0 c) V
  37. mov ax, 0000+ H6 E. a% O5 u3 ^, K, f0 c
  38. mov bx, 0002& t: K! q/ T- m% |% L
  39. int 33h
    7 O& F; ?8 w$ J9 H( ~
  40.         cmp     ax, 0000           ;if no mouse drive install
    - H. W8 K- o9 G: h# u
  41.         je      errormsg           ;show error MSG5 S: t' |) l0 `8 E6 U; U4 L; n. V
  42. mov ah, 024 i5 [  s, ~% W4 \9 Y% ~0 K
  43. mov bh, 00% l: P1 W9 N' Y) G1 w5 y- Q
  44.         mov     dh, 25             ;Move point out screen
    8 [2 U7 W1 i) H) c# _6 Y
  45. mov dl, 794 e4 A; P( }/ p3 `
  46. int 10h- y  v0 F3 G- V# O3 c
  47.         call    showmsg            ;Show info- V& t+ z2 b6 K" B& J
  48. mov ax, 0001& j: @) \8 l9 t* s1 X
  49. int 33h
    , U9 `- x& q. E, ?  p! e1 O1 g5 V
  50. ; mov ax, 000ah3 o6 z- b* \1 K) `
  51. ; mov bx, 0000
    ; K0 d$ ?6 p( X+ p. h: c4 b
  52. ; mov cl, 0h
    $ X+ V- f5 x* q1 f
  53. ; mov ch, 0F0h% G, r1 [( @2 z6 X$ t7 D$ O/ `( _3 o
  54. ; mov dl, 0h
    * l  F3 n; o: v/ U
  55. ; mov dh, 0F0h
    1 o2 Z! G# Z, d% Y3 \
  56. ; int 33h
    4 z/ @" h! q) R4 X0 b& E
  57. mov ax, 0004h
    + x6 d' q7 I. Y: o: O+ L
  58. mov cx, 0319
    $ a; R& T8 A% {: c5 J/ Y; U/ ~+ Y
  59. mov dx, 0103  D3 a4 ?0 n- G8 x5 ~2 \" u& W
  60. int 33h
    # y+ G. U( B  a5 A5 U3 w& Z' T
  61. casemo:                           ;Case button click and point move
    $ n7 F2 h0 F/ `9 b, N
  62.         mov     ax, 000bh         ;and keyboard press
    3 u% v& c$ u, h- M
  63. int 33h
    5 `' a% a3 l( G0 R9 q
  64.         cmp     cx, 00h           ;if point move....X
    7 k2 `* I9 K" V: Y
  65. jne xmov) ^  u! l* a' t. Z
  66.         cmp     dx, 00h           ;if point move....Y
    ) |* U7 e, ^% E  @* c0 {5 l
  67. jne ymov
    2 N6 Y. w0 h, f
  68. xymovend:                         ;X.Y move end: ~7 Z9 k: u% R4 `: W3 |
  69.         mov     ax, 0003          8 N( s5 T( N* z, v) K4 Q
  70. int 33h  B1 \1 n7 a; [& N+ w! ?' W) T
  71.         cmp     bx, 0001          ;if left button click  show ON
    : w- C! K9 H3 `" l
  72. mov si, 1828
    # W$ n5 r% n: s
  73. je listl
    ( d( h& P2 n: \( S6 L" ^
  74. mov si, 1828
    + b! e8 X1 ]1 [, T" R2 M2 |9 y
  75.         jne     nlistl            ;if left no click show OFF
    3 _1 u6 P! i6 k9 N! S
  76. testr:  b9 N" k* k$ E" ]" i3 x
  77.         cmp     bx, 0002          ;if right button click show ON0 ~$ S' O1 N2 V. {2 x
  78. mov si,18425 O- M) @' y0 A: @
  79. je listr
    $ E+ s4 l! x, y' Y2 D# A
  80.         mov     si,1842           ;if right no click show OFF* b1 P+ t9 w4 o* R' c5 d6 X
  81. jne nlistl' P% _/ M: E# B' F" C9 |# w0 {
  82. casekey:5 b1 ~+ X/ D/ E4 A/ j3 L. J
  83.         mov     ah, 01            ;if any key press jump check
    4 `' z8 u" l& {8 c3 ^4 K
  84. int 16h
    6 I- u, p9 r; W& \$ _
  85. jne kpress1 h& O' M' _/ m! k
  86.         mov     al, [chkl]        ;check x flag
      R# x7 g5 y: s
  87. cmp al, 02h+ p; l' i8 |8 d# _& S2 x
  88. jnb chkok5 m  p, I& G  n% U: f9 Z
  89. jmp casemo
    6 D* f* s  ~/ ^* l: C( D( g) w
  90. xmov:                             ;if X moved, get the X flag+16 g& W; V, F+ w, N% L+ F" z
  91. mov al, [chkl]. D1 Q9 H5 |5 [8 E
  92. inc al& ?. a' m* s5 z" C! |3 d
  93. mov [chkl], al- M0 X% K& \1 {/ Z5 @& K( n
  94. call passok
    + ^. B! v7 X7 `( G1 U8 ?
  95. jmp xymovend
      v$ G' R3 j& u6 C8 S$ {
  96. ymov:                             ;if Y moved, get the X flag+1: U. g$ ]" [. c3 ~* [; M
  97. mov al, [chkr]/ G+ }2 E/ A, y9 ^7 `
  98. inc al4 R8 C$ ^. M; C/ m" X0 U; y4 \
  99. mov [chkr], al0 U' w! s6 |2 j+ w& }$ h
  100. call passok
    ( X# K( Q7 a+ {' Y/ ]$ A& N
  101. jmp xymovend
    ' X2 h" }, u" S

  102. + R) d9 e6 Q2 v
  103. passok proc near
    0 x/ q" ?2 A! w; a7 k) \/ N' p
  104. mov al, [okcheck]
    2 e- H3 ]* c1 ?& _& y$ a& U( m: O# ]
  105. cmp al, 1
    & ^. c/ I7 P2 E2 l& I
  106. je let0; q+ }9 K% o3 P- R' H3 a
  107. jmp passret
    ( i2 f- O& v6 b' o
  108. let0: % o5 u. s. V+ i9 [! W
  109. mov [pass], 1
    : d" ^* l) F$ r8 g) ^# l3 Y
  110. passret:
    3 u2 e( z& L$ F" g$ s6 o% F
  111. ret
    % V' d* |6 U7 {6 T3 V+ A$ \$ ^
  112. passok endp
    ; j' g# f5 x4 I' W
  113. ( W/ e3 L6 n. d: x
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS  ]+ @, F* k- F3 [
  115. mov al, [chkr]. ?% E# i6 x: f6 q
  116. cmp al, 02h
    1 y+ k( J6 O+ @3 \6 U& [
  117. jb casemo
    ( M4 |  L4 J+ r- ?; p/ A6 a' r
  118. mov al, [lk]2 S! U9 e) O' l# D! B: T0 Y( q
  119. cmp al, 1  C! h+ ^* \0 C6 \7 e- |
  120. jne casemo
    5 H* ^& ^) M6 I+ M1 t' q0 N
  121. mov al, [rk]9 G* ^$ Y/ D- u8 z, p! @
  122. cmp al, 1. N; \9 ~- Z4 L  \
  123. jne  casemo2 _5 ]/ T, p% H! {; v3 {
  124. mov [okcheck], 1. N" [2 a2 M' E0 Y$ X1 H9 e# v! W0 ^
  125. mov al, [pass]
    9 I7 ^2 V) X4 _3 }% V2 Y
  126. cmp al, 18 V/ d2 ^: K, i7 E+ _; N* [
  127. jne  casemo7 ~1 g. ?6 J6 C0 D' D4 Q: |
  128. mov ax,0002h
    ' u+ M; u7 R# g% `
  129. int 33h
    : l: L0 \6 x' Q$ b" B0 Q% g
  130. call cleascr5 k0 V: Z& f" ]; }, j2 |

  131. ! v1 c+ ^- Z# n9 |  g5 e9 E
  132. call oldint; I( F" }! Z- N
  133. mov ax, 04c00h
    $ u- S4 X  B; ]; d( B, \/ x
  134. int 21h" H& U# F# g% J5 ?- t

  135. 3 K+ Y! Z) _- ~+ q
  136. okexit:6 n- t6 l6 g3 l# q& }
  137. mov ah, 4ch& i7 X6 j+ L+ C7 h( H) F
  138. mov al, 04 C* t8 K3 M" a7 i
  139. int 21h7 \$ t/ G- _7 `1 t9 c5 W: @
  140. listl:                                 ;Show ON
    : Z& {& O( H$ m
  141. pusha
      J' G  w5 r. ^- @2 l) p+ D- J, J
  142. mov ax, 0b800h
    : W- Q+ n0 _0 r; l9 {; [
  143. mov  es, ax
    * l- L  n, A# v
  144. mov ah, 47h7 l8 ?" C7 Z0 V( n
  145. mov al, 20h
    ) g0 H4 d& k% ?; Z" u
  146. mov es:[si], ax: x5 N1 T; G4 a) G' r6 j
  147. add si, 02
    0 V% o4 W, l/ Z+ e. o
  148. mov  al, 4fh9 e0 O/ ^$ y% W/ @0 u  i% ~
  149. mov es:[si], ax: C/ ~7 c  B' ]6 o0 u) D
  150. mov al, 4eh- S  q$ z. A5 t% }
  151. add si, 02. k! Z9 ~- g3 m$ J# g4 i
  152. mov es:[si], ax0 t/ }2 Y6 b" A( [$ t
  153. mov [lk], 1
    ; E, M" v: |5 v& C! q4 I# y- U, l
  154. popa
    4 t% t1 P+ k7 h- Z6 ?" ^3 f& b( r
  155. jmp testr9 f4 q( u/ _% `2 z  c, ~+ z+ U: p& V
  156. listr:                                 ;Show ON$ n" w; T' i. L8 W
  157. pusha
    # C2 K. N  ]1 h" r
  158. mov ax, 0b800h! `' p" U' X' s* k# w
  159. mov  es, ax" W. V' e* I# v) ?5 f8 ^- B
  160. mov ah, 47h+ Z" t4 S- D4 V2 m
  161. mov al, 20h
    ' O0 h# A- n( J' R  I" S- ]: y% I+ G" I
  162. mov es:[si], ax  s+ s8 s( r( H, _' {5 y$ R. s
  163. add si, 02; {( P, J4 ]8 e2 g8 ?
  164. mov  al, 4fh; u" L' i6 _& Q3 S
  165. mov es:[si], ax. T9 I  T9 Q+ n% b4 Q
  166. mov al, 4eh
    " X" d! L+ W# l7 k# j
  167. add si, 02
    " h5 K4 Q; r' ?6 a1 Q
  168. mov es:[si], ax% f; \1 z) R9 ~8 [$ r
  169. mov [rk], 1
    * x$ V# J( g; _6 `% w
  170. popa
    3 b7 I3 x  o; c/ B7 N( G7 s. M* f
  171. jmp  casekey: z0 w) s. G- p4 q4 ?0 d
  172.   N3 {. L( k! E& w& K8 @0 e
  173. nlistl:                              ;Show OFF
    / C7 A, g$ {9 N+ u- p1 P
  174. pusha   % m0 }$ o/ \8 i7 _2 s& X- j, H# T2 C
  175. mov ax, 0b800h' U; `$ I* m* w6 F
  176. mov  es, ax
    - N. @3 q* F2 B2 l1 w$ \/ L
  177. mov ah, 17h" ^4 I# B2 @/ `+ g6 v$ E
  178. mov al, 4fh, _+ m3 s/ J, o4 ~4 M4 L# c2 A. c
  179. mov es:[si], ax6 N$ C* f4 O+ C* G7 ]
  180. add si, 02! D9 R7 ?: Q9 T8 s( O& D4 H
  181. mov  al, 46h1 h: }* N% |* D- \# J7 h
  182. mov es:[si], ax
    / l4 V( }2 v& c) G0 o! H" J
  183. mov al, 46h- s- Q" `( B1 e' e' I6 q+ I% [
  184. add si, 02
      r' y! ]! j8 J1 V" \4 J8 u6 d
  185. mov es:[si], ax
    . d, u, V$ x4 ~+ P* q6 u
  186. popa
    5 G; o  N0 G6 A
  187. cmp si, 1840
    ) ?, R# O3 a7 L1 d3 u
  188. jae casekey
    . R3 v4 _4 W2 k
  189. jmp testr
    9 s* h/ L& Z9 F6 C8 @

  190. 3 }" H4 y1 @; S( U4 c
  191. kpress:                             ;Check key press if press<ESC> then EXIT5 U% c6 |8 N  Z# W
  192.         cmp     ah, 01h             ;and return a error2 }0 S" y, G. v/ G- ?2 I, I9 q
  193. je exit15 \$ r8 t7 c6 v  Z& I
  194.         mov     ah, 0ch             ;if press other key then clear
    1 @1 l! V/ z' u) Y! V2 L* C% [
  195.         mov     al, 00              ;keyboard buffer. y- }9 I" R8 B5 r) X
  196. int 21h) b! f4 f8 `7 [0 h( b3 }' D
  197. jmp casemo
    / G, v6 m, |, D/ ]; ^% K* k4 i

  198. . Q' M  t' ?  Y; L) r' Z
  199. errormsg:                           ;if mouse driver no install$ q3 }1 f7 e. F  p) G2 r
  200. call oldint
    9 q: ~$ d1 S& @
  201. lea dx, offset emsg
    . s2 Z" R& T% a6 H) w- @  K
  202. mov ah, 09h
    # k; ^- v8 P2 d6 _, Y
  203. int 21h/ B. Y9 K: d6 n8 w" D
  204. mov ah, 4ch
    4 d3 j; L; R6 ]' l* t$ @3 B
  205. mov al, 2
    " J/ ^' ?/ A2 w# v2 @8 G
  206. int  21h
    6 Y8 c) @1 q! O0 p+ Q
  207. ; P, |% ^6 V# [  V
  208. exit1:                              ;error exit
    3 C- A% I( A2 U& N
  209. mov ax, 0002h! _' J7 ?: q9 c$ p
  210. int 33h2 ?9 z* x! x* b/ }: t& z
  211. call  cleascr
    - M- j' W0 n) h. }
  212. call  oldint
    1 v" G" j) T" b" q: v- t+ W2 f, G
  213. mov ah, 4ch
    * _/ F& E+ w5 H; A. X& t8 V1 p
  214. mov al, 01$ g9 N1 _- u4 ^) v! Z
  215. int 21h% f2 B2 a. X5 d) L) r% S9 `# i
  216. 2 Q+ o9 I% d& }6 v+ t) a! r
  217. cleascr proc    near                ;clear screen1 y- c5 h0 h! J) x
  218. pusha
    ( A9 k4 }, Z2 ?. k5 }
  219. mov ah, 06
    . L" j( {1 G" d6 E3 W
  220. mov al, 0& h! y1 b# e( R5 [/ n
  221. mov cx, 0$ q, p  N9 ?! m# h# }
  222. mov dh, 24' l3 K0 V7 t3 R0 k- G6 h
  223. mov dl, 79; j6 ^; V7 ~5 @* g* ]0 }; E8 Q- f
  224. mov bh, 07h
    $ k2 U! k. b" C2 x* g: W
  225. int 10h
    & B- E. K: S1 M( R+ ~: o6 R
  226. mov ah, 02
    0 s5 c- }9 N' m/ o# a: n, d
  227. mov bh, 00
    7 D+ p3 `6 l- T% Y6 A% s: Z5 |
  228. mov dh, 0
    - n: v" ]/ J7 E
  229. mov dl, 00 x* Q5 P; A4 L$ e
  230. int 10h9 p! e' m. g+ y6 [. _# M0 O
  231. popa
    5 n. g$ k; L9 i, e, V, N1 C
  232. ret
    , L% l0 `* A4 |
  233. cleascr endp
    ! A  T9 \1 B+ t8 c3 F4 E
  234. / @3 H- v& m9 V8 |1 h3 {
  235. showmsg proc    near               ;Show info  p' d7 ?, A' h
  236. pusha( a: n1 U" l) y0 t* p; g
  237. lea di, offset showms
    5 G. A5 M  L+ w  A" P& u
  238. mov ax, 0b800h$ b0 z. I( D9 v5 p
  239. mov es, ax& u( l- M- V7 P4 \/ C8 s) i
  240. mov si, 04 ?8 E9 R, z- X4 F1 W5 D) Y5 _
  241. mov cx, 480
    ' b5 q& L' W/ C4 P: M
  242. mov ah, 07h
    ; S0 t1 u+ i; m, }1 A0 y( \
  243. @@:
    * G( P2 }8 _8 p
  244. mov al, 20h8 z8 Y, S' B% w2 q$ U+ Q) k
  245. mov es:[si], ax
    4 v! s  Q8 k. I/ {' [" y* v
  246. add si, 2+ O0 C4 b* g& K1 D2 K5 F
  247. loop @b0 O6 L2 H/ r+ {; m. P/ q1 M" [. f
  248. mov cx,880( ^8 }) ]- ?- r
  249. @@:% e- |# D0 A6 ^, }! Y1 _) L1 V: V
  250. mov al, [di]% L% t. a  K/ l, g# z. |
  251. inc di/ p% S) T% C  p- q
  252. cmp al,20h' @! D8 g: M3 m6 H
  253. je showch1
    5 A* W! X8 c2 D, [6 Q
  254. mov ah, 17h5 J+ N# r7 F7 j4 D& P8 A
  255. jmp showch3   V; T1 h7 Y/ z# v8 o& q- i, E
  256. showch1:& b1 v& M. L8 Z0 g1 R2 p1 q, x7 w1 `
  257. mov ah, 07h $ Y( x$ o+ c! D4 U9 ]
  258. showch3:- t; A; s1 c, b, m  m- {' V
  259. mov es:[si], ax
    ) C$ z8 j& M4 T* P, V, K4 M
  260. add si, 2
    + `8 K( `! q' T, u, s' Y
  261. loop @b. |7 j# t2 W, o% z+ t! F
  262. popa
    6 p& e: j6 Z4 M# Z3 P
  263. ret( \- j: M# r9 j5 e4 y
  264. showmsg endp
    # _3 ^# K  D1 k7 t/ h" O
  265. $ ^- Y1 ?' S% D+ T
  266. oldint proc0 J' x0 _; a3 p# y$ k  Q( A
  267. pusha6 A$ H0 i6 m' r( X3 Q
  268. mov ds, word ptr cs:[old331]; r$ z: `! r7 X9 J
  269. mov   dx, word ptr cs:[old332]: e- R3 o, x- D, ?- [
  270. mov ax, 2533h/ o) m+ Z2 j( s+ Y9 v
  271. int 21h" q# u  i% @! u. H9 R: t
  272. mov ds, word ptr cs:[old741]
    - c% d% c7 L6 i
  273. mov dx, word ptr cs:[old742]
    & m9 ]# H: P' j! R2 o4 h/ j
  274. mov ax, 2574h
    ) h! N3 ^( E# t" ?6 t8 O
  275. int 21h
    ; D6 f0 p- ?( O: z0 O9 s
  276. popa  q+ q( C4 D. G) s. P; S
  277. ret4 y  A- h+ d" s: R
  278. oldint endp) R- x$ v: A. s# j

  279. ) v9 i# I. C) J; z
  280. memmouse        proc
      o/ G8 P. \% w5 r; S
  281.         xor     ax,ax
    5 |) t* i2 e! V, x
  282. int 33h+ Z8 E; N  E: V; W
  283. cmp ax,0ffffh& W  M0 f0 e; U. {
  284.         jne     not_loaded
    5 h6 y2 |6 F/ {' [- S/ M7 g
  285. mov [memcopy], 14 o! ]" ^' b" x: P# b2 [
  286. ret% P7 T. j& Z# a4 ^6 h' J
  287. : t! _: {- K; i2 M6 ~
  288. not_loaded:/ m2 y* m# G# _
  289. ; G* s! [  R" n- z1 u3 D+ ]0 x
  290.         mov ax,2574h9 t  `  J( @! l- Q# c, A+ U
  291.         mov dx,offset new_isr# z& }5 Z. U: v9 A  y
  292.         int 21h7 Q1 e! [3 [! k; G) e2 a# l

  293. 3 ?& _$ D8 w" `+ ~) w! I& u. ^- ?
  294.         mov ax,2533h# G1 q' U7 Y0 v  }& I
  295.         mov dx,offset new_33
    ( f' }0 n' x% v8 c0 ~3 J
  296.         int 21h
    " T9 t9 q4 E7 ]# Z9 N  r4 {4 p$ r! L1 [
  297. , O) B1 u6 P5 ?# Z+ Z. A3 }/ i# n
  298.         cli
    , {& ^6 i' M( u% {

  299. - B; O; b5 Z9 k5 K9 i7 P8 ]
  300.         mov bl,0a8h
    8 V' A% X7 f; }, {" ?' }
  301.         call keyboard_cmd1 ?  ~4 K9 G9 N

  302. 4 i' l: C+ q- `! Q8 J3 r8 \
  303.         mov bl,20h
    4 Y4 E% N( }1 b' k" x# J- L* |4 }
  304.         call    keyboard_cmd# a- v. z; l$ \5 F1 A( K
  305.         call    keyboard_read  A# K% ^! w% M$ Q( [
  306.         or      al,2
    % o: c0 @- i1 t  G
  307.         mov     bl,60h* H( I2 @1 i& e- a6 I1 v
  308.         push    ax3 L5 |  H5 h1 |! [: G
  309.         call    keyboard_cmd
    + C2 W7 F+ o4 R& s- B# u
  310.         pop     ax
    : J- Y( \/ u" M
  311.         call    keyboard_write
    / O% z* c' d% |/ d/ V

  312. & G0 [6 g4 p/ {* H: D- s
  313.         mov     bl,0d4h
    & a3 S" x$ ~+ G
  314.         call    keyboard_cmd
    9 I3 k, U3 O2 ~/ g7 [8 b
  315.         mov     al,0f4h
    ( [0 P* {) V) _$ Z$ K
  316.         call    keyboard_write
    , n( m* G3 K, D4 }/ ]) V6 }+ J

  317. ' H9 {7 h; E" n, a% }5 y  ^+ f/ Q
  318.         sti
    * x) s2 `, k8 }+ `0 G% g) S
  319.         ret
    $ e: I6 _- `+ |1 I
  320. call_user_isr:, I8 q3 l. V+ d( ]
  321. db      60h
    3 @8 ^5 x. I) w; N
  322.         mov     cx,cs:[pos_x]6 H4 L; z9 }" k9 C' T7 _% M* h
  323.         mov     dx,cs:[pos_y]2 }& V" g% {) H% ]9 V' u
  324.         mov     di,0 ;cs:[x_move]
    , t) V0 @1 L8 W" n
  325.         mov     si,0 ;cs:[y_move]& T; K, _7 H+ P# c
  326.         mov     word ptr cs:[x_move],0
    9 Y9 f' L; ]- r* t4 C
  327.         mov     word ptr cs:[y_move],0. t7 @4 I( u6 i  X$ ^. o. |  i  b
  328.         mov     bl,byte ptr cs:[buttons]
    . q9 d# \+ Y- w* W# ~
  329.         xor     bh,bh6 {6 ]* u: h" X1 T
  330.         call    dword ptr cs:[user_subroutine]
    5 H3 g* ~; s  D- k
  331.         db      61h2 ?! H6 C* Q, A8 d5 ~8 F
  332. ret
    ) e7 t# z* C) |0 g2 F
  333. new_isr:
    ! o# J' K7 B3 ^: U1 E- y! P' q* f
  334.         pushf
    ! P+ U, ]' x. s2 v
  335.         cli
    0 d  I' {- C; Q0 E  U- z
  336.         push    ax
      w$ v2 ^8 M: [/ Z
  337.         push    bx0 v8 W: d# d  x, B
  338.         push    cx
    4 g9 I" z" |, b$ d- ^1 g: t0 `
  339.         push    dx& t9 n. P6 q% M) R% Z
  340.         push    di
      O" R/ J8 f8 Y% Q& J
  341.         push    si
    6 a' R* W( h" k' \" d
  342.         push    es
    ; {& m" b) |# E9 i& {
  343.         push    ds: {! p3 n" I0 u+ @4 m( o% r

  344. # i" N' @# i! R8 B9 A
  345.         push    cs
    + i2 V8 Q' o/ d3 T" o5 U
  346.         pop     ds
    3 @0 F6 {0 }3 w
  347. $ Y; E, a6 x6 m' u* Q% Y- @+ x
  348.         mov     bl,0adh2 \  {5 {6 _4 q$ a
  349.         call    keyboard_cmd" ]5 r, F) {8 o2 X9 w

  350. $ e. Q1 P6 A% B# O) n) {
  351.         cmp     byte ptr [first_time],0
    ( ]0 Y2 J0 U3 @) P7 v
  352.         je      not_first_time% K6 b. K' ?& M- M9 V( C9 p

  353. - z+ ~+ G4 h5 D. i  J) m. h
  354.         mov     byte ptr [first_time],0
    % r7 |- L. L: W) u4 f
  355.         call    keyboard_read, i$ F+ R9 g5 [& c, {. m- [
  356.         call    keyboard_read
    3 m) s% d( `# `+ _! j) u* y
  357.         call    keyboard_read$ i1 t0 n# m1 B
  358.         jmp     no_show
    ; W( [( n1 K1 E& a9 A
  359. 6 {( @# j8 P; K' {$ C
  360. not_first_time:0 K  S* C: t* M0 g
  361.         mov     word ptr [temp_mask],0
    $ A# ^* b! `' q/ N
  362. 5 U! W5 X: O* W' z3 {8 u
  363.         mov     cx,[pos_x]* F6 N4 M; B" ^$ K* B
  364.         mov     dx,[pos_y]
    ; D' z7 S, D0 g

  365. 5 e4 f* w) F) D4 u6 M* [; i7 k$ k1 F
  366.         call    keyboard_read
    8 ?# ^. l+ U$ q+ D2 f+ s+ `
  367.         and     al,7 ;3
    1 E9 U! A( z- q7 x) U1 |7 w9 s
  368.         mov     ah,[buttons]+ X6 @9 J8 Q7 a1 y& ~  O
  369.         mov     [buttons],al
    1 W+ D! ~; X) N5 a+ R7 m3 J
  370.         cmp     al,ah, N6 @! }0 v& f$ S
  371.         je      no_button_change
    ! Q4 ]0 z1 _, p. ]+ p2 f
  372.         and     al,3
    - y. T) I) E; L" p  ]
  373.         and     ah,3
    ! J/ b1 r& F1 b/ O2 W
  374.         xor     al,ah$ m! w$ h/ W/ w+ p& z3 W) G
  375.         xor     bx,bx
      ?, K" q) T5 R) {2 n( k! A

  376. / A- p6 s5 a/ u# n; h( Q0 \) @
  377.         push    ax3 B# C4 c% \0 a- R, K+ `( F
  378.         test    al,2
    9 Q4 t$ b9 @& \3 ^8 u
  379.         jz      no_right_button_change3 B- k3 @9 J4 t) r& s  M
  380.         and     ah,2: y2 a( k' b: N3 L" Q' k
  381.         jz      right_button_pressed  Q( v6 V4 v4 _4 n0 P4 O# F
  382.         or      bx,16
    ( U1 K7 n# h3 }5 k
  383.         jmp     no_right_button_change
    ' L7 g+ W6 [! K' {, i6 l1 s9 h/ g
  384. right_button_pressed:3 s( l6 J' {& `; l( d
  385.         or      bx,8
    ! X/ T% z* Y: K" I1 ~2 s  p* b$ {/ z
  386. no_right_button_change:
    $ `9 M2 P/ W& v
  387. . S. [- t0 ]' R4 p" c' ^4 ^- Q
  388.         pop     ax" @% z! |' Y/ W/ o# Y3 Y

  389. 8 w" m3 x5 @, x6 Z% ?% _
  390.         test    al,1
    / k1 P* Y' I) ?: o  k( J
  391.         jz      no_left_button_change
      e1 Y8 t: j( s3 }7 l2 t8 @4 V8 R
  392.         and     ah,16 o7 |3 z* A4 v% z5 w& P: ^
  393.         jz      left_button_pressed
    , q6 e( X# m) r
  394.         or      bx,4
    9 K9 j2 m8 C' v3 j: S5 R) z
  395.         jmp     no_left_button_change
    2 X$ E, S- t# o% {# _0 q
  396. left_button_pressed:
    / e1 Q' C) @: j7 b1 B+ t
  397.         or      bx,2$ }$ R: ~1 w. _. z9 b/ O
  398. no_left_button_change:
    8 ~, `/ N1 ~' J

  399. , N3 L) w  r9 ]
  400.         mov     [temp_mask],bx( x; r1 Y- Y+ b4 ?

  401. 4 Z2 y5 A  R$ W3 T! q
  402. no_button_change:
    + n7 i% r. D( v" ?; n3 @+ l0 E# M
  403.         call    keyboard_read% k6 v/ H  {" y" H
  404.         cbw5 ?" A6 O; f7 e/ O& y; T4 e
  405.         add     [pos_x],ax  Y( M1 O. {8 u- r! B
  406.         add     [x_move],ax
    0 e# Z4 G. W' T6 l8 [$ f% a
  407.         mov     ax,[x_min]* I/ ?( M! l& \
  408.         cmp     [pos_x],ax
    " }* i/ D7 b  e. t) r9 X+ f! W" d3 }
  409.         jg      good_hor1
    9 o$ q& n6 D* r( H' v! D
  410.         mov     [pos_x],ax: b' f+ h  M# i- {6 m; K. K! k
  411. good_hor1:5 C; }$ a/ y2 e% f
  412.         mov     ax,[x_max]
    5 Q: G, T' M5 _" V7 y) ?
  413.         cmp     [pos_x],ax6 b, F1 F& m& U" W
  414.         jle     good_hor2. H( c; U/ L% C# P
  415.         mov     [pos_x],ax' @# O% r3 s5 x) P
  416. good_hor2:5 G" Y6 f% ?2 E% o# y

  417. ( l1 T8 ]7 S( g4 i7 V1 i9 ~# U* W
  418.         call    keyboard_read) v$ B# J9 {4 E4 L
  419.         neg     al
    8 H. [6 _" F' H% t; K+ I+ K; |+ @' I
  420.         cbw
    3 g; x: q5 L0 E  b  |9 ~
  421.         add     [pos_y],ax- O) ?7 R4 l0 n# D$ e5 ?6 [6 |
  422.         add     [y_move],ax0 ~! T7 h1 _0 Z
  423.         mov     ax,[y_min]
    ) c5 G+ h$ ], q9 D3 K9 x9 B
  424.         cmp     [pos_y],ax
    & c' s$ `! h$ e: E
  425.         jg      good_ver1
    ! I+ R2 }/ o3 X$ G0 ~
  426.         mov     [pos_y],ax
    ) B7 B$ F2 b5 W; {1 X  x# ?5 I
  427. good_ver1:
    0 \  g1 L* D) ^3 z( W
  428.         mov     ax,[y_max]8 x- u* \# q- g4 [% u3 M
  429.         cmp     [pos_y],ax* S( v& x4 u+ W- a8 ^/ [
  430.         jle     good_ver2  Q8 G7 P; Z# V
  431.         mov     [pos_y],ax. n, N2 w1 r8 Q3 d6 j' h
  432. good_ver2:
    2 h. N2 r! k. a- W

  433. , t: N4 [/ @5 ]
  434.         mov     ax,[x_move]* q$ d/ g8 \2 P# @7 `; d* y7 {3 u9 D
  435.         or      ax,[y_move]& B- B/ R* a0 L1 Z$ w: J
  436.         or      ax,ax+ d+ O$ i) @" I' d: f' k/ p
  437.         jz      no_change_position
    / X" j1 B, h% _2 C! n3 _
  438.         or      word ptr [temp_mask],14 c- j, G7 y4 C: V. I
  439. no_change_position:9 K+ f  t1 M' p; r" ^0 e& j* Y& P
  440. 7 w6 r5 r) e; \" S; {# p! O
  441.         mov     ax,[temp_mask]
    * G3 Y5 E8 `! B
  442.         and     ax,[user_mask]" r; ?4 W- Y1 d9 P0 L! T) ~- R
  443.         jz      no_call_user. c! A6 R2 X+ i# x+ s* A) p
  444.         call    call_user_isr
    1 ~1 r: W- J2 Y# F% c* t3 Y
  445. no_call_user:
    6 f$ |$ r5 b0 C. V

  446. ( j% o$ v- F: u! R  I* R5 R8 M  z* i
  447.         cmp     byte ptr [sm_flag],19 M2 D- ?/ w7 T, t% b  Y
  448.         jne     no_show5 e1 P. ]5 h3 j& Y) U# l. Q) l  {

  449. 7 k& b; w9 D: A/ b
  450.         shr     cx,3) q" {! [7 a# M- q! a+ m* v$ l
  451.         shr     dx,35 y. }; L1 Y. G( m; I$ _
  452.         mov     ax,80
    $ X; d  S4 M" A/ K4 u# X% Y
  453.         mul     dl* Y: k! m. {( y" d$ Y9 |
  454.         add     ax,cx
    $ c# W  m4 d. s  U7 V( l
  455.         shl     ax,1
    ; w# V+ }  k6 M7 E; O$ m$ P
  456.         mov     di,ax$ m6 G/ P0 [3 i/ `, g( j
  457.         mov     ax,0b800h
    8 u/ o" Q& W# b
  458.         mov     es,ax; U# S4 e2 @9 c! }1 N( ?! {
  459.         mov     ax,[save_char]
    ! f* k6 p  T+ r& N  R: q# `
  460.         stosw
    , D+ e$ v) x) E, G

  461. $ Y( z7 n) h" m5 ~7 i
  462.         mov     cx,[pos_x]
    2 \4 }, E( l# M# x7 ]0 G
  463.         mov     dx,[pos_y]
    2 v: ^4 D; s/ |  S, j0 M
  464.         shr     cx,3* R$ w8 J2 n+ z: V# M9 b: v
  465.         shr     dx,3
    . H! N" C9 h4 ]
  466.         mov     ax,80
    , U. S- h' L' h' L; o. u8 `( y5 A
  467.         mul     dl
    ( j# ^3 l, b0 h/ B% B! u
  468.         add     ax,cx
    + X4 m" X* F% I% K: F3 _
  469.         shl     ax,1
    . k7 R5 F, g- d/ R2 z
  470.         mov     di,ax
    ! J1 d; Y6 n" z7 V3 ~
  471.         mov     ax,0b800h
    0 o5 Q0 N/ q  Z1 f
  472.         mov     es,ax
    & B, E$ ~" D/ D! `/ B! |4 c
  473.         mov     ax,es:[di]
    4 i( I: R9 B" X3 B# d# P7 e
  474.         mov     [save_char],ax: t/ P1 Q+ \2 z( S$ Z4 N
  475.         not     ah
    ) H' a2 Y9 r* d9 V$ e! s5 n
  476.         and     ah,7fh8 A+ U0 j3 _4 P& ^
  477.         stosw. i' n8 k! g9 [9 t& D! o
  478. no_show:
    " B) f5 R, A. F4 P  J
  479.         mov     bl,0aeh3 L7 v2 E: W! D/ E7 M0 H9 B
  480.         call    keyboard_cmd9 j, U- f+ Z) X; E" B  n$ A+ [6 E

  481. / q( Q/ b; S8 g
  482.         mov     al,20h
    % i- B1 ?- w( }8 c) U3 [4 m
  483.         out     0a0h,al+ ]8 q' p- G0 f2 V
  484.         out     20h,al
    ' e+ p, j8 ]4 j- w+ [2 w* z; c
  485. , ]6 e8 G4 m$ P& S
  486.         pop     ds4 H" {( k) z/ ^+ |5 \# r1 s: W
  487.         pop     es
    2 e! z; B4 z' m3 j, q
  488.         pop     si
    1 O" R7 G- d+ F, ]7 ]$ u
  489.         pop     di. a, ]$ m9 R* c) {
  490.         pop     dx
    % Z1 S0 s4 b# @' [
  491.         pop     cx) |% U; U9 ^1 w8 Z: }; D* m% `+ c+ z
  492.         pop     bx) G7 m5 O" x$ t2 \7 E1 w( {$ o. G
  493.         pop     ax
    + N6 s, F2 W6 l1 o8 j( F( l' B. W3 A
  494.         popf
    5 V  {0 J, }: u
  495.         iret
    * ^0 Y* ~/ a* y/ y4 X( [  `

  496. ; I7 j- f3 `# K2 ^. [
  497. first_time      db      1( W8 x6 s( S% f5 a# l: _
  498. buttons         db      0
    % Y! t4 c& v& n
  499. pos_x           dw      0
    * p( o1 c" B5 F& [
  500. pos_y           dw      0& M6 p% u; l/ b/ s" }
  501. sm_flag         dw      0
    , K; V6 g6 @4 j6 _5 @1 s
  502. save_char       dw      0
    " s7 p. l" B3 \" M0 R. j% K7 I% T
  503. x_move          dw      0
    0 ~1 B; j0 |3 ^. O
  504. y_move          dw      02 ~7 H0 ~; ~3 D+ [/ S( @1 {
  505. x_max           dw      639
    * K  a; ?$ u2 l4 U5 t
  506. x_min           dw      0
    - i* p' v0 H  |9 H. l3 X! t" j& F0 z) }
  507. y_max           dw      199
    2 {8 i( _) o  U9 b
  508. y_min           dw      0
    4 u4 \/ g: A  q) W$ w  N9 M* o
  509. user_subroutine dw      0,09 }$ b' ?- O4 n" q( L
  510. user_mask       dw      0
    ; ?' m! f  E8 r- ]
  511. temp_mask       dw      0
    5 d" l% l6 A, t9 [" s

  512. 9 l- {& t; |- @/ V$ W
  513. keyboard_read:: O( [/ @+ i7 y, r
  514.         push    cx
    1 `7 _! {$ l* ]6 S" L
  515.         push    dx* H# U9 M' P  ^7 P; C( T
  516.         xor     cx,cx3 z- g$ y9 \3 ?. `
  517. key_read_loop:
    : q6 e0 l* ~3 z
  518.         in      al,64h0 G' u/ H" U4 b1 F4 E- C9 Q5 w
  519.         jmp     $+2  _3 \8 ^4 t. Z
  520.         jmp     $+2
    * s1 u5 X$ [+ {* F
  521.         test    al,1
    0 y. C- _& E! Y7 g7 c" n& }, s
  522.         jnz     key_read_ready: e' g9 H: k% x& L4 ^
  523.         loop    key_read_loop
    ; P6 Z" W& N2 s
  524.         mov     ah,1
    0 E9 E4 V  P& W7 x- p5 z9 k) q
  525.         jmp     key_read_exit
    + L3 e% |# w: V2 G) I
  526. key_read_ready:: D4 l- o: G7 O+ `% n6 `8 k3 X
  527.         push    cx
    5 u" \) Z) P) x+ w
  528.         mov     cx,32% P$ T! a. C1 p! |8 v. l- r: p4 {
  529. key_read_delay:7 @5 w! H* L0 D' t# i
  530.         jmp     $+2
    . w& o2 |; x+ b, i0 Q; x7 m
  531.         jmp     $+29 @4 Y1 R: @2 f- x
  532.         loop    key_read_delay% w9 P4 x9 k8 A- p6 k

  533. 3 m: H! t) i1 e6 F3 s3 G
  534.         pop     cx, A1 F; o2 w" h9 ?
  535. # _" g- }  X$ Z* C* {" \& H3 I
  536.         in      al,60h
    8 C" q0 H9 K- Q' Y
  537.         jmp     $+2& |8 E5 M* a2 c7 b
  538.         jmp     $+2
    , p( V2 K4 e! E  F. E& B
  539.         xor     ah,ah
    ! G5 u' I- F+ o
  540. key_read_exit:
    & r4 J/ M0 o8 L% Z2 k! \9 Q3 t
  541.         pop     dx
    4 O9 M# T$ b- \
  542.         pop     cx5 e! T8 h9 h0 _% z! U& T9 ?9 @, A1 P
  543.         ret: p4 J, E* {6 A
  544. ' Y: L9 G5 l; w' e8 i3 f! M, q/ \$ i
  545. keyboard_write:
    " m- ^) i% }( e2 K% `6 q1 h
  546.         push    cx7 {' u# `/ v/ ~3 d
  547.         push    dx
    * N! F- W, S, Y
  548.         mov     dl,al
    4 y9 S8 ]$ q2 f% O5 `0 d
  549.         xor     cx,cx2 ?/ }3 N& q6 [& |1 C* p
  550. kbd_wrt_loop1:" {" d0 C2 N( z: c% t, p
  551.         in      al,64h8 {% b9 Z/ C6 M( V# z8 b
  552.         jmp     $+2. A1 k: Y# }# Q" @
  553.         jmp     $+2; W+ e1 ?$ {, T* ]  i! [
  554.         test    al,20h+ w( @& Q5 Y6 I$ z  K
  555.         jz      kbd_wrt_ok1: u( }% a* y, n* T; V& H2 Q

  556. : M. w' L5 Y% Z
  557.         loop    kbd_wrt_loop1
    ) W8 }6 Y8 p# n6 M# F" n, Y6 b; d+ E
  558. 8 ?% ^1 q  G7 t# H& `8 n% \% l; D* {
  559.         mov     ah,1+ j: [  X; a# Z
  560.         jmp     kbd_wrt_exit" n$ \& o: |+ @1 E6 r
  561. & [0 G% S; M  n" m2 R
  562. kbd_wrt_ok1:- C3 F3 s, @( J( b9 ]) q2 |
  563.         in      al,60h
    % I7 `1 O" m* y' |) h+ N
  564. : Y6 G) J: A+ a
  565.         xor     cx,cx
    / r' E$ U2 N" l, n, y) i" H
  566. kbd_wrt_loop:
    3 x5 X6 `! D# U' L& E' d- R
  567.         in      al,64h
    / X4 h& [4 o- ?- {% s! `
  568.         jmp     $+2
    . C- `' v: }! j% K' C; c# S
  569.         jmp     $+2/ d$ K6 T6 r$ m7 P
  570.         test    al,2! m7 R3 q1 m6 F- E) u5 y
  571.         jz      kbd_wrt_ok6 f% ?/ n% y2 F
  572. - N# e6 V7 D( T7 x0 `2 q7 L
  573.         loop    kbd_wrt_loop
    ' u! M6 r! @( A  M
  574. 2 Y: ?2 [$ C5 K( @, N
  575.         mov     ah,1
    % G4 {  Z0 y3 ]# H0 ?" J! v
  576.         jmp     kbd_wrt_exit
    1 j" J0 I- z7 E% N

  577. 4 s( I/ [: I0 s/ I; C3 O
  578. kbd_wrt_ok:1 X' A4 C0 q$ C1 z1 [1 Y
  579.         mov     al,dl
    $ j* q. o. z" x
  580.         out     60h,al
    4 V7 ?: N2 }4 T! [( _  ~
  581.         jmp     $+2
    ' o, f$ W3 Z5 S: B  w# d  ?8 }
  582.         jmp     $+2: Q$ W3 _, `; F  U7 n3 _$ y

  583. 1 O9 u% j  I. ?- w7 s: |2 Y
  584.         xor     cx,cx
    : g. ^* H+ }2 e9 T4 D' J+ T
  585. kbd_wrt_loop3:
    " ~; w+ A0 S# R0 o7 @7 y4 X1 _
  586.         in      al,64h
    & D8 |. k: a8 A8 o$ A( x% x
  587.         jmp     $+2
    # @9 D2 V/ q4 j! ^
  588.         jmp     $+2: H. @& P3 ]8 [
  589.         test    al,2! V8 {* K# i8 }$ v5 I9 I
  590.         jz      kbd_wrt_ok3; `- l  D( {0 U2 \4 I& ?9 [
  591. ' g% y2 k+ U# \  V9 e- ]; Y& n, k
  592.         loop    kbd_wrt_loop3
    ' m, @5 s8 v2 _8 V: U# H& Y4 ^

  593. & ^4 p$ I* q6 r0 O# q* {( k
  594.         mov     ah,1
    2 x& [) Y0 h6 b$ u! f
  595.         jmp     kbd_wrt_exit4 j: y) o0 f$ z( {& }) E3 w# @
  596. ) c. R* `3 R5 y) g- [2 j( b
  597. kbd_wrt_ok3:
    / H7 J) ~3 M1 X( d
  598.         mov     ah,8* }7 v8 C4 Q4 M/ S) W. Q/ Q! N
  599. kbd_wrt_loop4:5 A; d- d" p5 j9 E
  600.         xor     cx,cx; e5 m7 G3 P! M: v
  601. kbd_wrt_loop5:
    8 D1 x( J$ O. x! _  v, B8 p- V
  602.         in      al,64h4 W2 K) C1 ?) ]5 j+ S, ]: n- z
  603.         jmp     $+2
    / F- \" \# b$ ~8 I4 g# [' q
  604.         jmp     $+2
    " M/ t" F4 t* s. ]! c0 O+ k/ I/ B
  605.         test    al,1
    5 b$ j3 @/ y! R5 L
  606.         jnz     kbd_wrt_ok40 T2 X. s5 K8 V

  607. ) X" `& z* m) C- |1 c
  608.         loop    kbd_wrt_loop5
    : a" d6 H( s6 I/ l# a- V

  609. + r" w1 s3 h6 C0 m% c- O; ?
  610.         dec     ah$ z0 P) d1 G# A( ^
  611.         jnz     kbd_wrt_loop4, p1 v8 W5 \' g% H
  612. 7 {5 j( Z/ D! J- q
  613. kbd_wrt_ok4:
    0 |3 A1 i8 i4 g
  614.         xor     ah,ah
    5 ]3 z' b0 n6 i/ L  O# S# H
  615. kbd_wrt_exit:( J" H! P% }# V- V+ P; ]9 `
  616.         pop     dx! a, N! `: p6 F5 {/ s
  617.         pop     cx
    ! L0 `8 d# ^4 d
  618.         ret3 d! W: z' k1 Z' Q, j; @& N
  619.         
    ( C: w( i6 l4 c# t( R8 s1 [
  620. keyboard_cmd:4 J! J1 o) Q8 A! \1 K
  621.         xor     cx,cx0 q: U5 A; q" j2 s7 _& Z3 N8 b- Y
  622. cmd_wait:
    * Q9 N6 J  d- X% m8 r5 `
  623.         in      al,64h
    . g# @5 z3 ]2 |/ D
  624.         jmp     $+2
    " G' f$ C3 Q$ z9 U* x( z5 k- u: e
  625.         jmp     $+20 }2 a9 ?; [+ V+ ?. F; _
  626.         test    al,2
    : `5 S; E! ?/ Y* ~4 N8 V
  627.         jz      cmd_send/ m! |6 G9 @% Z5 V# l5 o# [3 i1 k' D
  628.         loop    cmd_wait
    $ S9 j- x) y" n1 q* v! L$ U

  629. 8 N  e4 r$ s9 k3 z& R6 n
  630.         jmp     cmd_error
    5 A7 ?! h  a7 r% n+ D- ]3 F

  631. 2 K7 n2 L, ~% j. g. U
  632. cmd_send:+ e, b# V# C3 B! U6 f  t
  633.         mov     al,bl
    - R, Q- ?/ T+ D/ J% `
  634.         out     64h,al' g) X1 _+ ]; ^- O3 Z( L% d
  635.         jmp     $+2% I" p; O" z! F' v7 J! A
  636.         jmp     $+27 H6 T; b5 D0 m2 ~

  637. . q6 L4 v1 c$ @. V$ z
  638.         xor     cx,cx
    , D6 u: v8 ?+ Q- J
  639. cmd_accept:
    $ U0 e$ G: ], U) ~4 J
  640.         in      al,64h
    ! g& E0 t" C: r$ z  q/ v* M) r. d
  641.         jmp     $+2
    ' I, |. `% p/ P$ @, a/ o
  642.         jmp     $+2
    % ^2 u- g" o1 B- E/ T+ k/ V
  643.         test    al,2
    2 N+ \( `" o  J; y- M7 }* H$ ?1 ]6 z
  644.         jz      cmd_ok
    4 |1 f" ~. c, i! W0 c+ u. h
  645.         loop    cmd_accept
    ) c# E8 h5 j$ ^
  646. : U9 P; B& C5 b2 ]) ?6 k: N; i
  647. cmd_error:
    " R; I/ a# j( \; N8 K/ {
  648.         mov     ah,1+ h8 q# e$ X2 g# G% E/ A
  649.         jmp     cmd_exit
    * W2 h$ w+ Q8 d
  650. cmd_ok:& t# ~- Q. J1 h  }6 _
  651.         xor     ah,ah
    # }$ G- ]& z+ c- q7 F' |
  652. cmd_exit:
    , h% f  b4 k  B9 G  `$ _3 j
  653.         ret
    + N7 f  V8 N/ W7 \) @

  654. * F4 H9 A3 {3 _' D% J
  655. new_33:
    " @/ O0 Y9 ]# m( E
  656.         cli
    3 z( o. X* X6 B/ ^
  657.         cmp     al,0
    9 V# k8 i' h. d& Z3 R0 E9 C
  658.         je      reset_mouse
    ) m5 l  ~) `9 S6 N5 h; Y
  659.         cmp     al,1
    5 |. b  G2 a' t( v' Q
  660.         je      show_mouse& ?3 L' l( i$ o& K
  661.         cmp     al,2
    / o2 q# \# ?6 A, W9 f7 z& l- F  t
  662.         je      hide_mouse
    3 U1 b1 n. h6 E1 w4 u- o& C
  663.         cmp     al,34 N* Y, M1 J1 h! u# r1 x/ H0 L
  664.         je      get_pos
    ' r4 q1 v7 ]$ w
  665.         cmp     al,4  V8 Y( f+ n8 ?& c/ N$ n+ y
  666.         je      set_pos
    / M2 O6 b. x% g9 z7 y
  667.         cmp     al,7
    6 l- }7 ^2 i; g' d' |
  668.         je      set_hor_pos
    2 X) ~, n4 l0 ?6 r9 e
  669.         cmp     al,8
    2 u# g  }. R. m
  670.         je      set_ver_pos
    . Y2 I+ a- R9 R5 o8 _
  671.         cmp     al,0bh+ \" o0 v1 \1 N: n; ~4 u' \
  672.         je      get_mouse_movement* ~% Y! [" ~+ m) Y: p
  673.         cmp     al,0ch4 N9 P7 j/ ?: m! t4 Y
  674.         je      set_subroutines
    1 N5 [; {5 D% w8 w
  675.         cmp     al,14h
    + N0 ^# f0 b2 E9 l8 i9 z! o: g
  676.         je      swap_subroutines7 z9 h1 c& k6 i) ^
  677.         iret
    7 }# }7 e0 x7 {: y& a
  678. + |) q/ J; u/ E1 Z$ `/ d
  679. reset_mouse:
    ) L: W7 E, n2 \4 c8 v
  680.         jmp     _reset_mouse
    0 m1 R0 E, @/ q+ R+ b/ t- x3 u
  681. show_mouse:
    6 g3 N+ P2 D; `' c0 r
  682.         jmp     _show_mouse$ a# V& O: ~6 Q3 i) N5 g$ v. D
  683. hide_mouse:
    - F; p6 E1 x  K" _0 c) H, _
  684.         jmp     _hide_mouse
    . |" l7 h2 M9 a! e3 t
  685. get_pos:
    . y' H7 A# D# N; G  j- d3 P
  686.         jmp     _get_pos  F2 B- g6 T$ g% s. k
  687. set_pos:
    ' l1 }9 o; N; l$ k
  688.         jmp     _set_pos1 t8 z, b; v' R; r8 J6 v
  689. set_hor_pos:! Q( M# A" a( k9 `5 H
  690.         jmp     _set_hor_pos
    3 O- h7 S( e2 X( j. l( W% s
  691. set_ver_pos:
    8 Q  z, s2 V' d9 a- Q
  692.         jmp     _set_ver_pos" V7 d- ]& Q# F& D8 Q% J6 G
  693. get_mouse_movement:
    6 K! x& l& t. g- b4 C8 n
  694.         jmp     _get_mouse_movement& j5 D% j* n# w, T
  695. set_subroutines:8 w' @8 }8 o+ t/ ?* Y# U5 k
  696.         jmp     _set_subroutines/ w* Z: v! F$ ^
  697. swap_subroutines:
    " m9 ^; ]3 _& c, d  g6 |
  698.         jmp     _swap_subroutines
    0 r6 s! S0 ?. L! @" u- B
  699. + Y1 W2 p( J0 t# ^+ c5 n
  700. _reset_mouse:9 E; q9 q% I2 N+ G! `# j
  701.         mov     byte ptr cs:[buttons],0
    ! S6 V4 c) Y; c0 x; d( T7 C" q
  702.         mov     word ptr cs:[pos_x],0
    1 V4 \: n% g) A- Y4 ]9 ^: T
  703.         mov     word ptr cs:[pos_y],0. x  e+ e3 r2 ?2 D
  704.         mov     word ptr cs:[x_move],0  k3 F# F' J5 z+ y$ p
  705.         mov     word ptr cs:[y_move],0
    " @, K# ~; [( D5 W' ?
  706.         mov     word ptr cs:[x_max],6396 q# z  R0 F' l; ~5 D/ F$ w
  707.         mov     word ptr cs:[x_min],0* \. ^( ~% |& P7 U8 E- y8 {, W3 U" {
  708.         mov     word ptr cs:[y_max],199
    ! L/ ]% V7 ^) Y4 l- E8 s# S+ }3 c- [0 x
  709.         mov     word ptr cs:[y_min],0
    5 y! G  ^5 s' D2 k  ^
  710.         mov     word ptr cs:[user_mask],0
    . u5 e& l) o/ z( y$ T. c  m5 O2 E
  711.         mov     word ptr cs:[user_subroutine],0* v& }% s1 ]1 K( X, Z) x( o
  712.         mov     word ptr cs:[user_subroutine+2],0
    , z- k* h: Y* M1 D$ k6 j( @0 _( T
  713.         mov     ax,0ffffh
    9 |. `1 E! V2 I) [( v
  714.         mov     bx,3' m' @9 {# J& P  z) y4 B
  715.         iret
    # R2 W- J' I3 y/ c0 r& r2 k" Z1 J
  716. ) v1 z; n% A$ I. y+ Q1 T' J- f5 C
  717. _get_pos:
    * C5 O) @. z/ a7 Z
  718.         mov     cx,cs:[pos_x]# r/ @& W8 R% I
  719.         mov     dx,cs:[pos_y]+ t! @: k4 \8 ^3 i9 [6 ^* c
  720.         mov     bx,word ptr cs:[buttons]
    , K/ v/ T/ r4 f# S
  721.         xor     bh,bh( u& p, D3 r  B9 k6 c2 f1 Z' R8 B- \
  722.         iret9 m; y5 e4 p4 |* X( ]

  723. ( |0 v& D% I6 }: q3 @& [! M; ?
  724. _get_mouse_movement:
    : {4 H/ g& r9 l9 o2 O5 {! k( z) F
  725.         mov     cx,cs:[x_move]
    1 {. l7 S. T. N
  726.         mov     dx,cs:[y_move]
    8 l6 ?' j- \# w$ {
  727.         mov     word ptr cs:[x_move],0
    4 K- R, l! J) K
  728.         mov     word ptr cs:[y_move],0- ]7 A8 c# z) K5 O
  729.         iret
    $ m5 Z+ X* ^: `% ?: N, o# U1 m1 ?1 L
  730.   a- ?3 r" a% h" x& g9 @1 }  S
  731. _show_mouse:$ f  f) \* z) Z. W
  732.         push    ax
    # A) o7 m. S1 n. o8 ]( E
  733.         push    bx
    9 `9 S) e% \: D" r# x4 z) D
  734.         push    di! J3 t5 I9 c$ ~# K$ R1 Z+ S" G
  735.         push    es- M5 H9 {& p: F* w( A6 V7 F. o$ x$ I
  736.         mov     byte ptr cs:[sm_flag],1
    : Q, o( Y8 q9 y; y0 D9 A" C! q0 m
  737.         mov     ax,cs:[pos_y]9 S6 R0 B" @; Q3 y7 M
  738.         shr     ax,3$ Y5 S2 i8 H- u- Z
  739.         mov     bl,805 a3 w/ C$ O4 w/ f. S
  740.         mul     bl
    4 Y3 i/ s% z5 j0 u
  741.         mov     bx,[pos_x]
    . K8 Q) R8 \* b/ @; S# ]- E* J8 E
  742.         shr     bx,3% r/ K' N* B" j* U( r7 Z
  743.         add     ax,bx
    1 A5 l- ]% g5 x% u6 C1 d
  744.         shl     ax,1
    : ?/ k6 s% R& N7 U( \
  745.         mov     di,ax3 x! H! J; X2 h1 r7 D7 S  \
  746.         mov     ax,0b800h
    6 f9 b9 ^: w* g8 W
  747.         mov     es,ax
    1 @# J+ z+ e& x  A2 S: t3 H
  748.         mov     ax,es:[di]: \, S, z3 J# b# s/ Z  n# G4 ~
  749.         mov     cs:[save_char],ax& G6 K: w' w+ R+ Y
  750.         not     ah, r7 ~  A% ^5 U% W; c; e
  751.         and     ah,7fh
    ! `3 H3 z3 `" [1 M; ^
  752.         mov     es:[di],ax
    " c; u% F) [6 ?0 n( P' |
  753.         pop     es
    ! n  U! e0 u- y- Q( O
  754.         pop     di
    " z2 F4 A* x+ E& i
  755.         pop     bx
    8 i1 |% I& m$ T) t& e
  756.         pop     ax
    5 H/ Q8 c& f# d9 @; L
  757.         iret
    0 V* M5 a4 j4 O: |! O

  758. % p$ G: B+ V! O& u2 C7 g$ J  X
  759. _hide_mouse:
    5 T- m1 H4 x3 i( W. t8 h
  760.         push    ax0 T' N3 P  `2 e! ]% L# n9 k/ U  x
  761.         push    bx! P4 b) t8 R' o- L) J$ b9 C
  762.         push    di! Z7 q0 i6 }' [. \, Z$ \9 p
  763.         push    es& O0 z0 U8 |( u. O" ?) x0 P
  764.         mov     byte ptr cs:[sm_flag],0: x; P# z5 k$ Y5 P$ ]+ D" J
  765.         mov     ax,cs:[pos_y]' t, s) T* W) s, I
  766.         shr     ax,3+ k6 i6 K: ?) F
  767.         mov     bl,809 M4 E2 W" i8 B) y* k- E
  768.         mul     bl* j& m! x$ @1 p0 ]- A- d; X: I2 K- H
  769.         mov     bx,[pos_x]
    0 s+ }* X* K( w" o
  770.         shr     bx,3
    + f' l& [* S5 Q) e
  771.         add     ax,bx
    . U+ ?" d- P  s- K3 d% T. K
  772.         shl     ax,1
    4 \- r6 Z0 k. q7 j/ u' U$ M( h
  773.         mov     di,ax
    ) s$ T7 U2 y6 E/ T5 v% W
  774.         mov     ax,0b800h) w3 O, Y" w& g2 G
  775.         mov     es,ax- _( D5 c# s) e. ]( h: O+ Q
  776.         mov     ax,cs:[save_char]6 _  w9 X; V6 B2 o1 t* b. s
  777.         mov     es:[di],ax7 D: l0 ]+ S5 Z( g; u0 V
  778.         pop     es, e$ M7 @5 K' T4 m$ u+ l# y
  779.         pop     di
    / B* U) F1 d/ ]4 a1 u5 g( Z$ C8 I5 i
  780.         pop     bx
    $ D& e: h0 W& b2 v: E& ?4 `
  781.         pop     ax
    / P2 ?7 k. A6 h' n
  782.         iret8 c. F( X  E' t+ N3 w6 p) Z
  783. 1 w& z1 X/ h6 G; ?. q0 A  g# i- z
  784. _set_pos:
    $ m  v3 d4 @8 e& L: C, m
  785.         mov     cx,cs:[pos_x]( b. k9 c4 v$ }1 k+ x) L! \  U6 F' b
  786.         mov     dx,cs:[pos_y]. ?( Q+ c: o$ ~  b' p9 R8 e1 l
  787.         mov     word ptr cs:[x_move],0
    + @2 L+ M' L5 f. R$ |9 Z# d
  788.         mov     word ptr cs:[y_move],0
    : n7 G$ S6 u* _$ N+ I
  789.         iret
    7 A# B! _0 M- S2 \  k; p
  790. 5 Q/ {! ]& _- ~7 c
  791. _set_hor_pos:
    % P2 s6 J  d) ~2 M# A: ^1 _1 f
  792.         call    max_min9 m0 C/ K) f# [: ]2 Z
  793.         mov     cs:[x_min],cx9 S' K/ @" T$ ^$ b* K/ i7 L5 G
  794.         mov     cs:[x_max],dx8 R7 Z* i+ p- k7 Q' M) Z2 w$ W
  795.         cmp     cs:[pos_x],cx$ q7 ]# K8 \3 q
  796.         jge     good_hor_min
    " ]) N! X) S/ k; |
  797.         mov     cs:[pos_x],cx
    , i: r5 Y* _* J1 p3 S# U
  798. good_hor_min:. e; Y2 D6 i. h7 v2 h* x
  799.         cmp     cs:[pos_x],dx
    $ U4 J. P! ]) N3 P. t
  800.         jle     good_hor_max
    0 R7 G3 Z$ @% @0 N+ D3 o; K
  801.         mov     cs:[pos_x],dx
    % }8 I) r; x9 H
  802. good_hor_max:
    - Q1 U* T3 j: B8 U( }1 o
  803.        iret
    " N8 E7 L% S6 {9 s9 g# }, i: w. r+ V, |' x
  804. ( g/ w9 [0 G7 i' Y- @' p
  805. _set_ver_pos:4 t3 [4 E$ |4 u: e, K' j
  806.         call    max_min8 M2 ^5 t3 C$ A' Z  X
  807.         mov     cs:[y_min],cx
    : U4 x7 i0 l( N
  808.         mov     cs:[y_max],dx
    7 `3 Y; A. z$ C" f1 J; Z" {
  809.         cmp     cs:[pos_y],cx. w, D( T/ U/ Z3 s
  810.         jge     good_ver_min# N1 R2 T. T- N. x' Y( R  I- I) P
  811.         mov     cs:[pos_y],cx
    - A* T/ Z) s3 N$ a7 f  u
  812. good_ver_min:" s- V, a1 j; L* X
  813.         cmp     cs:[pos_y],dx( ~: K3 [# L# F, x, n# k& e7 D
  814.         jle     good_ver_max
    6 `; ^) e: T' I
  815.         mov     cs:[pos_y],dx+ \# O- ^; `! ]
  816. good_ver_max:
    + b  i( p' q, e# U6 _( y
  817.         iret
    0 H1 a) I) D8 t6 _) ?
  818. . ^; X: z: b' q8 P
  819. max_min:% i# F" h6 q+ p+ t9 O6 c
  820.         cmp     cx,dx  G& n  _* f" Y1 G
  821.         jle     no_swap
    ! i1 P& w6 m5 |' j4 v6 S1 L
  822.         xchg    cx,dx( k; h: I0 x3 C$ c. J7 E2 t. d% c6 h
  823. no_swap:
    ' K/ x% ?" @# P- M1 |
  824.         ret
    ( f2 P: s& x4 p
  825. ' f/ ^* D0 k8 {. [6 n- \* ]
  826. _set_subroutines:+ m4 n) K/ f& z% R2 y
  827.         mov     cs:[user_subroutine],dx
    6 I) e' q2 q$ {2 m( ]  C( o# x) Y4 e) X
  828.         mov     cs:[user_subroutine+2],es
    + d8 N$ C2 K/ R$ r. `  F
  829.         mov     cs:[user_mask],cx
    2 {; ^6 U' V: \  V8 H; d0 e2 b7 {
  830.         iret
      ~$ n  V% p! r. D
  831. 5 _! ^6 N  H0 K3 F$ N. O
  832. _swap_subroutines:; T" H7 q7 {4 s+ w( R( g
  833.         push    word ptr cs:[user_mask]
    * f% ~6 S5 H- @% t- }: w. y
  834.         push    word ptr cs:[user_subroutine+2]
    2 B; ?  z' `. r) b  `
  835.         push    word ptr cs:[user_subroutine]' X  N) H/ {8 `/ f, T1 w3 B
  836.         mov     cs:[user_subroutine],dx
    ! z) C& d5 r3 O( e' M% v
  837.         mov     cs:[user_subroutine+2],es
    1 O' P. l9 g5 _
  838.         mov     cs:[user_mask],cx5 Y3 q5 S& N7 z# P9 {  T6 X+ c* q( l
  839.         pop     dx
    ! R2 E4 P$ P4 o+ b6 o# O
  840.         pop     es% ~+ u% d5 _  ]
  841.         pop     cx
    9 N+ d1 ^4 B4 j: N) ~7 Z/ H, `
  842.         iret+ P' L% ~- Q' c

  843. 8 V: k/ ~" s9 |* P
  844. memmouse        endp
    ) P4 z3 [0 w0 u3 z/ h( e
  845. : z) K. d) ^4 i# ?3 @: }" i
  846. endof_start:
    + P, c" q7 l* I9 ^# G  r

  847. ) Q* {8 r' y& o$ Q
  848. emsg db 'No mouse driver install error!$'
    ! c5 E, d) g/ W2 w% }* e; h
  849. old331 dw 07 I6 |; p$ M1 p. f, X
  850. old332 dw 0. G! H5 b4 D3 i3 R# F
  851. old741 dw 0
    : P+ C- S; A5 r- o# B5 ^
  852. old742 dw 0
    2 \1 C5 |; j! c( @  M
  853. memcopy db 0. d1 |3 J, z* W7 r3 |
  854. okcheck db 0+ K/ o/ l2 j/ S9 o/ C% I
  855. pass db 0
    ( e2 I8 ]& M, ~* a
  856. chkl db 0( }, C7 V. S! Y9 `, G' m, Z
  857. lk db 08 U) \6 X5 F/ u5 x; e
  858. chkr db 0) {0 u- S5 k# N) C
  859. rk db 0
    1 `5 m7 q1 s2 o) v8 b
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '0 q9 G- C' L4 R" W2 C" T
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '7 ~8 Y% J7 D" w' w" H) C
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '0 @. _  G  v# N! W: z9 K0 `( s
  863. db '                                                                                '
    + C4 n( w& D: z; X7 R+ i/ j6 R
  864. db '                                赏屯屯簧屯屯突                                  '  J0 C5 X. X- V
  865.         db      '                                ?OFF汉OFF?                                 '1 N) x7 ~$ |) m4 c3 }. {
  866. db      '                                韧屯屯既屯屯图                                  '
    $ D: a& p# N- x) l+ S% y$ O4 `4 [3 v( c
  867. db '                                                                                '' g# a8 }+ y3 G! G8 e/ [: k
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    6 D3 ~0 M# V3 T1 @4 ]" ~, K' H
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    8 u: M/ ^% e/ b- j5 S; w
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '& l$ I' V, D( e2 |  {! L

  871. 3 X6 J. H2 g8 m& e
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
  h. p1 ~1 w+ E; g' n! h& B5 X哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
( R: Y" r% H* L" S, ~0 g/ {! ]1 Y5 f* O0 t, r; h$ _. \. @
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:47 , Processed in 1.897166 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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