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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。4 C4 Y+ r! _6 l& V9 J5 r
/ F) ^) G" l2 O
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    , t# [2 ]2 w3 E4 o7 o& O$ `
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9% d7 m! C1 c; A6 m# v1 d/ ^9 [
  3. ;                                         By Bini.Yi 易祝兵
    * W4 A: t' H# O% ^
  4. ;                                         http://www.ufoit.com 计匠网
    ' b0 ~/ Z7 L' M  l7 a9 R
  5. ;                                         2002/04/06 YYYY/MM/DD7 l) c! J+ m2 z& U+ a. Z5 D- q
  6. ;: c( n6 Z$ F1 ]6 d/ d$ G4 D
  7. ;         
    3 {) E( C' U  a' T% x9 f; Q# j
  8. ;          This program  test the mouse button  click and move.
    ! r/ Y( V6 @3 _8 f1 o! o0 G% h
  9. ;8 _. i/ _7 @1 j- g1 M/ P& ?
  10. % \$ u% y2 v0 t) k. L5 k  a! a) d
  11. .model tiny' M( x: g$ y* S
  12. .5865 ]2 f* M6 L3 Z" T1 I" N3 w1 G
  13. .code
    " s) O- T7 ]4 O, Q) o
  14. .stack  100h
    ' t6 J: _* F2 u# {: j7 F$ ^
  15. .startup$ Q  d9 @# h* h
  16. pusha# |. k1 W: X" V, B' n) H, d, f
  17. mov ax, 3533h
    3 ^! U+ a/ Y/ B; \! F
  18. int 21h
    * b# E% c  ^, o4 S3 \$ n. C9 G2 ?
  19. mov word ptr cs:[old331],es  @/ v9 `6 |' \( h
  20. mov word ptr cs:[old332],bx* h& k6 ~; L5 _
  21. mov ax, 3574h
    . s. u! \. o0 ]! z
  22. int 21h0 j0 r# G  d8 {+ t% X
  23. mov word ptr cs:[old741],es
    - K, \6 s7 n3 b2 v" i* `" ]% R3 Y
  24. mov word ptr cs:[old742],bx" m2 Y# R0 c" e" J0 O( n+ j
  25. popa
    ! o" N4 B) m& p$ r
  26.         call    memmouse
    3 x; j5 \4 N3 ^6 L1 v. e
  27.         mov ah, 00
    ! a+ P# u% J7 o* N( ]! p
  28. mov al, 03+ p4 K  m2 d, O+ w
  29. int 10h
    ) \2 A3 {+ Y! y+ [( X" h/ e
  30. mov ah, 06" r( W4 D+ T% g5 l: j0 B9 O' X
  31. mov al, 0
    # F$ G4 {; E* K
  32. mov cx, 0
    % `' \8 |1 i  z, j  H  C* ?& g
  33. mov dh, 24+ F2 a& ^& q. ^8 s
  34. mov dl, 79# o+ a+ t( o+ j
  35. mov bh, 07h" ~2 f; a  F) r2 y
  36. int 10h
    0 [! O4 F+ ~7 P1 h
  37. mov ax, 0000
    & `; P. d$ S* `" e2 f' O
  38. mov bx, 0002
    ! }+ a/ w8 S/ x: ?
  39. int 33h
    : ^; m/ q* ]  U6 _3 v( i8 S
  40.         cmp     ax, 0000           ;if no mouse drive install" _; @, p4 c; i( S8 N
  41.         je      errormsg           ;show error MSG5 t( m1 n3 w7 H# \0 ]
  42. mov ah, 02
      ~5 E" d' M, S0 G' c
  43. mov bh, 00$ W+ I5 h& T4 _# E% N
  44.         mov     dh, 25             ;Move point out screen( |% I: \( q8 d1 M+ w
  45. mov dl, 79
    % m" H4 W; V( z
  46. int 10h
    ' R( ~# U" |$ {  i
  47.         call    showmsg            ;Show info
    : d% |. x2 V$ H' o4 g" A
  48. mov ax, 00015 c2 `2 {2 B& U/ N; {9 ^3 p
  49. int 33h4 t7 }/ A6 p) b3 W- T) o! i
  50. ; mov ax, 000ah
    * C5 L5 X2 P" a( @# y, F0 V8 U
  51. ; mov bx, 00006 [1 Y0 i1 u& a+ F" K2 s& U3 H
  52. ; mov cl, 0h% ]5 O5 ]. k) W9 _) T
  53. ; mov ch, 0F0h
    9 |( h# W# \! o2 b' a( B: s
  54. ; mov dl, 0h
    4 {+ e  E& c6 b& e
  55. ; mov dh, 0F0h7 a+ V6 Z  \  X/ r+ l* k
  56. ; int 33h' @( f! q6 S: a( x( ~2 X* [
  57. mov ax, 0004h( A5 h. j. K) B/ Z, L: J# c8 c' W8 i
  58. mov cx, 0319
    : r: u8 Y4 a; F  J# u; _  U
  59. mov dx, 0103
      m$ Y. c9 a, z( v
  60. int 33h% G7 y; b2 t) x& y, R
  61. casemo:                           ;Case button click and point move ) G1 Y6 z- V- ^+ ~' W% T- s6 Q
  62.         mov     ax, 000bh         ;and keyboard press1 b1 b& d0 {* B( `* M
  63. int 33h! Q: E4 V  O# ~& C
  64.         cmp     cx, 00h           ;if point move....X
    " f" ~$ T1 M* K. i- e
  65. jne xmov7 t5 k1 G9 V( S. I) {8 ^1 P
  66.         cmp     dx, 00h           ;if point move....Y! p8 q  y7 R9 M& }
  67. jne ymov
    , b- e  T2 B4 |4 R4 h& _0 l4 a
  68. xymovend:                         ;X.Y move end
    3 D3 V2 d& K2 f8 }  \* J
  69.         mov     ax, 0003          $ X5 |5 z: D- u1 z
  70. int 33h
    # e0 ^/ x, S- D: j
  71.         cmp     bx, 0001          ;if left button click  show ON1 H* r& r, E8 T- T
  72. mov si, 1828
      A/ J* g( |% e, e! i8 ~
  73. je listl% K* N+ K7 s- Z5 l. Z6 F. X
  74. mov si, 1828
    2 @. @8 o2 M" j# }9 J7 x" j7 J
  75.         jne     nlistl            ;if left no click show OFF
    " A% W2 q( x  {2 Y5 Z, G
  76. testr:0 }5 i6 I: I' ~+ q; |+ ]
  77.         cmp     bx, 0002          ;if right button click show ON
    / n( {1 m: l5 b4 ]. [
  78. mov si,1842
    & p. Y' o4 e5 K7 i. p( }
  79. je listr
    3 t. o0 P7 E, `3 K
  80.         mov     si,1842           ;if right no click show OFF0 P' Y  Q8 z0 t- L$ T, Q; K6 ~( Q& Z
  81. jne nlistl8 U: f- m0 W1 R, z' `
  82. casekey:. z0 K/ f6 A- J/ K5 w+ [
  83.         mov     ah, 01            ;if any key press jump check
    . ]5 v, s( s( v# O! C
  84. int 16h4 w4 Q0 M, t' d1 F0 {
  85. jne kpress4 S9 i. U3 E+ w, c6 X
  86.         mov     al, [chkl]        ;check x flag
    + I+ }( p) H% e
  87. cmp al, 02h
    9 r3 d' J( [9 {& G/ i
  88. jnb chkok
    - h6 A4 O+ U  N7 L, F
  89. jmp casemo
    ' O- ~# B! F% ~4 R  `$ O" M
  90. xmov:                             ;if X moved, get the X flag+1* l" k3 w7 E# s- A( o- v  v8 u
  91. mov al, [chkl]+ w4 x9 O7 N$ P( G  y+ K
  92. inc al% F, K7 h0 }+ _& V7 r! I* a- y
  93. mov [chkl], al
    + V6 c+ x3 T0 v
  94. call passok
    ; M8 g  I. ^$ r$ {3 z1 A/ v, W5 @
  95. jmp xymovend8 u* z4 x  W4 S3 }
  96. ymov:                             ;if Y moved, get the X flag+17 a) z0 D; S5 I, L: Z! x/ N3 }* p
  97. mov al, [chkr]
    4 o6 j! W; Y- s
  98. inc al7 q8 i8 X% f+ H' j8 v
  99. mov [chkr], al
    . h; {5 s1 v: w8 J. K+ r
  100. call passok
    & W6 E# Q  i! ?& x
  101. jmp xymovend8 m. [$ @3 P2 J- j( N# J( ]( a/ H' r
  102. 4 Z+ |! E: i/ S. c$ e6 M
  103. passok proc near$ I; d+ p  q2 l4 F1 ^$ o" {
  104. mov al, [okcheck]7 H  F. T( R3 e8 e* ^/ R# u$ A
  105. cmp al, 1
    / p+ D$ H4 F) d: p' K" V# Z: I4 E
  106. je let0
    ( z9 T  V2 ~, k+ K
  107. jmp passret% T) `( c6 Q, a2 T
  108. let0: : u7 `/ s! b. W8 M; X1 {' c
  109. mov [pass], 1
    6 {( K8 l, w& C' c
  110. passret:
    * l& N3 M! E7 x/ I8 D- C5 X0 y
  111. ret4 M. Y2 S" {( L
  112. passok endp ' }% v1 o+ D1 a

  113. 6 h. B' B2 S' v! q, _, y4 x/ I9 g
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    % @# g6 U# e7 O
  115. mov al, [chkr]
    " _7 A4 m5 ]* N& m6 H0 e
  116. cmp al, 02h; b! I- X, M% j. @+ p6 y# e) W
  117. jb casemo
    7 F6 i/ @  C% t  j  r6 F
  118. mov al, [lk]
    : k, B) D, P! [2 H; m2 M
  119. cmp al, 11 j- C8 W6 Y) I* U6 r
  120. jne casemo
    , }2 N; _/ h# G* V
  121. mov al, [rk]" a" Z4 ^! |7 i' Y6 S, p) q+ a7 Q4 E3 p
  122. cmp al, 1
    ) G5 u4 e, s! n: R
  123. jne  casemo
    ( r7 t: f/ I- O' O6 p
  124. mov [okcheck], 16 }7 {( H+ |5 F
  125. mov al, [pass]
    - H" J: d! w8 u0 d6 Q3 y' y! @* G
  126. cmp al, 1
    ; W* f. Y, z! W' {/ ?' m
  127. jne  casemo
    ) l0 }1 F" F) ]' L
  128. mov ax,0002h" `+ X" K1 ]9 a+ b& ~0 {
  129. int 33h
    1 U6 A7 o4 q- W) s. M+ W, d/ m$ {" g
  130. call cleascr
    4 E: X4 y" s0 @
  131. 9 V. x* _: s8 m4 f9 M1 ?
  132. call oldint0 s' o% y; z9 r8 @- Q0 J! j% n
  133. mov ax, 04c00h
    : w: v& M/ ^. r
  134. int 21h
    / U0 d9 ?* }! J
  135. 1 E" y/ R5 \+ f$ Y3 h5 F( V( v0 o
  136. okexit:
    1 I* @% f0 m# T3 G- K$ g
  137. mov ah, 4ch
    # o3 o! f" [* G. N# U4 |  ]9 r
  138. mov al, 0
    " c* F( P) ~# P& v" N
  139. int 21h( K# L3 p" O/ k3 r) s: h9 D
  140. listl:                                 ;Show ON
    $ t+ h% V2 X8 L
  141. pusha$ ~, F+ N0 N8 O4 U6 T9 E' k
  142. mov ax, 0b800h* y6 @5 i5 A2 t2 E5 s9 p
  143. mov  es, ax
    9 L' v0 }: {! w
  144. mov ah, 47h' Z# F8 }* \& c
  145. mov al, 20h/ y& Y! `/ m7 F) X; I
  146. mov es:[si], ax
    3 R9 l2 k' z( I% ~
  147. add si, 02* z$ _% k' @. ?* T, j' y
  148. mov  al, 4fh5 a  g/ s$ o) V# D. M
  149. mov es:[si], ax9 x+ b  {; \0 Q# s
  150. mov al, 4eh
    , w4 W' Q5 v) G& P  i7 W% \* g
  151. add si, 02
    2 `; I9 u# n5 K7 C! c  v/ L& o
  152. mov es:[si], ax! G- J" l" a* [/ m# q+ Z. N4 v' y
  153. mov [lk], 1
    % w9 ]% g; P4 g, U8 F
  154. popa# b- Z9 l! @/ H; s: e. s+ n+ C
  155. jmp testr; l# X+ U2 D! F6 A  k% P
  156. listr:                                 ;Show ON
    ! p  U: X/ w1 l2 x
  157. pusha
    6 q& K7 V( z+ a3 |0 V: W( H
  158. mov ax, 0b800h4 ~! ?/ ]) w7 e4 _. e
  159. mov  es, ax
    ) e: _5 j8 {1 e8 J% c
  160. mov ah, 47h
    ) {; J! s2 L) N; ^; |- x
  161. mov al, 20h9 o# W7 T" f* p8 p, @
  162. mov es:[si], ax9 E% n  o2 {) i3 @$ g
  163. add si, 02
    7 E% M1 L  _. u' R3 H+ W4 a8 ^
  164. mov  al, 4fh  |9 Y8 z; X4 r: v, W4 w2 B' ^9 H
  165. mov es:[si], ax
    7 |4 Q1 V: l% b) l1 m5 B' I5 H
  166. mov al, 4eh
    / N, d) j% ~- O5 t, Z
  167. add si, 02
    ' \, o4 e( y, L% b# g+ l; W
  168. mov es:[si], ax- e  S: S+ Z& G0 _- n4 N% B' G
  169. mov [rk], 19 G& {$ q4 Y( ^6 Y3 e) d1 T: g8 A
  170. popa
    ; L4 |; X$ r: k5 c9 E  K) }0 I2 y
  171. jmp  casekey: c4 n; y+ H% @$ n
  172. " N, p$ }8 C& p4 R. Z4 V
  173. nlistl:                              ;Show OFF' P7 j9 d  @* A. m
  174. pusha   
    6 o% g- e0 E! a+ [7 j
  175. mov ax, 0b800h
    9 l- V7 q: [/ ^  I4 e5 P" N& C. n
  176. mov  es, ax
    & w2 f: C* X  j* @" Y3 F
  177. mov ah, 17h  _( W) y) O+ j' w7 y& V
  178. mov al, 4fh# @7 Q. G$ B) A2 h/ N6 p: Y
  179. mov es:[si], ax
    8 y. N' V; J9 g5 T0 `; a
  180. add si, 02
    " `& I% u3 T/ B2 i
  181. mov  al, 46h! c" j5 l: ?( X) G$ C- C. |. r
  182. mov es:[si], ax# o( H# n% W9 }! E
  183. mov al, 46h- `$ H# O$ z" O4 `5 H" {1 @
  184. add si, 02# w# p8 Q% y3 D
  185. mov es:[si], ax
    ) \; |% z' {+ w: j
  186. popa
    0 t8 m( X* A" ^  N2 G
  187. cmp si, 1840
    * U7 n# `- t1 v" B- m$ R( C  E
  188. jae casekey
    3 Z) G/ y5 \9 V: e; g4 |7 e
  189. jmp testr7 _& r7 S/ H0 A. m* H
  190. ( U) u* {' y8 H0 E% t4 H
  191. kpress:                             ;Check key press if press<ESC> then EXIT- m8 W; o) W" z* t/ p3 }
  192.         cmp     ah, 01h             ;and return a error
    ' G- y& E! l& [" F2 e$ X
  193. je exit1! }7 g4 n6 O: c. o
  194.         mov     ah, 0ch             ;if press other key then clear
    2 {) {3 ?4 w7 X, X1 d3 P
  195.         mov     al, 00              ;keyboard buffer: `& @8 z: N; f) D4 C* D
  196. int 21h
    $ ]3 I* j1 l3 B  G/ I
  197. jmp casemo
    ( C" |9 y4 K  r1 O) R, Z

  198. " x: h! F+ W4 D. G& t9 o
  199. errormsg:                           ;if mouse driver no install
    2 U- u: K- n$ K
  200. call oldint
    * [0 H( p( P' L$ H4 L" t
  201. lea dx, offset emsg2 D2 n' Q: w  y, \! X$ E
  202. mov ah, 09h" l4 n7 h7 m6 v) @
  203. int 21h
    2 k- H8 S* m& e6 }' i9 Y" M
  204. mov ah, 4ch
    + t% ~7 t9 ]. J% k6 n. t
  205. mov al, 2
    3 h& c& B5 F& y
  206. int  21h
    & w& u5 n/ y$ \' ]
  207. % X5 D; q3 E+ D/ m2 Z* p6 t' [6 q
  208. exit1:                              ;error exit: E, T1 W, _& Q: D2 D$ Y' ^5 Q
  209. mov ax, 0002h
    ) j6 ~2 u, a/ ^: _6 H+ C
  210. int 33h
    ' I* d$ P" h( e* E% l5 [6 m/ }
  211. call  cleascr; r/ b8 e# e5 S# _+ F! S% R
  212. call  oldint. X* |* t2 m1 `1 E
  213. mov ah, 4ch
    & L3 Z) @/ }' {
  214. mov al, 01
    - u# u. [1 n- e1 `: H
  215. int 21h
    7 R: x5 ?/ D/ l* I

  216. 3 ]7 T; k# _" \
  217. cleascr proc    near                ;clear screen
    8 e! C* b, T2 t* w3 T+ v( W
  218. pusha
    - a% Q" u) z; {. L1 F/ x  h+ g
  219. mov ah, 06) e6 y) j1 s3 O0 Q4 i6 y
  220. mov al, 0
    ' J: V+ E! Y2 s! o8 n7 f) G- [5 K. V
  221. mov cx, 0: l/ A, b2 }* q1 a. K
  222. mov dh, 24
    ! X$ r% R2 B2 F
  223. mov dl, 79& R+ ~2 {3 ?. t' P) m$ c* s( B& D3 B+ |2 l
  224. mov bh, 07h% E0 ~% }  p1 o8 \0 S6 H
  225. int 10h
    : s# s: M/ }/ S& z6 f* d3 h
  226. mov ah, 02
    5 v. {! S" d2 D9 A2 A
  227. mov bh, 00& L& Z2 {8 Q' Q
  228. mov dh, 0
    8 l% C: {# Y  g$ S8 v: F6 f1 _$ l4 `
  229. mov dl, 0* V3 y) f$ X$ d+ d. p
  230. int 10h5 \# q3 S" f: u" F/ ]  F  f
  231. popa
    ; C$ {! u+ H0 m9 q' e
  232. ret0 }$ b- B2 D; J( i
  233. cleascr endp& m' D: \4 s# t
  234. ( L# t  F) y1 I  K0 Y6 w: K
  235. showmsg proc    near               ;Show info
      q5 D( W: E! L% @( Y
  236. pusha
      p7 R3 X( k, V
  237. lea di, offset showms# q7 P( ~6 {$ j* n
  238. mov ax, 0b800h( G6 h8 h6 e5 j6 H  k) Y  ?
  239. mov es, ax" b. P2 `' |/ _' V% p* S, K
  240. mov si, 09 I: u9 r  R- n& F. A( Q& g3 }
  241. mov cx, 480- e" H, r& A& Y) |# U3 V7 b1 Z5 I
  242. mov ah, 07h) _+ D# ]( |& W  V2 v
  243. @@:
    & O: G  Y% @1 n
  244. mov al, 20h
    5 g: I! N- N+ T0 D# |7 Z9 k7 }
  245. mov es:[si], ax  _8 W2 s) J0 p, f2 P/ }* r0 p; Z$ }! m
  246. add si, 2
    7 k2 b, v% l$ f& M5 Z% R% u9 S8 C
  247. loop @b
    + y4 L% d; F2 W+ a) E$ k  {
  248. mov cx,880
    : c4 O0 ^3 ~- ?$ v1 {% v
  249. @@:, l7 ?* L8 n+ j* Q- a
  250. mov al, [di]
    ; X: L. ^4 l% f4 m4 }
  251. inc di
    & t- Q; {. o7 B  i3 l
  252. cmp al,20h
    9 x2 g$ b  {+ H+ r5 e9 i, f
  253. je showch1% u: _: j# r5 A' j: U. r: F6 d
  254. mov ah, 17h
    ; l/ Y% b9 ^( S5 @  @
  255. jmp showch3
    2 f2 `  m$ g3 _/ c8 A, [
  256. showch1:3 k: e+ Y: C. h  `- V/ x9 f
  257. mov ah, 07h   P5 m5 i; a. H9 }+ W* |% a+ O
  258. showch3:% _* K: R: B3 }& e# h$ V/ R5 |+ U
  259. mov es:[si], ax% \# K  p$ R: Y& [
  260. add si, 2
    * h! n9 o, P( S2 ?) }3 w
  261. loop @b0 j1 s, f5 v/ m' m
  262. popa
    8 {, Q' n8 Q( z7 f' n. P: z
  263. ret
    . t. l/ i7 K; f
  264. showmsg endp
    6 a6 v- w" j7 R3 n
  265. ( m! a8 W% M' D. v- f# Z
  266. oldint proc
      N* i$ G9 T0 m9 {9 h
  267. pusha
      j- l" L/ W; e( _4 ]7 D
  268. mov ds, word ptr cs:[old331]0 ]; x8 q7 Q6 Y7 m1 R
  269. mov   dx, word ptr cs:[old332]
    + _* {- x& _$ p- Q  _/ f3 b
  270. mov ax, 2533h
    6 s$ |2 L" l2 T/ q2 Y+ R
  271. int 21h0 v6 ~2 w, D" m* t5 o6 O
  272. mov ds, word ptr cs:[old741]
      E; S, c9 K2 m% u7 {
  273. mov dx, word ptr cs:[old742]
    ) u0 d6 @! A% J1 G* L9 e+ `8 Q
  274. mov ax, 2574h) U9 n, Z: U; J
  275. int 21h
    ( Z4 u( _. O5 h% k
  276. popa
    : l0 W8 E7 l+ s' a% \+ R9 N
  277. ret
    $ ?8 K! z. P! d( D5 E
  278. oldint endp/ L0 u" m9 x! S: n: _
  279. & n  {/ N4 R  A7 c" }( Z0 y' F
  280. memmouse        proc. \2 T/ c. ~& p  [! I9 t0 Y) e
  281.         xor     ax,ax# x4 o( p  @; x
  282. int 33h
    ! P- j, B: V; v" c7 r
  283. cmp ax,0ffffh
    , s, y5 y6 y  ~! h4 _. l
  284.         jne     not_loaded2 `6 J4 O  M' b) r& h+ F! c
  285. mov [memcopy], 1  @) V; F3 J1 V- q# k8 y' w
  286. ret
    6 p7 w$ V& N$ h' t! ^
  287. ! R1 W9 g+ c% U( a# O+ c& m
  288. not_loaded:& l/ T- G% }, G) G* X2 {/ Z; `/ W

  289. ) [6 e' X0 ^' W3 p& \. r
  290.         mov ax,2574h- Y" G) T7 z7 T
  291.         mov dx,offset new_isr
    # w: D* x, V) Y0 ?1 V: y- D. F8 B
  292.         int 21h
    ( V8 i2 C- m* \/ A; w' {. x- j: O

  293. 0 [; M1 Q! q% P1 j2 V
  294.         mov ax,2533h- X. ~( V* P: S4 w
  295.         mov dx,offset new_33
    ) s. i4 ~* `% I1 y/ w* J% u8 V
  296.         int 21h
    4 D' Y" Y! G! @& d! z

  297. 3 [( S! v; `3 o0 q* _6 W% ]
  298.         cli
    8 d1 k: V7 H6 F7 l# C
  299. $ u% [2 h/ A3 k4 U
  300.         mov bl,0a8h
    " V+ P  c2 u+ O" }) t3 C0 F* ]
  301.         call keyboard_cmd
    0 `7 {) V! t6 M/ g* f
  302. , s3 j- |- K, N! m, Y9 E: u
  303.         mov bl,20h2 i( W+ W6 N& L4 l
  304.         call    keyboard_cmd
    2 U( e/ V) ~: T5 |7 ~) v! Q+ ?( }
  305.         call    keyboard_read
    " S' S7 u- {9 J+ n3 Y) t1 |9 c
  306.         or      al,2" H9 L+ B7 K3 q' h. U) I
  307.         mov     bl,60h
    / k  F' Q2 x: m+ p& [8 D% Q, z9 {
  308.         push    ax
    + U) c9 E8 t: Q- {
  309.         call    keyboard_cmd$ E) ]/ C) u; x4 D* L2 B& J% k. x
  310.         pop     ax
    9 K5 @2 o9 o& H
  311.         call    keyboard_write* w) l- k, Z2 s. r) N' t- B& h

  312. & y0 Z, v3 ]/ J) e' }
  313.         mov     bl,0d4h
    9 h6 w  y; N! \) m
  314.         call    keyboard_cmd7 N/ l. }! ?; \6 x% g6 d& M
  315.         mov     al,0f4h& C& A+ p/ A3 F1 q* y/ I
  316.         call    keyboard_write
    , G1 t7 C3 u3 w! @
  317. + I6 y/ G7 n1 [( q' }7 e
  318.         sti: Q2 ~/ w0 T+ ~; Y9 D& v' M7 L' K
  319.         ret
    ( N9 E/ u) N9 ]; K- J, V
  320. call_user_isr:
    : T3 U9 e& ~# x* }% e$ B
  321. db      60h! i4 {; S0 C6 I% ?: I  F% d. K
  322.         mov     cx,cs:[pos_x]
    6 M  P9 b( [$ b+ N% d0 c
  323.         mov     dx,cs:[pos_y]6 _6 l6 J2 I  Z" j; @+ R) D
  324.         mov     di,0 ;cs:[x_move]8 k' O( v  W) X- F9 F/ d
  325.         mov     si,0 ;cs:[y_move]( C- f3 z4 e3 j1 u
  326.         mov     word ptr cs:[x_move],06 _/ g- g' E0 Y* c' f1 J  ^3 e/ E
  327.         mov     word ptr cs:[y_move],0
    2 y  O, U$ N1 W
  328.         mov     bl,byte ptr cs:[buttons]
    7 s( M" d" i* s  J/ P' q
  329.         xor     bh,bh" l* ^& p, d  b6 V- q. J) P5 D- R
  330.         call    dword ptr cs:[user_subroutine]
    3 V  i/ w! u! B5 m( ]
  331.         db      61h
    ! i$ p1 H6 y: i4 A
  332. ret
    ( g8 K( I- C0 `
  333. new_isr:
    . A) a+ x( ]8 J
  334.         pushf
    : G$ A2 X# S& n
  335.         cli( a, ^1 E0 ~! ~) D4 U; K% w9 u
  336.         push    ax
    # Y1 C3 P0 h/ z5 c3 D* g: a
  337.         push    bx
    / \$ h3 D' O) i% U3 b0 G" A
  338.         push    cx
    * H& z. I1 h5 g3 e* b& E8 T
  339.         push    dx9 U0 o) D$ f  J& J8 x8 r
  340.         push    di0 m! K( s! e( i  L2 ?3 o
  341.         push    si2 [; B2 s3 g& j+ G& d- X9 Z2 e
  342.         push    es
      [/ P- y6 J( ~# _2 T
  343.         push    ds/ A! C, e* y# s; @
  344. ( S# f4 Y" L# X
  345.         push    cs
    + a! N4 o  J: B! r; X- R7 w
  346.         pop     ds& Z5 @" {+ E  C8 ~; g5 \# c

  347. 6 a1 Y- K) D* _, |
  348.         mov     bl,0adh
    2 r! Y% M+ C  P
  349.         call    keyboard_cmd9 t, ]# h8 E0 R" r; s
  350. + I; w, O2 `3 n* Z
  351.         cmp     byte ptr [first_time],0
    & e& e+ X* m( m% A0 g4 m* i& j8 e
  352.         je      not_first_time
    5 o9 y  @/ v6 O' ?' t) Y! c4 K3 m) ]
  353. 7 u6 ~9 i* d5 J$ z# t) ^5 ^+ G) w+ J
  354.         mov     byte ptr [first_time],0
    ! M7 e( p( @1 g" G% W
  355.         call    keyboard_read
    # k* Y- N! L( F
  356.         call    keyboard_read, l8 W/ q, U# p; e% r. v0 x4 U
  357.         call    keyboard_read
    ! L4 f! ^. {; U, J3 _+ e
  358.         jmp     no_show% Y% v3 {2 E& @" X0 |8 }# S% P
  359. - Z0 {6 o  R9 N
  360. not_first_time:% C! V( X( S4 U. t
  361.         mov     word ptr [temp_mask],0
    / W+ q; Q! g# Y; S- B2 p
  362. " S; \  k- f$ T! x) d* D, @0 Z
  363.         mov     cx,[pos_x]( Z: g% X" s9 ?+ U' T% t2 t; f3 J
  364.         mov     dx,[pos_y]
    " K: E, ^0 [2 u# E
  365. 5 n, T  ^- H) r) {9 H$ X
  366.         call    keyboard_read
    3 S% Z: _9 q* y" `
  367.         and     al,7 ;3* G% F9 v7 ^7 J! |) T! ^
  368.         mov     ah,[buttons]
    1 w) Q! v6 I. E  ~: L: K4 I7 `
  369.         mov     [buttons],al
    6 U, N! _9 h* I* b
  370.         cmp     al,ah
    5 R' I' ]+ u; s. `5 n: }
  371.         je      no_button_change
    0 I8 Z! z, ~, c6 |  d  V1 M( u
  372.         and     al,3- F+ r) i1 [( Y1 p7 {4 j6 ?
  373.         and     ah,33 j/ ~7 N9 r! d3 E8 `
  374.         xor     al,ah
    ) {& ^4 p. W. }
  375.         xor     bx,bx- V' B  C. S! r2 n% B

  376. * N/ B+ g) M5 B, K( c; F' L
  377.         push    ax1 m8 f( @  w0 F% h5 \1 o! O
  378.         test    al,2
      G) Q# n9 w2 ^' O7 \
  379.         jz      no_right_button_change
    ; f" P9 f- T: `$ y) e. }& `
  380.         and     ah,2
      d: t2 y1 M3 O* }
  381.         jz      right_button_pressed
    ( a+ u% V4 i  T  q# i) Q
  382.         or      bx,16, \6 e) c+ u. Z# ?
  383.         jmp     no_right_button_change
    ) L, ?8 t# u9 |
  384. right_button_pressed:" C; h& C7 i3 y% A' t/ J
  385.         or      bx,8
    * I' P7 A1 |. L! ^$ j
  386. no_right_button_change:
    . @: Z7 E& d0 {3 V  l/ m
  387. 2 I/ |* W/ ]( @$ v& P1 M
  388.         pop     ax
    0 u2 L* _4 U) l$ q2 \
  389. 0 ^5 d1 K' Y0 I  g
  390.         test    al,13 N! u9 ?" H' o  ]% N
  391.         jz      no_left_button_change
    4 ]4 D- x+ v1 Z" K8 G; X
  392.         and     ah,17 U/ s9 L8 U5 d5 P, w1 `. k% X+ G
  393.         jz      left_button_pressed
    ' P9 @6 {8 J' m
  394.         or      bx,46 @" j! @) E' b: C7 ^
  395.         jmp     no_left_button_change
    ) s4 Z6 _. R" d8 P
  396. left_button_pressed:  l+ e; q4 ]& N- z2 w/ ~
  397.         or      bx,2
    2 l( `" V- A7 K1 h! v& l) G
  398. no_left_button_change:
    6 X; }2 c' c) c9 `- E
  399. " ^2 ~% T8 _! ]" w
  400.         mov     [temp_mask],bx
    ( D, [+ c3 L2 f1 c! i4 d

  401. 5 z6 S* X% p, s# @: R2 |
  402. no_button_change:
      p& m+ _$ ]' c& t, H3 j8 ~/ _
  403.         call    keyboard_read
    . U# U6 ]* g. S
  404.         cbw
    $ C6 E0 c' N# F# N, O2 _" ~* H
  405.         add     [pos_x],ax
    7 q8 q. R8 L* b
  406.         add     [x_move],ax( A; ]: ^  V5 V+ k; ?5 Q
  407.         mov     ax,[x_min]' [3 c: F  Q) `
  408.         cmp     [pos_x],ax
    / Q( B7 L  A. t% A' }) W
  409.         jg      good_hor1
    7 V* }. p9 B, q
  410.         mov     [pos_x],ax* J! `$ }$ i, N; ~; x7 |* Y+ I- y
  411. good_hor1:. @7 L$ r( u+ g6 o1 `* m9 v
  412.         mov     ax,[x_max]
    / _2 Q( Q8 v+ ], n1 }
  413.         cmp     [pos_x],ax/ Z$ {- k" q; D
  414.         jle     good_hor2
    / R; {. u0 w! e
  415.         mov     [pos_x],ax
    - ^0 [0 [7 B' H! m% f0 c
  416. good_hor2:2 ^9 X% I' Q2 q
  417. , {2 s6 O( v  w# @' j
  418.         call    keyboard_read4 G$ j: f' `- c
  419.         neg     al& a) R5 w: L) U0 |: G. ^
  420.         cbw/ \/ z# \- g0 W7 E' o
  421.         add     [pos_y],ax
    4 o: u7 _9 U3 E0 J) d! ]3 J- S8 V
  422.         add     [y_move],ax& P2 ~- G& |, c) e
  423.         mov     ax,[y_min]7 v( D% d) X$ M# A( F! c3 ?
  424.         cmp     [pos_y],ax/ y8 Y; |& H. j/ `1 t; p
  425.         jg      good_ver16 D7 B( p5 D. R$ O
  426.         mov     [pos_y],ax
    4 K5 ?0 I* q! Y3 j% w& R
  427. good_ver1:
    2 |  a5 T( |5 e3 o
  428.         mov     ax,[y_max]" q/ t4 j! u% Y; ]  k/ q& i
  429.         cmp     [pos_y],ax# \- l' ]9 |% r+ ~/ q
  430.         jle     good_ver2
    % l6 r" P, Y9 V
  431.         mov     [pos_y],ax
    : i8 A/ [/ }" R; ?
  432. good_ver2:+ u" I( m! @9 C( Z, r9 X
  433.   X) [5 s! g8 z: ]5 U1 n3 r) X8 o* {6 R
  434.         mov     ax,[x_move]
    & ?9 D$ w8 J# a
  435.         or      ax,[y_move]
    6 j) n& u, H1 F  q- J' I
  436.         or      ax,ax
    # s9 Q: k, a- D6 R2 v4 A2 e7 k
  437.         jz      no_change_position
    , {# D3 C# o3 d, L2 \
  438.         or      word ptr [temp_mask],1
    7 x) u7 L5 {' P( y; ]. C" N4 c
  439. no_change_position:
    & N) H$ I) q, ^2 M7 h

  440. - p5 v" w8 t: y3 x- k
  441.         mov     ax,[temp_mask]! P1 a- y7 C" E( R: E/ t" T; x6 \  B2 D
  442.         and     ax,[user_mask]6 D1 s* }3 `0 `
  443.         jz      no_call_user, Z3 m6 e- H1 G& {8 x# u$ t
  444.         call    call_user_isr9 S8 o3 |* a9 S$ j
  445. no_call_user:, M  @8 |7 I9 O+ H5 E6 v

  446. ( u3 ]7 L+ |' Y2 v1 n
  447.         cmp     byte ptr [sm_flag],1: v/ I( X- z6 H+ v8 W9 L6 A
  448.         jne     no_show
    / h* @6 K: [0 {7 R; Y4 {& G

  449. / H+ Z; h6 B' a( j+ \
  450.         shr     cx,3
    , L5 \: X" X  c* m/ e
  451.         shr     dx,3( B3 Z( T: t- u
  452.         mov     ax,80
    ! u3 h0 \, ]3 E4 F
  453.         mul     dl
    & |( A: ~* q: H/ ]# ^
  454.         add     ax,cx3 [* u5 C$ t/ i% i# X$ l& s: R+ a
  455.         shl     ax,1
    * F# n5 v9 r8 h+ ~+ _  W
  456.         mov     di,ax
    / o% v$ Q  A7 P! I
  457.         mov     ax,0b800h, l: T0 K2 [- l, z& f- u. e
  458.         mov     es,ax" _. N2 \# [. [) G" V
  459.         mov     ax,[save_char], A5 T2 E- E, N
  460.         stosw; l2 Z: X0 B, N& Y

  461. / K, r6 {: u5 L4 j; x4 z
  462.         mov     cx,[pos_x]3 i8 i/ _, _- N' Z, x4 h2 X
  463.         mov     dx,[pos_y]
    + W; v6 ]6 G6 E' q0 s
  464.         shr     cx,3, N  t8 T! u; w  r" d
  465.         shr     dx,30 G! m: C/ I: z6 B' S, Q
  466.         mov     ax,80
      f4 A& d* `' R! F4 W
  467.         mul     dl
    ' j4 ]. ?( C/ j6 ~& M
  468.         add     ax,cx# P$ T3 C* Z+ Y9 W, r9 Q; Y1 E
  469.         shl     ax,1
    - G2 H. P6 z8 u6 A
  470.         mov     di,ax6 `( j& ]; v2 V6 o7 m& t
  471.         mov     ax,0b800h
    9 n4 n+ n  `  y% j& T6 [& _: o
  472.         mov     es,ax
    7 ~: H" \4 w9 {9 t5 Y" a& B
  473.         mov     ax,es:[di]. C$ s( @5 n# z4 z4 _" M2 I+ B$ P
  474.         mov     [save_char],ax
    & O2 d; g3 R' F
  475.         not     ah
    0 n# R" |5 v8 j7 W" G9 E* t+ }
  476.         and     ah,7fh
    8 \% S+ R9 p4 S! T9 h  R: X# W! b
  477.         stosw
    ; a8 U$ I* z* }0 H3 D* s+ ]7 U% f
  478. no_show:
    6 P0 z( E5 ~! C' y& R
  479.         mov     bl,0aeh* B8 f+ Y  Y, B5 C* @
  480.         call    keyboard_cmd, r( {8 X* T# H2 W$ L: T

  481. ( N5 r' f$ m" {* z9 j: H
  482.         mov     al,20h
    , U# s0 Q4 b) \: w
  483.         out     0a0h,al
    $ _; u) n- F& b. S/ l
  484.         out     20h,al% T% X" P' t5 [- [9 O5 I. g

  485.   Y; p: R% t9 ?# ?! u
  486.         pop     ds$ p, t; X9 [9 H2 ?* a3 t- G
  487.         pop     es7 F5 t2 c6 z% t3 o
  488.         pop     si' A% |8 f- B, y$ O+ K. I
  489.         pop     di
    4 v: j" U. o% P; M8 |1 N
  490.         pop     dx
    * k- Z  s. \5 H4 w8 L7 s2 W
  491.         pop     cx
    . L/ k6 |  X+ }& M7 u0 G
  492.         pop     bx6 _7 s) M0 K6 Z
  493.         pop     ax
    * d  m( t" E- l9 D7 V3 W0 u
  494.         popf
    7 K, L2 X5 U, z' m# o
  495.         iret0 e2 n+ {8 n3 c6 Q- [# M- Y
  496. $ A; U& A, o/ C# X6 T
  497. first_time      db      1
    # k8 w& B, P/ p- D$ \# v
  498. buttons         db      0
    ) }! n! R) l9 Y- S* J% q+ ^
  499. pos_x           dw      09 x  B/ b/ s+ F: ]1 t
  500. pos_y           dw      0
    $ T9 B: A0 Z+ L9 e6 i
  501. sm_flag         dw      0
    , u9 P2 E1 r; z! K8 B% r5 P8 I, ~) |
  502. save_char       dw      0
    " P. Q# X/ I; ^; E* f
  503. x_move          dw      0* l7 R) }2 W$ j9 f
  504. y_move          dw      0; J: q. v$ K( |/ b3 n- I/ x
  505. x_max           dw      639  [! L, `, y. d) c
  506. x_min           dw      0
      C3 b8 S/ p' ~% r3 F2 e
  507. y_max           dw      199
    3 `. z( ~0 }: c7 P
  508. y_min           dw      0
    : K4 V7 R6 D6 p/ w
  509. user_subroutine dw      0,0( _* p. L  M# |1 L( y
  510. user_mask       dw      0$ l* k: C  j& x  z
  511. temp_mask       dw      0
    * O6 j' _" }, l3 l' Y# i4 G
  512. - R7 {8 n- n; j' s5 a; I; ~7 t0 V' s
  513. keyboard_read:
    : \2 Q; \2 J2 X' g8 ?
  514.         push    cx7 j8 T$ t8 V& t; n& n* l
  515.         push    dx
    8 K  }$ B8 T, Z& b( v
  516.         xor     cx,cx: V) f" m5 n, V3 f
  517. key_read_loop:
    9 o+ \! a4 r% T! m. ?! L( Y
  518.         in      al,64h/ Y0 k1 c3 @+ V8 j! Q6 ^- X' n! `
  519.         jmp     $+2  C8 ^2 T; P3 n5 U4 Z
  520.         jmp     $+2
    4 d5 L  L, j, Z4 p, j
  521.         test    al,1
    $ Z# C/ B1 w( i2 o1 G9 d
  522.         jnz     key_read_ready
    * \3 j# p7 h5 c' d( w0 o$ D; d: Y# B
  523.         loop    key_read_loop' O8 m- B+ f! j5 X
  524.         mov     ah,1# {5 k0 m: [1 E% z1 `  W$ a7 H
  525.         jmp     key_read_exit* G$ k' G4 S( b, b% J3 L+ B
  526. key_read_ready:4 N$ |. {9 |8 l6 C
  527.         push    cx
    : O' z3 p. A5 j. x& m
  528.         mov     cx,32
    1 [6 o. G. U5 d0 E8 g" o
  529. key_read_delay:
    ) p3 g' m: c0 K* f3 l
  530.         jmp     $+28 R! R2 y/ o! J. r' Q, ]
  531.         jmp     $+2( M( w3 @; ^  n: e- ^9 ^+ `- w
  532.         loop    key_read_delay( F. T6 R0 h8 ]/ [$ m/ v
  533. ! |% F) d: n2 b; s) F- k  Z
  534.         pop     cx
    8 a& s4 }+ f: V6 M
  535. 6 e8 G; L6 z/ L: D& \4 u
  536.         in      al,60h
    6 c0 Y  Y# W0 u9 f5 a% ?/ c
  537.         jmp     $+2( G. l) g+ |! ~- G3 t
  538.         jmp     $+2
    + Y% v6 c- c6 c& [
  539.         xor     ah,ah
    0 q- V. K6 {0 b) `7 M7 L* ?2 N
  540. key_read_exit:7 @% _+ Z. T8 c+ n% X
  541.         pop     dx5 U& T4 W' q7 i' `5 p" k
  542.         pop     cx5 [& h2 G( b7 p6 k2 e" v; h" D
  543.         ret% H, [! Y6 @$ v" B; ]7 n) O& \5 n; U

  544. 9 U* A% X* t$ U9 A8 C2 S: Y- Q
  545. keyboard_write:
    ' `9 s( }; L8 t6 I+ i) ]. H
  546.         push    cx$ }: {8 s2 v- c  l6 S3 j9 ~
  547.         push    dx
    9 U  K0 {3 v. c, O; G3 s% Y
  548.         mov     dl,al/ y* b4 i6 T  }9 |. Q
  549.         xor     cx,cx
    4 M: _# g5 h" g: b" ?) b% N, m) ~8 }
  550. kbd_wrt_loop1:, ?7 O! T2 g* J+ u7 ?4 h
  551.         in      al,64h1 y- }( y* n9 l5 F9 A* ~$ h
  552.         jmp     $+2+ R. R! `! C4 s* f; q% q/ \
  553.         jmp     $+2
    6 U% }1 s% T+ G2 C% q
  554.         test    al,20h
    " c; ]8 a7 {* Y2 ~. N( ^* b9 U4 d( ]
  555.         jz      kbd_wrt_ok1
    + q3 w' y* G: s4 ?

  556. 7 p5 v$ _8 ^8 w4 m0 X( u" b
  557.         loop    kbd_wrt_loop1
    ! ~. q  ?' l1 t- {& h/ y

  558. ! G+ E' N8 J5 @9 e' e4 _
  559.         mov     ah,1
    0 L, K' F$ o3 R
  560.         jmp     kbd_wrt_exit" r+ U) M$ m& R/ V! y5 O' }
  561. 2 D( P/ n2 y4 U) X9 \1 N' F: c
  562. kbd_wrt_ok1:! ^- V: f  u( F2 T0 l0 V, b5 Z
  563.         in      al,60h
    # f" C, E& H7 D, D: W
  564. ( n7 D2 D$ x. B3 j, G& I" x
  565.         xor     cx,cx
    6 C, y% ^# k0 l' |! ~! b+ f4 n) ~
  566. kbd_wrt_loop:3 q, o2 I# i8 i
  567.         in      al,64h
    ) {$ j5 b+ T) x% L& ?
  568.         jmp     $+2
    1 f2 p" Y( D% C  Z) m
  569.         jmp     $+2
    1 v  Y+ @( h5 V1 z$ E. Y: J6 ]8 H
  570.         test    al,2
    $ S" D$ E  P9 p( r
  571.         jz      kbd_wrt_ok- u8 Z% ~/ e* H- L9 ^
  572. 4 p; e1 Y3 n8 x, s
  573.         loop    kbd_wrt_loop: |5 k, B9 ]1 w; ~8 U

  574. / @2 b& r( n; Q, @1 ?3 Q
  575.         mov     ah,1
    8 |. T0 l. I7 J7 B, C! n+ K
  576.         jmp     kbd_wrt_exit; C: h/ ]8 s0 x- G8 W) R
  577. 6 ?/ l5 f# W6 t& g1 E, |! B  J: O
  578. kbd_wrt_ok:
    * O# H6 S# r" `% u- i8 [% Y, E( n
  579.         mov     al,dl
    ( @7 d* ^' }- V5 h$ I3 L
  580.         out     60h,al
    7 p7 o. J+ G8 ~  i4 W. y& K, e
  581.         jmp     $+2( g# I7 G; N, i1 G" q! d  t
  582.         jmp     $+2
    * ~) f% u' M( c5 h  N8 N
  583. 2 u% x) f) v3 D6 a6 Y
  584.         xor     cx,cx! I7 }$ `' h2 i* _, D. h
  585. kbd_wrt_loop3:3 K! ~& m! C2 N8 D
  586.         in      al,64h3 V! ~6 x, B0 U# M; i
  587.         jmp     $+2
    + I4 R) L2 y$ p0 k
  588.         jmp     $+2: |, _# d, U2 B4 Q. K( r
  589.         test    al,2; n) t# h( M6 I
  590.         jz      kbd_wrt_ok3% }7 }) G5 a9 T' G8 R

  591. ) H) e& Y/ b$ u0 x2 z
  592.         loop    kbd_wrt_loop3
    0 [0 i, y7 l2 X) K, [
  593. 8 D( o, ]7 J, i+ f
  594.         mov     ah,1
    8 l1 [* z' J$ E! U
  595.         jmp     kbd_wrt_exit
    : I3 ~; {3 b5 W$ K0 w
  596. ' n" I* P+ s5 y6 U
  597. kbd_wrt_ok3:
    & P+ I( I( Y. E- l8 O( j
  598.         mov     ah,8
    3 P7 l# o- A* O2 k' m1 G1 h
  599. kbd_wrt_loop4:
    & R: N/ z, L3 k- ^# R
  600.         xor     cx,cx
    1 q+ m7 W0 D) a& _5 C# m
  601. kbd_wrt_loop5:
    , G, `* u7 A0 R$ K8 g% s
  602.         in      al,64h4 O: R/ c# s8 v, `
  603.         jmp     $+2
    * O/ P1 R4 [! J8 w
  604.         jmp     $+2
    - Y. O9 j8 i6 `* ^& J$ L
  605.         test    al,1: K4 @* L9 \% ]! @
  606.         jnz     kbd_wrt_ok4
    8 A$ Q- W1 i  }

  607. * H8 p, s# W2 U
  608.         loop    kbd_wrt_loop56 Y) |9 `. @& O8 p: ?

  609. / n. H4 }! X$ \9 Z2 A. T& {# N
  610.         dec     ah* e5 A/ \5 z& c8 L$ R. r' r
  611.         jnz     kbd_wrt_loop4% ?& A7 h% G% S2 \( r  j. H

  612. & s; U4 j) Q# {' o( l7 @' Z* T
  613. kbd_wrt_ok4:
    " M4 y" D; t* `0 t6 h/ \
  614.         xor     ah,ah, Q( Z4 }" q1 A' u1 \, A
  615. kbd_wrt_exit:6 ~8 d7 S3 @0 v
  616.         pop     dx4 ]* G% X3 A- S  I# ^: i) Y
  617.         pop     cx
    ! [: N; b6 n+ m$ p; e7 m- A4 u7 U
  618.         ret+ h9 U% ^, X; e+ E3 O
  619.         
    6 P' n/ ~! \( V. t; b1 w( u9 A5 {$ Y
  620. keyboard_cmd:( h3 j4 F! V1 j9 I6 h5 z1 L. t$ Y, N
  621.         xor     cx,cx
    / q2 ~/ O- m" m0 z* O) ?8 m
  622. cmd_wait:
    / v4 E8 |& o9 L- [. I
  623.         in      al,64h1 }: c' S+ ]4 A& ~- @* P
  624.         jmp     $+2/ k) `( N! d& d' J/ w
  625.         jmp     $+2
    8 _8 s3 y2 o6 {- H/ C, L7 Y+ R
  626.         test    al,2
    5 r  ^! C/ J& M
  627.         jz      cmd_send
    9 I( w! w1 N" d' [7 L- j
  628.         loop    cmd_wait  n. @4 l0 \" n
  629. * E5 d* J$ F7 e) v8 ], U) @
  630.         jmp     cmd_error8 Z: m; L( h0 P; f8 Q/ I
  631. . z5 O# y3 U) ~8 i/ s# F- `6 n8 ^
  632. cmd_send:- o- S% g5 E7 h4 i* l: P  t5 w
  633.         mov     al,bl3 k* n/ ?6 J: ^; Z$ Q
  634.         out     64h,al+ k$ b" ^* l/ ?5 I3 H4 m
  635.         jmp     $+2
    " e5 n2 c- X4 l  [3 N
  636.         jmp     $+2
    * w" C4 s6 J- x/ s0 J
  637. 2 H# s" L1 {6 F% _: m
  638.         xor     cx,cx
    + W" s8 F& u5 t0 i6 ]/ U
  639. cmd_accept:; C6 i& k- r4 @; f  s, ?
  640.         in      al,64h6 c6 d8 c; _2 ]" T$ g& ?) x6 H
  641.         jmp     $+2; b  m" ~( d- {
  642.         jmp     $+2
    9 O) s* \& P9 o' E4 F. [
  643.         test    al,24 p6 X* k2 Q7 U# o/ v
  644.         jz      cmd_ok
    ! l3 a- z/ ~9 |) A
  645.         loop    cmd_accept
    ( w3 B. {& O& U$ e/ L0 a
  646. + W" o) j/ i" A/ j2 l1 P& M% M' ]
  647. cmd_error:
    6 d# W$ Z/ s- Y7 R* L- v8 h" t
  648.         mov     ah,1! ~1 P  f+ a, f( C8 V; Z
  649.         jmp     cmd_exit
    , s7 i& \% s% G- c  A6 ^
  650. cmd_ok:3 P) ]$ G8 X1 l1 }) w( G5 t! ?! U
  651.         xor     ah,ah3 g1 A$ Z8 ]- e; ~; O9 ~+ T( w
  652. cmd_exit:8 W; T7 D% L  C$ P" j* A( \
  653.         ret
    9 T/ l# n; ?: G2 b& s

  654. , L7 P. T" {, g. ]+ F# q
  655. new_33:  ]- x: e) ^6 m( W# S2 U" [
  656.         cli
    1 F) C, [/ S4 h" c8 j( Y
  657.         cmp     al,05 i" V* g9 _( Y3 e" d" B* m
  658.         je      reset_mouse7 U4 r. H3 @, c; s" V! h0 y
  659.         cmp     al,16 X) [# D. k! f2 K' C- Q- ?, g; ]- k/ q
  660.         je      show_mouse. G/ \9 y: k' E# D  Z
  661.         cmp     al,2# m, W  O  T. D, T% S" G  R
  662.         je      hide_mouse# K# L9 ]- W9 g$ R" x
  663.         cmp     al,31 f2 j' n7 A* V& z7 Y+ m  I
  664.         je      get_pos
    5 [' A; i/ Y8 ?) S
  665.         cmp     al,42 v; h6 f/ @0 q9 d$ ^5 ^
  666.         je      set_pos
    2 P/ A6 I8 R4 ]8 t, }- N5 n. W
  667.         cmp     al,7+ X; k& z+ V' @. |
  668.         je      set_hor_pos! j6 D& b5 A: q" \& |
  669.         cmp     al,8
    8 l: H7 y4 D# r; ]- O- F
  670.         je      set_ver_pos
    ) A0 s( o# a$ B; j
  671.         cmp     al,0bh$ [9 o- ?2 q2 H! _
  672.         je      get_mouse_movement- D% I3 k8 U2 |6 M' g) Y+ I  j
  673.         cmp     al,0ch3 S' U6 V2 A1 j! x& Q2 R5 ?: s
  674.         je      set_subroutines
    2 j+ `4 U! W; y: l6 r
  675.         cmp     al,14h* Y! g, J' N! j# p' K5 E
  676.         je      swap_subroutines
    " f- v; i1 Z  g7 }7 `7 _3 H
  677.         iret
    , R/ a6 o& a, P

  678. - ]" ~0 n3 u2 B7 r2 v: E
  679. reset_mouse:
    ' b7 r) z$ Q7 S) c' i/ b
  680.         jmp     _reset_mouse7 n. r8 d9 D5 l) b' X% R
  681. show_mouse:
    0 \% X/ Q' n2 ]; j$ \& m
  682.         jmp     _show_mouse
    2 q% C# m% }8 `+ k
  683. hide_mouse:/ I  {# \/ J' o
  684.         jmp     _hide_mouse
    : E: u+ e0 Y; z& _- ?6 l
  685. get_pos:9 m! G. [8 u: U, P" ~" c7 \
  686.         jmp     _get_pos
    5 b1 V5 R" h3 Z
  687. set_pos:7 R: h) s$ n1 L" B. B
  688.         jmp     _set_pos/ d& k% t: C- ~8 ]" k/ F7 _9 ^, f
  689. set_hor_pos:6 Q. g  W% F+ s; {3 i$ k
  690.         jmp     _set_hor_pos
    ' P% ]# I' u3 o" K4 A
  691. set_ver_pos:
    / x8 K. d$ z8 S! m- u8 l& O( E1 J  t
  692.         jmp     _set_ver_pos2 s7 k& D4 H* `6 p/ ^& R9 A( R1 y7 M
  693. get_mouse_movement:
    7 G/ H; t0 ]% ~; s  b1 U
  694.         jmp     _get_mouse_movement( @4 V, D, J: ?; O3 @) ?7 q
  695. set_subroutines:
    6 |5 M3 _$ b' G2 j2 R
  696.         jmp     _set_subroutines% z; q8 L3 n2 T' ]" v
  697. swap_subroutines:2 Z$ M$ b( k! b/ \
  698.         jmp     _swap_subroutines! I  X! A, g$ q6 N1 c
  699. - p% {6 l0 p  k# U
  700. _reset_mouse:0 P% Z4 E! Z! a1 T  f* O  o
  701.         mov     byte ptr cs:[buttons],0
      u( C% y) ]1 V& h, C
  702.         mov     word ptr cs:[pos_x],00 k' z! W6 Q; x& q5 s
  703.         mov     word ptr cs:[pos_y],0
    # x- c  x0 n' Y0 _* r' U, n* K
  704.         mov     word ptr cs:[x_move],0
    / `$ t! X1 @7 J$ O. [3 l8 W% J" {
  705.         mov     word ptr cs:[y_move],0
    3 w. \% r# A5 p" I8 Z; V" f4 F* i( J
  706.         mov     word ptr cs:[x_max],6395 ~4 ^5 h' m+ z% M
  707.         mov     word ptr cs:[x_min],0
    % T0 `2 x9 U6 ?- G- j8 i* w: B
  708.         mov     word ptr cs:[y_max],199
    8 a+ m+ g# [$ k7 J
  709.         mov     word ptr cs:[y_min],0& E5 a# K2 d  ~
  710.         mov     word ptr cs:[user_mask],0
    2 I- K& @* `1 v! ~
  711.         mov     word ptr cs:[user_subroutine],07 c) Y. {; U! C
  712.         mov     word ptr cs:[user_subroutine+2],0
    ' ?( A. i. U, Z4 {' V7 b% m
  713.         mov     ax,0ffffh
    0 z# `1 s& c; F4 h( D* p
  714.         mov     bx,3
    # w; ~, X0 t. d2 I, U  r) y
  715.         iret' Y; U& @6 A& s; _- p! ~% p
  716. 8 j# {( h$ J& f& ^
  717. _get_pos:6 _6 w7 T8 t; y/ {, q
  718.         mov     cx,cs:[pos_x]' j8 C8 Q$ g. v" M3 o
  719.         mov     dx,cs:[pos_y]
    / c' T( [0 c0 f9 X0 j0 x$ j! w0 n
  720.         mov     bx,word ptr cs:[buttons]
    & m, @- k. d  ~- \# }. F
  721.         xor     bh,bh! _/ Y5 F8 L9 O7 C8 {7 U
  722.         iret
    6 j. I6 A+ a: a$ V

  723. ' a- k1 A# n1 Y
  724. _get_mouse_movement:
    0 ?) L3 F; c- X, C4 J
  725.         mov     cx,cs:[x_move]; U! A( J' C( y" E# q, a8 C
  726.         mov     dx,cs:[y_move]
    ' f- d1 ?8 Z# i" k# V
  727.         mov     word ptr cs:[x_move],0) k9 Y; k6 r5 n, Q
  728.         mov     word ptr cs:[y_move],0
    2 o/ }) v/ x' c9 o5 D
  729.         iret; g1 M( C3 X% t  y; i

  730. ) }9 S* P. B) h. w2 ^, b$ j
  731. _show_mouse:: ~9 K/ a; D, _- w5 s
  732.         push    ax
    . C" i. x% K9 b( j& L
  733.         push    bx- j, B" \! I. x) T' R' v; E
  734.         push    di8 |: u6 Y+ `' v
  735.         push    es
    & G$ D# j) b8 f' O, `
  736.         mov     byte ptr cs:[sm_flag],1) b7 p' V6 R9 p( r% x6 S+ r7 M
  737.         mov     ax,cs:[pos_y]
    # y# J5 z. X, L1 D
  738.         shr     ax,3
    : G' h+ ~1 u( x9 Q* ~* [( [$ f
  739.         mov     bl,80  j+ r, v$ a' d9 Q$ C" }
  740.         mul     bl
    / B' X, |. q6 {+ G& r
  741.         mov     bx,[pos_x]
    ! t( k  l" C" Z, ^1 k
  742.         shr     bx,3
    . w8 f8 E+ u. c& A8 _$ m4 V4 N
  743.         add     ax,bx- b% S% r! @& D' P+ N. `: m
  744.         shl     ax,1
    9 R9 q+ r3 a5 p* E1 u# W
  745.         mov     di,ax8 h# ]0 @. ^2 U
  746.         mov     ax,0b800h
    $ t- @0 V3 g0 @6 ~  y  B5 R0 Q! N% |
  747.         mov     es,ax
    : c4 u1 ]/ J( @: W
  748.         mov     ax,es:[di]$ O/ w- I7 G" ^# B( u2 V
  749.         mov     cs:[save_char],ax* T: Q% r4 h# M# r' ^5 P1 A: C
  750.         not     ah
    8 m# A2 y" h8 U
  751.         and     ah,7fh
    0 K3 f9 l' _+ \) p
  752.         mov     es:[di],ax- k* M  ~4 q; g- b
  753.         pop     es
    8 G1 R& O. Q+ t! q6 c/ k
  754.         pop     di
    ( K, q0 w4 w& }/ Q7 r, C4 K* A
  755.         pop     bx9 s  |5 T: H$ z; f* k
  756.         pop     ax
    8 [- |9 Y4 K7 D
  757.         iret! _+ ^  {5 d$ U" D3 y# t

  758. * `. @4 s( D3 s1 W4 B1 ?* A
  759. _hide_mouse:
    & W7 \! j% f. h; w9 i7 U" f
  760.         push    ax# D2 a  o1 [: E$ w# }
  761.         push    bx
    9 d# \5 ]% Q: T+ r. S
  762.         push    di/ k. Y1 V/ W! y
  763.         push    es3 i( E. O: x. [/ h+ `* r! s: L
  764.         mov     byte ptr cs:[sm_flag],01 I. ?2 u# l# Y* K1 u
  765.         mov     ax,cs:[pos_y]9 c7 v- @) K% v! ~4 ], q
  766.         shr     ax,3
    , x$ z" D5 o8 k( S: m
  767.         mov     bl,80* m- d5 K) W4 p- D& D
  768.         mul     bl
    . P) n! U/ w$ r1 }5 V) [
  769.         mov     bx,[pos_x]
    . D2 `* t+ T! N, [. S/ W
  770.         shr     bx,3
    : O+ f( X2 S# Q6 k+ O! i" p# ^
  771.         add     ax,bx
    ) d0 a; H" k2 N5 K$ h+ F* l
  772.         shl     ax,1
    4 m; g! c$ I' i2 c
  773.         mov     di,ax
    ; f7 w: z9 g9 [! d! Z/ m
  774.         mov     ax,0b800h. G& u) K$ o# r- g* p
  775.         mov     es,ax4 Y$ V$ b* P5 ^$ a$ f9 H
  776.         mov     ax,cs:[save_char]
    # R$ s7 t4 v; D1 ^
  777.         mov     es:[di],ax, ~9 Q, H* V" v' [4 u( N
  778.         pop     es
    - X9 H, r" m/ a7 @$ F- w0 ]1 K! [7 r
  779.         pop     di6 ]9 ~# m; Y% p0 F; p3 Z& `
  780.         pop     bx
    ' |' H. J. p8 k" T' B; V
  781.         pop     ax" v8 `7 O: M. B$ A& _9 ^
  782.         iret
    0 Y+ b# ]7 c: s. S  F
  783. 1 }6 b4 Z5 o4 o8 w9 V  S, E
  784. _set_pos:
    - v) a' r7 ^$ [) v* L
  785.         mov     cx,cs:[pos_x]- U6 A( [8 u' x- G9 z
  786.         mov     dx,cs:[pos_y]
    2 T/ y# k( ^' [
  787.         mov     word ptr cs:[x_move],0- f$ Y( b1 H6 e
  788.         mov     word ptr cs:[y_move],0' a0 b* v! H% P# [) e: G8 o
  789.         iret
    2 |% j& S& l. P) P
  790. 1 G; p4 x# Q+ k7 N
  791. _set_hor_pos:
    1 P: w* B. V  D1 T& m' V$ ]. {
  792.         call    max_min
    $ ^. r, O5 R9 |. E4 g+ |
  793.         mov     cs:[x_min],cx8 c# }3 d" r% L" y3 y! G
  794.         mov     cs:[x_max],dx( y; l& @5 t) u5 G& j3 x
  795.         cmp     cs:[pos_x],cx
    ) s0 G6 U5 D8 m! V: l$ r
  796.         jge     good_hor_min
    ( R& t( }% S* L9 ]
  797.         mov     cs:[pos_x],cx! @6 t' V/ T0 c! q
  798. good_hor_min:
    5 w! ]/ t! u  h! ~4 |6 [
  799.         cmp     cs:[pos_x],dx" E( R+ k* B( J- D! p; m& y0 n+ e
  800.         jle     good_hor_max/ _( C% Z  i; I6 `
  801.         mov     cs:[pos_x],dx
    , S; r+ `% }" b& h$ x7 c
  802. good_hor_max:
    ) g8 S5 |; v! B9 t0 _4 y
  803.        iret
    & }0 K* K8 d$ w
  804. # k- M: ]( b+ G0 \3 P
  805. _set_ver_pos:% g& f5 N: @0 `* G/ |! r, V- ]6 g
  806.         call    max_min
    5 `% w5 u1 s# [! ~: Q* J
  807.         mov     cs:[y_min],cx2 p; J0 u1 t4 P' C/ j
  808.         mov     cs:[y_max],dx0 `/ A: y' Y5 I- j( P3 W
  809.         cmp     cs:[pos_y],cx2 F2 w  y3 V/ t+ I+ B' J
  810.         jge     good_ver_min9 [7 ^0 [* Z* Y) T1 v( h
  811.         mov     cs:[pos_y],cx
    $ i8 f, w7 m5 }0 c# B
  812. good_ver_min:; Z+ H+ ]) x: V* \
  813.         cmp     cs:[pos_y],dx
    , b+ }9 `( `% c; g% R% o
  814.         jle     good_ver_max
    2 W2 |. A5 l6 g( D$ D! k: G
  815.         mov     cs:[pos_y],dx
    8 S& N  @% {/ O4 f( d1 _& Z  g
  816. good_ver_max:
    # C. K& d$ Q1 J6 H: v& K, D: O
  817.         iret" s  ~: x# d% e: T: C

  818. + o2 {" q1 \2 q  p: c/ t
  819. max_min:
    " k1 X* Y# l/ T( W; @* A+ \
  820.         cmp     cx,dx
    8 W: V9 y4 [9 N+ z, W% d" J9 ?
  821.         jle     no_swap
    4 G: {: O5 F+ E9 Y6 a% b
  822.         xchg    cx,dx2 [  G& f, R, _, q2 G1 W0 o
  823. no_swap:! n4 {- X  Y7 T* o1 y$ b  n# ]
  824.         ret
    ) O/ s" X, a1 L

  825. 1 |$ t% W$ o) R8 J  x; q: S
  826. _set_subroutines:' j* {) M  Z. S& b* A
  827.         mov     cs:[user_subroutine],dx- Z- @' p4 L) s& }' ~: r1 w; s
  828.         mov     cs:[user_subroutine+2],es
    4 N1 e9 j6 ~  V: z5 E6 e
  829.         mov     cs:[user_mask],cx
    # e5 T& Y, e# `0 D' h: c
  830.         iret
    % C( z  z- ?- u2 G' J) p  E

  831. 0 j1 z; i& R* k; z
  832. _swap_subroutines:9 C, x* i0 b+ c/ S4 ^6 t
  833.         push    word ptr cs:[user_mask]/ ?6 C. s& X4 R# s4 O
  834.         push    word ptr cs:[user_subroutine+2]
    ! A) v: f; y+ Q+ x) V
  835.         push    word ptr cs:[user_subroutine]
    5 t1 N  d/ m! d! \! ~, q# ]2 {
  836.         mov     cs:[user_subroutine],dx9 K; Z& [" S- N- J9 |* y/ @4 J
  837.         mov     cs:[user_subroutine+2],es6 U9 x- M8 V2 O0 m1 T
  838.         mov     cs:[user_mask],cx
    5 I0 `2 J1 v; R  ~0 u6 X
  839.         pop     dx
    : j( w  Z3 X0 {. I9 o
  840.         pop     es5 j& p  h" q- s& [5 A1 Z% v$ V
  841.         pop     cx' M/ z& E& E3 O
  842.         iret
    : b8 I0 u$ O. x. X
  843. 4 x0 f! Q5 A9 ?1 E# K4 I* u
  844. memmouse        endp
    # o7 |, p. R. t5 }6 z' ^

  845. ( w# d* G( b, X3 R5 H3 W% J1 i
  846. endof_start:% k) H" F5 G2 f7 O4 a5 W2 s/ y

  847. . e: w/ g; l* g2 V9 l
  848. emsg db 'No mouse driver install error!$'
    1 O5 e& K) q" Z; E; x
  849. old331 dw 0
    " z% j: N8 k9 F6 t  `: ?
  850. old332 dw 08 y# ~1 b" \4 r$ A! \6 w+ B- ~; n
  851. old741 dw 0+ ], a) {- P8 g5 D) A1 x
  852. old742 dw 0
    % ]$ _2 |/ C3 v+ I3 F6 ^& p
  853. memcopy db 0
    7 ^/ u% t) G% U  C3 a7 J" _
  854. okcheck db 0# Q% R# Y) _: J# W
  855. pass db 0: \1 k: `( x2 ^. T; C
  856. chkl db 0
    5 G7 z/ U: J3 f
  857. lk db 0
    $ f( F+ H6 @5 W, P4 n  k3 T2 w
  858. chkr db 04 p; @6 ?/ c: y
  859. rk db 0
    % r! |! v! h2 H' U2 }% c5 V
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '1 {- y8 ]+ _! |0 P
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '2 P; P$ y3 v7 z
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ' l" h! I- A- ]: n/ d2 x2 m, j
  863. db '                                                                                '
    3 F9 O6 r7 H# I2 I( {; {
  864. db '                                赏屯屯簧屯屯突                                  '3 S+ g1 b$ R4 ]: k6 `% R( j( R* s
  865.         db      '                                ?OFF汉OFF?                                 '0 t$ Y+ l  u+ v4 F; |) ^
  866. db      '                                韧屯屯既屯屯图                                  '' t1 k: N* i/ I
  867. db '                                                                                '" i. M9 k5 r9 O$ d, P. u7 y3 K
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    ) g9 `- ?/ ^) t$ x9 O4 B. b: }
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    " C. C) N5 g4 O" q9 _
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    $ U. k/ Q7 c! C3 p) _, U3 r- z5 I
  871. 0 X# ]9 ^1 d3 t9 n1 u
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!3 I+ n1 c' p; @, t
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... / u/ N, ]( m0 P: a3 E+ o5 M

" e4 k0 ^+ M% ?5 V* K9 }谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 23:58 , Processed in 0.058847 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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