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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
  D# ]5 t# |. X. ]9 y- I3 z: g. r9 a. @  X" P9 i1 s5 m
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ' N; A/ A, v3 Y! {3 y$ ~2 [9 L
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    / I4 X9 L0 P4 E
  3. ;                                         By Bini.Yi 易祝兵
    ) G- R6 ?: t+ ]. Y+ }) l# e
  4. ;                                         http://www.ufoit.com 计匠网3 e# t0 M/ O7 E: [
  5. ;                                         2002/04/06 YYYY/MM/DD
    2 t; f. E6 R+ d
  6. ;
    ! e0 |# ~$ j7 s  w3 `3 i
  7. ;         
    ' R1 P" _$ @. s' l
  8. ;          This program  test the mouse button  click and move.
    9 W- {# O7 x0 ^$ Z: b4 h5 M4 O
  9. ;* l& _8 j3 f& o! Z# C# K5 x# G

  10. . n# d& B4 b' x+ |
  11. .model tiny* M& b( Q) x0 Y
  12. .586
    , a2 U, M* V1 g, I
  13. .code
    ( s2 V) W* g0 F+ Y% S
  14. .stack  100h
    + @5 [5 S0 l9 C" X
  15. .startup
    ) m6 {  t$ f# |, S3 J
  16. pusha
    ) q8 }; }) Q( y. U
  17. mov ax, 3533h+ J8 c0 ^0 p1 `2 p
  18. int 21h5 U$ S$ B8 `9 W+ z  X
  19. mov word ptr cs:[old331],es; }: D8 A, H. ^( {: W
  20. mov word ptr cs:[old332],bx) ^: m0 B6 [, G( U( n
  21. mov ax, 3574h
    + \7 U$ p  T6 ]0 f2 d9 T4 i2 J
  22. int 21h
    9 i% s8 B8 V, H
  23. mov word ptr cs:[old741],es
    % [1 G, _. q9 z* Y" c& {3 X
  24. mov word ptr cs:[old742],bx) p1 f7 z5 d2 d
  25. popa: z, V7 \& L9 a3 o( P, z  \
  26.         call    memmouse* z- \: e' H6 a: f' D, r+ U
  27.         mov ah, 007 c: y% v8 E7 u# V3 F2 D. W- _0 i
  28. mov al, 03
    - |$ g+ x& u1 j5 y/ F/ Z5 z/ h
  29. int 10h
    8 }) a$ i2 ?6 |% o) R4 Y$ w! m
  30. mov ah, 069 s8 `1 o6 X* H; P
  31. mov al, 0  n; y1 d6 X* ~  Z
  32. mov cx, 0
    2 ~7 U- X, _, I$ D
  33. mov dh, 249 v& C; C( U) @3 t5 k
  34. mov dl, 79
    4 w3 _. W5 u) d# _% `' O
  35. mov bh, 07h
    0 a0 ^) j0 I% n' \6 p4 _
  36. int 10h$ N( D5 j3 ^- c3 H, l% @8 T
  37. mov ax, 0000- W2 ?) Y: A/ _/ r# k! H
  38. mov bx, 0002. H6 x* L' ?. _" J1 C9 z  |6 @$ I
  39. int 33h
    ; l3 I) p6 H, J+ I: C
  40.         cmp     ax, 0000           ;if no mouse drive install
    0 \% a: A( r4 H" K
  41.         je      errormsg           ;show error MSG" i$ z( a/ H- l
  42. mov ah, 02
    2 E) A: Y$ S6 _# Y# y( ]' b
  43. mov bh, 004 W5 K  d" s3 ^( r( Y. }
  44.         mov     dh, 25             ;Move point out screen& X/ X' U5 R( X6 H: `
  45. mov dl, 795 T/ a: h$ D* p; _6 @9 u
  46. int 10h
    , a; E$ G# t* S9 b; |
  47.         call    showmsg            ;Show info
    . O( `: E  N( V, L
  48. mov ax, 0001
    ; K* v" e% @; D
  49. int 33h
    7 D. W, W. g& W% A1 @8 w
  50. ; mov ax, 000ah2 K$ `4 X! z) F# [% ~
  51. ; mov bx, 0000& V/ ^  D+ H& x, E; I9 c
  52. ; mov cl, 0h$ }) Z( x; G6 s7 X! Q# @+ b
  53. ; mov ch, 0F0h- \$ e0 ]2 F6 ?
  54. ; mov dl, 0h) ^6 \+ K# v# b( E$ s
  55. ; mov dh, 0F0h
    + r) a/ q* w! _7 s1 k0 u; q+ X
  56. ; int 33h
    0 P, A) z9 K) W9 r
  57. mov ax, 0004h
    4 m7 X9 u8 ~7 B* `1 h
  58. mov cx, 03193 E% O0 t# A: O' A
  59. mov dx, 0103! |7 F" V/ x5 `6 p' M* X' c7 J! Q
  60. int 33h/ N8 [& c9 r2 b/ e2 z/ s
  61. casemo:                           ;Case button click and point move
    ( ?4 d- Q7 O( p, m# G' P% O
  62.         mov     ax, 000bh         ;and keyboard press
    / q9 Z. k0 s. R  M
  63. int 33h
    ( O% A% L: y, r7 W3 L$ h
  64.         cmp     cx, 00h           ;if point move....X+ J, J3 f9 l1 {* g. S" n
  65. jne xmov
    7 Z( g7 N, Z  S% ~& c6 T
  66.         cmp     dx, 00h           ;if point move....Y
    5 Q) m' w2 ]- u: z7 U
  67. jne ymov8 O6 J+ K, f0 x2 I! I$ i
  68. xymovend:                         ;X.Y move end. M/ U6 ?* ?9 i9 Q. q  a# B* @
  69.         mov     ax, 0003          9 k; @; u+ Y4 R1 O5 O
  70. int 33h: M9 k& E  Z  {6 y( j8 n
  71.         cmp     bx, 0001          ;if left button click  show ON
    , F0 |" \, G# @4 ]1 r
  72. mov si, 1828& u5 ^6 H6 c+ o( f7 W, {. T3 ^
  73. je listl9 k. g  {: p/ D  U; m
  74. mov si, 1828
    5 T' q. P8 z; P" c7 s6 O
  75.         jne     nlistl            ;if left no click show OFF
    % q/ r, y! b) V2 x" K5 W
  76. testr:
    . A1 J/ F! q# N+ r
  77.         cmp     bx, 0002          ;if right button click show ON
    2 h8 r' E. @/ G# j7 b4 t5 U4 Z6 e# P
  78. mov si,1842
    4 o8 q' d% j3 g: J+ d. x2 p$ C
  79. je listr
    * w+ v! ~9 E2 b* M
  80.         mov     si,1842           ;if right no click show OFF
    $ ]3 ^: |! a# _4 G4 K
  81. jne nlistl
    - a5 r/ V& `" N( r. _- l% Y: }
  82. casekey:! b2 g! q# [. ~6 c5 o. a  Q3 e
  83.         mov     ah, 01            ;if any key press jump check
    ; ^( |! M. j% z
  84. int 16h8 f  ^' s$ l- V  `; G1 n' V
  85. jne kpress6 W. k* I0 |  P
  86.         mov     al, [chkl]        ;check x flag
    " w; f6 z( a" z% [$ k7 j! _: J9 B
  87. cmp al, 02h
      m+ w2 n* T* S
  88. jnb chkok/ X/ Z0 R* P7 U8 k
  89. jmp casemo
    1 _, L& @! ?' o  Q( I3 j
  90. xmov:                             ;if X moved, get the X flag+1
    ) ~4 f5 ]( d4 J
  91. mov al, [chkl]
    9 m/ `, H) q8 k  l- ]# V4 M( `
  92. inc al, b/ R0 o% R5 H' y- a1 _0 D
  93. mov [chkl], al
    1 X9 e/ w# L9 ?& w9 u
  94. call passok
    / C! V: A! B1 X5 l7 l2 K, I4 N
  95. jmp xymovend
    2 t/ E+ M2 g! X  J8 X6 b, m: Y& I
  96. ymov:                             ;if Y moved, get the X flag+1" Y4 Z  k: N2 b$ ]3 e
  97. mov al, [chkr]
    - c8 O9 @( i* \- f+ ?
  98. inc al
    2 [& F: F5 j& y3 R4 J
  99. mov [chkr], al
    ; m* |2 I& C$ d2 K4 ]
  100. call passok
    7 B7 {  H& D9 x" i$ f6 {( Y  `4 q
  101. jmp xymovend
    ( n4 ~  F, \# m3 X5 P

  102. * K8 f: Y+ S7 i/ g# E
  103. passok proc near
    2 _( f( h$ e6 {( M$ Y/ R. G6 \
  104. mov al, [okcheck]
    9 Z/ {* I1 S: b% p3 I
  105. cmp al, 1  \* n' [7 `8 z7 w
  106. je let0) v* b  H- m* f1 X
  107. jmp passret4 t4 E! y( E! _) E
  108. let0: / h8 b3 m" ^2 S4 ?5 ~7 M4 {( l
  109. mov [pass], 1
    , [9 e9 j% v+ T& s$ M2 w1 |# H8 Q
  110. passret:# w' J# A6 O0 B, G, a* E3 {
  111. ret, Z9 H, x0 W7 o
  112. passok endp . S% C7 O6 s6 S0 P2 z# ]: v4 r
  113. " C4 \5 J2 Z( `; h2 p
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS3 R: {: O' X, o% Q  q. |
  115. mov al, [chkr]( X1 ~( J5 ^- `4 X. l8 n+ Q1 ~
  116. cmp al, 02h
    $ ?+ r( T. D! q. h0 s4 p
  117. jb casemo) }; Y$ x, X+ [: F  N; @* u
  118. mov al, [lk]; ~$ C( l/ ~7 m0 Z/ k5 b0 J
  119. cmp al, 1
    ( h  N% k/ I% _) a- g7 m- g( S- p
  120. jne casemo
    & o5 q8 r, m) W! o! {0 r# r
  121. mov al, [rk]* q9 v1 {) ]/ D/ _8 F; [2 K/ r. @
  122. cmp al, 1
      u$ J3 o4 E# z% X9 y5 ]; u1 e
  123. jne  casemo
    % n" ?6 p. `' C( @- u
  124. mov [okcheck], 1) V3 C' x* H  R, ~' [- V6 L4 a" I" m
  125. mov al, [pass]
    . P' i8 c( V) c5 F3 F
  126. cmp al, 1: G+ n) S$ |- d5 ~9 Z8 s
  127. jne  casemo) R; v- o# d2 |' Q0 u' ]
  128. mov ax,0002h
    1 F% D) H! q: U0 {# z5 L, {
  129. int 33h7 b% C/ p5 Y# p4 [
  130. call cleascr5 [/ E  Q- h% i/ M

  131. 2 t: \) }( k# P# z2 x9 m
  132. call oldint
    & T/ l, N- D/ C- k
  133. mov ax, 04c00h
      K. o# H; F5 J0 {+ ~. U4 z& ^
  134. int 21h$ I2 q: j; q- q  o

  135. # [$ }0 U0 P: r! E
  136. okexit:
    5 f, E/ f" l0 e1 Q: \8 }
  137. mov ah, 4ch7 V4 E. V/ E$ i' s& u) o! j6 i
  138. mov al, 0
    4 Y" u, u4 l* v
  139. int 21h0 W! P$ w: Z0 w& F6 j5 v
  140. listl:                                 ;Show ON
    0 v) j1 P0 c1 |( U
  141. pusha8 O  m  O: a5 L- s8 C* w4 I8 k
  142. mov ax, 0b800h
    5 r2 D' M; t+ Z& o, L
  143. mov  es, ax
    8 \! v- W: ]9 V: K9 B* |5 G8 E# z
  144. mov ah, 47h9 Y1 @2 E  z# v6 @! E1 ^
  145. mov al, 20h9 T# n6 G) b7 i' r% r  ]
  146. mov es:[si], ax, g+ K; V4 T& t9 O) v. N" v
  147. add si, 022 f# {! c8 T& {! E4 ^
  148. mov  al, 4fh$ S* q+ `8 d$ z* h! e
  149. mov es:[si], ax
      Z6 T" S6 {7 L: q) E1 P  |' q4 O
  150. mov al, 4eh
    5 \& J" m! @" g
  151. add si, 02
    5 ^1 c5 x0 u' e  ]: E4 u
  152. mov es:[si], ax
    : p* V$ E" ^- @3 ]( C$ ]" Z% g
  153. mov [lk], 1/ r- {+ }1 A5 \/ m' w
  154. popa
    " A( b) u& _+ \% C
  155. jmp testr; ?4 }- ?4 s8 j* a
  156. listr:                                 ;Show ON( Z" O! z4 X' U3 O
  157. pusha
    . Z, O3 [# [) i* V* y7 O5 I8 {8 c
  158. mov ax, 0b800h9 M& z9 L* o# f; J( F  s1 V
  159. mov  es, ax
    / m9 J& ^* {- u; n6 b3 H
  160. mov ah, 47h
    ) k5 a) t( T9 R" [% w5 R) R
  161. mov al, 20h
    0 p$ K' A, [& c9 w% t
  162. mov es:[si], ax
    + r+ _. n! q! C
  163. add si, 021 w/ v  B! S; c" S+ x% x- Z% O
  164. mov  al, 4fh
    0 q8 E# ~! p. o; ^8 `
  165. mov es:[si], ax
    0 |1 w; _2 p2 a* d+ I5 z0 W, p
  166. mov al, 4eh- D& N8 f% X2 U
  167. add si, 02
    3 j2 E+ ]: ?- e. q! ?
  168. mov es:[si], ax
    ; z- H9 ]9 K2 ?0 b
  169. mov [rk], 10 l5 T# T% P) q2 |9 `# L6 P8 m
  170. popa( Q6 _9 v$ w$ c  Z' H
  171. jmp  casekey
    " o5 r' B1 C" C+ e2 k

  172. 4 K% `1 q! C, s9 t0 H6 B) t
  173. nlistl:                              ;Show OFF
    9 I; @% |9 E; O- l. j% w, c
  174. pusha   8 S5 N5 ^# ], W3 l2 b1 a
  175. mov ax, 0b800h
    5 R9 |3 Q% x/ ^: N# L
  176. mov  es, ax' f  R: \& {. k! R: R9 m
  177. mov ah, 17h
    2 h/ X1 t0 G* J4 f; W0 M' j
  178. mov al, 4fh  S1 p) k0 s8 u! N% I
  179. mov es:[si], ax
    3 E* f7 B- l0 L8 I( T2 w
  180. add si, 029 X. z$ ~3 |* H+ b( F% `( ~
  181. mov  al, 46h
    % n1 D5 b% c! O8 |# G
  182. mov es:[si], ax
    : n1 \. h2 v  C+ A0 G4 r: ]
  183. mov al, 46h" U7 i! O+ A# j( j* M+ \
  184. add si, 02
    9 I$ T; ^) K, [- S9 @( r
  185. mov es:[si], ax/ o1 ]. ?) a3 N1 W
  186. popa
    2 Q$ b: M# ]7 C6 Y% ]9 t3 t
  187. cmp si, 1840' [$ f) r  S6 d  e1 o5 o# V
  188. jae casekey# o2 k; `* S2 c; g9 _
  189. jmp testr
    6 P+ f0 S  g; s7 t! I. c) N

  190. 7 b, Y8 e4 @+ o( I& ^4 A- w
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    + e# @% i7 @; i; c* t
  192.         cmp     ah, 01h             ;and return a error  c, y9 }3 q1 F; u0 c5 S
  193. je exit1
      a1 T6 Z+ Y' G7 a$ N
  194.         mov     ah, 0ch             ;if press other key then clear
    9 _- N' i2 d4 N/ z9 M. z7 [) c, g
  195.         mov     al, 00              ;keyboard buffer6 V7 N& u$ F7 v$ v( ^* b, F
  196. int 21h
    * H; b2 T; z8 n4 L( q; j
  197. jmp casemo : f5 V) `2 P0 s3 v' t* ]
  198. ! z. b6 \0 g6 [2 |
  199. errormsg:                           ;if mouse driver no install
    & x; k% r/ Y! L
  200. call oldint
    ; Y# I$ O) F$ j+ r4 `( R) [
  201. lea dx, offset emsg
    " i  L7 L: w! k
  202. mov ah, 09h# ~1 V5 l5 P6 R! W( z1 M
  203. int 21h7 o6 }5 X/ T1 U- C% W
  204. mov ah, 4ch- y/ [! S: w, Q5 g3 U
  205. mov al, 2
    - P" z; l0 H! |: O
  206. int  21h* }+ @, }7 K$ m* f

  207. . M+ @* m7 f0 v4 g
  208. exit1:                              ;error exit2 ~4 |) s5 k/ E4 i: @3 I( s! c( X$ t' `
  209. mov ax, 0002h; ?0 u! K* c# m% p: O' x
  210. int 33h$ Z, b' |* q. S9 M: r% W  F' b5 w% J# L
  211. call  cleascr* g! O; F3 k0 @' A% c8 b1 R
  212. call  oldint
    : d' V3 r: d6 }: R3 y
  213. mov ah, 4ch
    , Z3 O4 @4 M9 l+ F: R0 E5 g* W
  214. mov al, 01& y( }" F1 I  S) V8 m2 |: G- x+ q* X
  215. int 21h
    : q9 J. E1 }/ i# y% m

  216. + m. d9 B1 ]$ L& X$ N5 \
  217. cleascr proc    near                ;clear screen
    + h3 q% R& [- l* F: C
  218. pusha' y" ^# R  z6 l# g; w* O3 u" I" y
  219. mov ah, 06
    ' _3 e, I% q( s) T
  220. mov al, 0$ q# |; n+ T! P& t/ _
  221. mov cx, 0. X0 g+ x" Y; K
  222. mov dh, 24
      i; v3 L! o" N$ T" p' N3 A: D4 {
  223. mov dl, 791 {; O( O& ]' o+ F& k
  224. mov bh, 07h
    - P0 f7 h& J# Z5 m
  225. int 10h
    " R& v  |: s" ~
  226. mov ah, 02
    / T& ?, Y1 |8 P5 B3 A9 i
  227. mov bh, 008 s4 G  {( d) Y* [$ R
  228. mov dh, 04 m4 e% c' t' z! y3 ~
  229. mov dl, 0
    ) q2 I8 j4 a8 Y* T2 l
  230. int 10h3 v  }  z8 `3 |! U4 {( x( |6 b2 w
  231. popa6 b% `# Y' ]6 P  r& l$ f' s
  232. ret
    * Q0 {( e2 y9 d: Z! L: C
  233. cleascr endp
    ) }0 n# G4 t" c: M# f
  234. 2 o* a  h0 \7 n* v& t
  235. showmsg proc    near               ;Show info
    7 L# e7 x" S" l+ h  y
  236. pusha4 N+ K$ y  e' H- v2 h
  237. lea di, offset showms
    6 F6 Y) Q+ I4 @% e3 K3 N" y
  238. mov ax, 0b800h
    ! s5 p5 y" h* X$ z
  239. mov es, ax( G; g9 [/ N/ a+ n) w. C
  240. mov si, 0
    ; m( g/ g% s/ @) ~
  241. mov cx, 480+ B; o2 d3 @' G* r" O" G" o0 [
  242. mov ah, 07h2 V* p# V) l* K" `; U' a+ ]
  243. @@:" ]$ {7 k* y7 }1 g
  244. mov al, 20h+ Q5 k0 t8 p. ?6 M' B
  245. mov es:[si], ax
    / I1 J' k) p9 h3 M- h: b+ {
  246. add si, 21 q* F4 B6 e% I4 z* L
  247. loop @b
    . L% a' F; q) f: a. [$ g; \
  248. mov cx,880& T0 M7 U6 Y$ @7 ?3 F' a8 G8 x
  249. @@:6 M& C& \: K: Q4 N1 ~
  250. mov al, [di]/ L' k! A; e- J  D; F
  251. inc di
      W+ b3 y# E/ E! Z4 B
  252. cmp al,20h8 a: w( R# q/ h4 g$ m0 Z) j
  253. je showch1
    $ Q( f8 `* n' h6 q: o  {
  254. mov ah, 17h
    % N" U8 n  t+ M8 n0 f1 Q- n- u9 q
  255. jmp showch3
    & E5 h2 i0 R- I- J0 q1 H. ^
  256. showch1:- F" [4 e0 C0 V, s0 f
  257. mov ah, 07h
    ; E% }+ Z( b5 h( G8 o3 q
  258. showch3:
    ' h/ o! b  y% j* S2 U/ P  {
  259. mov es:[si], ax
    ( ~, q: i1 b$ ?! E  Z& x
  260. add si, 2  M2 K5 ^$ |( P7 G6 l
  261. loop @b2 s) ?: M! P2 x$ Z
  262. popa
    + a, s& q2 i5 O
  263. ret+ c% R% ^+ {" M5 z+ ^. X" Z" F
  264. showmsg endp
    ) s/ e: V: |' ~! M' O
  265. 9 U1 W' [1 n% R. w
  266. oldint proc% Q: ]. }: e/ h) y7 D0 a3 ~
  267. pusha9 w/ ]/ B3 @6 g
  268. mov ds, word ptr cs:[old331]
    " M; J! {/ e8 |/ B- n  R9 E
  269. mov   dx, word ptr cs:[old332]
    8 n9 L' @7 m; s
  270. mov ax, 2533h& Y9 U1 C+ M# \+ n
  271. int 21h7 K3 r9 f: w! r* Y' p* x7 I
  272. mov ds, word ptr cs:[old741]
    2 n2 S2 U' w4 E
  273. mov dx, word ptr cs:[old742]* j1 [) F5 a1 Z) G* I- t/ j
  274. mov ax, 2574h' y& j4 w5 D5 _5 d
  275. int 21h5 y4 Y+ {* V+ _3 ^" a9 J5 K. y8 {
  276. popa
    ( [$ R' d2 P9 B5 B1 G; Z) b% J
  277. ret7 y, O1 J6 U! @0 J2 [  j2 B6 ]' v
  278. oldint endp
    4 ^  Y1 K5 o" q- l( U, o

  279. 6 a/ _% w$ ^% v  E, c: y
  280. memmouse        proc+ A' y3 o* `3 Y& D8 F. a/ g
  281.         xor     ax,ax
    3 C/ x; |1 N8 p& d3 h, K
  282. int 33h
    1 M! N6 A, {. F( f8 o& H7 j
  283. cmp ax,0ffffh" E  J# V! \8 {3 f$ {8 x
  284.         jne     not_loaded
    3 o+ n% t) p' H
  285. mov [memcopy], 17 J' c0 A6 ^  o* d
  286. ret* A5 j) {# m1 U3 ^7 i7 ]9 V

  287. " ~0 E. T& z3 E: a& ~
  288. not_loaded:
      p9 Z+ P0 H3 z% B
  289. " H3 N/ ?2 m( `( I6 `
  290.         mov ax,2574h
    6 c) P1 H" ^3 K- E; W5 z: p
  291.         mov dx,offset new_isr
    7 `0 y& p8 S* l9 ]5 v7 k) B$ q
  292.         int 21h/ W' c) @* h0 ~; c& c

  293. , c* y5 T( T; L+ {8 P% k: v# j
  294.         mov ax,2533h
    : y4 D0 r# N, p1 z1 {* |# _
  295.         mov dx,offset new_33
    : h  H6 R7 @4 P- |6 B
  296.         int 21h, d! ?5 V7 B% `; ]. i  l

  297. 8 K; l& \+ |3 t  b) n$ D
  298.         cli$ H! H2 B& ]& E' c8 G  y+ A7 p
  299.   M! L' I! ^) O' b" Y: J
  300.         mov bl,0a8h  U# N3 {& F" R3 b! C( k* x$ P& s
  301.         call keyboard_cmd4 ^  C0 {. r8 g8 K3 x0 \
  302. 0 U6 |. O$ v& x! _  F
  303.         mov bl,20h
    3 Z! {7 ~9 K" E. K
  304.         call    keyboard_cmd
    5 o2 C1 {. ]$ Y5 c+ s2 r& k
  305.         call    keyboard_read0 _" [! m5 t: D1 @3 d9 j/ E
  306.         or      al,2
    3 m6 _, y# o- j9 I6 N; ?! ]* B
  307.         mov     bl,60h0 H( |6 W0 @  H: g
  308.         push    ax0 W9 `# }7 T" _
  309.         call    keyboard_cmd2 p# x0 W. Y( x9 n4 t& y" q/ _0 _) @
  310.         pop     ax
    ( G* a9 g- C0 q: j8 b' b1 z6 R
  311.         call    keyboard_write
    " }  \3 s. P. o' c. j

  312. ' w$ [1 l1 |* v6 M' h2 m
  313.         mov     bl,0d4h/ ]# m0 T2 W* n9 V  `2 O1 t
  314.         call    keyboard_cmd  a6 d  W  _3 {7 _: A! t0 ?7 d
  315.         mov     al,0f4h1 Y8 U4 T+ \) e5 o" `8 [4 w
  316.         call    keyboard_write' L' K5 V% u7 L' b6 ~
  317. + T* |6 Y0 [  j  L& l, E6 c
  318.         sti6 G1 E% p( r1 {# O5 @! o
  319.         ret8 w( k; X' d$ s
  320. call_user_isr:
    4 x/ j, \1 @$ d3 O1 G  q1 U
  321. db      60h" ^  V. {4 [/ R+ ~/ B
  322.         mov     cx,cs:[pos_x]/ l4 J: O$ }7 j4 I
  323.         mov     dx,cs:[pos_y]8 ^9 g% @4 y* |# ^9 k
  324.         mov     di,0 ;cs:[x_move]  z, G6 {1 K. X9 E3 n8 m' ?
  325.         mov     si,0 ;cs:[y_move]% E: q; H8 @) Q  D* U
  326.         mov     word ptr cs:[x_move],0
    , F& X* S6 t; R# G: H' ]' V
  327.         mov     word ptr cs:[y_move],0# m7 x* _) D/ H6 ]0 f3 y5 q( L
  328.         mov     bl,byte ptr cs:[buttons]
    " a2 K" }0 W5 x% O0 N8 E
  329.         xor     bh,bh+ E6 ^' ?# d9 x; G
  330.         call    dword ptr cs:[user_subroutine]; }( S- O* z" f" a) W% _2 \, D- I
  331.         db      61h
    2 s$ K, s! u+ a, @9 h( J
  332. ret) O! \# f; M  [0 R" |) S
  333. new_isr:1 t$ H+ Z! e: a8 m4 a. q
  334.         pushf& T5 A# m2 p$ u1 Y# I8 I3 c: y* X
  335.         cli, }4 |) v' M* O" L, s, y# C4 y3 u
  336.         push    ax
    % h, i( _2 F& W2 \
  337.         push    bx0 E: C6 E- Y5 E/ q1 I
  338.         push    cx
    ( C8 }% B. G4 C- S8 h0 d" b& ^0 H
  339.         push    dx9 S, r2 ~. R9 V: D, y4 z
  340.         push    di) C2 @3 F8 i! Y/ f* s
  341.         push    si0 ]! G) {* c0 \
  342.         push    es6 i3 V1 }7 u! K; I
  343.         push    ds+ ?# M7 }% y# o6 o3 R

  344. 5 H2 V1 K$ M: g; S
  345.         push    cs
    9 n, d& L" ~, o3 i. ]' l1 q! Y
  346.         pop     ds
    , u; a# w4 H5 Q
  347. 2 N+ F$ q8 L0 S/ o
  348.         mov     bl,0adh
    0 W* j; k) L3 p# \# A3 c# P/ v
  349.         call    keyboard_cmd
    7 }4 e1 G) {$ e. Y) G
  350. 3 ^4 d4 R) l% r: E: m6 j
  351.         cmp     byte ptr [first_time],0
    - z: i8 m; u( y2 a
  352.         je      not_first_time
    9 }3 `" ^' d+ ?& H9 k
  353. , l0 \7 M, N% k9 }! P
  354.         mov     byte ptr [first_time],0
    9 E' ~( q' _4 D: w5 u
  355.         call    keyboard_read3 N% F; g% j1 R& ?6 Q1 p
  356.         call    keyboard_read, V  O( B8 u+ L  N$ ?7 L  N
  357.         call    keyboard_read
    : M$ M. t) ]. q$ I9 S% p/ A
  358.         jmp     no_show
    7 n! [8 U7 F/ q: x# {$ r' o
  359. ; u+ d% c- S6 B& H5 `; F# I
  360. not_first_time:; J4 y- v- h' ?* i' e; s8 D
  361.         mov     word ptr [temp_mask],0
    - a6 m  q* A8 h
  362. / I0 U: |0 K2 {- l' q
  363.         mov     cx,[pos_x]
    / o' V, u+ ^- D2 ]7 {
  364.         mov     dx,[pos_y]
    1 R& x8 F, W+ w( K, U) T
  365. 7 f5 r7 l8 ~( j& K: u
  366.         call    keyboard_read
    % p  q' @' x4 @
  367.         and     al,7 ;3
    2 g( u6 o4 q: F+ G. G# k
  368.         mov     ah,[buttons]* O" Y0 b/ D" M2 A0 D& X
  369.         mov     [buttons],al, I$ m5 P/ k+ K
  370.         cmp     al,ah
    ' j7 V" C" g- f$ j. K) j1 W
  371.         je      no_button_change
    ! u3 a* S0 Z1 W2 h7 e" D- h3 k
  372.         and     al,3
    0 [! Q1 ?5 C7 w& f% ~8 r4 C
  373.         and     ah,3
    1 J- L; V4 F" e7 l
  374.         xor     al,ah
    / m& j- L/ s8 k+ k
  375.         xor     bx,bx3 N4 {) T8 ~) d; Z- O0 N, a

  376. " q4 c% M+ ~# Y5 |( G
  377.         push    ax
    + ?: B5 ~  ]8 ]" Q1 f
  378.         test    al,2( K( Z# K4 K. t& U3 O5 h
  379.         jz      no_right_button_change# d0 ^" A! r# R! X2 ?
  380.         and     ah,2
    / }: H2 s! W3 O6 b
  381.         jz      right_button_pressed
    - r+ l) `6 H( ^5 Q4 i% \) @
  382.         or      bx,16( A7 r$ n$ K  n5 j
  383.         jmp     no_right_button_change! f) P/ s# W; h- s0 o4 K8 C
  384. right_button_pressed:/ S- k0 [; P0 Y" E- X$ Z
  385.         or      bx,8
    ' ~- }" M. T* D: ~
  386. no_right_button_change:: g! T: _' U: F. d( {1 p/ d

  387. ; w& r* f( S" b/ J3 B9 o$ I
  388.         pop     ax! v- ?5 e$ m4 k1 Z! o3 ~& b

  389. 7 M) N, Q" k: e4 o5 g
  390.         test    al,1
    ; B2 r' W% `& ^* u
  391.         jz      no_left_button_change
    . ]2 ~! @+ o2 ^7 F3 j6 }
  392.         and     ah,1
    , W$ B5 {" B  G0 X* l$ J8 \
  393.         jz      left_button_pressed) {! m' ]" m& u) M2 a
  394.         or      bx,4
    3 a. B0 V' t* G6 P+ e
  395.         jmp     no_left_button_change- s+ ^2 M+ }' r" r
  396. left_button_pressed:
    , @0 k6 Z4 u( `; W. m
  397.         or      bx,2- i7 d; u6 K6 Q" E* l8 J
  398. no_left_button_change:
    ) m2 G& y: P: I

  399. $ M) U1 m# m  d3 I
  400.         mov     [temp_mask],bx. T5 g, `) \9 g$ H: b
  401. ( t7 a6 {5 O! S. l# v0 g
  402. no_button_change:" P# v! Z4 p5 n# {
  403.         call    keyboard_read0 s/ K. V# r- `# g- M; g. q
  404.         cbw
    3 l0 W# {' q0 W0 b7 p$ }; G! T2 `
  405.         add     [pos_x],ax
    1 d( j" P7 W# P6 [$ p  H) Q
  406.         add     [x_move],ax, I' [+ B$ e" \. @* e6 J: V
  407.         mov     ax,[x_min]" R  K/ i+ K- L2 W0 o
  408.         cmp     [pos_x],ax, l& L% C& y$ B$ Q9 X+ o
  409.         jg      good_hor1' Y( F( k" J$ l, D4 `4 e6 q* j
  410.         mov     [pos_x],ax* n( T+ n) d( i4 t
  411. good_hor1:$ K! D; u& q0 H6 u; @1 u, u* e
  412.         mov     ax,[x_max]' ?% M# U- L, ?
  413.         cmp     [pos_x],ax
    9 e2 i% \9 z' K/ U) v
  414.         jle     good_hor2: y# Y8 [( b: G
  415.         mov     [pos_x],ax
    9 _; F! |& R& Y' g$ {
  416. good_hor2:, u( K' @2 k+ [6 T4 ?) q& s

  417. 3 W( j1 K& R9 ?) L* s# J; c. I
  418.         call    keyboard_read: L7 m5 z( Z  j5 \! v0 G$ W& M
  419.         neg     al4 z) w5 ^" `, q/ B" }* k0 }/ u9 {
  420.         cbw
    5 U, [1 L1 E0 q4 d( p& t( f2 Q* A; J
  421.         add     [pos_y],ax
    - E5 b( N6 s5 S  k6 C
  422.         add     [y_move],ax
    5 Q  T3 D9 y! o0 R% D
  423.         mov     ax,[y_min]
    5 E/ W9 n! o4 C" R* ^/ ]2 _
  424.         cmp     [pos_y],ax" b" @5 A. g1 e
  425.         jg      good_ver1
    + i+ z3 R4 X+ K7 \
  426.         mov     [pos_y],ax6 d0 m9 ^4 L, o4 j) x  T
  427. good_ver1:
    - N! K* V# T0 H9 {$ P* C7 d0 j
  428.         mov     ax,[y_max]9 Y4 \, ^: }( i6 U
  429.         cmp     [pos_y],ax( P5 U2 \7 z* ^' p! b* m% `
  430.         jle     good_ver27 k& p! m% V* C# A) k3 j1 U
  431.         mov     [pos_y],ax4 q5 B) ~, d; o# o
  432. good_ver2:. a) j8 D, G; r; z7 [

  433. 2 D; A% s& E1 D# f) F
  434.         mov     ax,[x_move]
    : J8 y3 p$ Q3 E6 W  Q# D
  435.         or      ax,[y_move]. h! q8 B  k8 L" D7 f* k
  436.         or      ax,ax
    . s6 E: O& {1 S7 S
  437.         jz      no_change_position, w' u2 K7 y9 d4 O. P* F
  438.         or      word ptr [temp_mask],1
    3 J1 h1 @, C! K2 _: t! W
  439. no_change_position:
    3 \1 g0 _, P, M3 d* @- U
  440.   d# }9 |& i& J  e* [. h
  441.         mov     ax,[temp_mask]
    " W8 C) m- Q2 y# ^% C
  442.         and     ax,[user_mask]7 w' }% S  p6 C7 u5 T: d
  443.         jz      no_call_user
    ' ?  X' l$ E, e: G
  444.         call    call_user_isr
    6 ^& S0 Y' Z3 J) N8 D
  445. no_call_user:$ f0 l6 k6 |2 v, }( ~
  446. ; X; k5 W& F! {: x. Q, ~5 n+ Q
  447.         cmp     byte ptr [sm_flag],1
    1 E4 V; I4 x; n1 O" e
  448.         jne     no_show
    % U8 R! A8 N8 S% C. `) k/ K: m

  449. $ y0 l. K; t, B/ q
  450.         shr     cx,3# p" g7 J+ K/ e+ k' C' t& ]
  451.         shr     dx,3- d$ Q& a( v, c
  452.         mov     ax,80
    0 H, G' I' Z2 }9 l
  453.         mul     dl
    2 ]: }  X7 m9 D
  454.         add     ax,cx3 K7 `: F; x; s' t
  455.         shl     ax,1
    $ Z+ ^- C3 W5 [: S- h
  456.         mov     di,ax. S: E; K" A+ }  v* I5 X4 i
  457.         mov     ax,0b800h$ S7 v- l* E% ~; J5 K9 A2 S
  458.         mov     es,ax- o" J& {4 N3 r5 R1 m7 j5 ~+ x) ~
  459.         mov     ax,[save_char]
    ) T/ u9 B% N4 N7 v9 C8 }
  460.         stosw  |5 B/ q+ x8 P- V
  461. ' O" R7 B9 J) r3 n& c2 a1 }
  462.         mov     cx,[pos_x]7 Y! T9 m* x8 }( _4 }
  463.         mov     dx,[pos_y]6 O/ J  o+ W# b+ t
  464.         shr     cx,3
    # J1 x1 `( Q# _" i' A5 C
  465.         shr     dx,3
    5 I3 e0 {3 D9 T& k/ b
  466.         mov     ax,80: U9 L1 o0 ^0 @( l
  467.         mul     dl) {7 E: A' `( ^5 }2 m, h
  468.         add     ax,cx
    " C9 g; a# J+ e! g! V' g. b9 k
  469.         shl     ax,1$ g2 L- S+ Q9 b. N
  470.         mov     di,ax
    ' ^$ D/ H7 h- t: g5 x5 _: g
  471.         mov     ax,0b800h
    5 C5 B, m! d* Q0 T2 M6 s% D
  472.         mov     es,ax" w; h9 i; Y2 c7 B, Y, M  [
  473.         mov     ax,es:[di]
    : s3 P) p2 g  y% S4 Y7 ?: V
  474.         mov     [save_char],ax' y8 H+ M, }5 z
  475.         not     ah
    1 Y3 ^) B. _5 w& M7 h0 b5 {
  476.         and     ah,7fh
    4 C5 g: [- L  O) f' [+ g
  477.         stosw
    6 H: K' s/ j. [
  478. no_show:9 a4 P. n) D  K, S8 h- [* B/ Z/ o; m
  479.         mov     bl,0aeh
    / p' h1 n. \+ b& q
  480.         call    keyboard_cmd
    $ p5 ^( ~4 i6 h$ D6 ?( j! T  J
  481. , F. l- |0 x' {8 s
  482.         mov     al,20h
    ! W6 F6 ]9 {5 h2 ^% W3 M) \
  483.         out     0a0h,al
    2 k7 f7 ?) R, b$ O; h9 ^$ V
  484.         out     20h,al
    / a6 u2 A5 B* k! T5 J: b

  485. 3 P# ~7 u  \& k& |
  486.         pop     ds9 b  n+ g3 L9 T' T2 m. B
  487.         pop     es
    ( @# r  \8 a! X: E( X
  488.         pop     si" E4 B4 y8 @1 F0 k& x; ]2 D
  489.         pop     di
    & o/ Q9 u- F" i
  490.         pop     dx
    ; E- ~% r- P' ?( o: I! O/ \6 Y
  491.         pop     cx
    1 W; P/ F" C: O0 N( x6 Y' G  z% [
  492.         pop     bx
    . }7 V  ?$ F) a4 p
  493.         pop     ax3 e! C. q+ Y8 t4 H: {& j# F
  494.         popf: O2 H/ L4 [( I. }0 f
  495.         iret
    - b! e3 ^) t0 h( I; Z( n
  496. 9 m& i2 q3 C! z; g  o7 V$ T
  497. first_time      db      1* j9 v% m) t% T/ H- a; }
  498. buttons         db      0/ t$ S0 z' W2 s. n0 `5 Y. ~& V+ r* J
  499. pos_x           dw      00 U8 S0 B5 p# ]7 O5 c
  500. pos_y           dw      0$ Z" G3 b5 ?$ T: F% J0 q
  501. sm_flag         dw      01 U1 N! Z% ]- e% U% r+ `
  502. save_char       dw      0/ b4 a3 K0 Z( A7 W2 B, d: I
  503. x_move          dw      0
    2 d: m0 S9 h& T" ^' B
  504. y_move          dw      0/ B! m9 V; n# \! C0 a
  505. x_max           dw      639
    1 v4 Y) u5 \/ Q* s4 v
  506. x_min           dw      0  h/ }# J2 C* A& v- B
  507. y_max           dw      199$ r8 M/ l- f( s& p" p
  508. y_min           dw      04 p+ f% _6 K  _1 G3 `' A
  509. user_subroutine dw      0,0
    : z' `3 F9 v1 k; y; I. r
  510. user_mask       dw      0% e( u' y( u$ p% Q7 u% w7 s
  511. temp_mask       dw      0: A9 Y2 R* W; f% h% ]5 u! x# l( P- h

  512.   O3 ~. X$ V% o; n
  513. keyboard_read:  d! h0 |1 {) b; M1 R, O5 m* Y
  514.         push    cx
    6 s% o, f( t% z3 W! Q9 M+ ?
  515.         push    dx
    5 _7 Y: P5 R% |4 ~+ z( i% u/ X8 w6 x
  516.         xor     cx,cx
    2 h* {; L" G4 g9 |( F
  517. key_read_loop:
    ' N* ~: a) W1 D- A! b6 f) r
  518.         in      al,64h& u* g5 x* Q, B' _1 H- K
  519.         jmp     $+2! d3 g4 ?: T1 s2 d/ ?/ G. ~
  520.         jmp     $+2
    1 W& y: V- Q9 g6 k! X" m
  521.         test    al,1
    5 G$ \  K; W( c0 V- G. C
  522.         jnz     key_read_ready0 |. H/ \$ b, C. W4 {5 D4 v
  523.         loop    key_read_loop
    6 b4 w1 \' t% Y
  524.         mov     ah,1
    - E+ E7 o2 Z' T& q
  525.         jmp     key_read_exit; O& ?% r/ N1 E
  526. key_read_ready:
    : e/ S- b) [: `2 [7 ?% h1 d! \
  527.         push    cx
    1 x/ {; j( F- h; y
  528.         mov     cx,32
    4 R' x3 Q; ?' W% i% U0 [
  529. key_read_delay:0 w7 \; `+ T( m& \  c: i
  530.         jmp     $+28 ~- P' b: u0 {7 ^8 M+ T) x
  531.         jmp     $+2& Y  y" J6 X+ S, E6 A
  532.         loop    key_read_delay
    - ^1 L& e) U4 V/ ]5 a, q
  533. 6 b( ^) I3 _4 |6 s! P3 \9 g' p: w% ^
  534.         pop     cx
    8 A/ t. B8 J* R  ^4 m4 u

  535. 2 a- p# h* k6 l( @8 d* t4 ]
  536.         in      al,60h9 u! O  U0 o& K$ t* q, _# b  o0 f, q
  537.         jmp     $+2
    7 t# ^, e6 {" w2 r$ T
  538.         jmp     $+2
      h" o) s0 s1 d
  539.         xor     ah,ah
    4 m+ s9 I6 K' @  {, u1 B: J
  540. key_read_exit:) W5 }1 q" q. {0 u+ W
  541.         pop     dx
    . R' n! x! Y/ z3 c3 J8 F' f
  542.         pop     cx
    * C+ p: {  }; f
  543.         ret. T* n" x* k3 Y" U3 u2 h
  544. . D% Q4 [1 l2 N( R4 Z& J
  545. keyboard_write:+ p5 q8 \% H3 O0 {! P. L4 `
  546.         push    cx
    ! p( Y$ B# I, y7 C# m8 _. U8 i
  547.         push    dx1 ^- u- @7 d1 a4 y# o4 `+ W+ J4 B
  548.         mov     dl,al
    " p; Y; W/ W" R0 @6 d. i$ K. |
  549.         xor     cx,cx7 m* H5 H- @4 `! Z' E; H
  550. kbd_wrt_loop1:5 W1 {) p7 b$ Y% w, }) C
  551.         in      al,64h
    ; o/ S4 R8 H3 U1 W0 P' r
  552.         jmp     $+2' W" G  h5 z3 R
  553.         jmp     $+28 i! p& s0 k8 `1 g4 o' h9 z
  554.         test    al,20h# N5 Z7 {$ x5 V( J* r6 ]% M
  555.         jz      kbd_wrt_ok1
    4 _8 G( i) i9 @

  556. 7 g4 y/ v( t2 m7 f( _
  557.         loop    kbd_wrt_loop1
    " K6 R3 n' d' v

  558.   ^6 |$ k" [# C5 i
  559.         mov     ah,1
    5 C+ m# h3 F; R
  560.         jmp     kbd_wrt_exit& M4 n! h6 o6 v1 j& ^
  561. / l7 A) @: w4 r& K6 A% h
  562. kbd_wrt_ok1:* {' j4 w+ v2 O& A
  563.         in      al,60h
    + a8 g; a+ [0 q; f

  564. , @5 R  K; I  J- M$ v# @
  565.         xor     cx,cx
    # O/ ~& G1 P9 H
  566. kbd_wrt_loop:
    0 p5 f2 g4 \- G& g/ _
  567.         in      al,64h
    $ S# P$ P2 s/ z! r& T3 h
  568.         jmp     $+2
    2 G( w+ e' B1 b8 P9 d, ?2 t
  569.         jmp     $+2
    7 m+ [6 H8 I3 ^( s0 V8 b) C( {- z. q
  570.         test    al,2* n+ w+ g$ \* g; [0 R5 L6 I
  571.         jz      kbd_wrt_ok
    ( N5 ]: ~; d% H- _# w

  572. : X" [$ r# i4 v) `6 d
  573.         loop    kbd_wrt_loop  X+ ^: }5 D- H. U0 v7 G( t' C" v

  574. ! y, d* I$ y# P
  575.         mov     ah,1
    4 o6 H- z) @6 M. _
  576.         jmp     kbd_wrt_exit7 W; g; S8 a$ U( @9 w

  577. - S* h* ?9 f1 z
  578. kbd_wrt_ok:
    - c) w+ h/ J& a6 x
  579.         mov     al,dl1 G5 E2 s& V1 x4 {% E" A/ i, i
  580.         out     60h,al1 ?  N% w2 d* U8 e% S
  581.         jmp     $+2
    + s6 S/ V$ p5 h& \
  582.         jmp     $+2$ A( G/ H+ F5 ?0 K2 b' U

  583. * T, T3 X3 X/ E+ I1 h* P4 H
  584.         xor     cx,cx& l" J- b" q% E/ G0 c
  585. kbd_wrt_loop3:
    " x3 U9 f/ j0 x" d9 K
  586.         in      al,64h
    5 r1 H% U! v# L) E2 e+ `
  587.         jmp     $+2
    6 e( R& \( K5 M" U7 m8 t0 U
  588.         jmp     $+27 x+ Y  Y* q2 h! a
  589.         test    al,28 \. c9 f/ n0 M) \; c
  590.         jz      kbd_wrt_ok3" y% Y$ f$ Z" d' z

  591. 8 m+ p$ A) _3 S
  592.         loop    kbd_wrt_loop3
    ( N8 ]) `, }% r

  593. 0 ]& a. n& s: k! l8 H7 G
  594.         mov     ah,1
    ( ]* d7 w$ u7 `2 x; T. P
  595.         jmp     kbd_wrt_exit
    + }+ E1 b0 q' y* o! @  H6 g+ ~

  596. # M$ R- D# k4 ^4 U2 `  l% Q
  597. kbd_wrt_ok3:
    ' P* s- o8 y( x& [3 D: b! B/ Q
  598.         mov     ah,8
    5 V$ p% p" n7 S! T  N
  599. kbd_wrt_loop4:$ V  D% y4 j& h5 c  ?- A
  600.         xor     cx,cx# A) y; n, F3 ?- R
  601. kbd_wrt_loop5:
    $ l0 F# A8 k6 Q$ V
  602.         in      al,64h  r" h( x1 Y# ]+ F5 c
  603.         jmp     $+2# T* k: B9 E1 m0 b4 m( F) `% r
  604.         jmp     $+2/ d3 M% \0 q1 N* M0 j2 f& u
  605.         test    al,1: N8 G3 k3 w3 P% u4 \. y
  606.         jnz     kbd_wrt_ok4: f' u; w- f' p% B8 j/ ?

  607. % V  g2 V4 E3 Y7 _) L3 _" i
  608.         loop    kbd_wrt_loop5- \: ?% E. K0 Z0 o7 i

  609.   Y# n& O+ j$ r& E' }& e
  610.         dec     ah
    7 V' ]* P: p2 c' g
  611.         jnz     kbd_wrt_loop4
    6 L1 J, Y- @1 x0 ~! p* X

  612. # b+ t; Z2 q: i. P% k
  613. kbd_wrt_ok4:
    7 Q, L, P! Y, t
  614.         xor     ah,ah
    3 D+ O' l/ b( u6 r
  615. kbd_wrt_exit:. [  {% R* d9 u! {6 J8 T, V9 O
  616.         pop     dx- W8 _( `" t3 j: m$ s% V5 f
  617.         pop     cx, e2 x2 O' v$ X" Q1 V0 D/ S. W
  618.         ret
    + J* k$ c! n, @
  619.         
    : I( w- F7 h0 L3 |9 o
  620. keyboard_cmd:
    5 w3 j' o) }  E. I' B% O
  621.         xor     cx,cx
    1 w4 ?! a7 L& w# Q9 ]! |6 R! V
  622. cmd_wait:) B* q, R) v& q9 d
  623.         in      al,64h2 _4 F3 q9 Z; C
  624.         jmp     $+24 A0 x: r- y; j. l2 m9 ?& ~
  625.         jmp     $+2
    + ?: Q; d9 z: J7 [
  626.         test    al,20 H0 z% L- X$ o/ O+ D; c" R  ^
  627.         jz      cmd_send! [. @+ ^" ^; q7 ~
  628.         loop    cmd_wait
    2 S+ U6 s: t3 O; U0 @* s5 W

  629. ! \( t! d: K$ ~7 N
  630.         jmp     cmd_error1 T; G4 X. Q, I2 w7 z
  631. 3 @) o" s0 @) s8 k1 f
  632. cmd_send:
    ! y0 T* _2 E1 c; W( B
  633.         mov     al,bl
    # N0 b! r( C) X7 A+ ]5 B
  634.         out     64h,al* s6 \7 v* H' X+ g* Z# H9 [
  635.         jmp     $+26 Y4 {8 I( a7 G6 J" e
  636.         jmp     $+2' V- ]4 P, ?* N5 a8 M

  637. . H5 `7 M* h- H: s! C, p
  638.         xor     cx,cx' X( h0 L9 s4 C7 v( W" i
  639. cmd_accept:
      z, O  z  Y2 r: a! k; z
  640.         in      al,64h) k3 u' s+ L4 D8 T+ W1 J
  641.         jmp     $+2
    ) W! U, {" J9 u
  642.         jmp     $+27 ^) }3 o& n+ i" `( i7 |4 a: Q
  643.         test    al,2, e1 Q( O# W* r" F
  644.         jz      cmd_ok& j' [; l% c& S$ T
  645.         loop    cmd_accept' x8 _) X9 @8 i, E
  646. 1 r7 v, U+ D. Z* t% O8 R
  647. cmd_error:0 j0 V4 w  X* z+ l5 }
  648.         mov     ah,1
    $ i& }& x0 n* d2 z8 |( v. s. p
  649.         jmp     cmd_exit! `9 f9 s1 X$ f0 Z. }% A
  650. cmd_ok:
    . U( a2 u0 ]$ g7 V/ @- h
  651.         xor     ah,ah
    5 n: G, G9 p! E' H7 @/ ?1 \, B
  652. cmd_exit:
    8 T! ]  {' ?2 i6 A# C, V
  653.         ret
    % B& g$ Z& y8 A8 V7 ]4 `* b6 f
  654. % V, j( S+ o! T
  655. new_33:% Y5 W* G$ ]  K1 U3 S+ l
  656.         cli! t. ~! O; s$ g, r  i* S. F
  657.         cmp     al,0+ y( O0 l3 j  [! d& m
  658.         je      reset_mouse
    8 f( h7 C) f$ c" `% V
  659.         cmp     al,13 I8 P# f4 W# }6 k$ E
  660.         je      show_mouse
    : A; Y6 P' p  C
  661.         cmp     al,2; Q/ k, t- a" m: _, U) v: k9 ^& y
  662.         je      hide_mouse
    6 S0 i$ P5 u3 F
  663.         cmp     al,3" D% j7 j, z6 z/ `3 ~
  664.         je      get_pos
    9 n1 @/ V3 H% W
  665.         cmp     al,4# m& [" X# o% V" {
  666.         je      set_pos
    + O) }3 B& Z; b; h+ r
  667.         cmp     al,72 w, E" ~# A* {! c) u8 F
  668.         je      set_hor_pos" P9 a- |* d1 u8 q
  669.         cmp     al,8
    ! }- ~9 E- y! G' I( L
  670.         je      set_ver_pos5 f% t" L7 Z5 P+ @' B. \
  671.         cmp     al,0bh
    " X3 f' M. i$ i! s3 _+ J0 S
  672.         je      get_mouse_movement$ l* F) A' E" }: N& ~* ?  ?
  673.         cmp     al,0ch
    6 m8 \8 Y( a, t" ?$ a
  674.         je      set_subroutines( g3 N5 ^9 g: p( n0 ~
  675.         cmp     al,14h0 N5 @% P9 D6 S& Q/ i% d% U- r) @
  676.         je      swap_subroutines7 \: |/ G/ b- x+ _" t3 P
  677.         iret9 @6 p6 P+ n& {/ _8 j

  678. 8 b! A7 ~" Q2 y8 \* e6 T
  679. reset_mouse:
    5 L2 ^: L0 N6 D; [* M0 p2 A% C
  680.         jmp     _reset_mouse
    # t" f+ ]+ P0 f* m
  681. show_mouse:. S, l8 q! ^1 |$ _
  682.         jmp     _show_mouse  P) \) G3 L; |% J) B$ o! C5 H0 k
  683. hide_mouse:
    9 [' y/ u, H) Q; q3 {+ d
  684.         jmp     _hide_mouse+ w: P  [( X! B+ b
  685. get_pos:0 \4 y. }# k. c- \( U
  686.         jmp     _get_pos  T' `! i  l$ P& C+ U7 K
  687. set_pos:3 d6 b8 I& f3 ^9 S: R
  688.         jmp     _set_pos
    $ l4 l# p, t+ c
  689. set_hor_pos:4 [/ |+ k3 D7 J6 ~! u2 r9 u
  690.         jmp     _set_hor_pos+ m( m( o. ^7 i! K) ?" d$ m3 }3 }
  691. set_ver_pos:  o/ J# c" B$ i; f3 l/ ~; X6 d' p
  692.         jmp     _set_ver_pos3 J- ~% E5 }3 l6 B
  693. get_mouse_movement:
    9 }$ h  F! Z+ I8 ^2 p% i1 K* m7 q* W
  694.         jmp     _get_mouse_movement
    8 A' f# ]! f7 ~0 J5 r
  695. set_subroutines:& |$ j8 B  J, W/ i
  696.         jmp     _set_subroutines3 T4 m) c( U. I% c: r/ [  W  b
  697. swap_subroutines:
    ( G+ _/ \* F9 _8 z% c
  698.         jmp     _swap_subroutines
    / l6 S& I6 ]; p
  699. 9 Y+ J3 I8 T4 V: A
  700. _reset_mouse:& L/ J  G) _. L, V3 g$ S# e
  701.         mov     byte ptr cs:[buttons],0$ z" l! k' s/ ~2 r. p2 y" o/ v: Y! O
  702.         mov     word ptr cs:[pos_x],0$ K6 N% M3 U" o( f, V/ a" g
  703.         mov     word ptr cs:[pos_y],0% ]7 m9 ^& q& r0 Z* W0 h% L4 a
  704.         mov     word ptr cs:[x_move],03 b9 i3 a- X7 K6 f
  705.         mov     word ptr cs:[y_move],02 ~3 b9 Y6 c& O
  706.         mov     word ptr cs:[x_max],639' R% f3 _' {( f2 Z% F; ]$ l9 }
  707.         mov     word ptr cs:[x_min],00 \! V4 G7 H' h8 q* Y4 M6 z' }+ J
  708.         mov     word ptr cs:[y_max],199
    ( g& X% Q6 h3 j  d& }* ~, o
  709.         mov     word ptr cs:[y_min],0
    : u/ f' E8 I1 x6 O
  710.         mov     word ptr cs:[user_mask],0
    & r, \9 L5 M- _+ B( j+ e
  711.         mov     word ptr cs:[user_subroutine],0
    * v, x2 K9 r, Z: k4 w. @( R
  712.         mov     word ptr cs:[user_subroutine+2],0% m* u$ E9 z+ y
  713.         mov     ax,0ffffh
      Y. \4 A4 s2 c7 @
  714.         mov     bx,3( N" F0 }2 h7 d8 L
  715.         iret
    % c& w6 j0 H$ ^( t. M% }$ J
  716. # Q7 [  s/ t1 Y6 B* {* A) ]/ t
  717. _get_pos:
    $ T. X( ]" z- f9 [
  718.         mov     cx,cs:[pos_x]. ]: j& d0 b6 Q2 N) ^7 a% `3 N
  719.         mov     dx,cs:[pos_y]% ]$ n* r  _! b; K
  720.         mov     bx,word ptr cs:[buttons]
    5 x' b. c' e$ p2 f1 z  ]7 [
  721.         xor     bh,bh3 Z3 g  F( A# a  a7 c
  722.         iret
    ; r& @4 [+ P" @; B* d6 `
  723. ; E  u* A( J$ q2 ^8 B( n
  724. _get_mouse_movement:, [8 @( X# ]& T
  725.         mov     cx,cs:[x_move]
    # n2 m; D  Y1 H- B5 P# e
  726.         mov     dx,cs:[y_move]
    5 d/ ^: P- ]; Q9 j2 _5 b( o
  727.         mov     word ptr cs:[x_move],04 v) f5 k, P1 B/ y1 b- k
  728.         mov     word ptr cs:[y_move],06 `' A$ r# Q5 b8 K& g
  729.         iret
    . J* O7 @& o& c' U! ?0 i2 N! @

  730. ' g3 V( [; J! e3 @- E! }
  731. _show_mouse:0 {# v* i6 f# ^
  732.         push    ax
    : B" X6 a0 R* U. P
  733.         push    bx$ z; G8 M& b2 J1 R; F, t9 O* b
  734.         push    di6 B' z9 Q+ m+ U
  735.         push    es
    5 m5 |! r7 d) M# `7 K
  736.         mov     byte ptr cs:[sm_flag],14 v1 C$ X+ S7 h% m. H9 @& L
  737.         mov     ax,cs:[pos_y]
    : h- e% c2 y- l$ L% s
  738.         shr     ax,3
    0 f% r0 o9 v0 M- a1 C. T
  739.         mov     bl,80. P8 ~% W9 M' r# }. B+ ^$ J
  740.         mul     bl
    . A, r. j! L1 n0 {/ B
  741.         mov     bx,[pos_x]
    ; s& V3 H+ G5 q+ t$ f) X" u
  742.         shr     bx,3
    % \; y! v7 S* B+ W$ U/ P+ l0 {
  743.         add     ax,bx$ @& L& c* _6 k  t' R
  744.         shl     ax,1
    3 h( _3 X0 S( V2 R, x! r
  745.         mov     di,ax
    3 w! J; G9 T" e7 p$ ^4 j
  746.         mov     ax,0b800h8 E- k7 n) v, Z- ?/ Z
  747.         mov     es,ax# m) s' y- j5 x0 C
  748.         mov     ax,es:[di]- Z3 e6 f/ P9 s6 E! Q
  749.         mov     cs:[save_char],ax9 m1 G$ J+ y2 S2 G
  750.         not     ah6 W) f% A6 `) f3 q
  751.         and     ah,7fh
    3 Z* U$ C% B3 F2 [7 E& c  C4 S4 }
  752.         mov     es:[di],ax
    & e9 Z+ B1 A; P; B8 ~
  753.         pop     es7 A; o( ~& P/ F' `% v. L0 U
  754.         pop     di: a+ `4 B2 ^2 @, ~. i3 C- b
  755.         pop     bx( [% \4 `! r/ Q) \
  756.         pop     ax8 w3 ]/ z0 P) Y6 C' o0 J: E
  757.         iret
    - p7 U+ @% A7 m
  758. 2 M7 _! \- Y; F5 L6 Z
  759. _hide_mouse:
    + T  b' P: i( ?, ?* E# Q! J9 k6 x: v
  760.         push    ax+ T# D0 D& B: I) H2 p- S+ c2 m
  761.         push    bx
    : {2 g- Z4 _$ a; g. }) ^
  762.         push    di
    9 d' D) T, {# G% g. Z6 h: p1 ]
  763.         push    es
    3 K% c, G- N% k! n- E; k
  764.         mov     byte ptr cs:[sm_flag],0
    * ]! ^8 L$ l0 ]
  765.         mov     ax,cs:[pos_y]3 H/ y0 o/ u% }4 s
  766.         shr     ax,3# x$ r* t1 o( r0 u
  767.         mov     bl,80
    1 L. L6 S7 A" `, d" r* p
  768.         mul     bl
    7 t3 u9 `7 G$ o! ^
  769.         mov     bx,[pos_x]- t1 v9 g, u5 ^6 ~/ b/ P
  770.         shr     bx,34 C' w: Q$ v; Q9 S
  771.         add     ax,bx6 D' J( E" U; x0 \7 X# ]
  772.         shl     ax,1
    + p7 |# a9 k' S
  773.         mov     di,ax+ n+ p% o$ b$ J5 w5 _) F
  774.         mov     ax,0b800h! a3 B8 _& G; h* _( S
  775.         mov     es,ax
    . W4 P% X, {4 p* f, V+ b
  776.         mov     ax,cs:[save_char]
    9 n; R$ k4 s$ d4 @, _4 u) s
  777.         mov     es:[di],ax
    . j. X5 p! S0 y6 e
  778.         pop     es/ k+ U' e; R* {. R" C
  779.         pop     di$ F  \% I3 @4 d7 Q
  780.         pop     bx
    8 T" [2 ]: W+ O9 X; C! R
  781.         pop     ax
    $ t" C: k5 W5 J! I
  782.         iret8 j4 X0 u4 z& ~) L3 X  o

  783. + m+ G  {3 {9 s- S! A
  784. _set_pos:: F5 S% Z- z" S
  785.         mov     cx,cs:[pos_x]
    6 I# P& N" a$ p5 r
  786.         mov     dx,cs:[pos_y]
    & p- x% z% ^- @# P' `5 B  d
  787.         mov     word ptr cs:[x_move],0
    . Y4 G- t! p0 {7 h4 ~' ?0 ]
  788.         mov     word ptr cs:[y_move],0
    - Q: Y  C1 Z% N& @6 [  _
  789.         iret0 E7 X4 j( `) p4 G# E( n# z

  790. # m9 E8 E. F- n$ B6 l8 j
  791. _set_hor_pos:2 R$ ^9 A' G* }' L1 ]" T) i
  792.         call    max_min
    5 O# w7 @; `* I7 m" i
  793.         mov     cs:[x_min],cx( {- \! v8 m% p. f% @
  794.         mov     cs:[x_max],dx9 d: y* R& C0 W6 f# ~
  795.         cmp     cs:[pos_x],cx
    # l0 L1 u4 b3 |, L% P9 h+ C& l
  796.         jge     good_hor_min
    : A; S( N: q; ]: O+ }' Z
  797.         mov     cs:[pos_x],cx
    ; Q6 C; i" q: F3 m9 B% S
  798. good_hor_min:
    & w" ?5 _7 ^/ T/ N
  799.         cmp     cs:[pos_x],dx
    4 M3 \% R; s) V0 z: V  j' W9 x% h
  800.         jle     good_hor_max
    2 O, o& K% V4 `. E) s4 q) b- X
  801.         mov     cs:[pos_x],dx, o0 `. ^  L9 O
  802. good_hor_max:$ x7 W5 s' |+ E* R& B
  803.        iret
    7 E; X/ v% K6 L( m2 _

  804. 7 s& h; [: d- h' [- w7 k% S
  805. _set_ver_pos:& X# u6 C8 T2 R' c; d
  806.         call    max_min9 a; R7 b2 z1 A2 V' }4 i9 ~; ]
  807.         mov     cs:[y_min],cx3 _. c% P; e6 E5 l% q
  808.         mov     cs:[y_max],dx
    ' o' ~5 I. O' i5 v
  809.         cmp     cs:[pos_y],cx2 q4 S) k# w9 n8 V& D
  810.         jge     good_ver_min  N1 X2 I" B. M9 [9 h
  811.         mov     cs:[pos_y],cx0 ?9 ~7 E# S7 F1 t" N
  812. good_ver_min:& f! D. W" r. N  I8 k; {
  813.         cmp     cs:[pos_y],dx) n: o9 K" x0 S
  814.         jle     good_ver_max
    9 d6 j$ b$ g( y" v# y
  815.         mov     cs:[pos_y],dx* V$ ~8 |$ |  u% S, P: N  e7 J
  816. good_ver_max:) a7 v7 P  P2 ~% L; W. H; t% H
  817.         iret
    - ^" x; s3 M  G
  818. 3 G( t# `9 t3 K: H$ q$ @
  819. max_min:
    , |# d4 ?1 n* O4 u2 C1 G
  820.         cmp     cx,dx+ E% C* X! f* q
  821.         jle     no_swap
    0 o! f. _! K/ Q3 M; I, p$ L
  822.         xchg    cx,dx; D" v* d- ?, f0 U: X- W; J! q; S$ q" t
  823. no_swap:  c# l2 r* e. }# \- p) f& c
  824.         ret
    8 |- d/ K9 @: ]- L  t: j

  825. 0 J& U& S- d' O7 }* B1 v% ^
  826. _set_subroutines:
    . i% `: C( E+ g/ W: [+ d6 |
  827.         mov     cs:[user_subroutine],dx2 {( O! }$ J  J1 S; E
  828.         mov     cs:[user_subroutine+2],es
    7 e3 ]6 N4 ^0 N- L7 w( y0 d& o
  829.         mov     cs:[user_mask],cx
    - i8 u' i/ l8 t* r
  830.         iret
    # i3 T! d1 D; N1 J; b: d& K
  831. : t" a  {: K* c5 p+ ?
  832. _swap_subroutines:- T" ?9 @$ b! h/ G+ X+ c+ Z* @/ m% G
  833.         push    word ptr cs:[user_mask]
    1 ?5 ^: W# |$ M0 O( E( c# S! x9 u* T
  834.         push    word ptr cs:[user_subroutine+2]7 x5 c( [8 t* s( D- X; I
  835.         push    word ptr cs:[user_subroutine]
    , v+ ~3 I2 h  Z8 E/ V
  836.         mov     cs:[user_subroutine],dx2 @. \& o4 x1 c- Q( W/ `6 |
  837.         mov     cs:[user_subroutine+2],es
    2 e. s( j$ h5 d; q0 \) x
  838.         mov     cs:[user_mask],cx
    9 U' ]# G0 i. |7 \7 W
  839.         pop     dx# @( [9 y" f1 q. f( o, X+ g$ O7 `
  840.         pop     es
    . I$ K, e/ q+ j  V/ \
  841.         pop     cx; h  ^0 p! P- y7 ^
  842.         iret, s7 E* v1 D2 o3 K  `4 A. c  R

  843. % M0 n7 c7 g7 l0 G6 r; p; _% f4 w
  844. memmouse        endp2 B) Q2 w+ f0 ]+ C4 P
  845. 3 j( n5 @& _! R) J
  846. endof_start:( U7 n' v7 X, v" X0 h7 R8 p

  847. % U/ L- y, S2 A" W3 t- P0 l
  848. emsg db 'No mouse driver install error!$'& J0 ]0 r0 P" m. p' i/ t# z
  849. old331 dw 0
    - E, t1 `4 R  Q; U( k, X" l* v2 t% g
  850. old332 dw 0
    # A. |7 H3 ?3 ]1 D
  851. old741 dw 00 E/ h& u4 i0 g* a: C
  852. old742 dw 04 Z; P2 l9 B, C) V# F
  853. memcopy db 0% \( Q: E2 Z) m* @* ~, H
  854. okcheck db 0% _7 S9 r! P8 Y0 v( c3 z
  855. pass db 0
    6 \, W6 z6 ~8 G; y" Y5 @
  856. chkl db 0! t4 ~6 @5 y9 i8 d
  857. lk db 07 I" c) i9 c* t5 U% Q! {( J. ^
  858. chkr db 0
    0 P9 f! k0 ~2 _. }
  859. rk db 0
    9 d9 J0 Z0 E& y4 }/ w, F
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ; D: a& R8 i  f" l/ H% C- s
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
      }5 g. G7 V" K/ G1 K1 m: p! R
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ( }5 h7 n* }: J9 o1 a$ W* }
  863. db '                                                                                '
    + V! ?! m/ b5 N% ]0 Y
  864. db '                                赏屯屯簧屯屯突                                  '
    1 V( {# e( H: n& W- S
  865.         db      '                                ?OFF汉OFF?                                 '
    0 [3 m" R+ u. w
  866. db      '                                韧屯屯既屯屯图                                  '
    1 T. T/ J! I8 {4 M5 C
  867. db '                                                                                '
    + ?: K/ F2 c8 w9 U
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    ' }2 U% ]$ e. O7 q' J$ B
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' / z$ r3 k; P4 h0 ?  p- D
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '* ?$ W5 i2 ^" e2 |3 r

  871. " s( \. S" a3 A! b: K0 W- d. f) @
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
$ o& Z: \( U0 v& i4 B7 P哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... - }0 h; C; n9 Q+ ?& J1 n; S
2 \; B# ?6 f* b! x; R' U# B
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 10:40 , Processed in 0.070192 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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