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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。  L: j3 Y& N6 i; z! A
: X( s, R) w; \3 s
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    & F4 \5 P% D) N3 ]( w! W# \
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9$ ?1 R& R2 y% ?% n9 K
  3. ;                                         By Bini.Yi 易祝兵
    6 w) Y  i; f% G
  4. ;                                         http://www.ufoit.com 计匠网
    . S% G5 ?- `0 E  F
  5. ;                                         2002/04/06 YYYY/MM/DD
    + q: C/ S0 r+ b( L8 _6 D
  6. ;; n9 r, c: J' J( `* h3 H& f  `! W
  7. ;         
      ?! x$ |5 P+ ]* X. x+ u- k( l
  8. ;          This program  test the mouse button  click and move.
    " @* }) r" }, q. P
  9. ;
    6 F$ H/ b6 |% w7 a- i0 y- V
  10. & b' D( k, V  S9 u
  11. .model tiny8 \9 @; r* h5 h, q
  12. .586
    1 J1 v' Z7 A3 f& H; B0 y7 P
  13. .code& d0 _: |; p. X2 l
  14. .stack  100h5 }: s* A( |! h; t1 m
  15. .startup
    % t1 }/ t  y. _& R9 Y; k
  16. pusha; p/ {+ ^. N, K+ }+ P1 Y. k( W
  17. mov ax, 3533h
    - f3 h% w' b7 k- Q. o, p
  18. int 21h
    9 n- w0 E$ h" Q5 Y
  19. mov word ptr cs:[old331],es
    8 `* |% u+ x* D, V9 q; Z
  20. mov word ptr cs:[old332],bx/ A7 {+ j- Y% E1 @/ V" j. C/ T
  21. mov ax, 3574h& p! V5 l* t/ y  |* w; B: T
  22. int 21h+ {2 P/ u+ m1 @6 _+ l3 o& Y
  23. mov word ptr cs:[old741],es
    1 \# `# M9 u; b6 x% _
  24. mov word ptr cs:[old742],bx
    * ~6 K* ^; g$ f
  25. popa
    + n0 k) t8 W$ }
  26.         call    memmouse
    * j/ u  x7 s6 u
  27.         mov ah, 00
    % Y1 {- u* k6 U% i0 a5 F3 T
  28. mov al, 03
    + h( A: d/ ]+ C) Q8 M0 B/ }
  29. int 10h
    8 s3 N0 i" `  J/ F. l( ?9 L& W1 f
  30. mov ah, 06
    & e$ k2 F  d7 Q% I
  31. mov al, 0' a$ Y7 z$ Z9 Y) \
  32. mov cx, 03 k3 Z$ c, \1 L1 n: k; J
  33. mov dh, 24' ]" H' ?* h% m, {- H
  34. mov dl, 79
    " |3 b3 F: I5 B" O
  35. mov bh, 07h& k8 c/ M6 d7 I. {  N3 }
  36. int 10h6 R3 `0 R+ Q" ^' v0 D# `% V
  37. mov ax, 00002 E. K" a* \8 a$ G# `) u) [5 y
  38. mov bx, 00022 [1 D; h* p& \0 Y: ~8 }1 C
  39. int 33h6 e9 A: I/ c5 e; W# Q. F/ C
  40.         cmp     ax, 0000           ;if no mouse drive install
    8 \3 n1 D' U, _1 U; Y6 y
  41.         je      errormsg           ;show error MSG4 E# r$ d& A" E7 R+ L' s
  42. mov ah, 02
    5 ^; g2 C- r6 h) m5 H! O! i
  43. mov bh, 006 Q1 z6 ?- P2 N
  44.         mov     dh, 25             ;Move point out screen
      G8 S) w  r# J" U2 E4 |6 [% u
  45. mov dl, 79' o2 F$ `) A6 ^. T4 i0 L$ j
  46. int 10h
    & F. t- j$ t" K: I
  47.         call    showmsg            ;Show info
    5 @/ V8 n+ c9 @) i7 Y7 V
  48. mov ax, 0001# n6 O: x  P" [- Z( }" z  D
  49. int 33h
    . g) _$ N4 ]9 K* b  K
  50. ; mov ax, 000ah
    0 s/ l4 L  P9 j6 ]# ^' g# ?
  51. ; mov bx, 0000
    / j- ?* y; Q5 Z7 Z/ C& ~# g
  52. ; mov cl, 0h
    ' t/ g" d) L2 t
  53. ; mov ch, 0F0h
    1 c; U* F$ X8 V% v7 N: G8 N0 F& C9 g
  54. ; mov dl, 0h2 Z/ n1 _8 G0 ~3 M7 Z% [9 O
  55. ; mov dh, 0F0h. v& W; _( J' g% r9 q1 `
  56. ; int 33h
    / O  A; Y$ f9 L) r' w
  57. mov ax, 0004h3 H1 t9 C9 x" R) D% a
  58. mov cx, 0319, f) c$ v* Q3 p. C
  59. mov dx, 0103
    1 E, _0 j* i. v: y! F
  60. int 33h. a2 X. ~  I* b" h% O
  61. casemo:                           ;Case button click and point move
    2 N  k) |5 Z. |: }; n$ M% u
  62.         mov     ax, 000bh         ;and keyboard press
    0 k) w& v  A7 j$ L  B- g6 C6 P$ p
  63. int 33h5 C' g  o) W/ G% q9 w
  64.         cmp     cx, 00h           ;if point move....X/ t7 o" {! R" U1 r1 ~& Q
  65. jne xmov7 u8 f9 z: {: Y% V( N/ x4 C5 Y
  66.         cmp     dx, 00h           ;if point move....Y
    4 |3 n8 h! l: I) s6 z$ R& r
  67. jne ymov
    + t$ F4 g, l; [" Q3 _5 y9 D
  68. xymovend:                         ;X.Y move end
    - Y2 _4 q3 _0 L. Z1 i( J: g' X1 H
  69.         mov     ax, 0003          # ?- ]! O% E$ R& n' p% w) O& ^5 w
  70. int 33h
    - W, S5 C5 }5 J2 H
  71.         cmp     bx, 0001          ;if left button click  show ON
    + r# I2 q! y9 r# A3 `1 ~- ?3 [
  72. mov si, 1828- D4 l  @: U8 a+ m0 X
  73. je listl
    5 N$ q  |/ u5 N" J- T
  74. mov si, 1828
    7 i& \) H3 s3 J& {" }4 A
  75.         jne     nlistl            ;if left no click show OFF2 m1 _! m9 N7 Q4 c( v) }- O
  76. testr:
    : W/ n+ z' n5 u5 p4 Q$ U7 N
  77.         cmp     bx, 0002          ;if right button click show ON
    : l' f. j4 B4 ]% j: q0 J7 [
  78. mov si,1842  M0 H) y0 S3 i$ x) ~0 N2 I' \, i$ L
  79. je listr
    / V' o% g* ?5 U+ ^
  80.         mov     si,1842           ;if right no click show OFF; B% X* y3 j* O3 p& O! t
  81. jne nlistl
    " [  G7 J5 k7 G% y7 _# Z& h
  82. casekey:
    3 `# W0 K8 Q6 k% y
  83.         mov     ah, 01            ;if any key press jump check
    1 h6 w. n1 U1 f! u- L
  84. int 16h7 K4 W: l9 U5 S
  85. jne kpress. @$ U: P* N4 X0 @
  86.         mov     al, [chkl]        ;check x flag
    0 P0 Z6 X+ W7 n
  87. cmp al, 02h1 L+ f+ ~8 A* a, b3 C
  88. jnb chkok9 k2 S% R5 O5 |  O! {6 B
  89. jmp casemo* M4 {9 S, l- D& d
  90. xmov:                             ;if X moved, get the X flag+1# E0 ~$ g6 x9 a# ?9 U/ O! i6 L  `) f
  91. mov al, [chkl]
    1 e# {- l8 L! w7 Q
  92. inc al
    / _% E' V: A: w+ o) i4 i- q* V
  93. mov [chkl], al
    ) N" Y. {$ g4 O7 f
  94. call passok
    ! x0 O3 |* M) \6 d9 N
  95. jmp xymovend
    5 U- x4 Y" ^& R, n& H+ n
  96. ymov:                             ;if Y moved, get the X flag+10 b$ k4 E8 o( l# C- q' l
  97. mov al, [chkr]: h! ^' F9 S2 ~  \3 ^' s
  98. inc al
    / c0 u1 c/ W$ z! R9 |# a
  99. mov [chkr], al1 v- y# @! C3 g$ g& l7 J; f
  100. call passok
    6 E$ Q: [, X8 y+ o! N0 R
  101. jmp xymovend3 l+ u3 W+ q( a6 i8 X2 l
  102. % O/ n4 w1 G5 W! `! W% z. j
  103. passok proc near; t5 }) Z8 c% g* n7 V
  104. mov al, [okcheck]! @" L! e6 G3 P/ ^. Y
  105. cmp al, 1- e( D+ {: P; S  s
  106. je let0: v: ~% Y2 @1 @% ~
  107. jmp passret
    % B/ {/ F% v$ K( E" F+ d# r, D
  108. let0: * c* C% ?8 S, c9 D
  109. mov [pass], 1$ h9 G9 x6 C. t) Y" C, q
  110. passret:: Y8 I: H3 S# T# q
  111. ret- \5 x, P; T3 |6 X0 k! R- t& F
  112. passok endp # L+ i: J% ^( `$ x* ?& T7 U) k7 J
  113. 3 m: {- _( C9 m
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS- ?9 k' _* [& Z
  115. mov al, [chkr]0 ^! `3 i, D8 J' T2 a. u: o! D* Q, U
  116. cmp al, 02h6 P0 Q3 K" q9 h' G8 H7 V
  117. jb casemo
    - y2 ~7 {+ s; b9 l
  118. mov al, [lk]5 a; d5 v3 B1 _: s/ {$ ?* o6 D: _
  119. cmp al, 1$ u7 n  u: R: o' d. n; V6 a
  120. jne casemo, D; E7 _3 ]# M; a! L
  121. mov al, [rk]1 i; R  V" e0 u7 D
  122. cmp al, 1+ R2 P: A# i* O5 e( `# b9 t
  123. jne  casemo
    # G8 k, w( J" a3 t* B
  124. mov [okcheck], 12 {: ~' t  E- _' Z3 N3 d# `
  125. mov al, [pass]
    6 h6 v& p; @& Z1 `) }  S9 E8 u
  126. cmp al, 19 d+ [! k/ B" \. H( X1 v
  127. jne  casemo  z* e* V6 P- W+ f
  128. mov ax,0002h
    2 Q4 B# E! K7 j& [
  129. int 33h
    8 O& I0 ]1 M* E" j9 N. R5 \
  130. call cleascr
    , s7 A) A, N2 w

  131. ; @( ^# Y( \, I* @; |+ T
  132. call oldint
    ! a* ^3 L/ {3 A6 |  q' S
  133. mov ax, 04c00h
    ) `4 Y8 }" X8 [% }( r% Z& j
  134. int 21h+ V; f0 C8 a" w3 L' ?$ f! K# s
  135. ! ?$ i9 ]. R5 A0 `. s. s
  136. okexit:
    5 o+ l: N  j! i  V& E* }- e
  137. mov ah, 4ch" C7 e2 A+ O/ H( t5 z" }! [
  138. mov al, 0
    , G% p# S( G! K7 {( r
  139. int 21h- U! w0 N( ^! A# I; U
  140. listl:                                 ;Show ON
    2 ]& h) w9 u. N+ j
  141. pusha! X6 U+ B* y/ O# A
  142. mov ax, 0b800h1 G6 W1 p0 C# q2 h( `6 B
  143. mov  es, ax
    ) W/ A3 j0 }  A0 H4 {7 S' x
  144. mov ah, 47h0 K* s5 Z# D; {4 Y1 e; ~
  145. mov al, 20h
    + C8 c/ ?0 |1 u& h8 [! t: X* E
  146. mov es:[si], ax$ _3 n* j4 `) }4 G, a& M7 p- g
  147. add si, 02
    2 o6 K' r/ n$ u
  148. mov  al, 4fh# H( o# n( ^9 c
  149. mov es:[si], ax
    2 Z& p* x- F& C
  150. mov al, 4eh7 h& |7 G# d6 H1 _6 ~( j) b
  151. add si, 02
    7 `' t: V/ K* ?/ v4 w
  152. mov es:[si], ax
    ) M* e2 Y8 Z. U2 [
  153. mov [lk], 1# n- V6 |2 `2 }' ^* j6 G2 {7 d
  154. popa8 `3 \$ O5 W6 Y8 z# V$ a  U& @4 J
  155. jmp testr
    , s* I4 O5 Z3 U# U8 x* T- n
  156. listr:                                 ;Show ON
    2 \7 n+ F( w3 i
  157. pusha
    % B  x+ [2 f6 ^  U: p( j3 ?/ _- y
  158. mov ax, 0b800h
    2 J* l+ `6 l5 m' o9 W- V
  159. mov  es, ax
    9 l% ~* K2 N  B* {. W7 _+ T
  160. mov ah, 47h) S; X# R- w. H$ ~9 ?
  161. mov al, 20h6 K0 d% M/ o+ i1 E- j  j
  162. mov es:[si], ax0 J/ S( ^, I8 ^
  163. add si, 02
    0 t, K; \6 a- E+ m, H
  164. mov  al, 4fh, i- j6 e" }8 k" w
  165. mov es:[si], ax
    $ l: j" F: R3 h: g; h$ q
  166. mov al, 4eh, a7 k2 ^' o) s1 A/ w+ E5 R0 {1 F
  167. add si, 026 L9 N) e. s+ R3 ?* H) c& X: g
  168. mov es:[si], ax
    " l6 z- D6 k2 D1 D* Y
  169. mov [rk], 1
    0 _3 N! K7 Q9 X" c; k' p8 q
  170. popa
    9 I( f  k; k% X# |' W3 U, D3 H% c
  171. jmp  casekey
    , j/ z+ R3 E  @  D; B/ x: c& P; H& Y

  172. 4 f9 Y& t! ?0 L7 y- ]( G& ~  i9 B
  173. nlistl:                              ;Show OFF# b! ~% B* \. `! S$ G$ X8 m
  174. pusha   
    6 q- ~' `/ H  h/ ?
  175. mov ax, 0b800h
    2 |6 U$ a; i& i: k# a/ v
  176. mov  es, ax- k( k, E+ W" |
  177. mov ah, 17h3 \& y5 J; w1 ?2 m' t
  178. mov al, 4fh
    , H! d; X% _1 S1 p: o
  179. mov es:[si], ax
    9 V. j* p+ Q& I7 l1 U: r7 A: x5 b
  180. add si, 02
    " i- X5 O  E) G& [% u' b  M( Y( ?# W
  181. mov  al, 46h
    , d; N3 K  u4 A9 U& f+ Z+ ^* n
  182. mov es:[si], ax; j. J: R2 M6 D% Z6 ?! e0 O
  183. mov al, 46h
    6 I  Z/ I1 e- D8 D* `4 v* D7 g6 w
  184. add si, 02) F" l: A! r4 m! b: O9 {* r
  185. mov es:[si], ax8 B# u3 R- j* ?
  186. popa; P0 u4 [7 q. h  D' W! x4 `
  187. cmp si, 1840
    ( [. O7 I' q2 g
  188. jae casekey5 h, {% @! W, b) N8 C  J& G0 k
  189. jmp testr9 m* O" \; q- e/ u7 N: i
  190. : o* w  y% v& Y+ l% U6 ^
  191. kpress:                             ;Check key press if press<ESC> then EXIT4 n1 `( A& I* ?- C
  192.         cmp     ah, 01h             ;and return a error7 b8 s) M" v( l. ^% c; ?
  193. je exit14 q* h0 _3 [( ~5 Q  m4 w
  194.         mov     ah, 0ch             ;if press other key then clear
    3 _" @( m. _7 H' o
  195.         mov     al, 00              ;keyboard buffer
    ( R. F8 o6 L1 o
  196. int 21h# b# m/ A* x: v. K6 u5 m& T
  197. jmp casemo
    3 \& t9 a/ y7 k8 \1 V
  198. 4 w, z& v" g9 T9 Y! p+ b$ r- Y2 Y
  199. errormsg:                           ;if mouse driver no install7 }6 K8 w. @7 ]8 u2 S
  200. call oldint/ [* b9 |9 |6 M" b+ K+ L
  201. lea dx, offset emsg* i  v, [3 K% P$ _$ }
  202. mov ah, 09h% r; j7 G( K* C) P" ^# ^9 `: |7 m
  203. int 21h' f+ t( X. m; H* _) k6 e6 G
  204. mov ah, 4ch
    4 U7 P/ c9 j: z) z' Y
  205. mov al, 22 ~. R3 Q7 Z, x8 ]
  206. int  21h
    ! K  b" E/ d8 H2 ~
  207. : p3 j/ F$ |8 h0 l3 |  t9 |5 m9 w& D
  208. exit1:                              ;error exit
    6 g+ Z0 p- q; j; U3 `
  209. mov ax, 0002h
    4 Y3 h" z) Q3 Z& X) r! Z+ Q
  210. int 33h
    8 B& a! c2 P" X2 H3 N  a" o% l1 N
  211. call  cleascr
    ) Q3 [: x7 e1 X, S- t
  212. call  oldint
    ( O! I7 t0 J! l+ [0 V* c4 n( l
  213. mov ah, 4ch
    , s5 }: p! T$ ?0 J
  214. mov al, 01
    / i2 H& ]' g9 u( G+ s: i7 ?; K, }
  215. int 21h
    1 y8 R1 y# V$ k. n& d8 W3 l/ t

  216. 8 r" {7 Y. t( f- D& u+ Q' k
  217. cleascr proc    near                ;clear screen& x1 w% w# ~2 S/ h. y
  218. pusha) T. x+ U2 I3 X/ R  p
  219. mov ah, 06# L$ F: n+ ?  `! F
  220. mov al, 0; b- p6 z9 e  R' T
  221. mov cx, 0$ W0 Z) }1 k5 X+ D$ D/ [- _
  222. mov dh, 242 d3 ]$ [5 p5 b5 ^8 `
  223. mov dl, 79, x# J' Q1 x. H
  224. mov bh, 07h; K4 w( U1 B2 W! t
  225. int 10h
    5 U6 f# l; e4 m. m
  226. mov ah, 02
    , `# _% x- l. q$ k- H
  227. mov bh, 00" v7 M( X, v* J$ ~& u+ c- c: @
  228. mov dh, 0" g+ R/ G) B. ]; ?4 h: i; U( `
  229. mov dl, 0) q% j, ]$ T4 B8 U* ~- x' {
  230. int 10h, X4 x/ l0 s9 @3 P. v0 _( Z' ?9 V
  231. popa1 x  Y4 f. _0 Q  h) s2 d. r5 y
  232. ret
    3 P; B$ L9 p6 g' N8 c
  233. cleascr endp
    0 p2 s/ p; `: h- Z' g& Q

  234. 0 z) X: ^9 y8 x3 b
  235. showmsg proc    near               ;Show info* p1 t6 w9 |- P& M( K
  236. pusha
    " d) z1 b- j. U! {
  237. lea di, offset showms6 {9 E  C: C5 O! s8 E
  238. mov ax, 0b800h
    . v7 w3 `! L3 L) g( ]( V/ \
  239. mov es, ax; D( y  H3 M7 K7 n) R2 C2 j# f
  240. mov si, 0. f5 {4 H$ m4 X: P8 ]! C
  241. mov cx, 480
    5 A+ _9 _. R2 V3 D1 s  o
  242. mov ah, 07h
    ' ^3 ~  {4 A) {% s$ q/ Z. c4 P
  243. @@:# f/ v  A( {7 Z; z
  244. mov al, 20h$ w0 N* s2 W/ M
  245. mov es:[si], ax; R- d/ h0 f- K$ b
  246. add si, 20 z/ T" _; C4 J( c/ H9 E0 H) {4 R+ l
  247. loop @b
    * [6 X8 e) ?5 G7 t8 @
  248. mov cx,880) s" T7 l6 N# Y, D9 b/ Q
  249. @@:
    # g' D1 n" i( y; n% @
  250. mov al, [di]
    2 q& ^5 p; N2 h! h- @; {
  251. inc di
    8 b" A$ G# n/ ]% u, |" ?2 \
  252. cmp al,20h6 n7 Y; e2 C: h; I
  253. je showch1" \' m5 I+ M7 F% \$ h4 ~
  254. mov ah, 17h
    1 N) k/ Y3 n( v  V3 c  o
  255. jmp showch3
    " `9 }  x  ~- n4 ?+ N* ~
  256. showch1:
    ! A: W3 H! \! k! _6 }2 L
  257. mov ah, 07h ' e$ U6 O2 X- v
  258. showch3:6 }# }! Z. X$ P6 v# p5 P
  259. mov es:[si], ax
    " y. R4 u4 q- Y7 Q4 ^. s
  260. add si, 2
    - W$ z; Q4 u, @2 W- {
  261. loop @b3 p; Z  \& G7 r. U% U' A8 Z1 W
  262. popa" x6 M0 Y: b& i% w8 v* @
  263. ret. p, W5 ]$ c& @5 m6 q, ]5 t/ P! Z  w
  264. showmsg endp1 q7 a) J) X+ ^% @

  265. . N& R; J; O6 K7 f0 [: g6 f
  266. oldint proc% W9 c9 B* h5 z- V8 B( U) @7 Z4 v
  267. pusha
    6 Y0 x% ^7 ]( D  H) K
  268. mov ds, word ptr cs:[old331]
    : K/ m! z& b6 H7 l" C. Q
  269. mov   dx, word ptr cs:[old332]+ M. d( t& l1 Z/ ?6 u& q& e
  270. mov ax, 2533h' T3 k! @% z' `
  271. int 21h% c! F. c# D2 s. ~+ u# ]
  272. mov ds, word ptr cs:[old741]0 P7 L7 ~# W$ m, i# T
  273. mov dx, word ptr cs:[old742]/ A4 ~& B: W! a( o8 i* Z
  274. mov ax, 2574h
    4 G' z) C; s4 f5 k/ X, y8 h
  275. int 21h7 X  c+ m9 h/ h0 d  a) k
  276. popa
    ( Y7 p, c8 K; M# W% ^
  277. ret& g1 @  W# w7 f3 y
  278. oldint endp
    6 @9 A3 v1 e1 k3 F

  279. - a0 U- \& z' C, W
  280. memmouse        proc/ O: U$ q$ T* A0 H) E
  281.         xor     ax,ax) X( O: o4 C6 |% S8 {
  282. int 33h
    5 J5 t$ H$ ~4 F# @1 ~3 k
  283. cmp ax,0ffffh
    $ g# J- o) ~) m: e. Z( O' I- ~
  284.         jne     not_loaded! P% u) h2 t, `
  285. mov [memcopy], 1) O+ x; P$ x0 s
  286. ret
      s# H5 ^% b6 G+ D# d  `

  287. - T0 E' {9 f  X' u- `! F8 b% I- [
  288. not_loaded:( x6 a7 ?/ e" a  g+ @& W

  289. # u" X' F" [' x9 e) P3 L/ p
  290.         mov ax,2574h
    $ [, n, u. I: i
  291.         mov dx,offset new_isr' C  y1 U' N$ T) U- R
  292.         int 21h
    9 D4 J( _2 V/ w( ]

  293. & l0 G" U9 u4 F$ ^# K. n
  294.         mov ax,2533h
    3 u, a* b  H$ l
  295.         mov dx,offset new_33
    9 w; z- w/ \% @8 u
  296.         int 21h
    + R7 S0 h1 u2 ]3 Y; w" m0 F

  297. 9 G) f' {6 l: N+ k8 O
  298.         cli
    . i' ?0 j% W/ p' {( b

  299. ; F, m! n- F  X4 E
  300.         mov bl,0a8h% J# Z5 c8 t! i2 D8 Q/ O: ]
  301.         call keyboard_cmd
    7 L8 Y4 ^  D4 h2 L' ^

  302. 8 H% y% k" c6 v6 Y# t
  303.         mov bl,20h5 ^1 @5 b! A7 r. f+ K4 G
  304.         call    keyboard_cmd* M+ P# G/ B4 R& S1 N5 p& f. p
  305.         call    keyboard_read
    % z. }* A: h1 d0 m' i# K
  306.         or      al,2, g+ S" V  u& K3 X3 ~1 g  k, ]) m
  307.         mov     bl,60h% p8 v' ~: [0 F* g7 [3 ]- G
  308.         push    ax* ]8 \% L! u! |# F$ A! Q4 g1 t
  309.         call    keyboard_cmd/ y+ ?* [7 W2 N$ S/ [
  310.         pop     ax
    % R9 \( p& M2 `) R; A5 O
  311.         call    keyboard_write. O6 W+ g" G1 o5 d8 g
  312. , \/ H- e* x# R  W$ F7 N+ d
  313.         mov     bl,0d4h
    3 M- @9 Q" g. N* G8 K
  314.         call    keyboard_cmd
    - t0 L2 c) w4 W. {* _- A) p
  315.         mov     al,0f4h
    , W8 x5 n0 C' |% r* L9 ^; F0 d' \
  316.         call    keyboard_write
    0 B% p) h! \/ Z' s
  317. ) U. e3 F1 _7 l: S& D
  318.         sti
    5 E* @+ W. I3 o8 O, I- r
  319.         ret
    2 H3 P+ X: }2 d" w) m
  320. call_user_isr:
      s3 ?6 v- B/ H) Y% D
  321. db      60h
    + _: X  K. J" h; R( K/ g7 K% h( h
  322.         mov     cx,cs:[pos_x]
    ; X9 I; c8 a+ R- w
  323.         mov     dx,cs:[pos_y]
    ( H/ o$ m/ Y" i' ^
  324.         mov     di,0 ;cs:[x_move]
    . c9 J. k) r- ~$ X! i! ?, {
  325.         mov     si,0 ;cs:[y_move]
    - B1 [6 E: B$ A6 y. ]
  326.         mov     word ptr cs:[x_move],0
    3 a% K9 }& h' h, r' l
  327.         mov     word ptr cs:[y_move],0% |: w8 ]. v* q5 W
  328.         mov     bl,byte ptr cs:[buttons]! F/ B$ M( _0 O8 w( P2 @4 H
  329.         xor     bh,bh' \8 H' N$ }$ @* J/ \# F
  330.         call    dword ptr cs:[user_subroutine]
    % v" c7 s2 w  h# ^( F0 _
  331.         db      61h5 {% l% h6 `  w, S
  332. ret: r" W, Q; M6 F7 D9 Q
  333. new_isr:
    2 e$ T0 ~- ~+ Q7 j. S/ A& L$ j  f
  334.         pushf
    5 F+ r9 C3 |, i' T* d
  335.         cli
    2 }( \0 x' i) }; ?
  336.         push    ax4 O; |# ~1 B8 i5 }. L7 A8 i
  337.         push    bx
      Y, V1 ~$ q4 n7 M. j0 j6 r
  338.         push    cx- j+ p8 j7 v  e; u  L* G& A
  339.         push    dx
    6 B0 P/ p4 k5 m
  340.         push    di0 s  }" o) i0 K6 v( l
  341.         push    si- o! t& k) _" K
  342.         push    es+ t. q/ b! O$ X1 x
  343.         push    ds) I9 z( M& [/ M- E3 E: n3 ^
  344.   Z5 y0 [! G! M8 k+ ]! A) j: H
  345.         push    cs5 b4 Q' y  J, @: Q* T
  346.         pop     ds) n" [( G: e/ P
  347. $ g, b$ N1 F( |6 J! K3 p- ?
  348.         mov     bl,0adh
    7 E: M+ J  ~5 f! g2 V7 a# ?* O
  349.         call    keyboard_cmd
    ( N( m( M* b) m4 q
  350. ' X! z0 O- u9 ?1 P( j
  351.         cmp     byte ptr [first_time],0# j0 [5 T% u- N
  352.         je      not_first_time
    1 C  P6 q- X5 {! W; k' A

  353. 3 u3 `+ w" G, O1 O; L) g
  354.         mov     byte ptr [first_time],0, y; h* H, V6 K
  355.         call    keyboard_read
    ) _! O% e" s, P9 c
  356.         call    keyboard_read4 c$ X9 C3 O& p( H" W
  357.         call    keyboard_read/ ?: b$ D/ [1 n8 \$ R; ?4 W
  358.         jmp     no_show
    3 }' F, z3 \/ ]$ _; r7 q) F

  359. , U! `  X" }  `) g$ v
  360. not_first_time:! Q+ }. N# D6 J  u1 ^+ I2 V& c3 u1 c
  361.         mov     word ptr [temp_mask],0
    & h+ o% ^, C% v7 {, a. `) E

  362. 2 N/ X$ h9 l% H6 E$ B) |
  363.         mov     cx,[pos_x]
    7 M! f. y. a6 V" w' g  w( X) X
  364.         mov     dx,[pos_y]% A1 U$ f: V: @$ A$ P
  365. ; ?# @' k( p" j. \7 y
  366.         call    keyboard_read' `9 ?- }3 v2 i$ k( @0 Q( ^. r
  367.         and     al,7 ;3
    1 s* a+ j1 n4 h0 F6 x
  368.         mov     ah,[buttons]
    4 Q+ U9 e2 W- w( g
  369.         mov     [buttons],al
    2 e8 e9 P( N8 ]3 B. {; v
  370.         cmp     al,ah. _$ E- `0 U$ q7 w( `5 F) H% v9 R* W
  371.         je      no_button_change& b) m# u+ l: B, I1 W4 `6 W
  372.         and     al,38 g. W& }9 u* G# [9 n. ~: I2 T
  373.         and     ah,3
    " @7 J$ V7 S! @3 R# X9 n5 a- P
  374.         xor     al,ah1 N2 H: T5 L. O- D" A8 \
  375.         xor     bx,bx
    9 c1 h+ ]8 o- G/ W; n

  376. " w; U! c' ?  t8 F% Z0 w
  377.         push    ax  H; F) H. R0 s, y# D2 D6 ?1 m$ V# g* f
  378.         test    al,26 y3 ]: I- v) [, s# T: [
  379.         jz      no_right_button_change
    5 v6 {; O' H- K2 |; C- ^! u8 o9 b
  380.         and     ah,2
    1 |  J' q7 l& p
  381.         jz      right_button_pressed
    & I  _- H7 E- Y& g0 j1 ~5 e3 b
  382.         or      bx,16' {; Z0 z6 Z% G4 H- [
  383.         jmp     no_right_button_change
    8 _2 [# i" L9 V  R3 T
  384. right_button_pressed:+ f5 J8 I4 A5 k) u& Y4 h( s
  385.         or      bx,8$ \2 l1 d, W( B
  386. no_right_button_change:
    1 Z# K5 {2 e( A
  387. # s7 f% V! n7 H( I; i! J5 Z
  388.         pop     ax, f3 V( m7 ]1 x8 [' ]

  389. 6 N! }; d0 |! ?1 Q; Y% A) M
  390.         test    al,1# H2 Q& y1 ?+ w5 i
  391.         jz      no_left_button_change3 Y( ~  \+ I  d: g; d
  392.         and     ah,1% I6 a( F: y9 R2 g: ~2 i
  393.         jz      left_button_pressed4 [( r4 [$ `- B; y& E  o! _
  394.         or      bx,4
    ) r7 q8 p) G5 ~4 p
  395.         jmp     no_left_button_change
    ( c' \& ~- |0 h! }, }' E$ r( C! v, j
  396. left_button_pressed:- _$ `2 h. O1 |, v( `7 B( M
  397.         or      bx,22 Z3 ~2 N! @3 _" H) R
  398. no_left_button_change:
      i- Q8 M9 r+ W' `1 Z- ?$ ^# K
  399. ; S& f, j. X8 f8 r! x+ Y" b" g0 L
  400.         mov     [temp_mask],bx
    9 N  O2 g1 T0 b( O
  401. $ e+ L. o& N* ]: e# }4 ?; q
  402. no_button_change:
    . g, Y, [, C- Y1 c7 M( k" r& `
  403.         call    keyboard_read
    . R9 P- w9 P# S  f1 `7 s* v& [
  404.         cbw
    ! @7 C2 @" Z2 r- H% M
  405.         add     [pos_x],ax, N$ y: A7 ^! I
  406.         add     [x_move],ax
    ' `0 V) V* M. c4 O$ v  F; h
  407.         mov     ax,[x_min]1 S! m8 U9 a$ D- v
  408.         cmp     [pos_x],ax* A- x' x" B" K0 M
  409.         jg      good_hor1; s+ ^3 Q9 u* d: f% F
  410.         mov     [pos_x],ax
    8 R5 W3 D$ R+ n0 U
  411. good_hor1:6 O$ r! I$ J8 _, [$ \
  412.         mov     ax,[x_max]' b& J, }/ j" h7 k. b
  413.         cmp     [pos_x],ax: ?3 c7 }9 C" \% E- Y$ ?% R/ J
  414.         jle     good_hor2, K& k: n" w- {4 ]6 |
  415.         mov     [pos_x],ax
    . ~  }) Q. Z% Y3 Q, ~1 f$ P4 x
  416. good_hor2:7 ?% u9 G; H5 r: h

  417. $ J! a# D1 s+ N2 c
  418.         call    keyboard_read4 J1 X2 u+ b  T0 `
  419.         neg     al. ~2 {6 l* l- A
  420.         cbw
    / f' e' X: Z+ t2 r; M+ F& e& t( u
  421.         add     [pos_y],ax
      ?( C' S6 ?6 T# K/ ~5 O5 F( |  c
  422.         add     [y_move],ax
    ' f# e; Z$ l: a. K) y0 P
  423.         mov     ax,[y_min]
    ( Y# ]: X/ x3 C, C3 P$ H  f
  424.         cmp     [pos_y],ax& Q' M7 ]* D9 c
  425.         jg      good_ver1
    + l' E: j0 k3 J( R! B' x( I  l
  426.         mov     [pos_y],ax
    6 B5 T( O1 t- \+ _1 O
  427. good_ver1:
    $ y- c. |# ]# j" Q
  428.         mov     ax,[y_max]
    : `" W. f( z" T; u8 O
  429.         cmp     [pos_y],ax
    ' c( y4 G6 B7 L  X, q
  430.         jle     good_ver2
    # ]0 ~) I4 c  x4 Q& e
  431.         mov     [pos_y],ax$ E% @- |# ^0 ?
  432. good_ver2:
    ' e% v: n+ g# n9 ?6 l

  433. ( _1 J+ B0 u/ @7 h: v- z+ t6 x1 t
  434.         mov     ax,[x_move]
      r7 H" z7 j' c/ O  G
  435.         or      ax,[y_move]
    / y) M8 L+ q5 l6 u
  436.         or      ax,ax- L/ ?  `- W1 G: P8 \, r9 `( l
  437.         jz      no_change_position& j- L: ]$ ~% U* j
  438.         or      word ptr [temp_mask],1. D  e! Q: `# S0 |1 h4 k
  439. no_change_position:
    ( X3 a' F, }% ~9 w( ~

  440. % ]' z$ q  S* q9 m/ F  L
  441.         mov     ax,[temp_mask]
    $ ?5 _6 m3 Z& k1 v0 J
  442.         and     ax,[user_mask]4 G* C2 _6 l4 z( x' J$ J7 V2 U% L
  443.         jz      no_call_user
    ( H9 h2 g8 i. D  N: F' u& T, Z8 D
  444.         call    call_user_isr) ~' h! T: X% j6 O/ K! c& T
  445. no_call_user:
    5 n- A7 W& f8 b$ K

  446. 7 S6 ^4 r3 m6 x8 R
  447.         cmp     byte ptr [sm_flag],1
    : U8 `: _3 j9 |. Y- r
  448.         jne     no_show5 p! a) q% ^5 P; q: }4 W

  449. 1 z+ _% d2 A! B4 [
  450.         shr     cx,3
    ! [7 h, [8 Y" Q
  451.         shr     dx,3
    : V. g% W* C8 t, f2 {, p
  452.         mov     ax,80
    3 ~2 q& e+ p& V+ d7 }
  453.         mul     dl( q+ n# K& I# `5 T2 S+ o
  454.         add     ax,cx$ p* c; O6 w' r* W
  455.         shl     ax,1$ U3 g; H1 M6 T8 L2 E% U3 _
  456.         mov     di,ax
    % r, c, ]4 ]0 c2 }" n
  457.         mov     ax,0b800h
    ; W0 I) F# _+ o5 T( j  E, ]
  458.         mov     es,ax/ y6 h* ?1 {, w' Q
  459.         mov     ax,[save_char]
    . g; {; m* A& j, L) L- S8 N4 h
  460.         stosw0 U, t# X$ `, Q& [; [

  461. + u7 J4 |( w9 L2 C1 {+ |0 f
  462.         mov     cx,[pos_x]
    5 `) ^' w1 w/ m* I
  463.         mov     dx,[pos_y]- I( x1 d9 `. D8 a+ T
  464.         shr     cx,3
    ( V) d' E6 a% o6 }
  465.         shr     dx,3
    ; B6 N7 V; v. C3 ]( E; D2 f
  466.         mov     ax,80
    9 A) u8 S) w# t+ J& W' d( @. N
  467.         mul     dl
    4 `* M6 ~" c$ t8 I
  468.         add     ax,cx
    , ~" r( t0 n* z8 C' j; l
  469.         shl     ax,13 G1 z5 V9 T5 n9 S
  470.         mov     di,ax7 V, f2 y) }( I
  471.         mov     ax,0b800h9 c3 I* J2 P0 L( _
  472.         mov     es,ax% L$ L* f, }% m0 D4 }
  473.         mov     ax,es:[di]
    2 Q/ P6 O* _, Q7 r/ U+ {) q
  474.         mov     [save_char],ax6 a3 s! e6 V6 C& i3 X- E
  475.         not     ah# |& K' s( f. U5 ~1 Y
  476.         and     ah,7fh
    + s3 e4 [4 ?- h+ A" L
  477.         stosw
    2 L7 v, s* W4 ^' c% s+ Q3 [: c
  478. no_show:
    0 a7 i& i4 q0 h& ~5 {, ]) c
  479.         mov     bl,0aeh
    9 R4 G  ~6 g2 Z. A  v* b0 v2 n' S
  480.         call    keyboard_cmd# P# `# k) X6 k1 R, l+ i, ?9 U

  481. ( \5 {5 n! R; f, X) u* v8 l# r
  482.         mov     al,20h
    / h7 N# u, V/ }' e/ |. `
  483.         out     0a0h,al' L7 Y( `6 M( n4 Z9 e  F5 |" _5 ]
  484.         out     20h,al2 t) l  e# H% o: L8 ^7 [
  485. 5 [$ L# w. k6 L2 U6 X9 w# b
  486.         pop     ds$ u# G2 u& h, y( Q% u4 {
  487.         pop     es+ N/ v$ Y, }$ {) ?8 N; A1 f$ }
  488.         pop     si  v  d5 j3 N8 C- {* a
  489.         pop     di
    % t% g% E: J6 T- C
  490.         pop     dx. C( e! F' d! H" U6 E/ O  F6 Z5 g
  491.         pop     cx& {: d! h& p$ o. K9 G  o, Q
  492.         pop     bx! G' w8 E! M7 ]) ~
  493.         pop     ax0 [6 b2 p6 C* u. I: g9 j
  494.         popf
    " Q$ E* @, B1 q8 A& y4 B% q
  495.         iret
    7 {4 a0 |" |( X# d

  496. 6 S1 u( A& Q! c0 X6 f8 r) D- p
  497. first_time      db      1
    5 v6 r0 X2 `; W$ F$ q( q  y
  498. buttons         db      03 [" ^$ P- l( l- k5 I( X. Y
  499. pos_x           dw      0
    0 _0 ~! B) t- t) R( D% N
  500. pos_y           dw      0
      t1 o0 i% J+ S" [2 k- f4 C
  501. sm_flag         dw      0$ ]$ p' [7 F7 i# Y
  502. save_char       dw      0
    # K! F3 _: z2 q9 L
  503. x_move          dw      0
    & {6 F, ^- b- z8 }
  504. y_move          dw      0
    ) I/ u8 F, Y/ w* i1 h2 Y
  505. x_max           dw      639- a( Z0 ?" [, C: q7 G7 G" P& z' w" A
  506. x_min           dw      0
    4 T1 v3 E" g/ o2 r! F- s( h
  507. y_max           dw      199% y3 W& {- ^* ~* K* N" q
  508. y_min           dw      0
    : m: d. v8 K5 U9 w3 ?+ x" o
  509. user_subroutine dw      0,05 Z1 y) ?  i8 x/ o$ L9 F
  510. user_mask       dw      0
    3 T* ?) _2 A# y( R7 }& r5 [
  511. temp_mask       dw      0
    9 A2 X* b2 N( s% a+ K+ w) @0 P: o

  512. : w9 F( V3 _, @! c
  513. keyboard_read:
    % h& Q0 j& R) X7 L* b$ r* r
  514.         push    cx3 j7 ~# r7 L% U8 b  u. b* t$ Q
  515.         push    dx
    " S  a3 o  ^& h, E. d$ E
  516.         xor     cx,cx3 N3 Z( o& k& x8 y% Q! E
  517. key_read_loop:8 T5 E& i' d; w6 }. `
  518.         in      al,64h
    4 b3 \4 B1 N* Q2 I/ d6 f) ^
  519.         jmp     $+2. V, [) ^. J$ {$ ^) G+ J1 O6 I
  520.         jmp     $+2! j2 i* O4 E4 Z1 Q: a
  521.         test    al,10 n3 o' `: o  u0 K
  522.         jnz     key_read_ready9 m: Y+ r# h3 b) N6 T4 e3 C
  523.         loop    key_read_loop& U* D9 J! m, P" Q7 z- A0 G! o% s
  524.         mov     ah,1
    1 H; b. p& I8 e  A9 Z
  525.         jmp     key_read_exit- ?9 x  {6 V9 p: R% i
  526. key_read_ready:
    ( x. w; q2 N( q  A: a( O2 j
  527.         push    cx& w$ P7 V) W7 i. P+ ]6 ^
  528.         mov     cx,328 d& a) l% C% L7 x# G3 D& \: S
  529. key_read_delay:( Z9 r7 v4 T: D/ @. A
  530.         jmp     $+2
    ( P$ T. ]% |0 D
  531.         jmp     $+2, I6 S# F8 K1 F$ O/ H
  532.         loop    key_read_delay
    ( Z* I, y8 T' Q2 D! J' C2 L
  533. + Y$ G: I- n8 P- V
  534.         pop     cx
    ) t  B, t2 d) d( I# C
  535. , {6 t2 L9 ~( c+ c" l
  536.         in      al,60h% R* A9 f& P! H. C. [1 H
  537.         jmp     $+21 P  k  H6 s, H4 k. n5 A: s
  538.         jmp     $+2
    7 D# n: R1 I5 {3 I0 c4 S
  539.         xor     ah,ah
    $ l5 y0 {$ _/ D$ {( E; C0 O3 T4 l( {
  540. key_read_exit:
    # X7 W/ ]4 ~( s( Y1 I* d7 U8 @& W1 V
  541.         pop     dx' k2 P' L5 Q( {& E
  542.         pop     cx
    3 c. O3 B/ J1 v; M
  543.         ret* C( d9 P4 m5 K8 V6 ]2 f$ B4 P

  544. 6 |' B' F9 B) l' ^
  545. keyboard_write:& k0 N" r8 B% L) ]- J
  546.         push    cx5 p! M' p* o1 G; E) x0 ~
  547.         push    dx; M. y! A, c( f, u
  548.         mov     dl,al: s- y% i) t8 @; A* W4 g9 s% ?% ?+ C: I
  549.         xor     cx,cx
    4 ?$ Y* E, W- f+ K: D
  550. kbd_wrt_loop1:" z4 b0 F7 t' _' P6 n2 ^
  551.         in      al,64h
      e% M- b* S- U; j3 c
  552.         jmp     $+2
    1 @" Y) f0 j7 p& H. L' z) F/ a
  553.         jmp     $+2' j& s, X! n! x* e
  554.         test    al,20h- h1 [( _; k& [. n$ K( v) h9 J" K
  555.         jz      kbd_wrt_ok1
    - d7 A2 @  {. X1 S/ e( A" w

  556. ' y: _  ^* _: e: O: G# s
  557.         loop    kbd_wrt_loop1
      W  v6 J( N* U$ C+ m
  558. + L$ q8 V) Z4 ~4 A& z
  559.         mov     ah,1
    1 }! ^' D" x# |% w# A- z
  560.         jmp     kbd_wrt_exit- Y' \/ q9 {0 Q+ S7 O

  561. 9 j0 w& ^* A) o
  562. kbd_wrt_ok1:1 G9 e: E$ {2 t: ]1 W
  563.         in      al,60h
    * i% L: T9 i. D9 f+ Z2 \  u- N
  564. : }# h0 f8 w8 A" r. [
  565.         xor     cx,cx2 B1 P% M3 I# l& o% B/ {
  566. kbd_wrt_loop:
      e5 G  m- D+ p5 z2 ^* u
  567.         in      al,64h
    / f) {6 D+ E9 d, C3 V' P* K
  568.         jmp     $+2
    8 B% s) N: y+ e. a
  569.         jmp     $+2: U- h4 O( x0 X- ?, r; M" m7 t& n
  570.         test    al,20 K/ u; x) U& u9 V2 V& t
  571.         jz      kbd_wrt_ok
    , @2 t+ L9 F, M# v

  572. - X* ?. W8 z4 {* m, o
  573.         loop    kbd_wrt_loop+ R& f* t. i) \7 t/ |% _, K$ b
  574. ' w$ t% K" }2 k# O; k6 W. J9 e/ E5 t
  575.         mov     ah,1
    6 a" \6 Q- u) W# p1 X6 m% u
  576.         jmp     kbd_wrt_exit& t# z9 G; W0 q; N1 U6 Z4 v' ?

  577. % w9 C" h  B1 C+ V& A2 ?* S
  578. kbd_wrt_ok:7 T: u9 C* {5 Q, _# D7 w# Z3 S
  579.         mov     al,dl  B0 q& @: B+ x8 A0 o
  580.         out     60h,al
    / t, ~) {- b1 j. M: h' ~* E
  581.         jmp     $+2# Z. U. u# ~. X3 I: I0 O% y
  582.         jmp     $+2' c. {! g& i7 V" k9 I& M' _+ l

  583. . B: W$ L( _9 m2 h- k
  584.         xor     cx,cx
    8 X  M. H- V0 x8 H
  585. kbd_wrt_loop3:7 d8 f+ f3 z( p, x+ o
  586.         in      al,64h
    9 r, q' \* d" {+ F5 m
  587.         jmp     $+2
    / C" u1 e0 g. y& ~) ?, n/ S
  588.         jmp     $+2" D# s8 U. {* k. q) J* K4 W8 z
  589.         test    al,2
    6 ]2 a- I( t# h  F; X
  590.         jz      kbd_wrt_ok3
    ; E6 A6 l% x0 T: }! p, H/ j
  591. 6 ^) O6 D3 }8 z' G3 a+ |
  592.         loop    kbd_wrt_loop3
    * L- I, \* Q6 p8 X+ _( L) t4 u! m
  593. 3 ?: {0 o7 B7 V
  594.         mov     ah,1/ \( `4 S8 P2 e/ N
  595.         jmp     kbd_wrt_exit
    2 U8 [+ q# J7 A2 D/ m* D
  596. - h9 R2 U7 b7 _& Z1 ]
  597. kbd_wrt_ok3:, A7 J% U! W: c% ]5 ^: q5 R3 t1 y
  598.         mov     ah,8
    & K( _. q# I$ A/ f2 v
  599. kbd_wrt_loop4:- r- ]* D, _. G  e! E
  600.         xor     cx,cx
    ( U$ _# y! V" C( s
  601. kbd_wrt_loop5:- W' {8 P9 H( e, H
  602.         in      al,64h& r8 t8 ~9 n+ s+ J7 j
  603.         jmp     $+25 y) u* @' a7 R) U" S) l
  604.         jmp     $+2" @* _8 F  _: o: |; F
  605.         test    al,1
    " B: Y1 m+ P/ i+ O; \5 h
  606.         jnz     kbd_wrt_ok4. s4 s* p2 T: R1 z- j* Z/ \

  607. $ c1 Q' L$ ]5 P" z0 v
  608.         loop    kbd_wrt_loop5: C9 R! I: L- P. N" \8 P/ P7 T

  609. . l% M, N2 I- H7 F  w
  610.         dec     ah5 h8 m8 P7 w5 T! l: [# q% G
  611.         jnz     kbd_wrt_loop4
      P+ t* h2 w$ X: G  @" W: J8 S

  612. + z: t& k5 ]" c4 w
  613. kbd_wrt_ok4:
    1 y" [- x* B) M# _
  614.         xor     ah,ah
    # J8 ^( f9 H, @# T# ~8 s, B; {
  615. kbd_wrt_exit:, f  Q2 v) O5 h  w
  616.         pop     dx1 s: ?# j1 E# {7 N5 p* ]
  617.         pop     cx6 I$ h% _3 k" _
  618.         ret
    , f5 a7 n! ]; |) U5 s
  619.         
    5 r: o" @$ G  X9 L4 v5 @
  620. keyboard_cmd:/ H" A7 T- B' t$ }/ z3 C
  621.         xor     cx,cx
    ! v$ ~6 X9 z/ \  ~' w
  622. cmd_wait:
    0 ?% D+ F, C3 D
  623.         in      al,64h
    1 J, M0 J0 p" g& @( A9 p0 T! \
  624.         jmp     $+2( k; L9 x8 A0 a9 B( Z$ I/ V
  625.         jmp     $+2. U6 m. L8 x* A. w# H& Y3 w
  626.         test    al,2
    : y1 ^1 m% p' S: S2 Q. k
  627.         jz      cmd_send
    # ]5 H7 w, S% T; {
  628.         loop    cmd_wait6 |5 U# E" U" w5 a

  629. : f3 o) f1 L* n; N
  630.         jmp     cmd_error5 \. I+ `9 c' Q! @; L

  631. 9 g6 Z7 Q4 ]0 D' d- M
  632. cmd_send:
    0 t' h' j$ L  a* T
  633.         mov     al,bl
    2 k/ ^$ u# g& B) J* Q5 j3 y( h
  634.         out     64h,al/ E/ o/ q' ~& w
  635.         jmp     $+29 W" F& z! B, J# Y
  636.         jmp     $+26 x8 N! m) X! n5 o: N
  637. 1 `- j% s8 ]3 S+ V
  638.         xor     cx,cx, U1 e+ q+ a; j  b1 U
  639. cmd_accept:+ S9 A9 r2 N7 L5 I$ G7 j. K
  640.         in      al,64h
    1 Z/ D3 r' {% U6 [  X
  641.         jmp     $+2' Y& V  K% U0 Y, M8 t, K
  642.         jmp     $+2" r/ L% Y; G0 j, ]- d( _: t
  643.         test    al,2. T, l0 K7 }' H, b( B% h$ R
  644.         jz      cmd_ok
    . U! n9 y' i4 W6 @! Y/ }
  645.         loop    cmd_accept
    4 g+ e; ?$ d+ ^* ^- u  k+ q6 p
  646. $ v* B5 V5 x6 ?  V) b  o) A1 ^4 M
  647. cmd_error:
    $ r5 \. y+ i/ J. r1 W7 T  {
  648.         mov     ah,1& |& u2 y) X9 @" ^4 M  Z
  649.         jmp     cmd_exit
    3 y/ _; T& W0 z, n8 B- x, h
  650. cmd_ok:
    ; w' c8 Q+ |' H; h2 C  I
  651.         xor     ah,ah
    " O2 u; G. f) d& m
  652. cmd_exit:
    7 q' A2 i2 _' |- L- m' H
  653.         ret
    & r2 z1 O1 n# A- l) F

  654. / y. v! t) Y" z, R! s# ~3 s
  655. new_33:! _0 [$ y: A$ B; r2 U# M% z! {2 n
  656.         cli
      ]3 ?. s1 I3 _6 s7 T7 @
  657.         cmp     al,0
    " k  w& [3 l$ |/ G0 y
  658.         je      reset_mouse
    . ~6 ?+ x7 }- @: L$ p( U4 W/ Q
  659.         cmp     al,19 D' O7 {: i8 r; I
  660.         je      show_mouse' c. V. j+ H6 f9 c
  661.         cmp     al,2
    5 J3 d3 F( |% X0 ^' j$ |# X) x$ E
  662.         je      hide_mouse4 ^' L* Y3 o: a
  663.         cmp     al,3- i( r# u, @: F+ {4 c; R& V
  664.         je      get_pos
    9 l8 q4 z7 ]0 b/ }8 g& |
  665.         cmp     al,4
    + Z3 _* p" @/ i# W: Y
  666.         je      set_pos! V8 x# `# A2 Z- F1 c  n" I' y
  667.         cmp     al,71 ^1 q, h3 C( C) j  ]
  668.         je      set_hor_pos. ]) a" Z: L" D' f0 R8 e5 X$ C
  669.         cmp     al,8; `$ {, r) t7 z
  670.         je      set_ver_pos7 u$ G& A  F3 V* H5 D
  671.         cmp     al,0bh! I3 [. D4 |& M. [1 M5 M/ l
  672.         je      get_mouse_movement
    % x( H9 V% @  n$ f. z, I6 X& D$ `
  673.         cmp     al,0ch
    0 @& `$ V1 U% b; ~" O7 z& _* L6 c
  674.         je      set_subroutines, s* ~) p' J: R1 V; B
  675.         cmp     al,14h
    / q! d1 V) ?' v
  676.         je      swap_subroutines4 y. u$ k) O$ G2 N9 c" G% f, i
  677.         iret
    & i; B* \: G+ }

  678. : D6 M- P+ n% f( O
  679. reset_mouse:
    4 J/ ]( `* y2 ^& ~$ T& ~
  680.         jmp     _reset_mouse1 Y" |* g. Y- z) ]* @( w+ n
  681. show_mouse:
    ' O" _6 l1 q( G; ?* j# P
  682.         jmp     _show_mouse
    ' @' C# |& x% j4 J. S& t
  683. hide_mouse:
    7 i/ w7 q/ t* a/ t
  684.         jmp     _hide_mouse' h0 m3 c  G( k0 R3 c1 y# k
  685. get_pos:
    % I) @  G8 ^: N* g1 ]( }: d/ @
  686.         jmp     _get_pos
    ; e4 y6 z5 ?2 Q8 A+ a8 b7 P
  687. set_pos:
    # s1 l# [+ v) q+ F
  688.         jmp     _set_pos9 w" G/ ~* m# g: g& C# J
  689. set_hor_pos:; q. v5 R. k/ k, t* ]
  690.         jmp     _set_hor_pos
    , J. o& g/ |1 c; x+ y/ V6 R
  691. set_ver_pos:
    4 Y( p: e* D5 [7 s
  692.         jmp     _set_ver_pos
    " I% a; o& V. I* @; {: G. X, ]
  693. get_mouse_movement:
    * @4 n2 o% E* O% s* \+ n
  694.         jmp     _get_mouse_movement
    1 S4 p& c3 p! G7 N* P: }
  695. set_subroutines:
    9 j, Q8 _# [2 n  l
  696.         jmp     _set_subroutines
      f% V, A5 b4 f' M1 e' s' ]
  697. swap_subroutines:
    1 {$ c3 \& p& X6 |2 R3 v0 X: _
  698.         jmp     _swap_subroutines- o  F8 @# y0 `

  699. ' f) U& c' b: V  A7 H* |- H: E
  700. _reset_mouse:$ G9 `7 f9 ]1 F. ^  P
  701.         mov     byte ptr cs:[buttons],0
    6 D. E! \; N- l" {- N' z% B" `
  702.         mov     word ptr cs:[pos_x],0
    ( Y% z+ a7 N& }+ I6 w# k2 Q' _
  703.         mov     word ptr cs:[pos_y],02 x0 l/ _3 L  U, A
  704.         mov     word ptr cs:[x_move],0
    4 a4 m! G4 I0 [9 S
  705.         mov     word ptr cs:[y_move],0  }) x- X. ~; k% Q5 `
  706.         mov     word ptr cs:[x_max],6396 Q: F6 B5 D2 o5 J* H. Z
  707.         mov     word ptr cs:[x_min],0
    5 C2 e6 y4 v, A, X
  708.         mov     word ptr cs:[y_max],199
    ; U- C+ S6 g. D9 j2 Q# {
  709.         mov     word ptr cs:[y_min],0
    ! v! x& x* K$ A& n  C
  710.         mov     word ptr cs:[user_mask],04 V8 q9 g* g9 o
  711.         mov     word ptr cs:[user_subroutine],0
    . g0 s9 [( G" P& n" w- v; @
  712.         mov     word ptr cs:[user_subroutine+2],0) S& i( f" |4 f
  713.         mov     ax,0ffffh
    ' n6 T8 M( ]- _: C2 B
  714.         mov     bx,3  Y: Q6 Q% m& v4 M, W. ~* n
  715.         iret5 h2 r0 q% l- G/ k$ _3 Y/ q

  716. 5 |7 a; T) _. \3 F' @3 D4 d
  717. _get_pos:
    ' ^/ u; Q3 I& F8 i! y: Z+ V
  718.         mov     cx,cs:[pos_x]/ ~5 n- ?5 Z+ n5 u% i
  719.         mov     dx,cs:[pos_y]
    ; _4 o0 w/ f1 H% G6 ~
  720.         mov     bx,word ptr cs:[buttons]
    2 [& Y$ y2 k( X+ X
  721.         xor     bh,bh, Q/ H! N5 M7 O! z
  722.         iret
    6 m) {: {4 P3 B# K( L& N- m: Z1 D& G
  723. * f7 o6 F7 k) y: q4 n. W; f8 P  K* q. _
  724. _get_mouse_movement:
    " E5 ]; c$ p& a: @! y! \( F- t
  725.         mov     cx,cs:[x_move]
      c8 Z% P5 |: Y
  726.         mov     dx,cs:[y_move]( ?% T' S6 I8 }8 o' Z4 v3 j, a6 \$ U
  727.         mov     word ptr cs:[x_move],0
    ( K0 a- n# ^6 [/ E2 J$ L
  728.         mov     word ptr cs:[y_move],09 V/ L) v0 U6 _5 E. j2 J1 Z0 D1 Q* X
  729.         iret
    8 M- {+ X3 i. |( Y& f0 d- V0 P
  730. . ^- W: X+ t$ P: ^% B. V
  731. _show_mouse:4 n" B1 W  e: Q
  732.         push    ax
    2 [6 k9 p4 F: W* k( g
  733.         push    bx
    ! y$ D7 O) H* ], A  \8 E) x
  734.         push    di
    / a1 Y& S& s# z- T" D
  735.         push    es/ Z. @1 F; v* \8 e
  736.         mov     byte ptr cs:[sm_flag],1
    ! q& h  F3 e- ]& ^3 B& M
  737.         mov     ax,cs:[pos_y]/ x1 g9 F' A. b% u
  738.         shr     ax,31 o6 _) c+ E7 ~: H- s  n- ?, i
  739.         mov     bl,80
    4 O% \/ z2 e! @9 n0 _8 @* e& ^* U- _  e
  740.         mul     bl
    ( r" @' R1 Z: M9 B
  741.         mov     bx,[pos_x]4 x/ {& l1 O7 M
  742.         shr     bx,3
    5 U9 f: r" Q. O, O7 j
  743.         add     ax,bx# O+ l3 r3 S2 x
  744.         shl     ax,1
    / w3 B* z- V! ?9 x
  745.         mov     di,ax3 N: h9 @$ I1 m) W7 G
  746.         mov     ax,0b800h
    . y4 t/ I" [5 w3 g) q7 j+ }
  747.         mov     es,ax
    ; g( q- k4 [2 i  l1 P
  748.         mov     ax,es:[di]
    ) v7 Q9 g; `7 \( q" A/ z
  749.         mov     cs:[save_char],ax1 e* V0 v* ^" O( O+ K7 r
  750.         not     ah
    ! i0 J  d8 c. w5 a- G! P
  751.         and     ah,7fh" S/ F+ W& `' n/ m& c
  752.         mov     es:[di],ax
    $ x$ w- k1 {. x7 X
  753.         pop     es
    9 p8 C* a0 u/ T+ `
  754.         pop     di, A1 g8 E) J9 W: n: D
  755.         pop     bx
    * v- B* i+ T3 l8 \  x5 E* p
  756.         pop     ax$ T1 M5 }. l+ I0 m% o4 D
  757.         iret7 K/ ]  S* |3 L; R
  758. " M" t, Z" j2 Q/ L0 r
  759. _hide_mouse:$ V5 [9 {  L1 t
  760.         push    ax) H  Z2 o, @/ m* W' M0 z2 Q
  761.         push    bx
    " u& D! `+ ]' n% j+ g
  762.         push    di
    / n7 u. c: {' k1 u1 l
  763.         push    es
    , O' h* q( Z" {+ N2 X
  764.         mov     byte ptr cs:[sm_flag],0
    7 V5 j- L! A8 s' l5 I5 c5 @, _
  765.         mov     ax,cs:[pos_y]
    $ ^( s* F( a- O0 l
  766.         shr     ax,3
    7 n2 q7 f# v; e# n, K
  767.         mov     bl,80. D/ C' W) z4 d4 u& c
  768.         mul     bl1 I( E5 N6 h& c$ a5 [7 w, K
  769.         mov     bx,[pos_x]
      }4 K) u. k" |
  770.         shr     bx,3
    5 O" T# l1 @. v# D4 n
  771.         add     ax,bx
    , B. h3 L% O0 c
  772.         shl     ax,1+ y3 _. s! n* g5 i. g' {; x' f
  773.         mov     di,ax
    0 ]! n# Y/ ^0 ?
  774.         mov     ax,0b800h1 F  W8 ~, s& t6 Z# A
  775.         mov     es,ax
    ! I+ V+ {. W( \* L0 ]' h
  776.         mov     ax,cs:[save_char]
    - h& u4 d) L& a9 S1 H* N
  777.         mov     es:[di],ax
    4 R& i& l. V6 R# e/ R3 _( K! F
  778.         pop     es
    2 k( G+ j" \$ t& N1 V, x8 m0 N
  779.         pop     di
    2 }3 b" V9 J  q1 ]% P' {$ w
  780.         pop     bx
    ; B  p) D5 B0 E# W0 R
  781.         pop     ax7 c( a1 g" i3 q- W$ s
  782.         iret
    ) L0 v4 p/ K$ v0 E' i9 m
  783. * h7 y9 L+ w! N
  784. _set_pos:
    ' x" T1 v& B' D. ^% C3 d% r
  785.         mov     cx,cs:[pos_x]9 V  o+ J3 h6 ^' Z; U' l
  786.         mov     dx,cs:[pos_y]* g' \  n9 X' a2 {9 a0 }4 V
  787.         mov     word ptr cs:[x_move],0* g4 Z2 @# g9 }% f1 ~
  788.         mov     word ptr cs:[y_move],0
    : w7 E" J% \3 y2 {& q
  789.         iret
    ! n' z6 ^; m1 b* b9 V& \6 F! O" k

  790. / z8 f7 T( H/ C
  791. _set_hor_pos:
    5 [$ e; ]4 N# Y0 K+ g
  792.         call    max_min
    2 J; O- ]% l3 |
  793.         mov     cs:[x_min],cx
    & q* S. J' q5 \$ g8 D
  794.         mov     cs:[x_max],dx* {$ h/ U+ B3 \+ \& F* Q3 h
  795.         cmp     cs:[pos_x],cx
    $ A, P# {  \4 t" \6 p; W) R, P
  796.         jge     good_hor_min+ j$ q) F# A0 J9 e% C
  797.         mov     cs:[pos_x],cx8 P% G% Z: V* I" o5 x& R4 S5 s
  798. good_hor_min:. e( I3 z( _  G5 g) N: @
  799.         cmp     cs:[pos_x],dx$ I8 A6 m+ y5 ]; L/ e8 `* F. {4 ^0 s: V1 W
  800.         jle     good_hor_max, o0 R! N& Y8 l* N
  801.         mov     cs:[pos_x],dx
    / `9 p* v9 W4 l+ \% b
  802. good_hor_max:$ u7 ]9 z' l5 _
  803.        iret0 u) M* L3 c7 @- }  k7 R0 L% f
  804. 8 \& B- I/ n5 ^# l1 U3 [
  805. _set_ver_pos:
    ( O7 _3 `# f4 o# Y
  806.         call    max_min( g  u5 X% [2 N
  807.         mov     cs:[y_min],cx4 r0 M, u. H1 `3 e, m
  808.         mov     cs:[y_max],dx" X7 J4 L( B, H0 ^
  809.         cmp     cs:[pos_y],cx# r" x* j+ K" Y/ m
  810.         jge     good_ver_min, A  w: o) e% n! r2 r* @
  811.         mov     cs:[pos_y],cx
    4 `0 s5 Y. a* M# _) j$ P
  812. good_ver_min:9 x9 y) M# D; w! ^. M2 s4 |
  813.         cmp     cs:[pos_y],dx
    / H7 J+ V" [- p/ W9 h! U6 V/ _+ n
  814.         jle     good_ver_max( m0 V# w) J6 a1 x8 m6 b
  815.         mov     cs:[pos_y],dx
    ( J' f; ^4 q$ j& S6 v* B
  816. good_ver_max:
    3 l* k0 B& ^3 Y" J; h
  817.         iret6 o' q! X5 |: _/ L* Q8 |

  818. 7 Y% o6 U0 ^4 z6 g# V; [
  819. max_min:
    ) o& Q% I9 K: ]5 c/ k
  820.         cmp     cx,dx6 ^+ P! n& f: B) E
  821.         jle     no_swap
    ' A4 z# `9 M9 J/ L, `- q; |! T1 V
  822.         xchg    cx,dx8 p& z% U3 r5 r0 A) i' z
  823. no_swap:
    ! Z6 {: r' K, F  S- M
  824.         ret
    % g' j; @9 l6 }7 Y8 h1 x
  825. ' m. K) S$ z, X4 q; N, s
  826. _set_subroutines:
    1 e( N7 x3 b* w
  827.         mov     cs:[user_subroutine],dx6 {! W2 v7 i% E  m/ Q$ c0 V
  828.         mov     cs:[user_subroutine+2],es" @& H2 e$ g" R7 l
  829.         mov     cs:[user_mask],cx) P& q1 Z7 t& {/ v8 R- d
  830.         iret
    8 `2 A9 J' r" c$ j" ^; R! n# r
  831. - D9 S3 T, N% [
  832. _swap_subroutines:
    5 N( d/ D0 l5 y* k& q3 H
  833.         push    word ptr cs:[user_mask]
    ( O, `( N) I" n# x( e5 ]
  834.         push    word ptr cs:[user_subroutine+2]
    . W: I4 J4 G) J+ z. w* a
  835.         push    word ptr cs:[user_subroutine]
    5 _$ ~$ {/ Z/ b5 d
  836.         mov     cs:[user_subroutine],dx
    1 U4 A& P( ?3 x0 p
  837.         mov     cs:[user_subroutine+2],es
    2 W$ D0 N* d% P" k, C& O4 Y
  838.         mov     cs:[user_mask],cx
    : t7 E6 B' ?$ q; ]. P$ ?8 }
  839.         pop     dx
    6 L3 G5 z: `5 b
  840.         pop     es7 {( M8 l0 S5 r2 x
  841.         pop     cx8 U! V2 d2 c/ E$ V, D
  842.         iret: N2 t4 u) d5 H1 Q, T9 p% Q

  843. ' k( @' r8 e, t* Q+ W
  844. memmouse        endp& X& h( q  V8 C+ W9 e
  845. 3 i& f: w  ]$ P2 n( \! k
  846. endof_start:" N: x$ c" q% _- K- m9 Q! d
  847. 1 `5 j8 k# q& C9 x2 T# X
  848. emsg db 'No mouse driver install error!$'
    6 x6 Z$ q6 V  e  z# m
  849. old331 dw 07 Y- g5 [0 c2 k/ `
  850. old332 dw 0
    6 ]& k0 V3 V% a0 _( p3 {2 v
  851. old741 dw 0
    4 y. Z* v5 N3 @% \
  852. old742 dw 0$ l3 g& g; Z" J6 F
  853. memcopy db 0
    ( ?$ R. L6 Q0 @8 c
  854. okcheck db 0
    , P+ B" s7 [0 I& I. g+ f/ X
  855. pass db 09 R1 L, T3 w. L- Y0 Q- F* _5 `3 C
  856. chkl db 0
    " i) a* d" j2 T* c& Z! S
  857. lk db 0; i" a- z- I* p
  858. chkr db 0+ p# x8 k+ P8 q2 R
  859. rk db 01 v% V, }; K( }8 H3 S
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '% f1 `( |! n! t( {! ]3 @/ R( L
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    + S- H5 h# `" {# T; C  H3 ^; N
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    , J) z; `5 }$ `" ^1 z6 H
  863. db '                                                                                '
    2 H# _2 {4 j# ]5 E
  864. db '                                赏屯屯簧屯屯突                                  '
    - p& z- Y$ [& t: |" D- F2 z8 }0 q2 O
  865.         db      '                                ?OFF汉OFF?                                 '* C( w. R: x8 [0 R' k+ P$ `$ B& c
  866. db      '                                韧屯屯既屯屯图                                  '
    - n2 I# S6 R, L5 b# X
  867. db '                                                                                '2 G: T& Z$ j# j+ I' K( b
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    ! K# y  p& p" z/ i0 a. u
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 9 C1 h, c* h8 D( p
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    * q6 G& G8 B/ q( Z* X& P
  871. + {) [9 m, h: a
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
8 Y& J7 o4 j  ]9 A1 i6 s哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
$ a/ E! G# b1 y  T
1 @, U# {5 G# _8 T1 `0 J' m谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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