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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
1 U3 j8 S2 n% c1 d7 f: s1 ^4 R, C( T& j
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    . ]# [2 q3 o8 e- z1 S; P6 z
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9" e! t- X2 @7 ?% B2 N5 a; Y/ y
  3. ;                                         By Bini.Yi 易祝兵- v, s3 Q, j; m. ?( K3 Q
  4. ;                                         http://www.ufoit.com 计匠网
    7 R7 n  [) `) i
  5. ;                                         2002/04/06 YYYY/MM/DD
    5 H3 _! w9 O, r% G
  6. ;$ n: @# K9 E, h6 a, G
  7. ;         
    4 n: ?3 g& G3 C% j! x6 R3 b
  8. ;          This program  test the mouse button  click and move.3 H" p' O' y, ^  q. T2 F
  9. ;4 [" Z5 G6 X$ `. [# \

  10. 9 n+ R& U/ Q7 V& C$ G
  11. .model tiny
    6 e0 u1 D$ W+ A- H9 B: c# R# V3 y
  12. .586
    , b% I: F) l5 F. }' T# L8 M
  13. .code2 F. r* W) l% J, q; l2 B* `, R
  14. .stack  100h0 C. ^0 W3 L2 P
  15. .startup
      o- ]1 f$ Z' Z
  16. pusha9 G7 T  y* N6 {0 a0 {4 X
  17. mov ax, 3533h
    ( `  |5 M) c, O  W% A4 B& @& R
  18. int 21h
    : \: q( S. w: E* e
  19. mov word ptr cs:[old331],es
    % I: g0 Y7 h% \) Z
  20. mov word ptr cs:[old332],bx
    & a1 Q) @: Y" j- A0 ]# S
  21. mov ax, 3574h0 L! |$ t/ T, b& g3 k
  22. int 21h
    9 R! Z7 d% x, F6 L& [! z
  23. mov word ptr cs:[old741],es0 ]( O- \' p. F; l3 A
  24. mov word ptr cs:[old742],bx( M4 Q2 Z% S+ k( a
  25. popa
    & z7 y  s9 v0 Q9 ^
  26.         call    memmouse  V7 m( A# v6 o  [
  27.         mov ah, 000 }: i5 y( X( I) ^: T( A, I0 F
  28. mov al, 03
    & B- `. R& \, x) W
  29. int 10h9 t7 E: V% U" S& q6 |+ i1 G5 A
  30. mov ah, 06
    " n( _$ }! S) i' v5 u4 G5 G- I( T2 \
  31. mov al, 0
    0 f4 a* ~$ f6 L5 e. h0 [
  32. mov cx, 04 i5 x7 P# B0 D9 j' X* m
  33. mov dh, 24
    . q; q$ r! M0 l1 [, A. i
  34. mov dl, 79% |4 a' \3 x, U0 `
  35. mov bh, 07h
    + {" A/ c! f+ J& J- h9 i
  36. int 10h
    0 Z, O5 u9 E# T
  37. mov ax, 0000
    5 X: Y( F6 f0 X4 h2 ]0 ^# I
  38. mov bx, 0002$ V/ H* e: D. W2 k+ P6 U% H
  39. int 33h
    8 }, O0 s2 Y& F7 f2 d
  40.         cmp     ax, 0000           ;if no mouse drive install3 x4 E; ?' r9 R7 {2 e
  41.         je      errormsg           ;show error MSG
    ; K# f' p- Y' k7 z2 U: b" h
  42. mov ah, 02
    ( R0 C3 u7 B1 b3 u+ r. q# @+ Q  \
  43. mov bh, 004 m& G3 ~, f4 r8 n
  44.         mov     dh, 25             ;Move point out screen
    ! u# A. _% o) k; f' [8 k
  45. mov dl, 79
    ) p5 H+ i% }3 m) A
  46. int 10h( A$ M/ _4 N, E2 h2 _3 N. b. [
  47.         call    showmsg            ;Show info
    - Y  |" S5 ]* k& ]
  48. mov ax, 0001) ?' m) m, D# P5 p# w2 Z% n; v
  49. int 33h" |- O' i# {$ B; T/ s0 I$ k4 Z
  50. ; mov ax, 000ah) k4 Z, o) i5 P9 y* I1 [' z
  51. ; mov bx, 0000
    ! N% Q% U5 `+ k7 S) ~1 u% r
  52. ; mov cl, 0h/ Y# S  _4 b2 g1 N* H/ @
  53. ; mov ch, 0F0h1 z. Z. u+ g' u( ^+ g8 A1 }9 d
  54. ; mov dl, 0h
    8 v  l3 ]# c9 D) W" n% x- X$ v' W
  55. ; mov dh, 0F0h
    * y6 T6 J0 }3 C( w. \' O0 d
  56. ; int 33h
    * V+ C2 V% `" e
  57. mov ax, 0004h
    : `6 f! Y2 q0 }1 `% K2 j6 m" D
  58. mov cx, 0319& u8 e8 [) T$ e- M0 g/ ^
  59. mov dx, 0103
    2 ^5 C: f7 J& D! `" \! r! \
  60. int 33h
    4 B4 i  H9 }2 d3 V6 D; n3 \, m) v
  61. casemo:                           ;Case button click and point move * Y3 b$ C7 n* @. w* M
  62.         mov     ax, 000bh         ;and keyboard press$ w0 s7 \& M' U( X9 c; B+ [
  63. int 33h6 d, I; B5 Y* l" X' q' P( a
  64.         cmp     cx, 00h           ;if point move....X
    3 Z" r6 a1 g) R! w, }: y& ~% p
  65. jne xmov
    " h. P- O2 y4 |' ?
  66.         cmp     dx, 00h           ;if point move....Y2 b5 I7 t1 X* ~" O% R
  67. jne ymov
    % g' b% @: O/ m+ Q: |+ X
  68. xymovend:                         ;X.Y move end  J# u: v# u( q
  69.         mov     ax, 0003          , x8 f. y% |$ x$ u
  70. int 33h
    1 l( M& x& h0 q, A6 J% q9 b
  71.         cmp     bx, 0001          ;if left button click  show ON
    * r- L. Q$ {' s: }
  72. mov si, 1828
    * C: g, U% c3 U( k' B* \: V( O
  73. je listl# U; |" k& z5 L( u( D. ]: {0 ]
  74. mov si, 1828
    # n$ Z2 E; k  Q7 h8 S! M  Q
  75.         jne     nlistl            ;if left no click show OFF6 h1 l4 S3 _4 @, z
  76. testr:
    0 B5 X1 m' G& b6 {& x
  77.         cmp     bx, 0002          ;if right button click show ON
    7 f) N( t* [: V% R+ y% u6 ^
  78. mov si,1842
    2 e7 V7 f  U' y8 d0 i7 V
  79. je listr$ J, q* ?2 F0 w5 E1 g0 {/ U
  80.         mov     si,1842           ;if right no click show OFF
    : e+ s' B1 L$ ~4 |
  81. jne nlistl
    $ `% F+ p1 B7 {% ?) y
  82. casekey:
    4 W0 s$ I' h' Y7 }; U4 M, ]
  83.         mov     ah, 01            ;if any key press jump check# G, ?9 F0 T/ x9 w
  84. int 16h/ K4 X" P; y; [4 \" o9 J
  85. jne kpress
    1 m" g. m% o; U
  86.         mov     al, [chkl]        ;check x flag
    " \% B- B! d5 V9 R# U
  87. cmp al, 02h
    2 F5 v1 T4 ?; [6 K9 j8 o# _
  88. jnb chkok; R4 _; _1 L/ ~+ u+ S6 R$ P* T
  89. jmp casemo; |% a& y( [& q" G  E
  90. xmov:                             ;if X moved, get the X flag+1
    + D; l. ]4 [/ I1 e0 P
  91. mov al, [chkl]
    0 }) R& e9 U; {% t! L! G
  92. inc al
      u8 B3 G' }7 [) W
  93. mov [chkl], al
    . g2 L  ^/ |8 i( p" R
  94. call passok, s  V( L$ p7 }- I+ F) Y
  95. jmp xymovend6 [/ D5 a" Y. g3 r
  96. ymov:                             ;if Y moved, get the X flag+1) k: f  _  |. Q& @. C
  97. mov al, [chkr]4 R( K& o8 K4 u7 x2 s( ~7 T
  98. inc al
    6 w; D1 u4 L+ T$ v  \9 G' Z" |
  99. mov [chkr], al6 }' \, E7 U7 A6 n6 w9 E
  100. call passok; w. J+ s! Y1 N1 M# C) t( D  B
  101. jmp xymovend* r6 E8 y# c' W& B

  102. % M# S8 w' ~0 Q! t% ]* ~
  103. passok proc near
    1 J, r; x5 n/ i2 t( p
  104. mov al, [okcheck]3 j, X  g6 m+ v- @
  105. cmp al, 1
    2 A3 U" E5 S( F6 D  H) C' ]4 }; ]
  106. je let0# m) G6 T9 D9 C6 {+ ]1 W- [3 O* d
  107. jmp passret
    2 B, K0 Y  D, K& f6 R7 q: `: O
  108. let0:
    ; c' F# K9 [! p
  109. mov [pass], 1
    # y6 o) A- T* U; O, V4 s" Y
  110. passret:
    8 k0 x, R9 B$ o( W
  111. ret/ _4 u: N5 r: }+ v9 t: `  [1 p1 D
  112. passok endp # P- ]  K, o! j) C

  113. : Z5 ?. Z7 ]/ M3 K! L4 R; R
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
      x1 Y& ^* ?4 H" _
  115. mov al, [chkr]0 C! x% z- W. w: n4 P% o
  116. cmp al, 02h) `9 d9 w2 f+ N4 y
  117. jb casemo
    9 J3 R7 `9 v: Q5 G
  118. mov al, [lk]7 c. W% E( o! }3 r* H
  119. cmp al, 14 v' Q$ v& K) }
  120. jne casemo
    . |0 f/ e9 Q/ W7 m2 D  N
  121. mov al, [rk]
    3 s6 h4 u  @# S& I9 G; \
  122. cmp al, 1' g8 b* X* {1 I& Y% @. F( G
  123. jne  casemo9 `. C2 B+ d# p1 I. F9 @) F1 E
  124. mov [okcheck], 1
    - t( Y. X' G+ W% y3 @+ Q0 Q
  125. mov al, [pass]: R5 p5 n  y% ]; w0 ]1 G2 [, |
  126. cmp al, 1
    , }! j, C0 [; K
  127. jne  casemo7 U7 m2 E) E- q  t
  128. mov ax,0002h
    & W! N. B% s+ c
  129. int 33h
    % n4 |* B: U5 K, y7 ^( W
  130. call cleascr. U( r% y5 I; f- q2 o* X: Y

  131. * [: h9 Z8 Y, s' q1 ^
  132. call oldint6 m$ k) u  m- A# y9 p: }
  133. mov ax, 04c00h
    & G7 V" ]) E$ X& K
  134. int 21h: Z$ {# q3 o' `' u  `' `

  135. * u' v4 T1 y  Q- ]
  136. okexit:2 S9 h) A/ m$ E7 _  r* r, }- i
  137. mov ah, 4ch
    : H4 C* V4 s% u0 @
  138. mov al, 07 C/ U: I; b! S
  139. int 21h
    3 m$ {8 d* Q0 E2 v) `* P& B  k
  140. listl:                                 ;Show ON2 L; d0 Z7 K3 y# h4 b
  141. pusha7 r" ~: u. k) ^% ^
  142. mov ax, 0b800h: h1 ]6 k9 r( z- X( i9 I
  143. mov  es, ax8 p3 `  B1 [4 A+ B1 q
  144. mov ah, 47h
    + m% Y& s  K0 u
  145. mov al, 20h
    % R' `4 s  f. R# x' K# J
  146. mov es:[si], ax
    % X$ p  F' o) \+ G9 x7 r
  147. add si, 02  @# l9 V8 q2 o
  148. mov  al, 4fh/ A5 C: P9 h4 J" ]. b+ O
  149. mov es:[si], ax1 B8 x3 T/ X) E. C6 l
  150. mov al, 4eh
    # `- Y$ B& A6 n7 ^. ]
  151. add si, 02% g% J! i0 o) L( x: i
  152. mov es:[si], ax
    / y' [4 T: q4 \8 v, r$ D) v" |6 `  L
  153. mov [lk], 1" g, x9 M0 c* C
  154. popa
    # ]- g$ {7 _( f3 o' x( E8 q
  155. jmp testr
    2 B0 G9 P, l' {" i- W. x. A
  156. listr:                                 ;Show ON
    4 c* i4 P8 Y/ a# L* G
  157. pusha
    . v$ b' |2 T2 a5 T. s7 i5 j
  158. mov ax, 0b800h
    " y$ X2 ]# o- Z
  159. mov  es, ax" h, {/ y+ N8 H7 U: R6 K
  160. mov ah, 47h  d) `; P, u3 z: m, j
  161. mov al, 20h( y$ t3 f; k  M2 u1 b5 H
  162. mov es:[si], ax1 O' z$ P. t2 Q4 \& _0 V
  163. add si, 027 E  {  {/ M# L" f% D
  164. mov  al, 4fh& ]3 Q- D- g% j& s- P
  165. mov es:[si], ax) d! }1 o* r$ I" A; \% c/ R- k
  166. mov al, 4eh
    0 C- F2 L/ c" m. \+ D
  167. add si, 02
    9 D+ _$ S, Z7 ~; t& Z1 }3 u% Q( u
  168. mov es:[si], ax: ?/ ], U/ R$ G( v- Y# w# s  J: ?
  169. mov [rk], 1
    * E9 k. m8 s' E3 X! W! C$ T+ A' h
  170. popa9 D5 A% ?( ]7 e
  171. jmp  casekey
    : F4 d) r0 R. Y9 x
  172. 9 a0 H$ j& v/ @: x) L- G
  173. nlistl:                              ;Show OFF
    * d( j! a( ~9 R+ q9 Y
  174. pusha   
    9 u+ L* V5 V& n$ p) K. X" u
  175. mov ax, 0b800h
    8 ~: [! A2 L3 E+ V) C+ p- h: D2 c6 F
  176. mov  es, ax- Z% {2 h$ c4 ~5 O. l/ a2 [
  177. mov ah, 17h0 j' u; I% B, d9 Z; ~) ]' \
  178. mov al, 4fh
      y4 s4 Y4 O! h8 r  S2 V; H
  179. mov es:[si], ax
    % k- t/ q8 l0 @$ h4 r" A7 X
  180. add si, 02- b' K+ d7 t6 p/ Z" B* J
  181. mov  al, 46h- @1 `; ?9 Y/ y
  182. mov es:[si], ax
    2 r- d- G# L, y6 j% \7 V9 j7 J! Y8 w
  183. mov al, 46h* L) ^5 T+ j6 |! `
  184. add si, 02
    & H7 X, F0 O, j' X- ?6 z( v4 r* z
  185. mov es:[si], ax
    ( M. n4 O: E3 v8 l
  186. popa2 J! @( y- i# H' T  q
  187. cmp si, 1840
    , u$ r* M" M: J
  188. jae casekey
    4 O3 u! d* ?5 w- k
  189. jmp testr7 R( }6 \. r: j
  190. ; A/ \  a# K, \7 w9 h7 l# N
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    " x* y: y; s3 k) b8 i, y+ A
  192.         cmp     ah, 01h             ;and return a error
    ' u% \6 O1 d( ]1 w7 ^. |9 B
  193. je exit1
    + y  f; i& [; v  K) S1 D" `
  194.         mov     ah, 0ch             ;if press other key then clear
    & g, ~% n$ S3 a
  195.         mov     al, 00              ;keyboard buffer
    2 ]9 B" t: F" M: B, Q9 C
  196. int 21h8 b9 I9 ^! I; w
  197. jmp casemo $ P/ W, F# j  \8 S5 B; Y

  198. + I& t7 K+ T4 o+ ~, O
  199. errormsg:                           ;if mouse driver no install
    ' s) c. I: y1 {* V0 b7 [0 c$ k
  200. call oldint8 L# b8 b6 ]5 s5 p+ I& F  q
  201. lea dx, offset emsg" b! r. j) R8 y/ h  ~' B
  202. mov ah, 09h& o  d; y  Z2 r  ^. _
  203. int 21h
    ) y- v  c* ~9 A" Q4 F, F! @
  204. mov ah, 4ch- \5 |. W) Y4 k: P5 G; m: @
  205. mov al, 27 @/ T0 p( a1 B
  206. int  21h
    0 H8 s- c. |. P- B! ^; H1 I2 b

  207. . N* G# W8 n! W0 F9 Z' Z7 T
  208. exit1:                              ;error exit# z8 Y7 a! F8 C$ X: k2 q3 U
  209. mov ax, 0002h
    6 M2 `' \/ X0 Z2 S+ p; `
  210. int 33h
    0 ^! G; i- ]2 H5 ~  C9 R/ _% |' W
  211. call  cleascr
      x+ `- p& J. k8 o
  212. call  oldint5 C3 z: f3 X3 Z
  213. mov ah, 4ch
    ! [4 x- k6 A$ A8 G8 [- w
  214. mov al, 014 T( G. P- ?, U7 P' A
  215. int 21h
    5 l: n" E/ i3 N) d5 _2 U  h3 ^* F
  216. 5 _8 L7 v$ _& u
  217. cleascr proc    near                ;clear screen, k0 j! v$ ~% u/ o+ Y2 @
  218. pusha5 O5 C2 o  a( R: R! N$ R
  219. mov ah, 066 h: d- z2 j) i
  220. mov al, 00 A( }" q. x% Q- U2 `( G6 E
  221. mov cx, 0
    + g" v5 e% B7 S" e9 z3 H, N
  222. mov dh, 24* X8 G3 _1 v9 c( X% _( l
  223. mov dl, 79+ u' a! o0 A1 N- s4 V5 X& _
  224. mov bh, 07h
    + A2 w  c4 }& i3 t! J  v
  225. int 10h
    6 W0 s8 ~# W+ U2 q
  226. mov ah, 02
    + A+ I1 S2 M/ _5 }9 d: n
  227. mov bh, 00
      W* B  L; m! @; A( ]8 E0 _
  228. mov dh, 0
    7 h6 Z& z$ w) m3 x) u; V
  229. mov dl, 02 q" F. H  E4 @; \; F
  230. int 10h
    $ |1 z5 w3 c% D, r3 u, O" |% v. k& C
  231. popa/ J  M6 o" f* i
  232. ret
    % j$ a" v, b$ d6 I
  233. cleascr endp
    7 A2 a: Q8 I9 D
  234. / O7 A* E- V/ [' I6 X. k- l+ b* R
  235. showmsg proc    near               ;Show info# I% G, l8 T, q; t& p
  236. pusha
      L# X# A4 Q& A: w
  237. lea di, offset showms- u$ F' G* @) s2 Q- [! N& {, d
  238. mov ax, 0b800h
    # X, r6 ]& M) Y9 f
  239. mov es, ax
    - o' m1 q. v: y# S! N
  240. mov si, 0; @/ O6 R# _( {$ n
  241. mov cx, 4800 C8 I" L3 x: Y/ s- H3 K
  242. mov ah, 07h8 U3 f2 H% m# d8 c% H/ l0 O- l
  243. @@:
    % h- T/ q1 o/ H( w/ Q: X  y
  244. mov al, 20h
    ) |; [" k4 T1 I! i
  245. mov es:[si], ax, k. ]/ `; o- F6 p) g
  246. add si, 2
    ! E& H+ I' }/ D2 m+ u! u  Z" F2 T7 K
  247. loop @b. d- }1 c* ^7 `) Y  q( P6 A; R
  248. mov cx,880
    ! @5 w' @# m# a& N1 ?5 f/ r
  249. @@:
    4 D0 ?5 ]! H  A% p
  250. mov al, [di]
    ' f' p; u! `; O0 Z6 I5 ?6 V" A6 R9 L
  251. inc di' T( L! A4 d1 ~& R0 O, B
  252. cmp al,20h1 F/ B3 O' C7 I; O. _
  253. je showch19 `7 b# V5 D8 h) K3 f6 @
  254. mov ah, 17h
    7 |! `6 z5 O- J
  255. jmp showch3
    * |- R5 ~8 i# U$ i8 p
  256. showch1:
    / R% d7 F* J; H! X) J; A
  257. mov ah, 07h
    / w% b! h( W0 ?- a# Y
  258. showch3:: M* B, f; j/ W! C7 H
  259. mov es:[si], ax0 z. Q& a4 O% y
  260. add si, 2: `5 M' \" `% |+ y, A! k
  261. loop @b
    6 h6 @7 F7 T. j( C/ q5 M* A% }
  262. popa
    1 y9 [7 P1 O4 y/ R# U
  263. ret: [/ H3 P5 H& V! |* }' C$ N
  264. showmsg endp/ V( s3 @1 g8 P' a, G/ G7 e
  265. * C/ M6 o- l8 Q
  266. oldint proc: a1 ?& W2 H& C$ b
  267. pusha6 a/ H! _1 F% h
  268. mov ds, word ptr cs:[old331]
    ( v( H% ^' W1 \0 o$ Y% B3 D9 x8 }
  269. mov   dx, word ptr cs:[old332]
    - L, w% V2 V% I3 U+ d: a7 H
  270. mov ax, 2533h+ m; H3 e+ W6 h0 c
  271. int 21h% h6 G5 c* r5 M  ]7 M
  272. mov ds, word ptr cs:[old741]
    ( P4 L7 O5 y! I' p. Y3 f2 w
  273. mov dx, word ptr cs:[old742], m. X& }4 s7 b3 \
  274. mov ax, 2574h8 R5 _0 P& l5 w0 z! V' N8 d' B- J
  275. int 21h
    * [, s' C. f! h- J2 L* L6 [. _
  276. popa
    8 t2 u' Z" g$ c
  277. ret
    ' c7 A' |" C( d0 P$ b. V2 I1 t0 W
  278. oldint endp; z: m/ i2 P5 T
  279. 0 [: f0 R0 w4 U; ^9 t
  280. memmouse        proc
    9 y) l3 H5 [% F. Q
  281.         xor     ax,ax
    ) h! y" q2 k/ j- g, N% \
  282. int 33h0 a7 w% _+ k/ M2 L1 {$ K
  283. cmp ax,0ffffh
    / B9 L+ t& o8 b# U2 H
  284.         jne     not_loaded
    6 G* n0 F; s+ h3 B% p9 H, u) e3 ?
  285. mov [memcopy], 1
    ' b( S+ K$ X: n4 X! i1 N
  286. ret' ?4 K& U" {) C/ e* W- _

  287. 1 b1 l6 G6 i% g: k# m
  288. not_loaded:
    ( r. g3 A7 Y6 p- H. E

  289. 4 [* N& t7 j8 f2 l5 m1 H
  290.         mov ax,2574h' d5 Y, P# _& r0 |2 i* x5 `( O
  291.         mov dx,offset new_isr/ K8 j3 @$ B7 N6 _. L8 n5 M
  292.         int 21h6 A4 k' j8 v8 W/ l# D

  293.   J/ r% S: @8 R8 x& w7 _
  294.         mov ax,2533h  T: M' _* z4 L- C# ~* y. ^# j
  295.         mov dx,offset new_33
    & ]3 ^- ?! t  F" Y& V0 T
  296.         int 21h
    2 s& n0 O% |- Q( g: x
  297. 3 S2 h- d+ B) K
  298.         cli2 K9 c( C! {4 ?0 r, |  J
  299. ' w0 N/ B, n: t
  300.         mov bl,0a8h
    % ^6 }% V' ~. V' O+ H
  301.         call keyboard_cmd
    : s2 e% \2 V; `% E( M3 Y5 A

  302. - a. y3 j5 H  ~+ T  k
  303.         mov bl,20h
    3 R$ `- T! U+ i  u% f
  304.         call    keyboard_cmd' S, Y+ [* O7 M. p7 K. |2 s
  305.         call    keyboard_read
    ! N: C8 ?+ K! |7 R8 Q
  306.         or      al,2/ X. o8 s) E( v( T4 r4 X
  307.         mov     bl,60h5 A6 z1 n0 P  M
  308.         push    ax
    $ T1 t7 A1 O% e/ ^5 |
  309.         call    keyboard_cmd) E/ _; b2 i" Z) W) w, b, x, K
  310.         pop     ax" K9 g' J, M$ f" ^7 Q1 ^8 e
  311.         call    keyboard_write. Y, s  U( H" @# {9 _8 U

  312. * T5 a' D8 P/ Q- N+ ?
  313.         mov     bl,0d4h3 q, ?9 c  t3 t2 a( ~
  314.         call    keyboard_cmd- J4 w* b+ E  e5 d0 \# A  P2 z1 o
  315.         mov     al,0f4h/ \8 I" X7 l* u( d/ E, a1 w
  316.         call    keyboard_write
    ( P' ~( a( t5 @, m
  317. 1 P' g; S  A+ w5 W
  318.         sti1 C- |  D% W/ n% W2 C' ~4 O  ^# b
  319.         ret1 ~% E. K- J9 e+ ?
  320. call_user_isr:
    7 \" c0 J0 ^( ^& v
  321. db      60h3 S5 L8 A, Q4 O) ?
  322.         mov     cx,cs:[pos_x]! O0 b/ @3 i& ~$ u& e# s+ ^
  323.         mov     dx,cs:[pos_y]7 d5 m# ~( P; q# P% e' \- w
  324.         mov     di,0 ;cs:[x_move]  e+ q' p/ r  {4 M5 `: j
  325.         mov     si,0 ;cs:[y_move]( X! J( H! `6 U, v
  326.         mov     word ptr cs:[x_move],0
    ! H3 z: ~1 _. ?- E& k
  327.         mov     word ptr cs:[y_move],0. ]' u$ g. W) z8 [3 _# E5 C! t
  328.         mov     bl,byte ptr cs:[buttons]
    # I9 ~8 Y# [3 P1 }
  329.         xor     bh,bh
    3 k/ d6 @/ [7 Q7 S3 m9 v, L: y% f
  330.         call    dword ptr cs:[user_subroutine]
    5 s8 R; b! U7 }" r7 b2 e% T6 s
  331.         db      61h0 s$ V" @. ^- [' M: i/ |
  332. ret0 J" J4 l% c: b4 G
  333. new_isr:( ]9 D/ f! C+ ^
  334.         pushf
    % a* K5 t0 E) T1 f+ l
  335.         cli
    " q" J: j9 E% T$ u2 }
  336.         push    ax* B8 m; `8 d; g, B/ _
  337.         push    bx: d/ ]) W; D: a7 u+ V
  338.         push    cx
    4 c4 ]% [( }$ W$ Q
  339.         push    dx) f. k7 h8 l4 Y, x
  340.         push    di
    : x1 Q6 f8 g9 A- _
  341.         push    si( y' s6 {1 B" e
  342.         push    es. `1 H# `. c1 n! o+ H: i8 N1 r
  343.         push    ds
    0 A3 I7 t; L7 ~1 C" c  A8 m
  344. ! q7 f! C* W) h+ u
  345.         push    cs, j5 \& Y5 W3 a8 O
  346.         pop     ds
    8 e; W! y3 f5 ]6 N
  347. ' Y: `: F- Y; T7 Z- S$ @
  348.         mov     bl,0adh
    $ M8 P, D2 L# c) r
  349.         call    keyboard_cmd1 J* W2 F% ^4 p

  350. , F9 E9 @/ m& o+ A9 g7 G
  351.         cmp     byte ptr [first_time],0% w* S" s: F7 o) k- O" ]1 F
  352.         je      not_first_time7 C5 m; ~" N1 l" Y# M8 }9 a

  353. % W1 k. ^  l1 d! b
  354.         mov     byte ptr [first_time],0
      G1 O0 }$ c- D
  355.         call    keyboard_read4 b2 Q! R3 z! b* X$ F
  356.         call    keyboard_read& G6 E% [3 Z7 q, ]# e4 l
  357.         call    keyboard_read$ U! w  H; @: y  r7 |# L
  358.         jmp     no_show
    & Y/ x; c4 L' x3 ?" W* p/ O7 W, h
  359. 4 u7 A. q! l( M% G6 R
  360. not_first_time:
    " S5 t5 K( |+ o% v$ T% n+ z8 A
  361.         mov     word ptr [temp_mask],0
    6 h3 s0 y) s. a6 P4 w
  362. " j9 }. M8 p0 {! H7 f
  363.         mov     cx,[pos_x]& X4 C! v8 ]" S9 ]" d
  364.         mov     dx,[pos_y]
    ' ]$ p5 Y4 T( h( B' a; N  \' D+ z
  365. & D) N' g# }4 k' g4 `" @- f
  366.         call    keyboard_read  ~- L9 D! C; q6 ~- x- E
  367.         and     al,7 ;3
    ' v1 z0 ?9 s0 E( O1 [4 S, i
  368.         mov     ah,[buttons]8 z/ X! c  ]' [, m4 {: b
  369.         mov     [buttons],al
    ! c$ q: s/ Z" x: T. I1 U
  370.         cmp     al,ah) e2 F8 ]- S& k) o0 Q# C. C
  371.         je      no_button_change0 Y' N% v- ^) k# s3 t: Z& z
  372.         and     al,3
    ) p( V4 v. ^+ Q5 {
  373.         and     ah,3
    " ^, K$ x  K& v9 P5 i/ [6 c  a( g( r
  374.         xor     al,ah
    ( ?+ |* |1 N7 A' J& r0 {
  375.         xor     bx,bx4 m( y( v8 R6 I3 N! a
  376. 4 S2 J: V* [+ j( u+ y1 f( X
  377.         push    ax
    5 V1 G' p- o  ~/ B  R
  378.         test    al,2
    . U+ q# I3 K8 J! e/ d7 h+ Z
  379.         jz      no_right_button_change& d1 S' w4 _2 G! s1 z1 z/ }
  380.         and     ah,2* a. }# n! R6 Z
  381.         jz      right_button_pressed, ^" k9 z4 Y: N: P
  382.         or      bx,166 j! T7 y0 n4 I* m& b5 n0 \
  383.         jmp     no_right_button_change
    6 V: }! c' v9 ~8 r
  384. right_button_pressed:
    , \$ x; G4 U$ m% E/ z  l  B* L
  385.         or      bx,88 {: b; `6 x( \
  386. no_right_button_change:
    : W6 j, p, }# s6 T
  387. / F# L& v( P' R8 _) V6 j# F
  388.         pop     ax$ z3 V5 N# A) ^% E

  389. 1 N8 S$ |. M6 _7 F! N
  390.         test    al,1* u2 e9 P, I6 y9 M, e
  391.         jz      no_left_button_change. {5 m8 ?& ?$ C& d0 G5 t: _7 a
  392.         and     ah,1/ z: P) x! _" `( O; I
  393.         jz      left_button_pressed
    6 e& F+ V, n/ d/ r# W) E
  394.         or      bx,4
    - l5 V9 h/ H& F& S0 _
  395.         jmp     no_left_button_change9 V6 l: k3 f4 ^+ ?7 g5 Z
  396. left_button_pressed:) a0 ]; L1 }# T& g- P* O0 O
  397.         or      bx,2' Y( W! ~) M! y5 Q2 |- E. k
  398. no_left_button_change:  f; X4 b, S, O2 @, Y' P& z9 O
  399. * g' }) O7 ?; D3 ^
  400.         mov     [temp_mask],bx
    9 z2 m4 \4 S8 Y

  401. 1 d9 {; S7 Z( @& e/ m
  402. no_button_change:
    + A, C- y4 _2 f' ?0 @, ~" t
  403.         call    keyboard_read$ Z: R5 d9 X7 N
  404.         cbw
    8 m5 z- z0 Q+ Q% ?- l: K
  405.         add     [pos_x],ax7 W. c& U% g+ e" n" L
  406.         add     [x_move],ax' t8 S) G0 P) G$ o  Q. J: }
  407.         mov     ax,[x_min]
    9 q$ M  x: T/ B: I
  408.         cmp     [pos_x],ax, ^0 H  r7 E5 W3 v
  409.         jg      good_hor1" K4 S, L- o* R, [( p+ o
  410.         mov     [pos_x],ax
    . y( ]( D/ L# o6 n6 ?/ I3 u
  411. good_hor1:
    ' e* D/ z6 O" j8 H
  412.         mov     ax,[x_max]% P; ?0 v! S- H0 Q6 B
  413.         cmp     [pos_x],ax
    0 T! F- r/ N1 n( q+ k: H" [- U7 m! Y
  414.         jle     good_hor2
    ( [: x0 u* @- _' v4 O. m
  415.         mov     [pos_x],ax' M+ N/ g- B9 N4 Q
  416. good_hor2:
    2 O% m: Z3 x; L' w& U, e5 e( z

  417.   t5 [! _" W- g' ]( E  s# i8 B5 U
  418.         call    keyboard_read. {, n$ R- V- Y% W- a8 D2 X
  419.         neg     al
    ! `; R7 @/ v8 J/ f7 c4 k$ b, q8 z
  420.         cbw8 r) m1 u7 `1 B( r! r
  421.         add     [pos_y],ax/ T) P2 r: d1 M  q, W* w) S, U. j
  422.         add     [y_move],ax% g% n, z7 R. E) v: h# S
  423.         mov     ax,[y_min]
    ( b. O! F7 U! l
  424.         cmp     [pos_y],ax, }# F0 t! h3 ^, J0 @( u% [2 ^5 M
  425.         jg      good_ver18 O# f# Q% u& r$ l7 N3 X
  426.         mov     [pos_y],ax; s9 A% e$ J8 |( ]$ L
  427. good_ver1:8 k' d: ~2 Z1 m) F8 ]# M2 X
  428.         mov     ax,[y_max]: p3 d# N; ~8 z6 w
  429.         cmp     [pos_y],ax
    1 y2 T" p0 n. P) `- r
  430.         jle     good_ver2
    $ ?$ n9 l4 K' h# x
  431.         mov     [pos_y],ax% a, u. ?7 ~; k4 j- @* m
  432. good_ver2:! S  b) \. O; {4 \) h1 e/ S% e
  433. 4 a, |( b7 k/ z# ~( E2 W6 W! L
  434.         mov     ax,[x_move]! w0 `: q# E9 l5 G1 Y2 }- B
  435.         or      ax,[y_move], F5 C+ }' P7 t! i
  436.         or      ax,ax  H9 w) z) R) U3 x% u' E3 T# p* P" C
  437.         jz      no_change_position/ t; ]5 m+ u, M
  438.         or      word ptr [temp_mask],1
    7 J$ y. n2 J$ u: T; d# z7 r1 f4 k% @
  439. no_change_position:
      p3 n1 P+ M; d4 J5 y: i
  440. . i- p. c; @9 t# x, ?3 |
  441.         mov     ax,[temp_mask]2 B0 v' }& X  f* c; V! i
  442.         and     ax,[user_mask]; j/ h& ?! \2 ]/ x6 h% S1 M
  443.         jz      no_call_user- s, r) U  U( g. A% W2 K
  444.         call    call_user_isr
    - x8 t0 q" S" ^; Z# Z
  445. no_call_user:+ |; Y1 p8 h% h) k
  446. 5 Z, P6 l: l1 ^( g) E/ k% |2 O
  447.         cmp     byte ptr [sm_flag],1, f! f7 ^8 k" H7 @6 {: @
  448.         jne     no_show
    * t# }8 N/ x3 X% k: Y3 L) w$ p$ R: y
  449. ! d8 f5 @4 I$ y3 ], N, h
  450.         shr     cx,3' U% X% P/ @7 \! \* n3 J4 Y) G+ t
  451.         shr     dx,3+ B% @/ b: `- u- r# J" c, Z9 ~
  452.         mov     ax,806 V* K) N( S3 b6 [' N2 _
  453.         mul     dl; T( S( T0 Z( E; p
  454.         add     ax,cx# K" D/ q4 L; n1 u" s2 U6 Z" F
  455.         shl     ax,19 n2 _4 {/ L7 V7 c4 t% C1 U
  456.         mov     di,ax
    5 I4 [5 L- P; h% g" a$ u
  457.         mov     ax,0b800h( u2 ^4 E5 ?4 |- n9 ^% Y- O0 H
  458.         mov     es,ax
    ( d& b3 A' Q  \
  459.         mov     ax,[save_char]" \% Y- L: Y; E. z" s$ {& O  H  n
  460.         stosw$ i( z8 I% J1 q$ q

  461. 5 V) C" d1 I, p8 O  l; ~3 x; k" a
  462.         mov     cx,[pos_x]* q8 M' h1 N0 g7 t# w( r+ A
  463.         mov     dx,[pos_y]
    ( b* M& o4 M) T! ^% H, C( M0 t4 `  t
  464.         shr     cx,38 k2 M2 O9 j2 t5 i' l
  465.         shr     dx,3' m( A& A9 b+ B8 }- k+ X
  466.         mov     ax,80
    ) l; h0 R; `5 ^: u2 z
  467.         mul     dl7 W/ H2 e4 C* m8 U  u. k4 d7 V  D
  468.         add     ax,cx  ]! B# T. ?9 ~7 w  g
  469.         shl     ax,1
    " U9 g: q, Z, G* U& a$ g5 S. _' o
  470.         mov     di,ax# B. x& x% ?! x4 A. M0 g
  471.         mov     ax,0b800h
    2 t5 l6 W" }8 g# P$ T' U  d
  472.         mov     es,ax; U8 h8 D9 q5 d0 w# M* ]
  473.         mov     ax,es:[di]3 _. G. V7 {" k! x& @
  474.         mov     [save_char],ax
    6 T' y' s5 M* Q% L
  475.         not     ah
    + Q7 Y6 _: L* P" X: ~
  476.         and     ah,7fh
    & u. f6 p% y1 u
  477.         stosw* Q, \1 _; G! B4 W( J( q5 h
  478. no_show:8 o7 Y6 `# X! |
  479.         mov     bl,0aeh
    , y) j  _6 O' E9 g. I
  480.         call    keyboard_cmd
    : t# `" E4 A/ r
  481. ) q1 t  ~8 a2 h
  482.         mov     al,20h
    0 l- r6 |+ o7 Z& Q/ S# F( ^
  483.         out     0a0h,al
    1 `0 a) K, o- e! s% Q- n) q2 z
  484.         out     20h,al
    7 x+ x5 w0 u, X* t

  485. % T* i# V1 P  w) q( a) J
  486.         pop     ds
    ; ~% E0 ]+ C. m$ q2 t
  487.         pop     es
    " s+ z. B$ q; Y3 C
  488.         pop     si
    1 ?  e: e; T1 h# A  s/ P+ B3 r  [
  489.         pop     di
    , e+ {0 \2 x( o% r2 Y* D
  490.         pop     dx& v: Q. w7 }5 Q: K6 n& s4 C
  491.         pop     cx6 `/ V9 m  N7 C1 S
  492.         pop     bx
    / I  N  ^% y; P3 ?" x
  493.         pop     ax
      v7 {+ s. [! H; S$ K$ x' E" n) }
  494.         popf
    * o& s, y  _# d
  495.         iret+ u! `8 U' g% X
  496. " x) s# A' i4 W" L
  497. first_time      db      1% D$ j6 x6 @# f7 ~6 |$ }. d7 Z
  498. buttons         db      0" }; R$ O1 Z4 t3 V
  499. pos_x           dw      0
    , P. e  h" m. S5 O# i6 r: C+ a
  500. pos_y           dw      0% K% x, Z2 @9 l* O/ g' \: g) W
  501. sm_flag         dw      0
    1 @9 a8 o! t  L& S4 S' n5 C
  502. save_char       dw      0! t, Z8 `* a: B. M: }$ ~5 j
  503. x_move          dw      0. O# J: V( C% l: Y: Y0 u
  504. y_move          dw      0' {' k; J: [2 [, v" a
  505. x_max           dw      639
    + B0 @) U' [+ \5 `: r: C( R
  506. x_min           dw      0! }" d, a8 s$ s- J% g. c
  507. y_max           dw      199
    3 P  O$ {' L; O. r8 Q& f
  508. y_min           dw      02 G* n8 V4 }! U- Q4 x  Z5 N
  509. user_subroutine dw      0,0/ u% a' ^* Y# a! P* A
  510. user_mask       dw      0
    2 G: P, }+ l6 }' l
  511. temp_mask       dw      0
    . C& G! \0 V4 m1 S

  512. ) c9 X* L# d) G9 I  V0 }+ k
  513. keyboard_read:
    & P* M3 i! V) v% i$ b
  514.         push    cx) s8 w3 {# P* A: d9 I) @/ l+ X9 N
  515.         push    dx7 U; E, P, M  J+ O8 ^- ^% p8 T
  516.         xor     cx,cx3 W. C, \) U6 h: R
  517. key_read_loop:+ B6 o. A' ?% k: T: `1 p' h
  518.         in      al,64h* O7 R4 Z9 `5 [
  519.         jmp     $+2! G- q3 X3 N0 a4 s6 H0 F" ~1 X* ]+ S
  520.         jmp     $+28 r, b/ a) k' b6 F* ~
  521.         test    al,12 F4 h. g9 k0 n- ?4 X3 s
  522.         jnz     key_read_ready
    1 r6 k$ r- ^/ g! b; c" f8 Q$ B
  523.         loop    key_read_loop0 K4 D! b) U) |. `5 ~8 y6 a0 |
  524.         mov     ah,19 s" J# Z% f, X3 v# d7 }1 _
  525.         jmp     key_read_exit4 H' w1 ]$ T4 z* k8 L
  526. key_read_ready:
    . E/ m5 I2 w0 d+ a% ~3 O
  527.         push    cx; |. T/ }7 u5 [4 b1 R
  528.         mov     cx,328 g$ V  R2 Y" J0 I, w& d; U. |8 E
  529. key_read_delay:
    " S* v; f2 Q5 O( \# A& I
  530.         jmp     $+2
    + V6 g  @( g$ [6 Y- t$ v. J7 ?
  531.         jmp     $+2/ I- E5 n4 B/ }4 h7 _& q% L! v
  532.         loop    key_read_delay$ c" m$ X8 G5 Y) B6 [
  533. 8 {) O: E5 q" x( n* E
  534.         pop     cx
    : K2 r  }7 ^/ ~  m* {* N

  535. - |$ b  M) v" d" o
  536.         in      al,60h6 [" O% \9 B+ |
  537.         jmp     $+2
    - _: T2 b4 j0 L2 q( K& w
  538.         jmp     $+2  c; Y% i" `- Z9 ~7 D
  539.         xor     ah,ah: y5 a, ]- q( F' C2 n1 J
  540. key_read_exit:
    ! `. L- _" B4 {' b  g
  541.         pop     dx
    % U7 Q* T. I& `% R8 t
  542.         pop     cx; U: \; ]* o( R4 Q$ ^, \
  543.         ret; x3 L7 w# C- L) L+ \2 X
  544. : r: s2 [# O. Z$ y2 h  @9 c
  545. keyboard_write:
    / Z8 ]$ Z, `) ~9 ~
  546.         push    cx  W+ \' S5 P& W' G- {, B1 H3 L
  547.         push    dx
    " S8 }+ M0 S. ~
  548.         mov     dl,al
    , l" |0 Q3 q3 [  B0 M" ]3 `" W) W
  549.         xor     cx,cx
    8 M, K! x! f9 Z5 v6 c5 T
  550. kbd_wrt_loop1:
    ' G4 m' E8 Q3 w# x' k
  551.         in      al,64h6 t  I0 h" I; S
  552.         jmp     $+2
    0 r5 L) w+ u9 [: a' B
  553.         jmp     $+2
    7 }* _! p- T' @5 l6 U4 k
  554.         test    al,20h. E" W! I( @2 S$ T
  555.         jz      kbd_wrt_ok1: M+ A! f& L' O3 w& I

  556. 8 p( ]9 t2 z0 w& [0 p& L
  557.         loop    kbd_wrt_loop1
    ) m& ]/ X8 @- z5 i

  558. ' R# ?, K. P3 v  l, G; b* w/ o/ {
  559.         mov     ah,1( P$ y0 G: q  Z( f3 k/ \/ H
  560.         jmp     kbd_wrt_exit
    / Q7 c- \' f9 F5 f  f' Q

  561. 2 ~( Z$ v1 d% c. |0 j% f
  562. kbd_wrt_ok1:
    $ l5 G' L. C3 p2 G5 ^8 Z% Q
  563.         in      al,60h
    ) k# a: ~- v. s9 J

  564. - f+ Z$ I9 L; |2 J7 o5 C* p6 Y
  565.         xor     cx,cx  H7 B% G  ~( u
  566. kbd_wrt_loop:1 {# _' ?# M7 g9 p1 d! [6 \
  567.         in      al,64h& R: v: I9 z6 W6 H% i
  568.         jmp     $+2
    , A2 W6 B% j. F6 R
  569.         jmp     $+2
    ' b+ K4 u3 T5 |1 l0 z
  570.         test    al,23 i; A5 s: s. t. ^, O  s
  571.         jz      kbd_wrt_ok( W( A6 q9 v1 A% f5 W8 M) Y& l

  572. + ]: o2 k+ O3 k  g' S& k) e
  573.         loop    kbd_wrt_loop
    ( ^3 c$ ^! p4 N& `# i

  574. 6 d% @( t& t- y
  575.         mov     ah,1
    ( m. {+ p" ~$ S7 X
  576.         jmp     kbd_wrt_exit
    . ~% H2 i: a# [% l0 g

  577. 3 _) u2 n2 e5 Y; V
  578. kbd_wrt_ok:0 {1 w# B5 b4 I. v6 h
  579.         mov     al,dl
    , @& E- _  k4 w/ n8 W6 z# \) {
  580.         out     60h,al
    * O7 [/ G% E8 K% D
  581.         jmp     $+2
    5 k8 Z) u  C% ^. ?, g: f3 ^
  582.         jmp     $+2
    ; c' ]. U; {' `0 v

  583. ' y2 i* b. s( {% w% W$ v. w5 n1 P. T
  584.         xor     cx,cx0 u) d# A! w  f' q5 P
  585. kbd_wrt_loop3:
    3 {% h8 d0 F: i
  586.         in      al,64h% p4 Q9 N: h! z! c. d, G
  587.         jmp     $+2. ?# u# u7 L3 V' w
  588.         jmp     $+2
    1 {: [( ]7 m6 i( W: P. c
  589.         test    al,2
    7 w8 q. t7 v/ K2 D
  590.         jz      kbd_wrt_ok3' }% M6 S. R# W; N- D- e1 b
  591. ' J# N$ U0 \* o; X  F4 x2 {
  592.         loop    kbd_wrt_loop3
    6 ?# I' N1 V2 q2 B9 a6 h7 T* `

  593. 1 ?+ g* f3 r. n8 n2 D9 j- [! n; O
  594.         mov     ah,1
      Q$ r/ f1 V: h; G
  595.         jmp     kbd_wrt_exit  M: g; y& B; s- P1 i/ ~9 h

  596. 3 h' c5 v4 w* y' X
  597. kbd_wrt_ok3:
    " R' E0 H; Y3 h* H/ ^9 q
  598.         mov     ah,8) ], j+ S+ c% \  g# A1 J
  599. kbd_wrt_loop4:
    4 u9 o6 A8 @. I' r6 ?0 s
  600.         xor     cx,cx
    ) c9 f1 [, N9 y7 Y: }- k  y
  601. kbd_wrt_loop5:+ _+ |- x% Q; _2 X; Y
  602.         in      al,64h
      _9 j; T( s8 i
  603.         jmp     $+2
    * m4 `  G2 ?3 R, r
  604.         jmp     $+2
    * U+ e) l: C( _7 g, h
  605.         test    al,1- T  Q% M$ h$ ^8 f2 K0 G2 S  T
  606.         jnz     kbd_wrt_ok4
    7 g+ {" a* b* m( N9 J- _% W

  607. 4 j3 I4 I6 A! j: L
  608.         loop    kbd_wrt_loop5
    " \: {+ N; B; v5 m. {: W
  609. ( P6 Y3 O5 E) {# J
  610.         dec     ah
    8 S& O+ c6 {' {! J
  611.         jnz     kbd_wrt_loop42 S/ A3 A3 S" u- E( |4 H( v5 `

  612. # s$ ~# i- w7 T: f; I
  613. kbd_wrt_ok4:
    1 E; p  t0 m  l5 Q6 Z
  614.         xor     ah,ah. }; ?* J+ v  q$ r; h# h  f) o
  615. kbd_wrt_exit:
    3 g4 e  |) G* w0 i
  616.         pop     dx" r1 D! H9 A  Q- M8 `$ ]
  617.         pop     cx* f3 G# ^5 e3 G/ Q9 P$ n
  618.         ret
    ! s8 e8 J' M, m: z$ Y: o, g" J
  619.         - g* O7 G; q) d9 Z, S& T  D
  620. keyboard_cmd:
    7 t5 W; ?; ^& R( i6 z8 H) g& {
  621.         xor     cx,cx
    - f4 Q  p, f' s5 u! ~
  622. cmd_wait:
    0 k" P4 e4 J- D# Z
  623.         in      al,64h8 d$ r5 N; Y3 c
  624.         jmp     $+2
    1 b: J" \- y, C- y6 m4 V( l
  625.         jmp     $+2
    ' D3 h& s( n$ l, k+ s
  626.         test    al,2* L2 y5 i! ~3 h- a2 e2 s
  627.         jz      cmd_send
    # a+ C! e$ `8 K$ K/ G' N
  628.         loop    cmd_wait
    . D, k5 E6 Z/ O; W# N5 ~' T

  629. 0 P' k. E. F4 S7 i6 k! z
  630.         jmp     cmd_error
    - c3 @/ h$ L# u  C8 Y# S
  631. 5 E- |4 k. v# q7 Q% z
  632. cmd_send:
    8 s6 j8 z2 ]' i! b
  633.         mov     al,bl
    ' N% o5 K6 z7 y( f# T: D
  634.         out     64h,al; w% q1 e; F# v, i/ Y/ v0 J
  635.         jmp     $+2! f, g9 @. Z, k' G) L- P
  636.         jmp     $+20 p/ s" x2 E8 m) R* D. V

  637. 5 j( _3 i* _* h2 V
  638.         xor     cx,cx
    & b' T1 q% l' Y
  639. cmd_accept:/ O3 x2 w/ `- u3 j& ?1 m- o
  640.         in      al,64h: m. Q4 G( J" Q* A' ^0 w
  641.         jmp     $+2
    4 u; d4 ~  h! x  M% x5 x/ D5 A
  642.         jmp     $+2
    1 J% f6 \7 j2 K, Z, C) ]
  643.         test    al,2
      W8 p5 C# Y# K; W+ b* m
  644.         jz      cmd_ok2 ^9 o2 f' x2 X" ?
  645.         loop    cmd_accept
    ' E# A6 J' H' j+ w$ \

  646. 0 C% R  S+ E3 k) Z) A
  647. cmd_error:
    3 Q! W+ F$ [' ~$ u/ o6 ^
  648.         mov     ah,1
    2 f4 V( ^4 L" n. @
  649.         jmp     cmd_exit7 h4 j7 ^. E  w$ x5 m$ Q9 x4 x4 X
  650. cmd_ok:1 |3 w2 P5 n) J$ d
  651.         xor     ah,ah/ G+ z# n; h1 s* J/ T+ M  m
  652. cmd_exit:
    0 V. ~& M4 d3 p# y! r+ ^- f% m: c3 B
  653.         ret3 D' q( [3 B5 d
  654. - K: z3 i3 r6 @
  655. new_33:
    ' L" A3 ^4 M% O; `+ |
  656.         cli
    1 t4 N" X3 l2 O% {  o* U1 O7 ?9 e
  657.         cmp     al,0
    + B4 w/ C, {2 Q. X/ B/ [
  658.         je      reset_mouse' n$ R; e! S6 Z3 h
  659.         cmp     al,1
    ' \) `% @* y) o4 d) \2 m# K5 C5 ?2 ]
  660.         je      show_mouse% j7 N" [+ }+ w: k
  661.         cmp     al,2, c, X8 b3 s; v# l9 g% q  g
  662.         je      hide_mouse
    2 f2 i* I" S2 S! `4 P
  663.         cmp     al,31 D+ u+ M" E+ T" b
  664.         je      get_pos. ?! f* F( ?, W: n7 w, c
  665.         cmp     al,40 Y% O+ j7 D1 T) v% `
  666.         je      set_pos
    # Z- H3 k  h$ a. N2 z
  667.         cmp     al,74 I4 L2 A+ T. Y; k! B/ V0 y3 N
  668.         je      set_hor_pos
    ) U% N9 e. S) Y: h" |
  669.         cmp     al,8
    ' J# o" Z) T7 G1 R
  670.         je      set_ver_pos0 J! r& a" |. y& A- p
  671.         cmp     al,0bh
    . y" ~# |- R% `: Z' ]+ j
  672.         je      get_mouse_movement
    0 k: ^4 Q, r* l0 g% Y
  673.         cmp     al,0ch
    - V, U( ~. x8 F6 c* ]+ l+ |' h
  674.         je      set_subroutines
      a: u. i/ E, z2 \1 }4 z
  675.         cmp     al,14h
    5 ?6 ]6 g5 g2 i' q* E' i
  676.         je      swap_subroutines
    9 @. Z7 O- A. I& s3 j' b: H
  677.         iret
    & ]. |3 X: w2 X& V7 o1 }3 S: b
  678. . ~  G1 ]9 c1 |
  679. reset_mouse:
    . L) G; d9 ^' b6 H* {
  680.         jmp     _reset_mouse2 z; Q; Z+ V/ p% R& t
  681. show_mouse:
    : |1 n8 }! P1 d9 O( b6 v7 `+ }
  682.         jmp     _show_mouse
    " N% s; B- c3 z3 P
  683. hide_mouse:; C8 q' U" J- K6 U5 V  d
  684.         jmp     _hide_mouse
    4 `* ^) i. k; j2 z
  685. get_pos:/ q8 R* `/ J! \' S7 L) f1 N
  686.         jmp     _get_pos: h. n6 g* m9 @5 |# a# v" s
  687. set_pos:0 |- T- {$ F  n. c* b( ~- j
  688.         jmp     _set_pos
    3 [! E+ K! {9 o. Z3 Q0 ~
  689. set_hor_pos:
    2 `0 c- t5 L, J4 }! q! }+ Z2 b- w
  690.         jmp     _set_hor_pos
    # x( G3 \/ m5 ]( `
  691. set_ver_pos:
    8 q0 H/ U+ V7 ~3 i% j
  692.         jmp     _set_ver_pos4 e" @1 ^5 h. Q6 _
  693. get_mouse_movement:5 z& ]8 u! G7 [* b1 f7 J
  694.         jmp     _get_mouse_movement+ p# Y! S( B$ M' k. Q
  695. set_subroutines:, a& N& K0 l- v; a+ i
  696.         jmp     _set_subroutines7 s1 I1 I% [2 c/ Z
  697. swap_subroutines:/ N3 `# T& c0 F7 W' W0 }+ P
  698.         jmp     _swap_subroutines
    5 ^2 x  t  y( J; Q5 g: M7 ~: o
  699. ) w# _, ?+ W, O" J- Y0 j
  700. _reset_mouse:
    " B& Z7 v- }$ o$ k$ }2 L
  701.         mov     byte ptr cs:[buttons],0
    9 ~, H# O2 A1 j6 m8 N
  702.         mov     word ptr cs:[pos_x],03 ?1 s3 }; [; f/ e. I/ P3 P
  703.         mov     word ptr cs:[pos_y],0
    1 C  A2 v2 q1 R* c; ]5 ~- u: f
  704.         mov     word ptr cs:[x_move],0/ V8 K1 {2 v' c
  705.         mov     word ptr cs:[y_move],0
      }3 [  Q$ I2 G) i1 G
  706.         mov     word ptr cs:[x_max],639
    6 z' J4 z4 d+ }
  707.         mov     word ptr cs:[x_min],0( J. M  E% T/ t1 _
  708.         mov     word ptr cs:[y_max],199
    7 h+ z* e, p" d5 v7 e
  709.         mov     word ptr cs:[y_min],0
    $ x- z6 s4 f$ i- f( f
  710.         mov     word ptr cs:[user_mask],0
    5 L8 k# K4 t# n( _
  711.         mov     word ptr cs:[user_subroutine],0
      m" ^6 _' |/ q  T+ Z
  712.         mov     word ptr cs:[user_subroutine+2],0, x7 t! F3 y* n' V
  713.         mov     ax,0ffffh
    5 Y8 K' [! K) D" q
  714.         mov     bx,36 O/ T* T. ?+ A5 z
  715.         iret
    # N/ [) d) B8 |5 H' }! n  ^$ _5 d4 L

  716. 2 F0 B; C% [9 k9 `3 a8 ?' s0 Y2 h
  717. _get_pos:* g" X' P: u- J3 q9 o
  718.         mov     cx,cs:[pos_x]. C. J( L; S4 f) U
  719.         mov     dx,cs:[pos_y]
    / K6 ^  Q. u* S. f5 s9 ~, P0 \
  720.         mov     bx,word ptr cs:[buttons]. e* T, Y* x/ m4 w
  721.         xor     bh,bh
    $ n8 ~) S6 r8 E1 Z5 l- m: Z
  722.         iret8 `4 s" F7 s2 K- W
  723. : ]6 G7 [- d1 \% G
  724. _get_mouse_movement:
    & f9 F* M3 E) S1 E
  725.         mov     cx,cs:[x_move]" n5 }  o6 e# a# v8 `2 i4 \6 C
  726.         mov     dx,cs:[y_move]9 V& N( L( ~, x; X/ Y4 H/ C
  727.         mov     word ptr cs:[x_move],0
    7 I% m" O4 M8 m4 ^- B8 N- W- k
  728.         mov     word ptr cs:[y_move],0
    + _, ^7 f# p: Q$ j5 g) t
  729.         iret! `* p3 `5 ^& c3 c& C/ x
  730. ; B( @9 B: {7 c# ~; d) y2 B3 B
  731. _show_mouse:
    7 k+ {- i# [1 I! `2 Q1 T
  732.         push    ax
    , S& C0 e- F2 n; A: ]
  733.         push    bx
    3 B# `3 j& e5 O3 n; _0 s
  734.         push    di3 H5 o* @7 @, }, z# M5 T
  735.         push    es
    , W9 a+ ]+ O" r$ r5 h
  736.         mov     byte ptr cs:[sm_flag],1
    & V) }0 {- `  u8 M$ M/ `. p
  737.         mov     ax,cs:[pos_y]
    . ^& \3 Z% Y' O: T  \( z
  738.         shr     ax,3' D9 z. p; U4 Y; @! x% y" A
  739.         mov     bl,80
    ; j$ I; h: n* H2 s: f! ]0 d3 i
  740.         mul     bl
    7 \) T0 F: v% ]  d( b
  741.         mov     bx,[pos_x]
    ) x  ?+ H+ u( T
  742.         shr     bx,3, ^4 h! ^6 H9 }6 t+ w6 w) U
  743.         add     ax,bx
    . l; D; X- a% l4 p8 W: _# s
  744.         shl     ax,1
    + ^" q: d# I3 F9 l5 k/ P& p
  745.         mov     di,ax. B) R( ]$ T6 ?9 L( j) D% j
  746.         mov     ax,0b800h# D. H5 Y& p) E5 [8 W$ s; t2 h' c0 ^: B
  747.         mov     es,ax
      Q+ S" ?" l1 {' z7 J' V7 k. x
  748.         mov     ax,es:[di]* _2 u9 {. \' y9 a# k. e
  749.         mov     cs:[save_char],ax2 q2 n! \* Q/ w* F- Z8 @
  750.         not     ah9 k6 b. r/ q6 ?+ U1 V* w! p8 ^: B# E
  751.         and     ah,7fh' U0 s' S4 M) G' s: @: q, y
  752.         mov     es:[di],ax/ d- w( n0 h4 L  c# a
  753.         pop     es
    $ o* w1 s9 p1 a
  754.         pop     di
    * j, _4 `) l* u  i0 z+ L
  755.         pop     bx& Q4 R9 r* r, J( V6 K+ U
  756.         pop     ax
    , f/ S( i* _/ r, I; d) B
  757.         iret
    ' L9 H- n% N0 O$ Q0 K  U9 R# C
  758. 2 P8 L# d3 t% `/ Q
  759. _hide_mouse:
    + ], h3 R( q2 \8 J
  760.         push    ax' K# C8 {1 p0 o4 @
  761.         push    bx
    0 L3 W" Z) [8 D5 Q
  762.         push    di
    5 o' [- _2 F! o8 t/ e% D
  763.         push    es/ f0 C+ D! ~, {8 }& k. A6 f" D
  764.         mov     byte ptr cs:[sm_flag],05 [( z" o& u! \3 x1 n) I' }& Q
  765.         mov     ax,cs:[pos_y]; O3 c, Z' u; b$ M4 ?+ a2 }' n
  766.         shr     ax,3; `' F/ ?' L$ M) F+ ~
  767.         mov     bl,80
    $ Z" k# q9 L: W
  768.         mul     bl
    # G' _" J! ]" J0 S
  769.         mov     bx,[pos_x]
    9 u" n# \% W$ Q2 g+ u3 ?7 _6 P
  770.         shr     bx,3: t* w: |; u# J  a, I
  771.         add     ax,bx( E: x/ y8 Q. M6 V
  772.         shl     ax,1# M5 k" ]# T# j8 ^0 q& B$ J
  773.         mov     di,ax- t2 M( R- V; P: l
  774.         mov     ax,0b800h' L  [; Y8 q2 S; R' o+ T3 Z& ~
  775.         mov     es,ax- `+ u( }5 @: Q  r( r  D- N
  776.         mov     ax,cs:[save_char]
    9 i& ~; h, W( P+ b6 i7 q
  777.         mov     es:[di],ax
    6 Q2 o$ H, F- Q: o5 C4 N
  778.         pop     es6 H/ u% Q, x' d- C1 j/ y
  779.         pop     di
    : X0 r6 X9 R! v2 c
  780.         pop     bx" z- A6 L& G4 Q" z
  781.         pop     ax! T' a- O+ b% H5 D* E% E$ \! e
  782.         iret, [" ]% ?% I, S5 Q+ s$ ]$ O
  783. 2 o5 ^+ j6 L/ c4 ^1 n  Y
  784. _set_pos:( a' B6 y" A1 S) v, c% s
  785.         mov     cx,cs:[pos_x]5 S9 ~4 X5 i$ O+ X  Q+ p& \( Q5 M
  786.         mov     dx,cs:[pos_y]8 S( ^  P! I' o. ^0 ^
  787.         mov     word ptr cs:[x_move],0
    % k/ x' P, C% Z# T4 T. J3 }2 \
  788.         mov     word ptr cs:[y_move],0
    1 P1 |; B: B+ F- v5 \: x
  789.         iret
    6 Z$ D/ [' v9 N! S) R$ c
  790. 4 u) G: K. T2 L& l
  791. _set_hor_pos:4 F9 G' ?0 [$ G8 w7 j7 \( Q
  792.         call    max_min5 A$ H7 ^6 F: r
  793.         mov     cs:[x_min],cx8 U3 ]; K* r1 V% `* H4 t
  794.         mov     cs:[x_max],dx
    9 S; g3 A. j6 b3 M3 _
  795.         cmp     cs:[pos_x],cx
    ) J" l$ Z  a$ X3 o& ~1 x- |2 X
  796.         jge     good_hor_min( A7 U7 M+ H9 S9 L; j5 [5 j: Y
  797.         mov     cs:[pos_x],cx0 `( n- a* ?# W9 W
  798. good_hor_min:+ H0 |7 X( ~' {0 u
  799.         cmp     cs:[pos_x],dx. Q! D+ m# C: o  r7 W: n
  800.         jle     good_hor_max5 C# s! v# L. K+ q" m: G
  801.         mov     cs:[pos_x],dx
    0 O% z, [* A3 U* J+ b. d! \, |4 q& R
  802. good_hor_max:, p2 }& i0 S0 I0 p& S+ X
  803.        iret# l( n: I5 N1 y7 X+ m3 Y8 y

  804. ) I* |* b' J$ ^. m' f' l9 n2 o  A
  805. _set_ver_pos:6 \& [& T# r: S' w1 {
  806.         call    max_min
    / `2 h$ h' V% e+ `
  807.         mov     cs:[y_min],cx4 Z8 l. f! C* U5 t' C
  808.         mov     cs:[y_max],dx& U( X+ \- u, e  E
  809.         cmp     cs:[pos_y],cx: i$ y8 v9 }8 n$ ?% Y8 i
  810.         jge     good_ver_min
    7 e! ^# F& o; C! O( i' j
  811.         mov     cs:[pos_y],cx
    - K1 s! k! T8 x3 {& Y, `: D
  812. good_ver_min:# d0 @8 u3 _9 f' w0 s2 u9 j
  813.         cmp     cs:[pos_y],dx: @" L. A0 ~. ?9 k* V7 B
  814.         jle     good_ver_max
    " ^- {6 u. C+ N6 Y; M
  815.         mov     cs:[pos_y],dx. k/ S  ^. a" @( M
  816. good_ver_max:
    % p. y" h7 Q8 }8 l1 z+ j
  817.         iret- g7 T! k) @, y! u) g) l9 i
  818. 9 d( u6 F6 w" R5 O- I% x
  819. max_min:
    ; X, T' t* r1 \5 T: D1 p' h
  820.         cmp     cx,dx
    8 d4 W* ~' Y3 I! x/ e9 N4 l+ u
  821.         jle     no_swap
    0 x! X/ f* _& e7 C
  822.         xchg    cx,dx
    5 z4 r! d4 w! ]" y3 g- a
  823. no_swap:
      m& Y7 v" Q# `! X3 m& g' |
  824.         ret) o  q, z/ |8 V$ i5 q

  825. % p# f' e6 |* Y4 z7 y
  826. _set_subroutines:, i5 @2 E! s' n9 o" i+ c
  827.         mov     cs:[user_subroutine],dx
    5 _& m1 M% U2 i  I! e4 g$ O
  828.         mov     cs:[user_subroutine+2],es2 M/ T8 y2 u  n1 @) a, L5 W
  829.         mov     cs:[user_mask],cx
    0 w" |5 k6 x7 S3 C; z' s( B# s: c; P
  830.         iret
    + O# J# W; W) l& N, @4 o
  831. * h! X4 u( b* Q
  832. _swap_subroutines:
    7 C, v* y1 i6 @+ s
  833.         push    word ptr cs:[user_mask]% `5 \) {4 n) ~1 x
  834.         push    word ptr cs:[user_subroutine+2]" t, ]" x) M. o& e7 Z
  835.         push    word ptr cs:[user_subroutine]# n4 k$ G! a9 E" \/ H" y2 n5 H* _
  836.         mov     cs:[user_subroutine],dx. G! b& l2 A2 _( ?8 k8 B* z
  837.         mov     cs:[user_subroutine+2],es
    6 g2 Y1 l8 N; Q
  838.         mov     cs:[user_mask],cx$ m$ X, K2 {2 t' e
  839.         pop     dx
    / `' [' f. Y8 J& p
  840.         pop     es: w2 L. {; l; J8 C4 F6 r9 E7 U' m
  841.         pop     cx! n) L5 r  v) N
  842.         iret( B$ |/ O* k0 s4 N8 L# R
  843. - |2 Z+ N/ ?: K3 u3 d7 m
  844. memmouse        endp$ I) L9 D$ O8 t; S
  845. - X: e! t3 m, |* f7 c
  846. endof_start:
    $ b9 r; ?& y2 T5 ~
  847. , J2 Z# F! q2 t* ?# m1 B5 n
  848. emsg db 'No mouse driver install error!$'
    ! C9 j! U! g! D, g  a- `7 F5 b
  849. old331 dw 0
    * i- C- I, T" A6 G9 Q7 [5 i, r
  850. old332 dw 0
    $ \* m0 V7 [9 |' u! i# M0 F
  851. old741 dw 0
    3 K2 j, x  E. H+ v! E* B8 K3 J' l
  852. old742 dw 0! ~0 A2 Y( I$ E- H
  853. memcopy db 0& D- e. M5 |7 o! i" E' v( j
  854. okcheck db 0
    ' L/ H  H& @8 C  W4 Z
  855. pass db 0( N# g* s" C& N% r1 [' M
  856. chkl db 05 p- ~# C$ y( o" C" {* v7 A3 `4 d
  857. lk db 0
    / u7 S, v, D1 p, f0 P9 Y( F+ L
  858. chkr db 0
    ) S+ d6 S. f( ?. a$ U
  859. rk db 01 V1 R7 c3 L  J0 C* ?; [
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '9 a& C9 A, L; C) v# H/ P  S8 O
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '  K+ Y% F+ c" O; ], l
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    , F: U! `9 ^/ A+ }3 m
  863. db '                                                                                '1 j7 m- g$ y$ e- s7 j- R1 F2 N
  864. db '                                赏屯屯簧屯屯突                                  '+ c8 e1 [" x7 V* _. T& W% T
  865.         db      '                                ?OFF汉OFF?                                 '
    % p  \3 R8 L+ y
  866. db      '                                韧屯屯既屯屯图                                  '. w1 Q$ |/ i3 `% {
  867. db '                                                                                '
    6 h8 D1 e1 w$ R/ k
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ') J) T+ S; _) O( P1 G9 v
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 3 D# W4 _& O) L' @6 G& G* P
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '* b7 b- b* i. ~: b1 S9 T
  871. + |& h- c7 C; ^
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
9 Q( T+ B+ {/ z- C# p哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
7 z9 P7 R( N0 t
4 w' \  [0 {! y) T; u; U; M( l# _谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 07:30 , Processed in 0.215013 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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