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

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

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

/ Z+ o% b1 {* U) m% n% {代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    $ s( Z& j6 \! a1 v* R7 O2 c
  2. ;          Ufoit PS2 Mouse test program   Ver 0.99 M2 }$ ^* U# H
  3. ;                                         By Bini.Yi 易祝兵
    3 H1 I" m& c0 z' k  ^/ j
  4. ;                                         http://www.ufoit.com 计匠网5 e/ i) ]9 {3 ]0 P, j! t
  5. ;                                         2002/04/06 YYYY/MM/DD
    9 z$ G# K4 ?1 v! N, f; D
  6. ;9 s6 @8 r6 L2 ~( v& |4 d
  7. ;          $ o( ^; H% N) [/ o6 M1 Q  q
  8. ;          This program  test the mouse button  click and move.0 Z: m" a0 Q3 {* k% C% y, A
  9. ;
    " V; r$ m2 V: I! b

  10. ! @# M1 F4 g7 H, G4 W% l
  11. .model tiny
    5 S! D  u! R7 {! \0 V- b
  12. .586
    7 E( X; v9 z) q$ M5 v" M
  13. .code
    ) N. S5 R  _( ^# k
  14. .stack  100h$ e8 q- i- D) H  G, e, _- W
  15. .startup- ^: p; p* k# |+ k/ i: Z1 K0 _
  16. pusha6 b. j4 L) S. H' \. }
  17. mov ax, 3533h
    8 b# U" w7 E' R6 Z3 Q) P
  18. int 21h
    ) b* m2 v  @9 H: C6 W  ]' r" n
  19. mov word ptr cs:[old331],es0 ?8 o/ W/ V" j: R$ o
  20. mov word ptr cs:[old332],bx. s5 ~$ _1 S. u; `4 u# |  |% C1 _$ w
  21. mov ax, 3574h
    - V# w; s2 M& q# K9 r
  22. int 21h
    ; x, v7 R  Q& d8 }) |
  23. mov word ptr cs:[old741],es2 \5 ?  e6 t8 l
  24. mov word ptr cs:[old742],bx
      |; x$ O: x7 V4 H0 o0 ?
  25. popa
    + j  @6 q, {2 ^
  26.         call    memmouse
    1 i) E6 h9 b' \3 s( g4 z9 f  W* \1 W
  27.         mov ah, 00
    ! {& R# K5 {- V: e0 K/ Y
  28. mov al, 03# A2 b& T( V! O% q) A; Y
  29. int 10h! M# T% v7 k" m6 C( a
  30. mov ah, 06" ?! `8 o( p3 ^7 p  r
  31. mov al, 0( l% ]* h% X$ u6 V. D1 O* ?
  32. mov cx, 0
    . h) f# D, v3 u; I
  33. mov dh, 249 L# S4 B9 R7 C6 J# t) t/ F0 s2 X
  34. mov dl, 79$ m# a$ E) Y; |! j2 H$ o
  35. mov bh, 07h
    5 f' L) H4 D& [( ]
  36. int 10h
    5 t5 E# l' T0 e6 s! J  P
  37. mov ax, 0000  Z5 K5 }" t( x) h3 n: W6 N" I
  38. mov bx, 00025 I7 j) Y$ f4 ~6 Q! V$ R* l" y) @  `
  39. int 33h/ s8 D7 l$ [, Q4 k, A
  40.         cmp     ax, 0000           ;if no mouse drive install
    ; [; u8 }/ A1 \1 j5 O2 h
  41.         je      errormsg           ;show error MSG, Z+ m: J1 d8 ~$ Z7 }, t$ _  j8 e& f
  42. mov ah, 027 R* X1 m& _) D& j: S
  43. mov bh, 00
    , F3 L1 g5 j  A' F8 h7 N
  44.         mov     dh, 25             ;Move point out screen9 o. ]# g: n3 \. W: y. g3 }2 f
  45. mov dl, 79
    9 @- t4 }. V, y* Q: l
  46. int 10h
    " S+ B7 N/ H: y
  47.         call    showmsg            ;Show info
    7 S# h- j: X* o3 T, X$ K
  48. mov ax, 0001
    / d0 ?  R: u. @- m6 E& [
  49. int 33h* `& ^: v/ M5 Y7 K- z
  50. ; mov ax, 000ah
    % s' u- _, C2 r  s7 [# n
  51. ; mov bx, 0000
    % Z8 O- o5 a# X$ k/ _& W/ u" t' Z, f
  52. ; mov cl, 0h
    1 h3 Q7 M& r8 z# m+ o6 V
  53. ; mov ch, 0F0h8 y4 B: x' ^' R- H
  54. ; mov dl, 0h$ D. W' u  c2 V% K4 S6 Y$ I7 L; Y9 O
  55. ; mov dh, 0F0h1 k, U0 M. `, R
  56. ; int 33h
    * O1 h! j  g. Q* O& S
  57. mov ax, 0004h
    6 I% j% ~( Q* t- c# ^' n2 z
  58. mov cx, 0319
    " x+ T' C+ I; v8 E$ A' X- Q
  59. mov dx, 0103! h* H) Z2 h9 |. `" V
  60. int 33h
    . {" j  f* F0 x" b% V7 N! ]: X
  61. casemo:                           ;Case button click and point move - ?+ N. u: L9 o" D
  62.         mov     ax, 000bh         ;and keyboard press
    2 q2 j. N8 e2 L+ d) |/ M
  63. int 33h  N/ K* X2 {0 V" o" [8 G
  64.         cmp     cx, 00h           ;if point move....X
    ! O; C0 Z. h% I( o* {, f# }( g
  65. jne xmov
    0 N- |; z# D6 F9 f
  66.         cmp     dx, 00h           ;if point move....Y; h/ G' q' J" u1 e7 V+ I
  67. jne ymov6 G- N& u3 F- M7 _; v
  68. xymovend:                         ;X.Y move end
    4 j% H, A( Y4 w& f- w$ \
  69.         mov     ax, 0003          # w0 V& a3 S9 w4 L7 U4 Y
  70. int 33h
    ! e0 f& I  i1 z& p, _# Q3 v  J' x) C
  71.         cmp     bx, 0001          ;if left button click  show ON
    9 w  |" j# ~7 {; [* J' s
  72. mov si, 1828
    5 G' M% i# F( ~+ w4 ]
  73. je listl6 z; D2 X9 Q! z" `( \
  74. mov si, 1828
    - }! ?  [. a+ M1 Y+ G* p/ G* q5 n2 _
  75.         jne     nlistl            ;if left no click show OFF( N( q. ^6 @3 [: m. p
  76. testr:' j+ U# e( c( l# X
  77.         cmp     bx, 0002          ;if right button click show ON
    7 h, b' ^$ T9 k4 J) P! U% h0 ]
  78. mov si,1842  i; g" }& ?+ q0 f% z, ?8 m- Q: U
  79. je listr
      L" G& ]/ @, U" W0 w5 g
  80.         mov     si,1842           ;if right no click show OFF; k8 z2 z* B$ V! s$ d1 A2 i  S
  81. jne nlistl
    ' z0 i0 W) X  D3 }- S
  82. casekey:
    ) c# M$ H3 C- @$ m2 z$ w" K
  83.         mov     ah, 01            ;if any key press jump check
    ; I- x- S% O3 [0 |
  84. int 16h
    ) f3 n+ s+ c6 a+ k- K; D" [# I0 B
  85. jne kpress
      X! O: M1 ~  Z6 w+ k, @1 T
  86.         mov     al, [chkl]        ;check x flag
    + _% W1 K& s! |
  87. cmp al, 02h# t$ U$ K: E0 B" N+ r
  88. jnb chkok
    ( ]7 |" I! X; e% x, D$ W$ ~- M) q$ v
  89. jmp casemo$ l' u3 S5 u- s( P( C
  90. xmov:                             ;if X moved, get the X flag+1& F2 y6 N7 _7 A" D7 ^
  91. mov al, [chkl]
    0 a! G* k- @/ C2 l9 D
  92. inc al4 Q4 P; ^+ P% ~, d8 G$ v
  93. mov [chkl], al! L/ \5 z5 u6 T
  94. call passok  ~1 B, F" z$ D8 K& X: @
  95. jmp xymovend8 s3 o, O9 L( p& B
  96. ymov:                             ;if Y moved, get the X flag+12 o6 \. @5 _  G+ q: H( K
  97. mov al, [chkr]( W5 A, Z6 I! m3 D/ \
  98. inc al
    3 k) d7 N6 F; B. x: Q3 b. Q7 t3 A
  99. mov [chkr], al- z  T. E4 W+ C+ J' ?5 e
  100. call passok
    3 ]0 T$ r# C& m4 T
  101. jmp xymovend8 m4 B/ X+ q: h7 p7 G1 j/ K
  102. . }& T9 b5 {3 @( S. w
  103. passok proc near, \1 ^, D/ g4 c! w, T2 [) K7 K+ r% I
  104. mov al, [okcheck]. m* [$ ?. i. X6 |7 s$ s
  105. cmp al, 1
    + n# _3 x+ G# I
  106. je let0# Q+ p! v9 R" c+ W8 }7 z6 M
  107. jmp passret
    . m# i% ?) |& O5 H
  108. let0:
    ! P; o1 i6 c/ p, J- D
  109. mov [pass], 1
    + ~; K' F/ ]% \) x
  110. passret:2 {1 \- d  }! ]9 ]6 m. ?
  111. ret4 R% p/ F1 D. k( _
  112. passok endp 0 E! f3 c' D: P7 a2 q/ O( e# p" ^

  113. 5 q: y$ B* m# c
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    1 h. j# w2 ~: q6 b, Z1 @0 G; @
  115. mov al, [chkr]
    - f( \' q% P% x2 Y. t8 Z& Q
  116. cmp al, 02h
    6 n9 f7 o3 O6 n
  117. jb casemo
    3 M+ H2 @4 E4 t) _0 l( d
  118. mov al, [lk]" a9 }5 |! V- V, Z% d) `
  119. cmp al, 15 n; D' k  @2 ~: p
  120. jne casemo& Z6 F4 L/ m0 q4 ~+ l
  121. mov al, [rk]: m1 y, M  o2 w# _! G: Q$ g' c
  122. cmp al, 1
    - [; e$ m. H) u- w3 N* K
  123. jne  casemo
    # F0 B- S9 G) |5 o) H9 |7 X# T
  124. mov [okcheck], 1+ q. T3 ?4 \7 y, a
  125. mov al, [pass], {/ s# q) r; @! L
  126. cmp al, 1
    " J& G; s; [+ C; k
  127. jne  casemo, ?- F' C& K. j; R1 j. Z( p
  128. mov ax,0002h
    + V' g- S* o' Q7 O# K$ F
  129. int 33h: ]& p1 |  i/ F* v
  130. call cleascr. H6 L; J" O3 e5 O' q" W

  131. . r3 {7 y9 n! N1 O) p& u
  132. call oldint
    - y- j2 h8 s, g+ J1 J5 P- ~5 ]
  133. mov ax, 04c00h+ j+ b( f- {" U$ \9 c4 Q, h& v
  134. int 21h
    . `$ \% S& Q6 X

  135. 6 i4 D5 i4 i. F
  136. okexit:5 ^! u. Y) h( @/ ~/ D/ Y% x
  137. mov ah, 4ch' G+ f8 r* d+ M# B- _8 G
  138. mov al, 09 H5 r* K% l9 i: p
  139. int 21h
    3 ?  T, h" |$ F& r
  140. listl:                                 ;Show ON3 Y2 p: T! s# y8 H/ T
  141. pusha
    , {. C7 ]5 t1 x, F/ M8 E) q% M
  142. mov ax, 0b800h
      ?" L' D6 j6 S; A" [
  143. mov  es, ax4 ?$ m/ i0 K$ G7 U
  144. mov ah, 47h* n' e/ R/ M+ z6 m
  145. mov al, 20h
    ) N: ]$ ^' S/ o3 }( J
  146. mov es:[si], ax. q9 o/ H( P, W8 [) z* {  {, E% [
  147. add si, 029 H0 u8 x9 B' t1 n9 p, j* i
  148. mov  al, 4fh
      {& c: _# f1 y+ A$ L2 e9 k$ ~9 b/ I
  149. mov es:[si], ax" ]. Q& G5 y/ _6 z' S9 s5 ?
  150. mov al, 4eh" B" G: v9 z8 L  {1 V
  151. add si, 02
    + s  U+ G4 o0 p) @
  152. mov es:[si], ax
    & m0 T8 O9 _- v. p& E9 {
  153. mov [lk], 1+ L# U1 a) F, G" m* ~/ E" D# o* h
  154. popa, S/ a& C  _8 u7 O3 }% l$ x, V
  155. jmp testr5 |' }: u0 u# H( f
  156. listr:                                 ;Show ON
    4 v- Y' ~* ?0 S! P+ g8 f0 M
  157. pusha
    $ j, T2 A7 ]4 \4 {" f/ ]
  158. mov ax, 0b800h
    ) d! g3 O( ~2 ~3 i
  159. mov  es, ax
    : Z$ e) W% G8 f; f# X& Q+ ?  o
  160. mov ah, 47h
    7 t. J* }0 W  p
  161. mov al, 20h
    0 I1 y( Y: r7 U& \9 \( |+ x
  162. mov es:[si], ax
    4 f( ~) c2 i9 N1 v9 ^
  163. add si, 02: g4 c% L: ?  X5 f! g8 M
  164. mov  al, 4fh$ i; W: e* L  f0 f( ~2 q9 M7 k
  165. mov es:[si], ax! e+ |" b& l, W. B+ l) }# O
  166. mov al, 4eh: f- o9 x; a- \9 I: q+ ^+ D
  167. add si, 02
    ; m3 [0 E) x: {7 M
  168. mov es:[si], ax
    & X2 M& B" A4 ]; z" i: l! G& H
  169. mov [rk], 1& U3 c, l, u9 H2 p
  170. popa
    + b# U4 K6 u( D8 y: J5 [8 ]1 G
  171. jmp  casekey
    5 {! J/ r) I. X! W

  172. * }, e$ h" d' W! S0 Y: U. }* W6 \9 V
  173. nlistl:                              ;Show OFF! v& e  R8 c1 R; Z4 P
  174. pusha   ! A1 C8 ^0 S" J5 {+ _) M  H' c
  175. mov ax, 0b800h
    ) }! ^. ?6 {% |0 N+ q) ~" H
  176. mov  es, ax
      ]9 U. _8 O: F& ]& O6 |
  177. mov ah, 17h# g2 R: q9 n. `( v( K
  178. mov al, 4fh. f/ P% t' f( ?; g2 e4 s: i
  179. mov es:[si], ax
    5 o) c, M0 L; e, m
  180. add si, 02) ^. b: _5 d$ `+ \% t( p
  181. mov  al, 46h
    * k9 W) ?& h# J' X
  182. mov es:[si], ax9 v' f( r  x% M5 ^; W7 X% G' ^
  183. mov al, 46h
    4 ?  w9 n  a& l5 Y" m* K# B
  184. add si, 02
    5 n! m! g8 E% I: A$ O  d! I& q
  185. mov es:[si], ax
    * v& l5 H( w" j0 f9 h4 j" i: e, r# s
  186. popa. d$ ~7 Z' Y6 \
  187. cmp si, 1840
    7 F! V/ b/ W) ?
  188. jae casekey2 P) u8 L) t" j2 w) s
  189. jmp testr
    , j0 K/ O0 a% h5 h

  190. , o8 X4 G3 U2 i$ V9 l( K
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    , r& a! n0 k$ s$ r
  192.         cmp     ah, 01h             ;and return a error
    1 b) i- X, Q+ ]8 y
  193. je exit1$ k6 f& N: R" g# @
  194.         mov     ah, 0ch             ;if press other key then clear: A2 a9 `! v3 ~+ I
  195.         mov     al, 00              ;keyboard buffer
    . X% h3 d1 e; g) m! V
  196. int 21h
    : j5 s7 l4 j1 R$ A, `1 B7 W7 F8 X: V
  197. jmp casemo % W$ f# {5 G0 T

  198. ' M) C. p2 D! j6 p& T
  199. errormsg:                           ;if mouse driver no install" J/ T5 z2 g: d3 O% k$ m5 J
  200. call oldint  r! g$ A' z6 O. Q" e' Z% e
  201. lea dx, offset emsg" P2 R/ H. B( J$ U/ V! g/ W* S
  202. mov ah, 09h
    9 R/ G  v* U5 B" n* ?" ~
  203. int 21h% O7 k5 z1 W- i! F) d
  204. mov ah, 4ch
    1 ^7 H; S: o' q. L, c
  205. mov al, 2
    1 G9 k$ C) @( A" l% }6 ?
  206. int  21h
    ' L- M+ [; N" g0 _, ]" Q! b- j! {7 n

  207. 6 `3 T" \  J5 t9 W) ^; H( s
  208. exit1:                              ;error exit( y& A# U( l, ~4 j4 x# T  C
  209. mov ax, 0002h
    : R' D" C! K& c3 ]& ~
  210. int 33h
    # y; A; v/ b3 Z' l, s
  211. call  cleascr
    % y) [: y' c9 ]! X3 _
  212. call  oldint
    3 c+ d' u7 y; T3 }; `8 ?( @
  213. mov ah, 4ch9 L6 `3 W; o, I* F1 x. g$ R" _
  214. mov al, 01
    : B! m% y# s6 t9 f# f' s% t( f
  215. int 21h
    + a& _% d( d0 h1 ^' D! d2 L% Y# J
  216. + f0 c  `5 r0 g
  217. cleascr proc    near                ;clear screen
    6 |  Y8 l) \& R5 D  h0 G- y
  218. pusha( R8 p' N! R  x2 A! @  m
  219. mov ah, 06
    2 W  H6 _: {  e+ R  u0 Q
  220. mov al, 0% X  _* T' ^% q$ K5 ?: b# Y- ]3 Q
  221. mov cx, 04 s. {. X2 D, o: E* |
  222. mov dh, 24& T2 S: Z8 [' l' A
  223. mov dl, 79! h2 b- ?9 S' T& _/ x4 c$ ^
  224. mov bh, 07h
    6 ~8 E* y* e! r0 z( z
  225. int 10h: H5 g7 F! B; ^" c4 i  s
  226. mov ah, 02, j" P' P, W! o* k1 i: B0 Q- C; i0 ]
  227. mov bh, 00+ H$ d1 X" o5 H* v5 I( q
  228. mov dh, 0
    * S9 o, M4 M1 l9 O% d: t# w3 z9 A
  229. mov dl, 0
    : ?# A, b1 X* h; ^3 j
  230. int 10h; E; A( G8 ]- W9 v
  231. popa7 i/ `% }" [, M
  232. ret
    + C% c( [0 d/ |. R; g) P2 ?1 l! u2 C
  233. cleascr endp3 t- B; S& s% G, l! I- M3 E
  234. # S: j7 q" F$ \  l" ]/ ~& m7 \, j2 Y
  235. showmsg proc    near               ;Show info
    $ I# u$ |: o& v# k, o' e
  236. pusha% Q6 P9 c3 M; ]
  237. lea di, offset showms
    ! i% Q; c, k* n0 F, b
  238. mov ax, 0b800h, y7 @' w/ a! V, r7 @+ j+ J! g
  239. mov es, ax
    : [; O* U7 F, m; ^$ O
  240. mov si, 0
    5 t; S/ S8 C  A4 c( t& k
  241. mov cx, 480
    , U$ A% L9 i) n5 k4 e5 Z* P
  242. mov ah, 07h- B" `! D7 k, j1 M; u( l- v$ n
  243. @@:
    4 S( ~, `4 U% |" N5 }( L
  244. mov al, 20h
      r5 `+ {  U# q" b9 Q0 p
  245. mov es:[si], ax, ~; q9 M( X7 i* I
  246. add si, 2( t8 |" N7 x& }
  247. loop @b+ Q7 m8 q+ K6 {5 H, c# I3 p5 Q: J
  248. mov cx,8804 N8 ^" y! |) [& h& C8 e
  249. @@:
    / {# x# ~; |. Y" V/ \
  250. mov al, [di], e! B( M0 k# m
  251. inc di7 g! z' `  A( H* t9 H# ]5 J
  252. cmp al,20h
    1 s" ~& {7 V  b; e+ ]
  253. je showch1( l8 I8 c4 I0 [8 C) t8 d
  254. mov ah, 17h  ]! g0 M& H6 ?
  255. jmp showch3
    ) F5 @' o- ~% R4 f
  256. showch1:$ B1 h- F0 l: N! [* ]
  257. mov ah, 07h + b) t' n# j8 q+ Q; E; t" [/ C5 h! T
  258. showch3:
    - ]- b: |) s8 r5 w; [- ^/ `( Z. |& O
  259. mov es:[si], ax
    # m+ F- F* N' `; S' Y% v% r
  260. add si, 2& S$ n  l4 s. V% K
  261. loop @b
    6 F  H, y$ T& Z3 L+ @
  262. popa
    ( r" l5 u! ~7 l) A9 o4 a% ]$ g7 V& H
  263. ret
    - M4 u, g* Q" u: e
  264. showmsg endp
    " ~6 w  _: z* b

  265. : O/ v' O5 Z0 b$ Y" \
  266. oldint proc
    / W. Q+ Q- S4 X  q% X
  267. pusha* x6 p5 H0 }! C( F* o
  268. mov ds, word ptr cs:[old331]7 J1 L5 }3 Z' r5 g
  269. mov   dx, word ptr cs:[old332]
    $ O* O/ g* b, S- n  J" h0 d
  270. mov ax, 2533h% V( H! z$ P  E  P6 h* h0 ^/ f+ l
  271. int 21h0 G) Y% l2 ?8 n, {: F$ n
  272. mov ds, word ptr cs:[old741]
    % v! v( R1 w5 P, U& J
  273. mov dx, word ptr cs:[old742]
    " e3 {" R+ X6 ?3 f! C9 x, ?' o
  274. mov ax, 2574h
    $ r: m8 a! e# T3 O, |. U$ |
  275. int 21h1 ~0 ?# x8 M6 e4 o( T
  276. popa
    & q+ P& a* ?2 A" ?
  277. ret% Q" {; `* ~& k. A5 n6 a% w- Y9 u
  278. oldint endp
    ) `+ h& f, H7 u+ T/ \

  279. 8 ]; d3 a" n- z. b( Y
  280. memmouse        proc
    * L5 B+ W0 @$ p: R2 ~/ q2 F6 Z2 ?# o
  281.         xor     ax,ax/ C6 F% l* v6 P9 o
  282. int 33h& Q: E) |( O* `0 H. T) F. y6 V
  283. cmp ax,0ffffh/ h' s. q8 v* k1 I- r3 P. M: k
  284.         jne     not_loaded
    9 |8 t- Y6 ^. x4 F, ^& h+ x0 `/ q
  285. mov [memcopy], 1
    / _* s+ n# H' C# [* \
  286. ret. v7 M: ?7 A6 j9 M, \
  287. , i! h" Z# w; _  ]7 K& c  l. U
  288. not_loaded:
    6 t% |% |% @. w

  289. 9 a! V0 `# B6 l1 J3 I( |
  290.         mov ax,2574h7 C8 e: J. t6 l$ T" U) ~! `
  291.         mov dx,offset new_isr
    / h7 m! @8 Q  r, Q, f+ v
  292.         int 21h
    * X: E1 b! m+ `% T- n. ~: u
  293. $ b$ e7 s8 K& x6 j
  294.         mov ax,2533h
    ( U0 K/ c2 G' Z; C# Y
  295.         mov dx,offset new_331 X: x1 M2 f# F- F: z4 y
  296.         int 21h: l2 H. F6 P/ f9 n

  297. % w3 w9 q4 r8 d; |% G
  298.         cli
    2 u5 i' {$ s8 V+ {! `2 S- n

  299. . d" |1 y) M' r/ N& L" a. W+ W; _
  300.         mov bl,0a8h6 M3 w0 h$ L8 v7 R- u& D
  301.         call keyboard_cmd
    8 Q! R! _9 Y- u3 n8 r: o! }: C% |7 j& ^

  302. , |) N% S) V" N$ g: Q; ]' k
  303.         mov bl,20h3 F2 e8 G5 \* }' a- _
  304.         call    keyboard_cmd
    ) g; @  t6 [. g8 M/ i% w  E+ @' K
  305.         call    keyboard_read$ t. B1 ]7 W7 c& u, L: ]+ M
  306.         or      al,2
    0 q- V( @2 b. r- i4 y- S- n/ A
  307.         mov     bl,60h) _/ u1 f- r" q  g2 V. y
  308.         push    ax
    " r1 H& f& }! ], r5 n
  309.         call    keyboard_cmd' d8 X: f/ }" x+ w0 _
  310.         pop     ax, A0 e7 X; s$ x; T  ]
  311.         call    keyboard_write
    ; X+ ?# r2 \; P' y- O! D/ `
  312. - c" {2 r8 S7 t* ^" r
  313.         mov     bl,0d4h4 D7 K0 I; A& S+ {5 f6 L
  314.         call    keyboard_cmd& \& y' e* b: U- U4 `9 _
  315.         mov     al,0f4h
    9 f* h& n: X" o' N' Z/ k
  316.         call    keyboard_write
    ! A7 @3 x1 `/ f* m; D1 V) n7 ^

  317. / [8 \% E# {% c& |2 B
  318.         sti
    / W9 G$ @( V) g
  319.         ret
    - N; h# i9 l( ?! H1 |
  320. call_user_isr:) \0 ?! ~3 p1 `* ?7 B
  321. db      60h- s. {4 S6 v+ j) V/ j
  322.         mov     cx,cs:[pos_x]3 [( x) g, r" y/ E$ L- `( b9 l
  323.         mov     dx,cs:[pos_y]
    ; m& `) z9 Z9 s  E4 {8 w  o& [
  324.         mov     di,0 ;cs:[x_move]% P0 I8 l$ L/ N: g
  325.         mov     si,0 ;cs:[y_move]
    : D6 r6 p; f& \% {- _5 U
  326.         mov     word ptr cs:[x_move],0
    ) o/ p! \" A9 @& C! _+ k+ ]$ i
  327.         mov     word ptr cs:[y_move],0- c: |# L) W0 @& O$ U! f
  328.         mov     bl,byte ptr cs:[buttons]
    $ m  s" Q- ^& j& v8 [" O+ ^
  329.         xor     bh,bh4 _% Q# Z) ]$ a( {( Y. H
  330.         call    dword ptr cs:[user_subroutine]5 P% D8 o. e0 a6 x) |7 x
  331.         db      61h
    . p' K- H" w; H5 l
  332. ret
    % @/ k. m+ D" m7 C
  333. new_isr:+ b# {( ^$ Q5 `: A3 F- q$ ~' F5 W
  334.         pushf: Y7 X$ n% e" w
  335.         cli6 F) }" [$ K6 N
  336.         push    ax! L( T9 T/ s  u2 [! w4 w
  337.         push    bx
    1 f9 l. l8 e6 S+ d" _5 c2 R3 J/ \) ~  D
  338.         push    cx6 O% i/ H+ I: [# M2 w7 v6 D
  339.         push    dx
    * G& j# x' Q* G" D3 j$ {8 P- T1 c
  340.         push    di
    . z8 W5 H1 ?& G7 }' r3 K
  341.         push    si
    ) C7 @+ L+ V- y
  342.         push    es" w' P; q5 U1 f
  343.         push    ds
    / D( U* M4 n( b) A0 G

  344. % t: `9 ~  a% T9 l/ m8 X
  345.         push    cs
    6 G$ `( U! k3 g6 p7 [; V
  346.         pop     ds
    * U) E, V) x! S

  347. ) I: ^3 p! y9 _( m2 B$ |
  348.         mov     bl,0adh, ?" g5 I9 M; C: I3 {0 w
  349.         call    keyboard_cmd
    9 i' z5 R& v, n

  350. ; r9 ^" [/ o0 @0 g, j5 `; P
  351.         cmp     byte ptr [first_time],0. K8 o3 |0 e# e6 n3 h# x- L8 j# z
  352.         je      not_first_time
    ) \$ m( u8 A* Y  s8 e- f7 l; u

  353. + T. \6 k2 d, `. o; T8 R& ^4 j
  354.         mov     byte ptr [first_time],0
    " [2 C4 m+ T5 ]- y7 Q! `+ T
  355.         call    keyboard_read
    $ M. u# w/ Z) y5 m3 x1 K* T
  356.         call    keyboard_read
    4 \0 E& _' Y0 ~2 M+ }$ z
  357.         call    keyboard_read
    ( D% i/ _( {1 k1 n! @/ b* V/ c
  358.         jmp     no_show! B0 t1 H2 Z  F0 E  x* ~7 X  p
  359. 7 m8 n: C; c0 v, }6 y
  360. not_first_time:2 ?" Z& `1 P) ~' k) a
  361.         mov     word ptr [temp_mask],0
    1 ], F1 g0 e6 S- e4 D

  362. 4 W: p% X  f4 g8 W4 Q) }3 O6 O
  363.         mov     cx,[pos_x]! s4 n6 b% ]( Q* J! U2 Z
  364.         mov     dx,[pos_y]
    / `9 E- D* U1 A' j. W# b' q
  365. ; g* y* x8 x3 E
  366.         call    keyboard_read
    9 U1 d, `  [! e# ~$ \% G3 @& u6 O" F
  367.         and     al,7 ;30 X' e) F% @( z6 q, x! k
  368.         mov     ah,[buttons]
    % H! ?7 y- Q! c
  369.         mov     [buttons],al  ?% k5 q, C0 d! O% z0 Q
  370.         cmp     al,ah
    ' w+ g; e- {* `( s6 R9 G5 [' J$ k. |* H
  371.         je      no_button_change( e) Q  l  A6 a# z
  372.         and     al,3, {% ~# E# ]& M; O
  373.         and     ah,36 z  W# u, a6 z$ i; D# ?
  374.         xor     al,ah& H# ?, `& h8 U* ]6 z* c# n
  375.         xor     bx,bx
    + r1 P$ \: p) S# ?
  376. . O' n3 Q8 X9 U! s/ a/ V7 T
  377.         push    ax
    5 B$ t/ X& w% }/ a
  378.         test    al,2
    9 X; q( I/ e; X6 t: w
  379.         jz      no_right_button_change
    ( _6 Q, ~' p, [% s* t- a, a$ Z
  380.         and     ah,2+ X. e8 m0 y1 v+ g1 ^6 _% f
  381.         jz      right_button_pressed
    / @1 p) [  Z; z5 O6 t( }" N
  382.         or      bx,16
    # [9 J' ^% }6 ~: J  c- p0 l
  383.         jmp     no_right_button_change  j* F: h- S+ K1 [/ S! R: i+ J7 k. H
  384. right_button_pressed:% G" s9 {) |* t- x1 {- D7 V( f1 Z
  385.         or      bx,8
      X+ M+ B+ c9 R- u6 N$ s5 Y5 c
  386. no_right_button_change:
    ' w  Z$ c8 j6 M& d' d! |2 K* _& g
  387. % R* n0 e% C2 P. c$ @! ^8 N6 G
  388.         pop     ax& w, j6 m8 O' {8 L1 A, Z7 v

  389. 2 p/ w) s" y2 P4 D
  390.         test    al,13 q4 w) y5 J9 P% x- I# i- l( E
  391.         jz      no_left_button_change
    * k: Q0 J# k+ x/ k$ |
  392.         and     ah,1  C* }/ Z& [; E2 U4 w' \7 O. f
  393.         jz      left_button_pressed
    # @& b) Q& D/ S# C. y2 f+ `
  394.         or      bx,41 t, ^& R- {) f; x+ ^6 [2 B6 c# R
  395.         jmp     no_left_button_change
    9 a$ h$ `- Q, `% p  d% f* L
  396. left_button_pressed:6 i# }6 Y! W) G0 _) H  \* x( c
  397.         or      bx,26 r( q6 f. T; \' C! ~7 {8 d8 Y5 i4 I, s
  398. no_left_button_change:6 _) r$ R& g0 E3 m* F
  399. % s& a; F9 o5 C; V
  400.         mov     [temp_mask],bx, q$ ^% R/ f6 V8 I! Q4 R% X
  401. # F4 W# Q& J# d& j
  402. no_button_change:
    4 P: S+ U3 K3 Y8 [* s
  403.         call    keyboard_read: ~6 `8 P7 g3 b! m) y/ J3 q8 z
  404.         cbw
    5 B: f0 A# @; h
  405.         add     [pos_x],ax
    1 G; H; M5 @8 s& r
  406.         add     [x_move],ax: T, s  |4 Z. _9 E8 d" V, a
  407.         mov     ax,[x_min]
    3 ]( D! ]6 G% s/ S
  408.         cmp     [pos_x],ax2 N4 j, n6 E, k" \7 N  @! \1 e" J
  409.         jg      good_hor1! r5 p8 N) O8 g& R9 \/ O
  410.         mov     [pos_x],ax
    1 I" I( o' P  U3 I& K
  411. good_hor1:( {8 O' Y4 B' C# ^; o
  412.         mov     ax,[x_max], B3 K- G$ F! k5 w# A8 d1 F9 {
  413.         cmp     [pos_x],ax- b7 O" h( i5 ~
  414.         jle     good_hor2
    7 ]$ j+ A; j9 e. K; d
  415.         mov     [pos_x],ax6 L6 |2 Q& }5 \- f0 W; o* @- H
  416. good_hor2:5 b4 X; y. B) w. g8 Q

  417. ( T# c: C6 N7 D% i' ^0 a  a9 m1 W! t
  418.         call    keyboard_read5 H* c% X/ [5 u% k5 L) \
  419.         neg     al
    ) T' K9 C) [2 x+ s; s
  420.         cbw
    ) k7 q; [7 [# ?% u3 L3 X0 c
  421.         add     [pos_y],ax
    / j( c8 A& C4 {' U) {# v
  422.         add     [y_move],ax
    * P* J9 E& [: G8 S% ?; o3 I9 u
  423.         mov     ax,[y_min]
    8 A/ e+ o) A/ _% k4 |
  424.         cmp     [pos_y],ax- U* x$ F9 m1 Q4 w3 S) }
  425.         jg      good_ver1
    ) T: }5 X) s: C: P$ @
  426.         mov     [pos_y],ax
    ' N) |" i4 i  k8 s# w4 {2 v- I% P# I
  427. good_ver1:
    % Q4 {) |8 f& B' d. z
  428.         mov     ax,[y_max]# l: u/ D% p/ m6 B& S; f
  429.         cmp     [pos_y],ax
    3 J7 `/ {9 v5 h) f$ s2 V! e/ U; L
  430.         jle     good_ver2# T: {0 h* e9 ~
  431.         mov     [pos_y],ax
    + y% C6 I3 d0 C
  432. good_ver2:9 ^: s( B7 G8 z: G" d2 v- l
  433. ; k9 v8 t+ x7 A/ C8 D8 w9 C+ q
  434.         mov     ax,[x_move]
    + k  b5 v/ r4 i+ p& A4 e
  435.         or      ax,[y_move]
    * M- \- W1 t! f$ R1 N# J/ z
  436.         or      ax,ax$ N8 w( L3 a5 }# j9 y
  437.         jz      no_change_position
    1 y- A/ W( v" H+ v
  438.         or      word ptr [temp_mask],1
    & C: P( f; a8 x: c0 J; s
  439. no_change_position:
    ' h( \; M/ G5 K) |+ X- C. o
  440. ) Z% a5 {# Y! Y7 W3 W# \
  441.         mov     ax,[temp_mask]
    : h3 }& n; ^' [1 \$ t, Q7 g) c$ @% k
  442.         and     ax,[user_mask]7 `3 K) y' T2 `, H! Y7 o$ {( q2 E5 W
  443.         jz      no_call_user
    3 P, u; `, v# m+ |1 A4 T
  444.         call    call_user_isr
    5 q" M2 p  |+ y; b
  445. no_call_user:
    8 \3 ^( Z; p2 A0 K, R  D& g

  446. / y, y4 b  m3 ^6 p
  447.         cmp     byte ptr [sm_flag],1* I: R2 x/ l0 b
  448.         jne     no_show( i9 H4 h% }9 S9 M
  449. 0 ?+ C, u4 \0 U1 J& R% y) ]7 w
  450.         shr     cx,35 K2 H1 V% y5 y: s0 a1 C+ \* P( e
  451.         shr     dx,3
    + I& Z! l- s7 k$ V
  452.         mov     ax,80: B8 V" X/ Y  D; B; i
  453.         mul     dl3 x  v2 C9 p4 [4 k
  454.         add     ax,cx+ }+ Y( P+ |# m/ D- b
  455.         shl     ax,1
    / C2 ?4 s# \+ L' b
  456.         mov     di,ax
    & u/ E+ ^" _' K
  457.         mov     ax,0b800h$ S6 c2 g9 z& ~% o
  458.         mov     es,ax" b4 I! E# R2 U
  459.         mov     ax,[save_char]
    8 w; @7 a& ^- ?' D0 y7 u
  460.         stosw5 z  C5 V! i, c. w/ M

  461. 4 u5 P, d0 A+ ^- E; n5 E* s& D
  462.         mov     cx,[pos_x]% `2 u" }9 ~# T& v) j. x
  463.         mov     dx,[pos_y]
    + V! E9 C$ e5 ?$ P2 W2 m, r
  464.         shr     cx,3
    , z( I1 b4 o% |
  465.         shr     dx,3
    2 [9 U/ I) ^' ]# Y) ?0 E
  466.         mov     ax,80' p9 g. h4 b+ W
  467.         mul     dl
    % r" k( i, \% n" \; ?( K  L( ]4 t0 I
  468.         add     ax,cx
    ) d5 o' R" _' L" ^
  469.         shl     ax,1
    . I6 Q) U. [7 {4 ]% ?4 P: {
  470.         mov     di,ax
    1 m+ C; [7 h5 g/ l* \9 P
  471.         mov     ax,0b800h% z" i5 h* f/ Z5 I* }
  472.         mov     es,ax
    8 K( j% w9 g  t$ n2 P
  473.         mov     ax,es:[di]9 R9 X: _+ k( G/ o$ j6 a  [
  474.         mov     [save_char],ax4 f" H2 ~/ D( D5 f# s
  475.         not     ah: u& c  J0 q; p7 y6 g
  476.         and     ah,7fh" S( \- I. O7 F3 k
  477.         stosw! L3 F* R& E9 x' U* W/ g" R
  478. no_show:
    , ]+ P' v& L% [: q( y
  479.         mov     bl,0aeh
    & w! \  V8 D7 {2 n' e
  480.         call    keyboard_cmd7 h- f( h& L* @
  481. # ~% q! Y! Q& e: R7 w3 n6 x
  482.         mov     al,20h
    % ^/ a& g& U4 {/ T  Q
  483.         out     0a0h,al
    * k8 k% m3 R/ q! S6 W
  484.         out     20h,al* k$ b/ v* z/ j1 b4 t' b( w; {
  485. ( V4 w% b2 W: c5 V
  486.         pop     ds- s( W: M$ B) D- b+ z* }
  487.         pop     es" t' {! g1 k* s  T) f
  488.         pop     si
    / I4 s8 |/ D4 U' D9 E: B5 \; {
  489.         pop     di
    8 @  [& N- G5 `; w
  490.         pop     dx: \; S' c. l" V
  491.         pop     cx& l. `2 U. d5 g" o1 c/ O
  492.         pop     bx
    - e; i" _, U# ?5 l7 F
  493.         pop     ax
    ) ~  m3 E: U2 D8 s
  494.         popf) j) s' Q0 G$ S& ]* F9 M: u: D
  495.         iret
    8 f, g( l. v3 D8 A
  496. & u& u8 Y1 W2 w
  497. first_time      db      1$ U2 z3 _! ^& v4 V9 Q1 ?2 R% i/ m
  498. buttons         db      0
    7 s$ C4 K5 ~9 D  t; W8 ^% D( {6 h8 l2 {2 A
  499. pos_x           dw      0: l! p' l- @, @6 E
  500. pos_y           dw      0! w8 J9 c! Q/ X* |* r* e
  501. sm_flag         dw      0$ T* T3 g% I+ k9 D
  502. save_char       dw      0
    / O6 x; q* i" w( Q. W
  503. x_move          dw      0! k' a: S& K3 h# Q: b2 v% m0 Y1 s
  504. y_move          dw      0* b/ z' m* c! i
  505. x_max           dw      639: ]6 Z( p0 [2 J4 O( n" v" t
  506. x_min           dw      0" N+ {3 J" S8 G% q# x3 c9 h7 B* z
  507. y_max           dw      199
    4 F$ T2 I& }  p
  508. y_min           dw      0
    5 j& _* b/ Y! Y. L& R
  509. user_subroutine dw      0,0; h* C+ A3 w' R8 [1 i
  510. user_mask       dw      0
    - p1 [# j, [3 H# H6 ^  N) X
  511. temp_mask       dw      0& `. k6 V3 p  p$ n% X

  512. : J$ O! O* J. W- {2 ~) |
  513. keyboard_read:2 P) d: Q) f, B2 w. V1 D
  514.         push    cx
    8 j) ]* q. o0 A% h! ^' }* j( o
  515.         push    dx) N# D- ~7 H6 F7 |- w& E
  516.         xor     cx,cx
    9 n7 R1 i& [( E
  517. key_read_loop:- T# k2 @/ T  X+ G5 {
  518.         in      al,64h! f' S7 S4 X( z% |
  519.         jmp     $+2
    9 x/ w9 m8 Z; {# k; r2 ~
  520.         jmp     $+27 d' v! T4 P- r# c
  521.         test    al,1
    3 ?7 Q* g& O0 B+ Q% v
  522.         jnz     key_read_ready
    8 C2 t5 {4 ]0 A2 [# q# b5 N
  523.         loop    key_read_loop0 B7 R! J  {$ e. y7 i; @) X, H
  524.         mov     ah,1
    " m) b5 t2 o) A/ e2 x
  525.         jmp     key_read_exit/ L+ m0 |7 g5 a) V
  526. key_read_ready:
    & L1 j: A$ U7 E$ X3 }3 i
  527.         push    cx$ g. D& Z( H& }$ e- D& e+ O
  528.         mov     cx,32
    : z( }* J2 s' V9 y
  529. key_read_delay:( y* t2 T$ _1 H' e
  530.         jmp     $+2
    8 X# t2 G7 k$ [- |
  531.         jmp     $+2
    4 f  `  g4 t! x8 Q' ^6 |  ~4 L
  532.         loop    key_read_delay
    & n/ Z; i1 o- F1 J+ g% K
  533. # v, d' D$ N- j2 ^
  534.         pop     cx
    4 {2 n. j- Z# S' u. N" A" Z+ j' L$ e
  535. ; n, g/ V$ |; L8 N7 K
  536.         in      al,60h3 R8 `7 e( u9 J7 K8 w
  537.         jmp     $+2
    & ]) I8 ?% k6 Z( H2 Z. E7 w
  538.         jmp     $+2/ t( d, _+ s3 Q0 A
  539.         xor     ah,ah9 q& a3 p+ e6 t/ M2 U/ w
  540. key_read_exit:# G: a& X( l' [) T* z/ e( e
  541.         pop     dx
    " c$ S8 p- i6 |
  542.         pop     cx
    : I( r; D6 }* b) d
  543.         ret
    + S$ N, b, ^( k+ C. \( Y3 g
  544. 5 Y$ k  B2 \$ F( ^% u! b/ J) L
  545. keyboard_write:
    2 {* G, \+ A( J) Q: f
  546.         push    cx3 W" a1 R* R8 v6 c; ]
  547.         push    dx
    : l0 n" l* \% X& T
  548.         mov     dl,al" A- X  L+ z* B2 B# z
  549.         xor     cx,cx
    3 Z$ l5 S2 t+ B# J  a- e* @' R+ o
  550. kbd_wrt_loop1:/ l8 I0 U4 V0 L+ S" ?
  551.         in      al,64h9 o5 n- y' ^2 Y" w
  552.         jmp     $+2
    ! N/ [- j( b, J
  553.         jmp     $+2( r# T( E- b3 r! n/ l3 ?
  554.         test    al,20h
    * Z3 L6 X5 D/ d
  555.         jz      kbd_wrt_ok1
    # J1 B7 Y7 n& {  h

  556. ' }2 W: j# R+ _& I" c  r
  557.         loop    kbd_wrt_loop1# Q( V7 T( U# [3 B' L
  558. 1 z- d/ T* x2 A
  559.         mov     ah,1
    * M% D8 L$ r% G& X
  560.         jmp     kbd_wrt_exit" ]) j* V+ h  i( C: ?5 [+ Y
  561. 8 t3 i0 N! S1 P" j  c- a4 J
  562. kbd_wrt_ok1:
    $ a# x( c& ^; H
  563.         in      al,60h
    ( E7 N+ Q$ \% \2 U9 a: K9 k( F
  564. $ E: [. t- u! j* a
  565.         xor     cx,cx7 B( f6 ?) t9 _, [! t: m) A" u
  566. kbd_wrt_loop:
    " o7 O/ z  b3 j  q1 I! g
  567.         in      al,64h
    # `4 k9 R* [: L3 U( H: z" D% h
  568.         jmp     $+2
    9 R- x7 w7 J- B( Y% ]. O& K0 b
  569.         jmp     $+29 g$ Y& b" s" v
  570.         test    al,2
    3 x! w0 D) G( C! z$ M# a+ Q
  571.         jz      kbd_wrt_ok$ ]0 a  l' g% T% f: [# d9 ?
  572. 0 ?4 n( ], |3 ]. b. F% |
  573.         loop    kbd_wrt_loop/ ^: n# d7 ?7 k% I

  574. * Z9 `4 u/ C5 q8 R/ {
  575.         mov     ah,1+ f! v8 Q" L% s
  576.         jmp     kbd_wrt_exit
    7 q1 _7 s4 w9 r% j$ S

  577. + y# Z$ f) s$ Q) K( i" S
  578. kbd_wrt_ok:0 F4 N# X- p4 y; l; i1 c( X& }
  579.         mov     al,dl" v, _5 Q! ], r% G
  580.         out     60h,al
    , g' V) c. c/ C
  581.         jmp     $+2
    % a1 W9 ^! r: v; x. n
  582.         jmp     $+2
    0 C& u8 L; `, {
  583. . ]9 U4 ]- }. u3 P5 _
  584.         xor     cx,cx
    ! f/ R/ ?2 k9 Q
  585. kbd_wrt_loop3:
    " v6 D) f4 \' I! @+ _: L  o( @
  586.         in      al,64h/ ~' W. b: i5 S, x. d: {! P
  587.         jmp     $+26 e- ?4 f3 `& ~% _6 T! _9 `# [
  588.         jmp     $+2
    3 u$ Y2 p  H8 G( ]
  589.         test    al,2$ w+ ~1 e0 H: _
  590.         jz      kbd_wrt_ok3
    $ c: f: v# W2 _  L  F
  591. + I" P) b. |7 z' j
  592.         loop    kbd_wrt_loop3
    " U# d; R) Z3 @

  593. 7 L6 b2 m, \+ f: F* [' L
  594.         mov     ah,1! g& N5 I4 _3 i; d: p$ S
  595.         jmp     kbd_wrt_exit4 D/ v* J9 N7 M% z: L' O2 O
  596. ! c8 f5 u; m) N. F
  597. kbd_wrt_ok3:
    . D0 K6 p  l$ g2 R2 Q( n7 L
  598.         mov     ah,8* R$ H% I+ K5 s6 k8 z* j
  599. kbd_wrt_loop4:  c, i# h6 K' m0 ?) |7 I3 H+ K
  600.         xor     cx,cx
    1 v1 b) W, r- H- R2 q* c) r) z
  601. kbd_wrt_loop5:
    ) o4 G( S. g3 v5 s  n( s$ t4 N/ S
  602.         in      al,64h
    * b) u% a8 \/ Q0 J
  603.         jmp     $+2* Z/ k5 B  s* n+ h+ R5 J! Z
  604.         jmp     $+2' i! V+ d- ^/ z1 c6 j" E
  605.         test    al,1# @- y0 C# |/ c! Y
  606.         jnz     kbd_wrt_ok46 @  P  p4 l, d8 ?5 m

  607. 8 a& }) ^# z6 x! b
  608.         loop    kbd_wrt_loop5
    ; P" _1 R6 B$ s! \  Z) x
  609. ' R) S/ T! ~+ u/ p; ^; f, o% y
  610.         dec     ah
    7 t: {/ J  c$ ~( @( ]1 D
  611.         jnz     kbd_wrt_loop4# Z8 r. u" l2 c% r2 ]
  612. . p9 N( L( h- K' z. H% V  a
  613. kbd_wrt_ok4:
    - |8 o4 O- L; J3 }/ ?! T( o! v
  614.         xor     ah,ah
    7 Y; w' t# n3 p# C" m
  615. kbd_wrt_exit:8 r/ [4 ~% K) J; j6 [+ X
  616.         pop     dx
    9 V( L  Z3 t1 T0 k: D8 A
  617.         pop     cx
    & G( S6 ~% B% t9 p) N. }0 q# n
  618.         ret
    + w* T8 h" p7 Z  X* Z' W
  619.         " l* P/ P- s7 r' g! Q
  620. keyboard_cmd:9 o. ^& o& n# W! D3 I# j) j
  621.         xor     cx,cx& |, i3 P1 G5 b% }+ a! ]3 c, F
  622. cmd_wait:* X4 y& D7 s$ }' O  j; E
  623.         in      al,64h
    ; w+ x* C4 n% u, K* q0 @3 z
  624.         jmp     $+2( B! ]! q4 x- V+ z/ ^5 U4 ?
  625.         jmp     $+2
    ) t& B6 K: ]! }& ]
  626.         test    al,2) W# v) H% t. g
  627.         jz      cmd_send/ F% _( K0 d$ e; U. t5 y4 }
  628.         loop    cmd_wait; s$ j) l) d, P& C" N6 \
  629. ! {$ E6 q' t! D! F" m. V
  630.         jmp     cmd_error
    " p: X6 A; B8 |$ e6 V

  631. 1 T& `$ u/ h5 M  x, I
  632. cmd_send:
    : Z& \' U2 G. `
  633.         mov     al,bl
    7 ?7 d- x  h0 H3 @7 A% J
  634.         out     64h,al
    3 V/ `* |: k) X/ Q0 S3 z/ M0 W
  635.         jmp     $+22 s5 N# q) b1 {& W
  636.         jmp     $+2& d) `& n' I* _! K

  637. $ M7 f" k2 M, u& f* W7 B
  638.         xor     cx,cx
    + p2 F' |! S( O1 m$ b
  639. cmd_accept:
    ; J8 k& A+ `; K- i( [& ^
  640.         in      al,64h
    $ p  Z# f+ k) z% L* \2 ]2 n
  641.         jmp     $+27 y7 K6 j+ Y7 Z: c0 p
  642.         jmp     $+2
    ! D+ u" @3 k' u/ E0 n2 Q2 \; ~
  643.         test    al,2' s6 W9 Y- X3 B; ?# g
  644.         jz      cmd_ok
    1 F$ @0 r% e% _
  645.         loop    cmd_accept
    * R# B6 X0 t* k6 H: a: O0 J
  646. $ P! d( p( y' a; O1 j
  647. cmd_error:
    6 ~3 \! P6 C9 s- T
  648.         mov     ah,1  V5 {, [& m& r3 }& c
  649.         jmp     cmd_exit- \- v$ C) |% k  N
  650. cmd_ok:- l9 l" i% r! W5 V, w8 o# J9 t, e
  651.         xor     ah,ah3 w+ e8 w& M- u! y0 Q' L9 h) K
  652. cmd_exit:
    0 X  Q9 c2 c, H' ~5 E& I+ Z
  653.         ret# w8 j- {) ?( I# o

  654. ' n0 }2 k* k9 V
  655. new_33:
    2 X* U8 `- o" P0 M. ]% E- H
  656.         cli
    2 M2 a# y9 @) G) l& C* h- C, J
  657.         cmp     al,0
    0 r- D& @" D" e' e/ f
  658.         je      reset_mouse
    ' D4 H+ O% k7 Q" N3 I
  659.         cmp     al,1
    , }) q; \7 x5 o8 F
  660.         je      show_mouse
    4 C" g% n+ b6 X# ?4 z5 d
  661.         cmp     al,2
    ! B, x( [$ @- j7 H* v* l$ j* r& x
  662.         je      hide_mouse
    ( a6 f7 F9 W1 g* M9 C* h
  663.         cmp     al,3) e3 b+ Z' G6 l0 F$ }7 F) {) n$ ^6 F1 ~
  664.         je      get_pos" R) h* S+ ^, G$ B* N: j4 {
  665.         cmp     al,4  I2 A& T% ?  Q/ Z  t
  666.         je      set_pos
    1 w: Z! b1 A7 h( i- P( e
  667.         cmp     al,71 n  |/ r0 o* D/ r, D
  668.         je      set_hor_pos
    5 @; I1 }: t: G0 t' I; ?
  669.         cmp     al,8% q# X) k' B- X
  670.         je      set_ver_pos, d& S$ K6 ], Y, h; b
  671.         cmp     al,0bh
    4 P' E) f  x: I% Z! K% W; A
  672.         je      get_mouse_movement
    : e, G! w% k" q2 x( q
  673.         cmp     al,0ch
    ' f) v* W7 V/ G: L0 u
  674.         je      set_subroutines  \3 F2 c, R' N1 c
  675.         cmp     al,14h
    # J$ d  ~. V) M' {! c8 E* t, a: v
  676.         je      swap_subroutines
    $ a3 |$ |' ?6 Q
  677.         iret
    * w* k4 n: z2 e8 \/ t1 t
  678. $ a. @  Z6 M7 M. Y& s$ y
  679. reset_mouse:
    - }+ o6 Z: D8 i9 A
  680.         jmp     _reset_mouse3 e, }: ]+ [4 Q( a
  681. show_mouse:
    3 n8 r( Y; m+ V; g0 D# q
  682.         jmp     _show_mouse" b) H9 {# ^0 `! }! \; V, @! q
  683. hide_mouse:
    : x& _* G" T" u* Q5 p3 f% S) L6 w
  684.         jmp     _hide_mouse: \$ F5 D, h0 J, u
  685. get_pos:6 N, Y1 {. s0 v9 n5 e1 q
  686.         jmp     _get_pos
    , r8 J* }; G0 r  a5 `
  687. set_pos:
    5 V: g1 z2 X7 ?4 k- `
  688.         jmp     _set_pos3 t' Z' S( x" K- _. c9 }
  689. set_hor_pos:
    3 B6 X4 |8 `  s
  690.         jmp     _set_hor_pos" \2 E" d4 _& t$ u/ S
  691. set_ver_pos:) }8 W5 W9 m  Z
  692.         jmp     _set_ver_pos7 B) u) T- Y2 \0 W) H0 r7 C
  693. get_mouse_movement:# K" }. |# k! K5 g! r/ J0 U& c
  694.         jmp     _get_mouse_movement4 Z3 Z: z0 S5 n' g0 d) Q
  695. set_subroutines:& R3 e; a/ y, n! U4 G0 o( T
  696.         jmp     _set_subroutines! c- u( b8 V/ z6 p
  697. swap_subroutines:
    . D- e& B) c& K; j# Z" j
  698.         jmp     _swap_subroutines
    + D0 {$ X# h8 k' f# D0 f" c

  699. , `6 j' ^* n7 G; Y/ r9 u
  700. _reset_mouse:" }! [; J9 [' r9 u- U$ u: y
  701.         mov     byte ptr cs:[buttons],0
    # A7 ?2 k: e% K$ d
  702.         mov     word ptr cs:[pos_x],0
    4 {6 D+ S( N: p2 W! n  A
  703.         mov     word ptr cs:[pos_y],0" _7 R( B7 D0 _5 R! D1 J1 f" H' R: T' a$ V
  704.         mov     word ptr cs:[x_move],0
    5 y# Y" J2 H* Q& Z
  705.         mov     word ptr cs:[y_move],0
    : q, O+ n7 d  |! o8 a: i
  706.         mov     word ptr cs:[x_max],6398 k/ T; N* G7 [* j! D( G% @% e
  707.         mov     word ptr cs:[x_min],0
    . P+ X* Z4 F! n) L# U% K3 l$ Z, I! a
  708.         mov     word ptr cs:[y_max],199
    0 _* x4 R2 Z' q9 O( R2 n
  709.         mov     word ptr cs:[y_min],0
    , t, Y: b! X3 x) u9 P  i
  710.         mov     word ptr cs:[user_mask],0; O$ w' [" C2 n1 j" X3 K
  711.         mov     word ptr cs:[user_subroutine],0- b0 s  z  D3 K; V2 M
  712.         mov     word ptr cs:[user_subroutine+2],0
    % V0 _- J! Q3 r. Y
  713.         mov     ax,0ffffh
    8 l5 ?& K9 S. v
  714.         mov     bx,3
    & z+ ^- s1 Y: S& c; P' U, f7 b8 ~
  715.         iret. g0 `3 c9 Z% n3 b0 O; W2 G

  716. - w5 s2 F( C3 d- ~
  717. _get_pos:
    * G, H2 I# ^, I# h7 V$ @
  718.         mov     cx,cs:[pos_x]
    6 m) s# k# _+ e( j
  719.         mov     dx,cs:[pos_y]
    & P9 m2 I3 M; x( U
  720.         mov     bx,word ptr cs:[buttons]
    9 G9 y4 j  e& p6 ]1 g3 J6 z& k4 _) N, d9 ]
  721.         xor     bh,bh
    ) P$ O6 i. r& {; v
  722.         iret1 l' X8 |' b) o$ }

  723. , D* F9 t1 I4 d2 @" b0 W; }4 h
  724. _get_mouse_movement:! ^" c# q9 U: [1 Z( c, ?
  725.         mov     cx,cs:[x_move]" q0 ?* W# i! ^0 {; p3 S
  726.         mov     dx,cs:[y_move]
    * n8 W- R8 D. z0 K, i, g/ X. A
  727.         mov     word ptr cs:[x_move],0
    ' K- |. U7 q) _5 h1 \- ?
  728.         mov     word ptr cs:[y_move],0
    ) D7 B; S0 w0 t, |$ r
  729.         iret
      x' V4 i2 e+ V( |  X2 p
  730. 9 Z" A1 `8 q8 E1 ^! T
  731. _show_mouse:
    " d' J# H: O' @( w6 i! x
  732.         push    ax2 l4 d  ~: q, [  e( `" P2 l& [5 v% a
  733.         push    bx
    $ U$ G$ c: R7 K$ _  p3 p
  734.         push    di
    . a+ [: t2 Z& j) Q8 x7 q9 }
  735.         push    es
    ; K( L2 y& d, e
  736.         mov     byte ptr cs:[sm_flag],1
    8 W  g# n- Z+ `6 Y8 {( b7 j/ t; v
  737.         mov     ax,cs:[pos_y]
    ) `8 Y; ^. g# P, x& O* `
  738.         shr     ax,3. q# j$ m; R& d
  739.         mov     bl,80" l; X* L  G- Z# K8 M
  740.         mul     bl
    " s  b  \7 l4 s2 o2 x+ o3 q& K2 O
  741.         mov     bx,[pos_x]
    0 [) p& d7 }4 V) T- C: b6 ^) ^
  742.         shr     bx,3( c0 X! F' L: }$ B9 E
  743.         add     ax,bx
    ' s* p7 ^; W3 u* i: j, I
  744.         shl     ax,19 D  J4 K7 k4 x4 _5 ?8 ?. u
  745.         mov     di,ax
    2 \: H2 u. s4 S' N4 Q( T& i
  746.         mov     ax,0b800h
    9 J) u* W' u. z* o
  747.         mov     es,ax5 o" \' }+ v) X8 z! F+ F+ w/ u
  748.         mov     ax,es:[di]0 X1 G& O# M3 Y' O7 d& }3 ~8 j4 |
  749.         mov     cs:[save_char],ax
    9 J0 t* F! Q1 d1 y
  750.         not     ah3 q, P* O' e/ J! W* u* r( V
  751.         and     ah,7fh
    ( K2 J/ J) c/ p3 X! f9 u
  752.         mov     es:[di],ax
    & m0 M/ c% n# r1 U8 z6 O& v
  753.         pop     es4 Z" |8 I3 V; h% s2 y; [' ?% r& }: s
  754.         pop     di1 b/ k7 M& G1 q& j
  755.         pop     bx- H# J) }+ r$ w& A5 I- p6 ~5 o% m
  756.         pop     ax+ I4 y0 }& L, O
  757.         iret
    % j  K, C' G% Q

  758. ( K' m4 s8 |8 d: e
  759. _hide_mouse:
    % {1 r; d! j" k- h/ }
  760.         push    ax5 _: ]/ G& |9 T5 P' H& f) R
  761.         push    bx4 h- Y5 O0 F$ o' B
  762.         push    di
    1 ~  }) o( T; J. z% j
  763.         push    es
    # r% y% L$ x- H; m: v: j0 k  o
  764.         mov     byte ptr cs:[sm_flag],0
    2 n8 I; I4 P7 K) o
  765.         mov     ax,cs:[pos_y]! @" U" R$ Y: Y/ R9 U4 D
  766.         shr     ax,3
    " t  B: _& L6 P. w' k, o  Y, R
  767.         mov     bl,80
    1 {$ u3 k1 H3 J
  768.         mul     bl
    7 W5 J8 ~7 Z( V8 ]
  769.         mov     bx,[pos_x]8 y# a/ R( X9 e
  770.         shr     bx,3/ I- |# y/ B0 n/ L0 U
  771.         add     ax,bx4 k5 K8 I9 U; H. i2 k( q2 H; A
  772.         shl     ax,1& |& d+ P  h, F7 R2 s/ j9 }
  773.         mov     di,ax
    1 I- e; o. H; d
  774.         mov     ax,0b800h: Q( n6 U: k! n$ e
  775.         mov     es,ax4 `, Z  H2 Z% h$ D9 |
  776.         mov     ax,cs:[save_char]
    7 r! v4 u$ T) Q( G# M1 K
  777.         mov     es:[di],ax
    1 \/ ~  m. n" p6 K6 q8 F0 f: ]- a
  778.         pop     es
    " F! I9 ~( O( a* h# h/ a
  779.         pop     di
    : d: @% L8 R( L# C- ^6 O3 Z' S
  780.         pop     bx- L3 ^% a+ c; ?. o( F( E  t( S
  781.         pop     ax5 T) K# ?: D7 T+ O# n, w, V9 [" \
  782.         iret
    : u! [# F; {+ s; s: a0 y

  783. ( W" H5 A, g( r; F
  784. _set_pos:7 j% i  f! V# K
  785.         mov     cx,cs:[pos_x]
    0 g. E6 I% u, S9 L
  786.         mov     dx,cs:[pos_y]5 o/ h8 u9 f# [1 |
  787.         mov     word ptr cs:[x_move],0
    ; ~" b+ e: z& i+ Z/ Z
  788.         mov     word ptr cs:[y_move],0
    / w: t5 J6 y8 m
  789.         iret; {8 P/ r6 X/ G/ \1 V  {
  790. ' j! F4 i- y& o& `. X5 ^$ _, {  B
  791. _set_hor_pos:- q0 A8 F$ x, ^5 y: _# M
  792.         call    max_min
    " ^; v1 t# l+ y) C; u
  793.         mov     cs:[x_min],cx9 l& Y9 P/ H. J+ X! H5 Y
  794.         mov     cs:[x_max],dx
    ; s% z' G! R. i+ V
  795.         cmp     cs:[pos_x],cx
    5 F* U5 O, Z9 I  D  n6 u
  796.         jge     good_hor_min
    # C1 B: F4 A6 u- \, v3 q5 N( c# \
  797.         mov     cs:[pos_x],cx
    ( L3 K. @4 v( c
  798. good_hor_min:- \" e' ]5 a9 V# y- t- |% v! B
  799.         cmp     cs:[pos_x],dx! `8 A/ o) h. H! I. Z& P5 f
  800.         jle     good_hor_max0 [$ C, i- f7 w' n$ y/ Q0 H+ A
  801.         mov     cs:[pos_x],dx
    8 R1 ]. X+ Y3 A* V7 ~- ?
  802. good_hor_max:
    " e2 `! r+ Y7 S7 Y2 N& V' z
  803.        iret
    1 y1 O) |" G/ G2 Z
  804.   F. K( T9 P; i. Y1 q7 `  ?& I
  805. _set_ver_pos:
    $ T8 b' \6 F; ~! ~) j9 }. E
  806.         call    max_min, L' U  R- G& b( k4 D/ A- g/ a; `
  807.         mov     cs:[y_min],cx7 M8 T$ H7 _' v
  808.         mov     cs:[y_max],dx
    % m6 J5 P! F% t' P! L- X
  809.         cmp     cs:[pos_y],cx* s! @' l! k# M, K/ Q$ A. o1 j* K
  810.         jge     good_ver_min4 T! F4 B( A: L6 j, ]. \2 I$ m
  811.         mov     cs:[pos_y],cx
    * r, P4 v! \* r/ y& |2 @+ v& }0 x
  812. good_ver_min:, c" p+ D, o4 z5 l6 }
  813.         cmp     cs:[pos_y],dx
    ) O* @& ?: A* @. `( i2 W
  814.         jle     good_ver_max: t. x+ N9 a. @0 q3 b' X
  815.         mov     cs:[pos_y],dx- \+ D7 s4 P9 v6 P
  816. good_ver_max:' l, D+ n: O0 X9 B4 a3 A
  817.         iret8 I; L9 F# u! i( ~1 e# b: j$ Z
  818. & U: N8 P4 M) o; b+ P
  819. max_min:. W# |: G( u* \
  820.         cmp     cx,dx
    " P. m% o: ^3 r
  821.         jle     no_swap' V6 j( Q9 \& z" V8 c  ?
  822.         xchg    cx,dx
    3 w4 m* P9 w* d6 f% V4 B
  823. no_swap:
    - ]& X7 C" x" I( Z6 V" K
  824.         ret3 Q' U4 D1 I( r! y: j
  825. . J2 m  d* M) M
  826. _set_subroutines:
    : K) _2 O% z' ~( K- Y6 z: n
  827.         mov     cs:[user_subroutine],dx
    : p6 l7 J# G" C% W+ I2 C% Y: T- s& A
  828.         mov     cs:[user_subroutine+2],es0 j8 d: m) a$ j  h8 b7 y% F
  829.         mov     cs:[user_mask],cx
    8 D0 }7 q9 ~+ ]3 _( y. F
  830.         iret5 h8 U. F; F7 f$ a  F9 X
  831. / ]7 N, y3 _' d) m" y7 q
  832. _swap_subroutines:$ j$ q+ h+ e% d; S
  833.         push    word ptr cs:[user_mask]* F5 q  t# v) w5 N, \
  834.         push    word ptr cs:[user_subroutine+2]
    % |+ u7 H2 V. b! @9 ?, ]5 q
  835.         push    word ptr cs:[user_subroutine]* |9 h6 Y& S' H5 u
  836.         mov     cs:[user_subroutine],dx, b3 z& Z% f9 k, ^  Y
  837.         mov     cs:[user_subroutine+2],es' T, X9 w; n: V0 k0 N
  838.         mov     cs:[user_mask],cx2 \$ T# q( |% U
  839.         pop     dx
    5 c3 z! ~. p5 J$ b+ [
  840.         pop     es
    + E/ m) Q/ Z/ B8 P' k
  841.         pop     cx
    $ D& b; I( o: x- H4 z
  842.         iret# f6 k, C7 K( d5 I
  843. ( J- v9 [4 t, ?9 {+ W) |( M
  844. memmouse        endp( ^# t2 L1 n1 Y/ J
  845. ; @9 z7 w6 n/ K% z) [
  846. endof_start:# d$ N& R  m. i3 P" f

  847. 8 x5 |4 }' e+ C5 z8 n
  848. emsg db 'No mouse driver install error!$'. w, ~2 S* j' ^0 d- q% O1 M3 U
  849. old331 dw 0# E8 Q. r7 e/ h; e2 R, t5 O
  850. old332 dw 0. ~( I% v6 K' ^5 U" X
  851. old741 dw 0
    3 |0 A7 M, M" ]- F: L1 H1 ~1 s
  852. old742 dw 07 A) l/ |9 s1 ^9 `+ ^
  853. memcopy db 0
    % \' j7 `/ C6 u
  854. okcheck db 04 B# P2 ]- T3 L& p* P
  855. pass db 0( P1 D* K5 B' I( i- |3 }4 f
  856. chkl db 01 D: n7 i9 z9 q1 K* x/ ^
  857. lk db 0
    ; {) \4 E6 @0 c# n" D  k# b  i
  858. chkr db 0- E% `( c/ [8 J2 O4 g
  859. rk db 0
    # s: w: `& M3 S; j- J( C
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    $ W. U( U7 k2 E( F: \" ]! V
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    7 b% D4 m9 `/ P9 y, |+ Q  E) r
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '' H& g" j+ @" _' b4 _, x4 n
  863. db '                                                                                '" @7 _; C; [  \8 k0 V- f) D" i
  864. db '                                赏屯屯簧屯屯突                                  '
    " o+ N" ^8 g# A1 d. r0 b: ?
  865.         db      '                                ?OFF汉OFF?                                 '& V( E$ e# [% x) ]/ A6 F
  866. db      '                                韧屯屯既屯屯图                                  '
    , K) _# U# U1 L( @
  867. db '                                                                                ') I# l) o5 g2 o; V3 H6 R
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '. e3 `0 x# h+ b# f
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    1 F4 _7 ]' ~2 R) R6 _0 ~5 _* B
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '2 L; @/ m- D9 b4 E" U

  871. % U- w' f, v7 i
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!: d: ?& d4 F. m9 W3 q5 c- U
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
: f% B- D: j: X; Z: Y
5 e6 U2 p# O; l4 w谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:46 , Processed in 0.175618 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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