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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。8 Q3 N0 q7 p  E4 o& t5 E! v8 {1 b
  u7 H- E( s% M7 z  i
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ' {% J% A5 V7 |1 J
  2. ;          Ufoit PS2 Mouse test program   Ver 0.99 N6 F6 [6 C+ ]8 \/ ?# d6 L
  3. ;                                         By Bini.Yi 易祝兵9 Z% H5 h% |# X% |  D7 O+ x* u
  4. ;                                         http://www.ufoit.com 计匠网" _9 ^9 }2 R' f. U6 n  O
  5. ;                                         2002/04/06 YYYY/MM/DD' l7 o/ g. ]5 \) N/ R! }2 \/ e, s
  6. ;
    5 l! Q1 Q; l, P9 |/ d- ?
  7. ;         
    0 `: V$ m( P. Z) M+ B
  8. ;          This program  test the mouse button  click and move.4 f" b6 p) z! a) }) o& Z- g
  9. ;
    & |' }" S+ v/ m
  10.   h2 L& p, N8 f$ s
  11. .model tiny) _4 i' C& i! Q
  12. .5867 D  P6 F* r8 e3 L4 K
  13. .code6 o) K0 k+ T& d
  14. .stack  100h8 S( P- k7 k4 |( X* Y" y7 Q2 C
  15. .startup
    : T& K0 M: v, p. s
  16. pusha% V( |' {6 E- e  ]
  17. mov ax, 3533h  _( u+ ^3 z# |. _& u+ n
  18. int 21h
    % ?# m, j: K, {5 c0 i- P" K/ A
  19. mov word ptr cs:[old331],es
    . V2 e6 `, L6 e3 Q5 f! K
  20. mov word ptr cs:[old332],bx$ [) V3 F: J1 k7 A" I; y
  21. mov ax, 3574h
    . z8 g) h1 e7 Q, P' o
  22. int 21h
    ( K$ x. R, z0 |/ L  X( y
  23. mov word ptr cs:[old741],es
    ' R" k. R$ H  W3 q
  24. mov word ptr cs:[old742],bx6 z9 e2 A+ W2 `: S, n: C
  25. popa
    # w$ H: A& R4 R" ^1 ~
  26.         call    memmouse3 x$ n; R4 H2 h/ l% J
  27.         mov ah, 00
      L. h% L8 w9 U8 s# B7 e
  28. mov al, 03
    $ w% x3 S3 \! F
  29. int 10h. `7 ^) X5 f9 P
  30. mov ah, 06, h  G) F! @: x6 r+ X" d$ f
  31. mov al, 0/ {1 j8 V, k& G- R8 d/ j
  32. mov cx, 0
    $ }1 T6 {! K' T
  33. mov dh, 249 |) j% k5 U+ C  G" q
  34. mov dl, 79
    5 ~; I7 p0 a6 _1 z8 H
  35. mov bh, 07h
    , ?: V# Z$ ]: L' J" ?2 d' d) ]
  36. int 10h& |# \/ c1 a) A2 g6 N
  37. mov ax, 0000+ P. U3 \$ o" L1 }# _
  38. mov bx, 0002" e; g- ?# N7 W; d2 O  s
  39. int 33h4 T  J% A& w8 }, K$ N! P
  40.         cmp     ax, 0000           ;if no mouse drive install
    5 |* P& H  `7 \, g6 G. u: }; R3 R
  41.         je      errormsg           ;show error MSG1 I, D0 P% R0 U" O0 ?
  42. mov ah, 02
    $ u2 V$ r* N0 z& v. }1 @8 c
  43. mov bh, 00
    * Y  \9 v* i/ w# _1 a$ H( I
  44.         mov     dh, 25             ;Move point out screen/ ?% b9 }7 W9 Z: g( K" v
  45. mov dl, 79
    - [" p' ?% Q) i, U- I$ S( _" |  v
  46. int 10h3 \5 i3 J+ W/ V6 q
  47.         call    showmsg            ;Show info, H1 b" G6 T+ A' y- i1 z
  48. mov ax, 0001
    ! E. g5 l" ?6 Q# J
  49. int 33h
    . a# }% v* w0 `6 r( n6 u7 I$ T: f
  50. ; mov ax, 000ah  l3 \. N0 _  P/ O
  51. ; mov bx, 0000
    ; I, w, B' ?$ D, [2 ^* E
  52. ; mov cl, 0h
    ! h% @$ |/ N( k$ v
  53. ; mov ch, 0F0h
    # t- M9 G+ ~% d1 e( D2 x' `2 D
  54. ; mov dl, 0h
    0 F/ L+ c' n9 ?$ d
  55. ; mov dh, 0F0h
    & h6 Z% Y1 S) F
  56. ; int 33h
    7 P! l6 @3 l" @+ @/ H/ H$ R, ~& S
  57. mov ax, 0004h; x7 x' n* s) @" x; B. D5 v
  58. mov cx, 0319
    9 Y. R9 \: m6 W, h
  59. mov dx, 0103
    ' \* q8 J9 [1 _( ?. ~+ b$ ?
  60. int 33h0 e, M; K+ r% B7 _! j- t
  61. casemo:                           ;Case button click and point move
    ! ]( ~4 M3 |( }& K
  62.         mov     ax, 000bh         ;and keyboard press7 Z. M9 T1 w: J. W
  63. int 33h
    , {- B$ M* g  x% @4 o% g/ V- T9 s
  64.         cmp     cx, 00h           ;if point move....X7 ?" X, I; v5 ]" ^" _- l1 V
  65. jne xmov
    ! q5 ^! h  U& a8 C
  66.         cmp     dx, 00h           ;if point move....Y
    . E# V2 [/ r! g  b, x* X( ~
  67. jne ymov# L) z+ @; `1 c8 f+ Y
  68. xymovend:                         ;X.Y move end: b. w: v) K( A$ u6 F" {) f
  69.         mov     ax, 0003          . }- q$ M: K4 _5 Z$ b5 v% e
  70. int 33h# l) d' ^# Q( P9 H9 r1 A
  71.         cmp     bx, 0001          ;if left button click  show ON
    & t3 Y; R3 }5 T! ^; k
  72. mov si, 1828
    . L2 j3 \5 e4 n$ K5 a  s- L
  73. je listl
      |$ b6 r3 A0 {) ?6 N2 t0 O
  74. mov si, 1828  N+ d( n) `  ]* N! A
  75.         jne     nlistl            ;if left no click show OFF
    . X% e8 ], R. w
  76. testr:
    + a# x# \9 y" Y
  77.         cmp     bx, 0002          ;if right button click show ON
    " K  q7 b' |+ p- m6 j; i
  78. mov si,1842
    . d7 R6 Z3 R) Z5 @5 A7 X' M
  79. je listr# Z& c5 R  n2 F
  80.         mov     si,1842           ;if right no click show OFF
    $ |9 T" L( o; k. w2 D7 G! H
  81. jne nlistl
    & |# @- a7 c, Y5 w! C* U, |
  82. casekey:" H5 l6 J' `7 w% x9 D# Z
  83.         mov     ah, 01            ;if any key press jump check
    ' W3 F4 w, }. P' B0 J- F
  84. int 16h
    9 o( ?3 ^1 {( B9 Q" B! v7 B
  85. jne kpress! S/ o/ I* S# l' d/ @- E
  86.         mov     al, [chkl]        ;check x flag
    " b. [( H1 Z7 e7 T
  87. cmp al, 02h
    ( W+ }0 b" R, S% a
  88. jnb chkok
    ; @6 d% X7 I8 A
  89. jmp casemo5 d" I2 @. ?8 ?% \+ f0 {1 ~
  90. xmov:                             ;if X moved, get the X flag+1
    0 N5 v! v" F, X. z9 o, O
  91. mov al, [chkl]
    . u  q8 ]5 D: Y+ b/ a+ @
  92. inc al
    - N& Z7 W+ t4 l8 `/ U! e" @. Y$ w
  93. mov [chkl], al
    , a1 K" C6 k& @4 P9 U6 [+ W. M
  94. call passok
    1 E& o! k" J( g# C/ N
  95. jmp xymovend! k& {9 m) ^, W! W0 y( x
  96. ymov:                             ;if Y moved, get the X flag+14 ?8 B/ g1 q, U7 a2 T. ~) a7 |
  97. mov al, [chkr]
    6 Q' K. U; E1 u* h+ ^) t8 B. q
  98. inc al8 V& r; Q0 F. Q1 \0 X
  99. mov [chkr], al
    5 L- X' I% I$ t
  100. call passok5 T3 R' A% y% ]) i# `; @/ c& V1 ]
  101. jmp xymovend9 E& s! k- s' r( @; |7 o: t; C
  102. ' i* a; [% q9 ^
  103. passok proc near
    6 ^  c1 _; `! e$ K# E" ^1 j
  104. mov al, [okcheck]
    : j$ x9 Q' v: }5 D
  105. cmp al, 1
    $ S! A0 `, J* e1 j/ G
  106. je let0: O4 I, }3 A2 E$ V: |$ {
  107. jmp passret
    8 A& W: Y3 X# F. U( V
  108. let0: - v9 ~# M/ h" t9 ?- ~# C% w, H, M: E; Z
  109. mov [pass], 12 \9 ]9 s/ `) T& E9 o5 X9 o
  110. passret:- E8 g4 c8 J5 @& x4 _- k
  111. ret
    + Q8 Q6 \4 m, L7 o6 y9 r6 K! ~
  112. passok endp
    2 H, u# |, k9 D& A- H
  113. + X1 @' W1 N1 G' W0 g  U% n
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    ; U9 r* J. {7 J' N" G" P
  115. mov al, [chkr]
    - @% `# \. H6 Z7 I$ ?
  116. cmp al, 02h
    4 Q$ f0 L9 w  X- I/ F
  117. jb casemo
    - x; g, o! a* N: ^# [) |- H
  118. mov al, [lk]0 {+ ]5 o5 {* m. S
  119. cmp al, 12 d/ a3 a( e  f
  120. jne casemo
    * Y9 o( S' m, Q
  121. mov al, [rk]! {; I' J& U. w; E& U2 _
  122. cmp al, 1; m% R! n: a2 S) u' W4 B/ S& E
  123. jne  casemo4 S& m3 F. S, Y$ G' \
  124. mov [okcheck], 1
    5 t0 J" x* x0 k9 G) ]" R
  125. mov al, [pass]) {& B; Z3 ~. _2 Z
  126. cmp al, 1. [6 v) c3 R0 @  O/ g: ]/ i
  127. jne  casemo- P; s! s+ v" r
  128. mov ax,0002h
    * i4 C3 E* i) F, g7 S; D5 E
  129. int 33h" Y6 X) H4 K& q* q5 ?4 S
  130. call cleascr
    5 `: a! C$ K  A* `

  131. + j. G. o% d; N
  132. call oldint# h, M, e+ G  S5 z& v
  133. mov ax, 04c00h: N% w3 M. M# y: @- c1 K# |5 t
  134. int 21h
    : h" d8 J( E5 x; ~. I/ s
  135. 8 Y$ g. L/ z4 z1 E
  136. okexit:% f& d3 L; q4 |/ B# ]' ^
  137. mov ah, 4ch
    , u" }- Q7 X, B  G' w
  138. mov al, 0  G5 b+ c; G. `. Q/ Z, F
  139. int 21h
    # J1 U+ l" w  \1 z0 k& a, W
  140. listl:                                 ;Show ON, Y; B) P+ D4 \2 S8 r( [
  141. pusha
    3 T6 f* j: z4 r. k& V4 e
  142. mov ax, 0b800h
    - p1 K; Q% ]7 T0 G0 o1 e
  143. mov  es, ax
    2 L3 V3 `! x4 P. p" D# S' B  w
  144. mov ah, 47h
    ) M) w, M) Y- l! p  C3 f
  145. mov al, 20h
    9 W5 k- ?2 s% U6 b' _1 @
  146. mov es:[si], ax+ p- J' `$ @2 E" [3 g
  147. add si, 02
    * b4 j5 @' ^; N) C" \
  148. mov  al, 4fh, J* }) Z- ?5 \4 F
  149. mov es:[si], ax8 J: B/ \2 {  h$ v, W9 \
  150. mov al, 4eh. ]  e& }4 \" }* q( h- f7 v' X
  151. add si, 02
    9 b: D/ W/ e( Q% F
  152. mov es:[si], ax- O6 }# v" C2 c- s* [# ?2 `
  153. mov [lk], 1
    1 \9 q8 q* y! y0 K4 P3 b& i
  154. popa. I+ M. \0 Y' r( e
  155. jmp testr
    + ^  {# N- y5 ~2 J, D
  156. listr:                                 ;Show ON7 v, e  L! W( B1 @- t  X% J1 k% J
  157. pusha
    . q. s0 B% X1 z) q
  158. mov ax, 0b800h
    6 q3 {' e% z2 t/ t9 U/ j8 A
  159. mov  es, ax
    6 C* p' F& g. B, v) W* ]
  160. mov ah, 47h
    5 b# E/ _+ \( ]
  161. mov al, 20h* K. E2 I$ f2 }( k
  162. mov es:[si], ax
    ' |$ ]$ ]. _& E' ]1 E7 ?' t; C
  163. add si, 02
    / K# D+ u7 j7 D9 U( t5 p( G
  164. mov  al, 4fh+ j2 o& R7 l9 N4 K7 G
  165. mov es:[si], ax
    6 w  F: |- g/ X
  166. mov al, 4eh. M& \- i6 x, Y/ C  U( h
  167. add si, 02
    : Z' j/ F- i7 N. \) W
  168. mov es:[si], ax
    / k! J4 d7 z" Q' I0 K8 C" _
  169. mov [rk], 11 O6 V# e" |+ u$ D9 Z1 j* `
  170. popa
    . d! |/ R' b! N- u9 w, ]( }5 w2 C
  171. jmp  casekey
    ) [% |; V" D' a4 Q
  172. 2 O- |1 |8 t# M5 s' e5 A
  173. nlistl:                              ;Show OFF
    # E% F- \$ v& q8 s
  174. pusha   % O* q. z, x/ j, }
  175. mov ax, 0b800h# c# k, E: {; h# s
  176. mov  es, ax
    0 s  S6 ?0 ?. }9 D& l, S- |8 O. ~7 O
  177. mov ah, 17h' s7 o2 m1 c! x- [0 a: N
  178. mov al, 4fh
    / M" @6 v! D4 H: v/ C$ S
  179. mov es:[si], ax- }  k* e' a; n. t% C1 l) A# A
  180. add si, 02
    6 n6 h' B! v; o  T& H
  181. mov  al, 46h
    9 c2 v1 [8 \4 h7 {" ?, F& d# D
  182. mov es:[si], ax, C# Y+ k* Q, C% r, q
  183. mov al, 46h* S0 ?) N( P7 n+ `/ f
  184. add si, 02
    $ s+ M% Y+ \5 Q! e7 e
  185. mov es:[si], ax
    & U6 ~+ t: K, [) v4 g
  186. popa
    3 v5 B/ C" h- C/ Q- Z- o" i  h
  187. cmp si, 1840
    6 J" g) R2 c! x6 g7 I2 _, X# k
  188. jae casekey
    ; r, _( e3 C( y* w
  189. jmp testr4 {) Y0 ~. W' l; [3 k( m' Y) _/ f

  190. % G: j: Z' b+ i' n: a3 b
  191. kpress:                             ;Check key press if press<ESC> then EXIT1 y4 Q. N1 `# Q- J8 m, }, C
  192.         cmp     ah, 01h             ;and return a error
    6 V" K9 E3 R4 N& B) p# s  p
  193. je exit1; f1 ~0 c/ v, X
  194.         mov     ah, 0ch             ;if press other key then clear
    2 I. p  _" s' {0 \
  195.         mov     al, 00              ;keyboard buffer: g0 Z* C7 g: N' s1 ^5 S
  196. int 21h2 n4 l# {( R$ k; d5 P
  197. jmp casemo
    ! E  j% K% }) t$ J, ^* [8 c

  198. 6 e1 D  B8 i  B* V( w4 X
  199. errormsg:                           ;if mouse driver no install
    5 z; U5 u- {3 T& N  \
  200. call oldint. }$ R6 M  Q+ |7 k7 n+ {
  201. lea dx, offset emsg: x) n" t# Q2 a8 U" K3 ^8 C
  202. mov ah, 09h
    / a8 m  L8 W" l) i& l- a/ B6 j! l5 E
  203. int 21h
    ( f; d3 o* ]! \# e/ X! w; F
  204. mov ah, 4ch
    ( H, H/ y4 G+ e1 E) r- g. X
  205. mov al, 2) I5 E) \+ H4 X$ o/ U
  206. int  21h9 W/ d! I7 }; H: y- S

  207. $ `9 m; T9 Z3 `5 S8 b2 U1 K& L8 Z
  208. exit1:                              ;error exit
    5 k; W1 P1 G$ f' a
  209. mov ax, 0002h
    # e! x7 p4 L6 b( b3 v
  210. int 33h
    / M& s$ J3 \& T. Z( J. J
  211. call  cleascr: |3 p+ T1 a& j, [2 @) Y, H/ f: x% U, Y
  212. call  oldint, [" Y- q! ?4 H3 ]: V& {
  213. mov ah, 4ch9 g9 A; F0 |* M9 Z1 w. U0 U
  214. mov al, 01
    7 M/ d  C( Q* s$ w- f) b; F
  215. int 21h
    - b! U6 C/ B6 a) R
  216. 3 k. [- ?1 @8 f1 s4 f
  217. cleascr proc    near                ;clear screen8 g9 A& a- W- t! q
  218. pusha
    ' g- v. a  B- K0 G% n
  219. mov ah, 061 W' E* P6 ?& E2 T! d
  220. mov al, 0
    : S: r! ^" f9 {: A' }$ h  ]1 W1 {: a- O) ^
  221. mov cx, 0: [! S& @1 E/ Q
  222. mov dh, 24
    2 ^2 f* @( R' K2 ^, U
  223. mov dl, 799 f7 w) \+ Z2 W: p; ^' r
  224. mov bh, 07h
    1 U. r1 M4 d: k# G' u; s  n
  225. int 10h
    2 n, ~/ O) N$ \2 D& T8 r9 M% j& N1 ^
  226. mov ah, 02
    # Q5 k# _% i% M0 B' F
  227. mov bh, 005 u9 o* F4 H; F* s( v! Q
  228. mov dh, 0' \, U5 w! @0 M1 R  I- r
  229. mov dl, 0
    ( \% p, M( O* v( \
  230. int 10h8 f5 y1 ^" S2 v9 L1 _8 U2 T* s
  231. popa& m- m9 d+ I* J, ]( E: s
  232. ret
    & y; Y* Q" J  `( N0 H
  233. cleascr endp
    1 R1 m9 S4 x8 p2 W
  234. . I0 |8 U4 B# B
  235. showmsg proc    near               ;Show info
    : V& f5 K) J. }7 s' p
  236. pusha
    ! U" ]1 ?6 E/ F; w/ l! e
  237. lea di, offset showms, ?7 k8 T3 E: v) f' ]; j) K) l
  238. mov ax, 0b800h8 }7 \+ x+ P0 G# \0 a
  239. mov es, ax
    + W% l3 L/ @# z0 _. U  C
  240. mov si, 0
    ; a* H; m+ u3 R% y5 M
  241. mov cx, 480
    1 I. w  x% d$ U
  242. mov ah, 07h! e& f" d% a. O! v. {- h
  243. @@:1 N' A( T6 u  e, \) x
  244. mov al, 20h
    * N/ r+ L8 U) m$ o* u6 A3 k0 p
  245. mov es:[si], ax
    % h% o8 R# Z  ^' x- |: H
  246. add si, 2" K& ]: f1 D) `. r7 d* }
  247. loop @b$ z5 {' o5 b) X$ g9 d3 k6 w; N
  248. mov cx,880( e3 l7 l8 s( L/ P
  249. @@:
    ' S  l; i* j6 n/ x
  250. mov al, [di]% a0 K& O$ L9 M* G5 X; F% c
  251. inc di
    3 O" `% S- E4 n) r' p  i
  252. cmp al,20h
    3 W. v. M1 [( r) p4 [
  253. je showch1
    / W2 z6 f; s7 K8 B; G
  254. mov ah, 17h% C; ?' V0 b% q- G& r% N, q6 Y8 |% p
  255. jmp showch3 + x/ X* t+ \, r# o$ d5 p; E9 A6 X
  256. showch1:
    " {  D, ~  [  A9 m1 `) K
  257. mov ah, 07h 2 f+ V+ V' V  b0 F$ O! y0 d
  258. showch3:
    ( I5 |! |$ w/ F) v' ^+ s4 I/ V0 @
  259. mov es:[si], ax
    7 b5 P4 l% `8 y
  260. add si, 2
    ! q9 @+ l' e7 @6 E1 \' x% A
  261. loop @b" W# P6 @7 V, J" A  y0 t
  262. popa: ?5 N  F/ s, j$ N4 v% t6 Y: ?
  263. ret
    6 ?0 b, n% W  c2 G' Q' s0 S
  264. showmsg endp, f: o9 b% K( ]+ T: M8 x1 U
  265. 3 }! a5 u! k; }" r7 ~4 P. z
  266. oldint proc( o  R" L; y4 v# f4 L
  267. pusha6 h( m- \* h' B3 V5 U
  268. mov ds, word ptr cs:[old331]
    * e% u4 @1 h) v. e9 h# U
  269. mov   dx, word ptr cs:[old332]- R% ?& D* N7 x" ]1 J. U
  270. mov ax, 2533h
    3 ^7 N4 P, T9 z, G
  271. int 21h% |& P9 |7 y" H% [  G( z+ B
  272. mov ds, word ptr cs:[old741]! e. P; t. `/ y4 t. [
  273. mov dx, word ptr cs:[old742]
    ; E6 l2 r* Q( O3 K8 L$ T; d
  274. mov ax, 2574h
    1 T* S( I& X' s: z) D7 J
  275. int 21h: E  W1 h  ?7 _& T
  276. popa
      l, _% Z' r' [% T0 d* a1 I
  277. ret
    " Z, K0 D# k# a  G, w/ ^
  278. oldint endp9 S# L, l. m& b4 T. ?: L
  279. " C) _2 i% m& k* D9 t% Y
  280. memmouse        proc5 q1 f$ g) ?7 c' b
  281.         xor     ax,ax
    $ n  I) I2 A4 b; y/ S6 h2 e
  282. int 33h
    4 M: x0 q9 p7 E$ T) U) B# M
  283. cmp ax,0ffffh
    ; o$ h- k, t* y, U- C" i. _
  284.         jne     not_loaded5 |" n/ w2 Q" n3 _5 F1 U  u" P
  285. mov [memcopy], 19 \& v4 S% d: o( Y; ^
  286. ret9 [+ B$ U  X3 a" c; r7 ]4 |3 [

  287. . E& B6 U. _& ]& `: g. c
  288. not_loaded:
    ; X. ?/ D% m) q8 M
  289. 2 T% M. `4 p! l
  290.         mov ax,2574h8 w9 K) M9 T. \6 I7 p
  291.         mov dx,offset new_isr7 g) r3 r  }! F  G1 P
  292.         int 21h
    : ^) C) A% D4 Y% w9 x
  293.   ~0 G# ]2 n% F; ]7 f+ x5 G, M
  294.         mov ax,2533h
    9 N6 Y0 Q( P3 \4 T* S( [
  295.         mov dx,offset new_33
    + c) V3 L. j3 n$ {/ j. U& o
  296.         int 21h
    8 Y+ Z" p2 M# o
  297.   v: d3 }" e9 T' N: N
  298.         cli
    - v$ l8 c+ I3 o4 D) C0 g+ l
  299. ) M; i) W" W: Z3 l( f
  300.         mov bl,0a8h
    % k# a9 u& ]( a, N. M" k2 D
  301.         call keyboard_cmd
    * J5 K0 F+ r& k

  302. ' g; S: |$ s0 O1 {
  303.         mov bl,20h
    : a; a! `. `7 |: _3 j8 i
  304.         call    keyboard_cmd5 p( u+ O  R9 d. Z8 ?# p  K
  305.         call    keyboard_read
    & y8 H# o3 c! y) d8 O: O9 W, U& Y  s
  306.         or      al,2  ]5 }$ z$ S, Z
  307.         mov     bl,60h
    % m$ p) M! |0 S, z- f/ D; I2 t& W" K
  308.         push    ax+ C2 w! `( @- U# \4 M( P
  309.         call    keyboard_cmd% m  @- L) @8 w$ _
  310.         pop     ax
    % e! ^9 C+ L0 e8 ^* `/ Z
  311.         call    keyboard_write& c" N  {8 e7 N. u1 E6 p
  312. 6 O/ q3 R9 V9 c& M
  313.         mov     bl,0d4h
    ; A( D" o! {: B
  314.         call    keyboard_cmd8 W/ L0 x( k. x2 k3 R6 q& \2 U( X
  315.         mov     al,0f4h
    6 w" `- }. s/ ?! G
  316.         call    keyboard_write6 E* \0 y5 N0 b5 @* Q) m
  317. + X3 K. }; p9 D9 F
  318.         sti
    + ?* N/ v% k% F/ j9 f6 h
  319.         ret
    . o/ v3 v4 d6 v3 [2 W* m: P+ |
  320. call_user_isr:
    0 U- K: S& ]2 f  k9 e! d
  321. db      60h
    9 h- d* [: R5 ~9 M
  322.         mov     cx,cs:[pos_x]
    3 I  ?2 d5 y1 @' G
  323.         mov     dx,cs:[pos_y]
    ; E, x8 P7 b- A1 M* M* l
  324.         mov     di,0 ;cs:[x_move]3 O" F. G2 l! s7 T0 z: k
  325.         mov     si,0 ;cs:[y_move]) y) B" M4 m# }
  326.         mov     word ptr cs:[x_move],0
    , J6 m; V8 Y9 S" A
  327.         mov     word ptr cs:[y_move],0+ Z: b# \7 W" E5 [- Q/ I
  328.         mov     bl,byte ptr cs:[buttons]- z3 v" H) W4 }# g- {. ~* k' J9 i
  329.         xor     bh,bh
    ! s( O: E1 K) d' y) g
  330.         call    dword ptr cs:[user_subroutine]
    ( p4 f' D  o3 [7 F
  331.         db      61h0 f4 r8 a/ l# D/ D- \4 ]" H" L
  332. ret
    , H) h, ~7 O) V  M# D
  333. new_isr:0 h& g9 N- ^! _: W% w4 n& J2 B: ]. L
  334.         pushf2 H) i# N- Q4 Q8 ]# f( f2 ~+ q
  335.         cli3 s) D- C; C9 v; ?
  336.         push    ax/ j" E1 C: m( @7 }) {
  337.         push    bx; E, m3 }" I% W9 M; B6 k
  338.         push    cx& Z, U) b' G* C8 w5 ^, v6 E( q
  339.         push    dx
    3 z8 _- Y' ~; _% U/ w8 U
  340.         push    di
    3 b$ m3 e: S6 V3 e
  341.         push    si% r: S/ c9 b7 q# D2 \1 G$ ~& _2 t4 D) V( q
  342.         push    es
    . X! z" f+ s8 O# `0 y  a. L( w+ N
  343.         push    ds
    , L5 j# O* t/ K

  344. $ z& f/ s1 I2 `+ s: R/ Z. {  D; T
  345.         push    cs
    ( l# y5 z* x" K$ {5 [
  346.         pop     ds2 Y8 s* U: Z/ t# l0 p' ~* n: I
  347. ! Z5 [6 ]! T/ _+ T) e2 d& N" e$ {% f; C
  348.         mov     bl,0adh
    0 U7 S" m, f' D
  349.         call    keyboard_cmd
    2 N9 X# C" v8 ]; p

  350. 8 Z& r0 e( l% U1 X
  351.         cmp     byte ptr [first_time],0
    ' R6 ^8 n5 S! P0 v3 Y8 F$ [
  352.         je      not_first_time1 u* S* |/ e2 A! b0 Q
  353. - _$ h/ J2 R$ n
  354.         mov     byte ptr [first_time],0
    " Z5 K3 n1 g- F1 R3 J+ q
  355.         call    keyboard_read! x6 r/ F' `1 L$ y3 q9 z  e
  356.         call    keyboard_read
    + x2 Y, |  j2 v1 d+ U# `& t5 U
  357.         call    keyboard_read/ Y' F9 L. S2 {% b
  358.         jmp     no_show. h7 O# \7 k/ x/ h4 G
  359. " `5 U, ]' ?! y; i. K8 M
  360. not_first_time:
    9 u: \. u1 Z( l
  361.         mov     word ptr [temp_mask],0
    7 A7 r7 }# c" Z8 v) }! J. I+ R

  362. ' N- s. X0 w. h- d' S- Z4 r  Q
  363.         mov     cx,[pos_x]" `& z5 z  `  ?) i
  364.         mov     dx,[pos_y]
    ) v, ?9 m" ^" \0 C
  365. * j' x1 A6 |. d
  366.         call    keyboard_read
    / U$ m/ |8 y' @
  367.         and     al,7 ;3, V9 F+ n2 }. r' B8 ~, X
  368.         mov     ah,[buttons]3 M4 n- u4 ^) V, G
  369.         mov     [buttons],al0 e0 g( _& t* f3 k
  370.         cmp     al,ah: F4 n+ o; ^  |/ {
  371.         je      no_button_change
    , J2 |2 j1 ]# k; r
  372.         and     al,3) H3 N$ Z+ r  L7 @, ~, n! g
  373.         and     ah,39 S. F* _- o6 D5 ^1 `" ]
  374.         xor     al,ah) b7 v% X+ ~2 d( p" i0 z
  375.         xor     bx,bx7 L) }  O7 C6 j* T( B2 p: A; x' L- Z, R
  376. + v5 a3 |, t+ L' t+ Q
  377.         push    ax$ x. y$ ?8 r0 M3 U7 o
  378.         test    al,2* C/ A" Z+ r9 I4 H  g/ f
  379.         jz      no_right_button_change
    , e3 ~# S, U. }4 Z$ @- ~2 U
  380.         and     ah,22 k+ t; o: B! K2 @, B" i7 H# F( I
  381.         jz      right_button_pressed1 c7 i. Y5 ?) T5 E9 G
  382.         or      bx,16
    3 f$ X/ X% e6 G, Y. F: u% Z
  383.         jmp     no_right_button_change2 u# Z: V+ |! y  U* ?' }
  384. right_button_pressed:
    $ y/ F; u" |: j& |* W7 X" Y9 s* a* d) h) K
  385.         or      bx,8
    $ ~8 D: a' k$ P
  386. no_right_button_change:
    . z9 M% ~3 N+ i" u% y  R  P

  387. * X! q  i; y; X. D4 Z2 ^
  388.         pop     ax
    4 }6 R7 i9 [* ]0 a( V
  389. " d6 n$ g7 W. H1 o9 m% w
  390.         test    al,1
    . V1 V/ j+ A5 [* M; {" w' i
  391.         jz      no_left_button_change3 l/ [( Y# j* m
  392.         and     ah,1( ~" i0 O( O  P5 y9 R& ]  D
  393.         jz      left_button_pressed+ d8 ?& c& S) `
  394.         or      bx,4
    9 ~# U7 g7 r" D6 ~# Z
  395.         jmp     no_left_button_change
    * V  `; k& v  I! s. A
  396. left_button_pressed:  [- Z4 T7 N. e
  397.         or      bx,2% }8 _: n9 F7 F4 M1 i. q  \" a
  398. no_left_button_change:; Z! Q$ D; C: T: e; N
  399. * y0 d& M* D+ v  b4 o0 ]0 Q
  400.         mov     [temp_mask],bx
    ) F0 h- o- v; o8 n( [0 j
  401. - S0 e$ |' B* E
  402. no_button_change:
    $ `3 \* B: Z6 E4 z
  403.         call    keyboard_read! p: Y# ?8 k: \' i! L
  404.         cbw
    ; Y2 v: ^% N$ O- W' P! l, F5 N7 m
  405.         add     [pos_x],ax0 V# `9 Y! j7 R5 j) s
  406.         add     [x_move],ax
    ; ~6 K' }, j( E1 S6 Y* e, Z
  407.         mov     ax,[x_min]8 c* n: w& j- H& H' X! g8 s
  408.         cmp     [pos_x],ax
    5 |4 B# b7 {6 I' E/ J5 r' c5 Z9 X
  409.         jg      good_hor1  y$ G5 H3 O9 |5 u$ w/ \
  410.         mov     [pos_x],ax
    4 d+ ?+ b: j# E. Q; i* g/ P
  411. good_hor1:0 g; D; G: n! k
  412.         mov     ax,[x_max]
    % e8 B/ t! F$ ]4 F7 X
  413.         cmp     [pos_x],ax
    $ j: b4 d  o( M; W
  414.         jle     good_hor28 }7 h, k4 y+ F' t3 ^
  415.         mov     [pos_x],ax6 o+ f5 B* x9 @: A6 ]' j+ ^5 ^) {
  416. good_hor2:
    ) I/ ^0 R. Q" T/ ?2 M- s
  417. # f+ ]! |( R: P3 S
  418.         call    keyboard_read5 X. j% Y3 C; K; v) M- h7 w% M5 e
  419.         neg     al
    . U! v; o: R1 s+ S" ~3 D
  420.         cbw
    2 ~. S7 z3 h; U6 l7 i7 V7 ?  b/ F
  421.         add     [pos_y],ax
    + D, k1 H; [9 J
  422.         add     [y_move],ax5 d  q  o1 `5 H- c& b
  423.         mov     ax,[y_min]
    ; Z) I5 j4 m: B. U& f
  424.         cmp     [pos_y],ax& |" J( M9 O9 H3 R% W2 }
  425.         jg      good_ver1& F7 v5 O- l- f4 p2 _/ Q2 V4 Y
  426.         mov     [pos_y],ax# d  d2 u* ^6 S# D7 ~( C" ^7 P
  427. good_ver1:
    3 O/ x8 z# r1 w/ n9 C
  428.         mov     ax,[y_max]! @# c5 R5 f( x. Q* g
  429.         cmp     [pos_y],ax
    % g- \" }" S" d. H7 W; p
  430.         jle     good_ver2
      E* o* ~/ M0 t6 I- X4 }
  431.         mov     [pos_y],ax
    ) }% K# P' y, N4 |
  432. good_ver2:0 a& ~7 k- o& B; O# \8 v/ H& c

  433. ! ?) v& V( v5 j' A" f: [
  434.         mov     ax,[x_move]
    3 n! K& f3 {) o" ^% {8 X
  435.         or      ax,[y_move]
    6 n7 n+ E% D; y/ ~* a* j4 n
  436.         or      ax,ax1 o2 t* ]/ F$ t
  437.         jz      no_change_position) ?( j- a+ v0 L1 N0 E8 ^+ |0 b  e9 b* T
  438.         or      word ptr [temp_mask],1
    7 W8 m) n$ C, @
  439. no_change_position:
    0 O. T* {4 ^- d, h" w: A) Y

  440. + T& @6 F' I, u0 |( v+ F' }& v
  441.         mov     ax,[temp_mask]
    ; H0 j6 E7 J5 C4 V
  442.         and     ax,[user_mask]7 ]/ D" j# C, H
  443.         jz      no_call_user
    , s( ^  S: m; n" n, |. z. }
  444.         call    call_user_isr. _. j/ B" I4 E3 S: n, C6 y
  445. no_call_user:
    % \) p4 F! t" l8 q' H# B  Y2 {3 E

  446. 6 G, ~3 K8 A1 N* {2 @, V
  447.         cmp     byte ptr [sm_flag],19 l/ d# j% O3 @: [
  448.         jne     no_show* S1 l) U; k. n; s

  449. 0 K5 n- [: O6 ]' Q! q4 U
  450.         shr     cx,3# N6 f2 r) C, z$ h
  451.         shr     dx,3
    5 C, P0 p  d; Y5 T. t2 y
  452.         mov     ax,804 f7 _% Q  ^% A# F$ u
  453.         mul     dl0 q9 X: y' R* K7 f$ g
  454.         add     ax,cx2 X* D* W/ M! }' m$ a
  455.         shl     ax,1. ~7 r. Q, @# p: Q
  456.         mov     di,ax
    ' r+ Q" ?( D; ?4 ~- [
  457.         mov     ax,0b800h
    , \# {. G0 x' F+ ^
  458.         mov     es,ax
    $ s. |4 {9 B% g1 v6 n) x0 R
  459.         mov     ax,[save_char]
    , F6 n8 d" j. O9 i
  460.         stosw  r! c3 E1 E! ^* ?! w2 L/ w6 r
  461. + i6 {# K; z5 d. o* Z; u
  462.         mov     cx,[pos_x]& r$ ]3 F; L! }+ a6 M  w
  463.         mov     dx,[pos_y]% P; A& w9 k% U& M. o7 F
  464.         shr     cx,3, ~" l# X+ z3 o; g5 H. c
  465.         shr     dx,3# U" T% a# G% m3 Y0 Z: O( L1 b
  466.         mov     ax,80+ u+ z! e  W: c1 W7 _: T9 \3 r
  467.         mul     dl
    ' F3 d7 [8 ?  x$ i" F* {+ F+ G
  468.         add     ax,cx
    9 t# L5 L2 K! t: P( p+ b0 p4 J. ]
  469.         shl     ax,1
    & a) j/ O; P' H6 {  U  f
  470.         mov     di,ax6 P& z0 i5 I* N
  471.         mov     ax,0b800h
    ' M9 o) _" s- }- c& s
  472.         mov     es,ax
    + S7 B! u. t8 t8 T
  473.         mov     ax,es:[di]
    1 ~* ~9 `* r' S, J
  474.         mov     [save_char],ax2 e- y6 S7 N1 L, B/ V# y9 A! @
  475.         not     ah
      B6 G' X. z8 @. D
  476.         and     ah,7fh
    ; G. b: a4 o; Y) k( n+ X
  477.         stosw# n% H( ]/ {% v
  478. no_show:
    & i, S, l5 m( ~8 X0 X# l
  479.         mov     bl,0aeh( L: v. ]4 v. F+ f- ^' p: ]
  480.         call    keyboard_cmd( ^9 C; r4 P! R3 W

  481. 8 a- T( E  _7 a4 L1 ?7 U" r* d
  482.         mov     al,20h" g) x. A( G' t+ c9 b, M7 Z2 Z  a. E
  483.         out     0a0h,al
    1 Q/ Q3 ^" H0 L- a; x
  484.         out     20h,al
    5 Z' z/ q- r1 Q/ }' }" Q
  485. & n1 r( E9 h1 g3 ?
  486.         pop     ds5 B! I# ]% \9 k4 S! `: H9 n
  487.         pop     es+ |3 J! U8 V# T
  488.         pop     si
    ) Z+ R1 k) v# O, |
  489.         pop     di, `) q* `1 f7 N
  490.         pop     dx" _! p' j0 ~; p- S- x, P
  491.         pop     cx
    . Q" _6 Z4 c, ?  Q4 N# O& k
  492.         pop     bx  [/ M6 e: [5 ]
  493.         pop     ax6 g) ^/ s$ N, W" w% T
  494.         popf
    9 Q+ \0 X$ c+ r# \; n
  495.         iret6 t$ ~5 c4 v' Q: O: w! p
  496. 4 g% \/ m. c5 T, t
  497. first_time      db      1
    1 T) H) t( q! @  p3 t
  498. buttons         db      0
    ( [2 m' b! |1 d; {* C! B
  499. pos_x           dw      04 t% ^0 t' ]& z
  500. pos_y           dw      0
    " r% h: M, O( Y/ r
  501. sm_flag         dw      0/ X6 ^$ T% t' h: j, F1 J
  502. save_char       dw      0! y# m: I" i: K0 W. X' @
  503. x_move          dw      0
    . ]( w) @, ^4 l' i& G
  504. y_move          dw      0
    * k% J( s7 M( q. Q% {, u
  505. x_max           dw      639. O$ C3 Y( |" c% |$ d3 ]. W( @+ m
  506. x_min           dw      07 {1 v/ H, y- S. a. A# y
  507. y_max           dw      199( R- X: u* N& e& f3 J0 |
  508. y_min           dw      0
    ( k. A9 q% r4 V6 d. Y1 h1 R
  509. user_subroutine dw      0,0. t1 N$ c6 l# R5 n5 N+ V
  510. user_mask       dw      0
    - I9 U( Q) \: A0 B8 H# S$ ~0 P
  511. temp_mask       dw      0" j# l' V7 m+ i. G# ]1 c
  512. 5 X3 A) E# B, _/ ]
  513. keyboard_read:
    3 O, h% D; N! h4 C: M) C/ k
  514.         push    cx
    & ]$ ]0 d+ {1 s( W
  515.         push    dx3 M2 \3 X( W7 Q% ~
  516.         xor     cx,cx
    ( Y4 `$ d! h5 J, }- \4 Q* Y
  517. key_read_loop:1 _0 }! f* U3 d' A, J  {9 M
  518.         in      al,64h
    " y  o' z& [5 q7 e/ F5 o, a
  519.         jmp     $+2, Y4 d. s  M; U! Z
  520.         jmp     $+2
    5 s7 g1 E( T. n" V) S. K
  521.         test    al,11 y/ E4 v' s9 Y5 ?$ p  Q" |' h+ O/ Z
  522.         jnz     key_read_ready
    9 P$ m  v- O& q
  523.         loop    key_read_loop, J2 B. w5 X+ j* S
  524.         mov     ah,1
    3 M/ e# r1 W. c" ]: B$ F
  525.         jmp     key_read_exit
    $ o, x+ L( k' J% T* Z/ d) Z
  526. key_read_ready:9 }& A8 G8 a4 ^' @
  527.         push    cx5 C2 D' L  [5 s4 a
  528.         mov     cx,32& G2 @2 F/ l, r& }0 K. L5 w0 V
  529. key_read_delay:$ F+ z" g! @- d" ?2 Z+ U
  530.         jmp     $+2
    ) Z$ p) O6 j: }  z
  531.         jmp     $+20 B. Q( x5 Z- G
  532.         loop    key_read_delay
    7 e2 Y0 M" D. z1 s* ?, O

  533. $ k8 T& D/ \# d, W; V
  534.         pop     cx9 m" s: d2 p  |
  535. - I, \7 ~4 }; i4 v  y& k) x
  536.         in      al,60h
    : z: K# C1 L/ k6 o  x. A
  537.         jmp     $+2
    - ^* a& K3 L# C9 a) E( I4 @% Z
  538.         jmp     $+2* d- S* S: {: z5 t2 ^9 p6 x
  539.         xor     ah,ah
    ' e& k. m( S9 S4 t
  540. key_read_exit:
    # N2 `' o7 M. \/ J- X
  541.         pop     dx
    1 E) _4 X7 M5 B3 G0 B$ x1 p
  542.         pop     cx
    $ q7 j/ }1 [3 _- f+ H
  543.         ret8 U' H' |0 F, g( U
  544. ; l* u4 f3 T" A: J% }% |7 P5 d6 G
  545. keyboard_write:5 p$ N3 D3 U2 w) A5 e7 |4 k2 C* t
  546.         push    cx- a5 ~" c+ W: K5 _/ X
  547.         push    dx
      E  Y. R/ q% D3 f0 j
  548.         mov     dl,al
    - ?, L" \4 K2 b. D
  549.         xor     cx,cx0 A4 `; E5 v! `1 v3 {
  550. kbd_wrt_loop1:, U6 s5 M# ]3 H1 |
  551.         in      al,64h
    : Z5 t# r  N- y4 j' D6 H
  552.         jmp     $+2
    ) ]4 w  L4 ~9 B: o; |# B
  553.         jmp     $+2
    ; O! `. d* ^; w  f) t9 O, a
  554.         test    al,20h
    ( c3 v9 S/ a4 B* H
  555.         jz      kbd_wrt_ok1
    : F# h7 O8 R+ b4 {

  556. - W2 s; Z: F  P: |! m
  557.         loop    kbd_wrt_loop1' D' v8 ]$ w6 ^; `; t

  558. : Q' z+ b3 P, r& N6 F: h. R
  559.         mov     ah,1
    / ~) {4 ?. I/ c, j; o
  560.         jmp     kbd_wrt_exit- v1 n# s: \+ ~2 D! M. J( O# \
  561. 5 Q1 q$ h% q4 [4 J- S3 K
  562. kbd_wrt_ok1:
    - m' @  [& q: }7 ?+ v3 ~# a
  563.         in      al,60h
    ! N* F- ~# z% W6 _: y

  564. 6 t( @7 e! J$ n6 _
  565.         xor     cx,cx
    6 @2 C- `. f) K7 e& _0 {' C; A
  566. kbd_wrt_loop:2 i5 ~$ B2 E3 P* ]) Q
  567.         in      al,64h
    8 ^5 J& G  g; B  t% y' s
  568.         jmp     $+2
    6 }' i3 f) P& d' |
  569.         jmp     $+2
    7 Z3 r# N9 S! U; y' C, c
  570.         test    al,2
    " u* K& Y) f  m
  571.         jz      kbd_wrt_ok
    : j& T. j/ E# P! t( A
  572. 0 J% ~2 L. \7 |& i2 |' p) }6 H
  573.         loop    kbd_wrt_loop7 {% ^+ @, U% ~

  574. % f0 m5 S8 K: N5 j- ^& {, e# ^
  575.         mov     ah,1
    ( \+ X9 R( h) I; q( u
  576.         jmp     kbd_wrt_exit3 ~" \2 G* ~: C  a. D+ k
  577. 1 e$ `- g+ y* x: y
  578. kbd_wrt_ok:7 \+ Y- I3 [( F2 A  g8 p5 N
  579.         mov     al,dl; w" W1 d' ]- o8 n3 ^; W, m" u$ c
  580.         out     60h,al
    * g0 b, R. e" w: I/ u: T4 k8 ]6 ~
  581.         jmp     $+28 C& @. R) f% N: ^6 ~; ?: Y5 s& s
  582.         jmp     $+2
    ) W! R( o( R/ y3 c0 z) U
  583. ' _3 x: q8 ^7 U) T
  584.         xor     cx,cx
    1 v5 o/ Z; ~2 B4 E6 `$ L4 t  D/ O
  585. kbd_wrt_loop3:
    ' b- o& d: j7 C( @8 p: \0 h9 h
  586.         in      al,64h
    ' a7 ]1 o1 |% C$ w
  587.         jmp     $+23 Y, M- k& u$ k. K4 E2 k" C) c
  588.         jmp     $+2
    1 e, L+ b0 o7 i3 \. P: v  ^) r0 j
  589.         test    al,2
    # Q4 f- m/ O, u3 j  V) E
  590.         jz      kbd_wrt_ok3
    4 `  Y& }. C, F$ [  C. x& y6 v

  591. 9 V& }4 K+ w8 L
  592.         loop    kbd_wrt_loop3! c0 s. t& q. T4 y* R% U( G: N

  593. ' a/ E( y; {# _
  594.         mov     ah,1
    ( T% W9 y! Y: m( q
  595.         jmp     kbd_wrt_exit
    ' N& c5 m3 G- t" e2 }* g

  596. $ M2 n  r" y7 `# }' c( n
  597. kbd_wrt_ok3:8 |- ^: {* ]7 B6 K
  598.         mov     ah,8
      I  v) N$ _! I' J6 N$ {
  599. kbd_wrt_loop4:. ~7 B  L" Z7 f* g& s  @
  600.         xor     cx,cx1 c: _, u  c; b. O7 z* |) v; X
  601. kbd_wrt_loop5:) q9 |6 M0 R) u3 J
  602.         in      al,64h
    / D; y5 _2 n4 I& A
  603.         jmp     $+2
    7 X( N3 r1 f0 g
  604.         jmp     $+2
    3 }4 J% u, l6 G- H) x; Z* Z
  605.         test    al,1
    $ t" l- S+ \3 ^
  606.         jnz     kbd_wrt_ok4* n& Q) P; v' M: ~6 C
  607. . S$ x4 H) }- ?/ B- m
  608.         loop    kbd_wrt_loop58 i. X( j' @$ E0 |6 r" r

  609. * I- Q( n% n* O& Z% g& T% N
  610.         dec     ah- ?# J* A; _6 e; ?/ u1 T
  611.         jnz     kbd_wrt_loop4
    4 {; }' X$ t' S
  612. : Q( C' ?9 E/ j' r
  613. kbd_wrt_ok4:0 c0 V9 @, m) @1 t1 o* U4 I
  614.         xor     ah,ah' |9 Q! g6 c5 u
  615. kbd_wrt_exit:4 ]( p! q* w: w4 C
  616.         pop     dx# F* q. `) G4 S% h6 f. p
  617.         pop     cx  n5 c5 I  v( v+ A0 k! O1 O
  618.         ret3 v- ^" e9 y5 o; I  \3 w, X
  619.         " _) j' k. _6 U0 |$ s+ p& P
  620. keyboard_cmd:/ R' }7 E& }4 t: s
  621.         xor     cx,cx- \; B/ t/ k0 b9 G
  622. cmd_wait:: E* w% b' {' @( d# G( f, u
  623.         in      al,64h, h. i6 \! S- I/ g) S7 N7 c4 u
  624.         jmp     $+24 p4 M0 B9 l1 O* s' C
  625.         jmp     $+2* i2 l" l+ X& c1 I6 H) `) P
  626.         test    al,2' J8 }0 F' r& O! }* c# U+ G
  627.         jz      cmd_send
    , S4 w! r( X& F5 n$ _2 m+ J# \2 v
  628.         loop    cmd_wait
    0 ~+ w* n8 C1 |) y# u# r

  629. $ g* p) n' m/ E0 V+ [
  630.         jmp     cmd_error
    " k( j2 a' o1 X% M9 c! i( ~/ E

  631. ) t0 y- V1 Z9 f) S) c
  632. cmd_send:
    3 e3 T2 `3 Q8 c. D
  633.         mov     al,bl& P6 u. q- ?) y
  634.         out     64h,al
    0 u0 ~8 j8 y  F5 b( ^
  635.         jmp     $+2
      ?8 y9 [  @0 q4 \" ?/ e& k: t
  636.         jmp     $+2
    0 g7 T' l8 B8 {$ p/ R9 g

  637. $ P5 j) ]0 K7 W0 l0 l
  638.         xor     cx,cx9 S& K- n5 A9 |
  639. cmd_accept:
    # u% y$ Y; y4 j$ N
  640.         in      al,64h. \/ A) ^6 m' }( ]% {9 l
  641.         jmp     $+2/ o9 D- J, c. _# d
  642.         jmp     $+26 P* ?- X4 e! s7 T
  643.         test    al,28 `+ c4 j7 a/ ~. j) P1 w' Z
  644.         jz      cmd_ok- o0 A- O$ H: i- N" O, a$ c
  645.         loop    cmd_accept
      F* ]7 x& E! m( k, n# f- E
  646. 0 J7 h1 Q4 H9 ^, k
  647. cmd_error:
    * R7 s4 a0 }+ y
  648.         mov     ah,1
    : @4 J/ e& O) S( k1 V% O, N( L5 r
  649.         jmp     cmd_exit
    : K6 S4 v4 N% }
  650. cmd_ok:
      o1 x; [7 R+ u9 L2 I7 R
  651.         xor     ah,ah" w( J1 [+ E) ]+ ?4 B3 \% H
  652. cmd_exit:7 N/ J4 D( J+ x9 s0 L/ w
  653.         ret% E% O4 }1 C- S  o

  654. % X+ j4 j* F* U, y3 W! p
  655. new_33:
    6 j7 e. V. \1 f
  656.         cli
    $ D. k: ]  m' q& d/ @6 w7 A
  657.         cmp     al,0$ T- \6 p+ A! K/ }9 C1 o
  658.         je      reset_mouse" S  H# Z: @3 E% ?& r
  659.         cmp     al,1
    * s6 a  d4 [2 c/ C, C7 O
  660.         je      show_mouse+ h$ c- Z6 M1 Q" H- f$ O
  661.         cmp     al,2
    ; ]2 r" h) a8 @* K% _" j
  662.         je      hide_mouse
      h: |2 A7 T# X# [
  663.         cmp     al,3+ {% q+ _8 q' @. U% a
  664.         je      get_pos
    & p) A& {3 i5 g( _9 G' q# ]
  665.         cmp     al,4$ L& H( U% J8 }5 V* ^. J
  666.         je      set_pos) @5 n- {% F  ~
  667.         cmp     al,7
    4 d* I1 P% m! F; g& P& _( r- x
  668.         je      set_hor_pos" S& R: f7 ~6 f- y, B
  669.         cmp     al,83 c  B* `2 o" t: U) x" W& b
  670.         je      set_ver_pos4 e. O5 S  j" M' o2 d8 s; a* `
  671.         cmp     al,0bh4 c) b% L0 h8 T: ]* H8 g
  672.         je      get_mouse_movement  H& D8 W/ x- N9 V# ]4 @+ G
  673.         cmp     al,0ch
    , q2 K3 E9 D* {6 N
  674.         je      set_subroutines0 q. H0 S  k. c. B0 X) O
  675.         cmp     al,14h  [6 w2 r* X2 d9 \& E2 E
  676.         je      swap_subroutines
    " _" {" F# o" f- \( f1 {
  677.         iret
    1 @- {! P/ W0 Q9 s

  678. # |( B( m: M5 M* o
  679. reset_mouse:) m  p* c/ X4 r9 A% V- {& P' z
  680.         jmp     _reset_mouse# r( {* f& |( M6 _) l1 y
  681. show_mouse:
    ' U' I; P3 T0 f. h
  682.         jmp     _show_mouse" ?4 N5 G1 m! O' l6 w* q
  683. hide_mouse:
    $ [. @- I& P$ Y1 r, {/ p' ~
  684.         jmp     _hide_mouse
    ) C) f6 t! m& x" d! |4 Y& k2 ~, e, ?
  685. get_pos:
    4 V! f; ?" P9 c
  686.         jmp     _get_pos& `% ?' z$ r7 c, d0 X, k: r( J
  687. set_pos:, D) L( L: \7 p. |
  688.         jmp     _set_pos2 Y0 F* b# ^% L" N& x3 J2 p
  689. set_hor_pos:8 E5 Q8 O- \9 {" s  G
  690.         jmp     _set_hor_pos
    * V6 Y- H4 i6 z- c8 k# l( ?
  691. set_ver_pos:; w; u1 l6 ^: b3 h' T$ ?
  692.         jmp     _set_ver_pos/ O* J: k4 l, t. P$ ]$ ~" u* N
  693. get_mouse_movement:
    ( _" ?% B+ l* S
  694.         jmp     _get_mouse_movement
    / O! r9 e% J5 {! S2 J
  695. set_subroutines:# y' X8 v! G# v( P3 T/ B. y7 z
  696.         jmp     _set_subroutines8 I0 {  e" S# T/ E, u
  697. swap_subroutines:
    . i% Z( J4 o3 t/ ~5 \4 l5 m$ E( x( j
  698.         jmp     _swap_subroutines
    9 _4 T/ ^: V9 W, x! k

  699. # [! m  T: Q1 ~9 z0 C/ Q
  700. _reset_mouse:1 o0 Z( p$ M) ~) ~, \  d9 e
  701.         mov     byte ptr cs:[buttons],0/ b( ]& i  s0 c. H, H7 R- d
  702.         mov     word ptr cs:[pos_x],04 U% q2 g5 u9 ?5 y% X, m  w- X  o
  703.         mov     word ptr cs:[pos_y],0
    + j( v1 c& s# Y- H
  704.         mov     word ptr cs:[x_move],0
    + r" c9 V6 E# D& }( \; w
  705.         mov     word ptr cs:[y_move],06 G) V+ }, {8 [
  706.         mov     word ptr cs:[x_max],639
    , @$ h4 y; M- g) U- i' |- f
  707.         mov     word ptr cs:[x_min],04 m5 P/ W0 t$ Q- n7 O5 r
  708.         mov     word ptr cs:[y_max],1993 Q/ f' L9 p: A+ G. c
  709.         mov     word ptr cs:[y_min],0
    - U8 x% @4 X: n+ F" K
  710.         mov     word ptr cs:[user_mask],0
    ( C6 |& H4 q  G5 j3 D% D/ ]9 i6 r
  711.         mov     word ptr cs:[user_subroutine],0
    . `, S" j' l$ R$ n0 m
  712.         mov     word ptr cs:[user_subroutine+2],0
    4 S7 v/ n! _! J5 |, j0 O* \( \
  713.         mov     ax,0ffffh
    1 k" J9 \, i6 D9 N% J1 m
  714.         mov     bx,34 Z% M  W, i% e; m
  715.         iret
    0 V% K; @' u! K

  716. . u" w. q( l& l% R: T* Z" m- t6 l% H8 i
  717. _get_pos:
    + C2 W% V% q$ k; d
  718.         mov     cx,cs:[pos_x]9 c, T; V+ c* _# |, d
  719.         mov     dx,cs:[pos_y]9 m6 X6 [5 K+ U" y6 G# ~% Q
  720.         mov     bx,word ptr cs:[buttons]7 Y3 Q# D3 N+ l# a
  721.         xor     bh,bh
    ) ]3 ?$ |6 G0 g2 O8 [
  722.         iret
    ; O7 y: {% y8 @' b0 l* P, O, P0 ?
  723. - a3 z2 f; B& Y( K
  724. _get_mouse_movement:
    5 C5 F: V7 q) C5 o: R
  725.         mov     cx,cs:[x_move]
    0 G$ T. m5 Y+ p' e
  726.         mov     dx,cs:[y_move]) Y6 x' h; f! M# ]+ {/ {4 P
  727.         mov     word ptr cs:[x_move],0. `4 J7 ^/ x/ m6 h) v/ o
  728.         mov     word ptr cs:[y_move],0
    . [+ B0 G  J5 A8 {* g  t/ X
  729.         iret
    0 [# K/ a" O: F0 Y
  730. 0 \, T* G4 U) Z7 A2 V
  731. _show_mouse:1 q# D. B% H8 Q, e3 L) ?
  732.         push    ax
    6 [) u( ?* |& G! `8 j/ j
  733.         push    bx
    , y  M, }- w" f, Q& P/ Q
  734.         push    di
    $ O7 V2 r9 f; s2 o" k1 l( d  L
  735.         push    es
    9 d6 j" D8 e: Z5 f) q0 [2 ~% x
  736.         mov     byte ptr cs:[sm_flag],1
    1 Z2 x" V  W# S, K' ~  t2 Y
  737.         mov     ax,cs:[pos_y]# z! Z' V/ Q' m* R
  738.         shr     ax,35 U& [; d2 [- M& \- ^) i
  739.         mov     bl,80
    * G+ b1 G+ M$ ]% K1 O$ `5 B
  740.         mul     bl. h) a1 q  a8 K2 K& c
  741.         mov     bx,[pos_x]/ d4 |! B& o" P% a. C( T# c
  742.         shr     bx,3& A" ^% P# ?# P" E/ b6 b; T
  743.         add     ax,bx$ e4 u9 B" K) N1 `! L- _
  744.         shl     ax,19 w0 Q4 s+ R. }% ?0 _2 K
  745.         mov     di,ax
      `: ]7 H7 c7 `+ r+ x" u
  746.         mov     ax,0b800h& [4 v# B, {! h. o; ?  G
  747.         mov     es,ax$ v3 w5 w: n! @' I( B
  748.         mov     ax,es:[di]. G6 R) h+ K2 Y
  749.         mov     cs:[save_char],ax2 E" \1 X, K0 Q# j6 Y# `" H" k4 K
  750.         not     ah
    8 s2 H: R/ c% U7 F4 Y* J7 y
  751.         and     ah,7fh1 n- e. }/ z+ a! G# h
  752.         mov     es:[di],ax
    + q! M# n1 x5 Y4 b$ l2 P. `2 X
  753.         pop     es
    3 o2 }3 i/ S( O: K( |9 h& L
  754.         pop     di5 V3 G* d1 M% d8 U
  755.         pop     bx2 K" c7 _/ Z" T1 {$ V$ \
  756.         pop     ax
    2 Q& U, l3 ~$ A$ n# h1 s9 }" T- D
  757.         iret: S, _7 V/ F/ M  [3 b5 Z- ]
  758. 8 J  w( L+ C4 o% m
  759. _hide_mouse:$ t* ?& \2 W' h$ A# ~9 a5 q* T
  760.         push    ax, t( I4 P: d) G0 J: y
  761.         push    bx+ J3 R& b( y$ g. r% g
  762.         push    di
    * ]9 z  X& A& a
  763.         push    es7 o7 h  V+ T: H8 X% C
  764.         mov     byte ptr cs:[sm_flag],0
    , a0 |9 A9 V* |- U- ]+ k
  765.         mov     ax,cs:[pos_y]
    - S6 B; v3 W( G( `
  766.         shr     ax,3
    ' t/ _4 w1 b5 g8 a
  767.         mov     bl,80
    $ L( S( U! \2 }7 w9 t
  768.         mul     bl
    ! _4 W; D1 U' R: b5 m7 f/ M
  769.         mov     bx,[pos_x]9 h- k: O* v4 V1 K- A0 X
  770.         shr     bx,3
    3 L/ T0 s. u7 X3 R9 B. i* `
  771.         add     ax,bx
    , i7 {) K" j- y/ Y& o$ U
  772.         shl     ax,1% K+ }/ g' L' W
  773.         mov     di,ax
    . J) S* k$ \9 b3 f) N
  774.         mov     ax,0b800h3 M) [7 w: C3 o. O4 e  V
  775.         mov     es,ax" f+ v. I* K/ s, ?& Q
  776.         mov     ax,cs:[save_char]) `3 L: V+ j2 _' P, o6 U
  777.         mov     es:[di],ax/ k4 O/ [# ^9 b4 {
  778.         pop     es! d* y2 ^8 Y  ^* M2 H5 A5 I/ d; D
  779.         pop     di) P* U, P; k6 P) M8 V
  780.         pop     bx
    ! A) V* ]: s* h$ A
  781.         pop     ax  p  k: X' [% v: _9 w
  782.         iret
    * U7 ?* R% ]6 V
  783. 1 _( v) g  V% {  H+ j1 C  g
  784. _set_pos:9 A; Q  b8 L# T# e6 O' ^' g
  785.         mov     cx,cs:[pos_x]
    + @2 x4 ~3 n% J, X5 v3 Z
  786.         mov     dx,cs:[pos_y]5 [) L6 Y# v$ u3 E2 C) [
  787.         mov     word ptr cs:[x_move],0* }3 S3 ]; i3 A- S3 f" r0 A
  788.         mov     word ptr cs:[y_move],0
    . c% @0 L0 y3 I* t, ]6 q
  789.         iret2 w5 q5 F; S+ ]2 A2 w

  790. 5 ^4 C( ^/ L  e. L) _' p/ J
  791. _set_hor_pos:
    : t, _! o6 z. |9 r7 R
  792.         call    max_min, y; G& x# u; `; U* I# \% F- Y! p% `
  793.         mov     cs:[x_min],cx# x1 S4 b7 B0 e
  794.         mov     cs:[x_max],dx4 ?5 K2 v2 |+ [& v
  795.         cmp     cs:[pos_x],cx
    , z5 z3 D* n) X$ z
  796.         jge     good_hor_min6 o5 D- ^8 o& O2 G% B: ]
  797.         mov     cs:[pos_x],cx
    , f: B; e& S$ u
  798. good_hor_min:
    % r6 q) T! H( W% b, K
  799.         cmp     cs:[pos_x],dx
    2 _, I) l2 Y7 `3 q* p0 c6 {' A$ ^# S
  800.         jle     good_hor_max! M% i& k# H  d5 ?; O1 J
  801.         mov     cs:[pos_x],dx- Y( a; k( r: o8 e, g
  802. good_hor_max:
    : q0 K/ i' H( O6 K+ \
  803.        iret
    + A3 Z) g+ D$ L

  804. 1 T  u% w6 A6 E3 H
  805. _set_ver_pos:" ^. {0 C. F. V! i
  806.         call    max_min) W* p  P/ L* @) _
  807.         mov     cs:[y_min],cx( G! B0 s' q7 d& ^' u
  808.         mov     cs:[y_max],dx
    + p4 S1 d7 n  g: y5 H0 o  w# R5 `; d
  809.         cmp     cs:[pos_y],cx
    6 I8 n5 j1 \8 [5 l+ `* c
  810.         jge     good_ver_min7 E  o5 t8 k6 K. s, @
  811.         mov     cs:[pos_y],cx
    ! d/ V: T+ l( W) Y: D* d
  812. good_ver_min:9 v4 k7 B$ `8 `; R% `9 w4 {* z
  813.         cmp     cs:[pos_y],dx
    & O1 E2 q0 p: y( [% K! ^$ F4 R
  814.         jle     good_ver_max4 m' N6 l: z/ c7 C. A' V$ F
  815.         mov     cs:[pos_y],dx
    2 C. ]+ A2 m9 k+ y0 j- {" C
  816. good_ver_max:. {, F" j& i8 \" D% m! G
  817.         iret( I: m# T1 H/ f

  818. / p* r! |- C9 W
  819. max_min:
    + [- U4 ~9 R; f) g5 V3 h+ z
  820.         cmp     cx,dx
    ' |5 U# S: I$ P2 g; y7 v$ ~
  821.         jle     no_swap
    , G3 t2 S7 {7 S
  822.         xchg    cx,dx* R+ a' a+ ?* r. s# y- f
  823. no_swap:
    : N3 O. z. ?( S; F% }3 ]
  824.         ret) A9 ?3 P5 X. S7 @" w" ]
  825. 4 n% c! b9 x1 q: K* a+ D9 ?
  826. _set_subroutines:
    # \  W) g; K) ]8 T
  827.         mov     cs:[user_subroutine],dx
    ) y! @0 w0 n, p1 `/ z$ t, E
  828.         mov     cs:[user_subroutine+2],es! b  V  F3 ]8 C! R0 C. q
  829.         mov     cs:[user_mask],cx1 J  r. D" p' I5 L
  830.         iret& k& X; g) u1 j- d- L  @9 a: F
  831. 7 Q7 B. ?6 |4 X0 I* g, Z, u
  832. _swap_subroutines:$ p" |3 s1 D9 K/ S6 ?
  833.         push    word ptr cs:[user_mask]3 ?+ @( F# _, f! K3 G# O# O( ^1 T
  834.         push    word ptr cs:[user_subroutine+2]
    ' W$ o. t6 V( K1 g, `& f5 N
  835.         push    word ptr cs:[user_subroutine]+ _8 Q2 N. a  E9 j  C% V
  836.         mov     cs:[user_subroutine],dx
    # [  ~, T' D5 r7 n" F5 |. M8 h
  837.         mov     cs:[user_subroutine+2],es4 s5 ^5 M$ o0 o  S% Q( E, H* p. E
  838.         mov     cs:[user_mask],cx
    8 L  ]4 Q" t. J4 d# A
  839.         pop     dx2 C+ `0 F; E& s* m% B
  840.         pop     es
    : h1 v$ ]+ |4 D) P2 P$ Z
  841.         pop     cx7 v, s3 @3 X& c# W1 u! J& @
  842.         iret
    5 O& j6 _% i  T7 [2 ~

  843. - L. F1 z% F& R0 P$ H
  844. memmouse        endp7 h% M, v8 h, q" E; N; H. `
  845. 7 P9 c3 w3 s8 L  [
  846. endof_start:. J6 g- m1 }; ]  i

  847. - [+ D  i# B, v% P- H' x7 k
  848. emsg db 'No mouse driver install error!$'7 }% E3 \* O' H. B+ R) P$ T
  849. old331 dw 0# S; E3 E  _3 `& z# ?! X4 N/ ~7 n- T$ I
  850. old332 dw 0
    & M5 ?0 V* b) S( w7 W, Z
  851. old741 dw 0/ C$ F' n: o& b. J) R+ L0 `8 {. g
  852. old742 dw 0
    ) p! L  U) @: t# k. E6 ^; P
  853. memcopy db 0
    ; U; K  _+ t; P$ V( L# k+ F9 Q* m
  854. okcheck db 0- ~$ C0 s/ ]3 p/ v0 y' j
  855. pass db 0
    / Y: X5 _4 t9 t: o1 ~( K
  856. chkl db 0
    9 m0 o1 c+ S( M
  857. lk db 0$ G% h' T$ V# K7 O9 V) r/ d; x
  858. chkr db 04 {! A7 E  e# ?+ z' b# O
  859. rk db 0
    6 M  n# |- T: P3 F1 r0 f- c# n$ W
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    0 m7 e+ H; Q5 `, T: f" x/ Y( |
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    * V/ t) D/ ?" p2 y
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    + ^  L. p( u3 _, U
  863. db '                                                                                ': D, \$ y3 c( g+ f) k
  864. db '                                赏屯屯簧屯屯突                                  '
    , v" t" g8 t( i+ t8 f& ~3 P
  865.         db      '                                ?OFF汉OFF?                                 ': [6 L* K2 x- v5 g3 ^2 z0 [
  866. db      '                                韧屯屯既屯屯图                                  '8 c- A  u" l9 [. f9 x. W! p  e- O
  867. db '                                                                                '3 R5 ?1 Q- }% ], l0 w. x
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    + w& ^, b8 r: @* z- W
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 0 K8 F. ]9 x/ h( [+ b9 P9 A2 ^+ \8 S
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '3 v7 x4 }/ ?8 s
  871. # s5 P( |2 S8 @/ `7 ?
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!5 c6 ^* \7 {( {* M
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...   _3 `9 P( q& C2 R! n
8 K$ s+ k- l/ o4 d9 k; p$ B6 d
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:51 , Processed in 0.040473 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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