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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。2 @& ]/ X/ ^  @3 O
9 [# G& Q4 o* m% D; o: V  I4 Y+ x
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    & ?* L- W% Y  \7 ]* a
  2. ;          Ufoit PS2 Mouse test program   Ver 0.98 S0 M+ `& _% {8 P: s
  3. ;                                         By Bini.Yi 易祝兵* _4 ~9 e3 z( p5 ~# N6 H
  4. ;                                         http://www.ufoit.com 计匠网
    $ U. |# [7 K4 q1 h5 N+ d% u9 N8 a) c
  5. ;                                         2002/04/06 YYYY/MM/DD- w5 R  i! L% \; C
  6. ;
    5 V6 ^& O; X2 ^
  7. ;            `0 g: q- m8 i- U. q6 r
  8. ;          This program  test the mouse button  click and move.2 p7 e: U/ R) R2 n6 s
  9. ;, {! I7 I0 U7 I
  10. 4 O- |' ]5 i- E/ [! o5 w8 U
  11. .model tiny4 L' |! e5 G2 k4 D  v
  12. .5860 n' @! B8 A4 i. Z4 a
  13. .code* N& r& T3 ]5 j- s# ~' L; |8 n% q1 F
  14. .stack  100h
    + J: W. b& D- ?5 Z1 }6 X
  15. .startup
    ! O2 d. X; j2 V! s
  16. pusha
    ( }9 R; V" v* h  c% }& {
  17. mov ax, 3533h. q# j8 v* C: S8 Z) B" o" p, e0 n
  18. int 21h
    3 i- S  O1 p4 j0 k& c, s. I
  19. mov word ptr cs:[old331],es7 {( M- `2 ~+ N
  20. mov word ptr cs:[old332],bx
    : U3 J8 ~- Y2 w' Q" g' _+ \/ _
  21. mov ax, 3574h
    5 i# c8 A7 L* n' {+ j/ B  G
  22. int 21h) }  d1 v* \% [7 G9 p- ~0 G" R
  23. mov word ptr cs:[old741],es4 t& W( m5 {" S: N  o" k. J+ @+ N
  24. mov word ptr cs:[old742],bx
    3 f( b+ y& e1 k) z% S3 T( h" H
  25. popa
    ; O4 Q' V8 R$ u! v! t+ u
  26.         call    memmouse
    " @& {; B. f* j7 w! |/ ^1 x# b/ n7 d
  27.         mov ah, 00: s; p/ a: i7 A$ J% {8 b' x
  28. mov al, 03
    4 h' i# W' H2 @2 H
  29. int 10h
    . F9 b) E; D; [& B6 \0 ?8 Z
  30. mov ah, 06
    ) O3 [* z3 u( Y
  31. mov al, 0; L8 k, V) T. G
  32. mov cx, 0) G$ w! b  _* q+ H6 V
  33. mov dh, 24
    & q1 W. ~; V9 ^7 s7 b5 S
  34. mov dl, 79; F0 [" x$ h- k: s+ R
  35. mov bh, 07h
    ) h/ {* }/ `: Y. J9 e
  36. int 10h
    ! S) J7 W& k9 s# n. L! `. X; B
  37. mov ax, 0000# f+ o' {* X+ _! m4 N' ~
  38. mov bx, 0002
    % _8 X* _* R4 Z( C
  39. int 33h0 B, C9 f8 Z0 B1 E2 s. M& ?$ O
  40.         cmp     ax, 0000           ;if no mouse drive install
    # Q! V9 W6 L0 s% o
  41.         je      errormsg           ;show error MSG/ I4 J/ ]) Y' i' \2 J
  42. mov ah, 02
    & G2 d7 i& p1 [$ P
  43. mov bh, 00- r/ I3 D0 d$ Q* x( |6 H
  44.         mov     dh, 25             ;Move point out screen& o: Z* T( f) \  A* e; U; [% F, s* h( c
  45. mov dl, 79
    7 P9 e0 @* t3 A% b  B; E5 I% _
  46. int 10h. f6 e2 z7 `. e$ G0 @
  47.         call    showmsg            ;Show info8 c1 q! m( u' c% k. X7 _, u
  48. mov ax, 00013 o' f! I$ A# ~
  49. int 33h
    " v/ I5 x9 r+ p
  50. ; mov ax, 000ah
    2 [# W6 H" F0 M! H
  51. ; mov bx, 0000; o) G% I" \) p; E! N/ I7 W
  52. ; mov cl, 0h  H. i9 z& O2 f0 B( o, K  Z
  53. ; mov ch, 0F0h
    - |6 S! q7 h6 Y) {
  54. ; mov dl, 0h2 o' _2 A' t9 q' v) V+ {
  55. ; mov dh, 0F0h8 @9 ~+ Q- m+ ^8 U. ~
  56. ; int 33h% A: t. ]* V% E
  57. mov ax, 0004h
    ; s3 n0 L, y. h8 j, q
  58. mov cx, 0319
    * o! E) _9 ~1 V) X* t, h1 ^3 t
  59. mov dx, 0103
    & w; o/ f- d2 X: i
  60. int 33h
    * y1 j- K% R' j2 ]7 m0 i7 N
  61. casemo:                           ;Case button click and point move
    * O! R- H& @- z+ s* ^
  62.         mov     ax, 000bh         ;and keyboard press& M: {& z0 T( @8 Y/ W! A
  63. int 33h. I( X+ D" p7 w% `# |& Y/ J- L
  64.         cmp     cx, 00h           ;if point move....X
    3 d. L4 v' s) ?6 m' S3 v* }) }
  65. jne xmov9 W3 u5 i+ T0 y  U- \
  66.         cmp     dx, 00h           ;if point move....Y
    . G& Q" h7 Z. F. Z% |' o- H
  67. jne ymov
    , v  f6 {3 C) N- s
  68. xymovend:                         ;X.Y move end
    ( l8 A9 ~2 P5 |: l
  69.         mov     ax, 0003          , Y. X5 u( ~, R( `" t
  70. int 33h
    " u/ ]! a, j4 z! B: _# I
  71.         cmp     bx, 0001          ;if left button click  show ON" D  `* {) F! s' K9 \  Z! |% g7 {
  72. mov si, 1828
    % D3 ~; w2 o# ^& F( |
  73. je listl* d1 A0 v: S5 K* D' O" m% H
  74. mov si, 1828/ b6 D! F; y; D; e/ J4 Z. ~* Z3 @
  75.         jne     nlistl            ;if left no click show OFF- W" u0 A( g% A# _; l( c" s
  76. testr:
    ; I5 ~" b' h( J  N7 P6 W  e+ P, s
  77.         cmp     bx, 0002          ;if right button click show ON
    ! i3 ]. Y: K; o" f
  78. mov si,1842- E8 g; S3 b5 ~6 {) V" ?3 n9 t) Z
  79. je listr5 Y* e* b8 o/ u/ X3 L* Z
  80.         mov     si,1842           ;if right no click show OFF
    9 q& k+ Z) r- h$ I- H
  81. jne nlistl- s3 d. C; d1 H8 G; u
  82. casekey:
    " c3 b  m8 j# ^7 @! n9 o$ L' j; N
  83.         mov     ah, 01            ;if any key press jump check
    4 h3 @; o1 j3 _  e
  84. int 16h
    ; `. ~# f" x2 S5 z# G+ u+ E: I2 U
  85. jne kpress) Q  x9 w+ V6 ?; z) O( V, g
  86.         mov     al, [chkl]        ;check x flag/ b' i: V! ^, d0 Z8 f
  87. cmp al, 02h
    9 [: }& X5 A' K
  88. jnb chkok( D1 d4 u% B) O! D7 P4 V6 G& H9 o
  89. jmp casemo
    4 ~- D5 Q+ B, f3 U( o$ u$ q) E
  90. xmov:                             ;if X moved, get the X flag+1
    ( @- P+ }5 ^, {0 c7 h" q% H
  91. mov al, [chkl]3 H7 c( _8 K7 E- t* ]/ W3 n8 S3 m
  92. inc al
    1 b" \5 N4 }+ b- U% A# x1 _; A% h/ f
  93. mov [chkl], al
    9 _% E  @  n$ Y3 q4 o) _8 i8 t
  94. call passok, n' u  W' ]- I0 ^/ u8 p9 s/ ~
  95. jmp xymovend8 T. i& Z% O+ T7 w' H( O: \8 J
  96. ymov:                             ;if Y moved, get the X flag+1& ?7 c; l, K- t( h  c2 h5 A. c2 |* ]
  97. mov al, [chkr]- o& [8 N6 m# J$ G6 ^5 a' A7 Y$ Z- D* O
  98. inc al
    2 x: z! d0 s8 Q2 M% o
  99. mov [chkr], al
    ) B, s$ o7 P0 b: ~2 W$ o1 C
  100. call passok2 d/ V  Z3 n3 d7 \9 b& r! D
  101. jmp xymovend
      C/ E2 [3 a" S7 H
  102. . |, @( L$ c# U) L" r
  103. passok proc near
    " d! `- t9 R2 i" A+ n6 Y1 g+ R
  104. mov al, [okcheck]
    # K; Z8 Q: V: c7 I0 ?6 E4 ^3 y
  105. cmp al, 10 ~! j9 n, ?( \1 d& x
  106. je let05 j5 E1 X' j$ J$ y- D' ?& y+ h
  107. jmp passret
    * b5 _. y. a- v  h! r. H
  108. let0:
    2 O: [6 R6 q# r! A
  109. mov [pass], 1* o- u; H6 W; |
  110. passret:2 Q9 t, k9 v& ~8 W( f
  111. ret
    6 Y- f  m# }* p' e
  112. passok endp % Q/ ~) J0 M; ?4 c/ Y  c

  113. # W# I4 w' T& o# N
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    , O3 v3 E' \: i% O4 s/ ^/ ~+ [
  115. mov al, [chkr]0 d& N) b5 g: I4 p
  116. cmp al, 02h
    & w  c7 C, L+ V' v* a" [
  117. jb casemo
    0 ?: F7 |2 s1 L5 u! b/ p  u$ q9 ~
  118. mov al, [lk]
    # V3 w: a& P8 A$ ~5 o
  119. cmp al, 1# Y! k, n' R( G+ h3 h( N
  120. jne casemo
    ! {9 E3 _1 L1 T! d: j1 D' Y6 {
  121. mov al, [rk]/ r( |( q) I6 l# S
  122. cmp al, 1
    ) O* ~, j8 X+ j* Y2 a2 j
  123. jne  casemo& }. i: P$ v, ~) s6 E: D+ _5 \
  124. mov [okcheck], 1
    ( a  Y2 X2 i( [8 ~/ ~
  125. mov al, [pass], W$ j8 J3 _& W; }) M/ m
  126. cmp al, 1
    " T, v1 S2 u7 {4 \) y2 W+ t
  127. jne  casemo
    5 q+ g. C+ Y7 `
  128. mov ax,0002h3 F) |  C! @/ u! ~9 s% \
  129. int 33h3 q9 G& t/ j2 S. O2 h- s# S/ P1 K
  130. call cleascr+ @1 E* r' o' t5 H

  131. - B. G" [9 s" }6 m
  132. call oldint9 C$ E7 z0 b* a% F. d/ B: r
  133. mov ax, 04c00h6 n. c+ b2 q' `, _6 [
  134. int 21h
    # W. o) ?1 D- @( H' V& @$ \

  135. ! t  Q; K6 h1 D2 ]! D
  136. okexit:
    $ y8 h3 Z3 E: Q6 R
  137. mov ah, 4ch! @) @- }% j2 i0 z8 O
  138. mov al, 0& n) ]' p; ?3 S8 o; b
  139. int 21h
    / e- Q* M5 g2 G( j5 j+ q8 h
  140. listl:                                 ;Show ON
    / T( }! M: U' v  }3 ^" u) g
  141. pusha9 U" P. v2 m0 Q) r6 V0 {8 e
  142. mov ax, 0b800h) m% c2 y: ]. z. {: u
  143. mov  es, ax6 I* |- P2 G5 Y  H% _4 F
  144. mov ah, 47h
    9 \; w1 O- d, z. T8 ~
  145. mov al, 20h
    3 O" T. `. k  k2 ~
  146. mov es:[si], ax
    1 y0 h( M1 f7 U; u: ?; K% P
  147. add si, 02; a) T% N9 n& U6 Z) A. J
  148. mov  al, 4fh! R" l: R! \6 q4 Z! ^% o/ M
  149. mov es:[si], ax
    7 t! Y7 ]/ w- ?0 t, ?8 I# }
  150. mov al, 4eh  T6 @4 [& u, R- C. h8 {* d
  151. add si, 02
    , ^: E8 _, P9 n% M9 p* r( u. ~+ i; |$ c
  152. mov es:[si], ax
    0 {4 K9 x" E6 N( J5 {$ d
  153. mov [lk], 1
    ! e* q2 V: L2 k. q; ~/ E! x- z4 ^" X$ }
  154. popa
    6 d& A' H) ]# i2 W1 ^7 [2 r
  155. jmp testr1 ]) h) i* s, P% C0 r( |; t% L9 E
  156. listr:                                 ;Show ON3 ?3 `, H+ r; a+ P- }
  157. pusha+ ]6 R8 L3 n9 J; I: i/ v
  158. mov ax, 0b800h' Q4 `0 ?/ i# k6 u% H+ h% p! |
  159. mov  es, ax
    ( f# [* |- u* ]; T
  160. mov ah, 47h8 ], Q, |7 p8 ]" k2 [+ Q
  161. mov al, 20h5 ^' f( t) A: g5 V0 D
  162. mov es:[si], ax
    6 t& v" l0 h2 u$ x  V
  163. add si, 024 I( W% Z2 _$ W
  164. mov  al, 4fh
    / j8 O; Q3 p+ V2 Y
  165. mov es:[si], ax
    - E4 f$ y$ w$ F- F5 U9 c
  166. mov al, 4eh
    , M* z4 R. `, e0 n! j* `
  167. add si, 020 @! R3 [( ^: ]4 `7 L
  168. mov es:[si], ax# q% X) ~( v9 v4 w" D
  169. mov [rk], 1& O: D. t# O: y1 |, W5 b
  170. popa
      m1 u/ r; H; U
  171. jmp  casekey
    , b* c0 z5 e' g1 f4 v; O
  172. ; d( S6 E3 H& g: D# I/ Y/ h3 m: ^
  173. nlistl:                              ;Show OFF
    5 v( x& x9 I+ Q5 I& g  ?
  174. pusha     z9 k5 J$ G1 W8 Y- j
  175. mov ax, 0b800h
    8 I" V: @, I0 L5 Z$ t# A
  176. mov  es, ax& l6 Q6 R6 W/ W0 l! ~: k( J# f" J
  177. mov ah, 17h8 G3 R8 F' v% T
  178. mov al, 4fh- v' E/ {8 E) u: d. {' b
  179. mov es:[si], ax$ r3 N5 D* u* H2 T6 P
  180. add si, 02" }$ ?0 u7 q3 a) m  S- f
  181. mov  al, 46h
    ; {2 v' ?" h; q. o. w" _
  182. mov es:[si], ax4 n, a$ B- @! ^9 `/ l# k' T
  183. mov al, 46h6 n4 l! k# A4 k9 y
  184. add si, 02: d' `" A6 U8 t9 X7 ]- d7 I
  185. mov es:[si], ax5 n2 s$ x6 p: R/ z6 V( L
  186. popa
    0 n% ]3 c% u: W; J3 H& C
  187. cmp si, 1840
    6 j  k: S2 q% i" ]
  188. jae casekey
    " P* s  ]- U' k9 L9 Y+ @; o
  189. jmp testr
    9 B/ v) u' b$ r
  190. - u9 a/ M8 ~) C9 H5 p1 V
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    + u8 a& I- g7 P: v+ N9 T
  192.         cmp     ah, 01h             ;and return a error
    1 d6 i- K/ _. d4 ^
  193. je exit1
    ) c* U9 l; E  u- K, T$ y
  194.         mov     ah, 0ch             ;if press other key then clear
    ; P. z9 h3 Z1 z' r
  195.         mov     al, 00              ;keyboard buffer; S8 W* U( l+ d! l5 \) q! [
  196. int 21h0 w+ F" R5 _7 c* F' k/ H, Y8 K
  197. jmp casemo
    % F, a9 N! j3 ?+ J; L- a; m% l1 m& t
  198. # u: n# F$ `- Q5 S6 ?
  199. errormsg:                           ;if mouse driver no install
    : }' Y/ c5 y7 r  Y8 F+ E
  200. call oldint* Q( o9 P7 k7 R$ F3 {: Q( |
  201. lea dx, offset emsg; B/ B+ |9 E  N& ]0 b+ T+ H
  202. mov ah, 09h4 }1 ^' A' d  S7 r" n+ k& r
  203. int 21h
    % c$ }7 [/ S" H) U
  204. mov ah, 4ch
    7 l. M7 s* L  T* u% d9 a/ [- @
  205. mov al, 2
      i( G, `2 A: R7 N1 U: w
  206. int  21h
    $ E2 q; F4 c+ Q8 e

  207. , U- }4 v" \* J% T1 ]
  208. exit1:                              ;error exit
      D# W' E  a( D; E8 R
  209. mov ax, 0002h+ \8 y3 o8 L+ B" C' W2 `2 v
  210. int 33h7 D: c1 o( i+ a9 d0 a9 b, }
  211. call  cleascr' f) v0 i! o. l
  212. call  oldint% n( I# x* ]. @: L& f6 q8 e% U
  213. mov ah, 4ch
    8 \7 b8 @  H' x5 Q
  214. mov al, 01
    * t  |1 w( }$ x  z/ G
  215. int 21h) u2 H, A& g. P0 ^

  216. 6 d( [, O8 N7 u7 t! [8 @% |
  217. cleascr proc    near                ;clear screen
    . u6 H+ T& i; V. A5 t  T
  218. pusha0 M: y) T3 w3 p' _
  219. mov ah, 064 q! Q1 d* H* n/ r5 O2 d
  220. mov al, 0
    6 a/ F4 V6 P- x; U
  221. mov cx, 0& h" T3 P  j6 o# O: i( N% ?
  222. mov dh, 24
      Y9 Q4 Y% b9 }0 ?9 e1 D( a3 O1 g* O
  223. mov dl, 79
    , K* i# y9 k, n& v4 h- k* o
  224. mov bh, 07h6 A) S3 V$ f/ g
  225. int 10h
    # t- F, x  Q8 p7 s% _1 o4 H! p. Y/ X
  226. mov ah, 024 }9 E. k( d: x, t, w4 U
  227. mov bh, 009 L% ?+ J" k' [+ }& T. [: V
  228. mov dh, 0
    3 J2 B- `4 G( K8 v5 ]
  229. mov dl, 05 c: B# f& \% t2 k# R
  230. int 10h' j6 S4 N& p( p1 R0 K- B, p/ A
  231. popa5 A6 N( b, U% \6 d) }
  232. ret
    $ a2 u8 s4 g2 L1 f  k2 x+ W  Y, W
  233. cleascr endp
    ; P6 O! \1 i( S; j! L' {2 X

  234. 5 D# Q. U9 d2 F8 Y
  235. showmsg proc    near               ;Show info& l9 M. h" m/ P! U! I4 [3 x
  236. pusha
    2 E) T) `0 g/ p' D. L! \
  237. lea di, offset showms
    0 W* k# {: z" A/ V0 r: ]# b
  238. mov ax, 0b800h! G/ d0 w9 \8 M: [( j: r& V
  239. mov es, ax* e+ C/ y* z' W2 |3 b+ G* d+ \3 G
  240. mov si, 0
    9 S4 v6 u6 g' p) W# s! Q
  241. mov cx, 480
    ; V* C5 d( }& q- R
  242. mov ah, 07h2 D* ~4 Z8 U8 Z8 b* E9 E% x3 D
  243. @@:, P: V4 j* e: G, o: P- W5 c! C
  244. mov al, 20h; n: k: Q7 b" z3 O8 ?: K
  245. mov es:[si], ax! Z; @! y8 s5 Z6 w8 Y- l
  246. add si, 2- `% M; d' P) o( ~2 S: ^& k# _
  247. loop @b
    ; c1 F8 G/ h  l" y5 {
  248. mov cx,880
    7 C& V9 b) H* B$ k) _% f7 o
  249. @@:/ t- n+ S; A# Q3 _! x  W6 c& j, v
  250. mov al, [di]
    9 U; U6 K/ V: |+ m0 x5 s3 _
  251. inc di# ?( P# L  T6 p& {3 |! J$ L
  252. cmp al,20h
    1 U; q+ g4 E' |3 ~
  253. je showch11 n: G8 V! q( o4 X
  254. mov ah, 17h
    # g8 v; }+ b2 Z4 E2 ]
  255. jmp showch3 9 q/ ~  ^5 D) T8 m: w3 y( k7 `
  256. showch1:
    " f1 X' z- u# Z4 ^- o" v
  257. mov ah, 07h
    1 H! p9 U+ ^. R
  258. showch3:; ]8 V! o- ?3 N+ ]& D+ X4 X
  259. mov es:[si], ax# B% n# F/ Y5 A! q
  260. add si, 2
    / F- ~2 d$ t* f4 U- s, B
  261. loop @b! ^2 x" a; [1 @# y/ o! w$ r
  262. popa
    + f7 u: Y; L: x; `9 v, S7 J0 g6 a
  263. ret
    - t$ ?6 c+ s" O. M  p8 p
  264. showmsg endp2 S) s9 F: l! _( I# M5 b( |

  265. : K/ d# z3 d, a2 K
  266. oldint proc
    7 ]* K  a2 w% _) L' {) b
  267. pusha
    / S# ~  R5 s# ?/ X. ^% t4 G
  268. mov ds, word ptr cs:[old331], Z  [3 [% w; {
  269. mov   dx, word ptr cs:[old332]2 g& r( r, {9 w/ O  {! J' I; J( W
  270. mov ax, 2533h: x5 E, s3 L0 a
  271. int 21h
    7 D2 j8 J/ [- M8 E( _. E- }* c
  272. mov ds, word ptr cs:[old741]
    $ D$ p6 h- n, b2 M
  273. mov dx, word ptr cs:[old742]  s4 i* O# A. P6 n; h
  274. mov ax, 2574h
    ; ^# D- R& z5 |0 o- e
  275. int 21h: c9 l( w9 g0 }, @0 R  C$ S
  276. popa
      b, A  g. l6 q
  277. ret
    . M2 F) `" B6 J
  278. oldint endp
    * t( q$ _6 F- i

  279. 5 `) M# J; J* \, _+ c) o) H
  280. memmouse        proc( o7 A) A% p+ k2 d/ j
  281.         xor     ax,ax
    $ N! w3 _% r4 @9 K
  282. int 33h. R2 j( c" H) X
  283. cmp ax,0ffffh4 }% z7 `; p# U3 D  m
  284.         jne     not_loaded
    8 N/ v5 J8 I; q
  285. mov [memcopy], 1& K* n; y" R/ S
  286. ret
    . ?7 Y9 }# Z: D# E0 b
  287. 1 o. ~9 A5 ?$ C/ `5 q! ^0 X5 U
  288. not_loaded:
    " Q/ E7 ^% i' C; p5 j. L4 m
  289. ! i. w' `% U6 {: S' g
  290.         mov ax,2574h
      k+ d4 ]' Z' {' l7 |
  291.         mov dx,offset new_isr
    8 X' o" w/ _) p( z
  292.         int 21h( p, V! g& h# W5 d1 E
  293. * p2 K3 Y8 J' X( M6 l& w2 B- A) k; k
  294.         mov ax,2533h
    % _+ e' Y( a6 S0 l
  295.         mov dx,offset new_334 b9 ~7 c7 Q2 O' v& T+ D  {
  296.         int 21h
    2 k* I* N/ k- x7 q& U/ b; }3 `

  297. ) |! m; d! n; i1 @( _8 k
  298.         cli
    3 `, m9 k  I. ~3 l- i+ h
  299. % W- m# u( ]  P& N+ W
  300.         mov bl,0a8h! \% z5 X* S  w5 o' i/ ?+ `+ b. Q; r9 x
  301.         call keyboard_cmd
    8 P1 ~3 s* _. X' s0 \" a

  302. # J/ j& S) v2 A9 _+ y
  303.         mov bl,20h
    % t. s1 e  R3 @
  304.         call    keyboard_cmd; k" U* F) P" _8 C4 o3 }' n0 `( S+ i
  305.         call    keyboard_read* I  X3 R& t# J& k8 M) I7 |
  306.         or      al,2
    - R; z% q# g/ P6 j) P2 A0 u
  307.         mov     bl,60h
    * D$ Y" P+ o5 k. e% T8 B" Y
  308.         push    ax& X- `/ H* }0 I* j
  309.         call    keyboard_cmd
    . a  M. X/ w3 R. K3 k6 A0 {
  310.         pop     ax
    3 Y& r" q6 J; n* |1 K
  311.         call    keyboard_write
    , R9 |) ^+ w' n# n6 j4 U

  312. & l# G" L" s8 }5 u" u
  313.         mov     bl,0d4h# P) V4 L+ v5 u' X% e. x
  314.         call    keyboard_cmd3 j# L: Y( O  F$ N# y
  315.         mov     al,0f4h
    0 H& m: m9 h7 `( e7 k) G
  316.         call    keyboard_write" z6 C2 T3 B. ^8 y5 C. ?3 H  _
  317. 6 J9 m! b6 E7 T: o
  318.         sti3 K2 Y: p5 N2 F# s1 a4 d
  319.         ret
    . G& S  u2 q  r7 p& L" ]
  320. call_user_isr:2 S7 T, M% C$ O4 Y0 J2 F4 V2 |0 W
  321. db      60h! l* J6 I$ G  i( D% ~6 q1 H
  322.         mov     cx,cs:[pos_x]# Z' `; @$ |% [4 S
  323.         mov     dx,cs:[pos_y]
    5 `6 \5 K0 i7 n* F* k
  324.         mov     di,0 ;cs:[x_move]
    ' x. j9 o4 y3 ~+ B* q
  325.         mov     si,0 ;cs:[y_move]
      @/ x% [- |( E) t' C6 d# `
  326.         mov     word ptr cs:[x_move],0  S2 R0 J" E. T2 s" m. I* Q
  327.         mov     word ptr cs:[y_move],0% T: U8 I% Y6 ~4 |: H
  328.         mov     bl,byte ptr cs:[buttons]
    ) G4 V1 C( ]4 Z+ L
  329.         xor     bh,bh
    # }- v! @( F- ]9 j8 T' M
  330.         call    dword ptr cs:[user_subroutine]9 {7 U; n$ E/ Z1 S
  331.         db      61h
    " k8 C' K6 Q  F7 C
  332. ret
    , l. e" Y5 t; z( n& @9 F
  333. new_isr:+ _6 g7 i5 j1 A; R  g
  334.         pushf! T$ q3 n5 q1 ]1 P2 x: ]
  335.         cli8 x$ E. @' r! _' ?0 V% A3 k
  336.         push    ax
    / m4 M1 m3 T6 T0 g% E- d
  337.         push    bx
    5 g8 x1 U, \; @! N
  338.         push    cx8 ]% a; U: n+ B6 g
  339.         push    dx
    5 ^9 \% D) }8 P. G  T
  340.         push    di
    9 S. K! v) \3 i) ~$ M0 Y) O
  341.         push    si
    ) ]7 N! }+ S! F$ i: i  R6 T0 d1 h" \
  342.         push    es2 g) S$ l: S; B  y% Y
  343.         push    ds
    0 H/ t. C5 I( w3 M3 K! {9 P/ m$ j- Y
  344. ! n* {+ J' h" k6 X5 G: ]' n
  345.         push    cs* g' R& [3 ]. R6 S( Y
  346.         pop     ds% b) X" u: \; Q  X% C: o+ ?6 n% g& ?
  347. - E8 P5 n$ O6 \# |1 C
  348.         mov     bl,0adh
    , B1 S7 j: `6 E' g- n
  349.         call    keyboard_cmd
    , c% H( v0 a# N6 Q, G& O

  350. " b% C' x" j+ t- \. n
  351.         cmp     byte ptr [first_time],0
    ) ?9 `9 y3 g9 M" c) q5 k9 i
  352.         je      not_first_time
    0 [( d' h% _$ h. U8 s0 L: x' U
  353. ( [+ {( Q' d2 M3 r# p. {; Z, E
  354.         mov     byte ptr [first_time],0
    : v% |5 _1 U) K
  355.         call    keyboard_read; j2 ^% C4 }6 P6 k0 e$ f
  356.         call    keyboard_read
    / @/ U/ C9 D$ V
  357.         call    keyboard_read# D' K- t/ j& @6 |2 J& e# h
  358.         jmp     no_show
    & c6 ?4 c! [4 c  L

  359. * q/ X, i6 g+ W( f7 G3 ^1 X
  360. not_first_time:4 B$ V) g% K; A# [
  361.         mov     word ptr [temp_mask],0+ w, X* u7 j: z" a; V  A

  362. 8 }+ s: ?& W5 q+ a" l
  363.         mov     cx,[pos_x]- |5 T( l+ Y# N# v( }3 O0 t
  364.         mov     dx,[pos_y]
    . u. D. p7 ]5 ~4 }

  365. 5 P4 H: c# q! f% h: X
  366.         call    keyboard_read
    9 d3 g" O" v, u8 d
  367.         and     al,7 ;31 f" C; F6 ^, N8 Q- V
  368.         mov     ah,[buttons]
    ) E" A, q# {1 K+ \( h  t2 Q
  369.         mov     [buttons],al
    0 q" u0 D, h) {# L& @; e
  370.         cmp     al,ah
    / A2 i. t( ~; U- D* T* j+ }
  371.         je      no_button_change$ e% k" x! ]( W
  372.         and     al,3! ?/ P: D# X: V: m0 y
  373.         and     ah,3$ I  p2 z' k9 ~7 x6 c
  374.         xor     al,ah
    ( n9 B, e$ u  }3 B
  375.         xor     bx,bx
    1 h; t2 r0 a0 \# b# u/ {
  376. 4 j2 t0 `( j+ z6 y7 e
  377.         push    ax
    9 x& D& ?' z5 i2 X- Y. z- H! O, T0 c) ^6 Z
  378.         test    al,2
    # m9 n- `0 m% r& F; v+ Q" R
  379.         jz      no_right_button_change9 J* ?3 {4 n* a: B  `
  380.         and     ah,2
    7 x: D+ n& t, f% [
  381.         jz      right_button_pressed
    : C3 A; h+ P4 K2 K# G% z
  382.         or      bx,16; }5 s" E! c: y! |$ C# P% Q' p' b
  383.         jmp     no_right_button_change' |+ V: b2 k7 k0 U0 b
  384. right_button_pressed:
    ( }1 C& \& B6 I- s1 ]3 x* @3 P8 I" }
  385.         or      bx,8
    4 M0 d3 `. I, o  d4 A. F3 L' r
  386. no_right_button_change:7 N# w6 ^+ a2 J3 U  L/ E1 l/ k/ z% W

  387. 6 J5 r/ y3 F9 l0 k; A
  388.         pop     ax: {0 @) w! w% s1 q/ Z4 N, W0 w# u
  389. 8 r: `* A0 e$ g& Z. ^, S
  390.         test    al,1' M. `( n* N1 b1 G9 r" Q
  391.         jz      no_left_button_change- q, c! V* z7 n; ^$ Q/ y, k% K
  392.         and     ah,1* q. s4 L9 @3 V2 T- i; d
  393.         jz      left_button_pressed) r  G! t4 ^6 f9 y5 k/ e2 y% j( P+ ~
  394.         or      bx,4
    $ o5 a+ i& p, F0 K4 \# e% J
  395.         jmp     no_left_button_change
    $ P. @% J4 S" M
  396. left_button_pressed:
    ! B  N3 n8 ]6 L  I+ U
  397.         or      bx,26 N4 \  Q8 a; S% e# k! f6 p, e
  398. no_left_button_change:
    ' W% e3 C( s. R! l7 i) `

  399. ! `0 M" S$ `& S& E* s  k* C7 u
  400.         mov     [temp_mask],bx
    0 @! \6 n4 h9 W
  401. ! a& @, s* N7 t! T+ i3 J' h" t
  402. no_button_change:
    7 R  V/ e4 m7 W2 A; f0 o& B: J
  403.         call    keyboard_read
    7 P+ C; a8 w; G6 A, z& @
  404.         cbw
    # o' C( @, j% L, s
  405.         add     [pos_x],ax
    , d! h1 g$ E9 H, y+ c7 h
  406.         add     [x_move],ax  I9 G/ \2 F& _( W
  407.         mov     ax,[x_min]. Q( y* j2 q0 }4 Q" w* e3 r
  408.         cmp     [pos_x],ax
    % G9 m5 t7 m! H6 F
  409.         jg      good_hor10 {; o/ A( W7 V- T' ?3 C. u# [
  410.         mov     [pos_x],ax2 u4 `$ D  P# ^, f0 {' h
  411. good_hor1:
    ( p/ x. m- z, G- Q% ?
  412.         mov     ax,[x_max]
    % |& ]  k3 G7 f' A2 P  q( D+ y
  413.         cmp     [pos_x],ax
    5 c1 A; H5 N! _5 ]- w
  414.         jle     good_hor23 Q* o2 x" j3 Y! {" ^( u# _
  415.         mov     [pos_x],ax3 m9 g5 Y9 Z  ^, Y
  416. good_hor2:
    6 e; d6 b& W5 o) i

  417. ' U  }: C0 a9 E
  418.         call    keyboard_read
    $ t8 \# X' G) I& K6 q8 O2 r! {
  419.         neg     al
    0 T% m2 R) @3 v5 D- c
  420.         cbw
    / R6 l! Y* M8 R: S& R$ g6 D) P
  421.         add     [pos_y],ax  _7 [) Y- x2 v# b3 g0 _( A
  422.         add     [y_move],ax
    ! J- M3 m5 D7 h: d4 `
  423.         mov     ax,[y_min]
    . s! Z  h( P+ b! j' L9 B
  424.         cmp     [pos_y],ax
    0 d, U2 a5 u. U; t2 t2 C2 x
  425.         jg      good_ver1
    ) @; R4 d1 _9 a
  426.         mov     [pos_y],ax4 l' G3 l6 _7 O
  427. good_ver1:# R" B. b  _8 F; n4 @
  428.         mov     ax,[y_max]  ~& v( k" F6 @; F: M4 ?
  429.         cmp     [pos_y],ax
    2 X0 l/ b; @2 {" {0 O; \
  430.         jle     good_ver29 \& M4 [4 r1 ^- h  w! c
  431.         mov     [pos_y],ax; H* M  ~4 R4 N! d
  432. good_ver2:% \. f. S  s4 O' P- P, g
  433. + d( N, ~& z( o0 N* |2 \
  434.         mov     ax,[x_move]
    6 w0 Y4 L1 \/ ]3 k% @5 Q4 G4 v! g
  435.         or      ax,[y_move]2 c% z* q) F. ^2 w' G  |& W7 l; Y; S
  436.         or      ax,ax
    5 s, h& D; S+ Q: c
  437.         jz      no_change_position1 e  u1 V. L( z! m  \7 C2 w
  438.         or      word ptr [temp_mask],15 v( N' W7 ^* D0 ^$ H8 p$ W
  439. no_change_position:
    ( b# `! u# ~5 m' A

  440. 2 _9 n0 M4 ^* P8 w
  441.         mov     ax,[temp_mask]$ r3 `; Z) t4 s$ O; b
  442.         and     ax,[user_mask]& X2 K2 v' P- _! T
  443.         jz      no_call_user3 j; A0 h: s# W; W) @' y
  444.         call    call_user_isr
    , G/ Y) L0 n3 h( v* o, u
  445. no_call_user:
    8 P3 p) B3 Q9 g6 n( X. C3 v
  446. 1 u- h, m3 T) G* ^
  447.         cmp     byte ptr [sm_flag],1$ A- ?( b, J# M. ?
  448.         jne     no_show1 k% q" X$ ?1 N7 @( `
  449. 1 E- O1 L- q. b4 W6 U
  450.         shr     cx,3
    ' x3 q& M, ?( R: _
  451.         shr     dx,3
    # e0 o5 q  z4 Y3 x( B1 Q9 O
  452.         mov     ax,80
    - Z3 Q/ @  R9 Z" {5 V% Z
  453.         mul     dl2 _0 a- `1 Q! u+ y
  454.         add     ax,cx
    6 z  H& h" V9 N* \7 d7 d# W
  455.         shl     ax,1( z/ e* J7 E8 d- t! z
  456.         mov     di,ax
    9 U6 F3 n7 q) O# H
  457.         mov     ax,0b800h8 \0 K# q8 I/ x2 c( O3 r
  458.         mov     es,ax; `3 o/ P0 X) g6 E
  459.         mov     ax,[save_char]5 d5 W- t3 \- ^5 z6 v; ^
  460.         stosw
    ; b/ I5 m! z- C1 ]/ s

  461. 5 l- X2 ]; i5 r/ U( a' ]
  462.         mov     cx,[pos_x]" f# e! u. x0 C5 \
  463.         mov     dx,[pos_y]. }6 X, r5 H4 v
  464.         shr     cx,3. V8 {) R1 u: d, j# U' I( L% I: S
  465.         shr     dx,3; E% v! w/ Q/ F& p$ t
  466.         mov     ax,800 u, C0 ~6 j8 [. y1 n
  467.         mul     dl0 r4 ^/ O6 a" E: F) S4 L7 V
  468.         add     ax,cx
      x. s4 U* Y8 {' o
  469.         shl     ax,1
    ) D0 l4 S8 e. I+ o6 m9 l! `2 M
  470.         mov     di,ax
    " B3 a; h8 {' x3 D2 I2 x
  471.         mov     ax,0b800h; V9 F/ v) ^1 B8 j
  472.         mov     es,ax+ |# H- S  v  @5 w) P) b% j
  473.         mov     ax,es:[di]
    " V! n) Y8 q# b/ u" R5 v
  474.         mov     [save_char],ax: |7 ?. f+ B4 F: p- t2 u
  475.         not     ah
    - N0 p. ]. L' [9 {9 \$ b) X: \
  476.         and     ah,7fh
    # E0 D% G$ p5 J9 y' d& U: g
  477.         stosw9 B3 H. a8 Z4 Q; T9 z$ Z
  478. no_show:
      o8 C. D8 R! C/ f( ?' ?. Z
  479.         mov     bl,0aeh
    7 j0 g' c8 X- p$ C
  480.         call    keyboard_cmd
    ' M: o0 v7 q! W" w& b0 Z" ~& c3 f, r

  481. & B0 h* F3 K' _9 J+ R' t: N$ w
  482.         mov     al,20h' S3 r1 K2 o; ^8 q3 h& `
  483.         out     0a0h,al- W" w" l- I3 b2 V
  484.         out     20h,al
    6 i$ q$ L( `% N

  485. - h9 d$ I7 {! m. \5 A9 ]0 I5 E* S
  486.         pop     ds
    + K* t7 r3 z2 \2 s+ T
  487.         pop     es
    , ?: `0 a* I  o1 Y, n( H
  488.         pop     si' |# V* Z0 [& T2 \5 O8 b: n
  489.         pop     di
    1 O8 r" Q( d! q
  490.         pop     dx
    6 Z6 y9 S- v$ S' k/ \
  491.         pop     cx% d  I1 T4 q# q4 G& r- Z
  492.         pop     bx
    ; u5 w5 ]8 h- @4 P; B; U' I
  493.         pop     ax
    ( ^0 T( b7 @  A5 g3 N- a- d) Y7 z. H
  494.         popf0 S) @0 Y2 A8 K4 t' J! n
  495.         iret
    : ?- o: K! ?9 p( F% h
  496.   P5 F& ~  z( r0 p) d: X2 V9 j
  497. first_time      db      11 [& H: a9 P$ q  r) ]/ A
  498. buttons         db      04 I: ^! a6 j& N* _; w3 `6 M0 J
  499. pos_x           dw      0
    , l4 u9 j6 }. Q6 ?! l$ v& j
  500. pos_y           dw      0: g0 ?9 ^3 ]3 N2 U. d7 U
  501. sm_flag         dw      0
    ' ]5 h/ a4 f; }: w! F1 H. q
  502. save_char       dw      0
    ! w# Z9 _4 `( p
  503. x_move          dw      0
    2 A& t3 M9 ]2 y' b9 Z
  504. y_move          dw      0
    5 [: q% [) S9 w) D9 |! ~
  505. x_max           dw      639$ W1 A6 S7 h( L; R
  506. x_min           dw      0+ k/ N) O$ J' M* w
  507. y_max           dw      199$ s8 L2 v8 }% b) A3 R, c
  508. y_min           dw      0
    1 ^' g" s7 d" p7 V6 `* p* o+ ^
  509. user_subroutine dw      0,0, d, C" R* b/ i% ?- F! j4 `
  510. user_mask       dw      0
    ! F5 z: R3 X* {0 q; f. q6 @! H1 o5 r
  511. temp_mask       dw      0
    4 r, G5 ^, |- }& j5 M- W

  512. " I2 }& H6 a/ V! C+ b, N
  513. keyboard_read:
    1 u7 ]+ |% f7 C3 t% k5 ]
  514.         push    cx; c! D! Z/ f- c2 _
  515.         push    dx: o3 f2 M$ ?( O
  516.         xor     cx,cx
    , z* H* E8 {/ z0 N
  517. key_read_loop:0 g  P9 R& b+ w' T
  518.         in      al,64h
    $ S5 _, s' b4 ?7 t: q  E9 H
  519.         jmp     $+23 j8 v5 D/ f4 E' E
  520.         jmp     $+2* v- o* Q! u& c2 e- ?, G0 D
  521.         test    al,1
    0 ~0 r6 C9 Q7 M3 @8 O8 J) ^
  522.         jnz     key_read_ready
    ' K; ]8 w/ c2 H6 c
  523.         loop    key_read_loop
    7 Q% d( M, k7 ^6 r. \3 z. a) r' S
  524.         mov     ah,1; l, F0 ^1 M. V0 }2 y  D
  525.         jmp     key_read_exit
    ! c: C# J! p2 K- T0 n7 A
  526. key_read_ready:
    9 b9 F9 n+ B) U% d9 }( `3 I
  527.         push    cx
    ( h/ ?7 E5 v/ o  n
  528.         mov     cx,32
    " @  i! x. G* i1 H
  529. key_read_delay:
    " ]/ ~4 V1 ^1 y% S. h6 ]5 ]
  530.         jmp     $+2
    . j, a3 G0 d! ]* m3 b
  531.         jmp     $+28 ^# i0 B7 N/ u' T) V% o
  532.         loop    key_read_delay% E. R; @  n! a
  533. - d5 E  F+ H/ Z5 k7 a
  534.         pop     cx
    . p2 ~$ F8 A* U
  535. 1 t5 ^# I6 x. _% U& W
  536.         in      al,60h
    . W7 i! {+ o+ {0 _% V- {  }
  537.         jmp     $+2+ j4 @4 R0 u3 V/ K8 h+ {" E' m& [
  538.         jmp     $+2
    9 m) S6 A0 ]2 ?: y  f  J/ _4 b
  539.         xor     ah,ah
    5 D, h/ @# r  u& q4 W- o
  540. key_read_exit:
    & x8 q4 j9 Y5 k0 v, ?
  541.         pop     dx% \. o  J  d, ~8 M7 U
  542.         pop     cx
    / Y% c7 E4 ~/ V: S( N2 i& ~2 ^0 f
  543.         ret$ o1 e: L) \: Y8 T: E; G: d
  544. . n( r: k8 S1 X, T9 q$ F* |
  545. keyboard_write:
    ' @7 c8 f: c' p. o# ~
  546.         push    cx" [6 H2 I" V; S" @5 v* o
  547.         push    dx
    + B3 K4 u0 ]% \8 E& N2 f
  548.         mov     dl,al9 X. Q% ?0 u" Y, s. p" b
  549.         xor     cx,cx5 N: f0 X/ P$ A  B; O
  550. kbd_wrt_loop1:
      B& \7 k" r, R
  551.         in      al,64h/ H* \0 g" c! q9 w
  552.         jmp     $+2) N7 T) _3 R9 h
  553.         jmp     $+27 p$ e9 N) P) {# w; U) k
  554.         test    al,20h
    # A+ j( X" W7 s& p; e" U
  555.         jz      kbd_wrt_ok1, {6 G' C3 B7 T$ u- v
  556. # M+ @. V6 j2 N! d+ ]
  557.         loop    kbd_wrt_loop1
    4 [, u; D3 {0 t5 i& J  h$ ^
  558. & U' P$ h" v& s; Z' }
  559.         mov     ah,1* M, Y0 t6 |% Y& K4 e. N! k/ w
  560.         jmp     kbd_wrt_exit
    4 ]  G; g# e8 T. r1 i# \
  561. - G! O; v, e, t; N& y
  562. kbd_wrt_ok1:0 q3 }1 ~: o5 S7 E; G: E. ?6 l9 j
  563.         in      al,60h" ]; X: G. _7 R  P
  564. ( G% @2 w9 _- M0 V% w$ [' D' ?
  565.         xor     cx,cx+ y; a5 }8 u6 ]  V
  566. kbd_wrt_loop:
    . x& W* F) G2 m2 H. V  T3 g; T
  567.         in      al,64h) D. \: Z2 g" ?9 H/ x* W6 k
  568.         jmp     $+2
    1 T' M2 z  d4 K! P
  569.         jmp     $+22 P$ z  B4 F0 m# J" h! ~/ o
  570.         test    al,2
    : a% r* z( \3 u* G/ {6 L
  571.         jz      kbd_wrt_ok! F3 J$ z) \6 E. e
  572. , ^7 a4 p! J2 I
  573.         loop    kbd_wrt_loop
    " ]7 D; [* X  t$ U  Y) W8 g

  574. 3 L2 ^. O/ G, n. P) V' a  M! P2 y1 f
  575.         mov     ah,1
    ) ]5 }% R, y+ W( H2 `
  576.         jmp     kbd_wrt_exit5 X- G. ]0 y8 D$ @
  577. " ^/ t& _8 h3 v) r( ~' N
  578. kbd_wrt_ok:
    4 o& d, W! g* o
  579.         mov     al,dl: M5 ~, q8 ?; E. T9 o" I
  580.         out     60h,al6 D) l  {' d2 w
  581.         jmp     $+2
    & C! x: _2 R& X' Z. B4 a
  582.         jmp     $+2; e/ b; b/ J0 K! E4 E
  583. : V3 W" v1 s- x
  584.         xor     cx,cx
    $ Q( E* @9 `" |
  585. kbd_wrt_loop3:
    # ]4 ]3 ]; g+ q
  586.         in      al,64h1 T0 e) A- Q+ _) |
  587.         jmp     $+2
    ( e+ n3 s) R" W/ I# z8 w: M
  588.         jmp     $+2& l$ v7 D1 O9 q' T3 ]' q6 z9 R* P
  589.         test    al,2
    3 T- h* J* x  k
  590.         jz      kbd_wrt_ok33 y, W% B; P0 H$ c7 f1 X! Q! I& ]) [

  591. : X0 ^8 @4 Y  a. g. }! d/ y
  592.         loop    kbd_wrt_loop3) j) e# z) R; B2 L! K/ k: H
  593. 3 T5 ^6 J* Q6 J
  594.         mov     ah,1/ W+ x# h) ?) V9 v
  595.         jmp     kbd_wrt_exit% T* f$ d3 h. _) b( y' G& s

  596. 4 e) m' n* r( B
  597. kbd_wrt_ok3:
    5 x* @2 t7 E7 a  \3 D. k
  598.         mov     ah,8" r( z9 X/ w" h+ ~* _, B; ^7 s
  599. kbd_wrt_loop4:
    ' F- f0 g0 _& M" }6 o7 i
  600.         xor     cx,cx, @- [( T2 N3 i' H' M( T) W: E
  601. kbd_wrt_loop5:
    + o! f+ P2 ?3 i, }) t2 O2 j
  602.         in      al,64h/ f( T! @+ ~' }: r( V+ P& T" l( l
  603.         jmp     $+2
    : y7 R- U9 e$ Y4 V/ R0 J  Z
  604.         jmp     $+2
    : P5 v8 ]! X8 {. y  l$ [1 v. E
  605.         test    al,1- X9 [( g* G9 h+ ^% w! @$ x
  606.         jnz     kbd_wrt_ok45 p+ _  Q9 [' S# d1 v) n

  607. 8 Q/ R2 u% S0 @: ~( G
  608.         loop    kbd_wrt_loop55 p; w; B' g7 U! x0 G- s3 a
  609. 4 D1 }$ k, j. \  z: s, \% ?
  610.         dec     ah
    * D- i. x2 P: o- j
  611.         jnz     kbd_wrt_loop4
    9 h% S3 |6 q# R1 e9 u1 y

  612. . g- Y  p# d, G8 W
  613. kbd_wrt_ok4:* i% B- p9 h# N
  614.         xor     ah,ah
    * }# F/ y3 [  m
  615. kbd_wrt_exit:9 z. F+ x  B& l% w) w! r, H
  616.         pop     dx8 k2 q! d2 r  c! {
  617.         pop     cx. E. w) L1 \1 {4 E+ R( h+ {
  618.         ret/ c- u  R, O- l
  619.         
    2 [+ D1 O1 k# w
  620. keyboard_cmd:( ^# Y6 H# l! J1 i# H0 f. l
  621.         xor     cx,cx
    ( X4 f) H+ \& @; A
  622. cmd_wait:
    6 a4 k( y& L* q4 l, i0 t
  623.         in      al,64h- v+ m/ ~$ i/ Z: T
  624.         jmp     $+23 d# h1 Y  s: G- @* K
  625.         jmp     $+28 P6 [4 L  }9 I. ^' f
  626.         test    al,2
      P( [3 V$ H& J; B7 S# W" L
  627.         jz      cmd_send
    7 w/ B$ U& E# A8 a# L8 O6 ^
  628.         loop    cmd_wait
    # k: i; Z7 g1 U" w' B# r! X
  629. , Q# U9 d9 _( B1 r! U
  630.         jmp     cmd_error# U5 Y. b3 ^0 G
  631. - D- H, Q  x4 N% ^
  632. cmd_send:; f' H1 x' M( o* p4 f, X" |" k0 }4 l
  633.         mov     al,bl- ?  V& K3 ^% F9 I. X
  634.         out     64h,al8 X8 k# u6 y6 \" P) Q4 n( h+ P
  635.         jmp     $+2
    . G' S7 E* }( G4 G9 j# v
  636.         jmp     $+2! y5 o/ U# K& N- U: x- c2 X& }
  637. ; T0 o) J  J% b2 t$ c
  638.         xor     cx,cx  w$ C1 \7 U  Q6 m) q8 B% k
  639. cmd_accept:
    + D8 @3 b1 U0 y8 U$ e) }1 a
  640.         in      al,64h- n# M1 n# ~, @' K3 s  w* ^3 b
  641.         jmp     $+27 z) Q8 `2 E5 q' G  H
  642.         jmp     $+2
    # E6 c. j, j3 _4 m  k9 R* Q& L1 T7 C
  643.         test    al,2! B, z. O; ]0 j7 v. k
  644.         jz      cmd_ok0 ]" m" |1 f, L. c# g
  645.         loop    cmd_accept/ |2 w3 @& J- E+ i, [' u

  646. " u6 t! k8 u$ ^& v  G8 X
  647. cmd_error:
    - H, Q+ v/ @' R; w/ H$ X) Z
  648.         mov     ah,1
    5 }4 k5 @4 q* T5 A% k9 |, M4 ]: x" I
  649.         jmp     cmd_exit
    6 u! ], {4 |" H, K3 z
  650. cmd_ok:
    3 z8 W/ J- G/ V" t" s0 h0 E
  651.         xor     ah,ah
    7 a3 R9 }4 s7 E6 a+ m  M" a# b9 I3 N
  652. cmd_exit:
    & i$ ~: h! ^8 O; D4 Q
  653.         ret0 K" I6 Q7 ]% y4 S% T, i6 w' S

  654. ) e. C5 P3 k$ I
  655. new_33:! |0 ^* M  v/ i
  656.         cli! j/ g# B8 v0 D" n3 p$ X2 V
  657.         cmp     al,0
    " a# _  [* e6 ]" y% `, Y  V
  658.         je      reset_mouse
    7 l5 [0 f0 t3 S4 w# r. P' x( l4 A9 C
  659.         cmp     al,1
    4 |: J! i8 x' d# z% ?: S
  660.         je      show_mouse$ F  L5 F  D8 \" n' e3 t8 B
  661.         cmp     al,26 ?. P8 V1 E" q8 A* S
  662.         je      hide_mouse
    3 r+ l8 Z0 f0 {* p
  663.         cmp     al,3
    ! O/ Z! ?5 Z) k
  664.         je      get_pos; n5 a+ R- d' Y  ?! o
  665.         cmp     al,4
    , U, G/ x9 n( N8 m' }6 i
  666.         je      set_pos$ v+ M) S0 t# `# V
  667.         cmp     al,7
    " N; O9 R1 B6 c; D* u
  668.         je      set_hor_pos5 c( H3 g% g) z) n' d
  669.         cmp     al,8. Y3 l* F9 J  j% L: i
  670.         je      set_ver_pos/ ~5 F6 q7 m/ L1 ?5 q# O
  671.         cmp     al,0bh
    , s( J5 A; @9 Z3 _1 ?/ Y
  672.         je      get_mouse_movement
    " L7 Q( X" X4 K% {: f4 U: O
  673.         cmp     al,0ch
    + o6 A1 C; r- V5 u9 ]6 B' X. l2 P
  674.         je      set_subroutines
    ( n8 c! O' T! [' I5 A, n; Z* ?
  675.         cmp     al,14h# E4 {! P2 X5 p- Q
  676.         je      swap_subroutines
    / S6 i6 f5 i$ y( a( f
  677.         iret5 g6 z+ ?$ D0 K

  678. * c& j' \3 s1 W% j8 |% ?" n( v, u
  679. reset_mouse:
    + V0 y2 H3 ~: l  b
  680.         jmp     _reset_mouse
    % u; A4 G& G/ B) e! X9 Z
  681. show_mouse:
    9 h4 s3 k. {' q7 v
  682.         jmp     _show_mouse
    / z- B5 m7 v5 e* m5 Z
  683. hide_mouse:1 {5 j) G# l  a; q: t# G5 W+ ^; v
  684.         jmp     _hide_mouse0 H* P$ `' d5 H4 o: w
  685. get_pos:+ a4 d( j& U6 [, Q( \
  686.         jmp     _get_pos
    ' U* z3 M" N# d( C4 I/ `
  687. set_pos:
    $ h: V6 p/ o$ f. s' e/ D7 g
  688.         jmp     _set_pos4 B& P4 O9 [$ H- Z+ y
  689. set_hor_pos:
    . s8 s% j8 |: `6 k, r0 l0 Q; I
  690.         jmp     _set_hor_pos( @7 H+ f, ~! \, v4 U: Y
  691. set_ver_pos:
    % {# r9 d. U2 F" h5 P
  692.         jmp     _set_ver_pos
    : W& y# d& \, z4 l2 L" X1 C
  693. get_mouse_movement:7 M+ p5 R1 V1 q: c5 w/ k3 f7 m  P
  694.         jmp     _get_mouse_movement
    2 I9 {- I; R/ I
  695. set_subroutines:1 ~, O/ O* i' C. H$ W* ?5 _
  696.         jmp     _set_subroutines4 N0 `% }6 M: ^" V% G4 C, e; J0 {
  697. swap_subroutines:
    " B6 d6 d/ C/ @8 Y9 t, G
  698.         jmp     _swap_subroutines5 `( S' I! _# |, i8 i
  699. # V. W; Q& V6 R# h, w# u
  700. _reset_mouse:6 ?+ G& y2 C7 ~" N6 ~
  701.         mov     byte ptr cs:[buttons],0) z6 ]$ ^& d" |& m& i. O& G, s  ^
  702.         mov     word ptr cs:[pos_x],0
    2 }" Z, ^7 w0 p6 Z, G2 m$ _$ F
  703.         mov     word ptr cs:[pos_y],06 g  A' ^, z1 e# u0 I4 A3 x+ G
  704.         mov     word ptr cs:[x_move],0
      D3 v/ k' g; U. N- ?
  705.         mov     word ptr cs:[y_move],0
    , W9 I: D) U% H! K& D& J* m
  706.         mov     word ptr cs:[x_max],639
    0 B% i9 d8 W5 I# y/ g; q* s4 m
  707.         mov     word ptr cs:[x_min],0
    $ i; m9 X' f4 N0 p: a
  708.         mov     word ptr cs:[y_max],1992 R) D! h6 |$ V9 ^$ F0 w" d  H  }' o
  709.         mov     word ptr cs:[y_min],06 D" _" Y% @4 j  x1 K
  710.         mov     word ptr cs:[user_mask],07 b( ?" {; d& ^6 v( g
  711.         mov     word ptr cs:[user_subroutine],0
    ; m; B' H* V$ a+ ]0 v% G9 }' x
  712.         mov     word ptr cs:[user_subroutine+2],0
    0 Q) j4 d6 s% H# y) k; f
  713.         mov     ax,0ffffh' Q* L; q  ?$ G, i
  714.         mov     bx,3; q6 T5 v; G$ ~) a+ N
  715.         iret
    - Q3 U/ M. E. E3 [
  716. ! t& B$ r  t, @& N# z9 e
  717. _get_pos:& o4 r0 T. t. A3 |" r7 l4 r2 m
  718.         mov     cx,cs:[pos_x]% y, |! N9 b6 r6 S9 u& Y
  719.         mov     dx,cs:[pos_y]1 P3 h  j: Y/ B; c
  720.         mov     bx,word ptr cs:[buttons]  |# K6 g6 ^4 j( N) P1 v
  721.         xor     bh,bh
    1 L8 O* C9 ^4 U' _9 a
  722.         iret% `# k% S! n) ]4 [7 s9 w  S8 p. \, y

  723. # h  {/ o/ |) q+ s' b
  724. _get_mouse_movement:  x5 [* `/ b1 s$ ?8 p
  725.         mov     cx,cs:[x_move]
    9 n* q) P$ Q% R, y8 F) T& c5 L
  726.         mov     dx,cs:[y_move]
    % }( a1 z$ ?- Q& x& H
  727.         mov     word ptr cs:[x_move],04 n. i% a! ^3 u0 j# t9 w, W
  728.         mov     word ptr cs:[y_move],0, }$ q- O! O, Q% v2 P- G+ \! S
  729.         iret
    ) S/ d% c# V$ J0 ^

  730. 5 B+ I% D3 p( b
  731. _show_mouse:
    5 [; Q: d( V% z& Q1 f( u* n
  732.         push    ax
    4 e: a, R) x8 o: w- ?$ W
  733.         push    bx/ Q3 {, j9 C: E. s
  734.         push    di
    ' H) v% T- r- h# m+ U5 d2 @+ g
  735.         push    es* l1 d1 m- [+ u. U3 B
  736.         mov     byte ptr cs:[sm_flag],1
    * o+ \* X/ Z5 s+ Y* z6 X6 M
  737.         mov     ax,cs:[pos_y]" t& `6 k* I* n4 U7 N- ]+ N
  738.         shr     ax,37 P4 H' [; z6 f
  739.         mov     bl,80
    $ l/ m$ Z  r" {+ y0 Q# M
  740.         mul     bl9 p- A1 z/ o4 x/ h  P  W
  741.         mov     bx,[pos_x]
    + @5 p! H$ }7 z
  742.         shr     bx,3" x. Q  @3 W. p4 h+ L* P/ p3 E* d
  743.         add     ax,bx! x" o9 b; G4 }* G0 Z0 O; Z
  744.         shl     ax,10 ^3 |* S1 K* u* X2 W1 M( e4 N4 Z
  745.         mov     di,ax+ }& `/ Z$ f( Z
  746.         mov     ax,0b800h
    2 @/ R3 _2 J, }+ h
  747.         mov     es,ax; v, }9 D8 Z. T+ f
  748.         mov     ax,es:[di]
    + M7 t3 t( B2 z
  749.         mov     cs:[save_char],ax6 W, k& e% h5 Q; z8 R+ w, ~
  750.         not     ah
      L! [* r% V( u5 @3 ?
  751.         and     ah,7fh
    # w! ^6 o: v+ ]6 ~
  752.         mov     es:[di],ax: L0 W" x; W; g  y. y
  753.         pop     es
    6 T1 p' m) v! y# m( ]( Q
  754.         pop     di
    & c& [+ u' B+ M" a' Q
  755.         pop     bx  ]  D, ^+ o( m, K" `8 S3 n
  756.         pop     ax
    5 F0 J) L8 P" I5 ^6 \1 r
  757.         iret
    , t  ~7 H( C4 n8 T+ ^, V; q

  758. 5 a- Z. q  @- L% o$ u
  759. _hide_mouse:
    $ }/ d' o- |4 F- N) x3 n$ Q
  760.         push    ax! D) L& g# ^+ {& A, f
  761.         push    bx
    9 u# G, p$ D/ j. V2 e' x: H
  762.         push    di
    $ `$ G  j6 G' l- N
  763.         push    es
    % G. V/ r2 x5 |6 L
  764.         mov     byte ptr cs:[sm_flag],0
    + |. o& k" E6 ?6 B8 K! a
  765.         mov     ax,cs:[pos_y], V" W. [/ l5 i
  766.         shr     ax,3
    0 ~$ t! {% D# f9 X( Z! j; g6 R
  767.         mov     bl,80
    , u( k# E) [1 a6 w' W- i
  768.         mul     bl
    - Z. P" r5 y  B( f
  769.         mov     bx,[pos_x]
    ) Y0 i; ^; w, R& ]/ q
  770.         shr     bx,3# O8 }* ^, p6 X
  771.         add     ax,bx
    % B, L2 e$ _6 Z: G3 e6 W2 s
  772.         shl     ax,1- s( ]/ Y+ a1 Y
  773.         mov     di,ax
    ; B" V* n+ S4 S7 v$ {" J0 r# {( X
  774.         mov     ax,0b800h
    3 ~+ r& V9 {8 ~* s4 f/ `! |
  775.         mov     es,ax
    9 b4 f+ E( m8 p; D$ t
  776.         mov     ax,cs:[save_char]
    : m! K1 p8 {  b! P$ b9 f
  777.         mov     es:[di],ax" W% r- T2 M  v" |
  778.         pop     es
      N1 y; W. r5 t* {. E, k
  779.         pop     di
    ( R4 P9 E$ Q! {" l6 e
  780.         pop     bx
    + ?; [/ P( w& S# s
  781.         pop     ax: g7 c0 E6 ~- q; [' t
  782.         iret
    / o9 z2 ~3 |3 [6 a
  783. % A) A/ b5 z% M  k
  784. _set_pos:9 H6 z0 U" h- T/ s
  785.         mov     cx,cs:[pos_x]9 @) b- \$ }$ r( q. k1 r
  786.         mov     dx,cs:[pos_y]" L( I7 c, X; _9 \
  787.         mov     word ptr cs:[x_move],0
    7 @; Q5 M2 H+ u& {( L% h: }
  788.         mov     word ptr cs:[y_move],03 p% l2 f! m. K6 p# @# T
  789.         iret) O7 E/ i+ j$ y
  790. # C+ F8 d# W1 V' P$ o/ r
  791. _set_hor_pos:; d, q$ z' K( V& T9 v
  792.         call    max_min
    , T8 K( I0 x8 k$ v6 H$ E3 J
  793.         mov     cs:[x_min],cx
    + w+ X4 {7 o* w3 @9 ]
  794.         mov     cs:[x_max],dx
    ) M6 K: X8 n; s9 p; R! c% ?
  795.         cmp     cs:[pos_x],cx1 _1 V9 e0 ?5 F: L. A
  796.         jge     good_hor_min  M/ j1 ?* d9 U# @/ ~6 y
  797.         mov     cs:[pos_x],cx
    # F- w( D3 J# U* x* g
  798. good_hor_min:/ W2 i# l" A$ G; ~8 v2 L
  799.         cmp     cs:[pos_x],dx
    , M- u5 Z5 W- O6 Q: Q* r1 t
  800.         jle     good_hor_max
      ?1 L" w- X. Z, G
  801.         mov     cs:[pos_x],dx
    ( |0 g9 d# @% u: u$ ~* E
  802. good_hor_max:
    8 M5 e! |/ e2 N0 O1 E; E3 u
  803.        iret
    0 e4 {' g; N& B& I0 k

  804. % z; o/ K2 K5 n) ^5 d# {
  805. _set_ver_pos:$ B+ _+ b% {7 j1 q* R# A
  806.         call    max_min
    2 Y5 Z( u$ R  C; d( Y$ p
  807.         mov     cs:[y_min],cx
    % ]8 i; G7 {% k2 U
  808.         mov     cs:[y_max],dx% n' @5 K$ {# h
  809.         cmp     cs:[pos_y],cx
    * s; j5 H, J2 \# z  W
  810.         jge     good_ver_min; X4 O, n# E9 |6 ]3 m
  811.         mov     cs:[pos_y],cx
    5 |* r# l' ]& x' @' d7 V" B
  812. good_ver_min:
    6 l* y& f0 N) ?, N
  813.         cmp     cs:[pos_y],dx$ L& ^- k+ N- e
  814.         jle     good_ver_max1 F$ H. p5 k1 R7 Q
  815.         mov     cs:[pos_y],dx
    $ a4 F0 O* N1 S/ L. l
  816. good_ver_max:1 C0 a- Z: w: J9 n. p  i
  817.         iret
    . l1 Y, Q7 c2 B6 F

  818. " `6 ?6 e. F) [; B
  819. max_min:3 {, s/ J) X7 D3 y, N& d% y6 D
  820.         cmp     cx,dx  P; b# a+ g3 k4 s7 f! o) V, Q' k
  821.         jle     no_swap5 {/ w+ |+ V" @
  822.         xchg    cx,dx5 v! n% X; @3 t5 j6 d$ M9 r, e
  823. no_swap:
    1 ]7 O* c1 g  o! n7 p" H
  824.         ret" e* L4 y* V$ j2 N7 J" M8 q

  825. * p! c6 L. Z, J/ Q0 W5 u" J
  826. _set_subroutines:
    $ Z- x( H' {$ g& H1 _- z5 g+ @2 K; j: u
  827.         mov     cs:[user_subroutine],dx
    % m( |2 `3 u  L3 e0 ]* ^- c$ S
  828.         mov     cs:[user_subroutine+2],es
    ! o$ X2 h" B4 O: \7 D
  829.         mov     cs:[user_mask],cx$ g) V/ g$ e# d
  830.         iret
    4 D" \" o- P9 @0 l5 D. a1 ~

  831. : N# W' b+ l8 y( M+ V1 E7 w
  832. _swap_subroutines:# ^. S: c, Y: h& u8 l
  833.         push    word ptr cs:[user_mask]
    ; Z* L7 ^, P# E* ]& R# x
  834.         push    word ptr cs:[user_subroutine+2]
    7 |! {: _5 ~0 F# U: {  O' o; V
  835.         push    word ptr cs:[user_subroutine]5 q2 M0 ~4 v1 q, E/ L  G; }
  836.         mov     cs:[user_subroutine],dx
    " U9 T7 {) d4 C% p# a3 H
  837.         mov     cs:[user_subroutine+2],es
    2 ?" O7 J; U6 L. o& l# z3 `( z+ @
  838.         mov     cs:[user_mask],cx9 \" A" N; P6 C! o
  839.         pop     dx
    - y- j2 p" n) ~: P: `
  840.         pop     es
    % G6 A  k( v1 F! v5 ]
  841.         pop     cx# B$ r5 U$ M+ I
  842.         iret
    ! N* L- ?+ J* [2 |) W

  843.   m. r+ ^* X& f, L3 e1 ]
  844. memmouse        endp/ H. T4 m$ ~% J2 y* D% ?7 c

  845. 4 C9 [. M* s: Q( g3 A3 z
  846. endof_start:0 w, d  D+ @' o$ J
  847. 5 A% P$ L: [2 r/ X
  848. emsg db 'No mouse driver install error!$'% [* Q) P- d& S/ j1 y$ j5 X
  849. old331 dw 0
    1 D6 p, V$ b* \6 q, v& b
  850. old332 dw 0
      o  r2 L- e' b9 a
  851. old741 dw 0& Q7 Z. j9 u5 c+ I  [
  852. old742 dw 0
    ' C2 [. F" c; k; [5 `7 t5 h
  853. memcopy db 0
    0 I' r7 a/ o& p0 m+ W
  854. okcheck db 0
      L0 N. _- C" S' f) |% a
  855. pass db 0  r" k5 k: @3 T- v
  856. chkl db 03 x. r+ q5 I# Y' z
  857. lk db 0
    1 F- u- @/ T& Y" |4 G
  858. chkr db 0( ~  a% q6 c! |3 Q, p7 {  \/ B
  859. rk db 0
    0 F5 o$ U6 J* {" ], ?
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '! E9 p9 b  U! Z( ]( s
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    4 i5 e; F! N! P. F; V
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '0 M$ J# X' \5 W1 P# I- b
  863. db '                                                                                '
    1 d/ N( s& [$ L3 H0 E
  864. db '                                赏屯屯簧屯屯突                                  '
    1 k$ r$ f8 u, l" ^* }2 s
  865.         db      '                                ?OFF汉OFF?                                 '7 N& I& r  B9 H: l) S0 Z
  866. db      '                                韧屯屯既屯屯图                                  '
    5 c( T0 ~! e- o
  867. db '                                                                                '0 Z8 g, r5 C( C9 j, u# p
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '9 C4 @9 M( U& Z7 x
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' , T. B$ r8 D. _. N- j* l- r" J- q8 N
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '; C% Q5 o8 k3 q/ I8 r+ Z
  871. $ ]7 ~0 U4 p: o. V# q
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
; U8 E  @5 U- g$ V哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 0 i9 T! D& f; h% C5 P. y2 A$ ~

. M' w6 ~7 u4 X* d) S+ X5 W谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 16:55 , Processed in 0.050332 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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