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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
  z6 S/ I7 E/ q* d2 j
! i; d9 j) {7 R0 ?/ @1 R代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;. G8 G7 e# i/ R
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9) Y: ]2 U2 }. k( p) ?- i4 f8 v
  3. ;                                         By Bini.Yi 易祝兵; @. C4 D7 y; }4 f, e5 ?
  4. ;                                         http://www.ufoit.com 计匠网. s. i5 c+ d- [4 t* [1 j
  5. ;                                         2002/04/06 YYYY/MM/DD
    - N/ r, K! l, ~1 C+ A
  6. ;
    . O& H! T( A% @( m8 X
  7. ;          % D/ E& ?8 s* |) z' u& ]
  8. ;          This program  test the mouse button  click and move.# ]" \) R$ c" P$ A* }* X" X2 r  m
  9. ;. o. x& [8 h' T4 ~- O5 ]

  10. ) p5 V9 v8 B, x/ i
  11. .model tiny
    ! Y: C4 \) ~/ y, h  X5 g
  12. .586, ?4 V3 Z. Y5 C' }% l
  13. .code: ?0 c$ j! n+ a, ?: G: H7 [" P5 R
  14. .stack  100h
    . r$ Z/ J7 s; J; f3 _# f+ `
  15. .startup3 r  I* ?4 u6 R, F6 p1 G6 n5 x# l
  16. pusha8 a0 Y- A+ S- U2 [$ K& D8 G. P9 P
  17. mov ax, 3533h2 l  x2 @( Z$ v. ?5 y
  18. int 21h( W$ k) j) h! Q# i! x# B  @2 C
  19. mov word ptr cs:[old331],es
    & D, n1 d+ d3 E% |6 @+ c  a
  20. mov word ptr cs:[old332],bx# G) Y  o5 f: p2 T5 ^
  21. mov ax, 3574h7 {5 z" p( \3 ]" B8 ]
  22. int 21h
    7 ~" w+ L& r6 K5 K2 ?& K7 ^8 q
  23. mov word ptr cs:[old741],es% c/ z& [$ |9 y+ J0 D5 R
  24. mov word ptr cs:[old742],bx
    4 g3 y$ T. n  v
  25. popa& a2 H. q* V& s
  26.         call    memmouse* U' ]& U( ?8 _9 M7 K* h: m& R
  27.         mov ah, 00
    : W' z( y1 k: f" o! K
  28. mov al, 03
    1 Z5 G) e9 I8 R. V+ X5 M
  29. int 10h8 X$ s8 q5 h) i: ^
  30. mov ah, 060 r  P& X# M( t6 ?  |/ X" R4 q
  31. mov al, 0! x9 w: A: b5 Q1 t; y2 K* O! G8 t
  32. mov cx, 0
    3 s" V$ o- y! q0 r' D+ X" Z2 T
  33. mov dh, 24
    2 `' R  R, K: [( C
  34. mov dl, 79* h) r4 f4 x1 k- B4 i, p
  35. mov bh, 07h
    ' x+ N" [  P0 f" o  K* @
  36. int 10h5 ?' M" V5 |& _7 z! Y9 k
  37. mov ax, 0000
    / G0 n" ^3 E' y
  38. mov bx, 0002* Z- ]5 c4 t9 [' o, b: u- J
  39. int 33h
    2 Q; ^! A* [, w/ Z
  40.         cmp     ax, 0000           ;if no mouse drive install( @: J% m; T) R& F& H
  41.         je      errormsg           ;show error MSG
      O  K. ^0 X1 C5 w! Y/ f; c% z  N
  42. mov ah, 02
    ' w3 U9 Y# Q. c9 I! T& h
  43. mov bh, 002 l0 f2 f' F* @  S7 V
  44.         mov     dh, 25             ;Move point out screen' m" O( M# Q8 K2 K6 f# N
  45. mov dl, 79
      z9 Y- P9 Z1 U1 x3 _/ v" V) K
  46. int 10h+ `" k- o5 m0 _% N; E
  47.         call    showmsg            ;Show info
    ! v* S9 s2 |. d
  48. mov ax, 0001$ x$ y* B+ Q% Y
  49. int 33h
    % m  n% @+ t% z9 Q4 g' d1 |
  50. ; mov ax, 000ah
    7 ^/ C- @+ ~+ U; N
  51. ; mov bx, 00006 j4 Q2 x0 y$ T) j# L5 T2 o
  52. ; mov cl, 0h
    3 o" G2 W% p/ r* ~& x
  53. ; mov ch, 0F0h- I) L9 _& v( L4 b4 _
  54. ; mov dl, 0h
    9 I3 S/ T- g+ C# T
  55. ; mov dh, 0F0h6 H& c1 e' n( d6 y& b) f6 H' F5 K
  56. ; int 33h
    5 y1 ]2 \2 Z" y+ d5 Q
  57. mov ax, 0004h: C0 |# m8 K) f- C3 D# Q) k' d% ]5 X
  58. mov cx, 0319) f. w8 Y8 R4 O4 G+ e
  59. mov dx, 0103
    ' {8 X2 [3 K* m; T( M, h
  60. int 33h
    3 u6 d4 `5 Q4 C( y! ^6 `
  61. casemo:                           ;Case button click and point move
    % q+ `9 Y8 h" v% l1 T
  62.         mov     ax, 000bh         ;and keyboard press" ^1 f4 j. C# H$ i  Z, ?0 ?
  63. int 33h
    0 t" k/ P6 [/ {! y( Y8 r" _* J8 X
  64.         cmp     cx, 00h           ;if point move....X; u( [8 b, _1 Z7 i2 G/ `5 L! ?
  65. jne xmov
      X) i3 M: }) R
  66.         cmp     dx, 00h           ;if point move....Y2 U# p8 \2 ?! h8 z
  67. jne ymov# w. y6 k2 i+ B9 I% Z- C" r
  68. xymovend:                         ;X.Y move end) t! q0 w- R- }; \  E: k
  69.         mov     ax, 0003         
    2 U0 {3 C+ y) u# J- M; U& ^+ M
  70. int 33h, d- Z2 o# g/ U2 }' h) E' j( [: y
  71.         cmp     bx, 0001          ;if left button click  show ON
    $ e6 l! q* y1 N. ~! q5 N0 c
  72. mov si, 1828. H- P/ {! j+ i6 ^, e( s
  73. je listl0 X- M8 Z$ F( `4 R, g& t1 F, B
  74. mov si, 1828
    " n7 V9 }. ~9 I" v6 L" m
  75.         jne     nlistl            ;if left no click show OFF
    7 b* u# \+ v) S& W" r$ a
  76. testr:# u9 k1 t. I5 X+ @; l5 V2 w
  77.         cmp     bx, 0002          ;if right button click show ON' X$ M% l9 T& A
  78. mov si,1842
    , q& h6 X1 T3 E, e! T, k
  79. je listr
    # Q8 V' P, X' P  z0 H: r, o, I2 j
  80.         mov     si,1842           ;if right no click show OFF- z1 Q, j7 h. n5 `0 Y& }
  81. jne nlistl& j5 F+ L2 o3 i, j% p7 B/ R* r
  82. casekey:+ r# J( l$ f- e
  83.         mov     ah, 01            ;if any key press jump check4 ~2 r. {( _5 a2 {4 q& n# `4 F* P$ ?
  84. int 16h3 b; N/ c* }) t+ w/ ~8 d; |
  85. jne kpress
    ( o2 Q. F" A$ O# z, u
  86.         mov     al, [chkl]        ;check x flag
    : s: f5 d1 A4 H2 a8 `6 P  F( |
  87. cmp al, 02h
    % {9 [% p% ?( @' H/ ]/ F. y
  88. jnb chkok
    ) S9 Y. s$ T4 m$ F$ Z
  89. jmp casemo
    + \$ B$ o/ u) n5 q% |  J$ J7 S
  90. xmov:                             ;if X moved, get the X flag+15 u4 k" a1 _( \1 v) A
  91. mov al, [chkl]* N; P4 _  Z" L" o- I4 X
  92. inc al
    4 }3 ~* A+ K* c" @9 h. ?
  93. mov [chkl], al: l" e- E+ a2 `. {1 @" I& c, ?( s
  94. call passok
    0 A* h5 _) d% u* T8 c& s( [
  95. jmp xymovend
    ! m3 R# y" a* K3 F' K8 ^- w. v0 u  ]
  96. ymov:                             ;if Y moved, get the X flag+1) v1 ~" ?. J# h5 e7 z" X6 N% d
  97. mov al, [chkr]
    ; \$ r1 [3 v6 l- M* O" Y4 w4 B6 t% X
  98. inc al
    ; o' Y- a7 |+ H3 }5 D
  99. mov [chkr], al* @( o0 u- E5 Z: W
  100. call passok/ T! J* D; v; }: d' `+ Q
  101. jmp xymovend" z4 L& c, x! u9 S' C2 u

  102. & n8 Z' v( L- y' V$ V% V+ ^- R
  103. passok proc near& V1 X; m, D7 u( i
  104. mov al, [okcheck]6 O2 x% K+ o  t+ x. f
  105. cmp al, 1
    $ B' I1 V. G5 [$ @, @# O3 k
  106. je let0
    ( K/ J9 t) G6 g" @! k6 J
  107. jmp passret
    " q) v( U2 c; M1 w8 c1 P: t1 C
  108. let0: $ h  f  b1 N( C* l' ?. W
  109. mov [pass], 1
    7 l# }* p5 `% j8 p' i
  110. passret:
    ( `6 T. f* s/ I  P
  111. ret/ j6 M  V/ S$ V$ I1 M  q9 L0 t
  112. passok endp ' }; M* |8 j5 z' B
  113. * o8 I) y/ D' m% D
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS3 n9 q; R8 h3 I+ t, G  ~; x2 [7 K
  115. mov al, [chkr]
    3 E) }( ~- v! A) E9 K0 \% Q9 g, `
  116. cmp al, 02h
    ! N) l8 L. B1 r4 |3 X
  117. jb casemo! E) u! {! l- g( z, _! f
  118. mov al, [lk]
    ! e! b9 q. f5 g4 `- E* m% X" t
  119. cmp al, 1; U. f  q7 q# N8 @; r6 U
  120. jne casemo6 l: o* S6 z+ m* Z+ |2 }  q
  121. mov al, [rk]9 e+ f5 h/ \3 N; I2 R- [
  122. cmp al, 1
    4 j! o; S# @2 J2 x5 u) A
  123. jne  casemo
    & H/ M7 G3 M/ c) e& r/ L1 P5 p
  124. mov [okcheck], 1
    # N  G% V5 `: s' N; a9 _  Z$ J
  125. mov al, [pass]+ F" ^8 t8 g/ x, K- C
  126. cmp al, 1( C, y! N  ~5 U, b
  127. jne  casemo, Z" v, P4 G7 l& F% p! f1 w. C
  128. mov ax,0002h0 X8 ?  V# U$ O) w2 j1 Q9 \2 ?
  129. int 33h' {% Z! `# @5 h+ B1 k
  130. call cleascr4 [1 E3 O6 O+ ?
  131. - |3 c5 x( B8 q5 H) o7 D, ?
  132. call oldint
    & r. [3 @; k5 O, J+ d
  133. mov ax, 04c00h
    # }. A, M" L! k3 ^2 D' e( d: g
  134. int 21h! C8 ~# q. ?. ^4 A4 b

  135. + M0 y1 k% y3 `6 c3 C/ [5 H8 u
  136. okexit:/ N8 }2 {! N3 S) Q% }
  137. mov ah, 4ch
    1 m% y6 t: i5 j7 b8 L! M& f
  138. mov al, 0# _# o0 d; Y. E& q: E8 G$ x
  139. int 21h
    , |6 u) t% Q1 S, k0 P
  140. listl:                                 ;Show ON: f) U& G% E" f. m; C3 N. o
  141. pusha
    . H- J$ F) d; X3 c# c. H9 r4 `
  142. mov ax, 0b800h& A8 U# M1 N  d; V5 I' x
  143. mov  es, ax
    & f/ G2 O0 p. U8 M- {
  144. mov ah, 47h! m2 V9 \1 H5 \' T+ {
  145. mov al, 20h
    % H# g% k9 y: g% J& E8 O, w
  146. mov es:[si], ax
    0 Y$ f/ j$ q5 }+ |# M
  147. add si, 02' q4 C* [) y% h0 ?1 u1 M1 [
  148. mov  al, 4fh( K0 z/ ^6 a1 }; K2 `
  149. mov es:[si], ax
    % T0 g. D& c8 b5 h9 F
  150. mov al, 4eh
      S9 K  S9 D! R/ u* v3 G
  151. add si, 026 U+ ]. q) `- R4 U1 j  ]; L
  152. mov es:[si], ax
    , o# J1 b. P; `5 [1 f, K/ g0 A
  153. mov [lk], 1
    1 u/ L5 b1 e1 T0 w
  154. popa2 U& G8 I; B2 ?+ a- ^, I- s
  155. jmp testr
    $ S" L( S8 S  D! ]4 m
  156. listr:                                 ;Show ON
    , a2 ?3 B& }- |
  157. pusha
    7 n9 q$ W# O; G$ [6 S( h' T+ Z
  158. mov ax, 0b800h
    ; n% D( y( I0 h5 H& D& z
  159. mov  es, ax9 f9 g0 w5 l- K( b- ~4 t8 z
  160. mov ah, 47h+ N; {3 `/ r" K3 J4 c$ U
  161. mov al, 20h
    3 G; q6 H1 J3 V' p
  162. mov es:[si], ax
    6 W, N* W# X' g: G' a. `
  163. add si, 02
    2 S# a- |5 Z( J* \! ?/ T5 L
  164. mov  al, 4fh1 {3 |! S$ ?: m
  165. mov es:[si], ax
    - }. e$ g9 Z% Z4 v2 T
  166. mov al, 4eh
    , I8 {1 B) t6 |6 |+ `
  167. add si, 02
    - \. ?8 P- i5 G' l+ F5 p
  168. mov es:[si], ax
    4 ]: H/ ~7 ^; B; a, p" O* B
  169. mov [rk], 1  G4 t7 p' U' ^  v* d! D
  170. popa
    " e, Y8 A# N) K8 N6 J5 {
  171. jmp  casekey; i5 T6 K1 q2 D. s9 B8 H$ }1 z

  172. 5 ?5 Q! P1 K2 P7 y, D+ @5 ?3 q
  173. nlistl:                              ;Show OFF
    / h1 s' T/ K8 K. U+ Q7 |
  174. pusha   
    ) o% v& `: t# ^3 y, Y1 Z3 z
  175. mov ax, 0b800h  A2 j7 t! U8 i$ J  u
  176. mov  es, ax
    7 w9 W% r: ~$ M4 ]: S0 d
  177. mov ah, 17h; v' _% r! a" t/ J% b* w
  178. mov al, 4fh
      p3 i* K: w$ ?& h
  179. mov es:[si], ax
    $ V' h3 k' k+ s3 m% W4 F( _
  180. add si, 02
    * N- X$ O  |' N- r3 q( G& O
  181. mov  al, 46h
    # d( a) |9 d- I" l! G5 J& |( G
  182. mov es:[si], ax
    ' w" Y. S( G+ c' E  ~- ]
  183. mov al, 46h
    : x3 u0 I  m* f
  184. add si, 02
    6 W/ ~) o9 Z% Q# p  H, u$ j% b6 v3 C
  185. mov es:[si], ax: I. e: D+ I/ L1 E! W
  186. popa
    1 d: ]" W& S% |2 V5 J; w# z* x  ?
  187. cmp si, 1840
    * O  `; {: w& ?+ ~# X6 M) Z+ L$ u& _
  188. jae casekey* q9 y( X) I  a! @! g+ v1 n
  189. jmp testr; g- b# d* M* @2 Q1 ?  S
  190. / ^( C; I; l6 q
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    * F0 p+ `* L! S% f9 N) ]
  192.         cmp     ah, 01h             ;and return a error
    2 ~5 g) n1 E4 {' `5 ^
  193. je exit1
    6 \! T  d( f- v
  194.         mov     ah, 0ch             ;if press other key then clear0 h2 ~; ]( L/ ~% y1 P' n; q
  195.         mov     al, 00              ;keyboard buffer
      K1 }3 u& _7 G$ `+ o
  196. int 21h
    , h1 ^+ h8 _9 k* l: k5 b, o
  197. jmp casemo ' f( [+ S8 {$ o% {8 {
  198. : F3 `5 @' e1 j7 P
  199. errormsg:                           ;if mouse driver no install- j! ]0 {- p. a$ a4 E" w
  200. call oldint
    - m  N. W8 ]/ g' R. ]( f4 c$ d
  201. lea dx, offset emsg1 }( D# u- W: C
  202. mov ah, 09h
    * f; f9 E7 }# R1 ^2 H- B$ q
  203. int 21h* d* m, h, ~- @' E+ Q; z/ i
  204. mov ah, 4ch
    ' T* O8 I: C$ C$ F+ T
  205. mov al, 2
    % m- {1 K! X5 V) i  p
  206. int  21h
    + y2 M2 u( K! Z( v

  207. ( G! r" t1 o9 C0 \) s  ~
  208. exit1:                              ;error exit" r6 @( r0 p+ f; ^8 c  [
  209. mov ax, 0002h5 \- B, \4 Q9 X$ ]$ a
  210. int 33h
    + E# U7 r6 h% @1 @  ~
  211. call  cleascr
    ) V0 O" i/ u  c0 y, T+ c7 a. o+ a
  212. call  oldint
    ; e/ `' l* d# q( f. A
  213. mov ah, 4ch
    " Q9 w8 U5 ?9 L/ A6 |4 x
  214. mov al, 01" A  M, }8 i9 q+ L5 j$ M
  215. int 21h0 f" T6 T7 ]: k( y

  216. 2 D; T' _. j: t
  217. cleascr proc    near                ;clear screen& T: i0 Q* q* F+ x1 ]4 I
  218. pusha
    4 G# T7 g+ n- M: y
  219. mov ah, 06
    # s/ H% O% ?- m+ E2 A2 X
  220. mov al, 0% V% n" H. n+ z
  221. mov cx, 02 S% w- g2 k0 H
  222. mov dh, 24; r- J' e/ A; m7 f8 r
  223. mov dl, 79
    ) q, ?* |7 Q. L" e9 }0 ]8 P
  224. mov bh, 07h) i+ v2 p5 q" `
  225. int 10h! y0 |% r' K1 L
  226. mov ah, 02% ~2 B( w+ m5 Q( V6 a
  227. mov bh, 00
    7 ]: Q2 a$ N- ~9 ]' }; j
  228. mov dh, 0
    2 c# d8 b+ q% ]) S5 y% }
  229. mov dl, 0: v# d9 y- ]5 U3 s8 n
  230. int 10h" o5 K: N9 [& \& H( p. p" u9 \6 e
  231. popa
    ' o. {2 u$ L: R6 E3 x4 b
  232. ret$ x8 B- `" c" l
  233. cleascr endp( U8 @3 P$ Y8 f2 b4 m0 c

  234. $ E* \( D3 O7 S; n' y
  235. showmsg proc    near               ;Show info& h/ Z4 J0 E+ n
  236. pusha
    " L* \' R7 K; f% C6 p# f- X
  237. lea di, offset showms
    . U* R9 n& \4 s9 U9 f) L
  238. mov ax, 0b800h
    # Z+ f, X/ M: l/ X2 s
  239. mov es, ax4 I: `# |$ o/ u9 K
  240. mov si, 08 ?+ x3 t+ V# A& E
  241. mov cx, 480
    . _* W: l$ u8 Z$ B3 S
  242. mov ah, 07h
    ! N4 y7 R  G7 o' N" R
  243. @@:
    . }/ _7 ~3 H% b; ~
  244. mov al, 20h7 S0 r3 B# Y2 C3 I
  245. mov es:[si], ax1 m) u* T; k! a& b7 ?) w( c  l1 i8 L& ^
  246. add si, 2
    9 f/ A3 M' r' M. W
  247. loop @b# s2 @; V' ^1 S' P7 A: l8 j
  248. mov cx,8803 I, @( n3 k  w! t: p6 L$ {
  249. @@:
    " q! s% A" |( z. \* j' v4 y
  250. mov al, [di]8 B2 W9 i8 }: t- o3 X& K
  251. inc di
    . J, ?) I* s& K8 j7 R5 L% b
  252. cmp al,20h* p) K( h' [( p7 q( U1 Y
  253. je showch1* e- |7 ^. w* i: H' h
  254. mov ah, 17h
    - t7 |5 |& s* ~2 Q+ W! E. K
  255. jmp showch3
    . a5 m7 B$ }- k* `, H
  256. showch1:
    & m* n$ q0 e% f) Q+ ^( B" G
  257. mov ah, 07h " x& l$ L3 f3 \9 K) }6 m6 V
  258. showch3:
    : w; N' l3 U$ u. f( x# a
  259. mov es:[si], ax
    9 B5 \5 b! m! t6 o+ y4 |
  260. add si, 2
    5 f' H3 ~" ]$ X" }% `: k
  261. loop @b% B3 |: G) F3 V3 `2 ?+ ]  N* K% V
  262. popa
    1 W: s; Y% T$ H* s+ `! C2 h1 u3 w3 x0 a
  263. ret- |; P' Z/ {+ G/ D9 W0 \; Z
  264. showmsg endp
    # d# H8 `) C; M2 h. G

  265. - B9 X7 J; F6 L' G* Q: I' }
  266. oldint proc
    ) d  a0 s, \  @
  267. pusha7 F8 Z7 |3 q/ U4 J6 G% x& [* V2 L
  268. mov ds, word ptr cs:[old331]
    ! X% r2 n+ z- {  a- u
  269. mov   dx, word ptr cs:[old332]
    & c! Q& U) ^: ?, h: r3 h% T7 T/ `
  270. mov ax, 2533h0 [" \* @+ s6 `1 t9 G: B( K
  271. int 21h
    ( m5 {$ u: [# A& l) ~
  272. mov ds, word ptr cs:[old741]. d9 ?( i, l9 k: K+ T
  273. mov dx, word ptr cs:[old742]8 S+ h# ^9 P5 p
  274. mov ax, 2574h
    ' T) s- ~7 J( J; ~
  275. int 21h
    8 @' N& S( {/ O5 t+ ]% q
  276. popa
    " W, l5 j4 @, w$ e
  277. ret* J* E+ Y4 v2 m* z# f8 \1 P: y2 s
  278. oldint endp/ C# @' `+ L9 Y
  279. 1 v" e6 U2 ^4 c% ?' m
  280. memmouse        proc( A" z5 }" Z1 V' b5 J
  281.         xor     ax,ax9 k1 Y+ o/ _, w  C4 s' }1 w- i
  282. int 33h9 z1 l+ V& \: T% t
  283. cmp ax,0ffffh0 P2 O, }9 t7 u' z
  284.         jne     not_loaded0 i2 _( o3 D+ T; Z5 i7 g
  285. mov [memcopy], 1
    ! j* D: ^7 Z4 |& T  H# N6 c  ^
  286. ret
    8 E2 S3 @: r( s4 O

  287. ' f. I8 H7 x* h
  288. not_loaded:
    7 {7 V% B6 g5 i( V/ V; X" ~1 s
  289. 4 k' {  Y, P8 n; B6 ]7 ~0 O
  290.         mov ax,2574h
    % ~) s, ?. x2 T- h4 }2 R! [% M
  291.         mov dx,offset new_isr6 n- G( R7 B) g5 s
  292.         int 21h
    * L6 Y( L% w, y+ {
  293. . Z/ S( o& b% S8 ^
  294.         mov ax,2533h
    - G1 S! |) S  P& D
  295.         mov dx,offset new_339 Z* M" f/ n  m) I/ y" K4 a
  296.         int 21h
    . D0 y1 B% q" \
  297. 0 {( Z6 u1 a0 _' L$ {; f, C, u
  298.         cli
    ) [4 R) D3 |& ~# P3 F" h9 T
  299. % ~# U6 ~- g1 i3 Y+ Y4 v9 ?" I) v
  300.         mov bl,0a8h0 k! S; @; a# z' I0 V
  301.         call keyboard_cmd
    3 z" I& ^6 G0 ]0 g
  302. + S0 D' E2 p- o& K, a2 D, {9 d1 O
  303.         mov bl,20h
    0 R& ?( s! L3 w5 v8 p4 C. r
  304.         call    keyboard_cmd
    4 f$ ?. F1 b( h$ w7 p# \
  305.         call    keyboard_read
      W+ s2 z, b: \
  306.         or      al,2
    * S' i: T" C. p; {
  307.         mov     bl,60h1 J6 w1 r  U  H6 y4 x2 g5 Q
  308.         push    ax
    9 a. z; o; R6 c, |
  309.         call    keyboard_cmd! q  W' N- f. s8 `; {
  310.         pop     ax
    & I& E6 s, Y6 U2 C/ D
  311.         call    keyboard_write" f$ B/ E, W1 c9 R+ D# G, R
  312. 3 N# |2 s4 v1 M3 Q/ n
  313.         mov     bl,0d4h, c) U" }  A$ j8 N: Y$ o& D
  314.         call    keyboard_cmd, S; |: `2 d& J$ @+ J
  315.         mov     al,0f4h
    + Q6 f9 p" N3 i4 A5 [6 L8 U5 A
  316.         call    keyboard_write
    9 K( o# i1 Y1 M, G7 g$ |

  317. % Z7 }9 d; L& x2 @/ A6 l
  318.         sti
    " V5 C3 d, M2 v4 n7 M$ Q1 V6 c1 q8 Y
  319.         ret. \0 `2 a5 J+ m# @6 U* X( M
  320. call_user_isr:
    3 h0 t3 k8 b8 [) V/ J
  321. db      60h) _$ v' w7 K' }, u3 N2 d" ?
  322.         mov     cx,cs:[pos_x]9 |4 q8 O8 a+ g$ x  U" u
  323.         mov     dx,cs:[pos_y]0 C: W2 _0 t/ }- b/ V( [5 e; m, C
  324.         mov     di,0 ;cs:[x_move]
    & s# R2 o8 n" J; W2 e8 z/ Z- w: N' e
  325.         mov     si,0 ;cs:[y_move]
    1 O" w& Y$ x6 c( C! H1 K
  326.         mov     word ptr cs:[x_move],0% @0 @3 d/ [/ X4 M, J5 a. J
  327.         mov     word ptr cs:[y_move],00 Z. H1 z( K" H9 I2 T1 u
  328.         mov     bl,byte ptr cs:[buttons]
    % s8 d2 m% C! x9 m
  329.         xor     bh,bh6 W: e. [+ @' s$ _  b& B$ ^
  330.         call    dword ptr cs:[user_subroutine]/ ~2 V2 w& R2 K- o, l( a  e& f
  331.         db      61h
    ! ]5 r! e7 m( ]+ e* u
  332. ret. M6 d0 k2 C1 ~& I6 \# P( d0 T7 J+ E
  333. new_isr:% k$ U4 r- m' K' T" l) b
  334.         pushf
    9 _8 X0 x- i* Y4 d6 B' Y: h9 q
  335.         cli
    8 K* \7 f. G/ G- B& w/ O
  336.         push    ax) J' S/ l1 H3 f$ U# K: ^
  337.         push    bx
    * d* {# W( \- n  Q1 O! J0 S5 d0 _
  338.         push    cx& q" `+ k+ f. ^- f! |6 {* i- R
  339.         push    dx
    % S% U% F$ O0 j# H. R
  340.         push    di
    0 v  s% B2 h& v7 o3 D) n
  341.         push    si; r) p1 c9 @( G1 G' J+ ~2 ?
  342.         push    es4 {% w/ y7 H$ ~
  343.         push    ds5 ~/ q% h/ n# J/ J+ |0 i
  344. 9 c- I& N+ i0 f+ D6 m7 \5 Z
  345.         push    cs
    * }3 q7 }+ G- S
  346.         pop     ds
    % t, v# m, T* x! `3 ?- c- z

  347. 1 |- f: Y- [; E
  348.         mov     bl,0adh- x# @- ^+ Y: y# |: ~& Z
  349.         call    keyboard_cmd0 b/ b& |& j. b5 y/ L" ]( D, v

  350. - H8 }" _" b- w8 |. q0 M* ~
  351.         cmp     byte ptr [first_time],0
    % M% A9 n3 C% H, u: ?
  352.         je      not_first_time8 K8 ^& e" k  H* g' v7 f

  353. ) L( e3 [8 g6 l8 S4 ^7 E; I$ c
  354.         mov     byte ptr [first_time],0/ P  ]$ f% N! y* ?7 ?+ d% Z
  355.         call    keyboard_read/ `8 J" @; \% @0 \) u( W
  356.         call    keyboard_read& ?; r0 Y/ E: m( Z8 a# P6 V9 Z
  357.         call    keyboard_read* O3 R" Q! J9 U( {0 x, ?7 y) W
  358.         jmp     no_show
    # T1 j6 @7 i- ^2 S: K3 v, V
  359. 2 q, a& |9 `6 X8 j! Y2 ?  G
  360. not_first_time:( [. Y) R/ J& T2 ^/ p- N$ @
  361.         mov     word ptr [temp_mask],0: f7 ]# m8 Z5 M4 E0 ?/ [( I
  362. 3 l" G& i. \3 \( X& e- V
  363.         mov     cx,[pos_x]7 |' b6 U& L4 w' m8 l2 A8 a: K- y
  364.         mov     dx,[pos_y]$ j0 H4 T2 R+ ]7 r* a, y& T

  365. ! y3 f6 w* B% e. ~& d
  366.         call    keyboard_read
    & `0 P! n( s- o; i  d
  367.         and     al,7 ;3! g; {1 q" s- N7 W6 k
  368.         mov     ah,[buttons], \% |& d1 D9 Y1 J9 f+ E
  369.         mov     [buttons],al
    & M# u; m% y) f& ]
  370.         cmp     al,ah
    % T0 `' \: ~3 X! q" l
  371.         je      no_button_change
    # {, g: @0 l9 L$ l: n
  372.         and     al,36 y! p# Y1 A4 ]* ]& u( L* m  y3 r
  373.         and     ah,3) n+ |: {/ o* K0 J& Y+ Y
  374.         xor     al,ah
    % P  T/ B, {% ]; r+ o1 o
  375.         xor     bx,bx/ ]( ^% z' K* u3 X

  376. , h! ]8 \" m3 n
  377.         push    ax' y$ c$ ^2 J5 Q: ~3 g5 D
  378.         test    al,2) a' U7 x7 i0 Q& ^
  379.         jz      no_right_button_change9 F, x% f( }& L% w7 X  U+ d! v8 ^' s
  380.         and     ah,27 J- r7 g. k$ D
  381.         jz      right_button_pressed$ p6 d* b6 b' P9 U. f  j4 k
  382.         or      bx,163 z' Z; ~$ l# H* _# c0 q0 l
  383.         jmp     no_right_button_change" a. O$ l2 p. c
  384. right_button_pressed:
    7 b7 j# ~: l3 K# W: s0 f
  385.         or      bx,8
    5 Z' J9 u$ d  |4 m0 O  g& \
  386. no_right_button_change:
    , a6 n# ^' ]. [- N; ?
  387. 8 d5 w+ k' R6 E! g4 j
  388.         pop     ax- p- m0 Q$ R5 ]6 m
  389. 2 g0 g: X2 \" T+ q- t" d( g
  390.         test    al,1
    # P. \- w- a. |# b( p9 x5 v- _
  391.         jz      no_left_button_change$ K- y/ p3 v3 c4 Y5 h, ^: b
  392.         and     ah,1( n' l; C% ]& ?: R8 [
  393.         jz      left_button_pressed  F9 F" Z. q% m# M) P
  394.         or      bx,4' A$ o+ P* R, _4 {4 l
  395.         jmp     no_left_button_change
    1 A/ i5 J% i8 |4 h. l
  396. left_button_pressed:. P: [0 z6 k( G9 U2 n, c5 {5 v0 s
  397.         or      bx,29 ]4 L8 N8 q0 v# z+ b8 c5 S
  398. no_left_button_change:
    $ n8 O( o2 [( ?: J% S* S& a
  399. * h( f( p5 t9 J/ m8 f! ]  o
  400.         mov     [temp_mask],bx8 `- B  E0 S9 J& Q# e  E7 r7 D: [& S! H

  401. # d8 [( |- h* @: o, q) b
  402. no_button_change:
    + y0 R% T$ o1 ]7 \/ H& W
  403.         call    keyboard_read) a  ]" Z$ K9 y; d
  404.         cbw
    & K5 I* q. U% E/ z& M# O; n) |
  405.         add     [pos_x],ax% \  W, ^2 m8 L! k/ u* M
  406.         add     [x_move],ax7 i0 [1 z) o# T8 A! n2 {- S
  407.         mov     ax,[x_min]2 v9 A" t% D7 P5 C4 t5 c2 s8 @
  408.         cmp     [pos_x],ax( B3 ^- F/ I$ E# q) I5 L8 S
  409.         jg      good_hor1) _* Z) ^. S. i& Q6 x$ `" u0 z2 t
  410.         mov     [pos_x],ax. y1 y7 X$ p+ d: F( Y1 x- `  Q
  411. good_hor1:) {/ ^! I! g, ]) ^! t
  412.         mov     ax,[x_max]: p7 f; X. \" k1 B5 v
  413.         cmp     [pos_x],ax
    , s2 H: {$ J; Y8 a6 }
  414.         jle     good_hor2
    6 |6 w8 [  R3 E
  415.         mov     [pos_x],ax
    0 c& K9 y" j! x/ I3 {
  416. good_hor2:' f9 W* f& u. E) c. m! L
  417.   q0 \" A. l# I* O
  418.         call    keyboard_read
      d% o  T2 F/ K/ |( u
  419.         neg     al* u% m8 {3 k- H0 d' `; p$ `
  420.         cbw
    2 \( B" G: l" J6 C2 d+ x9 E/ R
  421.         add     [pos_y],ax
    5 @, `( ?+ R( c9 w
  422.         add     [y_move],ax
    . M8 M# }  q& H! B+ P6 A! g, `/ y
  423.         mov     ax,[y_min]8 y2 k5 g" w6 k2 l
  424.         cmp     [pos_y],ax
    ! q# S( t' I) P4 [2 w
  425.         jg      good_ver1
    + Y. o  @  u) F7 [
  426.         mov     [pos_y],ax
    ' j, l$ ]' }5 w8 H3 u0 l! _
  427. good_ver1:
      n' v# R) V5 D7 l
  428.         mov     ax,[y_max]) {+ x- I3 S& t9 V7 U! I& d
  429.         cmp     [pos_y],ax
    ) q0 {* M* X) i
  430.         jle     good_ver2
    1 B4 B1 N; w1 _+ n$ c
  431.         mov     [pos_y],ax
    . g& G( d, C0 \& E: ?
  432. good_ver2:1 f1 A; b7 ]- g7 h! E
  433. 0 {! V: G& F% ~9 U( x) |
  434.         mov     ax,[x_move]* r8 c: E$ D( P  d2 V6 B% Y
  435.         or      ax,[y_move]
    0 j7 |) z( y4 U2 K3 L+ S/ k
  436.         or      ax,ax+ m/ ~8 `0 f) ]) w: S
  437.         jz      no_change_position
    7 x+ m5 l% ^: L. d7 S
  438.         or      word ptr [temp_mask],1* d: G: @9 _. K& H3 z9 K
  439. no_change_position:
    ( ^3 \7 M1 o6 d9 A7 Y" [

  440. * n5 O4 Q( \; w3 E0 f
  441.         mov     ax,[temp_mask]
    5 Y- {# U& c- E( Y" N! }
  442.         and     ax,[user_mask]% t( `; D. G, O& w
  443.         jz      no_call_user* B- B4 G! m5 Q
  444.         call    call_user_isr
    % `  Y$ h- w5 t% O  V
  445. no_call_user:& S: ?2 ?; Y+ K
  446. * b' t( `0 M- v8 o7 {4 P+ M4 y% J, o, `
  447.         cmp     byte ptr [sm_flag],1
    # y- D0 \  f8 |% W4 t3 }9 }
  448.         jne     no_show
    % o( p+ f! q2 x2 `1 Q/ I
  449. 7 A0 ~$ r( g5 ~0 b* x# s
  450.         shr     cx,3
    5 }0 W7 z7 q: q2 c# T* l
  451.         shr     dx,3
    4 ]/ @3 L1 _2 r; ~5 k4 y
  452.         mov     ax,80, h  \& ^5 A3 E0 T& e' r! c
  453.         mul     dl: _% e6 W& Y9 ^; o
  454.         add     ax,cx: Y5 p  M! s2 x
  455.         shl     ax,1. l% O0 a6 z+ m3 v
  456.         mov     di,ax: v8 ^, o% _/ {2 r
  457.         mov     ax,0b800h
    & u& z" \- H; r# M6 z- o: c+ J, N7 x
  458.         mov     es,ax* C3 {' `2 v! X. [' M" y0 `( w
  459.         mov     ax,[save_char]4 K9 E. s$ n' x/ V' p5 l. e% y. J
  460.         stosw) j* y2 u8 n6 @! s  G

  461. : z$ c+ R) f* L7 P: b# f
  462.         mov     cx,[pos_x]
    ; n: z5 x" G7 P4 R7 l7 Y* M
  463.         mov     dx,[pos_y]
    9 y3 C8 g7 U7 ?+ k- L  F/ j! l
  464.         shr     cx,3) ?7 x! g0 D, Y6 a
  465.         shr     dx,3/ {, _9 K+ _# k! I2 j5 B
  466.         mov     ax,80
    , q  N# h, s+ r) j. U9 e* |
  467.         mul     dl4 `/ D/ x; k, J, K. y
  468.         add     ax,cx: s, b$ w- b" z9 e
  469.         shl     ax,1
    / ]$ i% m5 i! ]: }# ^) g* @
  470.         mov     di,ax. M& F. Z# }, n
  471.         mov     ax,0b800h
    6 }8 ~$ T5 i0 `- F( z) i
  472.         mov     es,ax
    9 o. b8 Y8 M, e9 O1 n" p2 c5 [! {
  473.         mov     ax,es:[di]
    0 x1 J' e3 f  b1 l5 R6 V
  474.         mov     [save_char],ax8 j/ R  o0 p; @0 s
  475.         not     ah  E( C) P. v- `, |: V; b4 ?0 `8 V& N1 }
  476.         and     ah,7fh. W, m0 v' R" a' `7 }2 Q
  477.         stosw& J; U5 j7 j% F% b+ J
  478. no_show:
    % L& v8 s( Q* d% c: k
  479.         mov     bl,0aeh2 g/ }! U5 n* g
  480.         call    keyboard_cmd
    + m. Y5 [' M# a1 p0 O, X

  481. # V0 M: N! R7 Q6 Q0 x4 w
  482.         mov     al,20h# \( W3 D! d2 k
  483.         out     0a0h,al' V* g: s2 g( K( N
  484.         out     20h,al
    $ W( u7 L) M1 m" h2 R( F( i

  485. ' n7 F8 T4 h7 e& A% }
  486.         pop     ds
    2 r7 G: M5 p" i- T
  487.         pop     es
    / J! t  m) E# b
  488.         pop     si
    ( ~" r9 p: A: j: ?& Z
  489.         pop     di
    5 ~  A" H2 O6 H( G' x, ~8 X
  490.         pop     dx
    * L( M" {" C. W) E& f
  491.         pop     cx
    2 S4 c  h1 J! J& Q9 P
  492.         pop     bx
    * x# H. D, ^- K4 q0 }. m1 P
  493.         pop     ax
    * B( r: H" ^4 P# l( @+ g3 v
  494.         popf3 y8 s' Z! O# K; Y2 U9 g
  495.         iret
    ( L' D3 o7 ?0 y6 l3 h+ z
  496. 9 ~5 n1 Z0 P- R+ T0 C( F" I
  497. first_time      db      1* p  x5 Q1 t. T$ k" N
  498. buttons         db      0( G8 C+ i  u/ c
  499. pos_x           dw      0
      c. p) E! c) S2 U' U7 b' W5 @/ s
  500. pos_y           dw      0
    & N* t+ }! M  o' Y* d
  501. sm_flag         dw      0
    ! ]' D  f8 A( ?$ Q
  502. save_char       dw      0
    " G7 b. `6 J; ^# _" U6 ~  H
  503. x_move          dw      00 _) e! @. V, G/ t2 e  m6 r8 {
  504. y_move          dw      0
    : P  m& Y9 b, o) b. B* r  x; y
  505. x_max           dw      6394 s0 O2 M% o0 ?/ y  G+ T
  506. x_min           dw      0
    9 w1 Y. L& I: ]: b
  507. y_max           dw      199) D* p+ r1 k9 B% t
  508. y_min           dw      09 d5 L, B9 r# K1 t, ~7 a  q7 U2 F( _
  509. user_subroutine dw      0,0
    % B1 P0 I7 c* z7 q  L1 M
  510. user_mask       dw      03 l7 m9 a& k6 O
  511. temp_mask       dw      0
    + {4 S1 U7 W* I6 h3 |5 ^- n

  512. : z) }( X7 l7 u9 p0 Q  n6 M
  513. keyboard_read:2 @" c: v" M, I
  514.         push    cx7 b" O! Q: t% k; r" D$ [, B' X
  515.         push    dx: m; [& o, d; Q% h" E
  516.         xor     cx,cx& [2 k5 V$ A" f! K9 Y0 m
  517. key_read_loop:% ?! A% q4 B. ~
  518.         in      al,64h0 v- f. J" }$ G1 X5 M6 a
  519.         jmp     $+2
    5 B& W7 l8 V+ S# a3 s8 n0 K$ @) a. t
  520.         jmp     $+2$ b8 v; a2 |: u% b. C
  521.         test    al,1! A( d3 }  r1 D# e0 v! Z
  522.         jnz     key_read_ready
    ; Z8 @$ ^- K4 t. {' R5 y
  523.         loop    key_read_loop
    9 q3 L8 X$ U% s8 ~
  524.         mov     ah,1
    , H: f/ Y! T  {8 ^
  525.         jmp     key_read_exit
    3 d& H0 u9 J1 k
  526. key_read_ready:
    ! _2 p  [6 Z, \! Z
  527.         push    cx; u! s0 _* i4 G4 ~( L2 I; m
  528.         mov     cx,320 Y. s3 \: A0 g+ V
  529. key_read_delay:5 U, h" T3 u* O9 g- W- y
  530.         jmp     $+25 F! |4 Q5 B- t8 P5 b
  531.         jmp     $+2
    : Z* e. w# ^1 C; p- K& ^' ^! `
  532.         loop    key_read_delay
    9 P0 o, Q; F7 Q; r

  533. / }% O3 e& p5 Z0 k' s
  534.         pop     cx
    5 t3 {% z& z! P, `: Z( y' Q
  535. $ k  p8 }/ l' e9 S8 J' \
  536.         in      al,60h( w: F# Z& @% M, ?
  537.         jmp     $+2  z9 f( f9 A4 ~
  538.         jmp     $+2
    ! S7 T) O4 X0 t9 p4 a7 l
  539.         xor     ah,ah
      x" M/ |7 N" X% H8 B" R8 _
  540. key_read_exit:. _/ r0 H# e3 d7 D0 ~  |' `
  541.         pop     dx; Y) L# O! \% l8 W! e1 F8 J
  542.         pop     cx# d( ]5 C6 i( ^1 q1 l, P6 `6 L5 K
  543.         ret7 _/ A' @2 j6 @! ?; h2 f5 ^8 a
  544. 4 ~# q& O8 u" f  T2 G7 L
  545. keyboard_write:
      ^( u9 S% N, t9 H3 [7 o' O
  546.         push    cx
    ( H; W' U5 x2 V3 V1 N9 Q: X1 m
  547.         push    dx7 u) S$ c& I0 S$ A" Z9 L7 E
  548.         mov     dl,al! E. M" @- c# g. @7 x
  549.         xor     cx,cx% J" h% s3 H& X- A: S* c
  550. kbd_wrt_loop1:* U. {# Q* R3 M
  551.         in      al,64h
    9 c1 h& d( }) H' S# m( `3 U
  552.         jmp     $+2' U2 p, f% T7 V/ d7 k! F/ d7 m
  553.         jmp     $+2
    8 H; U% d* J( E% i5 ~' J5 ]# ]
  554.         test    al,20h& c3 S" x' o+ w! n; W
  555.         jz      kbd_wrt_ok1
    , t+ L. K7 Q4 X, E! v% j9 A2 \
  556. 2 l( W, U$ O( T' |6 h
  557.         loop    kbd_wrt_loop1
    3 W, e% l# v; v
  558. . F7 ~" Z8 R5 p
  559.         mov     ah,1
    1 U; T: S1 q2 a$ m3 S6 O
  560.         jmp     kbd_wrt_exit4 o9 j7 p+ k, m2 x1 @4 v
  561. 0 Y2 H8 L$ I0 m. i+ U
  562. kbd_wrt_ok1:
    1 o, O" q# Y! g/ w4 X
  563.         in      al,60h; ^0 m2 R4 T; M& D: j

  564. $ V6 x* c0 u# N& M# |
  565.         xor     cx,cx9 H, _% Z0 }4 U% [, N3 P
  566. kbd_wrt_loop:, i3 ~/ [. @' H# x
  567.         in      al,64h; e. W# d" C! U5 c. K8 \
  568.         jmp     $+2* x& H3 P- ^) u5 A9 u. e
  569.         jmp     $+2, }" n8 {; {; M' o3 Q, i4 E
  570.         test    al,23 c' D# M- ]* @( E4 m- x6 D
  571.         jz      kbd_wrt_ok
    # ]; f0 f0 p. H. W; a
  572. . w" E* `$ R8 n8 V$ R
  573.         loop    kbd_wrt_loop
      x( ]1 @1 L; A3 Q3 U

  574. 5 @7 j1 w, n/ @) x% \- F5 C7 Q
  575.         mov     ah,1
    ; E- F7 K" g* t3 ^- O
  576.         jmp     kbd_wrt_exit
    6 c7 l, [) ]3 `( {/ p& R

  577. ' f8 ~! g3 k7 n# e. f, O# ]" M/ }
  578. kbd_wrt_ok:3 h2 {4 k0 r* W/ W7 Z
  579.         mov     al,dl& G$ ]( T' a0 Q* E
  580.         out     60h,al
    - v9 x; ^: z% R7 `( f& X& B8 F2 m
  581.         jmp     $+2
    2 {: \7 M9 c( W6 a* J' F
  582.         jmp     $+2( r  M$ u% o: r

  583. 4 D* O( L/ S9 N, Z/ N: _# ]5 c
  584.         xor     cx,cx
    / I, S+ U: a7 Q
  585. kbd_wrt_loop3:
    . h. D  }, k! k6 N
  586.         in      al,64h
    1 i3 x; s% ?, _. ^0 _
  587.         jmp     $+2
    8 k. j4 ]/ n2 ]2 d) Y; f0 K; Z( J
  588.         jmp     $+2" g' t8 R/ f# s1 r$ q. d0 x
  589.         test    al,2
    + r2 j- c7 @2 n* q$ G
  590.         jz      kbd_wrt_ok39 o% d6 m* g. N

  591. : n% j: \2 B5 H; D  }, u" D
  592.         loop    kbd_wrt_loop3
    ! Z% Y9 n9 d7 C9 K

  593. 1 g3 P! n, e! Z3 s, s3 t2 W8 f
  594.         mov     ah,1
    6 l5 e8 {' m+ `4 }  C8 t* L/ b
  595.         jmp     kbd_wrt_exit+ I8 Y3 C9 w* G" E! U2 s- _
  596. 3 l; X8 V+ H( W& |: ^) g
  597. kbd_wrt_ok3:
    , M( i% U0 N  q" [9 g! _3 |7 E3 _! ?
  598.         mov     ah,8, A; D( e6 ]/ ?" H. N9 e
  599. kbd_wrt_loop4:* @0 R- u( f# H$ v& c
  600.         xor     cx,cx# L, S  L. z5 B: G5 r' k
  601. kbd_wrt_loop5:
    . S/ X" f' `% U' U) b
  602.         in      al,64h, V' x6 n% {1 p1 _0 R: e" k. ~9 r
  603.         jmp     $+2
    ) E: \! s& U! a
  604.         jmp     $+23 t. M1 `# W* G) ~
  605.         test    al,1
    / W: i4 ^1 I2 T7 u5 n. N
  606.         jnz     kbd_wrt_ok4
    * i  {* F1 V& M+ J( c  A  \

  607. : N; z. Y1 S; d) F. P
  608.         loop    kbd_wrt_loop5* P6 A2 x- Z' ^: e/ e6 S

  609. 2 S8 `- D' H- F& C" [
  610.         dec     ah% D* u+ c9 f; d+ m* f3 J
  611.         jnz     kbd_wrt_loop40 U4 X5 `: Z) X7 R3 a0 m8 b$ l

  612. ! M$ f+ I+ L( N9 s( [% m/ g
  613. kbd_wrt_ok4:: a( w& e5 d' k) h/ q' M7 ^
  614.         xor     ah,ah
    0 z- |# x$ u+ w/ v; L
  615. kbd_wrt_exit:' `  |/ N, `6 p/ o' Y
  616.         pop     dx/ X. n9 A) p$ J" N2 E$ S' Z
  617.         pop     cx* X3 ^* v/ ?5 n
  618.         ret
    ) h8 g; _" x+ R6 M
  619.         # n2 {- w3 J0 Z- z% S# c# F& z
  620. keyboard_cmd:
    : y' |% ~5 O5 F  p! Q) d0 Y2 T
  621.         xor     cx,cx/ y3 U# h. `0 ?* l; Y
  622. cmd_wait:7 _. y- S- M  P
  623.         in      al,64h$ M* S. A$ z2 a$ N& M( @- {  C% O' P
  624.         jmp     $+2; S. c& b- s1 z
  625.         jmp     $+2
    ; [' P, U0 A; Q' a; g! p
  626.         test    al,21 n! N' x7 j% Y! l
  627.         jz      cmd_send( g+ D4 E! z- L1 C
  628.         loop    cmd_wait
    1 ]* b5 O- m4 [. X9 }& T, r' f) _

  629. & @; R  c7 O  \7 \$ F+ A
  630.         jmp     cmd_error3 V) g; l/ v5 M& }! U
  631. 8 S9 f# Q* U- S! O8 c* K4 q
  632. cmd_send:! J4 S% n& ~: S4 A; h1 V
  633.         mov     al,bl
    0 z7 e5 ^9 ^$ F% ?; G* X. ]+ _- f; B
  634.         out     64h,al% m; J$ j" g$ E9 Z( W, C
  635.         jmp     $+2
    ; W3 e5 s" N9 X" }' _8 u/ K! l
  636.         jmp     $+2% G' X/ R; H- }; H. [- w

  637. 9 [$ a! ]! l3 ~$ m6 R5 H/ g
  638.         xor     cx,cx
    ! _* N! j! k% Y4 o2 u& k
  639. cmd_accept:
    : ]& K8 _9 M) i) n
  640.         in      al,64h- W, ^& B4 U* {+ `* g
  641.         jmp     $+2! a! U, ?0 b% w$ c  `. p
  642.         jmp     $+2
    ( M" I5 r: T9 q! b/ H0 F+ i
  643.         test    al,22 Y& k0 V6 p3 ]: E7 `
  644.         jz      cmd_ok
    & R9 s& h6 X# M0 J" e: K/ k
  645.         loop    cmd_accept, w2 ?! i; M# {0 k8 k' c2 ^, R

  646. ' e7 j7 ?9 I$ Z
  647. cmd_error:: p- s  C4 a4 q& Y. W
  648.         mov     ah,1
    6 @* N" |+ v1 {2 ?; Y& K) m* B
  649.         jmp     cmd_exit6 P( ^# V, s$ c4 I, O1 z9 ^
  650. cmd_ok:
    & D& k' v. v1 [( ?
  651.         xor     ah,ah; z1 ~5 ?+ V5 S: W& j
  652. cmd_exit:; }: x" h% W, R+ _1 C
  653.         ret0 ]* f4 \! Y" A" l& w

  654. , p( p! b8 _0 X1 K
  655. new_33:: W5 i5 E- j0 L- u7 b" _8 C2 e
  656.         cli
    0 ]0 k! E/ l2 a% @  _7 M$ G
  657.         cmp     al,0
    - ?5 E/ Q* ]4 m+ K& ^2 H
  658.         je      reset_mouse
    7 `# n" n9 N- k3 L
  659.         cmp     al,1& o( f/ |0 d2 z) j' h# K- z
  660.         je      show_mouse
    2 b; e" x( V1 M
  661.         cmp     al,2  Z6 A1 L  {+ P' r1 b1 ~; Z
  662.         je      hide_mouse2 p- v- x# f8 u- g! B  l1 }# K
  663.         cmp     al,3
    $ Y9 m% L9 _$ E$ g  _6 A9 j) W1 K
  664.         je      get_pos: V/ y2 m( h9 O* G
  665.         cmp     al,4) e" Q1 ?% p& Y0 M  E" Q* y" d, K
  666.         je      set_pos
    # v% ~9 t! R9 ^- S: [6 h" B% O
  667.         cmp     al,7& i/ c1 w$ X3 `# o
  668.         je      set_hor_pos
    8 U& p* C7 V# J' q
  669.         cmp     al,83 P4 C. U% z3 f! c
  670.         je      set_ver_pos7 L. D; l! q) c% v; Q3 T( C
  671.         cmp     al,0bh
    : A" X* A" x+ s$ Z0 w, x
  672.         je      get_mouse_movement
    ! z- \% e' Q* K2 l& r
  673.         cmp     al,0ch
    4 G1 f7 {0 {) |: @9 t; U
  674.         je      set_subroutines6 K* g* \- _! I0 s) h/ S* \
  675.         cmp     al,14h
    * ?( Y) O" Y4 `& a
  676.         je      swap_subroutines
    / [. ]( `% w; C; w! b) v/ T
  677.         iret
    + K7 F7 S1 |3 m
  678. 4 F# M' H! Z; q: ]
  679. reset_mouse:
    $ @- M! i4 d% f) g
  680.         jmp     _reset_mouse) L1 Q0 v8 B6 _
  681. show_mouse:) g5 n* E; A& v$ o- P5 k
  682.         jmp     _show_mouse
    8 @3 N; G; Q; \5 i6 P8 ^
  683. hide_mouse:6 U" S3 y: O8 l9 S/ J. m0 X3 j5 ^
  684.         jmp     _hide_mouse
    : Z0 v9 y1 A" D. f
  685. get_pos:
    1 V, p) L0 Q9 b
  686.         jmp     _get_pos  T) g) z7 d3 q" G$ J
  687. set_pos:
    * t6 R2 N- T  B7 N, r
  688.         jmp     _set_pos7 S5 ?7 Z, T" R; l0 w
  689. set_hor_pos:# ?! ]. f! J5 b$ ~9 `# G
  690.         jmp     _set_hor_pos6 `  u& J/ Y* `; N
  691. set_ver_pos:: A9 w$ x' I+ `$ I9 r+ L1 M
  692.         jmp     _set_ver_pos
    8 q/ k4 J. ?) \- j, z
  693. get_mouse_movement:9 e; S- n' R% d( s. m8 n7 j( V0 U6 a" l
  694.         jmp     _get_mouse_movement
    4 t& _3 M' ]) i: C! P) {4 K) d& n
  695. set_subroutines:3 v/ |  J. p' B" y: z
  696.         jmp     _set_subroutines( j( H, W: y  H3 \( H
  697. swap_subroutines:* f3 m. R% M; r* \; l/ Q7 B; m
  698.         jmp     _swap_subroutines
    7 N7 b% t) \1 x0 [7 ?3 H. S/ }& u

  699. % _! G0 o7 z+ V4 @) d1 g
  700. _reset_mouse:
    % R( \0 ]9 v. Z  Q
  701.         mov     byte ptr cs:[buttons],0
    $ \5 q9 t- ^" V$ F: E+ N4 t
  702.         mov     word ptr cs:[pos_x],0
    # ?3 |3 q3 J. f" b) l
  703.         mov     word ptr cs:[pos_y],0
    / t/ Z2 D# v, m/ K
  704.         mov     word ptr cs:[x_move],0
    6 i% ^% y" a$ a% `! t7 a
  705.         mov     word ptr cs:[y_move],0+ s$ ~: X" M9 p
  706.         mov     word ptr cs:[x_max],639
    ) k- b, D0 y' Q; N# D' _* i8 l
  707.         mov     word ptr cs:[x_min],0
    . L6 y! z% |3 A7 I5 C# G. _6 [1 Q
  708.         mov     word ptr cs:[y_max],199* `0 r" [0 W3 D3 P& v
  709.         mov     word ptr cs:[y_min],0
    1 S  F3 o! F) [1 O$ T* T9 j# @
  710.         mov     word ptr cs:[user_mask],0& h% o5 r$ i% s/ Z  Z, J
  711.         mov     word ptr cs:[user_subroutine],06 n5 {- ?. T1 Q4 J) |
  712.         mov     word ptr cs:[user_subroutine+2],0
    * O+ }2 H. R) {5 j
  713.         mov     ax,0ffffh: M. Z/ u2 D3 i+ {
  714.         mov     bx,3
    , t' ~! Q- v) P  u- ]  K
  715.         iret4 G! p/ J( l7 q& c( V% O$ _! H8 X

  716. 3 S3 J/ O8 x5 {5 Q: y+ x
  717. _get_pos:
    ' q+ n6 k, x2 X. r5 s% _: e! j
  718.         mov     cx,cs:[pos_x]. w. {& f0 q9 U0 n( g
  719.         mov     dx,cs:[pos_y]. J7 U+ J/ e( X# D7 A4 G: Z
  720.         mov     bx,word ptr cs:[buttons]* D% G: i1 J4 i+ E
  721.         xor     bh,bh; Y% E4 V! C. P. Q7 a
  722.         iret" o8 D; c) M$ x$ ~; T) n$ s# F/ N

  723. 6 i# X' R4 D* a) Y: G9 k
  724. _get_mouse_movement:6 b2 l. C  T5 Q; N4 \1 k7 j
  725.         mov     cx,cs:[x_move]
    - z$ U& o2 ^6 f& F8 v  ^0 [
  726.         mov     dx,cs:[y_move]7 }  j5 b& O; l% m
  727.         mov     word ptr cs:[x_move],0
    ' j8 K' B$ U: |" H/ n9 s1 r
  728.         mov     word ptr cs:[y_move],0
    8 c0 O. w1 v0 `6 P8 {0 Y
  729.         iret
    " e4 K; x; n# \  M

  730. 9 `% g% ~, r  I' r6 F  ~
  731. _show_mouse:, S4 k9 w* `8 a6 o
  732.         push    ax
    6 {7 r+ h, X% _, b  B7 Y
  733.         push    bx
    - \- s* v8 ~- T% \" Z
  734.         push    di
    0 v4 Y' x8 m( y; L5 P
  735.         push    es
    ) T! d7 t+ i5 N8 w
  736.         mov     byte ptr cs:[sm_flag],1
    . n% W3 j$ r5 \: f
  737.         mov     ax,cs:[pos_y]
      k3 a, I8 T( ?' R7 M& t
  738.         shr     ax,3
    * L! T# P5 e/ I( G- J! n0 h- U- k2 S
  739.         mov     bl,80% G: P+ B6 @3 ]% t% o
  740.         mul     bl: D# J! o; L' ~8 [% z5 y1 @
  741.         mov     bx,[pos_x]1 j$ x" q" l1 w
  742.         shr     bx,3
    ) e7 u8 [+ A' R1 i# q0 T
  743.         add     ax,bx1 v: H2 ]8 ~8 O( X3 T
  744.         shl     ax,1' z( _7 m* x# n+ t
  745.         mov     di,ax4 l3 K; `6 o- }3 V4 Z
  746.         mov     ax,0b800h
    / u8 _0 |' ]2 @8 V. G  A  G1 Y4 F  B
  747.         mov     es,ax9 [, [7 i9 B0 q; ?# {% k7 h
  748.         mov     ax,es:[di]% A2 D5 F  q- f% K2 B8 \6 Q
  749.         mov     cs:[save_char],ax
    9 g5 c& v$ ]) Y3 g5 m" @# P6 D; X
  750.         not     ah( }! z4 c6 |% r  V3 x7 ^( O) ?
  751.         and     ah,7fh
    1 p$ I/ j+ x1 ~  L; t
  752.         mov     es:[di],ax4 j. s7 z9 j9 q; ?7 Q
  753.         pop     es! N3 v! s+ r& V7 x
  754.         pop     di
    0 c6 \- U) R( G& V% e: i
  755.         pop     bx
    - L& h) n& a+ k  T- J% S
  756.         pop     ax
    / b2 y/ H1 }6 m8 E, O3 I1 R3 v
  757.         iret5 K+ }0 K0 @$ e( W& q% Y
  758. ' m8 ?6 a/ i3 J
  759. _hide_mouse:/ {/ q9 \+ k' }( f! @
  760.         push    ax
    ) B! {6 O1 J" O" D4 l1 o/ t7 d
  761.         push    bx
    5 V& Y0 J0 N: s8 a
  762.         push    di5 v/ P- L- B8 f5 r. z. O3 {
  763.         push    es
    5 s" o+ T2 L% d8 J
  764.         mov     byte ptr cs:[sm_flag],0
    5 g- Z; ^1 |5 s3 v7 w
  765.         mov     ax,cs:[pos_y]
    6 `, V4 c& o$ E  j8 f7 ~; @
  766.         shr     ax,3. `) p- N3 z1 v1 P
  767.         mov     bl,80
    ! b% S' U0 s7 b2 u, f( K
  768.         mul     bl- O, L2 C: n4 V( N. X
  769.         mov     bx,[pos_x]2 B: n8 ~5 X, J( {) Y" g5 m# V
  770.         shr     bx,3
    5 S) p$ d3 E( g2 @, L2 I
  771.         add     ax,bx0 T/ F. l( w4 q6 V% U) S
  772.         shl     ax,1- x, a! o% V5 k2 ^) Q  g! ?5 f$ ?' B
  773.         mov     di,ax
    / U+ m7 e. I9 I2 W! ~
  774.         mov     ax,0b800h+ H; n) w/ R8 G8 J# E' s& ]
  775.         mov     es,ax
    : b" r3 P+ j; d0 G
  776.         mov     ax,cs:[save_char]
    2 y! o" c4 y: ^
  777.         mov     es:[di],ax
    ) J1 i; b9 l- L0 l, }: w  ]* t1 Q
  778.         pop     es
    $ ?  m/ i: ~" l
  779.         pop     di; ?2 U9 L( Q/ U" H
  780.         pop     bx1 u. t- h$ }4 ~: \* o& _
  781.         pop     ax0 a: O4 k+ T+ w1 Z3 {
  782.         iret3 C8 u0 f+ B- r. @
  783. 5 e7 ^9 y; p$ H( @5 g
  784. _set_pos:/ `6 _, p& k& T$ a5 z/ l, J
  785.         mov     cx,cs:[pos_x]
    & r6 L/ r4 f9 t4 Z
  786.         mov     dx,cs:[pos_y]8 b( ?8 a; z+ [1 ?
  787.         mov     word ptr cs:[x_move],0
    & k, R5 Q3 q+ S  o
  788.         mov     word ptr cs:[y_move],01 a5 A1 h8 @. G2 c: `0 ~
  789.         iret1 d( r# D: s" q" T- c) n

  790. 4 s9 p3 K( e# k
  791. _set_hor_pos:1 T9 \# D9 I5 N# V
  792.         call    max_min
    5 J+ Y( |! V, Y3 e) ^# k6 C1 _
  793.         mov     cs:[x_min],cx* y3 o3 \) S6 h" I1 S
  794.         mov     cs:[x_max],dx
    ) r) I9 [* Z/ H
  795.         cmp     cs:[pos_x],cx
    * h9 ~3 n* \! D
  796.         jge     good_hor_min
    , E/ ~" p3 M; W/ j7 N( k( N
  797.         mov     cs:[pos_x],cx
    6 W; U& f2 M1 q: T0 Z. c( Y
  798. good_hor_min:
    # T/ r" K# ]  `0 h
  799.         cmp     cs:[pos_x],dx
    6 Q% W: }6 h8 s6 L
  800.         jle     good_hor_max8 {( C' Q5 X) _& S( o9 S
  801.         mov     cs:[pos_x],dx& P% e7 r4 `* @# H+ B- B- z- o
  802. good_hor_max:
    , h6 n; o! K( _
  803.        iret6 e  n& Q3 D6 K: F

  804. 3 Z" }, i; N) O! v
  805. _set_ver_pos:+ ~# B  @+ R! W% ]4 h
  806.         call    max_min
    ! _# T8 ~& M) b# e) {( @* s5 E1 P
  807.         mov     cs:[y_min],cx! s2 Q1 Z) ^* `- z" r
  808.         mov     cs:[y_max],dx+ h; _% _" e8 @4 t) J' X
  809.         cmp     cs:[pos_y],cx
    4 V8 e0 l! H1 i) i6 U* A- B
  810.         jge     good_ver_min: H! r5 \. J& e; }7 f+ _
  811.         mov     cs:[pos_y],cx, k5 y. D0 x) l, s& w/ f
  812. good_ver_min:5 ^/ q; w. B: A
  813.         cmp     cs:[pos_y],dx0 ^6 k* v% n6 i8 R1 l
  814.         jle     good_ver_max+ v% Q: E. j; J6 h# g9 G2 d6 n. {
  815.         mov     cs:[pos_y],dx/ x& x+ y( c. W! O3 U. E% J
  816. good_ver_max:; g+ a$ ~9 `3 g) H% U" L! _# ]
  817.         iret( |. ]( \; P/ B( m! D+ ^

  818. ) ]( F: a* k- @5 n* e2 I( l
  819. max_min:
    : m. ^$ e7 z  X: h- E3 L2 g
  820.         cmp     cx,dx; |4 J7 W, J$ W
  821.         jle     no_swap
    : u: k: A& }) u/ u
  822.         xchg    cx,dx/ N! ?7 x1 ^# `- S4 _) W
  823. no_swap:
    0 g, T) r! b& z- Y2 Q1 ~# ^% q2 [
  824.         ret- E& F+ }5 U. d' |7 h  p

  825. ! j9 p  C1 x2 x* {; m$ r
  826. _set_subroutines:9 @( ], i( B, O+ L0 q( U7 @
  827.         mov     cs:[user_subroutine],dx2 |, f0 k& W7 N+ B
  828.         mov     cs:[user_subroutine+2],es7 P% U/ X# A. U' j* ]0 C' Q
  829.         mov     cs:[user_mask],cx# y* v& @* x3 g7 n0 z) m# O
  830.         iret( N1 k6 N% {/ w* j3 B( [
  831. : g) k% B/ |% E0 T
  832. _swap_subroutines:( E% w* Y# r4 ^* \7 q
  833.         push    word ptr cs:[user_mask]
    * N9 p$ ]9 t% V3 {4 X" Y
  834.         push    word ptr cs:[user_subroutine+2]
    2 m; `  ~! a" C4 ]6 N* t
  835.         push    word ptr cs:[user_subroutine]
    0 Y, X3 l$ l1 _  b" o8 z# C3 r
  836.         mov     cs:[user_subroutine],dx0 u2 P  k5 ?* S  F- ]( [& o) C/ S
  837.         mov     cs:[user_subroutine+2],es
    * i5 y$ l2 V2 E) Y8 i! D
  838.         mov     cs:[user_mask],cx
    " F1 T" Y6 W, n; }% j, ?
  839.         pop     dx% _8 m( A; L# L; N/ N
  840.         pop     es
    ' b4 o4 _! F' T# n; o& T/ L1 j  i
  841.         pop     cx( G+ ^5 S0 k% J( H0 M6 j
  842.         iret: `3 ?' i7 I! I% ]4 K" U/ @! E! z

  843. 3 c3 B% W, J% d) m7 o! \" n
  844. memmouse        endp! o. S' D- _8 b1 l9 L$ c

  845. 7 |6 v1 q  N, N
  846. endof_start:: I* V8 X6 B! X: V* f8 r
  847. - _- ~7 ~4 X- K1 x9 O7 G& {0 m
  848. emsg db 'No mouse driver install error!$'  ^& _1 `6 h8 f# J1 L& @
  849. old331 dw 0
    $ k6 z, `$ i- B8 ^1 P
  850. old332 dw 0& s5 k/ Q; m4 [% Q- J' V0 u
  851. old741 dw 0
    9 y9 z# J  T- w6 i0 Y$ g( \* c
  852. old742 dw 0: B4 |0 X! w% R* S. L3 Z% H5 a
  853. memcopy db 09 B% g% j' ]$ Z& V1 v4 Z
  854. okcheck db 0
    $ F! v9 p2 @5 P, l7 o
  855. pass db 0% J& M4 E2 n/ Y/ M% N
  856. chkl db 0
    ( ^  |% ]0 l: V% `) B
  857. lk db 0. Q- M- R) g$ a/ A1 j2 G  x5 |
  858. chkr db 0: y5 v1 g0 [0 B( V
  859. rk db 0. G3 C5 C' N5 o7 q4 [) r7 I, T
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    0 v0 {) [3 [; T; ]& g' k
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '% z. A* P  f5 k8 ^( ]6 f8 y4 `
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    7 c% I+ L  M" U' i0 K
  863. db '                                                                                '
    + O  @) [& X# ^" z+ B8 I$ e
  864. db '                                赏屯屯簧屯屯突                                  '" ]$ V9 s! p9 r. U' n4 ^  U2 }  [
  865.         db      '                                ?OFF汉OFF?                                 '5 D5 t% C1 K5 O/ d4 Q  A
  866. db      '                                韧屯屯既屯屯图                                  '# ~  s; ^5 L. d) N" v5 e4 |$ [
  867. db '                                                                                '
    ; |9 O2 a& ]& D* X
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '5 U, M: v% @+ c
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' & p* Q: Q8 k9 w1 A; }: c$ m- ~- Y
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '0 ~. M7 J1 s+ p& i
  871. 9 n! T: }% s; G9 `( s
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!8 F( j7 L% o7 v
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
5 P# ?% T! T& i- H0 [
% z( s6 ^2 D8 C) S0 v谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 17:38 , Processed in 0.304474 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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