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

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

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

- n3 S, p  i7 u9 M代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;7 a* r. x1 [3 a  w) g! _& q
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9( Q2 s2 z6 X; k
  3. ;                                         By Bini.Yi 易祝兵  @2 y4 G( I, l- d7 Y4 v# T
  4. ;                                         http://www.ufoit.com 计匠网7 Z" n# B. C/ m' h
  5. ;                                         2002/04/06 YYYY/MM/DD2 [: @- l4 \* V7 s
  6. ;
    0 }; B7 t7 k; t5 W0 i
  7. ;          & @2 R+ Q/ g4 [5 {$ \9 R
  8. ;          This program  test the mouse button  click and move.
    * X' e; N: W" Z3 c. }5 Q3 p1 n! o, I
  9. ;
    " v: w" O1 U' U& _/ O- C1 R- A
  10. 7 `/ r/ r% X& ~, I
  11. .model tiny1 T) s( p3 h/ b+ v5 H0 {
  12. .586" t( y  k! J0 \
  13. .code
    ; A( q' W" Z! h
  14. .stack  100h
    4 r4 i( }: n4 D' V
  15. .startup0 S5 ?! f( Q2 A
  16. pusha. d6 l" _8 d# Z' ]( L8 C$ q* j
  17. mov ax, 3533h
    " X% r% H3 ]1 q" w' `$ D
  18. int 21h
    ) M; j, I6 l2 s: \, }2 W0 ]5 g
  19. mov word ptr cs:[old331],es
    ) H+ Q  M& p4 a( F, @
  20. mov word ptr cs:[old332],bx
    2 z- d. ?9 J  p' X/ ]
  21. mov ax, 3574h
    4 I  V2 ^1 k, `4 E5 q+ G3 I
  22. int 21h
    / x" l! z5 j4 v
  23. mov word ptr cs:[old741],es  \1 M0 q; r2 c  r! W, k& g
  24. mov word ptr cs:[old742],bx. m+ y) u/ P4 E# _) u0 \
  25. popa5 A: g) f* ^/ f; _% m8 y
  26.         call    memmouse
    . T9 d$ ?( h2 c9 M" u" p+ \1 f
  27.         mov ah, 00& K) H7 D+ \2 v# E' V; H) M
  28. mov al, 03
    % J  d0 Z  r4 I! x* K$ z! m0 i* V9 X- J
  29. int 10h9 ~9 ]+ t' g) N$ Z
  30. mov ah, 06
    ( _' {, ~( C7 x- ^) r# q
  31. mov al, 0; |2 C, D! v, {  v; Q
  32. mov cx, 0
    7 j7 t9 D( d' U0 P! [9 p$ N* m
  33. mov dh, 24
    4 R/ ^2 c7 d3 @( g& J3 j: D
  34. mov dl, 79
    & s* |  R- T4 \, _- ~0 e
  35. mov bh, 07h
    # ^: X, {" W8 P# ^. m
  36. int 10h0 m) j, K6 }5 r0 o$ j- X
  37. mov ax, 0000. L0 e- }2 O, X/ v# R$ c$ z
  38. mov bx, 0002
    ! F9 `9 _2 x. j! P5 d) x& l) ?
  39. int 33h! G7 y# d* ?* F% c0 s
  40.         cmp     ax, 0000           ;if no mouse drive install
    " d; P8 ~* v  X" C3 q. g( H# ~& Y
  41.         je      errormsg           ;show error MSG
    9 {! M3 ]" n+ F1 N, z
  42. mov ah, 02
    # k* [# z% n- Y5 |. P6 ?
  43. mov bh, 00
    8 m0 \/ U# M4 y- n  V
  44.         mov     dh, 25             ;Move point out screen
    7 f" I& d  h% H
  45. mov dl, 79
    4 S2 a+ O- o+ r" `
  46. int 10h0 ~1 r- g  k3 P$ C; [
  47.         call    showmsg            ;Show info+ l. i4 `9 K0 {
  48. mov ax, 0001
    " ~2 E! d0 ~' C" D) u; a
  49. int 33h3 J- [4 z. ]' j8 `
  50. ; mov ax, 000ah
    ( J$ O* Y, }0 g0 T3 Y, z
  51. ; mov bx, 0000
    : k  D& F" R$ c
  52. ; mov cl, 0h
    % s; G/ V' A- ~
  53. ; mov ch, 0F0h$ q( \5 O6 W1 A! f2 r' h2 A
  54. ; mov dl, 0h% R3 S& `# c8 ^) }" e; s3 j8 W
  55. ; mov dh, 0F0h4 G: K8 ^, S6 t0 L8 W4 g
  56. ; int 33h
    % U$ M  A. C. `& y7 v
  57. mov ax, 0004h# \8 K# L( n! N* @$ G
  58. mov cx, 0319
    4 K& h5 d; o; S) m7 `) T) M9 Q
  59. mov dx, 0103+ c2 A! Z, J7 m, b
  60. int 33h
    5 n/ d( H% `& m
  61. casemo:                           ;Case button click and point move 8 ^1 ]# R3 J/ i' s6 W, a
  62.         mov     ax, 000bh         ;and keyboard press
    5 D' B$ N$ r: S0 L8 L) O1 U; }
  63. int 33h! S) S, {- X$ Q1 X0 d% a( j* C$ T
  64.         cmp     cx, 00h           ;if point move....X0 d( @. M& F  D
  65. jne xmov2 H6 P. D: W7 a$ a0 `
  66.         cmp     dx, 00h           ;if point move....Y# l( I# s. A+ k1 G0 e1 q, D( R
  67. jne ymov5 I: V; E9 w5 L7 i# J+ m
  68. xymovend:                         ;X.Y move end' d1 l: a* J4 ^) O7 p2 u
  69.         mov     ax, 0003            i. s3 z* f0 `6 l- Q4 ~7 Q
  70. int 33h$ v8 _2 z0 T1 W9 J- _" X
  71.         cmp     bx, 0001          ;if left button click  show ON! p* U$ z$ w2 N7 u
  72. mov si, 1828  I: G& C+ S3 c& R3 n' e3 x
  73. je listl
    ! S* I) L/ [+ i8 ?0 C
  74. mov si, 1828
    & W0 N, z* I) g+ w3 i5 i
  75.         jne     nlistl            ;if left no click show OFF
    9 P, N% N& _* I8 D
  76. testr:$ e  X. A# }1 V/ B+ ~
  77.         cmp     bx, 0002          ;if right button click show ON
    " n- q7 X$ D  U( H. j2 {& L$ i
  78. mov si,1842
    ( e, _- C" Z1 a! I1 \! i9 s1 X# Z5 s
  79. je listr
    6 L) n4 L, Q, n% c0 Y( g: B( y! C
  80.         mov     si,1842           ;if right no click show OFF
    9 T. L% K  o0 B6 \% ^5 S: A
  81. jne nlistl
    ( M9 [* \$ Y- C6 t( ^. p
  82. casekey:
    - H) J$ W. K, R& }
  83.         mov     ah, 01            ;if any key press jump check
      L* c: k( w5 z( l# c6 z% k. U
  84. int 16h3 g8 x( E* c8 h4 @
  85. jne kpress, A- N/ [  P- I0 y
  86.         mov     al, [chkl]        ;check x flag
    4 U' v7 X8 F1 d4 m' {3 t
  87. cmp al, 02h
    8 D5 O7 U) r3 @
  88. jnb chkok) P2 C( d" b2 ^2 \
  89. jmp casemo
    ' o5 c' ~) G6 ^; J
  90. xmov:                             ;if X moved, get the X flag+16 q! D' m$ u  K
  91. mov al, [chkl]2 a& Q  Q, C6 \! F: c! O/ M: d0 G
  92. inc al; ]0 d$ e# H, d% l( w& G7 }, [5 M
  93. mov [chkl], al) @' U) N: r0 U5 b) h8 |7 I( ~% l/ O: q/ |
  94. call passok
    1 W; ~2 ?' \6 j6 T0 ^
  95. jmp xymovend- I% G( S3 F7 h; U( J
  96. ymov:                             ;if Y moved, get the X flag+17 {9 ]5 F# C! K0 h
  97. mov al, [chkr]
    , i! e0 z6 N; H/ K( n8 c6 S
  98. inc al
    - {8 f, W9 c* A! a* t" M
  99. mov [chkr], al
    + _* w' m- ~' t. c
  100. call passok( s2 t! V9 U2 t2 M3 H$ s* }4 V
  101. jmp xymovend& \6 K' l6 W" N. l) F+ W4 t/ m
  102. ( E9 A: r" B3 t! i% E# T5 j
  103. passok proc near
    2 u* U2 V( x! |) o3 M2 _5 U
  104. mov al, [okcheck]
    1 g4 G- j7 u0 t
  105. cmp al, 1  \7 S4 \& @( G4 s* N( H
  106. je let09 x8 ?( e  e! o/ }/ y3 D
  107. jmp passret+ M  ~) L: x% m  f4 }& W0 @: Z
  108. let0: $ n( b7 P: w6 v8 r
  109. mov [pass], 18 Y' n8 X: F7 s6 F
  110. passret:
    # x  K+ n7 G. g9 y4 f" D
  111. ret: f  Y8 y2 k( X/ ?7 U; f; o  T
  112. passok endp ; V- E9 p; ?- y8 P( M

  113. 5 j/ ]% T- }3 ]% e/ p' u
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS' f, z1 j/ a; n3 H. S
  115. mov al, [chkr]
    & ~: F! }* X: n6 M
  116. cmp al, 02h2 Q+ Z# I' t& C
  117. jb casemo. B: P7 s# c+ [! Z, c
  118. mov al, [lk]
    6 K- ]. L& G! k2 ]1 p
  119. cmp al, 1
      d5 U2 r; s' v* R$ B
  120. jne casemo
    , {# ]( u) c7 @  G' V$ T8 T# T
  121. mov al, [rk]
    $ l* V; R$ M. q- f
  122. cmp al, 1
    1 F, l% {/ O, o# N" Y  a2 p
  123. jne  casemo
    3 U$ E2 r' _% O5 M8 e
  124. mov [okcheck], 1' p2 f' c/ Z8 J
  125. mov al, [pass]: g& y- `% A& e5 L- W
  126. cmp al, 1! q. z$ R+ z# t5 q: ?+ K$ r
  127. jne  casemo
    4 o- a7 y5 Q/ G9 v3 ~0 q2 K
  128. mov ax,0002h0 S& R6 M* B6 s7 o& r9 x
  129. int 33h4 ~2 m* s' R6 D4 w0 \* d
  130. call cleascr0 j* x! K' g% n$ \7 E
  131. ; j( `9 f! H2 O1 X: P
  132. call oldint( Q" `& m$ W0 |0 W1 }  g0 b7 C
  133. mov ax, 04c00h/ d& l$ [& z$ Y$ v9 ]: e
  134. int 21h. a" E+ s* o' {

  135. 2 I7 [  _1 [; z% c
  136. okexit:+ e6 z* x, ~: _. m4 \, ]
  137. mov ah, 4ch
    % H' T! M* T8 G8 A) b
  138. mov al, 0
    * W6 s4 {) j, n3 s- A7 K  q8 p& M
  139. int 21h% V  I9 g* E( j
  140. listl:                                 ;Show ON9 l. A7 w! w4 C( |" C* t
  141. pusha
    % X) u8 d( f( F- \' ~
  142. mov ax, 0b800h0 \2 u# w5 g  f' P5 z. v
  143. mov  es, ax. A2 q6 ?* m: R) G; g& Y3 }
  144. mov ah, 47h  C- Z& U+ g* C9 c! C+ F
  145. mov al, 20h
    " x% j9 x2 T  _+ R4 E! B1 a# i
  146. mov es:[si], ax3 w# R9 Q/ M+ Q8 ]2 n
  147. add si, 02* {% ^1 E$ n: B4 r" N9 m
  148. mov  al, 4fh2 Q! q. J/ R$ o% U3 d  `( `# {
  149. mov es:[si], ax
    / u- G  o' j% C8 t# b7 }4 r* C
  150. mov al, 4eh# C3 ~% C8 |% ?- T
  151. add si, 02$ y) R" n  O/ y
  152. mov es:[si], ax& Y; u4 u( B: N6 _
  153. mov [lk], 1
    # s  ^+ |( `6 a! m' n( t9 V
  154. popa
    3 i) s9 O8 u  z
  155. jmp testr
    * @8 I0 u" ~0 C2 d: e
  156. listr:                                 ;Show ON
    : E& U- s! I+ y
  157. pusha+ Z- T6 _6 S( u3 ^5 R7 `' R! Y
  158. mov ax, 0b800h
    * X# k0 H$ j% @6 w2 z8 r$ y
  159. mov  es, ax& c9 _- E. N9 h2 {
  160. mov ah, 47h
    9 |* A/ S. l' K, d2 ~, Q
  161. mov al, 20h; p4 K0 I5 G2 ~4 q' A# @9 i! |
  162. mov es:[si], ax5 U! K9 N% \# H2 B- G3 i7 v
  163. add si, 02
    8 G5 ?& ^4 W2 H1 w
  164. mov  al, 4fh$ k* }. u6 I0 a5 M* S
  165. mov es:[si], ax! ~2 b, [" a. k
  166. mov al, 4eh
    9 C% T2 j8 Z8 \  s& e- J
  167. add si, 021 r- q* b) P) [5 h: t
  168. mov es:[si], ax% y4 _, S9 v: ]2 E3 G/ L
  169. mov [rk], 1
    & R1 [% i& _1 z" A
  170. popa
    3 D/ N" ~2 Y! @
  171. jmp  casekey# v# J' E0 K9 j" [2 r( y8 E
  172. ! C+ X6 Y. t6 T! F. Y
  173. nlistl:                              ;Show OFF* n. D! K6 J% S: K, s% |2 l
  174. pusha     F/ S7 y1 ?; j* C4 a
  175. mov ax, 0b800h9 {0 S: m& `0 l& ]9 N
  176. mov  es, ax5 f6 O9 n4 J8 B9 g$ B, U( ?" A
  177. mov ah, 17h3 C9 u  v+ O: i+ D
  178. mov al, 4fh) I% K: p6 ]4 }+ a
  179. mov es:[si], ax8 c$ ]4 x! r8 b  s: n  F
  180. add si, 02
    6 ~& e6 h# t! N% X0 ]
  181. mov  al, 46h$ R. p" Z& p8 L9 Z" E
  182. mov es:[si], ax& C4 c2 j0 w  c: ]) t
  183. mov al, 46h
    2 p* W! Y* I* B" b6 H2 h/ i' R' E# Q
  184. add si, 02, t  _9 c4 L; P/ M" ?2 I
  185. mov es:[si], ax
    % N, q( `* [& l( G9 h7 L
  186. popa
      w+ \4 }# M4 c3 R9 B
  187. cmp si, 1840
    * }1 F+ ^! K: w  _( q/ ^
  188. jae casekey
    . w$ |1 D- H' w! b* a, I
  189. jmp testr
    9 X% q6 k4 \$ i5 K" n3 e% U5 T/ Q( Y

  190. / u( `# U- V' y3 h, @
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    , Y4 l; u$ |! j$ E( @3 r
  192.         cmp     ah, 01h             ;and return a error
    " r5 T' O! I+ Y. M( F# [5 N7 u
  193. je exit1" n5 H( t3 d5 |
  194.         mov     ah, 0ch             ;if press other key then clear* Y5 k- A, B3 K- u5 S( o
  195.         mov     al, 00              ;keyboard buffer* O6 Q5 [# n  F9 s
  196. int 21h
      q  C8 x0 q. t8 M* [
  197. jmp casemo ) u- t2 K& w/ m8 Q  v

  198. # N2 ^  K/ n, [
  199. errormsg:                           ;if mouse driver no install( x( N" O8 [. O: L+ F: y/ R2 J
  200. call oldint; u, z5 v' `$ s. k7 Y3 L
  201. lea dx, offset emsg
    " h/ ^& K% ?3 V2 P
  202. mov ah, 09h( Z  A# z8 K4 X* i  g
  203. int 21h3 `% `/ p) N! f* t: u. X
  204. mov ah, 4ch. V5 V  N4 B# \- J
  205. mov al, 2" V1 ]( O0 k% a4 b4 a/ N. R' f
  206. int  21h
    $ F) p8 ~( O( u2 K4 g
  207. ; m) M/ b9 T2 ^5 o4 p) \- o6 ~2 r
  208. exit1:                              ;error exit
    ! R+ K. q# j  C  C
  209. mov ax, 0002h+ |& g6 e) V0 x3 c; q
  210. int 33h; c. o% G. W5 }7 p9 G
  211. call  cleascr8 x" l4 d2 x& t) N0 x
  212. call  oldint
    7 N* M  F' R$ }
  213. mov ah, 4ch+ V1 L2 a4 z! q4 ?7 j
  214. mov al, 01
    2 x, r* {+ t/ J  M1 G( [/ C! ~
  215. int 21h% n8 ~" N4 E0 o. Q

  216. 1 S2 M3 U4 s! V0 n  m
  217. cleascr proc    near                ;clear screen  d  D2 f: h1 W) f! z7 J
  218. pusha( J1 O0 e; F. ], P8 ~" ?9 V* U
  219. mov ah, 06
    * c$ C, r. D& t3 V' C
  220. mov al, 0+ O, B. Z' M  a2 g
  221. mov cx, 00 W. W" C; I6 i) u0 w6 Y6 H
  222. mov dh, 24
    : |$ b2 C/ J+ ^& R
  223. mov dl, 79
    9 \: U. [5 C! w; Q; j; w
  224. mov bh, 07h
    - G- f& Z0 j+ }9 g: ?2 j2 Y
  225. int 10h/ S' b$ E# r  M+ X/ c! p* l1 _. m
  226. mov ah, 02- H! _+ @% v/ G2 E
  227. mov bh, 00- o2 ?/ I5 F( D. }: J
  228. mov dh, 04 P/ P+ T  j6 v+ R  c
  229. mov dl, 0& t; c) f8 N$ n2 w3 F
  230. int 10h9 H; N- f! C- _7 |0 v0 Z: D
  231. popa. d- m3 K% R* h0 g: d
  232. ret2 H) i3 A& E) f0 }
  233. cleascr endp! O9 ~, X9 i- h
  234. 8 ^& t* m9 L, a* M+ k" o, T
  235. showmsg proc    near               ;Show info# f" B9 L% q' d  \7 d' y
  236. pusha9 }, `1 J" w6 `6 q" m
  237. lea di, offset showms- F% v0 D7 C9 V5 S+ H! c
  238. mov ax, 0b800h5 ^* l% h! C' a) y8 J" N
  239. mov es, ax
    - \% r, b0 {" t6 j' W
  240. mov si, 0( Y/ Y% b/ c7 ]& b' T7 \. E
  241. mov cx, 480
    & R% r2 z7 X, R3 H, f0 i8 Q
  242. mov ah, 07h+ q9 x1 T# m& L9 m
  243. @@:6 g4 {$ Z/ s6 T
  244. mov al, 20h
    " w# t/ g0 o% o9 E* m/ k  A( K
  245. mov es:[si], ax
    % A* I' e, h8 F
  246. add si, 23 V+ X9 s/ Y, E& D
  247. loop @b
    " y/ o; k6 x/ f, A3 t6 [5 `
  248. mov cx,8807 u/ g- ?$ }* g0 e# \5 W, P2 g
  249. @@:% M9 S+ [( i- W4 X( I, i. u7 W
  250. mov al, [di]
    $ j( l& g/ I8 Z( H# ~* x
  251. inc di
    / l5 q, o1 Z. ^: W9 n% H; v3 O
  252. cmp al,20h) S* B; e! {0 [
  253. je showch11 q2 I% B$ I2 d3 d# ]
  254. mov ah, 17h
    ; x7 [7 X4 ^3 X# {/ O
  255. jmp showch3
    ' y$ z9 f  V" X
  256. showch1:5 o. K. T  P; O. h
  257. mov ah, 07h 6 f5 V) H- D4 o# o0 E' N( b$ i
  258. showch3:
    / |8 }, I9 t- h9 t
  259. mov es:[si], ax
    * a$ v4 [  L9 ^1 ?$ f4 V5 p/ y! V1 s
  260. add si, 2! B  ^% _  T5 {% B+ s
  261. loop @b+ h8 S) g$ i( O% d- ?
  262. popa6 {# K4 A2 ]# C7 U% b* e
  263. ret) v/ `) X; u: g" F# ]& |5 x
  264. showmsg endp) m& S' @; [9 v5 e! \8 T

  265. . e8 I- Y5 P4 f" H& V: k  q
  266. oldint proc8 Q# |$ s: R, _; N' B" Y
  267. pusha
    . S2 F8 ^  Q2 F; c1 Z& S( D3 H
  268. mov ds, word ptr cs:[old331]1 G1 N, H1 G) d5 H3 K$ G/ y
  269. mov   dx, word ptr cs:[old332]0 r6 l6 F0 X9 _. H6 N: `7 ?
  270. mov ax, 2533h
    ! Y) C7 K8 G( U  K+ t7 j2 s* V
  271. int 21h
    # r5 H/ j9 G/ Z" o& ~
  272. mov ds, word ptr cs:[old741]2 y/ v8 X% T- j5 W( V: @4 o+ x
  273. mov dx, word ptr cs:[old742]+ n+ q( R6 j. L
  274. mov ax, 2574h) q& A' \5 `+ A
  275. int 21h
    ( a5 f+ V; [" ?5 w# m8 {" Z4 J* B
  276. popa
    , d5 Q$ Y2 ~; T5 d
  277. ret
    % c7 U3 ~5 E# L3 p; ~- k/ h$ |* ]4 Y
  278. oldint endp
    & N% \& |  ]( T" I2 E
  279. , n* p0 _' T+ M! _) v
  280. memmouse        proc1 Z5 O' M5 `- Z$ W0 `
  281.         xor     ax,ax8 `; a8 b  z5 u+ B$ _- }5 y
  282. int 33h0 c$ e/ W# [8 Y: o6 @* C2 g
  283. cmp ax,0ffffh
    2 p' X$ Q  F/ p! m+ k) Y
  284.         jne     not_loaded
    ' u! o* M# u4 c' I
  285. mov [memcopy], 1
    0 ]. l" D( L, K# k, z  u0 t2 w
  286. ret. V* R1 G+ V% s5 P4 h
  287.   x1 L2 [' ~: W2 J$ r$ S
  288. not_loaded:& X" Z6 j0 i. }9 X

  289. 5 g. X# a9 V8 S3 A
  290.         mov ax,2574h0 [- }6 N; G4 e% i
  291.         mov dx,offset new_isr
    / D# r( O" d& M' A4 `/ R! l
  292.         int 21h
    ' ~9 B9 ^9 F0 W

  293. 8 v# G) X5 _* i  ?" T/ o6 g
  294.         mov ax,2533h
    9 ]' r9 j, ]: |, \' |5 H
  295.         mov dx,offset new_33
    ! D" n8 A6 G3 Z; c+ |5 E
  296.         int 21h  t+ n' V& m# h
  297. : N- H$ I  H7 ]" H
  298.         cli
    ( T# s0 p% G& t$ e, O; E/ m$ O
  299. , d1 u; e) E$ A# o' d
  300.         mov bl,0a8h4 e# F$ _/ z8 z- ^0 D; _6 x; l
  301.         call keyboard_cmd
    4 _. y) a9 K7 G! n( j
  302. 6 ~/ A: B. i: j  O% A$ W
  303.         mov bl,20h
    1 I  `. J; X8 m- N+ K# ?
  304.         call    keyboard_cmd7 _* F# P; W' V" n, N+ J+ [3 _, t
  305.         call    keyboard_read" i+ j4 v( T! P
  306.         or      al,2" v+ M) a' v; F3 m5 m
  307.         mov     bl,60h
    0 U% L/ `8 M3 B, N8 j5 G
  308.         push    ax
    , d3 Z0 ?( [) }; b
  309.         call    keyboard_cmd
    9 ]# G# o7 ^8 q& q7 H5 L" R1 w
  310.         pop     ax
    6 r+ J/ V3 ^* i) X5 J7 c
  311.         call    keyboard_write) K/ X- B* A; f! T& G: f* L: ^2 u

  312. 9 h8 \: w8 [! ?2 Q# }2 u1 a
  313.         mov     bl,0d4h) B; r& @3 R& F5 A
  314.         call    keyboard_cmd  x. l) A6 G0 m3 P. y8 l  @
  315.         mov     al,0f4h* I4 Q6 ?+ t: J) t4 ^( A, S: a: s
  316.         call    keyboard_write
      N: H* v7 N2 N- D/ Z" H

  317. , `; Y7 t( U1 T! `0 y; o
  318.         sti& ^5 K: @2 r, Z
  319.         ret
      ]+ U1 ^* Z" W, L
  320. call_user_isr:
    - q( S9 z9 Q) k
  321. db      60h9 ?. u" R- i% }' K, C" Q5 p: s
  322.         mov     cx,cs:[pos_x]
    $ i( }$ S8 o* G8 {( B- y
  323.         mov     dx,cs:[pos_y]% s0 i3 `% j  S' D5 m: _
  324.         mov     di,0 ;cs:[x_move]
    , O$ d5 I; a: g4 o  ~  M& ^
  325.         mov     si,0 ;cs:[y_move]
      R% k( C$ y5 b# b1 |; b- K
  326.         mov     word ptr cs:[x_move],0
    ; Y: t: G1 F) R5 `1 Z
  327.         mov     word ptr cs:[y_move],0
    0 U1 A+ f  O) ]' {$ U0 G9 j
  328.         mov     bl,byte ptr cs:[buttons]
    9 d% b! A' S% K# C
  329.         xor     bh,bh8 R" A: [2 ]+ D5 H" m) V& j
  330.         call    dword ptr cs:[user_subroutine]
    8 S+ |8 Z, D. Q, u" u7 Y# Y% N
  331.         db      61h8 N' [  I# m" e* g* ]; m1 o+ |
  332. ret6 H! x" N* E9 M0 X  j* v
  333. new_isr:
    " |1 |" `5 X3 z0 B
  334.         pushf* n% i5 e- A" X; y) A9 i- h
  335.         cli0 x, N* h0 ?1 t+ L
  336.         push    ax
    7 Q$ A- ~; S. k7 L+ J+ j$ B1 M
  337.         push    bx( f* y  O+ W! }+ V; b
  338.         push    cx
    6 ?; G8 k- m6 i/ _/ q' n3 i
  339.         push    dx
    0 @+ k) h7 O$ d9 ]$ R* V1 G
  340.         push    di% j( `! C* ?6 S* y
  341.         push    si" T7 |9 L5 H' d6 B
  342.         push    es- z7 U0 V7 r0 T  f
  343.         push    ds
    1 y9 E' H0 ^' D$ H2 ]

  344. 3 H, I3 Q- n* B) R6 g' S
  345.         push    cs
    . |  Q, c& J3 @
  346.         pop     ds/ z7 f+ B/ G2 w: R. n! F6 R# R
  347. - i5 [  b% }% J5 S, K
  348.         mov     bl,0adh
    9 c% a9 Y4 [0 N  `- T# i2 |+ v
  349.         call    keyboard_cmd% @( V; W2 o: S# |$ B& E6 p4 K+ x/ w
  350. ) n8 F3 J  s: ?5 r! s6 _
  351.         cmp     byte ptr [first_time],0
    * }/ z( e" V( b9 @% z
  352.         je      not_first_time
    3 |' y; m( l. [

  353. 2 A  J- ^7 }- }6 p5 N
  354.         mov     byte ptr [first_time],0
    1 Y: `3 d- a& |- o. C
  355.         call    keyboard_read) U* [7 }+ b, T" w7 C4 @+ K1 }1 h$ p
  356.         call    keyboard_read; [6 {+ v& y! v  @
  357.         call    keyboard_read
    9 E6 V5 t* H' W7 I8 W
  358.         jmp     no_show
    * u  q0 F& ~  b7 X
  359. ( f5 }, [' K: l
  360. not_first_time:
    ! l2 j# H, R4 V  N% P
  361.         mov     word ptr [temp_mask],0' @' m# m7 }7 L1 v4 _
  362. 0 }( w/ q. k  O0 x: \1 d+ D2 H
  363.         mov     cx,[pos_x]
    + X5 t9 O6 u/ e0 f
  364.         mov     dx,[pos_y]8 v$ }4 L& E& o4 X; r0 E% L
  365. 5 _5 q) W+ w9 @$ p
  366.         call    keyboard_read4 f* U3 y* t( S0 R% h- S7 f* Z
  367.         and     al,7 ;3% w1 C: K, u  n. \1 A
  368.         mov     ah,[buttons]
    ; K; |! |( r+ r. H+ Y0 s" L& C
  369.         mov     [buttons],al  V/ R5 n5 z* W9 G0 ]1 I4 C0 F6 B
  370.         cmp     al,ah
    % l& r& X1 T7 J5 s2 @
  371.         je      no_button_change
    2 ^; Y- q, a3 h0 x& p0 H
  372.         and     al,3
    " R; Z4 N2 z9 k& S
  373.         and     ah,3
    2 Q% M5 A  d2 b- Y: S5 p. W
  374.         xor     al,ah& n$ `  w8 q7 w3 @8 T; r
  375.         xor     bx,bx
    : Q0 t+ A8 ^' ?3 W: u" F$ H( J

  376. 5 d3 _% r; i, l$ w: ?8 H
  377.         push    ax
    / g* L) P; r$ y. D3 C8 |, G
  378.         test    al,2' e! N2 ], w# a* D) \9 a0 V# w8 Z" x
  379.         jz      no_right_button_change
      n) c: n- Q( Z* U9 Q9 _( S" f
  380.         and     ah,2
    ( f, p2 K# ?  g! n+ a9 g, O
  381.         jz      right_button_pressed# a' U( f! B6 Z. i% E7 N
  382.         or      bx,16
    & E7 x8 j% W% D* d* r
  383.         jmp     no_right_button_change
    5 u; N2 X: x% \* E, g
  384. right_button_pressed:- u, G5 W: o' ~6 [! s8 I$ ]7 G
  385.         or      bx,8
    " H: R) E: F6 z5 g4 K
  386. no_right_button_change:
    # e; A" g6 r* z4 F- J
  387. " F7 o( m  u, T. N- ]' G4 K' d
  388.         pop     ax, E4 {& B! i  d

  389. 4 K/ r" h: |8 L8 C2 _9 e4 g
  390.         test    al,1" ]9 ]; @* m, U+ Y
  391.         jz      no_left_button_change
    / _* R: u, X. R  a
  392.         and     ah,17 _7 r/ g( U. J" O& O. y$ v7 m
  393.         jz      left_button_pressed7 d/ R8 ^& n) `
  394.         or      bx,4
    & ~: A3 Q- Z- G( n
  395.         jmp     no_left_button_change
    ' q6 j  o- s% a4 t4 C$ N# E3 k+ g
  396. left_button_pressed:
    & w6 g1 n' ~3 @" g) j
  397.         or      bx,2
    ' c9 \7 [2 L2 t/ R! P
  398. no_left_button_change:. C& i$ c* `* Y$ \: [5 k

  399. $ O/ C7 b% u6 L. P9 W  z
  400.         mov     [temp_mask],bx
    - J" h/ a: E! j5 |: A5 p& {! r! _! {

  401. , g- g/ O& l/ H. @$ D# W
  402. no_button_change:
    & n1 _( Y$ l+ H: J- g
  403.         call    keyboard_read
    + C3 m; w' i% C  e- L4 n8 d; D
  404.         cbw4 t- V- i/ k. D0 D0 U: h3 E' U
  405.         add     [pos_x],ax
    * w7 O& D" |* A( I! l" l) I% U
  406.         add     [x_move],ax' A( e2 A( k- v1 }8 s5 N  U' @
  407.         mov     ax,[x_min]
    - B1 P! D7 u' T1 [+ U
  408.         cmp     [pos_x],ax
    ! R3 G1 K4 M/ t7 P
  409.         jg      good_hor1( U' [( ?5 {# c$ h
  410.         mov     [pos_x],ax$ R* d" i1 I& M! O) \# ?/ [0 a
  411. good_hor1:
    & `' I* N( z  T5 z* D
  412.         mov     ax,[x_max]
    5 ^* k2 A4 u) z, e/ t) ^  y
  413.         cmp     [pos_x],ax/ l: {: R: e) T. @; Q$ K( j/ V
  414.         jle     good_hor2
    1 ~9 D2 E- O, m0 J8 N2 ]4 }
  415.         mov     [pos_x],ax
    ; s6 c6 R6 A+ S, a# _
  416. good_hor2:, T: s, t9 L6 a

  417. 9 D: Y$ k4 e, V6 }( J0 ?
  418.         call    keyboard_read
    0 K  c5 n6 D9 [7 }2 k
  419.         neg     al/ o/ B6 n, }- {% D$ `
  420.         cbw
    ' m) P* X0 ?: q# s, w3 g" C) L
  421.         add     [pos_y],ax
    8 k. ]0 ], ^" x9 |
  422.         add     [y_move],ax
    0 f3 ~$ Q. f/ ~2 E
  423.         mov     ax,[y_min]
    % |9 }2 ^+ g" A  K' r; I% i6 e" |
  424.         cmp     [pos_y],ax( }+ D+ {, Y/ [/ t7 A$ J; s6 n
  425.         jg      good_ver1
    7 u- R, ~0 |( u# A. M
  426.         mov     [pos_y],ax$ c2 C( a, Q1 R5 o" f* ]$ V$ T
  427. good_ver1:
    4 L( o9 L( j1 V" M# P2 a
  428.         mov     ax,[y_max]) f8 F& N. G% w0 L7 j; O
  429.         cmp     [pos_y],ax
      y# u1 [4 _; _7 V; ]9 ?
  430.         jle     good_ver2
    + z) W* ], w+ S1 F- }" [. N
  431.         mov     [pos_y],ax
    ' R' v8 H) |- z. D" a2 X2 T5 F
  432. good_ver2:$ j; _" q. N! P! b% ]
  433. : {/ B+ B; t* ]% ]! p
  434.         mov     ax,[x_move]8 d& X) E9 a' ]/ M9 |# P
  435.         or      ax,[y_move]6 z, {, x- p+ e+ O
  436.         or      ax,ax/ V1 ~% x7 R* `/ G6 i+ Y- Y
  437.         jz      no_change_position7 W: U4 O) ^3 M. `. ?6 i# ]
  438.         or      word ptr [temp_mask],1
    / g8 M, B$ L6 p9 \; {2 b7 @
  439. no_change_position:
    8 R2 J2 I. r/ @& E; V& z) `7 f& c

  440.   y5 E# a# _9 V2 y9 V
  441.         mov     ax,[temp_mask]& Y# N) e! [; K2 v$ D% |% P# X
  442.         and     ax,[user_mask]
    , I5 v* d  Y1 y, _: V5 d) z$ D
  443.         jz      no_call_user
    5 Q! J) ?( q! B- Y$ |0 F) }; I
  444.         call    call_user_isr
    6 }$ `% w. m0 |& B
  445. no_call_user:1 O" m& \  a8 G0 t

  446. , b3 k8 f. P! l1 v3 d& D, e
  447.         cmp     byte ptr [sm_flag],16 G/ J: @8 z2 G
  448.         jne     no_show
    2 r& R8 |5 V4 |1 a& f
  449. ; h; D$ Y; ?4 r5 c2 G2 E0 j
  450.         shr     cx,3
    7 X. S; F9 C! d$ z0 R
  451.         shr     dx,37 P2 D/ W+ Q, m& D; y
  452.         mov     ax,80
    4 C1 A1 \$ ]. u
  453.         mul     dl
    . _* W  N  ~8 V: G
  454.         add     ax,cx
    8 u$ V. @" R$ @3 V# j
  455.         shl     ax,1  j6 R& i! Z- b  N
  456.         mov     di,ax
    ! o- v! [, s$ S$ Z% m# W
  457.         mov     ax,0b800h7 P5 x6 i3 T4 b8 T% ^9 l
  458.         mov     es,ax9 d( b! q  Q/ H& ~& c* l' i
  459.         mov     ax,[save_char]
    ; f! M. [" F# B4 v
  460.         stosw
    5 \9 K' w/ `& I/ L

  461. 1 M  y& P6 l  j4 F( t0 @5 u
  462.         mov     cx,[pos_x]3 K9 M8 B1 I6 J  e
  463.         mov     dx,[pos_y]
    / R0 ^& P& a8 q* B& G" G
  464.         shr     cx,3
    * w- R( L  s& A6 q$ s1 y
  465.         shr     dx,34 r; B9 I* ^: F. I1 _) U) \
  466.         mov     ax,80& @+ X  T9 N! [
  467.         mul     dl) R5 `7 `( ^, Z: K
  468.         add     ax,cx
    ) C: g* l3 X/ P- G$ \1 R
  469.         shl     ax,1
    ! m- \% U" E, k+ d  q
  470.         mov     di,ax9 K+ g5 X5 T9 \
  471.         mov     ax,0b800h3 v7 j1 Y0 I  l- t/ c: e% \: |
  472.         mov     es,ax
    ! I0 t6 |- _' M# E1 x: {
  473.         mov     ax,es:[di]
    $ }4 F  A4 `5 d9 W. B) f; c) @7 j8 `
  474.         mov     [save_char],ax: ?! b% [: Z7 E' t, u
  475.         not     ah" m3 b  Q- m# M5 a1 ~" ~0 {0 J
  476.         and     ah,7fh. P2 E# B$ c- h1 V8 k+ m
  477.         stosw
    % Y: `. ?3 o$ V: G7 m
  478. no_show:- `( R/ @! W  u: z
  479.         mov     bl,0aeh
    * c: `" o4 M- _/ O+ g
  480.         call    keyboard_cmd  m5 v$ Y( ]( j
  481. 1 R8 L7 G' c" s, v# l
  482.         mov     al,20h
    5 t5 Q6 H4 T, A- v0 O3 ^+ |8 p. R7 T
  483.         out     0a0h,al5 V5 G( ^  T  V+ a4 c8 {
  484.         out     20h,al% ^5 o4 _% ^  c3 C+ c/ Y5 ^6 a
  485. , @% \% Y) B5 A% r& U' p
  486.         pop     ds
    . c( t- g, d; [4 M/ _
  487.         pop     es
    & o* @) T( ]$ v
  488.         pop     si: e. `, S6 w' O' j! o4 V3 t
  489.         pop     di0 X7 b9 j% p9 [% `& k4 x
  490.         pop     dx
    2 d  @- S0 K6 ]/ z! R
  491.         pop     cx2 v9 c2 P1 \' z' L, J$ P8 y
  492.         pop     bx
    9 d) j9 L# q& `6 f! C
  493.         pop     ax
    5 W& ]' h7 _, p! ^2 `
  494.         popf
    ' z: u" i) n% Z- S' j1 |3 ?  S* i
  495.         iret) F! O9 ]. X& a; K9 m7 q
  496. 6 N/ K! i" w! Z
  497. first_time      db      15 d/ ^% U6 I# w/ |) a. c; k8 C0 s4 M7 ]# F
  498. buttons         db      0' r/ s: M; G8 d) R+ }4 i
  499. pos_x           dw      0
    " ?1 M! e; V: w: H, f/ R
  500. pos_y           dw      0
    ) x6 b" I( h0 x8 X) J
  501. sm_flag         dw      0
    % O) t) J! z7 v5 G0 Y8 q
  502. save_char       dw      09 i; ^7 O. u% Z
  503. x_move          dw      0; `' P+ n+ ^! w* Y2 ^% J1 ?
  504. y_move          dw      03 q% I7 x6 M1 e& k% @
  505. x_max           dw      639
    4 M$ h7 H- ]2 t9 `
  506. x_min           dw      0
    ( g5 b* H; z/ l8 O
  507. y_max           dw      199
    ' b6 h+ U" b) S1 x1 ^% i8 R+ ~
  508. y_min           dw      0
    2 ]+ t/ k* C6 e
  509. user_subroutine dw      0,0
    ( |0 l' [) j9 _- ^) V0 m1 |
  510. user_mask       dw      0
    4 l" \0 ~, C. W7 C
  511. temp_mask       dw      01 V1 ^/ Q9 h1 W6 F

  512. ; Z( d3 S; H- i; o, s
  513. keyboard_read:, M/ |7 V( i6 U3 N% v. a0 W
  514.         push    cx
    8 B: u6 T( R- E6 b* d* N$ Z# J0 Q% ]
  515.         push    dx
    ' n* m9 A$ f+ ~1 v$ p
  516.         xor     cx,cx
    / e2 q$ T/ d$ \$ _% M* @* U
  517. key_read_loop:! _$ {+ A. K7 t0 r! ^% t! V
  518.         in      al,64h* q# t& C9 ~; g5 B
  519.         jmp     $+28 F3 `4 x3 Y& [: T
  520.         jmp     $+22 f4 ]  |" ^( {& T& |4 P, h
  521.         test    al,1
    0 d. B0 o1 A( V% |% [5 B6 `/ T1 M) m
  522.         jnz     key_read_ready, C& y# X" [$ X0 K* u1 B/ \' s  _
  523.         loop    key_read_loop
    : W5 }' o5 ?) ~8 |1 W* `
  524.         mov     ah,17 }- O& x& U  y/ `
  525.         jmp     key_read_exit1 N$ ~. H% q8 g: X6 g; n
  526. key_read_ready:3 }2 f9 v  F* W! s/ k. f
  527.         push    cx) Q( C* f: y- c) [( b
  528.         mov     cx,32
    2 L4 t, ~, n4 `5 [' Z, W
  529. key_read_delay:. b( ^6 J5 b6 I6 \5 c0 }# E  P1 Y
  530.         jmp     $+2- q6 S$ L; V0 v2 o
  531.         jmp     $+2
    8 c! f- r3 J# M$ z/ W9 f* q9 N/ Z2 y
  532.         loop    key_read_delay# O1 i, M0 S* ~' u! W! k$ D

  533. ; t$ n8 x9 y/ x' |4 }
  534.         pop     cx
    , a7 P. I: C3 R5 ?6 c

  535.   j0 f5 K4 {9 s3 t( m; O, s  O
  536.         in      al,60h1 U# t; r) R" M* S  y  _
  537.         jmp     $+24 M, Z' E3 K- l" k4 Q6 ]; u
  538.         jmp     $+22 T0 _  i8 u- ]9 X8 D) E, X
  539.         xor     ah,ah3 ^% \5 u0 e4 v* w8 H; i: K
  540. key_read_exit:5 |8 J3 e' W3 d1 o& }3 q
  541.         pop     dx# r0 P& n/ x2 K' g) z! A5 w
  542.         pop     cx2 |7 P# y5 u: z  T; h: p
  543.         ret2 n" D; z  k9 I4 A. ~8 e5 z

  544. & }$ O9 u* |* T' i' l1 t
  545. keyboard_write:$ W& v7 j1 {2 R4 F5 y' O9 s
  546.         push    cx
    ! R/ _$ o2 X7 W  K% A6 Y4 R
  547.         push    dx
    4 s  w7 K* C7 P5 W
  548.         mov     dl,al* L8 z2 Y$ v5 m9 c: [$ ~3 T
  549.         xor     cx,cx  `+ f2 @; e6 W
  550. kbd_wrt_loop1:
    8 Y! S( p4 ]  h2 F+ b# |
  551.         in      al,64h
    * J- Z9 p9 j7 e7 \# F' B$ {  n9 e
  552.         jmp     $+2
    & f. _" [3 V  V# E* `
  553.         jmp     $+2. a5 K  _% H4 }/ q  u9 s! m& v- E  F8 \
  554.         test    al,20h
    * J! v2 ?8 O0 q9 Z* `% F3 @9 Z
  555.         jz      kbd_wrt_ok1
    : D, A! O# D! P# P9 }& I+ \  |. [7 Z4 L

  556. ' G, Z. P; G  R( ]' Z! Y
  557.         loop    kbd_wrt_loop1( I( a# n3 b* H( L& R; C

  558. ; u! i# [8 [9 l2 j
  559.         mov     ah,11 S4 v4 d# B( m& b& {8 a7 u) r
  560.         jmp     kbd_wrt_exit
    ' I9 z/ Y6 @# Y5 t8 L+ m- `
  561. 5 U1 r* X) u# a) ^3 d7 j2 @" l9 T/ v
  562. kbd_wrt_ok1:
    . b- I% }/ l2 q
  563.         in      al,60h8 c- \- k4 {6 x+ p" H+ y( K& O" e

  564. . J: w5 j: o! m7 f5 |( G1 Y
  565.         xor     cx,cx( f, p' i+ c4 {) a+ ?3 }; q* }' Y
  566. kbd_wrt_loop:
    ! L, h! Q* k0 ]7 x0 E5 O+ K7 {: k
  567.         in      al,64h) p- [8 x; N! t2 @7 N0 f! C. b/ O
  568.         jmp     $+24 C) Y; X  D" a
  569.         jmp     $+2
    3 L& S' M+ N9 a- P
  570.         test    al,2
    6 l$ D/ z1 Q: s# f# S$ J* J
  571.         jz      kbd_wrt_ok
    + e8 ~) J  M7 m0 T9 J

  572. " ?4 q5 n0 E* y' ^/ O
  573.         loop    kbd_wrt_loop! ~) i& M4 I/ `3 k, O6 R: T
  574. ) p6 S* D  ^$ ?  f8 X, D
  575.         mov     ah,1( z- A. Q9 q( S2 ~8 g' L# k5 V  y( j
  576.         jmp     kbd_wrt_exit: v0 ]4 _. C% z$ O0 p( c: |
  577. 3 ]6 [* h5 N7 u9 h
  578. kbd_wrt_ok:- G+ F8 m* r: {& l
  579.         mov     al,dl( ?$ O) V" r* V1 A6 p
  580.         out     60h,al
    7 K8 A# V5 F* ~
  581.         jmp     $+2
    * }' w9 T, J$ c
  582.         jmp     $+27 B$ a0 ~/ A8 r% V) @6 C

  583. / G- }4 w* k. I! L! k7 M
  584.         xor     cx,cx' x3 }6 Y5 ]: q0 f5 K
  585. kbd_wrt_loop3:
    1 Q9 d; m* D- w8 e( Q
  586.         in      al,64h6 L$ K; e& ]% ]0 K6 t  n; W
  587.         jmp     $+2
    9 E9 F! g4 t9 i) M* j7 x3 @
  588.         jmp     $+2& c. S% Y7 C% |
  589.         test    al,2
    ) \) _. K3 Q! B9 n" X
  590.         jz      kbd_wrt_ok3# B& l- d' g( j7 Q& s5 r
  591. 3 Y$ k/ @9 J& T& B# C; z' q3 z4 U2 w% ]
  592.         loop    kbd_wrt_loop3
    / p4 Z7 S' [5 }" K9 h

  593. + }+ Q/ ~" O+ O( v' N. v
  594.         mov     ah,16 g  i: K  W  @- C( o/ m
  595.         jmp     kbd_wrt_exit
    & f7 q2 x  J- x. u+ }  u4 U5 l+ r
  596. . Z8 R+ _9 o: B9 U2 f6 g6 S
  597. kbd_wrt_ok3:7 B: c6 b7 `3 ?  J# \8 ?0 u
  598.         mov     ah,8
    8 ^' p6 V* e0 V, w  ?/ j0 M, U
  599. kbd_wrt_loop4:
    ( I, M: E% {% m! P4 O! h/ E1 Z/ N
  600.         xor     cx,cx& k# i5 B% Z1 I
  601. kbd_wrt_loop5:( A7 I% O1 g& T' e) a
  602.         in      al,64h
    - f, K2 D5 |3 j5 Z- y
  603.         jmp     $+23 \7 N+ H0 g  z9 _, Q
  604.         jmp     $+2
    / U; G( k, v& O  \
  605.         test    al,12 P1 o& @0 f" ~. u$ n' x/ J0 h
  606.         jnz     kbd_wrt_ok4
    " T2 I4 s; X+ W8 l4 r/ b

  607. 4 g! x0 }8 Q/ z
  608.         loop    kbd_wrt_loop5; K* Z- w+ l0 ]! G" a4 [" K- ^5 `
  609. 1 `! v2 l6 a( y5 E. m. L5 Y
  610.         dec     ah
    1 B; H- {6 G+ y: {
  611.         jnz     kbd_wrt_loop46 \# Q' \/ d4 U0 }( h
  612. 7 s5 H8 z% v4 H+ Z# g# f# r# R
  613. kbd_wrt_ok4:, U" n% q. c9 K! x, d+ _
  614.         xor     ah,ah
    # R: b  R& J- S/ a- T
  615. kbd_wrt_exit:4 e) p/ q0 z' K# b- J3 |* `/ n8 n
  616.         pop     dx
    ( m$ Z3 |) M4 O! L4 R
  617.         pop     cx
    . @% U: m5 R+ N, I2 n0 P; ~
  618.         ret, R# v  {! O3 T2 ^% ]4 K; J+ N
  619.         
    ( g+ p. i" g' o! U: Q
  620. keyboard_cmd:
    ) _* H2 C$ Y" a% u
  621.         xor     cx,cx+ u& D9 W. _- p* C( Q# }- L- ^
  622. cmd_wait:$ S2 K4 j; H. X; G- `* O
  623.         in      al,64h4 n0 C1 b. q  j) |3 q1 P) {! R. W0 T
  624.         jmp     $+2: K) a8 y4 F- \1 J1 n
  625.         jmp     $+2
    + x/ Z% C* N1 J5 q, F$ X  a
  626.         test    al,2
    4 ?1 S7 [7 v7 ?
  627.         jz      cmd_send, k/ P# v/ V! r) ]9 X0 Z- b
  628.         loop    cmd_wait
    , ?, M3 y+ _, _% G) V

  629. : s1 Q6 S% |6 i: `8 z
  630.         jmp     cmd_error
    7 p0 d8 f7 G: d8 x% u" W/ Y8 A8 K

  631. . J* m. f( l6 Z
  632. cmd_send:
      O6 ?0 U# j4 a+ K7 |" S1 G
  633.         mov     al,bl
    1 B* d2 C) ^& z
  634.         out     64h,al
    % }4 o7 P# c* B2 U* _; P- p' _* `3 t
  635.         jmp     $+27 Z9 }7 E4 G0 o$ b  D8 N
  636.         jmp     $+2
      U9 X# ?5 J- q( l% @" [; Z$ j% @" C

  637. & J* T3 W$ e0 x; }, z  p
  638.         xor     cx,cx4 O1 R4 u, j* b
  639. cmd_accept:
    . \* E( j$ x8 ~, I0 F
  640.         in      al,64h
    3 `* w4 c5 ]  f) |" V; ]4 V' N$ Z
  641.         jmp     $+2
    $ L3 H% v, _" ~+ p' n
  642.         jmp     $+2. f$ k1 T$ a2 `' t/ f
  643.         test    al,2
    : A+ o0 z. N3 }8 i' [, b
  644.         jz      cmd_ok
    9 ~% V6 O/ O" h) @9 ?* o
  645.         loop    cmd_accept0 _- H/ J3 ^: [7 |$ k: [
  646. 5 T+ J# _  \# g
  647. cmd_error:
    ! U1 O- p; I( \( j8 [$ B
  648.         mov     ah,1. ]' q+ v( J* p& z6 ^
  649.         jmp     cmd_exit1 p. |  S) o5 L8 h, t
  650. cmd_ok:
    ; H" h# y# l4 Z
  651.         xor     ah,ah
    # o6 Q& i) y7 i+ c0 U1 i
  652. cmd_exit:2 `5 z6 b( U6 B# r
  653.         ret
    ! l% A) S0 {9 J( c2 @/ O

  654. . M# p4 C0 d3 b/ f; c# ?
  655. new_33:! o- T$ Z  W" y2 }# b# W
  656.         cli' c! {7 H$ j8 b- r7 `
  657.         cmp     al,0
    % ~: A1 R7 T) J: y
  658.         je      reset_mouse4 Z+ I! y8 W5 o: R; ?& T
  659.         cmp     al,1% O2 Q  H; t, U1 W  b6 B
  660.         je      show_mouse: B+ f( g' U; u8 h7 m( {
  661.         cmp     al,2
    4 `4 L- f4 H2 E9 t. P$ U
  662.         je      hide_mouse% D' p: s' c6 Z
  663.         cmp     al,3. ~% D$ h, J( \- D- G
  664.         je      get_pos
    ' }# O. T  I% t  p0 H2 D
  665.         cmp     al,48 j- `. V6 c( v/ ^
  666.         je      set_pos5 v# W, ?. I4 E  F2 j1 b- T
  667.         cmp     al,7. m  A2 a* L' u! Y
  668.         je      set_hor_pos
    * L9 _8 c  P$ [+ E1 P- ], }/ I7 s& o/ ]! N
  669.         cmp     al,8( W( i  ?6 X' @) I
  670.         je      set_ver_pos, V* _" i3 }0 ]) V- T6 [' J1 g
  671.         cmp     al,0bh
    ) w- p- X: \& \5 C! D( \
  672.         je      get_mouse_movement
    # k, ?1 B  o( a2 U7 H! i- K  M) @
  673.         cmp     al,0ch
    8 N9 _/ y: D) q+ j0 R3 y+ m
  674.         je      set_subroutines
    / v  M5 `7 z: f. G. B
  675.         cmp     al,14h% z  y% U# k% I
  676.         je      swap_subroutines/ x/ D# X( [- u2 T( o2 E7 T
  677.         iret
    : a" t. {& T% W! a; f& ?3 d# m
  678. " c- P' O% F" U. |1 c& f
  679. reset_mouse:
    , V6 _" z" |/ |  D" ^$ L6 Z
  680.         jmp     _reset_mouse
    : ]  K8 Z7 V. v( A
  681. show_mouse:' u% d/ x6 i3 c: k; L
  682.         jmp     _show_mouse
    / F; M$ V6 t8 E& x0 I+ M4 H
  683. hide_mouse:: j- H- p0 M# q6 E( F8 J0 w
  684.         jmp     _hide_mouse
    + f3 b! u! }5 s0 {6 R: e
  685. get_pos:' @+ i7 M. g9 v# O6 A
  686.         jmp     _get_pos# U9 C5 u4 I! d' ?- y* a5 ?
  687. set_pos:9 G% O, s' e9 |. c3 Y) C% {
  688.         jmp     _set_pos( X" n- j: g5 J3 }( w& Q0 y  [
  689. set_hor_pos:( v* X" F/ K/ |. {% \
  690.         jmp     _set_hor_pos
      m4 C' [0 v- `& s8 m
  691. set_ver_pos:
    ' t. }7 @& t/ {, v5 `' y( b
  692.         jmp     _set_ver_pos/ h. p+ o& \  E& v5 s0 r0 O
  693. get_mouse_movement:3 e) ^; ^1 h+ x* m5 U7 L8 x
  694.         jmp     _get_mouse_movement
    $ t, G" k2 \5 @
  695. set_subroutines:
    ' B8 O2 [7 j% d- d
  696.         jmp     _set_subroutines* `& j4 }. ^3 X5 b3 A, k; i
  697. swap_subroutines:  c( ]' J/ [: G' W" S
  698.         jmp     _swap_subroutines
    ! q! Q( ]7 l9 w: n2 _
  699. ( D. }: E: w+ c; v  ?
  700. _reset_mouse:
    ' @. u; [/ \. ?' c
  701.         mov     byte ptr cs:[buttons],05 g6 i- @/ H0 d: Y1 k1 Q8 C9 b  U
  702.         mov     word ptr cs:[pos_x],0* A; X! g1 P, W& U4 R  Z
  703.         mov     word ptr cs:[pos_y],05 n% }( q8 B/ T( k; y
  704.         mov     word ptr cs:[x_move],06 `( L2 `) ]* B; L' I9 o0 G
  705.         mov     word ptr cs:[y_move],0  P1 ?& h2 }+ @2 m2 W- t; e; _
  706.         mov     word ptr cs:[x_max],6393 {3 p5 L, E2 D+ w
  707.         mov     word ptr cs:[x_min],0
    / h2 B: n& M. `. C. ~
  708.         mov     word ptr cs:[y_max],199! F/ m6 a3 k, I. c7 t" c6 C( w
  709.         mov     word ptr cs:[y_min],0, V, g4 i& p8 {9 z
  710.         mov     word ptr cs:[user_mask],0: ?: \7 _# F! t9 R9 q
  711.         mov     word ptr cs:[user_subroutine],0& |: \( S- c# H3 b1 ]- m
  712.         mov     word ptr cs:[user_subroutine+2],05 }6 L  s( }( e# j
  713.         mov     ax,0ffffh
    ! R" V% H) t: m
  714.         mov     bx,3( S3 E  h8 b7 t1 G# g% W6 I
  715.         iret: o2 V/ W7 T6 E8 r2 y. [2 _
  716. 8 p; w8 h6 r- n4 b* N
  717. _get_pos:2 r3 Q5 i3 `! E% u, k8 I
  718.         mov     cx,cs:[pos_x]
    % P' w9 {2 A9 C
  719.         mov     dx,cs:[pos_y]; {3 k. L7 \$ z- s% r0 m* C
  720.         mov     bx,word ptr cs:[buttons]$ H8 m3 Y. n- U& K- H0 x/ K/ P
  721.         xor     bh,bh, F+ b& ~0 u& c
  722.         iret
    , z& m8 \- \2 |* o9 l

  723. 5 Z3 Q! H! t4 g. {# N
  724. _get_mouse_movement:1 B, x1 q: t3 ^
  725.         mov     cx,cs:[x_move]
    6 d2 L1 m9 D( i% X8 C* d9 Z
  726.         mov     dx,cs:[y_move]
    7 V& D8 u2 R. x" _# B
  727.         mov     word ptr cs:[x_move],0" a/ O7 @+ j- o  i
  728.         mov     word ptr cs:[y_move],0( x, b" @8 D" J9 X- w
  729.         iret
    " D6 v2 y+ R% V- h& m

  730. / e) d( \& O4 |' l
  731. _show_mouse:
    6 w# b( m9 a1 G9 k
  732.         push    ax" C- P! l4 B) g7 r: o' _
  733.         push    bx
    9 E9 g6 [. P% p* J. l5 ~0 M6 }
  734.         push    di- M7 E* a+ t1 ?, e
  735.         push    es
    : g9 W& Q+ D2 i! v$ Z, K$ h
  736.         mov     byte ptr cs:[sm_flag],1
    ; q- D  O7 m& F0 n
  737.         mov     ax,cs:[pos_y]
    / w) C  {6 u8 R
  738.         shr     ax,3$ P  T$ f- ]5 s- C
  739.         mov     bl,80) Q9 q9 p5 A% n9 b
  740.         mul     bl
    $ h( ?0 U+ |+ i7 O
  741.         mov     bx,[pos_x]
    4 W0 U# X/ B4 X3 V$ X. C- d
  742.         shr     bx,3' {0 A) A+ R+ F* b
  743.         add     ax,bx" {& s3 i+ t* I% h  Q
  744.         shl     ax,13 K6 L2 P2 f# Y' g$ }- B0 O+ R7 G
  745.         mov     di,ax
    8 _% d' J& ~! M% G& o
  746.         mov     ax,0b800h
    ) X2 c7 r$ U: u+ x% Y; H. x
  747.         mov     es,ax4 f" Z# a: F+ ?' o$ Y
  748.         mov     ax,es:[di]
    : S; U: V- I* v; J
  749.         mov     cs:[save_char],ax8 [$ J  r; v7 {2 I8 s
  750.         not     ah
    0 d8 i% @) ^; {# ]4 k8 `6 x+ R
  751.         and     ah,7fh
    8 T% n  |; v8 \1 t1 Y' E) o9 V' Z
  752.         mov     es:[di],ax
    8 |3 e8 D& y' e2 k* @* h  W
  753.         pop     es
    , P- Q  J/ d3 m+ ~2 t
  754.         pop     di, |' m7 U; w$ `. w  G( \( }" z9 |  ]
  755.         pop     bx' e- G3 ^4 S, n, B8 k7 }
  756.         pop     ax
    . }: p+ g" l& C6 Z: i
  757.         iret3 H  U& c9 @9 H: f' ~
  758. ! _0 y! S1 I! U7 y- g# V# w
  759. _hide_mouse:& T% F' d% B( t0 e1 K
  760.         push    ax$ U* \/ l$ J5 x) z+ z
  761.         push    bx" e; M, W/ x/ Z1 |5 u( t
  762.         push    di
    : Z) y8 S8 h2 N: S" e& Z8 ^
  763.         push    es4 y0 e9 V. K4 t% g9 E5 y  q
  764.         mov     byte ptr cs:[sm_flag],0
    % p/ F7 Y$ A1 [: E; G7 B! y
  765.         mov     ax,cs:[pos_y]
    , J  H1 o( e' R0 t2 Z
  766.         shr     ax,32 M( I# y: S8 w7 ]# m! S' o8 D
  767.         mov     bl,800 M1 g' X  ^, }" E. g* x
  768.         mul     bl
    1 r1 T7 W. k, X5 A& J3 k/ n1 P
  769.         mov     bx,[pos_x]
    3 f7 g, U  {/ }  o1 q8 y
  770.         shr     bx,3
    ) n1 L7 h  [2 Z
  771.         add     ax,bx
    9 b2 h2 G% N" M/ a& N
  772.         shl     ax,1# I. g  S; l$ R% `7 `
  773.         mov     di,ax  s9 b+ T( v, h7 S6 t# z; z/ U/ Z! T
  774.         mov     ax,0b800h
    . \- X; h/ f% ^/ T4 E# l
  775.         mov     es,ax3 J$ g1 y0 E7 f" C+ W
  776.         mov     ax,cs:[save_char]
    0 w% C! ^, |( u  I. b1 \
  777.         mov     es:[di],ax
    7 X2 b1 H0 W1 H
  778.         pop     es
    ; ]" p+ k; q& v% h0 y9 G
  779.         pop     di
    6 e9 Z. {/ ~$ L! l/ O0 Z
  780.         pop     bx
    $ _6 j) B+ O6 n8 a2 P" c* R
  781.         pop     ax
    # {/ ~5 p$ q! m5 @5 I! `/ o
  782.         iret( x2 V% ~) h$ Q

  783. - `! }# B+ h/ d7 l2 Y) i
  784. _set_pos:& c+ b, ?2 Z1 P% T3 y7 W: X
  785.         mov     cx,cs:[pos_x]
    ( ]' ]0 U0 f( J( i1 w
  786.         mov     dx,cs:[pos_y]
    / q, T4 ]1 i7 d" p
  787.         mov     word ptr cs:[x_move],0) [. M  E! I$ @/ z$ o
  788.         mov     word ptr cs:[y_move],0/ y' J! P. w* y$ L: J5 Q* C' o
  789.         iret
      Z4 `8 K' L& V! T6 s4 C
  790. 7 i% L5 M$ `- o& {  ]& x2 y
  791. _set_hor_pos:
    4 F$ U2 ?  r: _4 c5 x% M* r( ?4 j
  792.         call    max_min" r& j5 M* h& }2 n
  793.         mov     cs:[x_min],cx
    $ R, `! w0 @* a# ~1 i& E) P5 s1 Y3 Y
  794.         mov     cs:[x_max],dx
    & X3 Y* [2 L# O" X% `
  795.         cmp     cs:[pos_x],cx" a8 p) D+ o- I
  796.         jge     good_hor_min
    , X' v4 \6 f( g* h2 O8 L  o
  797.         mov     cs:[pos_x],cx- [4 i  t0 w' i! R2 U
  798. good_hor_min:3 X% P7 ]8 |  g6 {
  799.         cmp     cs:[pos_x],dx
    . f* ^+ L! K! a+ o* y$ ~7 w) w
  800.         jle     good_hor_max
    & z* z3 a, r5 N% H& A
  801.         mov     cs:[pos_x],dx
    6 p) Z4 u) c3 w" b: q6 D& \
  802. good_hor_max:
    " r6 J1 R, p$ r3 q
  803.        iret) d: g& r5 z/ G8 o- y4 j! M

  804. $ Q$ l$ B7 }& ?  `- ?
  805. _set_ver_pos:' }( [$ a4 c( h( l; s
  806.         call    max_min* W% M/ w2 b9 Y9 k: ?4 N
  807.         mov     cs:[y_min],cx
    6 A: s/ {  T( e/ @! u6 J
  808.         mov     cs:[y_max],dx
    ; a* k& [" m! M# @; O
  809.         cmp     cs:[pos_y],cx
    1 i) B0 ?! [- H$ s4 U
  810.         jge     good_ver_min
    , `: K8 H! p* X$ d" Y
  811.         mov     cs:[pos_y],cx
    & R4 g- m: Y2 a/ y- Y
  812. good_ver_min:1 K2 t2 L1 d4 g  [2 S
  813.         cmp     cs:[pos_y],dx
    1 E4 |+ Z; r) o  e4 [" G6 _
  814.         jle     good_ver_max9 k1 X6 v8 V. r5 X' Y
  815.         mov     cs:[pos_y],dx
    ' |& f: J, |0 i6 R* s  g
  816. good_ver_max:
    4 [2 W! l9 y& p  \- q. c, @
  817.         iret
    1 u7 M' K% f( V1 C: Q- l+ \5 V
  818. 1 O8 {8 D  H; Q) |* J
  819. max_min:
    # A2 ?7 j( p9 Y2 ]
  820.         cmp     cx,dx
    $ ?  Q( A$ ^, p% G' D
  821.         jle     no_swap$ ]$ ?5 v1 O: o- ~" k
  822.         xchg    cx,dx
    5 h4 q0 D, k! X# {( W( ]
  823. no_swap:" Q9 Z" z) K4 w$ M. n
  824.         ret" _: }" A% g( _
  825. : s% F) \1 e+ B
  826. _set_subroutines:
    8 ^+ x5 ?' r! N6 R2 @
  827.         mov     cs:[user_subroutine],dx
    + u- M- ?8 J1 P, W5 [1 s
  828.         mov     cs:[user_subroutine+2],es
    2 l% T8 i. `) P  B+ D- ^
  829.         mov     cs:[user_mask],cx
    ! L0 k' y! n' F& a* R
  830.         iret, B3 I; d' {3 I2 V% w+ ^0 Z
  831. 9 X! O5 O5 Y# p0 u5 W$ M
  832. _swap_subroutines:
    + E! l$ Q( p' t7 X6 M+ {9 Q
  833.         push    word ptr cs:[user_mask], B3 E3 S  l) q- A
  834.         push    word ptr cs:[user_subroutine+2]
    - O9 e; e! x3 S5 G; W- a! l
  835.         push    word ptr cs:[user_subroutine]
    + S7 ^2 H7 `2 n3 {
  836.         mov     cs:[user_subroutine],dx2 W" G9 f8 y1 C- I8 w
  837.         mov     cs:[user_subroutine+2],es) b/ ]' O7 v+ t: y4 }4 m8 B
  838.         mov     cs:[user_mask],cx4 _; W, `% X" y5 f" s  J
  839.         pop     dx
    4 a  g, n0 {. A: d9 P/ K$ A
  840.         pop     es
    5 x- Z# m. O: }- e. W8 G& k( v$ w
  841.         pop     cx
    6 p; {5 [0 x" S; ?# h( v0 m
  842.         iret
    ! o/ e/ d2 D/ d5 u* c+ V

  843. 3 K/ e9 c# m- I5 m3 y5 }
  844. memmouse        endp
    0 x/ @  d3 g) M# _! u- e- k

  845. + I/ ?) _8 S! T0 w0 N# Q. Y
  846. endof_start:
    & b9 O* b+ L2 Q+ u3 v) Z0 o

  847. 3 p( K" g. ?" C& |9 d
  848. emsg db 'No mouse driver install error!$'
    " h# x- k: I) d2 [- s) d8 y
  849. old331 dw 0
    : H) |% O2 }" U& g/ O2 y# u
  850. old332 dw 0
    8 D4 z% Z* _3 g6 p% R9 [4 @7 S
  851. old741 dw 0
    3 W! X$ H" V8 D: P
  852. old742 dw 04 P2 E+ f* I4 b5 l* ]6 r) Y
  853. memcopy db 0& v8 Q  {" C2 \  n* n
  854. okcheck db 0* |6 u& P6 H( F$ o3 L1 ~
  855. pass db 0& ~, Z3 V, T, l. k
  856. chkl db 0
    4 V5 X) A  G  }9 X
  857. lk db 0
    $ P+ Z  H" N! g4 K, P
  858. chkr db 0
    ; F" |" n! E( y& G" X! `7 y6 v8 k
  859. rk db 0
    ; |; h! C. z2 J1 b7 j# m( r: V
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    / V4 B+ K1 y0 P2 z* U, L2 i
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    ' h% G% m/ T" U0 k) {
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '7 k/ q" j( g. J; J( L$ z
  863. db '                                                                                '. W" }+ S: R5 M& `1 t9 p5 h7 b; y
  864. db '                                赏屯屯簧屯屯突                                  '4 S9 O- G( x' @  h8 r& O
  865.         db      '                                ?OFF汉OFF?                                 '
    , y: j5 [! J" M- @4 q9 c
  866. db      '                                韧屯屯既屯屯图                                  '" N' _& L) m! c; E
  867. db '                                                                                '% s3 u& Y  L4 ?( ^
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '* v8 m% ?0 e3 b! n" @$ q
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 7 D* K3 X) t8 P8 J" r/ G1 y; k
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     ': C% W* i- A6 I
  871. . _* h# P$ K) Y. U' x& w7 m
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!3 j* G( N, r1 h) Y: _  C
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
; B# n- [& m5 u- P/ _! k9 g4 F. \9 u
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:55 , Processed in 1.632257 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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