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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。+ L1 \" y$ M! h9 n- H# j, r& h% N
5 O) W' H' K" B! }0 z8 }5 `7 _, i
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    % p( f5 W% `9 ]+ o6 w" R2 y8 T
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    ' o( d8 C3 D5 e4 l# h. A* d
  3. ;                                         By Bini.Yi 易祝兵
    . K' X, k& E6 ~
  4. ;                                         http://www.ufoit.com 计匠网
    % v. g$ l# C6 H+ ~) C( q& t1 m
  5. ;                                         2002/04/06 YYYY/MM/DD
    0 w% n; m0 a! Z- `8 a" K
  6. ;3 t: ~, A% f5 o
  7. ;          , m; V  P0 m/ a/ |
  8. ;          This program  test the mouse button  click and move.9 X' S* G2 T7 n5 A& @$ d3 l
  9. ;; R( G2 d  s8 I# y/ h4 Q7 _
  10. / J2 M9 Q1 m6 Y: i5 \7 V* G3 Q
  11. .model tiny
    " N- U( C7 Q. |- o& }5 s* T6 @
  12. .586
    3 C+ x+ i5 ]" U, e' R* C4 r
  13. .code+ l  T' [# |7 p( c
  14. .stack  100h; B- Q1 T4 ~" X
  15. .startup2 _# |9 b( @7 Z
  16. pusha
    # S+ f  Q. T0 b$ t
  17. mov ax, 3533h2 F2 S# r$ }4 u
  18. int 21h
    8 w/ X4 P% V  P! S. C' a
  19. mov word ptr cs:[old331],es& X4 o3 A8 ^- k; ?% C; s& x% [
  20. mov word ptr cs:[old332],bx
    7 o3 L9 n# R. }  H6 s
  21. mov ax, 3574h
    7 }1 j$ S2 k% Y
  22. int 21h* C5 X. a( H# J7 O; w* F
  23. mov word ptr cs:[old741],es
    + t9 C1 W6 f# g* u
  24. mov word ptr cs:[old742],bx/ ~* k; H9 J/ ]9 R# z: D
  25. popa9 P  F" l; w/ {' y* E, N2 @
  26.         call    memmouse
    ) \6 n( [) |- ?/ c% n* V! c% r
  27.         mov ah, 00
    2 ]0 `+ t" ~+ m3 P$ g
  28. mov al, 03
    , U3 h9 p6 f% }$ O3 \1 U* h
  29. int 10h( w2 J3 I5 x8 S( ?) |) N8 x
  30. mov ah, 06. V. G" _( D- l) u2 O# d
  31. mov al, 0
    9 m- X- [  H8 K+ V0 _4 ?1 n8 i
  32. mov cx, 0: D0 ]- f8 H0 }  e! W0 W/ i
  33. mov dh, 24$ P3 {. V1 l9 i& _1 n
  34. mov dl, 798 |# l+ B8 H% P4 x( e
  35. mov bh, 07h' A' L7 \; W; S% g  L0 C3 F: M
  36. int 10h
    / b% B& M) f* p1 S" A
  37. mov ax, 0000( |: W& {5 |1 o& U
  38. mov bx, 0002
    6 m- t0 v8 {0 M3 N  M8 ~
  39. int 33h% [$ a& y" l/ r7 b0 a2 g0 b3 C
  40.         cmp     ax, 0000           ;if no mouse drive install0 V( R* E; E; |
  41.         je      errormsg           ;show error MSG$ C7 n( n8 v4 _
  42. mov ah, 02
    % T* x# }2 ]' z) |1 T2 z5 u; c
  43. mov bh, 00
      M3 B& W% |0 n/ [& q
  44.         mov     dh, 25             ;Move point out screen
    ( _* O% X1 a' `3 I
  45. mov dl, 79
    1 k1 p5 l, y& ?. d7 s
  46. int 10h3 ^6 N- O3 O  B% K, J. v
  47.         call    showmsg            ;Show info
    5 p8 v: `; j1 p" r; a4 {& m: M" b: O/ t
  48. mov ax, 0001- a6 j% D3 h  W8 A- ^: K
  49. int 33h
    ) n) Y+ Y* h2 ?
  50. ; mov ax, 000ah
    6 O/ a$ }6 a2 C# B* D( s  z- I! F
  51. ; mov bx, 0000
    * K# e3 m; l( o0 j8 n( e
  52. ; mov cl, 0h
    * w- Y6 s3 J2 }+ I7 W' `
  53. ; mov ch, 0F0h  D. e! E3 @3 h$ J4 a3 ^
  54. ; mov dl, 0h' M: f9 n  ^: I# R
  55. ; mov dh, 0F0h
    ' |' R/ |* ]9 v. K; I/ E7 C
  56. ; int 33h. l* f# c* y- _- f4 o& Q
  57. mov ax, 0004h! S9 u2 Z! N( \( L  B4 i' B
  58. mov cx, 03194 p- n$ |* o  V, j
  59. mov dx, 0103
    ! L2 e7 v6 n; f
  60. int 33h
    5 a/ \( c" `' w. g8 v( R  A! _% |4 K
  61. casemo:                           ;Case button click and point move
    1 E) }' u2 Y0 {5 H/ ^( G# w2 [7 A5 S
  62.         mov     ax, 000bh         ;and keyboard press; H% X2 Q/ {2 s' B' f
  63. int 33h; R( B- a0 K1 {8 X6 g! K2 e
  64.         cmp     cx, 00h           ;if point move....X1 Z& ]  g8 F7 X  ?9 A6 y
  65. jne xmov9 Y' P9 s  f- `  U0 W- ~9 ?
  66.         cmp     dx, 00h           ;if point move....Y( R* ^) H# f! g4 l# J
  67. jne ymov
    ) L, ~3 \* s8 Q8 _: V& [) _, j
  68. xymovend:                         ;X.Y move end+ @& ]: A* @9 H9 d9 f
  69.         mov     ax, 0003         
    7 G6 q) s% Z! x# J4 F
  70. int 33h
    + P. P: X0 P, n% t, I, j) k
  71.         cmp     bx, 0001          ;if left button click  show ON, F+ L# T2 D4 L# b9 o  O
  72. mov si, 1828
    4 s: L+ E( I( w8 }4 {
  73. je listl. [6 v$ B4 W1 m# i$ s/ e4 s+ g& \
  74. mov si, 1828: ?! j9 n1 T% p# n1 ~1 U) N
  75.         jne     nlistl            ;if left no click show OFF
    ) s& |) ]) I3 Y
  76. testr:8 p$ _& E4 j+ @  O2 t+ Z2 y
  77.         cmp     bx, 0002          ;if right button click show ON
    % p7 n$ Y$ N6 k% `' @  ?; d
  78. mov si,1842, y. @" D& A0 v7 [# G
  79. je listr0 E# X5 d. g  j1 [' J$ c1 A+ Q
  80.         mov     si,1842           ;if right no click show OFF
    * s% R$ _; Y2 b8 n! R) P
  81. jne nlistl
    0 x$ z* J1 w( x* A8 C% e& ?
  82. casekey:
    ; {) m: {4 `2 K( J. ?* C& I
  83.         mov     ah, 01            ;if any key press jump check$ x4 m- U, |+ S& ^
  84. int 16h9 R& }$ w% M* Y6 F
  85. jne kpress
    ; ^; j5 a* |3 e% ~0 u
  86.         mov     al, [chkl]        ;check x flag
    * v0 v4 F' K2 P% P9 q5 r
  87. cmp al, 02h
    9 S5 }' D5 S+ L+ z. [8 B, }! z
  88. jnb chkok; _2 `; F  Y; Q. `' q- y
  89. jmp casemo# X5 `3 m! C& X1 t) G
  90. xmov:                             ;if X moved, get the X flag+1: V+ s* X( T' M
  91. mov al, [chkl]
    + {, {" k9 q5 o  S
  92. inc al$ p4 l6 v+ j- ?+ r
  93. mov [chkl], al
    5 v6 i7 \) s' `
  94. call passok
      z( W5 {: U% n5 e+ o" U1 s
  95. jmp xymovend
    8 W/ c& a, q+ G* f+ p3 W
  96. ymov:                             ;if Y moved, get the X flag+1
    : |: l8 r; t/ c3 z& N9 c. C* [, a
  97. mov al, [chkr]8 d, {, A, v1 v, h) {0 W0 b
  98. inc al
    1 ^+ m( D; ?( T& o) _& G
  99. mov [chkr], al" u! z9 K8 C8 H6 @/ [$ S$ a
  100. call passok  a% Y  x- x5 z( X7 ~8 s
  101. jmp xymovend
      I5 I" l* L# U# f8 D$ ~
  102. 6 q% P) K" `  b# t+ g
  103. passok proc near
    " T  Q9 h' |" B1 \+ G
  104. mov al, [okcheck]- l4 d2 A7 G* g; p- T/ k% n
  105. cmp al, 1
    2 T" \: g6 ~" b* I4 Z
  106. je let0% k/ `% Z; L, p. ~6 b2 f8 @
  107. jmp passret
    % [# o' `, p7 u6 C" t; m# L7 C
  108. let0:
    $ Q: a% K. X5 M" w; ~  |
  109. mov [pass], 13 x) v7 n3 M. h; C, V1 I& v( [& u
  110. passret:! x" Q* I! a4 z- q* F1 ]
  111. ret  n( a0 H4 d( s. N, _- ?  m
  112. passok endp
    / I- F6 ]8 P/ o3 S2 W  t

  113. 5 ^  q; L3 O& L% ]/ t% z" [6 s' U1 a0 s
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    % ?6 t- C) b7 w, o, V( |* {
  115. mov al, [chkr]- w2 b9 ^6 w! ^- Y$ E9 L+ I) |
  116. cmp al, 02h( K; y' o. N. t1 l
  117. jb casemo0 p$ M; h0 b" j: Y" u% d9 m: P) D5 Y
  118. mov al, [lk]
    ' N: A' S. i7 h
  119. cmp al, 1' B5 P6 \: [: J; M* a3 `) c* M
  120. jne casemo
    3 D* ]) z" e3 ~# X, U- d2 S
  121. mov al, [rk]9 r; P+ D3 O2 f' l4 T
  122. cmp al, 1
    & O& t$ J4 x& f5 E$ ?
  123. jne  casemo
    / f/ u+ G& m6 i: h5 J4 L
  124. mov [okcheck], 10 s2 ]8 a3 z$ }) W
  125. mov al, [pass]
    0 o4 q: r/ A6 [6 P1 G" s, Q
  126. cmp al, 1
    & b: q2 c* A: D0 n0 a
  127. jne  casemo3 [& J, m# E) m6 Q4 J' k
  128. mov ax,0002h, }/ r' W! q' g3 ?' M# m
  129. int 33h
    4 T2 C  h- J# v, O: k  D
  130. call cleascr' |4 s; t: ]! p8 w

  131. 9 K& L- b1 m; i) y
  132. call oldint3 @0 e. T3 b, f& F- I1 j% k( R; N! Z
  133. mov ax, 04c00h2 h5 ]( `# L) A% u. _
  134. int 21h
    . u( S) f- w8 s4 ]% f! ^4 c

  135.   U/ Z- k1 \; E5 W3 {* ^& W
  136. okexit:. D+ j! k) I/ z  Q; ~
  137. mov ah, 4ch" l- P5 `0 y5 f. `. D: U+ d8 Q
  138. mov al, 09 m' G) j" `9 ]! I
  139. int 21h
    . B% u) o, R" w0 s" y: `( C
  140. listl:                                 ;Show ON
    ; q" A; k' Z  o: G5 w, y
  141. pusha
    7 }7 t7 |5 T$ C3 \4 J
  142. mov ax, 0b800h
    ' Z0 u" H3 G, e" a
  143. mov  es, ax
    1 S+ l! B; v: e2 n# j' }
  144. mov ah, 47h
    8 i, l/ m; K2 j- l$ W+ I! r
  145. mov al, 20h
    ) J+ d4 K7 j0 V" p# M6 q2 s1 p
  146. mov es:[si], ax
    8 ]/ M# _2 F( h. s
  147. add si, 02
    + Y9 Y+ d5 u' E! V
  148. mov  al, 4fh
    ! `: I8 E2 ]+ q$ L$ d; |. e. k& B
  149. mov es:[si], ax
    ( n, y' J, R8 U, d, {
  150. mov al, 4eh6 l: G2 H; u5 \# `- t- S
  151. add si, 02* K1 W# E' l; F1 a
  152. mov es:[si], ax
    . L$ ?% |; A) k6 q7 M
  153. mov [lk], 1
    8 T/ S! {1 g( p0 p4 k% i, r* D4 h
  154. popa4 c- X! k7 k; \* I5 N
  155. jmp testr
    $ M) H8 r( J% O
  156. listr:                                 ;Show ON
    ' {# W0 Z# e7 ]7 [$ @& x$ L. Q
  157. pusha
      Y7 b% ^- C# I' T& Z
  158. mov ax, 0b800h
    5 D$ N0 g- j3 T6 A5 G
  159. mov  es, ax
    . R# x( `' ]* S6 |3 W# R- [8 V# L
  160. mov ah, 47h
    ; d2 L7 R5 \% }& _) T" _$ W  v
  161. mov al, 20h% L% U4 }2 p% X4 f4 t! \. s' T
  162. mov es:[si], ax
    % v# a6 P# @  ]7 N2 }/ Z- O  q
  163. add si, 02; I" d- F; M, K* L4 t# ^+ R2 q
  164. mov  al, 4fh6 w, S/ O% @: g: Y: o3 V& ]
  165. mov es:[si], ax
    9 ]" j2 U9 Y, a9 S. T
  166. mov al, 4eh
    ; X  b3 v  A, l, L7 F5 R
  167. add si, 02
    0 M% Z3 t! X  I' ?; x5 }$ u' l; M
  168. mov es:[si], ax
    ' P; S) A$ a% c* A/ D$ s
  169. mov [rk], 1
    4 f) s# ?7 \: O
  170. popa
    . z4 {- J5 k: [* S; ?) |
  171. jmp  casekey
    3 k9 v9 T8 k5 j" M; h4 `; a0 ^& S' X- _
  172. $ u! @0 X1 P. w$ E% E  t3 v- r
  173. nlistl:                              ;Show OFF
    , P4 P1 r3 ^+ h0 y  V3 m
  174. pusha   ; {+ t* g# R/ \7 C. \" Q
  175. mov ax, 0b800h5 ]- t+ |/ N9 I4 p9 ?1 r! u
  176. mov  es, ax, F& ]3 x7 w# \, O+ m& J7 h, u  c* h" _
  177. mov ah, 17h' N3 F' ~, t- w" b
  178. mov al, 4fh  |0 n! U" U2 D9 x4 l7 }  g
  179. mov es:[si], ax7 P& P; t" W$ U
  180. add si, 02  f; j8 b2 R) z
  181. mov  al, 46h  c9 g9 T% X* s0 q
  182. mov es:[si], ax% k+ P& R  q+ v6 F* H
  183. mov al, 46h+ e2 p$ F; n, O' q2 u" r- t
  184. add si, 02
    : S* J( M. R! }, P9 O( v! u! r1 l
  185. mov es:[si], ax; k7 Q3 A* i/ U+ ^
  186. popa
    ' _( ^4 S8 j5 g2 O+ [
  187. cmp si, 1840* r1 V) o5 K, k4 ^
  188. jae casekey
    0 l* W1 l" k' V$ O3 G
  189. jmp testr8 b& e1 p1 v6 f% Q' Q* y

  190. $ ?  T- Y0 i1 `: f" i; l
  191. kpress:                             ;Check key press if press<ESC> then EXIT' J5 q# O7 y: k6 S) {, t
  192.         cmp     ah, 01h             ;and return a error- f! U, ^+ d) v7 P# ?$ K9 j
  193. je exit1' b& o: S; _: B" h5 a9 W) b* z; {7 ~! \$ T
  194.         mov     ah, 0ch             ;if press other key then clear
    0 d: N" N* B; z9 n
  195.         mov     al, 00              ;keyboard buffer
    ' o: l7 @% Y, |3 s: ~
  196. int 21h, B( U% P% q+ ~; _0 |+ ^+ b
  197. jmp casemo
    1 ?! i  Q2 N/ F8 r

  198. % F3 `- ~4 K  X. V4 H2 x
  199. errormsg:                           ;if mouse driver no install" k+ W( q; V/ t: o* b1 v
  200. call oldint" W' w0 p  O0 G5 Y- P2 \4 Y
  201. lea dx, offset emsg
    : P" {5 c0 m& _- b" J
  202. mov ah, 09h
    / B' z1 u6 B$ p
  203. int 21h% j' J0 [8 h! T  \# H
  204. mov ah, 4ch5 }: I7 u3 t. {. U
  205. mov al, 25 l/ `, z- v7 V
  206. int  21h- `+ j* g# B& X4 m& c
  207. " D2 j5 q! W5 M+ V; S: f
  208. exit1:                              ;error exit) n7 Q) t* V) Q& A
  209. mov ax, 0002h
    . I& f  f  }' r9 f, B$ Z6 B
  210. int 33h
    4 m5 v2 ]5 y" H1 L9 B5 f- l/ C& p1 [
  211. call  cleascr3 f8 R, x) [3 C& K+ T, j
  212. call  oldint
      Y9 e: F0 u( J9 j8 r
  213. mov ah, 4ch9 G. ^! w0 g% @4 A, c: c& c
  214. mov al, 01
    ! w# z0 Y0 T% l2 k. @% L
  215. int 21h9 b* p2 @9 w( j0 d/ o. m
  216. $ R* v: G% p8 l) R
  217. cleascr proc    near                ;clear screen
    $ t0 }) V5 B- u2 u$ J2 T
  218. pusha
    + s4 t8 t8 S5 G+ A3 W
  219. mov ah, 06
    ' X9 T2 X) w1 @5 L' c) l5 J; \8 {
  220. mov al, 0! m: S. s" m$ ^& ~! R
  221. mov cx, 0
    ' `# j2 n8 ^2 j. L! Y+ g
  222. mov dh, 24
    + |0 \2 n7 ~4 B' _1 X6 h/ L
  223. mov dl, 79
    7 G% o1 ^4 E# o
  224. mov bh, 07h" v3 v2 e. f8 ^7 l
  225. int 10h3 k% h, m3 H/ X: N# H7 j1 \
  226. mov ah, 02
    , }; r7 {" ?: n$ z  H
  227. mov bh, 00$ m! U2 n( Y0 t; }- T
  228. mov dh, 0
    7 D) j5 F. ]  j7 s4 `# O" o
  229. mov dl, 07 d* ?9 C9 p( _
  230. int 10h7 d! x! C$ j0 P4 ]: d; @
  231. popa" E/ }' e& j( t! c
  232. ret# e, k4 k! c% [( L1 b
  233. cleascr endp
    ! t8 S$ e7 b! N+ _3 E$ b2 b6 C2 x
  234. ) m. `$ v0 s% Q+ n
  235. showmsg proc    near               ;Show info$ s& Z) b( J8 Y3 T; I$ N- J5 |' @
  236. pusha
    3 w/ G9 b* x- A
  237. lea di, offset showms) {  F, r( w' V- }! ^
  238. mov ax, 0b800h
    % n3 y" |' l) S! T6 ?# l* {+ L
  239. mov es, ax
    % I9 n/ }$ x0 Q9 H, J  m  Y
  240. mov si, 0& N; U0 ^; v  u$ g& W" U
  241. mov cx, 480! R3 [+ Z6 v+ s# L, q+ Q
  242. mov ah, 07h
    7 J6 l3 w' m, a4 Z0 l
  243. @@:
    6 S" [4 l& b  b/ f5 ~2 p* ~
  244. mov al, 20h8 t) \7 C5 X: K3 {% Z
  245. mov es:[si], ax
    ; R# E# k' `4 r; g
  246. add si, 2
    7 ~- _% p# p  g7 b, J- n
  247. loop @b" k( S4 E" t& C+ Q1 J# R# t& u. l
  248. mov cx,880/ J4 f8 d( d8 q
  249. @@:
    9 p; u0 g( X! t
  250. mov al, [di]
    5 U6 l0 n" a2 t  g  ?# _  S8 c
  251. inc di) P. V+ s# X3 l& ?3 i4 s' Z
  252. cmp al,20h
    # T" f- H/ b& u# s3 \& O
  253. je showch1
    * `# t$ h% l, L
  254. mov ah, 17h
    * O+ N! e$ n! H( ?7 ?/ z7 E
  255. jmp showch3 3 q0 q) W9 l9 c* M# \
  256. showch1:
    8 ~2 y" d4 C% {9 P3 R8 ?2 ]# j
  257. mov ah, 07h 4 y: x! q, J2 G- V6 e
  258. showch3:; P  A+ U7 r% k* A, G* E: S! w
  259. mov es:[si], ax9 T' ~4 ?* Y7 l0 q. C
  260. add si, 2
    : ^# f# ^' i: |9 e# K1 e
  261. loop @b
    - L# u7 R# f+ r8 z3 \& a% T
  262. popa2 z# H4 M1 u) ]' V3 c' W2 m
  263. ret9 W  B) B1 S2 R. k
  264. showmsg endp
    . D# `8 ?2 g- c- v2 {

  265. 8 O9 `0 @# C9 I! l$ |* a
  266. oldint proc
    + j7 N- |; B* X3 w7 x& q: S8 C
  267. pusha
    9 N. D) j* j' K
  268. mov ds, word ptr cs:[old331]: \! O4 B# z" W
  269. mov   dx, word ptr cs:[old332]
    ( }+ W; a! w; i9 L% |& E; \; ?
  270. mov ax, 2533h
    9 l- ^8 C. x, M6 _9 h9 E1 @. S* X
  271. int 21h: R' c+ r6 f1 d& A
  272. mov ds, word ptr cs:[old741]
    * u* H  U9 B# B- v+ |4 \
  273. mov dx, word ptr cs:[old742]
    7 o9 v. c8 m7 V; ]
  274. mov ax, 2574h
    & T! u3 i) J$ f+ Z& j* Q
  275. int 21h7 P" J8 z! k9 n% w
  276. popa! }) H, K  ?* f2 c: x3 K1 k. Q. V
  277. ret
    ! |1 P) x4 u/ ?2 d
  278. oldint endp
    ( t; l# B4 g& E; `9 }: n7 A

  279. 7 S' j5 Q' G7 O" I
  280. memmouse        proc
    + I$ }' o5 a) L. P: p7 W% B
  281.         xor     ax,ax
    # v* J- P/ I2 u1 q4 @3 z
  282. int 33h% A3 }. `5 b4 M2 Q, u* p2 e4 T
  283. cmp ax,0ffffh( p" C" n: |$ w$ ?$ ^# ?
  284.         jne     not_loaded
    2 B, T! Y8 X, E! [! x2 _, i7 O6 y
  285. mov [memcopy], 1
    2 r/ ]# h0 q+ e- B' ]
  286. ret8 E) r) j& p. J* N) _" a8 {" ]2 @

  287. , d; ?5 S2 a9 P# A. n
  288. not_loaded:  F1 T  {  _: F# W# S2 p3 c1 _+ c* W
  289. ; `7 a9 d, d( R( p+ M
  290.         mov ax,2574h& F  d( C& O/ Z( Y# u; M) s& i$ Z/ [
  291.         mov dx,offset new_isr
    # |% H+ M) Q2 S9 r
  292.         int 21h1 H4 P# E8 q" Z# E; Y, U

  293. 4 R4 b$ B' I8 x6 D4 ?5 N* `. J
  294.         mov ax,2533h: v" H1 K8 I8 g3 E! e7 [. V0 z
  295.         mov dx,offset new_33+ W" r* f$ w9 {9 Z
  296.         int 21h
    " m! H6 f+ o% i
  297. # ?. V8 m3 n, u8 @4 Q; d1 b) J- d, p  a
  298.         cli! r( f* k1 b* U1 b+ y, [

  299. $ X( J" \. [0 d% ^: @0 Q0 f
  300.         mov bl,0a8h+ I9 Y: o) s! X( C4 Z+ B5 ^
  301.         call keyboard_cmd. N4 x' U; A4 J- W/ i+ A

  302. 0 h+ C! y& k% _8 q! f4 c
  303.         mov bl,20h
    7 ?; r0 o* ]0 n. w( o* P
  304.         call    keyboard_cmd' l- N9 |4 q  d  F- S. T
  305.         call    keyboard_read
    4 z! q" y$ a/ j" b" I8 o- v
  306.         or      al,25 }9 E8 R! ?1 J2 T& h
  307.         mov     bl,60h; V9 t- Q. W8 p& U
  308.         push    ax# a' `, Z/ O' L8 x1 X& }
  309.         call    keyboard_cmd
    7 P  U/ ]% [/ }, ], @
  310.         pop     ax. V/ V# R9 L: n7 b! H2 I: x
  311.         call    keyboard_write7 A: ?' |- M, ^" o

  312. " J0 o* `/ J- F% U
  313.         mov     bl,0d4h
    ( q* C; `9 G2 H* V( V% g# q8 _
  314.         call    keyboard_cmd
      R: }2 {! p/ M  n1 M' t* T7 g
  315.         mov     al,0f4h; l& F1 g8 u. y
  316.         call    keyboard_write
    * u0 E3 g% n6 H, e2 M/ s2 S, s8 {& A

  317. . U: V) |  e% @0 X* E( z. j% g+ A
  318.         sti
    8 }/ ^; b; r, i2 M) H7 v& A  z4 b
  319.         ret+ x* Y( s1 q1 c5 u  t7 g4 Q
  320. call_user_isr:
    ! Q2 i, }8 K6 o6 d* j$ e
  321. db      60h4 Y5 I+ c" O* i: ~& d+ N
  322.         mov     cx,cs:[pos_x]
    1 Q5 G. u+ |5 v$ m3 e5 R, G- t  Q5 Z2 G
  323.         mov     dx,cs:[pos_y]
    ' W0 p: P* y% a" U. K
  324.         mov     di,0 ;cs:[x_move]
    ; C( J! U6 }' I  X! C
  325.         mov     si,0 ;cs:[y_move]
    & B  l1 J, a1 r! h2 p
  326.         mov     word ptr cs:[x_move],0
    9 G! l( o2 C6 X/ N+ g
  327.         mov     word ptr cs:[y_move],0
    . v# h# I3 S% f* A) p
  328.         mov     bl,byte ptr cs:[buttons]
    ' F( r5 i. f% }, Q9 n9 d* v
  329.         xor     bh,bh* A% D# P8 u& @0 h, ?- V
  330.         call    dword ptr cs:[user_subroutine]
    5 u  v+ Q) h: {; R1 e2 h
  331.         db      61h- q! f- z- H" ]$ L8 Q0 _
  332. ret8 A; {. Z- X* q; e2 `
  333. new_isr:
    9 `4 h; |$ b, V
  334.         pushf( l' r( y4 d8 H2 H1 w0 Y5 d3 ~/ H
  335.         cli4 W8 O( }- u$ h3 a; D5 V
  336.         push    ax
    ! R& m& F; G: F7 q  _, L" u
  337.         push    bx+ ^$ I: t' ^5 E2 b0 m
  338.         push    cx" _3 h5 o, E1 D  k( C
  339.         push    dx
    7 H; J! O7 b$ i7 C) Q
  340.         push    di9 Z9 c" B( {7 l0 J
  341.         push    si
    % U  o! N- K- ~1 d; e
  342.         push    es
    ) Z- r4 o# `# V9 A9 B$ C
  343.         push    ds
    # Z( b, V- Q8 F9 L4 x2 c5 q9 \

  344. 4 a1 @$ \+ l% I( i% k/ r) r
  345.         push    cs
    * I0 ~5 @- H$ t
  346.         pop     ds6 A' n# ^- m7 k& o1 c0 o
  347. & b( {% Z5 D; m- h8 b4 i
  348.         mov     bl,0adh, j2 l; x! X4 l, w$ S+ ^* B% p
  349.         call    keyboard_cmd+ \4 Q) B% J4 L9 w

  350. ' h' v, r; m# B  d
  351.         cmp     byte ptr [first_time],0. {& ^- G8 C% ~* [! {% {4 d: T8 M
  352.         je      not_first_time3 T# g/ D; A$ f
  353. 5 \$ F1 z* k, Q2 t" t" A# J! h; q
  354.         mov     byte ptr [first_time],0" b7 l- ~! V+ l7 O
  355.         call    keyboard_read0 C% ?& f0 w* _4 ]
  356.         call    keyboard_read
    5 J3 ^5 _( \+ F' e( M
  357.         call    keyboard_read
    ' d; A, U" Q4 }# J$ i( D
  358.         jmp     no_show
    , f( x, W, m6 T7 p& p$ Z% T

  359. ; Y  ^  N! x$ H# }" z
  360. not_first_time:0 @7 G9 l. s3 q
  361.         mov     word ptr [temp_mask],00 j7 w* e9 ?/ Y5 k" R; x. H, S
  362. 0 `; @2 O* A# u* U  ?. g6 B' d# R! @
  363.         mov     cx,[pos_x]
    2 \9 {) N, @( M3 O
  364.         mov     dx,[pos_y]$ R: J# b. s5 I: Q$ ]( P: }

  365. ; d7 t" ~- O# A, t9 F
  366.         call    keyboard_read
    & `; L7 N% m2 y" A2 r* ^5 U
  367.         and     al,7 ;3
    # _: Q5 C* V& D' U- a! J/ a6 _
  368.         mov     ah,[buttons]
    0 A4 V; J& s( }  S) v! i& K
  369.         mov     [buttons],al
    & ^9 w+ R! _, d" W# a
  370.         cmp     al,ah* B  @8 q. I+ G$ I1 u
  371.         je      no_button_change, x: q! ?- K5 o* @, D6 {( Z
  372.         and     al,3" y& ?8 B+ Q+ p! B
  373.         and     ah,3
    7 T& Q  z& w4 E
  374.         xor     al,ah
    / p4 \, {2 M: I9 _
  375.         xor     bx,bx
    # i& l7 F# f, A4 `
  376. , c7 `; g  Q$ e+ [: E7 i$ T
  377.         push    ax; H/ f0 E! h0 |# g% D4 c
  378.         test    al,21 `- j5 P4 [/ v/ q4 P2 ?9 e* E0 h
  379.         jz      no_right_button_change
    % [# z+ @7 ~/ O; S7 a
  380.         and     ah,23 g' _' b; r' W
  381.         jz      right_button_pressed8 Z' F& }% n8 u; b( c
  382.         or      bx,16' M  m( {; N  S
  383.         jmp     no_right_button_change: i$ @1 d) x8 f
  384. right_button_pressed:" f0 j. D5 L+ o. r! p! ?) [! `6 W
  385.         or      bx,8
    $ L- ^5 U# ^, V/ x: L" h
  386. no_right_button_change:
    ) G0 b4 u) K% }& \
  387. & l) i+ `2 @3 a) a- Y( i
  388.         pop     ax) p- [& r4 ?  s& N8 S

  389. 3 J0 o0 s% M. f( @, I% J& o; I
  390.         test    al,1; n4 _& J: K: [! X+ s
  391.         jz      no_left_button_change9 y; J% d2 {& S
  392.         and     ah,1
    # i5 z4 I/ ]# e% b, {
  393.         jz      left_button_pressed
    - u' {2 U, y0 ^8 u5 |
  394.         or      bx,44 \* L8 ~3 F" x5 I0 G  s
  395.         jmp     no_left_button_change
    5 @- j& a0 W% A: S
  396. left_button_pressed:
    4 B! d/ l9 G- S1 J- o+ Z" Y
  397.         or      bx,2
    ) V) |$ r1 F- t3 M5 ?& Q( G( ?
  398. no_left_button_change:: f$ q2 `$ Y( a' P9 k
  399. : o9 o) o: F+ Z* b
  400.         mov     [temp_mask],bx: P/ G7 r8 ~8 q0 L4 I5 p
  401. . u+ [% ]% U; R$ \  H- J  `: k2 L6 v
  402. no_button_change:6 o& [+ _$ {" E, N1 k9 l8 j% H* L
  403.         call    keyboard_read
    4 H( K: k" q- Y3 {5 K
  404.         cbw
    " L, x) K. T2 ]  Q9 \% S
  405.         add     [pos_x],ax) ]7 l6 i+ z$ {+ U/ T
  406.         add     [x_move],ax! F, v8 a/ T7 p6 q& ?( U
  407.         mov     ax,[x_min]
    8 M0 h5 D/ Y( o# b# P) S$ m8 ~
  408.         cmp     [pos_x],ax
    " \; k  X6 S! v
  409.         jg      good_hor1
      d3 \7 z# l$ U# H
  410.         mov     [pos_x],ax  v. p5 _8 F2 E! R! ]
  411. good_hor1:9 q+ R6 I, L- X' |
  412.         mov     ax,[x_max]
    ( L8 f3 ^5 i, |" r+ v  L  R) I0 [
  413.         cmp     [pos_x],ax
    8 M! N# \2 f3 ^& Y& H, ^
  414.         jle     good_hor2) |( U: l, ]8 v% s" B7 L5 ^; d: v
  415.         mov     [pos_x],ax# A& ~( t9 ~" C0 `+ R
  416. good_hor2:' S' B9 E3 m! w

  417. : O; X' d# S. k& v2 p
  418.         call    keyboard_read' [/ u; ?8 W" x, P, ]* u- m5 f
  419.         neg     al
    # L) s1 o' M, g% O+ |, c+ K
  420.         cbw/ k2 h+ k2 v  z& G5 H$ C4 l1 }0 F) W/ j
  421.         add     [pos_y],ax
    . e4 l8 [% }4 `5 M$ W
  422.         add     [y_move],ax& x. g, E0 U1 Z; h( m3 Y
  423.         mov     ax,[y_min]
    0 O, B1 [( e: b. Z
  424.         cmp     [pos_y],ax
    4 {7 s0 e7 C. \) |4 u
  425.         jg      good_ver1- _6 o# u4 ]- W" b+ t# w
  426.         mov     [pos_y],ax
    1 V& f" Q7 s" X& B% L
  427. good_ver1:  P: c. j% E" `2 ~3 j/ c* m
  428.         mov     ax,[y_max]) @% A# n  F& c% |9 o% k
  429.         cmp     [pos_y],ax& u0 j1 S! l/ Y9 I0 b5 u) l
  430.         jle     good_ver2# k5 {0 \& V5 K3 h
  431.         mov     [pos_y],ax6 Y# G/ m- A, L3 y. e0 X
  432. good_ver2:; Q2 N" r0 a. b. a
  433. % O. n% G6 N' d  d0 g! M/ l
  434.         mov     ax,[x_move]4 v0 c. f- \5 M9 G, Q
  435.         or      ax,[y_move]& c* E7 U- X( f" S# y5 y  a0 Z' x
  436.         or      ax,ax
    : K& x1 d! x  r2 ?1 l' U$ ]
  437.         jz      no_change_position4 ~" k( r9 k: p3 Q8 L* }
  438.         or      word ptr [temp_mask],18 ~- A& F- Q/ F2 T- ^4 f( U, A
  439. no_change_position:3 A# E6 B. _8 J4 j$ o+ a. z) F
  440. : U4 X! p* d  e. B. c
  441.         mov     ax,[temp_mask]7 o1 x/ N1 S. \# c
  442.         and     ax,[user_mask]( g2 B6 V2 u. O( _. `( X
  443.         jz      no_call_user
    ; E% V% F( i# M* x! U1 n4 k" k- d
  444.         call    call_user_isr, x. s6 z. y- Y+ V/ t
  445. no_call_user:4 Y4 V+ }# D6 x* ]9 N; Y& T- S
  446. 8 {" L( i, s$ i$ A+ B' R7 j4 s  A
  447.         cmp     byte ptr [sm_flag],1
    * r+ k0 q+ A" I) z
  448.         jne     no_show" Y8 W$ w* v5 |  y1 v3 j2 M( N/ [

  449. ) T9 R1 p6 L# d. O0 g
  450.         shr     cx,3
    2 i0 ~! o* T, ?# k  w
  451.         shr     dx,3
    ) p8 L% W! ^( k$ b7 c
  452.         mov     ax,80
    8 c/ T$ x$ n/ d6 e
  453.         mul     dl9 M& r# b# C: g% W* }
  454.         add     ax,cx
    , {3 o( |2 W5 ]2 J8 e) d, v& ]
  455.         shl     ax,1
    ) M& X; i( e) f" x" f
  456.         mov     di,ax5 y6 f. W  C; y- D4 v5 H
  457.         mov     ax,0b800h
    9 N" z6 b; p! Z! ~! r
  458.         mov     es,ax# Z; v9 Q0 E0 U7 V- `& t' _
  459.         mov     ax,[save_char], D. a& X8 V. Z# N! e# a
  460.         stosw$ I1 v/ w& g, d' i3 h
  461. 4 \% j, I% D5 y* k% S/ U
  462.         mov     cx,[pos_x]) D- b: ^& e1 v, |9 E
  463.         mov     dx,[pos_y]" f3 i4 I/ a8 h( t5 X4 U2 _
  464.         shr     cx,3% I% W: C" b' n2 c! b1 t' }; X4 u
  465.         shr     dx,33 W+ [- b4 V5 ~4 \# w7 r
  466.         mov     ax,80
    ) X3 r/ G( L) _: n0 [+ H/ B( ~
  467.         mul     dl
    ' O% \% H$ v/ p0 B) G( h+ p
  468.         add     ax,cx# Z: X6 W  B& P$ r- V3 V
  469.         shl     ax,1
    / h8 i( P& L" |$ ~3 Z0 `! ^( n( P  z7 w
  470.         mov     di,ax
    2 z" s# \- `/ h3 x
  471.         mov     ax,0b800h! ^; Q& O% e2 }  G: ?
  472.         mov     es,ax' N3 D5 Q- B; n" C2 t, q
  473.         mov     ax,es:[di]5 F$ i2 P9 {2 K+ N; W
  474.         mov     [save_char],ax) a7 }3 s! z) l4 v, F+ n7 Z6 ^
  475.         not     ah$ m$ R6 {$ i6 S6 o# |, U7 ?
  476.         and     ah,7fh% N( z& C- k* H9 P! J3 m0 Y5 l+ z
  477.         stosw
    : l  r/ x; U: q8 I, S' N
  478. no_show:; x3 b6 o6 ]  p" P6 J
  479.         mov     bl,0aeh
    2 ]0 \- J6 V4 R$ P# d2 P
  480.         call    keyboard_cmd* T3 U/ x0 K! ]. }8 T4 [/ ~

  481. & n4 q8 y+ \+ k- e/ Y6 W' x
  482.         mov     al,20h
    6 R+ j. W/ l4 N# C; L! |; D
  483.         out     0a0h,al, ~9 j7 H7 e1 u1 @. m  @/ \; R
  484.         out     20h,al$ R( r$ S# Z7 b6 \. T" O
  485. : U7 f+ w' h: @) S$ M( M$ I
  486.         pop     ds
    & n5 n* L2 E- ~! Q  \
  487.         pop     es
    0 f7 N; _( }/ m. ]. T
  488.         pop     si, Z5 S; X1 V& e9 |3 m1 i. x' }# Y: M
  489.         pop     di
    0 a/ Q) [2 g1 L: [+ B3 J. [$ i& k
  490.         pop     dx
    8 r& |9 J( o% U
  491.         pop     cx
    ; t5 N2 O: d. `0 D8 u" q
  492.         pop     bx0 {" f) `2 s7 g5 h
  493.         pop     ax" ~- F" O) m4 R- ?
  494.         popf
    : `7 e) C8 I) \2 M9 U
  495.         iret
    ; y! g+ I: K* Z4 {$ d# b
  496.   Y! c9 l) c$ V1 g1 @! a2 h% f# A
  497. first_time      db      14 {+ U$ I: h1 J$ {: D0 ^" I
  498. buttons         db      0
    % u( p) i: p' _
  499. pos_x           dw      0& c! ?" N/ l4 h# n4 g4 z+ |( f
  500. pos_y           dw      0
    0 O" t) C9 r6 p2 S1 [. p$ I
  501. sm_flag         dw      05 Y% Z) g/ v' D! c2 l. ?4 G! A2 C( o# o
  502. save_char       dw      0
    ( h% s2 u2 ]$ }& d% q+ {
  503. x_move          dw      06 o! N# Y; {$ V2 H
  504. y_move          dw      0+ _/ B7 z2 h3 u6 ?! E2 ^. ]7 D7 r
  505. x_max           dw      639& c6 v& V7 g+ F3 b& z9 n" z
  506. x_min           dw      0
    % `8 o9 e$ D- J/ z3 M
  507. y_max           dw      199
    5 W" w4 k+ Y* q. ?
  508. y_min           dw      0
    0 W9 O( r# f$ U2 h
  509. user_subroutine dw      0,0
    / z% i6 t- Z9 Q6 R* w' J/ w% a( U
  510. user_mask       dw      0) Q* k9 y' L0 }9 d  N% `1 {: u
  511. temp_mask       dw      0
    7 J9 Z" y3 y& O; j9 V

  512. . {* X  H$ ?0 G
  513. keyboard_read:
    , f1 L: h/ m+ r5 M! w8 ?
  514.         push    cx
    ; Q& |+ s+ J0 L2 w
  515.         push    dx1 l4 T% I& M5 w4 M. H. |
  516.         xor     cx,cx- S: }! t+ s+ _6 \( Y0 X* I8 s+ }
  517. key_read_loop:  \. {7 t6 A6 I, p0 B1 o. W. S% x
  518.         in      al,64h
    8 u% _0 D# m4 y# i. p
  519.         jmp     $+2' K3 q  s) d8 M9 R: W2 h* C3 j  L
  520.         jmp     $+2
    * \1 s; M) \! j* `! }* ~( Q; M  w
  521.         test    al,1! J: T/ J  X9 Z# a6 Z
  522.         jnz     key_read_ready9 w$ G: G7 T. c& R. D$ R$ P/ w
  523.         loop    key_read_loop
    & s  W+ H# d, s; {
  524.         mov     ah,1
    2 F0 y$ F, \. A7 B; M% _6 w3 Z
  525.         jmp     key_read_exit
    , f4 U: m! R( r- n% b
  526. key_read_ready:
    6 b- h7 z( b/ T0 `! w6 ?
  527.         push    cx
    , D$ F/ k* B) N, ?8 e
  528.         mov     cx,32
    . z0 V1 A* l$ {
  529. key_read_delay:
      {) ?% ]$ \; M  _3 P7 a$ {
  530.         jmp     $+2( P2 I" v- |/ E6 Z8 o
  531.         jmp     $+2
    1 u' W( a7 P! Q3 l9 ^
  532.         loop    key_read_delay( Q, X6 N" m* @1 r

  533. ! z! c( E: ~% Z+ _2 w' ?( {
  534.         pop     cx
    - H, l/ ~- t. {$ ~. Y  w. g: W
  535. , V8 A- _# c$ ~9 E. t$ i: G
  536.         in      al,60h
    + ~* E5 M4 s$ s$ W  }' Q
  537.         jmp     $+2
    / c0 c$ i* ]3 x( U+ H$ F' R' e& K
  538.         jmp     $+22 y3 [( ~5 w, c* d9 b
  539.         xor     ah,ah
    ' j( F% x. B9 @! W
  540. key_read_exit:. Z4 N* R) n+ R: f/ c5 u$ U5 W
  541.         pop     dx& V7 c- N( P5 t/ v5 Q7 j3 Y! `/ d* g
  542.         pop     cx; O/ U$ D1 p% J1 n8 y. A' `4 a6 L- v
  543.         ret" L- F9 @# A7 E" m' h

  544. 9 ^% Y7 R& \8 z
  545. keyboard_write:
    - A6 q9 X! d" Q0 H% v7 U8 z
  546.         push    cx% h5 s+ c+ l: |# {7 q- u8 n
  547.         push    dx
    - r$ d  m( W, _, H7 z" N
  548.         mov     dl,al
    . }9 \( \$ Q( Z
  549.         xor     cx,cx
    ' B- K2 v$ q  k  ~+ a# r! l% u
  550. kbd_wrt_loop1:
    + ?. h! F7 j! h) g% b- ]' {2 O4 V& K
  551.         in      al,64h
    ' a) ~3 {# N* V! A! p/ ]! a* }
  552.         jmp     $+2' v8 \" ?& d$ c6 _
  553.         jmp     $+2
    + p: i! G+ w( Y, P+ d+ \7 |% B$ z0 s
  554.         test    al,20h
    0 T9 V1 X/ f0 f
  555.         jz      kbd_wrt_ok1
    $ Z3 {4 v: z" ~: Z
  556. : c, b; x" a/ b3 {* Q
  557.         loop    kbd_wrt_loop1
    ; Q0 l" W, z1 D1 r% Z8 B/ U

  558. ' Z9 I- F& p: t1 P8 H7 o& t# c5 B
  559.         mov     ah,1* c+ v8 L3 f( i+ g5 d% N
  560.         jmp     kbd_wrt_exit
      @( }) e+ D) h+ W2 h! u2 M. E
  561. * }2 G5 Z' p. {# e+ f
  562. kbd_wrt_ok1:
    + ?* Z4 F0 I1 N+ D2 ^
  563.         in      al,60h
    & @- v5 c( u( y$ t' c

  564. : }; C: k- C* N( R, }9 B- w, r
  565.         xor     cx,cx( @) b. Y* A+ {8 w8 M  v/ j' B
  566. kbd_wrt_loop:2 s; o% x7 H+ ~, J/ I
  567.         in      al,64h
    7 L! O  y/ A# X3 [+ k, `
  568.         jmp     $+2( J# W: m. w" V- z% i' ]
  569.         jmp     $+2
    # o( L" K2 Q, K& P
  570.         test    al,2
    & o7 m* P1 Y" ~  H
  571.         jz      kbd_wrt_ok
    1 U# e6 Z" p8 P4 S& o

  572. 2 J7 q# u$ W  v9 U% K5 k) ]
  573.         loop    kbd_wrt_loop
    & V$ o, E& E2 w& v' R! x
  574. ( g' f3 n9 }, \6 F" w3 r
  575.         mov     ah,1
    % u2 u  e: I+ u6 F" {4 D
  576.         jmp     kbd_wrt_exit) ^% i7 g2 Q- h; V  |! c
  577. + W& E, r. `2 s2 c0 ^# B
  578. kbd_wrt_ok:6 P1 K) s/ e3 e( o/ z) K0 o
  579.         mov     al,dl, y2 i& i6 @# G; a) x, {
  580.         out     60h,al& s, y2 D/ W! f9 [  X
  581.         jmp     $+2+ r: L! j2 T+ b; U3 H
  582.         jmp     $+2
    * P& m+ W8 S  [7 [' S- Z- O  S1 N0 P4 b
  583. & ~( |8 N) s/ c$ d% x
  584.         xor     cx,cx! v# I1 C5 L6 v7 ^
  585. kbd_wrt_loop3:& ^1 `) R- D1 q2 v
  586.         in      al,64h8 }. g5 Z- {' x9 z# Q& u2 h
  587.         jmp     $+2
    . T0 i+ o/ J/ z
  588.         jmp     $+2
    % j3 L8 [6 I; R  w8 Y# K
  589.         test    al,2) K5 b! ^# \" e6 ^, O7 [
  590.         jz      kbd_wrt_ok3) n$ l3 Y# p" s. J
  591. 4 B5 [; p) ~! a' c
  592.         loop    kbd_wrt_loop3
    2 g- ]% w) m/ ?# V1 O
  593. " c& |+ g! n2 \3 M6 i
  594.         mov     ah,1+ e6 H, j- ?/ ?$ V; K$ d" M
  595.         jmp     kbd_wrt_exit
    ! R' Y$ f" c: F' t
  596. : u. \; H8 k, k. J2 x
  597. kbd_wrt_ok3:' z+ l5 `$ z" y2 I6 e" {
  598.         mov     ah,8' i5 |( O& s# ~7 A- Q
  599. kbd_wrt_loop4:
    1 [- Q3 Y3 h0 Y! M0 E3 m
  600.         xor     cx,cx2 h$ e- y9 s, y) q4 x. |
  601. kbd_wrt_loop5:
    ( X3 A* I+ T  q( c" ~8 H$ O: T
  602.         in      al,64h1 e& h* q: t! Z3 ~: z
  603.         jmp     $+24 u( e: ?" j6 u  Q6 R4 s% [
  604.         jmp     $+2( J2 W! L, ^" J6 ]5 Y
  605.         test    al,1
    3 T$ O, p6 C4 k6 u7 B
  606.         jnz     kbd_wrt_ok4
    . p/ t5 j( D9 X
  607. 4 n  D; I% Y3 X: V4 S# }; o
  608.         loop    kbd_wrt_loop5
    : L1 G! c; L; V# F" s! _3 ~2 K. @9 I6 [

  609. 4 o, A" N/ K$ {, x
  610.         dec     ah
    , F* G  x% D1 S% o; e; O- L; B
  611.         jnz     kbd_wrt_loop4
    $ {( g; ?9 e' m9 }( j8 L
  612. , F" r6 A. ^/ e0 W0 u- m$ @
  613. kbd_wrt_ok4:
    7 a) y* L% t- ^  _% b
  614.         xor     ah,ah+ G* ~! X3 R* ^* S; t2 u: g$ {
  615. kbd_wrt_exit:! `* H4 W* H3 _8 _, o- h- @
  616.         pop     dx
    8 K; r4 p7 v: a$ B( S; R5 U
  617.         pop     cx
    0 T( U' t/ C* I% Z" P
  618.         ret. g8 r/ o/ J6 r- Q# W% B
  619.         - F; |7 y0 ~' X) f
  620. keyboard_cmd:
    1 V$ n: h" z. w8 G3 t- C0 c
  621.         xor     cx,cx- |# A' r+ v; \9 _
  622. cmd_wait:
    ) a/ f: x! M0 {+ P' G
  623.         in      al,64h' @) h1 E  A- ~! l
  624.         jmp     $+2
    8 d  z, t3 \. ^5 ~
  625.         jmp     $+2- F! R0 [5 E2 S
  626.         test    al,2, |4 O" \  v3 [- f
  627.         jz      cmd_send
    ' r+ E  x: M9 R3 n+ ]
  628.         loop    cmd_wait9 Q/ o$ F& d% E; F' o0 h

  629. 8 z' [) n9 L- E; c5 L) m% O7 M+ t6 W
  630.         jmp     cmd_error
    4 \& K) X) f# ~; U, I# |: G1 x

  631. 6 Q  D+ y9 t& d
  632. cmd_send:
    % c; j5 w# \  I8 C4 O: `& O. _, ?0 z$ Y
  633.         mov     al,bl
    2 l1 r! U( I3 |4 J  \9 j
  634.         out     64h,al
    * A8 [8 d# K, c7 L' L% M
  635.         jmp     $+26 ^5 Y3 u" m5 F4 v8 x( W
  636.         jmp     $+2
    5 }0 d8 X5 S7 E* m: J9 f5 u

  637. 2 X: P$ W+ M0 A1 E3 c% L/ o7 W
  638.         xor     cx,cx: V: X7 P* d" H2 W# `$ x$ ?7 A1 Q
  639. cmd_accept:
    5 B0 L( t  }5 z
  640.         in      al,64h
    9 D5 e5 u& t  J, X
  641.         jmp     $+2
    8 y+ m- _. z  z4 ?% l# m" P9 f! p
  642.         jmp     $+23 g# p9 A( L( ]
  643.         test    al,2
    ) \! Z$ H1 c& H/ g- s
  644.         jz      cmd_ok/ w$ Q4 e6 S+ N% P0 @6 k. P
  645.         loop    cmd_accept1 A$ q4 u$ Z' F

  646. - k+ q( B# Z1 T* u0 X$ e7 Z
  647. cmd_error:
    9 p9 @( K# |9 M6 t
  648.         mov     ah,1' d+ t, }, m/ N0 H' P, _
  649.         jmp     cmd_exit. e4 g! w+ }# q& V
  650. cmd_ok:
    ; G' w9 H. p- u5 ?) R
  651.         xor     ah,ah
    ( i: x8 E4 H/ z' T) _4 _
  652. cmd_exit:# P6 D: l: @) v" z! R& L- e/ ]  D& a
  653.         ret7 S$ f" w7 d. k6 ]9 @/ v
  654. + j" F2 N5 v) s* C! g% _
  655. new_33:5 ~% T1 k% u2 h* I2 v) ]. [: q7 A
  656.         cli
    1 l# ~! y; R8 `* n
  657.         cmp     al,0
    ! E5 P! f4 c0 D8 a3 C  q
  658.         je      reset_mouse
    ' e5 L; M3 F4 H$ W
  659.         cmp     al,15 i" s1 Z, |$ Q* Q1 i$ W0 J
  660.         je      show_mouse& e. a* m' r' _8 m
  661.         cmp     al,21 `' ~3 d3 x# Y3 R; `3 F
  662.         je      hide_mouse* g0 H3 a; b  o4 V( W3 M
  663.         cmp     al,3
    4 x1 A3 R! w* g: G! ]! p
  664.         je      get_pos3 B# O! c$ L1 [. [. w$ ~8 i% Y7 @: m
  665.         cmp     al,4
    - a6 X3 |! V# m2 ~9 B
  666.         je      set_pos4 ?# o$ I5 G7 e/ I* R: Y! k( c
  667.         cmp     al,74 g3 P2 Q% j$ C' s" ^! ~, V
  668.         je      set_hor_pos
    2 ^' L  C1 q- E0 R# Q" ^# F- X
  669.         cmp     al,8
    , l! ^6 V9 a+ M
  670.         je      set_ver_pos
    . R" s6 ?& V( m
  671.         cmp     al,0bh- F1 ?: b. S' K) O- Q9 C6 g; u
  672.         je      get_mouse_movement
    $ p8 r7 N+ e# S8 F. L: V6 E( r/ g
  673.         cmp     al,0ch
    ) V6 [3 z- |9 r9 B2 ]/ }( L3 r
  674.         je      set_subroutines
    1 k) \( w. C- D7 c. U, _! I* c
  675.         cmp     al,14h0 ~  J  L% V2 n# _7 X! r
  676.         je      swap_subroutines
    & D5 U; ?3 X3 t+ g* j
  677.         iret6 D5 \* [2 M; X- _* y" i/ A
  678. ! c8 t9 h5 z4 V; E3 j& f* K
  679. reset_mouse:5 H7 J6 @" x7 @. N+ [
  680.         jmp     _reset_mouse+ l; v" ]1 `1 [: {7 |6 ?1 d
  681. show_mouse:% s4 |( ^! i9 p* R1 h. Y$ P+ R
  682.         jmp     _show_mouse
    ! j- L- n% J/ t: w. c) P
  683. hide_mouse:* e7 G" |9 p. k6 M
  684.         jmp     _hide_mouse
    + \4 i( G! {; N2 ]9 |( v6 H
  685. get_pos:- Z. B1 p$ r8 d3 K- t
  686.         jmp     _get_pos
    ( b+ P1 w: @4 K" H/ `  p
  687. set_pos:. E7 P: s; P2 J1 A: E
  688.         jmp     _set_pos7 y, Q3 u3 Y+ H
  689. set_hor_pos:9 B* N- A* N  n- I, c
  690.         jmp     _set_hor_pos
    , B3 n( u$ f0 T8 s5 _
  691. set_ver_pos:
    8 W6 ?) U! L) `$ j( o1 e
  692.         jmp     _set_ver_pos8 Q* L, [, M& U" z" O9 V1 p$ {9 w* L
  693. get_mouse_movement:/ ~& _4 w3 R! D# |- u/ u
  694.         jmp     _get_mouse_movement
    ) n9 ~, n8 t" K$ c/ N" O) u
  695. set_subroutines:
    , Y8 F  y- r  l  W) W
  696.         jmp     _set_subroutines
    4 p$ R" m" F1 U7 S3 y# V
  697. swap_subroutines:
    ; \9 j" K( m" z# S
  698.         jmp     _swap_subroutines0 F8 U3 v9 t6 O- u" g) |

  699. ' L7 c; E, t# O2 X9 p# b
  700. _reset_mouse:9 @9 a9 M5 m* S; h, P
  701.         mov     byte ptr cs:[buttons],0' b/ C+ ^) ^2 ^7 P7 a* v
  702.         mov     word ptr cs:[pos_x],07 K5 A6 x9 Q& S; H* L6 x3 f2 g
  703.         mov     word ptr cs:[pos_y],0  m; Z& _7 s1 r9 S: V" r' ^
  704.         mov     word ptr cs:[x_move],0
    0 I  p& x. [- T1 q* P" |
  705.         mov     word ptr cs:[y_move],04 ^+ H6 V# ]# E8 @. f# N0 G
  706.         mov     word ptr cs:[x_max],639* }+ P, D( Q8 e4 I/ c
  707.         mov     word ptr cs:[x_min],07 ]' l$ F" j+ r8 \* ^5 N$ q1 k3 v: k3 o
  708.         mov     word ptr cs:[y_max],1995 g- U9 w0 ]% W, L5 Y7 d$ r
  709.         mov     word ptr cs:[y_min],0
    : W+ z& }9 X) K/ m* I" ]( s
  710.         mov     word ptr cs:[user_mask],04 K, e: b, {& D! j' x7 p5 g
  711.         mov     word ptr cs:[user_subroutine],0
    3 _8 e; D! A% v9 ~/ N1 _7 q) O) v8 p7 H1 @- `
  712.         mov     word ptr cs:[user_subroutine+2],0
    8 ]0 K% |5 P/ b$ P5 J0 O8 p% y
  713.         mov     ax,0ffffh" y- E: A8 l& ]
  714.         mov     bx,3
    $ [! N, h$ }8 J0 p
  715.         iret9 n$ \" j! K5 A. E" T# T, Z8 a5 o0 m

  716. * t" u6 g/ z% |* |5 v
  717. _get_pos:
    ' @9 t3 I! m4 \' m* {; O
  718.         mov     cx,cs:[pos_x]. |1 g' ]$ {! Z, |+ W5 e
  719.         mov     dx,cs:[pos_y], J; e, e: E0 I0 s- m2 v
  720.         mov     bx,word ptr cs:[buttons]
    ) }( a% t* [, `: y
  721.         xor     bh,bh
    * i! ]+ o+ b4 Z% w+ Z, [0 a! d
  722.         iret
    . x+ L- P& K8 F; y

  723. 0 q" K9 ~  T- {4 s2 F1 Q+ B
  724. _get_mouse_movement:& N% U9 S+ @9 G7 p9 w9 c0 w5 q
  725.         mov     cx,cs:[x_move]
    ' P# _4 S9 F/ y. D
  726.         mov     dx,cs:[y_move]7 _' G8 M5 w  S3 V( z
  727.         mov     word ptr cs:[x_move],09 X' S1 G; k9 z& e4 F0 _6 @( _
  728.         mov     word ptr cs:[y_move],0
    - R3 g: P6 q. s$ e3 T7 _
  729.         iret
    5 g* r* R1 Y8 I2 n1 J5 v

  730. $ U, P- y1 U3 Z  q6 G- g
  731. _show_mouse:! i. m' y* d' a$ ^8 Y  D0 V8 T
  732.         push    ax
    % b; R1 [. U( p: ~9 P
  733.         push    bx# T# w8 |% Y# ]' |& q7 |4 T
  734.         push    di
    ' y3 v( ~: F! p: {+ X+ l" C5 \
  735.         push    es
    ( O' j7 g, [! F( ?
  736.         mov     byte ptr cs:[sm_flag],1
    & q$ A0 x2 V  q
  737.         mov     ax,cs:[pos_y]* B$ n3 e0 q, G8 Z
  738.         shr     ax,3
      T7 d, F3 I, L8 z1 [
  739.         mov     bl,80' y1 s8 ^( k+ M+ w5 a/ i
  740.         mul     bl
    ' {, @5 D9 _8 y0 W
  741.         mov     bx,[pos_x]; F, P( w( r* a' t  x
  742.         shr     bx,3+ X. N5 ^! h' L) f% p& Y
  743.         add     ax,bx9 I0 X' t+ \/ R: F2 e
  744.         shl     ax,17 R7 r# @# {. V6 x% o( j  c
  745.         mov     di,ax
    9 ~4 m0 c6 b; ~0 i% Q4 h$ \
  746.         mov     ax,0b800h7 T) b0 v7 a4 i, y' ^' `8 e
  747.         mov     es,ax6 }8 |' t( w  T0 l* s. r
  748.         mov     ax,es:[di]4 r$ J' \+ L1 Q; j: x
  749.         mov     cs:[save_char],ax
    / P7 O' I- `: _1 O5 V
  750.         not     ah
    + p9 V9 B8 [1 q, e5 g* q) I
  751.         and     ah,7fh
    % }5 h: p3 B6 g/ I+ O1 L
  752.         mov     es:[di],ax. z) r$ I8 @+ I$ _1 v2 U
  753.         pop     es
    " i6 V# `' u5 }/ _
  754.         pop     di; g* v8 f, ]1 P8 _1 f) G3 F
  755.         pop     bx' w2 o8 L7 v8 Z
  756.         pop     ax
    9 a* \/ ]2 a( P: }1 W
  757.         iret& n  f1 \" K1 s* `* K* i  ^( T

  758.   P* |- ?: h1 b$ S; r5 P
  759. _hide_mouse:
    # \4 |% @( m8 M  R" M3 m1 w
  760.         push    ax
    - ]! v/ R1 M& \/ T9 E% H9 i
  761.         push    bx
    ) s0 p  [3 M( }7 J
  762.         push    di
    * Z' k: }4 P% [
  763.         push    es# U) w; p& q5 [
  764.         mov     byte ptr cs:[sm_flag],0: J) b  u. B; s4 T7 W
  765.         mov     ax,cs:[pos_y]
    3 T# n. U6 j" x; Z7 b  Y) D. z0 _* |
  766.         shr     ax,3
    " C/ ^8 b3 v$ [) @
  767.         mov     bl,80; `, H" S9 ]/ a% s" Q
  768.         mul     bl0 E& s5 [+ q: `9 T  i/ c" D
  769.         mov     bx,[pos_x]/ ?& z8 k- r. W. a
  770.         shr     bx,3' Q2 }5 k% R/ L7 j5 T5 N" e
  771.         add     ax,bx
    + C$ W" K9 E7 Q+ o" ?
  772.         shl     ax,1
    , ?9 _8 T; H. s: e1 b
  773.         mov     di,ax
    & f, r( D7 l3 s% z+ D+ U" E) W, T
  774.         mov     ax,0b800h
    9 g- A3 K3 x6 o% N
  775.         mov     es,ax
    % Q$ r) m6 N+ z* ~6 S$ ?' O
  776.         mov     ax,cs:[save_char]
      j2 t, \2 C% M, t
  777.         mov     es:[di],ax5 @( G8 J) v5 O2 D
  778.         pop     es  H; }+ Y2 s* Y9 ]" x' H/ W, ^
  779.         pop     di6 O/ w' h/ d8 u0 L
  780.         pop     bx
    , ?! |& i1 U1 i3 P3 |
  781.         pop     ax# I' c# j; d( K8 C/ w
  782.         iret
    2 H( i6 K! D1 I1 Y

  783. 4 J# q/ H2 Y: `4 B7 Q9 F
  784. _set_pos:
    / y8 V& u- {- Q+ `: a" a
  785.         mov     cx,cs:[pos_x]2 \, m0 @' }( ?# Y
  786.         mov     dx,cs:[pos_y]" b/ N: h7 Q) N, ^* N* ?" [- }# [
  787.         mov     word ptr cs:[x_move],0
    5 h. F3 i( h* x1 P
  788.         mov     word ptr cs:[y_move],0; O% R4 i3 n8 Z
  789.         iret
      w' ~. S& M0 P) X' r$ D6 s

  790. 7 W& I8 j" z% q" ~3 K0 N
  791. _set_hor_pos:
    , F* @% g2 p# |! W7 n
  792.         call    max_min0 L1 |/ W7 b1 O0 T; v
  793.         mov     cs:[x_min],cx% ?% b" Y) S' C! H+ ]) r' ]
  794.         mov     cs:[x_max],dx
    * u  d% ~/ e# n" @+ J$ n" ?; s
  795.         cmp     cs:[pos_x],cx9 m# e5 w" Z/ d1 Z3 ~" _
  796.         jge     good_hor_min6 Z  H6 _( |+ K: v' d+ G' m
  797.         mov     cs:[pos_x],cx' {% V, ~' a+ W# v0 p  v) d
  798. good_hor_min:  O3 X! g) H4 D  U) x' O- g1 D  K
  799.         cmp     cs:[pos_x],dx
    . X8 R3 K) W: \8 ?3 S
  800.         jle     good_hor_max4 t& Y6 D. S. A* d% s
  801.         mov     cs:[pos_x],dx
    2 O: [4 K7 q0 s; ]: W
  802. good_hor_max:
    ! ]" w$ S! Q6 D7 r
  803.        iret
    ; f0 x4 f( P! A, r1 e

  804. 7 ^9 }/ ]& g7 u* R5 t
  805. _set_ver_pos:
    : a4 G' Z8 `4 v' C4 n4 q7 M3 D' t
  806.         call    max_min
    ; J5 t2 M  w! L$ ?9 X( n9 D) E1 [
  807.         mov     cs:[y_min],cx/ ^# G8 `8 Q/ d( L5 |4 D
  808.         mov     cs:[y_max],dx$ x5 _( Z3 l; c
  809.         cmp     cs:[pos_y],cx6 Y+ b# @! v8 c. N% d
  810.         jge     good_ver_min" {- ^2 _# l- v% X  O' u- N" t
  811.         mov     cs:[pos_y],cx
    7 q' Y2 R7 w0 S, [3 t( r; T& L9 R/ N
  812. good_ver_min:
    1 I2 g$ j/ U8 F
  813.         cmp     cs:[pos_y],dx, j9 B( |$ W3 q- t% y
  814.         jle     good_ver_max& E) I8 @$ Z: p+ r
  815.         mov     cs:[pos_y],dx
    $ H! D2 ~8 O; ]% k
  816. good_ver_max:
    " x7 D5 m, c, k7 [) u' I
  817.         iret9 J2 A0 l: g! U; R( w1 p7 N" X

  818. / ^6 Z3 ~9 ~- a! ~2 Y: K
  819. max_min:$ Y) u4 E1 V3 }
  820.         cmp     cx,dx# M/ l# C" H/ E- s2 a3 L
  821.         jle     no_swap$ A7 z5 `8 A8 A4 z
  822.         xchg    cx,dx
    7 y! c! u0 {5 B' o/ h4 p$ v
  823. no_swap:; a0 ], o& ?9 I* f  i+ W
  824.         ret, J2 h  N" b* U$ i3 t& |. r. ^2 j
  825. 3 g, ?" l! ~7 H* Z) ^9 z
  826. _set_subroutines:
    4 J* |5 s1 O4 U$ J9 V; F9 w
  827.         mov     cs:[user_subroutine],dx, O' E5 G8 G6 Z+ b$ u* t5 A
  828.         mov     cs:[user_subroutine+2],es
    6 i- T  {* N. Y
  829.         mov     cs:[user_mask],cx
      B  g4 X- A% I8 ]7 x& W
  830.         iret5 k- w( T* d# _" M( M

  831. 0 A# P2 j6 q8 G- y& l, E; b
  832. _swap_subroutines:4 T  Q. U4 q8 ^+ v1 m9 ?
  833.         push    word ptr cs:[user_mask]. K# V4 t5 W7 _% ~6 [4 T7 r
  834.         push    word ptr cs:[user_subroutine+2]
    / V6 l* Q1 X6 R. c( {& x
  835.         push    word ptr cs:[user_subroutine]; t! v) i) a4 J, ~! D
  836.         mov     cs:[user_subroutine],dx
    3 `  F& z+ e: v7 o# h  q, {
  837.         mov     cs:[user_subroutine+2],es
    * U- k  A: ~. j" ?5 R) R9 o, r# A0 s$ H
  838.         mov     cs:[user_mask],cx
    9 N7 `5 J! |7 Z7 c
  839.         pop     dx/ W; x* v* Q$ z8 X0 |9 A
  840.         pop     es
    . F% H( A$ Y! _+ r
  841.         pop     cx! D1 Q% ]8 q3 d" A$ _; E
  842.         iret# h; h$ N1 O, g7 k) ?6 g
  843. - I8 U, S* j7 A: _
  844. memmouse        endp
    1 l6 G% D2 a2 U2 ~) `( B
  845. 0 H2 A+ \. R% H/ @# g! P! n" C
  846. endof_start:
    : m0 P+ |) _  K3 }9 `, Y

  847. , a/ e% O8 W* z! K. g
  848. emsg db 'No mouse driver install error!$'
    " |! G$ e3 `+ j8 O, c5 X: E
  849. old331 dw 00 @3 F3 y& U; p) D6 e- A& |
  850. old332 dw 0
    8 p0 C5 x0 w, N
  851. old741 dw 0
    1 ^  Z' A$ R7 o
  852. old742 dw 0
    ' _0 W+ p5 A* O4 {5 v
  853. memcopy db 0. \2 e- w( V8 S% _7 c1 ]5 |
  854. okcheck db 0: B' v) C8 v! t- [  c  \! s
  855. pass db 0$ C: q: b" I; @: S) Z# l
  856. chkl db 06 c/ T. o1 S6 Q- C, u% ?
  857. lk db 0
    " H) M+ f1 H6 o$ [5 ~
  858. chkr db 0
    ) p2 V7 b! c& C/ X
  859. rk db 0
    6 k+ d% p. f2 x) v: R
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '4 V% ]# W; k( K1 y: o; L5 T* S3 g
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '& b/ t  V  V. W; B* d
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    0 m3 I( j: S8 T
  863. db '                                                                                '- Q0 @8 q& A- G  t
  864. db '                                赏屯屯簧屯屯突                                  '
    $ N2 v& X& @# l5 J! z
  865.         db      '                                ?OFF汉OFF?                                 '
    , f' T% I1 f- M/ F& Q: t6 M
  866. db      '                                韧屯屯既屯屯图                                  '
    0 r& J& m% `& i; ^# l
  867. db '                                                                                '  c6 e3 y/ m  ^% B. t
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    + Q7 @2 W: f- l( Z/ \2 [9 u  @
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 0 t: ^( B) S7 g, \+ y
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '/ z  x' }* E6 ]3 q7 a
  871. : h; G" G+ A3 B4 b' o# Q% x
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!: P. i9 P8 S/ b! W1 Q2 P, d' X9 E
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... " y* U% W% w0 \- _  c% c

& P1 Y2 u- L) I$ ?  W) B/ z谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:05 , Processed in 0.058042 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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