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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
: e( v& ~! ^0 R. n- H( K1 Y( b8 E1 W
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;! T2 k( \$ n; l# y5 Y3 U+ g  y
  2. ;          Ufoit PS2 Mouse test program   Ver 0.92 |) ~7 J# t+ I2 S
  3. ;                                         By Bini.Yi 易祝兵
    . l# ~! r, n8 P7 T% j: b
  4. ;                                         http://www.ufoit.com 计匠网# }: {1 n3 u# T; V, Q
  5. ;                                         2002/04/06 YYYY/MM/DD
    0 S! B& E, R, S
  6. ;& C4 R! v9 S' d) Q  p; p! Y0 W
  7. ;          $ b/ V; E4 q( H7 d, K
  8. ;          This program  test the mouse button  click and move.
    & }8 x  D6 Q& _" P6 e
  9. ;
    " S6 }& l6 r) u/ d% R% x

  10. ) E. U) t# B% {8 {0 G
  11. .model tiny+ Q, w) k! m0 \7 {9 E, B( D# x! R
  12. .5863 A' {  s1 ]8 p- s$ x
  13. .code% I3 t! i# p  r" c
  14. .stack  100h5 v) _7 g: L$ Y4 _6 Z7 _
  15. .startup# r4 @) I: i1 c
  16. pusha
    % Y& x3 b+ O! M" i. i
  17. mov ax, 3533h
    ) K2 K" f' y/ p: z# S
  18. int 21h9 X1 V% X( `+ J5 ?, j  j2 }  p
  19. mov word ptr cs:[old331],es
    , ^( C* m  R# N, l
  20. mov word ptr cs:[old332],bx! m: y( T' s* t1 R* E9 ?- C
  21. mov ax, 3574h6 h/ B, N. j" I  b9 N  l
  22. int 21h
    / ?3 w+ s1 J$ e
  23. mov word ptr cs:[old741],es
    5 `3 _3 @+ o: K/ Y6 F6 r$ N0 \
  24. mov word ptr cs:[old742],bx/ B' b- x1 f# o  w
  25. popa
    - g. S/ l8 H9 Q7 g  g9 E
  26.         call    memmouse- Q) b; q0 {1 w) I; n1 G$ W0 H
  27.         mov ah, 00. x7 P+ X; S3 c/ S
  28. mov al, 03
    " M$ N& W. A# P9 L* b
  29. int 10h
    ) t+ J( \( O4 y0 `; ~
  30. mov ah, 068 c, D8 ~9 F  j- B( {" A& E! l
  31. mov al, 0' `' U& a2 [2 q2 K1 z7 S: M
  32. mov cx, 0" W, a1 N6 b, Q3 S( Q
  33. mov dh, 24% L; S8 l; }2 f' L/ \2 U
  34. mov dl, 79
    ; ], d' H7 H/ C9 Q  Y2 r
  35. mov bh, 07h
    0 p$ R- l' ?9 C; }# b% E
  36. int 10h* _4 O4 M2 k6 h, }, |2 O2 a
  37. mov ax, 0000+ A4 o8 C# Q# D8 L/ j* b' a" g& i
  38. mov bx, 00026 I) t! n! R5 D+ Q7 h' E- ?
  39. int 33h
    2 }: q6 V/ L1 S6 Z  n$ H7 h" O& Y
  40.         cmp     ax, 0000           ;if no mouse drive install  E& Z. ]; ?; ?, d
  41.         je      errormsg           ;show error MSG
    - [! e/ z) S7 ~& h) _
  42. mov ah, 029 }: x6 `8 X2 c' G! K' v2 x. U9 {
  43. mov bh, 00: W' K& [- J: f( E' X
  44.         mov     dh, 25             ;Move point out screen
    % y2 z5 \9 V+ Q" b) q; L
  45. mov dl, 79
    / L% [0 l, `$ o5 |. _3 p
  46. int 10h
      X( P& D& i# A: {
  47.         call    showmsg            ;Show info
    ' L$ F4 N2 G$ ~" j
  48. mov ax, 0001! f# ]6 J: V/ e2 d2 j3 ?
  49. int 33h
    0 @$ H' k' f, H  d/ H$ a
  50. ; mov ax, 000ah& ~* H( E: J% c2 M4 Y! @
  51. ; mov bx, 0000
    ! B( P4 e) a" b1 r8 u! R. c) G$ I
  52. ; mov cl, 0h
    ; d& l" w' u& g  J5 W# Y: ^5 P
  53. ; mov ch, 0F0h( I& e3 y; f  c
  54. ; mov dl, 0h% x/ R3 x7 z8 x1 P
  55. ; mov dh, 0F0h0 j, c% V! _' {  k9 j$ ]1 v, N
  56. ; int 33h
    % J6 x+ j0 z; b6 B, f& y, h( }
  57. mov ax, 0004h5 h( r  T9 d4 X- I1 u. x+ y$ n
  58. mov cx, 0319
    * d" ]: `0 R- P' |) l
  59. mov dx, 0103! o5 Z0 l, x* ~' ]6 M  Q
  60. int 33h; r% e* p* p8 T
  61. casemo:                           ;Case button click and point move   Q1 v) {; u+ Q/ Y- o
  62.         mov     ax, 000bh         ;and keyboard press/ V$ ^7 L% W, ]
  63. int 33h; |) q1 g  l" G' _$ m9 P# ~# s$ z
  64.         cmp     cx, 00h           ;if point move....X+ V( {8 p5 a) k6 V0 S% G, e7 n4 e
  65. jne xmov/ A+ I! D3 p2 }8 U* P" Z# e$ l! j* `
  66.         cmp     dx, 00h           ;if point move....Y2 w9 A2 g! A9 U' S) I
  67. jne ymov
    0 W$ i; U8 q5 ?6 u% c3 x
  68. xymovend:                         ;X.Y move end
    7 S9 _7 q7 M# p4 V9 y
  69.         mov     ax, 0003         
    ( P" r. E; @$ {/ E. y9 x
  70. int 33h! Q4 H  c, B; [3 f
  71.         cmp     bx, 0001          ;if left button click  show ON
    - y* Q; h1 u% f  I) ^* S
  72. mov si, 1828
    ; i. ^$ |8 @: A1 o6 L& `% a1 |* i
  73. je listl
    ( F0 |* P8 R! {- S0 ?
  74. mov si, 1828
    3 w( n# }; `; W8 I% G8 m
  75.         jne     nlistl            ;if left no click show OFF
    # }& I4 R9 C# ?( H
  76. testr:
    0 M0 l9 G. P' [* U
  77.         cmp     bx, 0002          ;if right button click show ON
    ' l( u# n' G; }+ V/ W' s
  78. mov si,18425 A! I" |7 I* c! E. H
  79. je listr) }2 d8 |& l6 S
  80.         mov     si,1842           ;if right no click show OFF
    7 o: m- g0 l9 H/ ^1 i$ K. }
  81. jne nlistl  K3 C9 h  D* I. {8 X, }' W4 b5 @
  82. casekey:' `$ A3 P1 Q! n7 U2 o8 |
  83.         mov     ah, 01            ;if any key press jump check
    # L: m$ H6 o- P$ z
  84. int 16h
    ' B. L! y$ J8 t6 E- o0 J
  85. jne kpress
    . t1 `& P( K/ J
  86.         mov     al, [chkl]        ;check x flag" G9 e3 |& S7 [9 m! Z: H
  87. cmp al, 02h
    ; \9 c: U4 q! ~. f% o& @
  88. jnb chkok4 ]4 R3 R* I. ]; R* G- N6 Y% H
  89. jmp casemo
    / o# U6 M# M/ c+ Y" A
  90. xmov:                             ;if X moved, get the X flag+1
    ( c+ W7 y6 Q% Q8 A8 G+ V$ V( Y
  91. mov al, [chkl]( |/ ~, T' O0 N! a& g. ~
  92. inc al
    ; C9 c9 s2 x( |) w0 @$ [$ w
  93. mov [chkl], al
    ! G3 n* P6 \& _( I: i
  94. call passok7 d( _, G& U& c& F; {# Z0 Y( _
  95. jmp xymovend5 n% M* f  M3 J) O7 N  ^1 g
  96. ymov:                             ;if Y moved, get the X flag+12 L& U3 `" k  X
  97. mov al, [chkr]6 o4 g, v  L2 V$ {* `/ A
  98. inc al+ }" |0 b3 a# f
  99. mov [chkr], al6 O, E. m2 _: G) ]
  100. call passok) p$ g4 C# v+ \# S: V5 B
  101. jmp xymovend6 v, s" \6 ^& U1 w7 h$ H# I; N
  102. $ G) h3 Y2 \9 j. T" V& |
  103. passok proc near
    6 f& z8 }5 i: h, |. m! c* j+ O
  104. mov al, [okcheck]1 S; _1 V8 K) `
  105. cmp al, 1
    * X  j  a0 C5 E/ h( Y
  106. je let0. l; `! J- d" a# N( J/ {6 t
  107. jmp passret
    ! [7 L* B- @$ V- {! H( T) T% d
  108. let0: 7 s& J& f0 Y, G& V+ Z
  109. mov [pass], 1* E) X0 x/ P6 q6 c: p6 e
  110. passret:
    / S' V& [% w# F. d
  111. ret
    ! Z! _+ }9 u8 z
  112. passok endp
    - g; A! r1 E) y  N
  113. 7 J5 \& y3 b, A
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS( a  }" \0 `; [
  115. mov al, [chkr]. t; a+ i+ C% Z* v( U
  116. cmp al, 02h' y  ^1 L) u7 O; o$ _! ?5 o
  117. jb casemo( N( M4 U7 N, C" y- I' ?7 l
  118. mov al, [lk]
    + X: |' ~( b! L. r- y+ c
  119. cmp al, 1( O8 `1 p) b; T3 H5 e3 b3 f3 X
  120. jne casemo
    8 _* L$ }- \& r0 ?. |
  121. mov al, [rk]
    . i7 |5 J6 Z# N- l; A
  122. cmp al, 17 C# I9 v( i+ V. N1 J, F; ]
  123. jne  casemo
    ) \6 I7 n  w! V1 F0 o, M( @8 P& r, p
  124. mov [okcheck], 1" L, P: k, w( w& N& z
  125. mov al, [pass]8 E# S6 s( h( u. Y7 m1 ?0 {+ ~) _
  126. cmp al, 14 Q8 Y5 t' q/ t" f3 A5 Q2 `
  127. jne  casemo1 T% `- H3 S  b
  128. mov ax,0002h
    6 U( I6 S+ A; r: o
  129. int 33h- k0 E, K8 ]) N, t5 }, u5 V
  130. call cleascr
    0 k2 b; d5 J; b) i/ R
  131. 6 c9 w  n3 G4 `5 I3 g
  132. call oldint" ], G- {" {8 a* l; O' @- D
  133. mov ax, 04c00h
    ; D" Z2 e- W( L5 H6 t7 Y
  134. int 21h/ @6 b# j3 H4 N- q

  135. # Z9 u, {. c' z: o) N
  136. okexit:
    % M& {( p" ~  d
  137. mov ah, 4ch. X( E, r' }* ^; B1 U, \
  138. mov al, 00 i: ]& x* r. D/ W
  139. int 21h
    . _0 L0 l' l1 |5 }
  140. listl:                                 ;Show ON$ K, _5 ?1 I; K
  141. pusha
    / |+ [1 i( M+ B. r7 K
  142. mov ax, 0b800h' }- ^0 A  @( s/ P8 V4 o
  143. mov  es, ax
    * v4 F: P. L. b9 A
  144. mov ah, 47h9 P4 g! Q0 b9 E
  145. mov al, 20h+ f4 S4 w- g! \* ]6 K* U
  146. mov es:[si], ax
    9 r" p& K" S5 ]8 ~% N
  147. add si, 02
    7 Y: S) J) \6 R/ `* C0 D0 R0 O6 x
  148. mov  al, 4fh
    ) P/ j, |+ e1 i6 C6 W( z
  149. mov es:[si], ax. r4 ?; C' C, W" G, K/ N
  150. mov al, 4eh+ o6 Q- i% t* b+ i/ N" W
  151. add si, 02
      [2 _3 C# ?4 v9 o
  152. mov es:[si], ax' C" v# [9 ?# x, k4 D- Y
  153. mov [lk], 1
    2 I, g! \6 }2 ?; y
  154. popa* {- ~9 p( ~. W& n" }5 H! M0 Q
  155. jmp testr  A  L* l; \+ S8 j6 u
  156. listr:                                 ;Show ON
    1 l& h, q  e+ A& V9 R6 e0 e
  157. pusha1 y3 I/ K9 i3 d8 B
  158. mov ax, 0b800h
    2 Q; M& J' E- K7 E7 W
  159. mov  es, ax
    $ s: b, Q1 d7 {! W) G
  160. mov ah, 47h
    ' f5 P; y: U0 i3 h
  161. mov al, 20h0 w7 ?, |' d' }
  162. mov es:[si], ax
    * @1 {. v- {2 q' O
  163. add si, 02
      u) t; d3 r5 G+ z, i" K. y( D6 I
  164. mov  al, 4fh& B- t$ G7 y5 h/ {" ^7 p
  165. mov es:[si], ax
    ' c( D* H2 @; n- H4 F- N
  166. mov al, 4eh7 e! e2 [( n  i
  167. add si, 02
    $ Z, H; K, t# V0 E
  168. mov es:[si], ax
    . f" w  @. V# G2 D- L; _3 Z3 j8 t
  169. mov [rk], 1
    ' h! ]' W( c3 M# I6 X
  170. popa$ ?1 z& W) w$ K" {1 y0 ]
  171. jmp  casekey0 h% m; E' i$ A0 n" K

  172. 4 s: p. Y( G  i4 d5 t' @% m
  173. nlistl:                              ;Show OFF# g  [$ `+ h# y. N
  174. pusha   
    ; Y% g) d: p5 W4 e# H% {+ |, `
  175. mov ax, 0b800h
    + S; X* Z; j0 }0 _5 D
  176. mov  es, ax# o4 j" \$ B+ _
  177. mov ah, 17h
    ) ]: i& y* @: r1 }
  178. mov al, 4fh
    : K6 ~8 y. ]) _% h- l9 ~8 [
  179. mov es:[si], ax2 s/ m  k1 X! {* E
  180. add si, 02. d# n7 X& f/ U, L* q
  181. mov  al, 46h
    7 T) {+ q" E4 u, d4 h% j" G
  182. mov es:[si], ax* P! f( x& @* d! N  t4 W2 S
  183. mov al, 46h" E& e8 E) L' C/ F4 E0 @6 _3 O
  184. add si, 02; E! E  o* |4 I. ]5 t" T5 l+ V
  185. mov es:[si], ax
    ! j% q! }2 t5 U  b' ^" d
  186. popa- K2 R7 ^* j: f2 b& W" m1 u% f+ n/ W- ~
  187. cmp si, 1840
    - r( y) E3 l0 C) }
  188. jae casekey2 h  @( A* t) M4 k* a
  189. jmp testr
    4 m' E; _0 _, ]1 @7 ?
  190. 4 ?7 \8 h; `4 c3 x$ d3 {
  191. kpress:                             ;Check key press if press<ESC> then EXIT/ O; U( N$ b. z
  192.         cmp     ah, 01h             ;and return a error
    ' U6 o0 L* t& G: n7 Q
  193. je exit1$ y/ _( B  k# Z3 R, U
  194.         mov     ah, 0ch             ;if press other key then clear
    # J  T1 A0 g* W" K0 s, `
  195.         mov     al, 00              ;keyboard buffer
    1 z& T( U7 ?) K  C  J  I- n
  196. int 21h
    6 Z' c& ?  \3 `9 }3 I
  197. jmp casemo
    ! @* a6 a9 G7 \! ]% t; c! H
  198. & H; }; Q8 I& `* A5 w2 H8 x- l
  199. errormsg:                           ;if mouse driver no install2 u4 E5 ]) a1 ^2 Y$ o7 W- U  C
  200. call oldint, x* N( |* K; T
  201. lea dx, offset emsg
    9 d' D% r9 P: w" Z' ]- Y
  202. mov ah, 09h  B0 G8 b; K9 B, u9 l" a7 P
  203. int 21h' [3 U6 E  Z* g6 d# ~, O+ E9 t6 U9 U
  204. mov ah, 4ch
    * ]* O6 |* j8 ~( x
  205. mov al, 24 k4 w0 c; I4 O' @4 W1 ?; o
  206. int  21h. z0 [! F$ K* t9 A

  207. 3 h& S$ u' O0 U
  208. exit1:                              ;error exit0 I7 [6 H/ s* c/ ]$ K& `& v2 k
  209. mov ax, 0002h
    " x* p* ~! V" Q2 E9 C& ^( o7 g
  210. int 33h$ p7 v& N, }  D1 R. r# @6 }
  211. call  cleascr
    , z$ o2 G" c+ H. P
  212. call  oldint
    8 t- q# s; ^: d1 _
  213. mov ah, 4ch
    : }- {: a' A. Y( _
  214. mov al, 01/ ]. P+ t9 m, D+ t4 [
  215. int 21h8 C. A8 R, ]6 F% R0 C+ T

  216. 7 g* L% _0 b% Z) F( \
  217. cleascr proc    near                ;clear screen# H/ Z1 S5 b( M& f+ i5 E9 J
  218. pusha, s4 }8 C+ v8 C  \
  219. mov ah, 06( }; @' l% A* r! Z' \2 s
  220. mov al, 0, |" E5 l- p) w' A4 y! ?' B/ k
  221. mov cx, 0
    / d9 y: {  L  F9 ^) W) M: O) ^
  222. mov dh, 24
    4 Y, t& G9 |$ A4 D4 P
  223. mov dl, 79
    ; G& V. ]' \& N3 L
  224. mov bh, 07h' {) V& ^( M* S4 j, ^
  225. int 10h
    * d% Q3 G- W6 T1 S0 `4 \% R
  226. mov ah, 02% S* X+ W. [7 \
  227. mov bh, 00
    9 P6 y& c% }3 j! i! Y9 r
  228. mov dh, 0! g  \3 Z: k7 E% Q
  229. mov dl, 0
    6 p: H$ M% c: H* S  ]. M8 P) F0 {) b
  230. int 10h9 W# B  y, Z: ?) H4 H
  231. popa
    . t0 n# [* L' J
  232. ret
    % ?- W% o8 S/ J  l9 O# j
  233. cleascr endp
    - S# z; B# D; x4 G' I" n& N7 O

  234. - t/ [% ]0 j% x: B
  235. showmsg proc    near               ;Show info
    9 Y- ]5 e9 \+ H3 d
  236. pusha
    " \0 h- C( _' z) d2 v$ t
  237. lea di, offset showms2 {: X3 c% x) b6 V; m  Y' _  \
  238. mov ax, 0b800h) H( _1 w( j5 p- i) e/ `8 b1 I
  239. mov es, ax
    1 q6 f" A# J( w0 K2 @; M- `2 A$ G
  240. mov si, 0" `4 g. ?% k" `, A7 Y8 `
  241. mov cx, 480
    4 l7 C6 t6 _7 K) J. p% G
  242. mov ah, 07h* I6 b4 g  v+ v
  243. @@:* \' s$ j  O4 k: Z6 d3 Z+ y
  244. mov al, 20h
    % w/ ~+ y) g  v1 {
  245. mov es:[si], ax) C+ z% q& V6 x- i/ O
  246. add si, 2
      y% B4 U' f% t+ |. |! f* w
  247. loop @b
    + [2 `, }8 u8 _6 @
  248. mov cx,880
    , N( y3 U8 W7 m& l1 P; {, O0 f
  249. @@:
    6 o3 g. h9 v2 w
  250. mov al, [di]
    # }  ^* G2 e) }" ?3 W; y. \
  251. inc di
    ; }. t+ ]5 V4 o% ?/ s/ F+ V
  252. cmp al,20h
    & W, K6 m, y& B; I* R
  253. je showch1
    9 c" Z  u8 Z. g' n6 A
  254. mov ah, 17h
    1 O* U4 Z# I0 W: z1 `3 h+ e
  255. jmp showch3
    " h7 h2 a/ l) J2 H
  256. showch1:( f$ G- Y, o4 k
  257. mov ah, 07h . U9 a3 m& Z, ], {! _
  258. showch3:
    9 _1 F; w7 v6 ]
  259. mov es:[si], ax
    + E) h$ o4 A' B( ?+ H. K2 C, s0 r
  260. add si, 24 K6 p) g" t  R3 X2 Z
  261. loop @b
    6 }0 w) p: N9 H
  262. popa
    # e- o- H/ S& h) |$ \6 u$ B/ D7 d
  263. ret# e% W3 i% N# L+ J' q) e& d
  264. showmsg endp
    # W2 p6 W3 g5 U* f, k  B) W6 Q5 e

  265. ' S2 j1 o" p' B: ^- w" O; t2 L5 K! J( r
  266. oldint proc
    8 g/ G5 I, o2 O4 M7 \
  267. pusha
    7 [, a2 ^5 K0 n5 h4 f$ `5 I) T
  268. mov ds, word ptr cs:[old331]3 s* I% s3 N9 E% J
  269. mov   dx, word ptr cs:[old332]# |6 u' h5 f3 o# I5 d5 |
  270. mov ax, 2533h
    " `2 n- S+ j( H
  271. int 21h! A. ]6 Q# w9 \; O1 i
  272. mov ds, word ptr cs:[old741]$ G; I- u9 _( x0 J! ^9 y
  273. mov dx, word ptr cs:[old742]
    " `9 _9 B7 y" c5 D0 h4 i" I4 @
  274. mov ax, 2574h6 g' m% t% h: \/ e% N6 K
  275. int 21h/ S$ e5 [' G9 D0 o
  276. popa
    1 _; T- Q5 m) R
  277. ret
    6 j7 R3 r6 z5 T% @
  278. oldint endp
    ; F$ T1 [  `0 ?6 n1 ?; a' M
  279. " C0 m& x9 j2 U3 ?- y
  280. memmouse        proc
    . e3 \0 |, e( ?+ a0 w
  281.         xor     ax,ax
    7 L2 H, g9 {) Z( a' P3 z
  282. int 33h
    ' E" a, [* z3 [2 ?" R
  283. cmp ax,0ffffh
    $ {: L3 ?0 v: Z% r3 q& N, i. Y7 K
  284.         jne     not_loaded
    - @! {% V/ \  `6 v. g/ @( _
  285. mov [memcopy], 1
    2 w# S6 G( h; Y, K
  286. ret+ V# A# z+ h! g7 H6 s
  287. ; ^7 R' B/ Q: B0 d0 M+ `! R
  288. not_loaded:% |6 ~% u& O' `6 @7 h6 r: K) ~" W

  289. # R( C  B7 ~  W' I+ p" Z
  290.         mov ax,2574h& g3 }! z% f" C. e; r7 `
  291.         mov dx,offset new_isr3 Y% `* U( H& G0 u5 F
  292.         int 21h* j' b3 o7 b8 S6 w4 F4 v
  293. 1 v3 y+ R1 k! Y. C& g& K9 |
  294.         mov ax,2533h
    ! ?. }- t$ L' j
  295.         mov dx,offset new_33
    ) O  I. s5 G6 v9 ], P
  296.         int 21h' s; ]( R8 o" c( C3 F( U* z

  297. ; ]: m$ K) M; x& |
  298.         cli
    6 w. A0 j- n8 ?/ J

  299. * I0 d9 v* \' K+ N0 I0 z$ x
  300.         mov bl,0a8h0 x# z0 [# I$ r' |9 \$ s
  301.         call keyboard_cmd" A4 X+ ?* z5 R& `2 i; P- m( T
  302. 0 I: L; o3 T5 y1 e5 c% M
  303.         mov bl,20h
    * \" ~0 R5 y) Y: P; S! b: n
  304.         call    keyboard_cmd8 G, k2 Y/ r2 T8 W0 [3 n$ Y. L
  305.         call    keyboard_read
    ( F  ?8 `% i5 t# {8 `) c" Q2 A
  306.         or      al,2
    + n! T# E- L# a- L
  307.         mov     bl,60h
    6 y+ S( M0 a0 d$ B
  308.         push    ax
    ) E* _( }) r/ i
  309.         call    keyboard_cmd
    . W$ F5 Y8 R; W( B' k, Y- ]
  310.         pop     ax
    # C/ V1 P$ e" a8 q7 e
  311.         call    keyboard_write
    8 F0 w6 {6 t& q& k( z& o
  312. # ]- Q; |1 \* }# T
  313.         mov     bl,0d4h% T3 m% p+ h' X2 L0 t& {, x( M
  314.         call    keyboard_cmd" f0 j. T1 l. P# h& W7 z0 T
  315.         mov     al,0f4h
    , h( g4 n9 y: s# M5 B
  316.         call    keyboard_write9 {7 U8 n/ j$ v$ U6 |5 w: W
  317. 3 H7 e: M: y" q. m
  318.         sti" B" g: n/ X2 q* {5 K7 Y
  319.         ret3 Q' `7 E8 k! ?) l4 G
  320. call_user_isr:7 S& S! j: i5 ^0 q* r
  321. db      60h
    5 }# x( R4 d) w4 H  \1 f
  322.         mov     cx,cs:[pos_x]
    . y, U) \  |' ?8 `+ @9 S0 `' d! i
  323.         mov     dx,cs:[pos_y]& q# `7 I/ Q% P. d5 y# x( S
  324.         mov     di,0 ;cs:[x_move]3 c4 Z4 Q" c/ p3 U
  325.         mov     si,0 ;cs:[y_move]
    4 W9 r* N$ B( i
  326.         mov     word ptr cs:[x_move],0
    ; o2 W- \- [5 G' Z4 W0 J% r6 T
  327.         mov     word ptr cs:[y_move],0
    ) Y. N. X5 e" V+ ]$ E
  328.         mov     bl,byte ptr cs:[buttons]
    + k) o" J" |1 n, K! w0 s
  329.         xor     bh,bh
      C: @9 `0 |+ _
  330.         call    dword ptr cs:[user_subroutine]/ R0 m! H; K8 |1 v
  331.         db      61h8 `: q* P) {* y' G4 Y. z% x$ A
  332. ret
    8 K) P: E! z) K+ T* u# V/ Y
  333. new_isr:
    $ K4 a- q6 O  _) u( F5 o% K
  334.         pushf
    3 n8 w6 y, Y6 k
  335.         cli8 ^% t. Y$ _/ c2 x4 j7 q
  336.         push    ax7 \1 ?- u+ y1 R) T
  337.         push    bx
    8 s$ N; }4 q! ]. u7 Z
  338.         push    cx6 g- q0 k% G8 q9 R
  339.         push    dx
    ' t) f3 _' z0 |) ~; u. k
  340.         push    di
    ; N3 T0 Z& v' h1 I" T1 e1 ?
  341.         push    si+ |  p" A, X2 X2 P! _7 w3 x: O
  342.         push    es
    ' i0 x3 P. g+ y
  343.         push    ds
    ; F' X  t0 c- o& G

  344. & m+ G& W- o! F; z" J3 W3 U
  345.         push    cs
    $ S( S1 P) f6 ?  E: x. o/ Z
  346.         pop     ds5 h$ g: V9 k' [* X9 e5 D! V
  347. 0 `. D/ ]' A  Z+ |* e
  348.         mov     bl,0adh2 h0 o# N# u( w
  349.         call    keyboard_cmd
    , U; t: [% k4 E1 h  M$ D$ a

  350. * z& g! {% k+ U; B2 O# o+ L
  351.         cmp     byte ptr [first_time],0$ h  w4 Z# A4 Z( g
  352.         je      not_first_time# Y" v" ~! \4 Y; T& v: o! b  l; s+ d6 X
  353. % }2 b3 L% I1 f! F; y
  354.         mov     byte ptr [first_time],0
    : [: q" u5 x8 K6 m& G
  355.         call    keyboard_read+ h1 l* \/ E" j  _: ]
  356.         call    keyboard_read$ t9 A0 u& b: j3 d* k
  357.         call    keyboard_read
    8 X$ O  t9 o/ i
  358.         jmp     no_show
    % L6 C' p5 s" ^+ s* x* {8 R
  359. : `8 U; ~! }% }! t, e* o; f
  360. not_first_time:! ^! D) d& K8 q4 C+ t! t
  361.         mov     word ptr [temp_mask],03 J& J- R6 S. U/ j
  362. ! D+ J+ I2 M, ~" b; U4 P
  363.         mov     cx,[pos_x]2 w9 Q" f# L, |* I$ G
  364.         mov     dx,[pos_y]
    3 g/ B* z/ [6 w8 a9 I3 x+ L; ^
  365. . j- s/ E0 A( A
  366.         call    keyboard_read
    ) t, u% K* G+ H
  367.         and     al,7 ;34 z! v# X4 `5 ^2 N0 ~* _, F
  368.         mov     ah,[buttons]' H8 E2 F' |, q4 u0 v* D! o% `
  369.         mov     [buttons],al
    $ B1 o2 z& n; \! S+ `$ p, b* E
  370.         cmp     al,ah( T6 S$ T! l6 a% D7 B; E8 E6 N  Y
  371.         je      no_button_change5 @0 M# y" {2 _, n2 N1 v
  372.         and     al,3
    % `( W6 O+ q9 T4 u+ Q5 l
  373.         and     ah,3
    1 r+ _! ?3 N- x: L6 e: s: F% R
  374.         xor     al,ah
    3 ^- H1 f# p: ]# A  j) U8 `( L1 X
  375.         xor     bx,bx
    6 {. j/ ^1 U2 i" n  Z

  376. ' q# N& W8 v2 ?8 C/ m
  377.         push    ax) c( W9 q0 x6 K1 w+ t1 C. @. |
  378.         test    al,2
    3 O8 y- L: c7 s4 c8 R
  379.         jz      no_right_button_change
    , l) n% W9 J9 x  b5 G
  380.         and     ah,22 |6 B# [+ Q0 |
  381.         jz      right_button_pressed4 K1 j1 o4 u; k+ ]9 e
  382.         or      bx,16
    . b$ w: E1 D4 I
  383.         jmp     no_right_button_change
    6 O# W$ @* Q; K; L( V3 n1 P- i
  384. right_button_pressed:
    $ t. B% ?9 M7 w9 e" k9 ~: x5 [
  385.         or      bx,8* s* O6 Q5 |6 `/ m9 j6 U% O/ x
  386. no_right_button_change:
    $ M% i/ A1 A; ~# ?6 @. }/ B! E
  387. ; a- p0 ~$ p, ^9 H9 [  ^$ K
  388.         pop     ax
    & x8 w* g( u7 y* A* G
  389. + ?2 a; K# j! z9 W# [
  390.         test    al,17 O5 e1 J$ ?  o2 O
  391.         jz      no_left_button_change5 L5 w* N) X+ Q; L! Q" |
  392.         and     ah,1  J0 D- C2 o" y! s$ {( f
  393.         jz      left_button_pressed
    + f4 H+ Z% _7 W$ W4 e
  394.         or      bx,4- J7 o0 L. }* @, z
  395.         jmp     no_left_button_change. c. R2 L5 P; J
  396. left_button_pressed:7 P0 w0 u+ [# t4 L
  397.         or      bx,2" t7 }; e* F& g: Y" Z
  398. no_left_button_change:
    , D2 _, w5 |! E

  399. 0 I# w9 F' `1 t) J
  400.         mov     [temp_mask],bx
      ~% y4 ]) A: R- t% n! B
  401. . N, \) c+ |' ]! G9 r& b4 l1 o
  402. no_button_change:
    * |6 B$ B/ A' y% p8 ~7 X; @# D
  403.         call    keyboard_read: x6 K8 s& `0 Q' F" h
  404.         cbw
    % f; C) @# M: i- ]' ?% _
  405.         add     [pos_x],ax
    1 `% Z8 j* I( b" {2 s
  406.         add     [x_move],ax( b% }& m* O# [* q
  407.         mov     ax,[x_min]/ J$ T' W& v) i, F" M* Z8 V- ~0 D
  408.         cmp     [pos_x],ax2 X4 f) X1 V; Q
  409.         jg      good_hor1
    7 w) w, K; [$ z7 z. Q; C
  410.         mov     [pos_x],ax
    % T: S& \, F6 {1 G& n' C) X
  411. good_hor1:
    $ k: q- P3 I+ _  i8 i
  412.         mov     ax,[x_max]
    # C! J, ^- w6 s7 b8 y2 }$ c
  413.         cmp     [pos_x],ax
    # r. |" `7 h& u5 w3 _
  414.         jle     good_hor2
    5 g& @# U8 m! z$ p& x. s9 X
  415.         mov     [pos_x],ax% w5 r* T; f1 g$ K6 O6 Y1 [. }; J' o) c0 y
  416. good_hor2:
    ! j7 u% O# B* o7 q+ [

  417. - g$ C$ d# ^& ?$ m1 h
  418.         call    keyboard_read6 _7 d( @+ u" n* j1 e' a# ]- \7 u
  419.         neg     al
    / _* a" c% j9 [8 R. w. U* T" `
  420.         cbw
    " G  v; Y/ H1 R- f
  421.         add     [pos_y],ax
    # P/ {' ?8 r1 Q* ~; V
  422.         add     [y_move],ax
    0 D, C: M* d6 ~) F
  423.         mov     ax,[y_min]$ k2 p% j  X, G0 H/ c7 S4 H
  424.         cmp     [pos_y],ax
    ' S2 j$ D. U5 g+ ?& i  k
  425.         jg      good_ver1
    6 x! I+ i6 @" [$ {9 T9 |5 D1 v
  426.         mov     [pos_y],ax, Y" {2 q* N5 d# U6 A; ^5 }3 }1 {
  427. good_ver1:
    * a: K/ A9 T( k) o5 d
  428.         mov     ax,[y_max]" X& z/ \$ A9 i/ |
  429.         cmp     [pos_y],ax2 K5 K2 d' ^" v: F4 K$ O
  430.         jle     good_ver2
    * e: v8 u3 ]- S, v8 B4 ^' J
  431.         mov     [pos_y],ax
    # q* u9 X; k5 c0 w) M) N4 V/ `
  432. good_ver2:6 V4 a" o  F2 d! w( T/ @2 S; N

  433. 7 x  \6 K' S0 ]
  434.         mov     ax,[x_move]
    - Z# S& s8 _! I% Z/ W  {0 K( ~: o
  435.         or      ax,[y_move], _/ r/ A9 S6 T: u6 h
  436.         or      ax,ax3 H( N! ^) a2 i7 `: g
  437.         jz      no_change_position
    7 l) R2 T/ M  |, O
  438.         or      word ptr [temp_mask],1: t! [1 h3 i, n& v
  439. no_change_position:: o9 @: M# e8 ^
  440. ) H9 n: P& ~# s5 o: ~
  441.         mov     ax,[temp_mask]
      L% a  p; N+ ~- Y" K; S% c
  442.         and     ax,[user_mask]
    7 S5 V( U; D4 u6 e4 u
  443.         jz      no_call_user
    / _5 ~: @7 X+ W% w
  444.         call    call_user_isr. h: s6 Y0 E9 c* _( a' o1 x
  445. no_call_user:9 A. Z: T2 f. e/ C0 I! v+ Q9 @) [

  446. 7 p+ V- b7 C0 Z8 @9 Q8 D' ~
  447.         cmp     byte ptr [sm_flag],1: P! R1 l# |( Q' V1 P- x
  448.         jne     no_show
    ( y5 c; `: n  a' ~9 E' _
  449. / @# a) t, W  J* W2 `
  450.         shr     cx,3" d4 `5 k0 H5 s9 r/ g# W+ m5 I
  451.         shr     dx,3/ b3 l# C! L6 ]& P* N! Y7 |
  452.         mov     ax,80
    3 g; c" a1 S8 b& q
  453.         mul     dl
    . N, A9 K; I* Z1 \
  454.         add     ax,cx% i' h. x- b% z& ~& ^
  455.         shl     ax,17 v/ N) P. t/ g
  456.         mov     di,ax
    5 o- e& O2 ^6 q, v
  457.         mov     ax,0b800h
    : W, u7 J) d1 d, \( o9 a4 p! P
  458.         mov     es,ax0 f$ s$ a! ?: z. N: ?- d- I
  459.         mov     ax,[save_char]0 U$ {1 d  W7 A) x
  460.         stosw! ~" V( w& R, B$ X6 y. r

  461. + v0 ~! A9 s+ e% O6 _- b
  462.         mov     cx,[pos_x]
    ( \$ E3 {! @% b  ]
  463.         mov     dx,[pos_y]
    ( w! P3 L" W- @, G9 o; b
  464.         shr     cx,3* h! W" u  S, C) @1 \) p; l
  465.         shr     dx,34 {/ G6 U- y: @
  466.         mov     ax,80
    " D) s# K) F- G: i% F
  467.         mul     dl
    % A5 Z4 z% V2 f# V9 n( N! I9 B
  468.         add     ax,cx9 |3 Y, m: T6 i3 I7 V5 i
  469.         shl     ax,1
    / L$ W# Y6 i; D8 E* }) N
  470.         mov     di,ax: u- d/ g4 D5 Y1 I8 G
  471.         mov     ax,0b800h- S: u, L) i% [: R8 x7 v
  472.         mov     es,ax6 Z  C- C- C; e  k0 }
  473.         mov     ax,es:[di]
    ! M- D- w. I8 p& S7 {1 L  o
  474.         mov     [save_char],ax& m) y5 |4 b/ E
  475.         not     ah
    , }% U/ Z( a% |# u7 k; g6 e
  476.         and     ah,7fh" Q' n/ U3 @3 h2 X
  477.         stosw
    . f: v) T. U+ e1 ^8 w" {9 {9 H
  478. no_show:5 G0 \6 v6 L5 L, e4 Z# N, X) H- ^. ]
  479.         mov     bl,0aeh
    9 c4 |7 \/ M9 W) W! W1 K
  480.         call    keyboard_cmd. b& {9 ]( @. q4 K

  481. ' g6 k6 `' K" z3 g1 J
  482.         mov     al,20h
    ) O# ~2 b) d$ s- D$ u! T
  483.         out     0a0h,al6 J9 h% f/ h) ?9 [; X- j, M
  484.         out     20h,al
    5 O, E1 |6 m! Y' c& Z2 B- M
  485. ( l9 [0 P) B9 u  U( R1 Y2 ~4 D3 H
  486.         pop     ds/ _9 ]/ J. h: c
  487.         pop     es( s: S7 I% J0 ~/ k, C
  488.         pop     si
    1 r0 u' b1 w. G: l
  489.         pop     di8 x$ ~" I9 [# |
  490.         pop     dx8 K# E) x3 c! M/ r
  491.         pop     cx) @, v4 c* o- b
  492.         pop     bx
    & c9 y; s( O: ~1 t0 U  e
  493.         pop     ax
    6 M" Z( C' W! K' ~& ?
  494.         popf/ P$ l+ C- r, C+ o7 [
  495.         iret
    : H) k3 R& X' R, K% j' W, [& b
  496. / |# U0 W8 i% F, A, a/ V" ~0 \1 H
  497. first_time      db      17 s. b# X, x& w0 ]
  498. buttons         db      0, X5 ^6 @  g  P% C/ E; m5 M
  499. pos_x           dw      04 }+ S( V$ k4 x8 G/ Y
  500. pos_y           dw      0
    " c' J9 b% G) m
  501. sm_flag         dw      0
    % _( `; w& r0 }) Y9 K4 `& \
  502. save_char       dw      0% N! e  _- ?+ z4 ~
  503. x_move          dw      0
    2 D  K7 U( t' t7 n! ?5 T
  504. y_move          dw      0- H1 k. A" J2 {  I3 y0 z9 ?3 I% ~
  505. x_max           dw      639
    - l" [) K8 V8 \6 U
  506. x_min           dw      0; b8 Y) F; x& r  w
  507. y_max           dw      199- p  r1 `2 V' f  D
  508. y_min           dw      0
    6 ^: S" B" V% B
  509. user_subroutine dw      0,0/ a' C9 E5 t" A  E' w( ]9 {. G
  510. user_mask       dw      08 s/ S; M6 A9 k# F# e) n4 w. k
  511. temp_mask       dw      0- `) o/ L/ H- _) F* _% D
  512. 4 z. X8 \1 N3 g* d& E4 z
  513. keyboard_read:
    1 a' r0 t% c6 y8 g
  514.         push    cx/ s. Q# _1 h4 L- \& d
  515.         push    dx
    : M" J: X# e% q) d
  516.         xor     cx,cx
    : v, D1 ], A, o- y5 A
  517. key_read_loop:
    ; I2 u: C( S- j' J5 R9 u
  518.         in      al,64h; g9 E8 W) o% g$ U5 Y. g, [
  519.         jmp     $+2( ?# G/ q  V6 p9 C( ~& l! v+ i
  520.         jmp     $+2
    1 O3 t4 U  Y; [* I
  521.         test    al,10 V- C7 z4 q2 V$ U$ G. [/ c; W
  522.         jnz     key_read_ready
    1 V9 T8 z$ r% e6 m$ q/ u
  523.         loop    key_read_loop
    4 p+ J0 ^0 r( d& E/ k0 D
  524.         mov     ah,1
    0 P; p5 d) O# |
  525.         jmp     key_read_exit4 Q) \6 z: O/ @
  526. key_read_ready:  \; z* R5 m' c$ b5 T3 i
  527.         push    cx- H. ^5 Q# M3 h9 b0 Q6 m
  528.         mov     cx,32! S, V8 l3 Y3 A* J' J1 O/ l4 z
  529. key_read_delay:2 Q1 ~4 G- A- z9 `9 y
  530.         jmp     $+2
    ! J& V$ |% Z* U
  531.         jmp     $+20 x6 T9 t' V4 b1 I
  532.         loop    key_read_delay
    ' h# O8 G( b$ m) f

  533.   K0 h9 _( C1 r6 A6 F
  534.         pop     cx- n6 `2 {* U+ f8 ?: e/ [: k: ~
  535. 3 d4 @  }) B6 f: c& g+ J- S
  536.         in      al,60h  U% }- e4 b/ \  L- s+ p4 E* U* o+ J
  537.         jmp     $+2
    4 W5 X# k% }; `* {' g3 ?
  538.         jmp     $+2
    6 o; z9 k$ o7 r/ ~- z! d
  539.         xor     ah,ah
    # [# c- N% U5 C6 d# C. T
  540. key_read_exit:4 p! D6 _: o, R3 b
  541.         pop     dx3 e: b/ g2 g, O7 V8 R! ^
  542.         pop     cx3 \- w1 z: ^; Z  b# J1 ]8 i% N" k
  543.         ret
    ' z* s, w. N0 `+ a8 m2 n

  544. : _; }" ]. s) a+ P. x- Z
  545. keyboard_write:: O9 R: |, s7 G! I9 o
  546.         push    cx
    : u3 ^' j4 G1 _4 h# A( B0 N
  547.         push    dx/ D% B$ y' A/ m& t: b$ o9 f$ y8 ^
  548.         mov     dl,al
    ( V/ X0 _! S" a+ \3 p( y
  549.         xor     cx,cx
    3 m' _) P5 a, ?# V7 e
  550. kbd_wrt_loop1:
    & i9 ~% [0 l' @( f, H2 D
  551.         in      al,64h7 Z, d( J# C7 X  k
  552.         jmp     $+2
    ( Z  J, q3 n' X' ~: u9 S
  553.         jmp     $+2% o( M. d8 |8 I3 s, [- u6 s
  554.         test    al,20h
    6 i" U# {) y+ g5 J- _: T
  555.         jz      kbd_wrt_ok1  ~! d* q/ Y! G3 ^" q, k

  556. / l% Y$ |6 Y/ a9 D4 @! P
  557.         loop    kbd_wrt_loop1
    2 V! l$ M% y5 ?; K" O
  558. & P* `8 _9 L+ ^1 ]# Q
  559.         mov     ah,1; S+ D* W/ ~! q8 U# z) X! D
  560.         jmp     kbd_wrt_exit
    " V+ \- \" r; o0 R$ s, Y

  561. 7 N1 k7 Y7 q3 E7 Q4 q: n
  562. kbd_wrt_ok1:
    % ]* H- k/ k8 d  c, d
  563.         in      al,60h
    0 k+ [2 J( B9 D) d; q3 ?
  564.   Y5 h. a% \. X+ @7 g! d' d
  565.         xor     cx,cx
    & _1 G, |9 u" V* y1 I$ n
  566. kbd_wrt_loop:
    5 q4 K# Q7 q4 m
  567.         in      al,64h
    7 _0 I4 g: Z/ X& e  e
  568.         jmp     $+2
    " c9 M2 K, u0 V9 N) l
  569.         jmp     $+2( N9 l- p" F- h8 e" h
  570.         test    al,2
    * _2 o7 j" @' F  E
  571.         jz      kbd_wrt_ok
    2 n5 a8 }, J4 h: T. d
  572. * s% p& }/ y) z7 ^, j+ V2 l  h
  573.         loop    kbd_wrt_loop
    4 D, H5 y$ G/ [& r% m+ j* y5 l0 f
  574. / ]3 W( C9 W/ H9 i9 [
  575.         mov     ah,1
    ) N5 F) S5 r& i6 G; e
  576.         jmp     kbd_wrt_exit
    $ ]4 S* h% a8 C0 P9 {4 E; T
  577. 5 a5 p+ N5 `  K9 j8 \+ o
  578. kbd_wrt_ok:
    ) z. m1 f: F# p, i9 x2 c2 K5 x
  579.         mov     al,dl+ Y* H, O; f5 h( N
  580.         out     60h,al6 M+ T& @' O/ f% K- h7 u
  581.         jmp     $+2
    0 N& w# R2 V7 z0 N8 F& F. |
  582.         jmp     $+2
    . V& c& n8 B) ]% C" M2 ~
  583. ( A# Y8 {6 [, E+ _- f( N
  584.         xor     cx,cx- b) H% S/ u8 q7 w5 U5 M- p
  585. kbd_wrt_loop3:  s( l9 T- `0 B# S
  586.         in      al,64h
    2 H2 {4 i( Z* f" i. z: u
  587.         jmp     $+2) U5 V0 ?* T. k/ Q
  588.         jmp     $+2. \/ C' ]/ @4 @* i
  589.         test    al,2
    3 E0 c5 S9 z3 [( Y2 z: y! T
  590.         jz      kbd_wrt_ok3* V6 W% S# ^9 I4 s
  591. ! e9 ?! n" D7 S
  592.         loop    kbd_wrt_loop3
    * e4 v- Y: g/ \: j
  593. ) O; d5 |; a0 \' D7 ]
  594.         mov     ah,15 ~7 t" A  |* P4 u8 {' ]
  595.         jmp     kbd_wrt_exit
    , F' s- u" \) P$ T# ?

  596. # S4 e0 \3 K1 g0 d' E( ]
  597. kbd_wrt_ok3:
    3 o' U0 t/ o5 K1 V, W* O: X4 y1 A
  598.         mov     ah,8
    - t6 u" J! O, }
  599. kbd_wrt_loop4:
    + D, C$ ]+ G+ j* P
  600.         xor     cx,cx, O3 R# b: }6 `3 V( a  a% V
  601. kbd_wrt_loop5:- O# @: a: I1 D- t; w
  602.         in      al,64h
    & K0 ~" c" o- P5 e
  603.         jmp     $+22 T4 a5 n$ D9 `* H( T
  604.         jmp     $+2
    0 P+ ~) o7 p1 m9 U$ v8 Q
  605.         test    al,1
    " e3 O5 P7 P" l
  606.         jnz     kbd_wrt_ok4
    1 e# f, {3 D# c7 f( C, p- y

  607. & i3 A5 m) Q' `
  608.         loop    kbd_wrt_loop55 E. K0 P: e+ u* y' c

  609. 7 u& i( Q; S  L3 D/ |  y
  610.         dec     ah. Q- u- M# q0 S1 Z; ~4 x5 i* ?
  611.         jnz     kbd_wrt_loop4
    ' C, a# y( T, G8 `  l
  612. . _8 x: {8 K8 [
  613. kbd_wrt_ok4:
      v5 }* l" O& G* f# V" M
  614.         xor     ah,ah
    ! T) p+ E" j( ~' b: m; T" E
  615. kbd_wrt_exit:
    + z: ]% P# A* w8 p( ~
  616.         pop     dx( L# \* T9 [2 h0 a3 X
  617.         pop     cx. W) X+ ]4 H4 Y  C
  618.         ret6 e$ ]# @4 c0 B6 s
  619.         
    7 b. L" M0 m! F# ?
  620. keyboard_cmd:' [3 ~' O9 L4 W$ ]+ K# R7 c
  621.         xor     cx,cx) o  ^) L% ~2 d  K1 ^: {! o- K
  622. cmd_wait:
    / r4 L9 t" |. e6 S0 t; A" J
  623.         in      al,64h1 k' h0 f. h. O
  624.         jmp     $+22 a- c9 V7 P" C$ |( d
  625.         jmp     $+29 W( y3 g1 X) f7 K/ y
  626.         test    al,2
    2 i; d7 Z0 _: D) M
  627.         jz      cmd_send
    3 Q* ?: f* A6 U! L+ d
  628.         loop    cmd_wait
    4 ?6 x# t* p% j
  629. ) V  Z% N) J& L6 n5 b: v$ {5 L9 m6 J% v
  630.         jmp     cmd_error' i/ y3 d& z& G1 v9 ^9 [

  631. , M, F! I  O" u/ @$ r9 I% B; \
  632. cmd_send:
    , v, W, W) u; F5 b
  633.         mov     al,bl' Q1 k6 j/ r4 L
  634.         out     64h,al
    & ?/ p! M' C4 M, H$ a
  635.         jmp     $+2
    2 V, ^& L2 I3 s; T! c$ i
  636.         jmp     $+2! R8 F2 S% N# F: G% C

  637. 3 e0 o2 O' g! i7 X, |7 o  g0 n) c
  638.         xor     cx,cx. D, U  R5 m" k& P2 R, u! n
  639. cmd_accept:
      `3 U* W& O6 q* |, Y& i% A0 w
  640.         in      al,64h) a: `2 l% ]* O. Y: Y; s7 h5 w
  641.         jmp     $+2; t% V5 j* P" f5 s0 f, I1 q
  642.         jmp     $+29 I. h# y% n0 V' o% g0 J$ `1 ]
  643.         test    al,2
    1 _- Q$ x7 N3 Z
  644.         jz      cmd_ok
    1 e" {% h/ j. R7 f; ?5 J0 H
  645.         loop    cmd_accept* z$ l' Z% B3 ]
  646. ! a2 v5 J/ ^3 ^. G0 I" k' k4 V
  647. cmd_error:
    ' [: L3 e- p4 z- t6 V
  648.         mov     ah,1
    5 |; _5 A! l3 _% b% c
  649.         jmp     cmd_exit! u# }* r' ~( l" |  x7 u% x
  650. cmd_ok:
    0 c( ~1 I1 Y: _# y6 F
  651.         xor     ah,ah
    $ Q" F7 o: v9 h4 e
  652. cmd_exit:' T6 h+ f0 F# H5 O% M  N/ L2 q6 y. ~
  653.         ret
    ' w/ e5 Q$ j! e' o8 Y
  654. ( ?7 A( A9 @& b% l- ?. q# I
  655. new_33:
    % N" y1 k- @- u- x/ ]5 {
  656.         cli
    # q0 |# }& M) k+ k5 o
  657.         cmp     al,0# W0 m+ }: R/ ~
  658.         je      reset_mouse
    ! ?- b' Z% A; \6 ~" ~8 m  O( n
  659.         cmp     al,1! F0 r  H* D* b( R! Y
  660.         je      show_mouse1 n& i3 Q5 _) S, B9 p* j
  661.         cmp     al,2
    6 C6 w4 M5 ^: H/ }; p  Z
  662.         je      hide_mouse
    & _! o0 r: n6 ^8 o7 o/ O
  663.         cmp     al,3
    3 p- P. ]6 J8 }4 z- t0 q
  664.         je      get_pos4 c$ M7 K% _8 `$ b
  665.         cmp     al,4
    " L# `$ N, k+ J* ?+ V1 H! }
  666.         je      set_pos7 \* x- a! n- D5 c7 T
  667.         cmp     al,7
    0 W2 K2 u# K$ A7 `! V: N
  668.         je      set_hor_pos
    - ^3 a% [. w6 R9 c3 [: o
  669.         cmp     al,86 k% i- l/ l5 o1 Y& G- w6 p
  670.         je      set_ver_pos
    3 X' H$ @, X- G- {' j; `5 a  j1 T
  671.         cmp     al,0bh
    7 c" P! C6 |9 `' O
  672.         je      get_mouse_movement
    ' c1 |' x' H% B: K' Y8 i
  673.         cmp     al,0ch' P! _& S0 N! B+ @
  674.         je      set_subroutines
    7 T( {4 N' r* K* y! s/ A
  675.         cmp     al,14h
    6 j7 o3 K# S- Z& h4 E* d& {1 g# O2 o% j% i
  676.         je      swap_subroutines
    & G2 R+ t( k3 P6 C5 j7 {8 B
  677.         iret5 ^: U$ `' r) Z* p$ W, d& M+ \
  678. % L; w% @" I  g1 p" O* c
  679. reset_mouse:3 K: h! P" I. t) a
  680.         jmp     _reset_mouse
    ! h, s, f9 p2 S3 l: N
  681. show_mouse:
    ( v& l7 ^3 f- ]8 Q3 v- X1 z
  682.         jmp     _show_mouse
    ' a: [7 M0 ?3 |! |# b! e
  683. hide_mouse:7 Q; g+ Z& J! [: B: {1 N7 A
  684.         jmp     _hide_mouse9 m+ j' L0 ^* H+ ?. _1 ^% U$ N$ R
  685. get_pos:
    2 Q  P0 b; R+ S. `9 a0 G1 d
  686.         jmp     _get_pos
    / X( i6 X; {1 {) M2 _! X: i
  687. set_pos:
    + C1 z' N  D# r1 t
  688.         jmp     _set_pos
    , E5 E) \" p1 F) ~; G* }
  689. set_hor_pos:2 f% J! \& O" N
  690.         jmp     _set_hor_pos  B9 U- z& n$ s7 y, Q/ e0 {5 g
  691. set_ver_pos:+ `) I. ~- i  t) V/ C7 A1 w; d/ Z1 q
  692.         jmp     _set_ver_pos6 C: Q: E; @' \
  693. get_mouse_movement:6 t( o+ ]5 X1 r, Q8 r
  694.         jmp     _get_mouse_movement
    , \# G5 I0 w3 u$ U
  695. set_subroutines:. i, }# ~7 [  F0 P: g8 s. D
  696.         jmp     _set_subroutines
    # x1 F, I5 T* M% \3 a
  697. swap_subroutines:
    * Z$ d: \* ~4 ^" ]) ]* u4 w
  698.         jmp     _swap_subroutines
    $ ?5 U  W7 _# A

  699. * t  _! _3 C# Y; M6 S: t% ^+ D( S. d
  700. _reset_mouse:  m- h' [/ L! I" C
  701.         mov     byte ptr cs:[buttons],0
    3 e7 t; K* @+ u. x3 @
  702.         mov     word ptr cs:[pos_x],0
    / w/ E0 k" J' |8 j' y/ G
  703.         mov     word ptr cs:[pos_y],0* ?8 @4 K4 F: g
  704.         mov     word ptr cs:[x_move],0
    % g3 j4 `' Y: K$ L/ {5 ~$ v
  705.         mov     word ptr cs:[y_move],0
    $ K, g( {& O  `  P
  706.         mov     word ptr cs:[x_max],6398 M! y+ Y" v( ]3 ]$ w2 `0 A
  707.         mov     word ptr cs:[x_min],02 Y: |5 H+ n) G# s9 Q; l3 ~, R
  708.         mov     word ptr cs:[y_max],199
    5 N" {  {$ {) n
  709.         mov     word ptr cs:[y_min],0
    - k3 w$ W) h, Z) j- `9 O# q
  710.         mov     word ptr cs:[user_mask],05 F, A6 m; Z! r( y2 }6 N
  711.         mov     word ptr cs:[user_subroutine],01 |/ n- c* J8 B
  712.         mov     word ptr cs:[user_subroutine+2],0: S3 N8 r+ S, a6 S# z
  713.         mov     ax,0ffffh
    2 b" [/ L( X9 T6 o& \! \8 G/ ?
  714.         mov     bx,3  f& h% h/ f% z, r0 K8 S
  715.         iret8 k8 T% s; `* h* W; c
  716. & @/ z3 ?. U- X* b
  717. _get_pos:4 u+ M* o* f- T! s7 f% k' |. E  m
  718.         mov     cx,cs:[pos_x]
    . O* L1 ~% M. y
  719.         mov     dx,cs:[pos_y]# e/ x: o+ C0 }0 w" R# n
  720.         mov     bx,word ptr cs:[buttons]2 e: A$ `- `4 M: y; e/ n
  721.         xor     bh,bh" ?) w, y2 H1 _6 ]( {" l4 [
  722.         iret( E% g" p- g7 N% }: b# ^; U( t* f3 X
  723. % I/ d, N- g4 s1 B2 h0 e6 _5 M, U
  724. _get_mouse_movement:4 {7 V6 S+ \  }$ E
  725.         mov     cx,cs:[x_move]
    0 Q  ?6 y4 O0 v" m) R  i
  726.         mov     dx,cs:[y_move]
    3 c+ v' o( G/ i0 i1 r3 f8 `# {
  727.         mov     word ptr cs:[x_move],0+ }2 B1 v% l& h% Y. n, V
  728.         mov     word ptr cs:[y_move],0- X  k5 z# u) B/ \4 |) ^! R
  729.         iret# r, x( O7 e- B6 Z+ T. p: G) [

  730. 0 k' Z. M) S: u) S8 e& @! D
  731. _show_mouse:( [4 I8 e. Y  S7 e2 z) B
  732.         push    ax
    3 {; ^% n* _6 ]$ g
  733.         push    bx
    - U# W6 m! u# M! |5 g; N$ [
  734.         push    di
    / Z0 V7 _+ y& R7 x$ d/ |
  735.         push    es
    ( C& J' _' u, q! M. a2 w
  736.         mov     byte ptr cs:[sm_flag],1
    2 Z! N: D" z5 k4 c' U
  737.         mov     ax,cs:[pos_y]1 d; ^$ r) D5 R  @
  738.         shr     ax,30 f! [1 V7 _5 F1 a! @
  739.         mov     bl,80
    5 `" j9 {1 S, D! i: P  X* z7 H
  740.         mul     bl5 o7 L- i# v: T$ W( [8 X* k# \
  741.         mov     bx,[pos_x]
      @% V: \' x/ J* b
  742.         shr     bx,3
    : A/ u, b/ c0 T$ }; J. ?
  743.         add     ax,bx, x* C/ \9 q4 }
  744.         shl     ax,1( ]4 O5 s+ L; L0 F# I$ {1 o1 O
  745.         mov     di,ax( j% c0 ~: W$ W4 v
  746.         mov     ax,0b800h
    ; o. G, d3 T) _- R( D! ]& u5 B, c
  747.         mov     es,ax. i4 b; |: x. l# {
  748.         mov     ax,es:[di]
    8 r8 o6 d* P2 @/ `/ ]9 y0 l
  749.         mov     cs:[save_char],ax0 q7 G2 n; b1 e6 Y8 R. m
  750.         not     ah
    ' e: X$ s  m1 m4 S
  751.         and     ah,7fh
    5 Y9 a; c/ z" o1 \( G7 l; ~, z$ K
  752.         mov     es:[di],ax
    3 a" f0 m. t* u0 h* L
  753.         pop     es
    ! G7 h  N9 n- i5 L; ^
  754.         pop     di
    * g/ y. X5 W3 h' J
  755.         pop     bx( Z, I1 m8 |( f
  756.         pop     ax4 v  f8 M, _. q( p: Y7 @/ n  U
  757.         iret( v( `" Z/ w' C8 a: B

  758. " }$ ^( p: ^8 U  I# g- l" I
  759. _hide_mouse:
    2 I. `( S/ w/ z6 ?4 L
  760.         push    ax0 G. n% a3 M( F  X  Z5 y/ u0 L9 V8 [
  761.         push    bx
    ' t& l2 O' b" [0 A5 p
  762.         push    di
    * I. p: D- }& _& P
  763.         push    es6 w0 S- B; V, Q, I) P+ y
  764.         mov     byte ptr cs:[sm_flag],0, p/ L; F* X: S" e5 c
  765.         mov     ax,cs:[pos_y]; Z8 O$ z5 U5 _' i; l% W
  766.         shr     ax,3, G6 a: _) s# ~
  767.         mov     bl,80
    6 p3 |2 J% A$ l& f; E
  768.         mul     bl* L1 }; U) m! u* O, q* Y
  769.         mov     bx,[pos_x]* W; N" r; z5 N" w! `
  770.         shr     bx,3
      \, ^& O6 Y& f' E
  771.         add     ax,bx& T3 P' o# g3 [" B
  772.         shl     ax,1/ S( ~! {( [) M  q1 Z& a
  773.         mov     di,ax! y7 T5 a( x: E& ?( q
  774.         mov     ax,0b800h
    0 g* Y2 y! y) }6 F
  775.         mov     es,ax3 K: B* f8 p% _9 S1 q# n' N
  776.         mov     ax,cs:[save_char]& ~1 |( V0 M3 J& h( E8 W& J6 h
  777.         mov     es:[di],ax: `: o. F; w9 z; C# ]1 r
  778.         pop     es# V7 X' @; n2 c- I8 {
  779.         pop     di
    2 _3 K! x4 p( v& T
  780.         pop     bx- m" g8 d! L; S) X# Q9 V& L
  781.         pop     ax
    3 L8 e' x6 s, s, s) B, d
  782.         iret
    , U0 M& v  _* W! x$ a7 _
  783. ! z( r& G- m$ n; v- D4 D
  784. _set_pos:. i  _4 n2 Z- r% _
  785.         mov     cx,cs:[pos_x]
    % h4 q. z; i$ n$ x: Z- D
  786.         mov     dx,cs:[pos_y]1 r& C1 B2 A. [0 G6 u+ Q2 s# O
  787.         mov     word ptr cs:[x_move],0
    6 a" A8 J% Y$ U4 N$ v5 F) n7 ^7 B
  788.         mov     word ptr cs:[y_move],0
    0 N& B: R) L$ u, E0 X" _
  789.         iret/ |3 j/ h6 J. r, \2 y

  790. / Y+ H. U) N% Y' K! N, g
  791. _set_hor_pos:2 Y; b% J4 }( K4 l8 H' I7 c7 G
  792.         call    max_min
    , v" A- D# k  y! M: }' y
  793.         mov     cs:[x_min],cx* |% e2 t. Z6 h6 e2 V- e6 \
  794.         mov     cs:[x_max],dx
    ( P) c, k& y0 v, m, f$ @
  795.         cmp     cs:[pos_x],cx* B3 ~. _# Z" `8 }8 \( I
  796.         jge     good_hor_min
    $ u3 u8 I7 L! g4 d
  797.         mov     cs:[pos_x],cx5 }' V5 E- x& A8 }- t, _
  798. good_hor_min:
    5 t. B; W/ l% @( D3 c$ S5 A
  799.         cmp     cs:[pos_x],dx- A. I2 O4 C4 u! Y/ q
  800.         jle     good_hor_max
      O# a2 c+ \  ~: I
  801.         mov     cs:[pos_x],dx
      J+ U2 ^. f! w# D- j" E0 R
  802. good_hor_max:
    8 @  @! H- m) J, [8 \3 B
  803.        iret5 Y2 q  E  j! S0 P2 w+ a4 ?& X5 ~

  804. ) q: \, B! Y! `% [8 Q  B! W" l. e
  805. _set_ver_pos:4 {4 o; f1 L, Q) I) Z; _0 B
  806.         call    max_min" a& D$ U' Q1 O% t$ K5 M
  807.         mov     cs:[y_min],cx  S/ c; o" [7 S# Z
  808.         mov     cs:[y_max],dx
    : G4 \4 L: s. T. H
  809.         cmp     cs:[pos_y],cx# Z( ]2 _3 }+ |8 c5 h
  810.         jge     good_ver_min
    7 d# x8 R$ Z! U& x5 e
  811.         mov     cs:[pos_y],cx# h' w/ A$ @4 K
  812. good_ver_min:
    # j! H+ q" T) ]; H0 l  |( d. \
  813.         cmp     cs:[pos_y],dx" ?; k) m8 `/ ^$ n* ?  r2 W
  814.         jle     good_ver_max
    7 k6 j( {; R; d$ ?& a& ^3 f# d
  815.         mov     cs:[pos_y],dx
    ! X7 J& ?. L) r9 A2 e/ W/ |
  816. good_ver_max:( v+ F2 {4 A7 D; X: d
  817.         iret
      w/ T0 T- z0 l3 u) \( c

  818. " }+ \! \# T- z$ M' d, A
  819. max_min:% ?' R% {0 a6 L6 Z) Y
  820.         cmp     cx,dx: X# ^) M9 I. }8 \! ~$ @' R  P
  821.         jle     no_swap
    2 s% e* Q$ S& o% e
  822.         xchg    cx,dx
    5 p) [9 L: b1 F
  823. no_swap:
    4 C5 t2 o; X* y' t* b
  824.         ret
    ( R( l* s4 U* }, ~' @! e: c

  825. # h: p6 Q. b3 a- O, n. n: M
  826. _set_subroutines:! X2 x+ x; {  P& t# C
  827.         mov     cs:[user_subroutine],dx: I  _" J; Q$ i+ f9 c  x
  828.         mov     cs:[user_subroutine+2],es8 J% ?: o) m& X$ b$ @
  829.         mov     cs:[user_mask],cx
    2 U! Z: o* J2 t2 Y
  830.         iret
    3 v$ X- F3 f  I  G

  831. / Q$ c/ a5 \3 B9 D. I) n6 c+ W; F
  832. _swap_subroutines:
      z) V: x, m, Y  d# i' X
  833.         push    word ptr cs:[user_mask]7 @# Z" d4 W3 y3 l
  834.         push    word ptr cs:[user_subroutine+2]: O+ C1 M7 |8 S7 F$ ^3 y
  835.         push    word ptr cs:[user_subroutine]8 z/ y2 Y! F7 k" d, U4 `
  836.         mov     cs:[user_subroutine],dx$ v. o: w) k8 ~! D' A, A; O
  837.         mov     cs:[user_subroutine+2],es
    8 f) E7 I7 @: L  _
  838.         mov     cs:[user_mask],cx
    ) r0 L# w3 @8 q
  839.         pop     dx3 }' O2 O) B' m( b4 ^& E# K  [
  840.         pop     es
    ; D0 w& m5 q' N3 s7 n, D3 R: @
  841.         pop     cx, V$ ~/ h* A; C6 D( J0 j$ p# f
  842.         iret; l$ W1 X  j% w% z5 G0 J2 \5 P1 @2 K
  843. 0 D) f1 d5 B1 `- ]: }7 M
  844. memmouse        endp
    / U& G* T6 T0 o( }
  845. ( L8 \& j. l) p
  846. endof_start:) F3 t4 r' q0 @- d
  847. - Y# Q" `  t3 U/ F6 ~
  848. emsg db 'No mouse driver install error!$'6 A& A1 Z5 D; ]
  849. old331 dw 0/ o# h" f* t( r; p/ p- z
  850. old332 dw 0; v, s* {' Y+ B* w+ L* x* w
  851. old741 dw 0
    5 R2 r7 s, N3 w. R5 K
  852. old742 dw 09 N9 [+ }6 x6 |. C+ v6 m
  853. memcopy db 0
    9 c% U( [3 p1 a+ }8 R4 A
  854. okcheck db 0
    ( c5 m+ j  \" Z' p. _0 w
  855. pass db 00 Q5 c! p% v9 }5 G3 t3 t
  856. chkl db 0
    ' T& v4 z- I1 A: v, ^% O: s
  857. lk db 0
    ) L3 o" z' q0 ?1 X+ u! W! E
  858. chkr db 0% Y8 s" G1 j( O* a& s! V
  859. rk db 0
      |& C" q9 q+ W! y' C6 s- n
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '* v* s! D+ b* A* z! u+ g! Z! F2 ~
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    : F& Y- q$ w' k) E% g; d  V
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ! c; _. N+ P. D- o& ~2 Y
  863. db '                                                                                '
    7 s# T% P% L0 h5 \- L
  864. db '                                赏屯屯簧屯屯突                                  '0 @" M3 W& ]7 a# D; ]( t" d
  865.         db      '                                ?OFF汉OFF?                                 '& h; @5 {( n' _: v" c
  866. db      '                                韧屯屯既屯屯图                                  '/ K; d; |5 a- X, j' x" c
  867. db '                                                                                '
    0 l& f4 ]) z7 y3 {
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ') s/ P# |8 _0 j0 v- V
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 6 Q  [" j8 p/ n$ q/ l, _. L8 |; A( K
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '& b$ F( ~: X) T+ g/ S
  871. ' A9 v7 j- |" k$ G9 P! W
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
9 |, r/ N8 ~/ A* G哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... $ A  ^/ Q+ T+ `) |1 c4 S1 o

( S2 x, {* M8 g谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:47 , Processed in 0.041795 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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