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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
! O0 ]/ L& R# w5 w. X' r
5 v! p& R  `3 \/ R* g' ]" L代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;# d3 c! x) e' Y1 v* v. K# T$ C
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9" C% h" W1 i3 R4 b) s# a$ _
  3. ;                                         By Bini.Yi 易祝兵  E# d! o7 F$ A
  4. ;                                         http://www.ufoit.com 计匠网
    1 R' s. ^# x1 T& z: b6 l
  5. ;                                         2002/04/06 YYYY/MM/DD
    & J' ^% f8 z" f7 O
  6. ;% K) s7 a4 ^  n' W; g
  7. ;          / t8 K; J+ k- G; O' H/ ~
  8. ;          This program  test the mouse button  click and move.* `" A! P+ [/ v. M! m) I  w- r" M; Z
  9. ;
    + {' t7 @3 M8 m
  10. # \( j" _: |' p& }$ z& ?4 [
  11. .model tiny
    4 Q9 u' X4 X' y: j4 u8 S5 ^
  12. .586
    8 V" b( F; ]$ P3 X) r2 e
  13. .code: X  `6 ~! G5 E- Q
  14. .stack  100h
    ) {6 A" P2 J  F4 J: d2 C7 `6 }; V8 F/ D
  15. .startup
    0 N! |2 z: T) b1 e+ W
  16. pusha, N2 c# {  K1 V8 e
  17. mov ax, 3533h
    3 S$ Y: t+ g) c9 J/ H! X+ R  D* t
  18. int 21h
    8 ?3 ?% ^+ Y- M7 L
  19. mov word ptr cs:[old331],es1 r& _' m- M6 X
  20. mov word ptr cs:[old332],bx
    - k# r+ O6 U  o' R1 E1 r
  21. mov ax, 3574h$ k+ l) Y& }( T& ^3 a) |+ {
  22. int 21h
      D- U2 X8 e3 @) w2 X
  23. mov word ptr cs:[old741],es0 m  J6 |6 a# a9 X8 f5 j
  24. mov word ptr cs:[old742],bx* W  x4 s4 F( ]) h% c5 h& @! E
  25. popa+ t+ q5 [1 M2 ^6 a! |  m; u
  26.         call    memmouse1 t% p, {3 o* @
  27.         mov ah, 00
    % F* D0 U. b8 v
  28. mov al, 03
    7 h- U" O/ ~6 }$ |
  29. int 10h
    8 [0 I; P+ M7 x1 b
  30. mov ah, 060 ^- }( K- |/ Y& J! p2 ?& Y/ u
  31. mov al, 0/ J6 C+ M0 a8 s
  32. mov cx, 0" ?8 v: p% l) k1 c9 u
  33. mov dh, 24
    6 d  h( Z( B4 \" O
  34. mov dl, 79# `0 F' [4 e: c) Z2 ~
  35. mov bh, 07h' d* K0 y7 h9 E& ~4 n+ [3 V9 r
  36. int 10h, v7 O. j+ I! n
  37. mov ax, 00001 {6 u* o! E7 W& @( l' q9 F2 p
  38. mov bx, 0002
      V( N1 m( Z- f% k
  39. int 33h% X: g% D5 y- T/ L8 q
  40.         cmp     ax, 0000           ;if no mouse drive install
    , p/ P/ j* ~& O8 K
  41.         je      errormsg           ;show error MSG
    + e% L' v# [+ L7 ?2 }  z
  42. mov ah, 02
    0 B% K# V7 h/ U  F; j' q- d( S
  43. mov bh, 00! C/ p. U* f) c: S2 I& B! n' B8 b
  44.         mov     dh, 25             ;Move point out screen- T" G) L* ?$ o$ D  P, z, _: W$ q
  45. mov dl, 79
    2 ?" o8 ~& ^7 e& t6 Q8 N* Q
  46. int 10h7 A5 W  ?) ?. C* `5 ~' F" C: _
  47.         call    showmsg            ;Show info
    9 _9 s% ~! A5 q' [3 e
  48. mov ax, 0001
    6 C5 D8 N6 |$ H3 n3 N- M4 F
  49. int 33h
    3 k: K; c4 p* P+ u2 Q
  50. ; mov ax, 000ah
    $ w8 R: O5 S5 V9 B* A- e' j- a
  51. ; mov bx, 0000: \6 o7 }% b* q# l% z' @
  52. ; mov cl, 0h
    ! f( Z. D' Z  ^0 c) L
  53. ; mov ch, 0F0h5 ^- E+ t% ~/ I- @
  54. ; mov dl, 0h8 e  t# I2 k- p
  55. ; mov dh, 0F0h
    6 D& Q0 ]& R+ k( h8 B: l2 A- x
  56. ; int 33h
    1 h, z. w. F. P8 F$ `) R" o
  57. mov ax, 0004h
    + n+ q0 M2 D) T6 C
  58. mov cx, 0319" \: x4 y# a; m/ s. \6 ]4 d
  59. mov dx, 0103
    ' i) w7 h1 C1 B
  60. int 33h
    * D( b; S# _1 L! s( ^+ J
  61. casemo:                           ;Case button click and point move 1 d5 q. L; f; [) Y, J3 V
  62.         mov     ax, 000bh         ;and keyboard press) E- X2 ?. Y  U# N* @
  63. int 33h
    6 i4 f/ `7 k3 q; [: S2 e
  64.         cmp     cx, 00h           ;if point move....X
    ( V( T6 @, a- P* x$ w
  65. jne xmov. G8 w% s% P) ]3 T
  66.         cmp     dx, 00h           ;if point move....Y1 v: U7 p6 s5 o- }0 S
  67. jne ymov
    / y9 ^& ~  k) a0 [& G' H* t2 V! s0 o
  68. xymovend:                         ;X.Y move end
    % m! ~# A  k: x
  69.         mov     ax, 0003          ( \' s+ s9 v0 s
  70. int 33h
    . e3 d' o% C) y/ ~+ m
  71.         cmp     bx, 0001          ;if left button click  show ON
    % b- ], r% ]7 @! ^
  72. mov si, 1828
    - |5 j0 N2 c9 H$ P) ?* N8 {
  73. je listl" G* X0 H8 r* t) n3 Q$ D2 v/ O
  74. mov si, 1828) P5 G5 q3 k) W% O4 O
  75.         jne     nlistl            ;if left no click show OFF
    / q. ~( q, T4 g" b5 t( a0 d+ T$ i
  76. testr:1 M) Q; ?$ M1 `6 E( D% S5 ^
  77.         cmp     bx, 0002          ;if right button click show ON6 J* i; U# P* K. G/ j
  78. mov si,1842
    8 h+ b" R3 V9 L0 C
  79. je listr3 a1 Q4 w1 }& _% Y$ \8 ]
  80.         mov     si,1842           ;if right no click show OFF" R; j4 p4 X: P3 d4 t8 E* a/ L' \
  81. jne nlistl
    9 K' D0 ?& Z$ r  d, F
  82. casekey:
    7 f4 p6 ?- c  d; J9 C" t% N
  83.         mov     ah, 01            ;if any key press jump check
    9 _% w4 s# P  F2 {  r; \
  84. int 16h
    ( Q+ C3 c5 c6 Q: J* p
  85. jne kpress: Y( h9 q* V0 K* m
  86.         mov     al, [chkl]        ;check x flag) k) z$ D8 X) `; m- ~# w! Y6 V, Y
  87. cmp al, 02h
    . O6 q6 D) n+ ^$ g. ]6 {5 Z
  88. jnb chkok
    5 i0 d5 B& M8 f8 M
  89. jmp casemo
    / ~; q1 G- G2 v. \% ]( w
  90. xmov:                             ;if X moved, get the X flag+13 ]$ K7 Z# [9 \
  91. mov al, [chkl]8 j  U9 I5 ?, M% p) X6 D: ^; _+ ]
  92. inc al
    9 B( H( j4 v4 T
  93. mov [chkl], al  g: Z- h4 X: f) }4 C; p1 g
  94. call passok
    6 q7 ~, Q2 B' M8 H7 y" J  G
  95. jmp xymovend
    ! Z5 U  b+ U. N5 t8 O* i
  96. ymov:                             ;if Y moved, get the X flag+13 N/ L) a0 y6 D
  97. mov al, [chkr]
    $ Y  Q2 r) l5 F5 M4 h  R
  98. inc al" M5 k8 R1 C. T/ g& I
  99. mov [chkr], al/ a7 M: U9 l6 H  j, E' F
  100. call passok' p6 D) D3 O( ]6 x  E" \
  101. jmp xymovend
    & D" s# I6 u7 u( r/ W4 _" U

  102. " v. _) y: E0 Z/ }- D$ R; {
  103. passok proc near0 R, E' ]( J1 z% l
  104. mov al, [okcheck]
    % y0 l5 @; N2 N5 J! n  w' Y
  105. cmp al, 1
    3 D" }+ y, v9 u3 Y: W
  106. je let0
    ! T0 {2 a* V) C
  107. jmp passret0 {3 U8 w) g- w* E" X' w; x
  108. let0:
    2 m, X4 z5 p" F( H' T# q
  109. mov [pass], 1$ G. q. x2 g) Q% ]' M' D8 S
  110. passret:
    8 \* x: P- B+ m. ^; W1 f6 s' v
  111. ret
    7 x0 A: B* i/ {# ?* I; y; [9 l( c
  112. passok endp
    % i5 ]" r( H) y' W* j/ [
  113. ) G1 y/ ?$ T1 j4 i4 f- c6 Y/ O
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    3 k9 b8 E- Z1 j, y2 y0 f
  115. mov al, [chkr]! s- j  j5 B! c
  116. cmp al, 02h* ^, F* f! a6 T. c! G
  117. jb casemo
    1 g, D8 S) U4 u; h" \$ Y( J, d# |7 T
  118. mov al, [lk]
    ! [8 P) w, ?' n# d4 D( U- f- i
  119. cmp al, 1
    # f/ V9 \$ ~, N2 p' ]2 B
  120. jne casemo
    # W  X. Z# n; e7 p
  121. mov al, [rk]
    2 G, i4 |! h% C
  122. cmp al, 19 B( x6 T, U- S
  123. jne  casemo, [' }' f2 W% @5 n9 w
  124. mov [okcheck], 1
    4 P2 {  g. E$ E
  125. mov al, [pass]" ~5 ^5 U: c' [: ~
  126. cmp al, 1
    0 }- s. ~8 r/ k( y% L
  127. jne  casemo* R2 o, j3 S# o7 k( J$ W  U
  128. mov ax,0002h
    1 d# I" K; `2 b  ^/ Z
  129. int 33h
    9 F8 R# h' ^; \$ k+ B# N* c" @
  130. call cleascr
    3 P& ~& z" ?( e" Y' j. K* K
  131. - Z7 W/ X  L, D- @8 J1 B# h4 A
  132. call oldint
    ! F5 S' r# ~9 f& X6 ~6 B6 }
  133. mov ax, 04c00h6 k3 }5 s/ a2 z5 E7 \; M5 E) L
  134. int 21h
    + |+ k* i3 [) d, Y$ ~" O
  135. ; \% m# E6 l: ?% K% G* Z  D% q+ E; |
  136. okexit:
    . F5 X5 i* l1 Q8 W/ S- B/ m
  137. mov ah, 4ch
    # e( @  q9 l% K) M1 U) D
  138. mov al, 0
    * A5 a+ P5 v6 {+ Q! \/ A
  139. int 21h1 t- Y! E1 X# Q' K/ l
  140. listl:                                 ;Show ON) z. `# N; K: _
  141. pusha
    % J' \6 b( f' z2 x. M. n* B
  142. mov ax, 0b800h
    , `7 X" r* ^- w, J( o
  143. mov  es, ax
    * X- U5 J* B( h+ ^; \8 k! Q* g( {4 A
  144. mov ah, 47h$ x' D0 n9 g# b' b& y+ t1 J. w
  145. mov al, 20h
      z. a6 l% k! c7 f% c3 T! \+ I% `
  146. mov es:[si], ax
    : _2 J. k" L1 e/ H$ i
  147. add si, 02
    ( H" F1 U) c" [" T- ]
  148. mov  al, 4fh4 L5 p+ j; ^6 T- J' D* d1 Q
  149. mov es:[si], ax
    2 V# \* [  y7 w+ S- Y* J' c* M2 ^
  150. mov al, 4eh* ^) a& F& X! @4 j1 M
  151. add si, 02" V3 ~  m9 s5 f2 M( b9 m
  152. mov es:[si], ax
    3 \& H4 D" |0 }. V* i8 [
  153. mov [lk], 1
    " h- s: _: Y# h" X( G' W2 A
  154. popa
    : A; Z) _$ ~) T8 F
  155. jmp testr# |7 v* {. A, H+ i" }
  156. listr:                                 ;Show ON) o2 T$ L0 ]6 e5 s  n' {) O, K7 T
  157. pusha
    ' z/ f( z4 O; A! f4 q
  158. mov ax, 0b800h* k' l/ j7 z% ^/ O& g
  159. mov  es, ax
    + i3 d3 O3 o  Q; [& [* n
  160. mov ah, 47h
    & M5 F. U( K3 k- R7 P2 {
  161. mov al, 20h
    ; M* m/ X0 |6 x1 b5 R* H/ o' V
  162. mov es:[si], ax* v* N" b2 K* D. C) K
  163. add si, 02
    * c/ x! `0 s" R6 M& d: u9 ]% d1 @
  164. mov  al, 4fh
    ' Q& J" Z) L4 P
  165. mov es:[si], ax
    1 q0 ]$ j) y' s; ^4 P9 J
  166. mov al, 4eh2 E5 f& g+ C% f  N: Q
  167. add si, 02
    ! W5 y' V0 G9 y/ q
  168. mov es:[si], ax
    , |, h+ Q, ]; X- y
  169. mov [rk], 1
    7 t, j& V9 ?( `
  170. popa
    ) V3 Y! j2 B4 r4 U- P6 O
  171. jmp  casekey4 W. V+ f5 b. E; j# y

  172. , d$ c8 U0 o6 V4 O, B1 n
  173. nlistl:                              ;Show OFF- N, J; r! O  W' T* `1 p
  174. pusha   ; l- k( O) \6 T5 ^* b
  175. mov ax, 0b800h
    / i/ \6 u! K' c, ~* a# P
  176. mov  es, ax
    - L  L7 j$ Y8 E5 g- e% ^
  177. mov ah, 17h3 d8 d, G1 [* @% |' h5 l
  178. mov al, 4fh
    9 S" D8 F2 Y, X9 k! T) w
  179. mov es:[si], ax! }/ E7 F0 R2 R4 U
  180. add si, 02
    % G0 q# h: x, l2 h: c' P
  181. mov  al, 46h8 L1 k4 A$ Z( r3 O# h
  182. mov es:[si], ax; E* ^4 \1 b" @# ]% }+ H
  183. mov al, 46h( t% n0 M% H. P( n; O$ o5 ^8 C3 _/ F
  184. add si, 02
    ! p* @6 Z; P! T+ d' ?, {" t5 `* |9 Y# |
  185. mov es:[si], ax8 y% ~  S2 Q- D! d( l) \
  186. popa
    , L! R2 x% C! r
  187. cmp si, 1840! T" @. o9 _7 t' ^! C3 h) p4 N
  188. jae casekey
    2 z& \1 `2 x9 s3 O" C3 @: D
  189. jmp testr
    : ]' F" D7 W" Q) i( G! V
  190. ) K8 |% c3 j, ^
  191. kpress:                             ;Check key press if press<ESC> then EXIT2 n5 G. n4 ]9 D& {+ H$ `
  192.         cmp     ah, 01h             ;and return a error8 o7 m- W; r, D# W, J' f6 W
  193. je exit1
    3 @) |9 e& E- n7 ]4 E' I
  194.         mov     ah, 0ch             ;if press other key then clear" l" D) p) o9 j3 f" P1 x6 B
  195.         mov     al, 00              ;keyboard buffer
    ) ~4 r# J( u% G$ T! V# M
  196. int 21h/ o. ?1 Z# }1 t8 X' M) g; R5 j
  197. jmp casemo
    : ?! J. V# Z' X, I4 l# l

  198. 8 H( N; o' o* X
  199. errormsg:                           ;if mouse driver no install
    4 O' w- R& @+ g2 [
  200. call oldint
    ( H# A: M5 [6 S! p- ?  O4 q. {$ P( P
  201. lea dx, offset emsg
    # u# r7 J% i3 X
  202. mov ah, 09h7 C* T, j" t' R& a, o
  203. int 21h5 N6 J0 |* C% H5 W
  204. mov ah, 4ch
    + |; C* J( A6 D/ B6 }# n6 K3 d
  205. mov al, 22 i. }- o' g8 |% V9 S1 s" Q
  206. int  21h- t+ n6 a4 s8 X9 ?$ @7 X/ \7 r6 Q

  207. 4 |7 _0 r2 l9 }* ~- w
  208. exit1:                              ;error exit
    / C: B% Y( c# q1 h+ M5 s2 S) g
  209. mov ax, 0002h
    / `9 _- ?8 q# S  K* [9 j
  210. int 33h7 T" Q! ]' ?/ p) J4 i2 z
  211. call  cleascr& h4 i# Z8 _% H/ c; v
  212. call  oldint
    0 I7 V7 `7 f# _1 |; p  ]: B# @3 w# h
  213. mov ah, 4ch
    - p9 H" D' w7 i  i/ y7 v$ Y
  214. mov al, 01; Z3 R; o9 h4 }. i
  215. int 21h4 a! {) @/ M: ?

  216. + t: M% N" ?1 i* S0 `; S& P
  217. cleascr proc    near                ;clear screen+ Z3 m% W  x0 q, j( c4 a
  218. pusha
    7 N! _# `+ l8 Q  [! c
  219. mov ah, 06
    9 Y# M1 Y1 R2 v! k+ f
  220. mov al, 0
    9 u9 @- H6 k: E, |; z
  221. mov cx, 0
      @' y; l7 i9 B% Z
  222. mov dh, 249 a, [7 G5 }* i  Y2 L2 o7 ], O
  223. mov dl, 79
    ) m% w! M. ]/ D$ I
  224. mov bh, 07h
    & O$ R, u# q9 f  h
  225. int 10h; Z- v$ e0 n' d9 O
  226. mov ah, 02, [0 Q" ?+ D0 G& S) G& v
  227. mov bh, 00  `* P* h6 |% X, M, I
  228. mov dh, 0
    : R  |% H+ L5 {  h
  229. mov dl, 06 w  n* Q6 i8 a2 x
  230. int 10h
    # [( r4 k, P; j, J  n
  231. popa
    & C2 A5 R) c6 _/ u: S  Y* e
  232. ret" r8 K, P, d. N7 |8 o; i( {6 p
  233. cleascr endp. S% k( o2 L( l% K

  234. 7 @' s5 D, P3 P) M- h, J7 h# L
  235. showmsg proc    near               ;Show info
    + d- ^, Z* C# Z, I2 N" b6 t
  236. pusha) }; ?9 U9 b' T  ~" G8 a+ E
  237. lea di, offset showms
    " g$ m" Y2 R( ]% B
  238. mov ax, 0b800h; Z) {0 ^# B; {  Q3 f0 i
  239. mov es, ax6 o0 T) j' I7 _$ z& K# r
  240. mov si, 0) z  v% v: S/ ~  r
  241. mov cx, 480- H  e7 R% j2 A9 B! r
  242. mov ah, 07h
    # H9 k0 J7 m4 [" X" U5 E
  243. @@:: u" w& L) C4 P4 L; i
  244. mov al, 20h( J# U. U$ z" G8 K( T
  245. mov es:[si], ax0 O/ ?3 l- L/ F+ b. C
  246. add si, 2
    ' c) V1 V. a1 \4 g4 j+ v, k
  247. loop @b8 W. c; \4 g) [
  248. mov cx,880
    % @7 _! Y" n2 l$ [
  249. @@:
    2 ~8 Q. K5 M) ~" A: s1 q: C1 f4 N+ o
  250. mov al, [di]
    7 j- \; Z3 i; _# ~) d' r9 S
  251. inc di( u/ v! C7 K  [2 w7 s% ]- G
  252. cmp al,20h  }6 W2 _. z, }0 x  t3 [
  253. je showch1
    + N7 p, g  W2 p! U
  254. mov ah, 17h
    - E# G/ o" p0 Z4 I- C) d
  255. jmp showch3
    6 Q1 N7 B( c/ X* h+ y% e' N7 l2 p
  256. showch1:
    5 z5 h; D5 W( q; Y7 G1 x  d& M
  257. mov ah, 07h
    ) e% ^3 I$ x2 C# r8 n8 s7 h/ r
  258. showch3:
    ) }$ ]- c# i0 }
  259. mov es:[si], ax
    ; D) `4 \+ X6 Z* ^
  260. add si, 2. J8 @/ q; n5 b. k; C0 z3 i7 \
  261. loop @b" `$ p; t; Q% F  e7 O
  262. popa7 T; a5 y/ O6 P7 b% K! e2 i
  263. ret4 f9 k, B4 d- Y7 w0 M
  264. showmsg endp
    ; S, _2 h$ y% j
  265. 0 L7 i8 L7 I  y0 O  h6 h
  266. oldint proc
    % ?8 M) V% ]! J/ w/ N6 a  i4 `5 ^
  267. pusha1 m- r" f) t5 V9 y  O
  268. mov ds, word ptr cs:[old331]
      }5 C0 a* P% [: ]
  269. mov   dx, word ptr cs:[old332]
    8 R* w. J3 y' z' o* [
  270. mov ax, 2533h
    , U. y* q% g. b' y
  271. int 21h3 z+ H, S0 j9 h
  272. mov ds, word ptr cs:[old741]
    9 y) c0 M0 h3 W( B/ x0 L
  273. mov dx, word ptr cs:[old742]8 M, G$ J* @$ V+ g# `5 m( E
  274. mov ax, 2574h
    7 d( @" W3 a6 C2 d! |$ z: f
  275. int 21h9 J, D3 J( d- p7 Q, g
  276. popa' O9 i6 y& f: D4 K' x1 M5 [2 u5 g
  277. ret
    % R5 W7 @: a+ A, n6 M
  278. oldint endp/ q* V! [* R: U; R9 [' [* P
  279. $ Y- |1 [2 j2 f) R/ W8 ?. s# H
  280. memmouse        proc
    0 B  x! w, _. \% t& z
  281.         xor     ax,ax
    7 f, g) T9 w- m: S
  282. int 33h
    9 j1 _/ w3 V- S, g3 q' n6 Y
  283. cmp ax,0ffffh
    " X) e4 ?5 U3 M1 }8 M6 k
  284.         jne     not_loaded( Q2 t8 X1 X7 W
  285. mov [memcopy], 1
    0 N' [) O# B2 ]4 O
  286. ret
    + [0 V) x) X/ K1 B. i; d1 S
  287. 1 ^9 O( x6 ?6 j* o$ H! ]7 Y
  288. not_loaded:
    ' g2 v# Q& x7 N4 j

  289. 6 H  r; M4 B2 t3 c4 G$ W$ N
  290.         mov ax,2574h* B! n# H5 F' |" ?8 H
  291.         mov dx,offset new_isr
    , Q; a4 \* ~% O) [9 i
  292.         int 21h  {/ @# e2 W" @9 N3 U4 J6 D

  293. & ~: J, w* u' f) n
  294.         mov ax,2533h2 L- S! W* {+ W* K( K7 W
  295.         mov dx,offset new_338 U* G+ i5 W# ?( u; u
  296.         int 21h6 ?- a, J8 h! A# u) \9 d
  297. 9 G6 Q- o; O& D- D+ o( q
  298.         cli0 s  y$ R3 j3 L

  299. 4 i% B1 E! K: L) o$ W4 V
  300.         mov bl,0a8h) w7 @# i" p$ x7 X$ l, t/ B
  301.         call keyboard_cmd1 n' c* f+ X& }1 ]
  302. + W6 R( F, U) z; u
  303.         mov bl,20h% L/ I( f9 p1 u
  304.         call    keyboard_cmd
    ' B# u3 q* v/ m8 d
  305.         call    keyboard_read# [1 B# g7 T. x* M9 |; V2 h( H3 y+ |: u
  306.         or      al,2
    # u. D8 m; L7 q% q. I
  307.         mov     bl,60h
    " ^* y& s/ w; I- U2 d1 f
  308.         push    ax- k7 G' H3 T% m3 z2 i+ o
  309.         call    keyboard_cmd6 g2 w1 V; v9 Q; p; R, l- Q  [
  310.         pop     ax
    9 q2 V6 ^, w9 A" U( Z
  311.         call    keyboard_write
    * ]5 G$ l1 h9 `8 [  V

  312. * c' ]; n8 h4 P1 ^
  313.         mov     bl,0d4h% m. J9 D% u2 v& L
  314.         call    keyboard_cmd- b' s/ m, C; |% D+ Z/ ~
  315.         mov     al,0f4h2 ?0 v# g' v8 Z; e
  316.         call    keyboard_write
    ! s0 e7 t! V7 p; V. P
  317. ) D4 |+ R2 q3 s) W; e5 ]
  318.         sti
    / g4 |8 }/ ]" n0 Y
  319.         ret: w4 B  X( b- q1 P& X3 P  T: O
  320. call_user_isr:1 q7 K) K& D+ |0 z! F  [
  321. db      60h9 d/ `: N- P8 P$ H! U; j# R* ?
  322.         mov     cx,cs:[pos_x]! o2 z. {8 A4 p, j& k& J) [
  323.         mov     dx,cs:[pos_y]
    0 }. T0 o. A7 i( w4 i! P/ l
  324.         mov     di,0 ;cs:[x_move]. v8 k. |- k0 j
  325.         mov     si,0 ;cs:[y_move]
    3 V" n( q. h% [# R
  326.         mov     word ptr cs:[x_move],00 n, ?7 I, J* b  \* |! q1 {( T* c
  327.         mov     word ptr cs:[y_move],0
    # C/ c0 t8 Y6 R" x1 D; z
  328.         mov     bl,byte ptr cs:[buttons]
    / U! }# e4 e1 E" d: l
  329.         xor     bh,bh
    ) F+ L. ?; M1 {3 l4 O/ Q" v3 b/ H
  330.         call    dword ptr cs:[user_subroutine]
    & N1 W7 ?' L. R, u
  331.         db      61h, k, b( s. N1 O- s
  332. ret
    . ~# h( J1 r& ]: m& b
  333. new_isr:$ ~( Z" E0 y! L* ~  o
  334.         pushf# I$ p* q* k- {5 B
  335.         cli
    & ?  x5 ^. W+ E( G
  336.         push    ax
    4 B+ T- k/ y: t2 H+ _- v$ Q: g
  337.         push    bx
    ; l( K; A$ s. D5 E' i
  338.         push    cx% I8 o. _+ t/ S( \8 f0 j5 c
  339.         push    dx$ \" U, J. W& e6 `+ P$ z" M
  340.         push    di
    . q& B! {; c$ F% u* e
  341.         push    si
    4 a; X. V& a8 x4 S# P8 A6 ~0 `
  342.         push    es6 g% F" y# N0 v* _
  343.         push    ds
    " A5 v# `5 P" ~

  344. 7 w( @8 Z/ J  N7 g
  345.         push    cs
    4 f8 a+ [2 B4 f$ q7 y" M
  346.         pop     ds
    ' K! U) N0 S. J+ p5 Q
  347. ; J/ i4 H& i0 @
  348.         mov     bl,0adh5 z, R; f6 D  s. q5 Y
  349.         call    keyboard_cmd
    2 D6 C' T, ]4 f% z
  350. ) O6 M: U7 H2 B- }7 k$ z* l
  351.         cmp     byte ptr [first_time],0
    ; {! J  G$ l/ ?  {
  352.         je      not_first_time
    ! u9 S% M! Q3 \: t0 _3 Y

  353. - Z, k* X, e- ~" ]$ Y) M
  354.         mov     byte ptr [first_time],0( }2 q! U* \! ^; [, q, j
  355.         call    keyboard_read) @0 d, |( u: [) a8 f
  356.         call    keyboard_read
    0 N) K5 O; x; B5 ]
  357.         call    keyboard_read& @1 Q; ^% N! ?! N  Q
  358.         jmp     no_show
    2 N1 G0 O0 v+ c5 g
  359. 6 M9 T" q$ a$ v' B
  360. not_first_time:7 w, ~9 c7 B1 Q0 O
  361.         mov     word ptr [temp_mask],0
    : ~! ]- k8 Z8 i4 |
  362. 8 t- l$ G2 V' c" ~" f
  363.         mov     cx,[pos_x]( K+ T" s, B- O2 M! ]: M
  364.         mov     dx,[pos_y]
    6 X( W, S1 D/ r5 G& U4 ?: o$ x: `1 F, ^
  365. " Y; J2 {2 H' m0 v& H% }
  366.         call    keyboard_read: o6 W# w; [) I" K: O9 U
  367.         and     al,7 ;3
    % t& l" @  T& Q% Z' Y1 g
  368.         mov     ah,[buttons]
    ; j. X- b$ i9 T& G7 c9 _, F
  369.         mov     [buttons],al
    6 p+ ?8 {/ h( l5 Z% r, e
  370.         cmp     al,ah
    9 E( F! X" v( \8 G3 h: V
  371.         je      no_button_change/ v! Z9 r8 K4 t& v  r4 [% ~5 z8 R
  372.         and     al,3
    ' F6 r, o' f- h5 x
  373.         and     ah,3( _0 K* x0 K* {* V; \
  374.         xor     al,ah2 \( \, w( O5 {" g* m
  375.         xor     bx,bx. a* [2 l0 q( I: t8 U6 s

  376. 0 e/ I" a/ B- Z
  377.         push    ax3 Z4 i7 b/ f7 o/ A$ |
  378.         test    al,2
      O' M, y# F0 B; w
  379.         jz      no_right_button_change* z/ u0 C8 t# u/ [
  380.         and     ah,23 M9 O1 S8 N) t  Z4 ~; S6 |
  381.         jz      right_button_pressed, |/ M% Y; W$ ]3 L
  382.         or      bx,16, H, g7 q2 r4 r$ i$ _
  383.         jmp     no_right_button_change7 S6 R  z) `& k$ h. f0 R
  384. right_button_pressed:
    ' i( j1 P3 }) b6 ~0 t1 K. x9 F2 E# a
  385.         or      bx,8) K0 {# d  ~1 |( \" F5 s# Z
  386. no_right_button_change:
    : W; q' e) Q/ e2 T! d* r

  387. 2 g! @3 y' _- C; c
  388.         pop     ax2 `) q. u% W6 e9 d

  389. - L! S" `0 ]' E: J. y$ X
  390.         test    al,1
    3 _" i& X; B, h- z& q
  391.         jz      no_left_button_change
    $ C8 _) r1 R, m9 X* l& p
  392.         and     ah,1
      ?. ^, D/ N9 B# ^0 N* p
  393.         jz      left_button_pressed
    1 \3 _* ~+ c8 x, y; Z. L3 @% r) g
  394.         or      bx,4
    " X& u' F/ z! c7 Q4 x
  395.         jmp     no_left_button_change
      F; B" Z; u# |/ v6 d+ g* Z
  396. left_button_pressed:6 T' n* o5 X- u% h( u
  397.         or      bx,24 u  ^/ L* C, J1 }, x3 a. W
  398. no_left_button_change:
    + X, Y* x) k. f6 o( F; A& h- a* V  y

  399. # G3 v, V# Z: ^) }* q
  400.         mov     [temp_mask],bx
      R4 U$ l7 G% M1 w, d
  401. 8 _1 S! y4 [3 A# |/ p: d
  402. no_button_change:
    . d/ X/ W/ t2 ?- c' s7 y0 V3 e
  403.         call    keyboard_read2 L/ _. s, f% _8 @% N* \
  404.         cbw; [# z0 P9 I5 V1 t# R1 g
  405.         add     [pos_x],ax3 y! @! y* D) c8 U# k/ u6 K9 f
  406.         add     [x_move],ax
    8 R7 g. b3 }/ m! L  V
  407.         mov     ax,[x_min]
    3 x2 m6 r: F- A& [. H& [$ i! s) N9 w
  408.         cmp     [pos_x],ax
    5 ]+ V" \; A9 B% [- n( i$ J9 @
  409.         jg      good_hor1
    2 a$ ^& q; u6 m
  410.         mov     [pos_x],ax
    ) x! F) H2 E& U* @: F# e! C
  411. good_hor1:
    , w$ Z0 z- k/ {( Z) T: `: z
  412.         mov     ax,[x_max]
    : l6 ^% n+ x) x1 m; z
  413.         cmp     [pos_x],ax/ C9 s/ V: A) {& n1 k
  414.         jle     good_hor26 x8 d& x3 S+ g7 r' i
  415.         mov     [pos_x],ax9 `! Z7 i7 b/ W/ L8 Z( j2 X8 `
  416. good_hor2:
    + u- t: k+ S# f) p: h! X. X: ~1 F% a5 [
  417. , _( g5 w( b, R5 N
  418.         call    keyboard_read9 \& a# @# W& k- d3 f
  419.         neg     al5 `0 `! ~+ X4 }. p1 ~" ?/ w- U
  420.         cbw2 b5 E: j8 r" o, x  B) U
  421.         add     [pos_y],ax
    1 i, h5 a- c0 A8 p0 k
  422.         add     [y_move],ax  ?$ E1 W9 y9 v6 t, x: s" l
  423.         mov     ax,[y_min]
    * ]2 f1 B1 t( c# ^/ B# A- U
  424.         cmp     [pos_y],ax- |: ^5 k1 G! U
  425.         jg      good_ver1
    2 {. D/ `& b2 a1 I! U) R$ ^
  426.         mov     [pos_y],ax7 J3 h0 s, B! B0 u* }% K+ V2 M
  427. good_ver1:
    # T9 o& Q6 W3 t0 C
  428.         mov     ax,[y_max]
    % h* H0 \9 M5 Q( j# {" g
  429.         cmp     [pos_y],ax) G0 |! v) q9 R, O3 ?1 A& t% |, L! H' }
  430.         jle     good_ver2: r* L5 E3 d1 N2 C' l3 N
  431.         mov     [pos_y],ax9 {( @7 C  e1 l- w; M3 G
  432. good_ver2:
    ! c. Y7 v* s0 c  i2 R$ `' `. u) l
  433. 9 v  E5 y# M; k: ]1 v4 I5 n
  434.         mov     ax,[x_move]
    % U. r* _& W" s4 F# u
  435.         or      ax,[y_move]& i: A5 I4 L. V" r
  436.         or      ax,ax
      b# I! R: l6 R% Z  f; R
  437.         jz      no_change_position
    " }5 W; g1 C# G9 u+ l7 |: Y
  438.         or      word ptr [temp_mask],1& K0 c6 N" r9 y! h7 O6 F9 d
  439. no_change_position:
    1 u2 s$ K  q: P0 W0 {3 P
  440. ! j' j/ l! G3 G; U
  441.         mov     ax,[temp_mask]
    2 }2 e" F$ }: o$ t
  442.         and     ax,[user_mask]
      B/ u3 m9 k7 ]9 \# N6 n+ A
  443.         jz      no_call_user1 E! e7 d- S: S
  444.         call    call_user_isr
    % U2 H" r+ a" ~& ]( t3 A
  445. no_call_user:
    " A& q# \% ]# m: L0 q; Q. O; f6 a9 v+ R
  446. " K7 c+ q2 Z- ^' k+ R
  447.         cmp     byte ptr [sm_flag],1
    - r( c4 X0 Z3 w. Z5 G# J5 z
  448.         jne     no_show1 E- u& b5 V+ e" u8 t+ r7 d* S! Q
  449. ) X' W; E; J7 g* T
  450.         shr     cx,3
    & a9 b+ ^( Y0 N8 X  V! a4 z& g4 P8 w7 a
  451.         shr     dx,3
    ! i& o/ q* H0 Q
  452.         mov     ax,807 o0 Z+ N3 y  Q7 c6 F% b
  453.         mul     dl
    & y0 t& k7 a6 `0 O
  454.         add     ax,cx7 j  k1 J7 [8 o0 g3 W
  455.         shl     ax,1
    5 H9 c% y' j* q, C" R$ X2 b
  456.         mov     di,ax
    " O0 u* w' s- e  [" L* [! N! l" P, I
  457.         mov     ax,0b800h
    " S5 S' F. f! |; g% e8 i8 D$ w
  458.         mov     es,ax
    ) i1 ~9 ?" {& n& H& K0 n9 ^
  459.         mov     ax,[save_char]
    * K. s8 q* p1 }0 z* |
  460.         stosw
    / g( c. a) s: z1 y/ d- [
  461. . s- |6 \& h2 B, C7 D+ f, i
  462.         mov     cx,[pos_x]* _1 a( j5 I* d* ?. }
  463.         mov     dx,[pos_y]
    : o8 P* f5 I1 c& n4 m( S2 M9 b
  464.         shr     cx,3
    ! n& t7 d7 U6 R- {6 M4 o% \
  465.         shr     dx,3
    ; N  Y4 P$ y& D: a, D0 h" R
  466.         mov     ax,801 _* Q5 @/ J! O
  467.         mul     dl
    : a$ T4 C- E7 E, ^; ~' @4 h1 c
  468.         add     ax,cx
    . W. n+ t: }( V( y, r
  469.         shl     ax,1) c2 U# ^+ h% [0 ]; b7 Z9 y
  470.         mov     di,ax; f6 n; k) m( D" t# ~' ^
  471.         mov     ax,0b800h
    / r7 r$ H% O( m# ~# g$ R% @
  472.         mov     es,ax
    4 N4 I- R* A4 x7 g
  473.         mov     ax,es:[di]5 ?9 r6 x2 F1 g* i
  474.         mov     [save_char],ax6 E+ ^1 ]5 x# H) x
  475.         not     ah8 f& Q# s. [% Q0 P
  476.         and     ah,7fh
    " u1 m, v2 m1 Z
  477.         stosw
    ( C& ?  o! E" J: I1 b
  478. no_show:
    ) u/ j  K& a0 d$ ]9 {9 ~. i
  479.         mov     bl,0aeh$ y2 L) x2 J% X
  480.         call    keyboard_cmd0 D. R- z: b" D' P! g; ~

  481.   O6 P6 O5 k  @
  482.         mov     al,20h
    " Q/ A- K! w0 K2 L; p4 ~+ ^6 K
  483.         out     0a0h,al
    % u! S, p* a* D8 g
  484.         out     20h,al: K: w& g/ w2 V( U  B, D- q! k

  485. 2 G1 {* D1 N# j! S" q/ d
  486.         pop     ds9 X. B" u) y- i' w1 }
  487.         pop     es
      q$ o9 A8 J3 d7 E3 H/ L" T
  488.         pop     si
    5 e- G/ E: F0 F8 c- `; T$ Q' Q
  489.         pop     di+ c' h/ j& }8 Q9 W
  490.         pop     dx9 ]( l; u- J" J  o8 r" i
  491.         pop     cx8 ~7 y$ S* ^& @9 U. z. u; G
  492.         pop     bx0 E2 Y( ]/ u# D8 Z8 c
  493.         pop     ax: U1 z0 A5 s3 d" x2 u. G- a. y
  494.         popf
    4 G. @8 Z' O/ ^! a/ z6 O
  495.         iret
    ! v; c2 W+ B9 J" O3 {

  496. 6 i" E/ k# _0 A8 j4 r( S; N
  497. first_time      db      1: s+ {; R8 p- |0 q: P3 v
  498. buttons         db      02 G4 _( w/ d( {# v4 B" W
  499. pos_x           dw      07 P5 n' \3 H# U1 ~8 v
  500. pos_y           dw      0. C7 C4 M' Y8 q! i5 P) R
  501. sm_flag         dw      0' j; t, g% _# l* C
  502. save_char       dw      0
    / d8 i3 [# I3 u! R* c
  503. x_move          dw      0" Q! z' U5 }9 j8 G
  504. y_move          dw      00 ^& s2 K9 R6 p
  505. x_max           dw      639
    3 E, p% `: N+ m  R
  506. x_min           dw      0
    , i3 U& x4 w: \8 Y
  507. y_max           dw      199
    ! r* j/ F) T: O4 l2 T: q; k) B
  508. y_min           dw      0
    ( b3 M% {& l5 A1 U
  509. user_subroutine dw      0,0
    1 V$ [* r1 v: I
  510. user_mask       dw      0- e' r2 ^' T. N4 a+ D: H
  511. temp_mask       dw      0
    7 @. i6 A( [- q0 f1 h
  512. - u5 y( k: k# M0 j) k$ l0 L
  513. keyboard_read:! Q! ~: a: f2 r4 {5 }/ A. b
  514.         push    cx) H1 O. u% g0 D+ `% B
  515.         push    dx- i/ E8 g# `' P0 S! R$ l. A* a
  516.         xor     cx,cx
    & d) A  r- j$ q  L0 N" `. b
  517. key_read_loop:
      p* u! x/ q) P0 i% }4 J
  518.         in      al,64h. \, K/ g3 u# u* ?6 A' y2 h, F) h+ A& f
  519.         jmp     $+2; W4 M# D) _- S/ n6 `; R
  520.         jmp     $+2  o6 [% u* A3 M) `; t- h
  521.         test    al,1' k( Z5 \  r* Y3 A0 M) u  R
  522.         jnz     key_read_ready5 `- g3 E, {3 @: o  E4 V, P% L
  523.         loop    key_read_loop  j( Q$ i  r7 r. h
  524.         mov     ah,1
    * a+ K4 ]& v7 B8 x2 w1 N2 k( ~
  525.         jmp     key_read_exit7 m9 I9 ]! a& R0 j9 Z% @
  526. key_read_ready:
    / P# @# C) f8 d: b: t
  527.         push    cx6 \# G) A  Q7 `. C" `
  528.         mov     cx,32
    / R6 t/ P' V# N
  529. key_read_delay:
    " w' T" V& t- t0 Z4 `
  530.         jmp     $+2$ \& }( u3 G/ b% {5 V! ]
  531.         jmp     $+2
    $ K' y% b" T$ L2 j/ b
  532.         loop    key_read_delay
    " J7 E# ]: u( C

  533. * J2 X9 `% A! q2 Z: g( N
  534.         pop     cx
    - N( b: V: K; T7 L. N: x, F3 E; Z2 l) M
  535. ! ]6 A4 O0 _1 y$ b) j9 Z+ b
  536.         in      al,60h3 ?* S( r. ?. Y2 c; U7 v/ _
  537.         jmp     $+2
    1 g8 b; [+ ^: k4 X+ |4 w5 e
  538.         jmp     $+2
    ) M  A; C3 {, C+ ?, [* e0 E
  539.         xor     ah,ah) `) C' f, \& Q: ^+ C
  540. key_read_exit:1 Q8 @! S# v5 |" V  Z
  541.         pop     dx
    0 J/ U  |# c; y2 {
  542.         pop     cx
    3 k* z6 S1 K1 n2 v( m. V9 Q
  543.         ret
    , G5 G$ h9 w% v# S' j  D+ l
  544. 0 _: q8 V" b! q- p' O' ?& p9 X
  545. keyboard_write:, H! m, H, L, }6 H8 d
  546.         push    cx
    0 U# `3 A+ n& \, `4 D5 u- ^
  547.         push    dx3 d9 t  l' n: }1 w! y+ C1 u
  548.         mov     dl,al
    * v1 a5 X9 n' M; ?
  549.         xor     cx,cx  g3 L/ r# }; E# w" e; O6 ]" M$ Q+ R
  550. kbd_wrt_loop1:. ?9 K5 e& t/ ~$ G) |8 Z
  551.         in      al,64h
    " |! x# L/ N2 b+ S! q1 g
  552.         jmp     $+2# {) s  Z$ h- n( \6 x
  553.         jmp     $+2
      J* i* A4 \& j' b6 c
  554.         test    al,20h
    % p7 [" f& x5 |5 y
  555.         jz      kbd_wrt_ok1: I6 M+ `0 E1 C9 y" u& o
  556. % k% i& F, L: o- Q$ M: `5 R
  557.         loop    kbd_wrt_loop1! [6 z. R7 i1 k$ K

  558. + O. v, t; d3 B9 {" H8 Q
  559.         mov     ah,1; I8 x& z) S+ K8 y& D( J
  560.         jmp     kbd_wrt_exit
    % ^& n: `/ V$ y* i# G

  561. ( S6 r: e( K4 O* F: `' c) C; Q* J
  562. kbd_wrt_ok1:- I6 }9 W6 D! h: U7 \* M
  563.         in      al,60h; O! \) n  l/ {+ g  w* P7 y
  564. ' r3 ?, f' \+ Z. ~! Z
  565.         xor     cx,cx
    3 l4 F2 [. S; p6 ]( T
  566. kbd_wrt_loop:  I0 Y8 q0 b6 m
  567.         in      al,64h
    0 f  }! ^  {7 p
  568.         jmp     $+26 Z8 B( V2 A3 O+ B) T) L, p
  569.         jmp     $+27 R% T$ u3 V' Y
  570.         test    al,2
    ) V& c% j# f8 P* a% ~4 C- A
  571.         jz      kbd_wrt_ok
    . \  k$ ]9 z+ W% z( B

  572. ) t9 G! [! x) I! S
  573.         loop    kbd_wrt_loop0 a8 H; w+ S3 n; X! |

  574. ) H! h; k7 `: o, V$ G4 f& q
  575.         mov     ah,1$ v0 j* N  g, [+ U% ^9 V6 N5 X3 ~
  576.         jmp     kbd_wrt_exit; z) f9 t$ T  ?0 `- H2 F% t, Y

  577. 1 Q+ a5 o8 i% R9 j* O
  578. kbd_wrt_ok:8 f' G0 G# ?- p" n5 S% i, T
  579.         mov     al,dl
    * q' j8 q! p6 u1 P+ ?& o& D
  580.         out     60h,al; H+ U" W' U" O4 e2 ?* Q
  581.         jmp     $+2
    $ f7 L! W3 w  F8 [3 R8 z' r
  582.         jmp     $+2
    & K8 N2 ?7 o( \& ^1 ~* j3 U. |

  583. $ j5 O8 w+ @5 m/ {1 |, W* ]. i
  584.         xor     cx,cx* L3 o8 A2 b( Q& E3 q
  585. kbd_wrt_loop3:
    ) l8 b4 L9 h( e: `& {
  586.         in      al,64h  [/ V( R5 x2 o# C4 t$ x. A
  587.         jmp     $+2
    0 W8 r0 S0 e$ n: y+ ?, J' X2 [
  588.         jmp     $+2! }. W  Q5 D, a
  589.         test    al,26 w' d' w9 x! w, d" U4 l! B3 L
  590.         jz      kbd_wrt_ok3
    " N5 G6 @6 m6 L" J, o9 R

  591. - K7 M3 t$ N: ]. @: ?
  592.         loop    kbd_wrt_loop3' E, Q: B6 P2 [

  593. 7 V) W2 q8 R+ N9 \4 W
  594.         mov     ah,1' G% \( V% E; v; ?0 M) G
  595.         jmp     kbd_wrt_exit
    , B1 b( c* {% w' |
  596. # j# Z/ j0 L. x" Q
  597. kbd_wrt_ok3:
    4 Q$ e) G& ]& [7 z3 ~% {
  598.         mov     ah,8
    # e) G2 Z- }; I) ^6 L. o
  599. kbd_wrt_loop4:
    8 |/ Q4 c' t3 D5 x$ S  F0 w
  600.         xor     cx,cx, k) v1 {2 l$ O
  601. kbd_wrt_loop5:- q+ e5 O0 u& Z
  602.         in      al,64h$ k6 Q* J6 L. V6 {0 R& P8 }
  603.         jmp     $+2/ g- H- g. a! I2 ^
  604.         jmp     $+2
    6 h! ~% A0 t4 l/ |
  605.         test    al,1
    : Z: j. A. x9 I% y/ R& E
  606.         jnz     kbd_wrt_ok4
    7 R& U8 [1 `$ \% L) p
  607. ( I5 M) c+ y% g# n
  608.         loop    kbd_wrt_loop5
    5 u, T1 d7 ?" S6 v- z' t8 t3 v
  609. . K7 p$ n; O; x  u
  610.         dec     ah3 M& Q: q: o3 [" Z* m( S7 f
  611.         jnz     kbd_wrt_loop4% q+ U; k! S9 Z8 r. a/ c
  612. % B' k7 s$ B3 O8 t9 @" }7 |
  613. kbd_wrt_ok4:
    * F* P* g0 t: M: s4 `* o3 g0 C' I
  614.         xor     ah,ah8 r# A! H" \, E0 U! }  e1 k
  615. kbd_wrt_exit:
    2 [) W" i" o$ ]" W) I5 e( K6 |1 R
  616.         pop     dx
    ; B6 T( w- q% c" @1 O/ b6 K) O
  617.         pop     cx+ D) V& r' }' i( ]
  618.         ret
    * R) M: m: A3 u5 q$ ?# g+ O9 E! J
  619.         
    3 a3 m: J  f' N+ S3 Z0 \
  620. keyboard_cmd:
    # W  [% x  p: A% s" D
  621.         xor     cx,cx4 B5 U. ]6 v9 D* d8 J; ^. l
  622. cmd_wait:
    $ R$ T/ B: K4 D, O" ?2 f
  623.         in      al,64h
    / H1 i0 G5 L, @( g2 ?6 y; _
  624.         jmp     $+2
    : S% y3 Z/ C1 }6 m6 k3 J- L* p
  625.         jmp     $+2
    * |, O* P3 ^, _% h% F  X
  626.         test    al,2% I; C1 x* O# Q% [
  627.         jz      cmd_send$ v& `$ H- }1 q1 Y/ Q# q+ t
  628.         loop    cmd_wait: A* C+ R: X' A7 U: L& `6 k( Z

  629. . U  d: X  [2 K% g
  630.         jmp     cmd_error
    8 I3 n  y3 _; Y, u/ f5 l. g
  631. 7 ?/ V- g+ M8 B. E# I! K. `
  632. cmd_send:  |3 Y: d3 i: z, L  x: K2 p+ P
  633.         mov     al,bl/ M3 e& G* H% i( U! i, D" D
  634.         out     64h,al
    9 a$ n( y8 U- U- V/ _
  635.         jmp     $+2
    " C; a6 g8 O; h1 R4 N, C
  636.         jmp     $+2
    8 Q) L8 `7 a6 U3 M$ l

  637. 1 X: F( x, Y' p! s3 C3 I
  638.         xor     cx,cx9 ~( a) o, `/ _) N+ d
  639. cmd_accept:
    2 H# Z: ~: O) y- J8 K# l- t8 o. ~9 ~3 [) q
  640.         in      al,64h
    - Z5 O0 O0 b, ^- _& D- Q9 N  U
  641.         jmp     $+2
    . ~! ]; `9 f" M6 o# M- m  G& Y& }: C
  642.         jmp     $+2
    : x' l0 G$ q. |0 ?; T5 o
  643.         test    al,2) Q# L3 p6 @+ }7 D$ z( l
  644.         jz      cmd_ok
    6 h9 ^7 R" B* T  H! Q1 N& s# f& ?
  645.         loop    cmd_accept
    # @& }/ Y6 w8 s+ Q
  646. 9 N0 S8 s" Z8 \) j; f1 `
  647. cmd_error:
    4 m! N8 U" N( U" _5 J
  648.         mov     ah,1
    7 N5 j9 J# s& h# c! o2 x
  649.         jmp     cmd_exit
    & j+ q' U7 H- U8 ~
  650. cmd_ok:
    % H1 `. ^. t1 ?/ m! {8 m( Z
  651.         xor     ah,ah3 s3 w6 H; \, Z- s; z, j
  652. cmd_exit:0 C4 Y9 W0 G( t  F0 |
  653.         ret
    # h8 x7 k( Q, e/ ~; ~0 t! _

  654. 9 X; _3 M. L' I" `6 d0 C  h
  655. new_33:5 t9 Y$ m9 M0 [1 p8 ~* \
  656.         cli2 X: g2 F8 \  s
  657.         cmp     al,0
    $ x2 U6 _$ j8 G
  658.         je      reset_mouse* K/ z: x6 D+ q  W5 F: O' p, U1 ^
  659.         cmp     al,1) b- X; c# C2 M$ P4 y- A1 t% b
  660.         je      show_mouse/ A$ ]0 Q% q- }! }: Z( |+ D7 J2 _. |
  661.         cmp     al,2+ ?* h& d, p' A$ D+ @
  662.         je      hide_mouse
    7 T, q4 G/ ~3 {
  663.         cmp     al,3
    ) f! R4 S1 C; H  l( w3 h% n
  664.         je      get_pos
    9 S) J1 \, {! Z! S# w# L1 q
  665.         cmp     al,4) _# W# T5 k# q$ y8 y* o3 U: U# }( i
  666.         je      set_pos3 M6 x0 U% @, _! t# D, g  G
  667.         cmp     al,7
      x6 c# K7 b- a9 ?8 @. W
  668.         je      set_hor_pos
    4 t3 `6 i% Z7 c+ ]* ]
  669.         cmp     al,8
    " w' x. T, o0 |6 g! V
  670.         je      set_ver_pos5 T+ a+ W9 [# n3 M6 n
  671.         cmp     al,0bh7 V4 E6 x. b* |4 s! l/ F
  672.         je      get_mouse_movement
    9 u9 k$ y9 {  Z" M* m; b3 Y
  673.         cmp     al,0ch
    & [# [' Q9 Q1 d; t. Z+ O8 e( ]
  674.         je      set_subroutines
    3 b! |' A0 }6 ~: i
  675.         cmp     al,14h  M8 R6 i: g4 B- f5 U/ Z5 W! Z
  676.         je      swap_subroutines1 b$ i, B! i* \' Y6 K
  677.         iret: d" u  Z7 ?) z5 h  @# h; x1 m
  678. + j! [4 p' G& E  X6 k
  679. reset_mouse:
    9 p" M& |, B8 H( ^6 e7 [6 y) s
  680.         jmp     _reset_mouse
    1 S- q9 V6 ]4 R
  681. show_mouse:
    / b6 A8 h, X" ?
  682.         jmp     _show_mouse" e0 U% S% g, R" h& @( v0 @
  683. hide_mouse:
    3 i; N: @  _( f2 U6 G
  684.         jmp     _hide_mouse
    - o& }$ b) U" [; a' I3 F$ m+ o. \
  685. get_pos:
    & n) G% N- K) H( [4 A
  686.         jmp     _get_pos/ v  [0 ^# ?6 Y
  687. set_pos:) t3 R& o  w$ {- i% s
  688.         jmp     _set_pos
    ' k% O4 Y. r3 B5 R  K
  689. set_hor_pos:
    , M9 z& E" S& ]- v$ @' L0 F& b
  690.         jmp     _set_hor_pos
    5 {" _0 v4 q4 a9 g
  691. set_ver_pos:/ i  _$ u2 e+ R0 @2 u+ M
  692.         jmp     _set_ver_pos
    1 ]7 i# g8 f4 k2 G% h$ {
  693. get_mouse_movement:
    , I! o1 o+ u7 P
  694.         jmp     _get_mouse_movement
    0 b# _: d7 I5 D8 T5 W7 h" e
  695. set_subroutines:
    % d4 b% Y6 T3 {; I/ V+ ?
  696.         jmp     _set_subroutines! L! T3 Q( e2 |7 {& v# e
  697. swap_subroutines:9 F2 J+ d9 [: w. K3 s( B* C' r
  698.         jmp     _swap_subroutines
    + f( q0 C( \- ~$ w2 G1 V  E
  699. 1 ^5 [8 t2 ~/ g1 i8 T0 `' [) T* `
  700. _reset_mouse:0 A2 G, w9 R- l4 E; x% A! E
  701.         mov     byte ptr cs:[buttons],0& W+ d) Y0 F2 x8 M; a
  702.         mov     word ptr cs:[pos_x],0. Z/ D1 F6 {0 r( C7 E: u
  703.         mov     word ptr cs:[pos_y],02 i( s* L, B  H& @
  704.         mov     word ptr cs:[x_move],0; p- o8 Q6 w6 x2 ?" i% p3 v
  705.         mov     word ptr cs:[y_move],0
    4 C: t3 R5 g) |+ C# C1 V7 @
  706.         mov     word ptr cs:[x_max],639
    5 i, B) f# Z" r. s! S
  707.         mov     word ptr cs:[x_min],04 }: r% n5 i, H! V1 x" }7 w6 L$ L
  708.         mov     word ptr cs:[y_max],199
    & p: B3 M2 R" I& P
  709.         mov     word ptr cs:[y_min],0
    7 x* I$ L& J! x( b7 L9 K. ]
  710.         mov     word ptr cs:[user_mask],0
    ! u8 Z* b& A9 g% q& E1 f: {! k1 n! V. P
  711.         mov     word ptr cs:[user_subroutine],0, Y1 @; K3 b" D* t5 B) v
  712.         mov     word ptr cs:[user_subroutine+2],0- T: S; v& O8 P/ j5 f
  713.         mov     ax,0ffffh
    % ]7 u/ _! Y! [
  714.         mov     bx,3
    7 h3 s& T$ \% c+ @# P* }- D  l
  715.         iret" L7 C- |2 T; L  O4 L" i( m. X

  716. # |! X- G3 J! a4 ?( X) |
  717. _get_pos:
      T: ]1 K2 b. W% l3 h# Q9 N. G
  718.         mov     cx,cs:[pos_x]
    ' _, X# ]; f) h; T$ w
  719.         mov     dx,cs:[pos_y]) w) l* u1 X0 ?+ r& g* r
  720.         mov     bx,word ptr cs:[buttons]
    8 x9 V0 W! d- a! b5 n+ U& X2 X
  721.         xor     bh,bh
    0 `) H- G4 j& B
  722.         iret5 N& w! K' }7 V) Y
  723. 6 v; w# Q# z4 o# g
  724. _get_mouse_movement:
    4 _, ^/ a: b; j3 B+ H
  725.         mov     cx,cs:[x_move]0 [% i; h3 D# {1 H5 r9 B
  726.         mov     dx,cs:[y_move]; J% F( N  u( {, u3 c5 R) h
  727.         mov     word ptr cs:[x_move],0
    7 h6 a5 E3 Y" U# c
  728.         mov     word ptr cs:[y_move],0
    1 k% t" h5 {2 _  ^
  729.         iret
    : A" K% h; H0 ?, n9 l

  730. 7 }' P) ]# I( ?, f* w7 B) C
  731. _show_mouse:
    5 O( a6 }4 p5 M7 q; F" k6 u
  732.         push    ax
    . V! i. J5 z3 ?( J. P5 B$ u
  733.         push    bx
    6 }7 f4 d& T9 j# \
  734.         push    di) h9 F8 O% v: V6 k! ~* q9 O( {
  735.         push    es
    ; Z: c1 H+ [! W3 f( w" E
  736.         mov     byte ptr cs:[sm_flag],1" h3 d8 y0 v0 t% [
  737.         mov     ax,cs:[pos_y]5 K$ ]! O  u  o7 L& [+ E4 {  J
  738.         shr     ax,3/ L% b$ A, y0 e' L$ }7 M' l# {0 A' C# ?
  739.         mov     bl,80
      d9 k( u1 w" Y% }% t' E, ~
  740.         mul     bl6 u! p; }/ V' L7 M  j
  741.         mov     bx,[pos_x]1 R2 d8 ]8 l4 E; L+ S+ a" {3 O
  742.         shr     bx,3
    , i; T( e$ h9 ~5 j0 ~- Y
  743.         add     ax,bx" p  A: w0 Z3 Z  ~
  744.         shl     ax,1$ f4 x& a, ]% o& H4 c  m3 H
  745.         mov     di,ax
    # r0 f2 G# K  K& S7 y
  746.         mov     ax,0b800h  H4 _' j- k6 F
  747.         mov     es,ax
    0 E$ b+ v. f- V
  748.         mov     ax,es:[di]3 A% @% u8 E% R7 n  [1 T- n
  749.         mov     cs:[save_char],ax9 C1 R* z' x! Y/ f' k  O# a
  750.         not     ah- {+ ^8 Q1 s% O7 p5 I# q* c: h' h
  751.         and     ah,7fh1 s' v2 ?& S( `- n- @% Q
  752.         mov     es:[di],ax3 a6 d* E3 p  F9 k; i7 q. ?
  753.         pop     es
    1 q& ^6 W' ~; {1 P3 l7 p* u
  754.         pop     di
    ) _* G: a3 Z9 `% ?, E5 ^# W2 c! U
  755.         pop     bx
    ) _! w# ]5 w8 b' ?/ m0 M; s9 H& X' M
  756.         pop     ax. x6 c9 s( H" ?9 h. ~$ F
  757.         iret4 w6 c2 n* ?$ n5 C

  758. ' L5 @0 o  x! w' V+ Z( b2 X
  759. _hide_mouse:6 z- ?; v$ O& K( I; C' D5 v& Z* Q
  760.         push    ax
    0 ~. b! V" |/ b
  761.         push    bx
    0 ~: I  |5 ~) U
  762.         push    di  _# B6 i0 e  \; z
  763.         push    es
    / h8 F- G1 _+ x1 ?! D* m
  764.         mov     byte ptr cs:[sm_flag],0
    ) Y) B7 x! E# \1 x8 ?+ M2 N
  765.         mov     ax,cs:[pos_y]' C6 U' A: I2 _( P! M( D
  766.         shr     ax,38 T% q: _8 R) m/ c7 T
  767.         mov     bl,80
    . v3 S) n; l4 }1 M- f0 ~
  768.         mul     bl
    9 T1 p% M  r. u4 }) y
  769.         mov     bx,[pos_x]6 ]! x6 O  o( P
  770.         shr     bx,3
    2 P) c. g! s3 U1 ~* V
  771.         add     ax,bx; p- p% x" Q, K& v6 C) e9 F9 m
  772.         shl     ax,16 ^% l: C3 Z. G4 A% @  @6 K6 h
  773.         mov     di,ax; _! G: c( `' y/ Z, f- ^* Y: p) }! Z
  774.         mov     ax,0b800h
    4 A; g2 P4 a) N
  775.         mov     es,ax7 x0 q9 l* H" Z# b
  776.         mov     ax,cs:[save_char]  f/ n/ {  d$ W" S; K) r
  777.         mov     es:[di],ax
    8 a5 ]$ ~; f  Y  R  l- D& t5 i
  778.         pop     es
    4 }! ^8 w3 j. t. v  B, N: p; }+ J
  779.         pop     di$ T9 j. Q" Y  s, P+ r( X
  780.         pop     bx7 E; J( Y# c# O6 C  A( g
  781.         pop     ax
    % ?- {- B; j4 u, }3 R
  782.         iret
    ; i! _% C2 x  {
  783. , \0 N. \+ \3 ~7 Q( O
  784. _set_pos:, H! i6 {& T& S3 K: j
  785.         mov     cx,cs:[pos_x]: y) D" `! x9 u, p9 T5 h
  786.         mov     dx,cs:[pos_y]
    ; h  O& v+ w: g' G& \- X' w$ V
  787.         mov     word ptr cs:[x_move],0
    ' {" H# w" h, _* l4 C3 r
  788.         mov     word ptr cs:[y_move],0
    2 ]* C: ~( P. S  D$ R+ u7 |2 i( {5 l
  789.         iret
    1 j- b3 g' k( p, N9 G" ?) `

  790.   z# Q* E1 C' V# K
  791. _set_hor_pos:
    + R! b5 V5 |! y. s5 \$ _, z+ ^
  792.         call    max_min. C6 D* w& h# H* B% P6 t6 g1 F7 O' ?& i
  793.         mov     cs:[x_min],cx. w7 M9 d' O6 G" |
  794.         mov     cs:[x_max],dx/ {( F1 m( r5 K$ Y/ F+ l1 v
  795.         cmp     cs:[pos_x],cx6 n" o) V6 q- L
  796.         jge     good_hor_min
    4 s7 j4 n7 w, t8 f, ?# ?
  797.         mov     cs:[pos_x],cx
    ! I& }, R/ A2 j8 ?- G- c
  798. good_hor_min:
    1 m& g% I6 `) B) Z+ ~
  799.         cmp     cs:[pos_x],dx% K+ [: g! u' B
  800.         jle     good_hor_max7 g! ?2 Q4 r; `& n. R( e
  801.         mov     cs:[pos_x],dx
    " A: V( @. T% M6 Z4 X
  802. good_hor_max:. }2 y4 _0 x! n4 ?& W5 ?
  803.        iret
    - v& x5 \. F! U$ d# x

  804. 5 {: F! `! I; t  k7 u7 x
  805. _set_ver_pos:
    % S7 s+ r+ S" x1 Q
  806.         call    max_min
    # e2 g2 e9 u, r( G
  807.         mov     cs:[y_min],cx* Q" x$ I! e& }' l' L3 Y/ G: x
  808.         mov     cs:[y_max],dx2 E% i* N7 o3 s/ R- p: l  B& H5 Y
  809.         cmp     cs:[pos_y],cx$ o4 D% O1 u# J7 g2 t# k
  810.         jge     good_ver_min
    , b% @) ?( H; ~6 }8 ~
  811.         mov     cs:[pos_y],cx
    6 E2 f" G# q8 \+ O. z0 I# z
  812. good_ver_min:
    ) U& H- `8 I# W2 Q+ [
  813.         cmp     cs:[pos_y],dx
    6 S. l9 G* m% c& P/ u9 W7 K
  814.         jle     good_ver_max# Y( e' n: b9 @) @0 N) }
  815.         mov     cs:[pos_y],dx
      l3 \' t. G" w% m6 B5 n. a* T
  816. good_ver_max:+ E$ P, J- @/ K8 s
  817.         iret8 {7 u1 l* X2 m: `  R$ a% H. _+ s/ D, d

  818. 2 S8 n/ Z; ~0 ]$ U
  819. max_min:- `6 ^2 Q9 S) i! ^8 M2 [$ e- Q
  820.         cmp     cx,dx: I( S  b. D) J
  821.         jle     no_swap
    % O2 B4 a$ s9 \# P" p' c6 P
  822.         xchg    cx,dx
    ) X9 P0 l; i% Y  ]) B* p; {) J
  823. no_swap:
    - n8 j  l# N' J' M# r
  824.         ret
    ; ~6 U4 J6 f% g
  825. 2 k2 s# P+ y2 P. `
  826. _set_subroutines:: v# c8 H' M8 u4 w/ D9 }/ L1 K
  827.         mov     cs:[user_subroutine],dx
    ! [& j8 o/ u+ T2 m! N9 b% F4 I
  828.         mov     cs:[user_subroutine+2],es
    3 F4 O- @+ M9 P8 S
  829.         mov     cs:[user_mask],cx
    + G" ?7 M( @/ w, [
  830.         iret
    + F0 j5 F' L# @5 L/ u
  831. 2 P! y, B1 t6 v! [. D
  832. _swap_subroutines:
    & W8 d* k7 E2 c8 C7 u2 _
  833.         push    word ptr cs:[user_mask]
    - B" z! r0 Y" Z; m0 Q# c" P* p/ \% R
  834.         push    word ptr cs:[user_subroutine+2]& @( x4 @1 C1 k; o' x
  835.         push    word ptr cs:[user_subroutine]) n, h/ [4 t, F( k2 A' r. k
  836.         mov     cs:[user_subroutine],dx' [' i( `/ L( j, @# P! p% c$ d
  837.         mov     cs:[user_subroutine+2],es
    6 ]& P. G3 ^; V1 {3 o1 G
  838.         mov     cs:[user_mask],cx
    2 J2 z2 N3 _" d( }) q; z: {3 U! |
  839.         pop     dx
    . G" s1 M) Q* ^% i0 E; @( N# k
  840.         pop     es" i6 @' _8 D- b' |2 }5 u
  841.         pop     cx( y2 T/ a: r3 Y# e* Y' p1 F" f
  842.         iret
    ! a" r1 i. [# Q6 s5 H

  843. ( F! h% |4 a8 y5 s- z7 H) t
  844. memmouse        endp, Z7 w$ j' h1 }- u
  845. 6 r2 P, S% F: ?- B! n3 y# p
  846. endof_start:. E% H& f. R  i$ m" z

  847. % ^2 J  q' C) `, z3 K, s
  848. emsg db 'No mouse driver install error!$': `/ N/ v4 y& m3 S# |8 ^$ g9 r7 l
  849. old331 dw 0
    & y7 V/ p: Y7 B0 b, n3 q
  850. old332 dw 0
    # C+ Z! h2 l0 r/ w" Y3 h' B
  851. old741 dw 0: d7 d7 `! S6 E/ o+ O
  852. old742 dw 01 [: I3 A6 Y9 i& \9 N& G
  853. memcopy db 00 c: v$ D5 o, Y4 _/ D3 M
  854. okcheck db 0
    ; Y+ p* c( V( @! s
  855. pass db 0( w2 r  j% @& U# F2 h- q% F" ~
  856. chkl db 0' E; d) o2 S$ U1 M% Y
  857. lk db 09 o& o- k4 d+ E; k; _4 m$ @
  858. chkr db 0
    1 ^# ~) r$ e- N! I! `1 N
  859. rk db 0
    + F# k# |5 }1 v0 l$ F
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '9 `! ]7 J$ D# W3 k! F4 ~) l
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '! p( j5 a: b* [1 J. L, m
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '( M% j2 |% Q: q* }- t
  863. db '                                                                                '
    - X0 C) h/ i* R' s
  864. db '                                赏屯屯簧屯屯突                                  ': _8 ]( A- N* K* L/ \7 B
  865.         db      '                                ?OFF汉OFF?                                 '- E4 K8 M- i' i3 f6 `( A
  866. db      '                                韧屯屯既屯屯图                                  '
    6 J4 e( U+ b5 }. S& i( }! E3 _
  867. db '                                                                                '; [) P/ ^# [) {6 _
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '7 ~0 X8 Q7 l. m9 _) D# y
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' $ W5 k% U) H" F; u  N2 F5 l
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    * j# c7 J- n: v6 _# ~  }% t
  871. 3 ]$ B; b/ ]7 r# ?5 v3 M
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
: T! z3 V  U, D5 E( P# A哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
, X( f4 }% ]6 W$ n. g! U
( X5 i9 S4 B- ?# U* ]+ O谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-4 00:24 , Processed in 0.192562 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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