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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
# ^, U( U9 E$ i8 G
! |" G; P9 B* O代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    / k+ V( b: l- E! y7 e' K& H" J- `
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9# f) o: ?7 b# o# n" q! q, ^
  3. ;                                         By Bini.Yi 易祝兵
    2 g  w& D( v) r) q
  4. ;                                         http://www.ufoit.com 计匠网
    , z; L: i& F" Y' h% B: q
  5. ;                                         2002/04/06 YYYY/MM/DD! Q0 Y5 }  Q- r( A, S/ o
  6. ;
    ' D7 q6 D! h; x, P, T2 Q+ i5 w: s
  7. ;         
    # {/ I* G, y( m, T$ k- H1 q) Z4 K
  8. ;          This program  test the mouse button  click and move.
    - D, X+ r7 G* b
  9. ;. H, g6 ~% m0 V3 _, o0 H
  10. , y' w. D2 F' B! T  I  w
  11. .model tiny
    * i2 r$ i+ @: J* [( F8 M
  12. .5861 @0 d) k$ k& n# d
  13. .code/ o# V! N  J" A) y$ @, v- D
  14. .stack  100h  H0 Z+ P( T; P8 A0 \; m
  15. .startup/ i; s; Q. P3 v4 E' ?( X' ]  S
  16. pusha
    $ ]0 {' a' ]- L1 a8 M. B+ s
  17. mov ax, 3533h
    . k$ x  N. k& \' J
  18. int 21h& m  i! }9 N5 A& J( i2 O/ f6 Y5 l
  19. mov word ptr cs:[old331],es, w- Y( |1 i) h
  20. mov word ptr cs:[old332],bx1 u2 l) r1 h9 z' o) k/ z+ M
  21. mov ax, 3574h  o2 Z4 @) Y3 t$ z( P8 Y# I* {: F
  22. int 21h' a5 \6 y. c1 @
  23. mov word ptr cs:[old741],es
    1 _( h$ x3 @' h7 u. F  A
  24. mov word ptr cs:[old742],bx
    ! k- \$ x! r8 q0 n; n
  25. popa: s( e8 Q3 H) h+ N' I& J0 V( S9 x0 c" i
  26.         call    memmouse
    ! X- H4 W' C. \: e0 x! H7 c
  27.         mov ah, 00
    : X0 O! U: T% q% ]$ F" y
  28. mov al, 03/ t6 C& M0 R+ |& M4 x3 o0 \
  29. int 10h$ k5 J1 D9 S; I
  30. mov ah, 06& w0 F2 i! ]  R2 G. S
  31. mov al, 0
    6 U! Q% \( {+ v& t7 q& D* n  [! I
  32. mov cx, 00 p9 L/ Z5 N: a% O6 r0 w
  33. mov dh, 24
    9 F( `9 o6 y' k7 i2 T& ]$ n; z. l- y
  34. mov dl, 79/ _! p: s. ~+ A9 o
  35. mov bh, 07h
    " V. V- o5 T* }0 E5 _$ M
  36. int 10h
    6 |, \  U# \( U% O+ W
  37. mov ax, 0000: O2 P+ @$ z1 `* A7 x
  38. mov bx, 0002; J/ c' P. `. V1 L
  39. int 33h, I' m) {; `0 {3 S, x
  40.         cmp     ax, 0000           ;if no mouse drive install
    1 s1 z* e( A* S: v/ D
  41.         je      errormsg           ;show error MSG5 R: F7 C! \" L) {
  42. mov ah, 02
    4 S3 s& }, a! L" j; y
  43. mov bh, 00
    8 e8 ^- j5 O5 ~3 i7 o, ?( R3 A. V
  44.         mov     dh, 25             ;Move point out screen. m, V, l; b, s% z* V
  45. mov dl, 79& A! ?" D  c* }6 s0 Y6 k7 R4 }
  46. int 10h7 ^& V" j- I( _' C: J' Y6 a
  47.         call    showmsg            ;Show info  u: T) }* ?% Y
  48. mov ax, 0001
    1 g! S1 Y0 ^7 N4 @, o6 [2 C
  49. int 33h  V  F! a* Y; d- j/ ?
  50. ; mov ax, 000ah6 T& g2 Q& V& m, C, \2 q$ Z+ f
  51. ; mov bx, 0000
    / g' _  ~1 @9 H" n4 O
  52. ; mov cl, 0h
    " g; w+ o  _( i8 @3 g, B
  53. ; mov ch, 0F0h
    3 W* m, [2 H5 ^
  54. ; mov dl, 0h
    4 c, m7 O: ^  i2 S: H9 P
  55. ; mov dh, 0F0h; z+ |0 Y. l% V9 ~
  56. ; int 33h
    # K! ?6 v4 o  x( O% Z, }/ Z
  57. mov ax, 0004h
    - I  C" q' B* ?0 \7 n1 Q
  58. mov cx, 0319
    # `# b$ y" u, B* X, X1 o8 L- p1 H6 @
  59. mov dx, 0103( \' [. _! A% J( @3 g" j
  60. int 33h) q) q0 R: V! K. G
  61. casemo:                           ;Case button click and point move - X7 U4 E& f) o% i. g* f
  62.         mov     ax, 000bh         ;and keyboard press
    3 f6 h& |8 G7 Z, O% [
  63. int 33h
    9 s' p$ M. q7 Z7 o- H6 C
  64.         cmp     cx, 00h           ;if point move....X; ~% ]6 r+ y& \
  65. jne xmov- \8 q" H" c6 j- A7 D6 Q+ }
  66.         cmp     dx, 00h           ;if point move....Y  k& [% t$ I2 T, w5 l, @2 R
  67. jne ymov9 r: w; K  D5 `3 `
  68. xymovend:                         ;X.Y move end
    , Y1 ^8 G- I' \0 e6 ?) u7 c
  69.         mov     ax, 0003            o- M$ G) H( ?( d5 \& w
  70. int 33h! D1 g% y3 w, z5 |
  71.         cmp     bx, 0001          ;if left button click  show ON5 \7 p; |; H  s1 T
  72. mov si, 1828" V! a7 Q/ Y7 E' @/ H: t. A4 h
  73. je listl
    8 c2 |8 |, {5 N5 J9 `; ?
  74. mov si, 1828( b% h2 U1 A" Q  q; o
  75.         jne     nlistl            ;if left no click show OFF" o" l3 c7 E# I+ n3 s
  76. testr:
    1 ]% e7 |0 [. n6 ]1 N+ r
  77.         cmp     bx, 0002          ;if right button click show ON
    8 Y( x1 B% U; E' D$ y3 E9 t
  78. mov si,1842  x. b! z& X/ S
  79. je listr, C' B) c+ g* M3 H6 w9 w* ^5 h
  80.         mov     si,1842           ;if right no click show OFF
    * I9 b; J8 r! ]* r6 g
  81. jne nlistl2 O' D7 ^# l& ^  B0 {
  82. casekey:7 \2 ~7 B: ]* w: z8 i
  83.         mov     ah, 01            ;if any key press jump check
    , b8 o- `, P% @- t' S
  84. int 16h
    , d# d5 P' p3 O
  85. jne kpress! [+ `: \; D2 H+ v4 ~& `6 J
  86.         mov     al, [chkl]        ;check x flag
      f# o: m9 x7 |, [, O/ h5 |& l
  87. cmp al, 02h
    ; l2 d; t  U2 x4 [) `" ~* I
  88. jnb chkok, O9 v9 ?' q( S5 C" r7 e
  89. jmp casemo0 l  }& L! }* G! b( @
  90. xmov:                             ;if X moved, get the X flag+1! t" e2 X4 C$ o& u2 ~; o9 I
  91. mov al, [chkl]
    ! I0 S4 |, M0 \3 W
  92. inc al3 a  F: ?# J- N4 t
  93. mov [chkl], al
    / q6 p% H0 X) R( t
  94. call passok
    * W. U2 E! h0 z8 v- R) P7 {
  95. jmp xymovend+ W# Z4 p' ^8 J' b
  96. ymov:                             ;if Y moved, get the X flag+1: o1 z, Z; `; t& C% F, M; ~$ |
  97. mov al, [chkr]
    1 y$ F& x: E6 z4 V
  98. inc al
    2 O, P3 v) N  \% ^/ b* K7 f$ D4 O
  99. mov [chkr], al
    " R5 R- O3 D* \4 p$ l, C9 P
  100. call passok; j$ K& s$ A! \0 H& r- @  L
  101. jmp xymovend# L0 E. ^5 W& g) X! }

  102. 0 r& l% j' j7 ]6 l. q! z$ h
  103. passok proc near
    ) h$ I+ r/ K# ^) u& |
  104. mov al, [okcheck]
    2 m, u8 Q! t9 V" r: _
  105. cmp al, 1
    * }% e7 P4 }& f8 r, y
  106. je let0' u" ^$ g/ a  {6 U
  107. jmp passret& R8 @- o  a* _4 u. C1 r
  108. let0: 8 O" a' T4 r$ D. F) L1 i
  109. mov [pass], 13 M( R$ f/ d/ v# O  W4 ]% @
  110. passret:
    % I1 E- }: F, {# Q( K$ x
  111. ret, _* ~7 X0 S6 k
  112. passok endp 7 R& {0 \% b8 j1 ?3 B% M* e) n" n

  113. . X! M, F7 }- S+ L, h! Z6 d
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS/ m5 o* }' f# A" E; q$ t8 ?( S
  115. mov al, [chkr]! z( k. D; M. g
  116. cmp al, 02h# C7 @8 @3 b2 u# W0 |( j; M! D1 g
  117. jb casemo- z; i* a) \6 w
  118. mov al, [lk], u: `8 x3 p+ s6 I/ }
  119. cmp al, 11 I9 V: n" M. l6 O; l
  120. jne casemo
    . ?: r& V/ t5 [+ \0 W5 R# P7 C
  121. mov al, [rk]* z! Z& N( p5 ?2 u1 Y* o6 q
  122. cmp al, 1
    ; G0 ~, m! Z7 s( d$ U' H' L& v
  123. jne  casemo7 S$ v; [0 Y: u
  124. mov [okcheck], 11 i; J( c! d& }% f* t6 A
  125. mov al, [pass]" M  k% i  y7 I5 e1 J& P" q
  126. cmp al, 1# S8 i; u$ f% c) g
  127. jne  casemo! l7 E/ u. l3 i7 {* K7 M- A0 C
  128. mov ax,0002h6 r4 C& |" S! G  r+ G8 Q& R8 B
  129. int 33h
    : M2 n* ^4 Y' f( n2 X3 @
  130. call cleascr4 P. F/ _* U+ t8 d7 K" w
  131. 5 m* }* m$ d; m, Z  e* \6 J$ W: e
  132. call oldint
    ( V- |. H/ |/ x/ E
  133. mov ax, 04c00h
    ! F4 h- e$ [1 ~4 X& O
  134. int 21h3 v1 k" N& i; B0 O- l2 v% {
  135. - \: H7 u0 T" G* m
  136. okexit:4 @$ G; S; @) C. x
  137. mov ah, 4ch
    2 |8 I+ v% D) ?3 g- u. k
  138. mov al, 01 K2 x7 H, |$ O: x1 O' Q
  139. int 21h. J% G2 i/ M+ o0 M. B9 J
  140. listl:                                 ;Show ON
    2 k3 s7 o3 t. I
  141. pusha
    $ c1 r9 F! T- d' R6 y/ f
  142. mov ax, 0b800h6 y. l% V% Y' Q# T4 t
  143. mov  es, ax
    $ e0 _) w' h; j8 J) W, \/ g
  144. mov ah, 47h
    # Z  a; R3 B. `6 [" @. E
  145. mov al, 20h
    - F. @5 s: g- x0 T; K1 ]% w' H4 @
  146. mov es:[si], ax
    4 V3 b* ?. L3 ]6 F8 {: z
  147. add si, 029 |6 O5 N5 G- S" C& h! I
  148. mov  al, 4fh
    ( k+ H' f; Y5 Q; B* g4 ^/ p
  149. mov es:[si], ax
    * s5 D$ Z1 J$ D: v) e
  150. mov al, 4eh
    & ]3 M3 f8 V$ W" h* W
  151. add si, 02. t! g% V! }$ N2 T- j3 a
  152. mov es:[si], ax
    - d: q8 o* M: g
  153. mov [lk], 11 v/ E, L! J3 S: i% D& B4 {3 h+ S
  154. popa
    ) m; b$ r( T7 V6 J5 A4 U
  155. jmp testr3 S4 i4 M$ x: i1 h3 U. {9 a8 U
  156. listr:                                 ;Show ON# h+ \, y* R6 S3 G9 Y/ |. n
  157. pusha
    , |3 s7 U. P0 Q. V+ I
  158. mov ax, 0b800h
    * N. g2 j( }& d. c: d+ y+ n( ^( g
  159. mov  es, ax
    + H: s1 W# \. h1 {: T6 m3 P
  160. mov ah, 47h
    + `* m9 ^8 e+ }! p; P
  161. mov al, 20h( l. r$ K. Y7 |
  162. mov es:[si], ax: ]8 t; F$ D3 F, Q0 l; O% \5 z
  163. add si, 02
    ! w/ h3 @! U: d$ F/ D
  164. mov  al, 4fh1 o: J  r8 W, `0 D
  165. mov es:[si], ax
    ! w/ G: H( a& r* [6 E
  166. mov al, 4eh  I$ k( ]  w; k* b: [% P
  167. add si, 02$ s, Y  I( c; A9 Y8 U7 s- ^7 N' R
  168. mov es:[si], ax
    5 h' A% F2 G' c: y
  169. mov [rk], 1
    / `+ l; q% Q4 Z, [6 o; I- I$ \% V
  170. popa
    , m& o3 y+ x, d- @1 i# S
  171. jmp  casekey' E/ S# g, t) J" l6 U& T) M

  172. 3 o6 {- ~6 F: b% O5 L& N1 }+ [" o
  173. nlistl:                              ;Show OFF
    ' M, ?  P* p' r( [/ e6 Y
  174. pusha   0 b2 w0 w* _1 m
  175. mov ax, 0b800h$ K: y) z5 V9 U. `6 u4 _( G  B
  176. mov  es, ax# [  I& Q5 N+ q+ R' ~
  177. mov ah, 17h$ g% g9 Q3 a' ]
  178. mov al, 4fh
    ; ~5 M3 b5 S- l; j0 \
  179. mov es:[si], ax
    6 w- y# w' U5 o) Z$ O8 {
  180. add si, 02
    5 y4 N7 z) p5 X( ]6 }
  181. mov  al, 46h
    " w1 O/ H: W$ @+ L- D* {& ^' v
  182. mov es:[si], ax
    * h0 M8 j; @' q) g6 p0 g
  183. mov al, 46h8 k" h2 L# \7 @4 q2 ~5 k& Z/ l
  184. add si, 02  p# A' T6 u& `1 P' g9 O, G
  185. mov es:[si], ax. q( T; ^9 V! I1 r$ W& C! r4 c
  186. popa- K- n0 x, Q0 _/ M; _. D! k" A3 m$ _7 L* I
  187. cmp si, 1840
    " G0 X0 Y4 h; E( `
  188. jae casekey" {. Q. q5 O9 Z$ l
  189. jmp testr
    0 I4 L, U" N8 a) s) e9 v) ?

  190. 2 b$ I4 n! O& |# m' X! p, Z+ Z3 T3 M/ b5 N+ M
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    & s( b! }8 e0 J: C7 z7 d; x
  192.         cmp     ah, 01h             ;and return a error0 J6 k& p) V) ^" _9 q. h
  193. je exit1/ s7 w5 k  x: Q  x: G
  194.         mov     ah, 0ch             ;if press other key then clear) v" N* B' Q$ |& }  A/ H
  195.         mov     al, 00              ;keyboard buffer
    # v0 H! B* h% z  x1 S: y1 o
  196. int 21h
    3 W# i& Z6 G5 t6 l9 K3 V
  197. jmp casemo 0 @! X* ^; q- |

  198. - j/ X8 V1 c) e; v8 }6 @0 p9 c
  199. errormsg:                           ;if mouse driver no install& I) I7 Q2 _1 A+ [1 n: ^
  200. call oldint" K! l- V9 p$ H3 r3 |
  201. lea dx, offset emsg) d& ?& `& f; d) e
  202. mov ah, 09h; X9 j. u. V) H
  203. int 21h+ O" C% v% S6 z# }9 ^1 |/ k
  204. mov ah, 4ch
    * g+ |& P! m/ f" P- V8 l9 y( B
  205. mov al, 2( i) N% {/ N) S* J5 l
  206. int  21h
    - z% y, p% k$ j$ `
  207. " [: d2 s/ T+ }1 N/ V" O
  208. exit1:                              ;error exit
    / f8 T' v8 v! Q
  209. mov ax, 0002h
    / e* w0 T( b. y  @4 h
  210. int 33h6 h/ v& N/ z9 |
  211. call  cleascr
      a% g8 X0 X# c. O( H
  212. call  oldint$ @2 x. m  t% v. F' U
  213. mov ah, 4ch
    % Y. @6 ?: j1 d! g( l
  214. mov al, 01
    ; O! V: {: h# L4 w. ]6 B
  215. int 21h
    0 I. N" I5 [+ x  U4 ~
  216. 4 v5 i7 O7 k) ~, }7 o
  217. cleascr proc    near                ;clear screen
    # e9 n5 e& [0 }, G" }/ r
  218. pusha6 v6 R0 H* C7 T  ^' D
  219. mov ah, 06
    6 ?1 z+ g1 X3 M/ n$ s! y" Z( \" |
  220. mov al, 0
    7 R, t6 G- F1 {* r
  221. mov cx, 0" {- r! b$ a- O/ Y& \" S& M5 q) e9 @
  222. mov dh, 24
    3 P8 ]$ Q8 E" M8 ~' ~, @% H% }
  223. mov dl, 79
    4 V0 H9 C& w6 t6 x, H; U
  224. mov bh, 07h
    , l4 w& m$ R; f# M
  225. int 10h
    & M. `  b& x8 L' `4 S$ z$ l
  226. mov ah, 02
    $ _5 E  U0 y- E3 x& n
  227. mov bh, 00
    & E1 c) |1 V$ b' I
  228. mov dh, 0
    " [8 c( s+ ?( R/ T! r: B
  229. mov dl, 0
    ) }, k7 ^( G  P- h4 x+ N- Y( e
  230. int 10h
    : B$ K; v; ]1 c& D
  231. popa
    0 C6 v7 ]3 d/ D7 t
  232. ret, e- Y$ }- }2 w2 F% a2 j
  233. cleascr endp
    1 i$ u4 Z( P, s, \) N& w+ K# p
  234. ' E7 f1 Z" s0 G9 R# t
  235. showmsg proc    near               ;Show info
    2 O: Z* O5 U' _- h$ N; I) ^
  236. pusha* I+ M; k/ L) @  \1 u
  237. lea di, offset showms
    " O; x0 q: Z" c- L( f% p) u
  238. mov ax, 0b800h
    * K. e2 |0 W- s' i: q
  239. mov es, ax0 J5 H$ |$ J4 |, j
  240. mov si, 0. B3 v# l, O, D7 a
  241. mov cx, 4807 V$ R5 f0 r& x% T0 B$ h
  242. mov ah, 07h8 }0 r& H8 F. F8 q- O
  243. @@:
    ; t) `. ~6 B, s' P# J& r
  244. mov al, 20h
    " e$ O, B0 L: y5 b: G. ~" A
  245. mov es:[si], ax
    - r$ _# u. x0 y6 o2 D+ C2 j4 h
  246. add si, 2
    % ~* i* C' M7 \# }% p0 c3 d
  247. loop @b: x1 q0 [+ A0 l5 B1 B
  248. mov cx,880
    : O! i: ~7 `4 S7 @  R, D
  249. @@:' e* K1 U2 e" r6 H; C, F  R
  250. mov al, [di]
    ( L; X+ m! `$ J, W6 x2 p' p! ^
  251. inc di. t* j4 W$ |7 I; h& n$ H4 N/ S
  252. cmp al,20h" v/ ?' o$ X/ {1 X  L
  253. je showch1
    4 I8 w+ {# ?9 T- G' Z- M+ q+ ?
  254. mov ah, 17h9 d+ g. r, w2 s3 a' e  m
  255. jmp showch3
    " x2 D7 n4 x* E; [' C
  256. showch1:
    & ]' n$ m8 J& E" |  k8 x
  257. mov ah, 07h
    " m5 j( g0 x, l) j0 F. R4 Q5 b: Q
  258. showch3:
    7 H, u/ v6 W' a2 k$ W3 u
  259. mov es:[si], ax
    5 g$ L- G8 x3 H. b
  260. add si, 2
    + e1 H9 @  d0 n( S8 G' y0 \
  261. loop @b; b7 J0 \# g, Z6 I! N
  262. popa! z' T7 W: t6 E
  263. ret( D! d* H2 R3 L# Q: V
  264. showmsg endp
    3 n2 Y& I3 ~/ k1 F  }  M: ]  ]: u

  265. & P0 k. s: T' |' W
  266. oldint proc
    , x8 ^0 q- h6 Q+ q
  267. pusha
    3 s8 c- T% [3 M+ \+ Z2 C' l
  268. mov ds, word ptr cs:[old331]# O% Y4 E  B0 C6 B
  269. mov   dx, word ptr cs:[old332]3 D9 i% y" C# V/ Q6 V
  270. mov ax, 2533h4 F7 L, p3 G/ \* o1 r
  271. int 21h
    & [! Q. d* b2 G" T7 F
  272. mov ds, word ptr cs:[old741]0 O' {: }4 O/ ?/ m1 h
  273. mov dx, word ptr cs:[old742]  v  v" J4 H( q3 k
  274. mov ax, 2574h
    # w8 J5 f2 u4 y+ r" D6 e
  275. int 21h+ L1 A( f) T) I3 Y! U+ i+ {
  276. popa% h5 }- n4 C9 F# }. X
  277. ret
    2 G  w6 s$ @7 v7 ~4 x
  278. oldint endp; R6 \0 F4 b) @- w3 R5 p/ S

  279. 8 K% A- w& V& u7 U5 V$ Z+ ]
  280. memmouse        proc5 C0 b/ Q. b2 I. G
  281.         xor     ax,ax, I$ R1 ^2 {4 b+ g) K  Y+ _
  282. int 33h: f% G% J# V( H5 W# o4 N% i6 N
  283. cmp ax,0ffffh
    : l3 ^6 S3 c- Y$ v9 t
  284.         jne     not_loaded
    1 K4 F7 V1 Y, t* d8 y9 h# |6 Q
  285. mov [memcopy], 1
    / O4 D1 G8 L4 l
  286. ret7 N( _, V7 q$ B$ |

  287. : X5 R8 ^5 L; M' ^
  288. not_loaded:
    ' U3 \; j, ^7 P/ G  R

  289. ( }, U& @2 J) ~
  290.         mov ax,2574h! s+ A; T+ P. W5 e: a
  291.         mov dx,offset new_isr) P  Q' b! j* q/ a
  292.         int 21h2 L3 U8 F1 h2 n6 R* L

  293. 2 w; }+ M9 K1 J# R/ q7 k7 ]/ z) u
  294.         mov ax,2533h
    9 w5 n4 ?$ `+ t+ t& W& B
  295.         mov dx,offset new_33
    $ p" {  M) u+ _* n+ |7 Y
  296.         int 21h8 w; p' Y) O. v  s- G
  297. 2 n& g9 O2 }, Y' c- B$ }1 s
  298.         cli
    * M; @6 D; r6 b7 M
  299. 1 f+ V8 n0 P4 l. }2 c! h# }- x. n( K
  300.         mov bl,0a8h5 d" w% ]0 k. T/ V( T
  301.         call keyboard_cmd% O0 J5 j9 H8 |/ J* h
  302. / I0 a5 E& p4 B5 q+ k6 t
  303.         mov bl,20h+ d: E- @& T3 ]
  304.         call    keyboard_cmd( f7 D0 E$ o1 F  z3 j, [5 w. r
  305.         call    keyboard_read
    1 U! Y! S  u- ?) W9 ^
  306.         or      al,2& g5 G4 Q7 n# n8 H8 {( `9 |
  307.         mov     bl,60h
    : Q1 i; L, V  }1 m2 ]6 N
  308.         push    ax1 s! h6 ]% `1 \3 r+ }
  309.         call    keyboard_cmd  I7 N  W' G7 D
  310.         pop     ax
    : c! {  L* B4 Q5 K! S0 K9 f6 ?
  311.         call    keyboard_write
      C; j1 K, Q' ?7 t' I# V
  312. 2 o6 Y! C7 X8 }
  313.         mov     bl,0d4h& w1 K9 O  f0 D! a, s$ x+ f3 @
  314.         call    keyboard_cmd
    9 C, D/ X" k/ q' @. [# V! t$ I
  315.         mov     al,0f4h) d6 J: h/ b: ^3 v' h+ S- g5 s) M
  316.         call    keyboard_write( v* o) x% z; k, k% g5 h( K2 ?5 {
  317. 4 l5 ~/ @9 j" W
  318.         sti# b  m4 ?  s5 _7 E: A
  319.         ret, s2 U! a" C. V
  320. call_user_isr:
    : f0 H7 e6 w  i7 c8 a% H
  321. db      60h3 h# R) N2 y/ w1 U, B: i& c$ d
  322.         mov     cx,cs:[pos_x]
    ( c1 h- _& y2 b
  323.         mov     dx,cs:[pos_y]
    : t" f' G5 h3 {9 d& R) q
  324.         mov     di,0 ;cs:[x_move]- N( B* q5 Z# v' i
  325.         mov     si,0 ;cs:[y_move]( X" q7 j/ y6 n2 T9 T0 Z" D
  326.         mov     word ptr cs:[x_move],0
    7 L) G9 ^7 y' v1 @6 l' [$ ?
  327.         mov     word ptr cs:[y_move],00 D  k0 A6 A& N
  328.         mov     bl,byte ptr cs:[buttons]
    ' S( U9 W' }$ C& n/ h2 I; x
  329.         xor     bh,bh4 P/ w( H) a$ z+ _
  330.         call    dword ptr cs:[user_subroutine]- t# x3 L- d5 S0 F. W( g
  331.         db      61h6 f, _% J! l. T1 Y& K  v9 d' h
  332. ret- A, ?7 j: d5 s1 c+ x
  333. new_isr:1 d7 d( t* g9 g, a+ l
  334.         pushf
    6 |9 b2 \$ b0 a# q8 F( U6 E! j
  335.         cli8 I- X1 {: B( @7 Z! ~5 Q3 I# F1 o
  336.         push    ax2 P: ~7 z. T. B  U2 s+ J1 d4 K
  337.         push    bx
    ' p7 e' p! c! M, x2 o! n6 w
  338.         push    cx/ R$ S, b" k  [$ X
  339.         push    dx
    + _% L. P; L  Z/ H4 v, o* D7 m8 G
  340.         push    di. X! P2 x$ j  C; M/ K6 w
  341.         push    si
    , |: l* O$ d; s  M, l5 e/ |
  342.         push    es+ W5 N. q* k4 l; u# m
  343.         push    ds2 i( h7 r) B+ X5 m% `; p

  344.   I: p  t8 u% c- H
  345.         push    cs
    6 i" M0 X/ G  F( j
  346.         pop     ds
    & r& Y& V. W5 G" z

  347. ! P* L! b. P% l* H: l7 P! ]8 z1 g
  348.         mov     bl,0adh& }! [, a, J  `  S  j2 S
  349.         call    keyboard_cmd- t" K; k; u( P; i4 ?* E: S2 m2 ]
  350. & Z" M0 K% U: V( v& D" ^
  351.         cmp     byte ptr [first_time],0
    " L/ K& S( B( B7 V
  352.         je      not_first_time% w0 x8 u* @3 G, }( p! C9 D
  353. + X% Y  g# B' k. R
  354.         mov     byte ptr [first_time],0/ o, l. T' n; n; h3 D8 S
  355.         call    keyboard_read
    ; b" I  l7 J5 b7 M$ ~; i# c1 [0 q
  356.         call    keyboard_read
    7 H6 q4 X, T7 P+ O' I* `
  357.         call    keyboard_read
    : D2 p8 z. A4 b# I9 E: o6 x
  358.         jmp     no_show, b7 Z" C* r, D' v+ M
  359. 0 \5 V# }+ h, o* O, L: y
  360. not_first_time:! [7 u8 W% S2 P
  361.         mov     word ptr [temp_mask],04 H- u+ h5 f2 W, Q$ I; l
  362. / Q0 z* x9 T4 x' k+ C0 E
  363.         mov     cx,[pos_x]) m! F  N! B" L4 A
  364.         mov     dx,[pos_y]- X6 k( K  z1 Z- J, {' V& }+ s
  365. ) ^* t2 [# d! _: {$ Y. T' _
  366.         call    keyboard_read
    6 I/ w5 b, t) B
  367.         and     al,7 ;30 B7 E8 M+ c: m  [0 p. b+ M
  368.         mov     ah,[buttons]
    , H! T* s, m% {5 Y* q# @+ V" z
  369.         mov     [buttons],al
    0 S* d: w6 Q; c4 m
  370.         cmp     al,ah( z* I! e* K3 s: F. g
  371.         je      no_button_change
    # k. T  V" u( W2 H: R# j" l4 ^
  372.         and     al,3' j/ L4 H+ O6 F8 p! T0 A
  373.         and     ah,3
    5 }: T2 X; ~& s/ p5 K# W
  374.         xor     al,ah+ v5 d: q2 V0 h6 i2 {: J; n: J
  375.         xor     bx,bx& b3 ]2 ~, Z& M& c! E
  376. ! n) @: R2 I& Q' D
  377.         push    ax2 T% _5 N9 v. j9 o
  378.         test    al,2, w/ `5 s  a  R2 `
  379.         jz      no_right_button_change" e: i) t' j7 P- Q  M
  380.         and     ah,2
    6 t" I9 j7 k1 j! G0 h3 C
  381.         jz      right_button_pressed0 l/ _4 T* e; d- w/ w
  382.         or      bx,16
    $ R0 s5 Y  h4 \2 E0 V0 e
  383.         jmp     no_right_button_change
    - v2 P1 z8 j* P9 j* D2 {$ x4 ]
  384. right_button_pressed:
    ! G3 M0 F, R& R* ]
  385.         or      bx,8+ R  ~1 F* h) q
  386. no_right_button_change:# g, ?( m$ Z$ l

  387. 1 \+ T  S$ {, O; z6 Z( c/ p# v
  388.         pop     ax( X6 z# O& X& `; _

  389. # Z) ?# J5 S9 H$ J( n6 o& x
  390.         test    al,1
    , J/ V1 T) r: Q/ U. ^% V# o
  391.         jz      no_left_button_change' p0 A2 ~; e# d, W) M9 a) }& C8 s
  392.         and     ah,1
    ' l/ l4 y! V; H4 X
  393.         jz      left_button_pressed
    ; Q9 C! Z+ ^* x9 @
  394.         or      bx,4
    , J$ {  Q; I. u( n' _
  395.         jmp     no_left_button_change1 E: t) a/ b% W$ n* b5 e
  396. left_button_pressed:9 L5 r) N9 b' ^& c; V
  397.         or      bx,2
    . T; r- S$ J$ Q, Z% J% E) e9 g7 i) V7 i
  398. no_left_button_change:/ z! c: q9 `+ m, g; f

  399. + X$ ]# |8 b8 c) X/ K8 j
  400.         mov     [temp_mask],bx
    ( T+ y5 \6 u& B0 c2 N. Q" h, n

  401. - V# K$ z: X& R2 [! i. j
  402. no_button_change:% R1 _. L8 T) h1 Z  S) Q
  403.         call    keyboard_read
    ) L/ {( b. S) l1 l; J) V( O+ T. q
  404.         cbw* Z. f9 ^4 L( Q4 p% r1 W
  405.         add     [pos_x],ax
    / A3 q4 y, {1 c6 Y/ G0 o" `# ~
  406.         add     [x_move],ax
    0 ?' h4 R  s, V9 o2 ~
  407.         mov     ax,[x_min]! V/ ^2 @( x$ x, [7 U/ H
  408.         cmp     [pos_x],ax. H1 I" ^0 E8 i" F
  409.         jg      good_hor1$ Z( n$ W4 u. T9 _5 o
  410.         mov     [pos_x],ax+ |4 f' s& P5 X$ g
  411. good_hor1:3 q8 |# |# A& F
  412.         mov     ax,[x_max]* p& w& ^8 E- ^4 [; D
  413.         cmp     [pos_x],ax
    ( o8 V& A5 y, u9 z5 R
  414.         jle     good_hor2
    + v! F" U  N/ \, z# s
  415.         mov     [pos_x],ax/ R% H; H( d1 D; F& S) g  r
  416. good_hor2:
    : p1 I0 C& b) f- A2 x
  417.   g! J1 d* Y7 {3 V: k
  418.         call    keyboard_read( p2 w3 M$ l6 _0 f& ^& R" f
  419.         neg     al) g2 Y' v: ?; b* c. p  k
  420.         cbw
    ' Q, w0 f# {; i$ w8 p
  421.         add     [pos_y],ax
    - o  X. g. b8 J; s9 f
  422.         add     [y_move],ax8 m* s" {. D$ V; C3 S5 q
  423.         mov     ax,[y_min]
    & V# }* e2 h8 z) b/ {( j
  424.         cmp     [pos_y],ax# c8 u1 d* |0 ~2 Q' n
  425.         jg      good_ver1) b$ ]% V. }& @/ a9 K
  426.         mov     [pos_y],ax+ p: U7 e+ g8 A, H3 T/ K
  427. good_ver1:) }- p+ X" |' X! s! b6 X; l
  428.         mov     ax,[y_max]
    - y; L' `8 v& S: X! O/ d& D' f) J2 P
  429.         cmp     [pos_y],ax0 s  x6 ~8 G: T
  430.         jle     good_ver24 y* D/ N/ J+ p! a$ l+ f1 v
  431.         mov     [pos_y],ax
    . E$ s! _+ \5 w; e# g; C
  432. good_ver2:. H' y6 [5 r: v; u

  433. ! A7 ]5 D3 r$ z" D
  434.         mov     ax,[x_move]: Q2 O! t  z5 e! K& T: m
  435.         or      ax,[y_move]
    / i7 w1 {5 K* }) j% r: r. L
  436.         or      ax,ax
    8 m: M! h" h( O) C' p' R8 [
  437.         jz      no_change_position% v2 ?0 H. O9 p4 W
  438.         or      word ptr [temp_mask],1
    6 v) f7 H  G" p, U
  439. no_change_position:
    - c0 z3 \. m  z% c; k" Q7 j9 x( g  d

  440. " j; o& ]) Q9 T5 g7 k, Z
  441.         mov     ax,[temp_mask]/ ^  [- A% n2 x; y$ ]) {- m* T) B8 k
  442.         and     ax,[user_mask]
    ! v* D8 O) o% b: E
  443.         jz      no_call_user8 j3 g% H; Q6 e5 N1 M
  444.         call    call_user_isr
    % k' Q1 [" x5 \9 O
  445. no_call_user:
    - N8 \) F& s* e- t+ N6 W$ X7 n1 z2 S

  446. ( n( |: ~, z, j1 ~- ?6 G: U9 ~
  447.         cmp     byte ptr [sm_flag],1
    ! D- s9 A- P' N" h8 L
  448.         jne     no_show
    . d6 v# I5 E- p0 f. m
  449. 4 \! _' V. ]4 ?7 i' _2 L
  450.         shr     cx,3
    ; a2 M4 M  n$ M' b: L- ?
  451.         shr     dx,3
    . z* p% f7 V: y6 R+ c
  452.         mov     ax,80
    6 D+ h. ~4 C7 L) o6 Y( e" M# U/ T
  453.         mul     dl- k* E9 X( F5 v; I2 L1 E9 F2 z
  454.         add     ax,cx( F0 B0 _6 U9 }7 I$ n7 n5 e, }
  455.         shl     ax,1: _! {* ^* m. w  _8 [* e
  456.         mov     di,ax' _$ M. E/ J, m4 N" n
  457.         mov     ax,0b800h
    0 E& f: ^  [, c, l' l
  458.         mov     es,ax
    ( @( n0 ~; r- R
  459.         mov     ax,[save_char]
    ( H% B' B# D4 u. u
  460.         stosw* _6 r2 q% t! m! n4 Z8 h9 l( z
  461. * s; W/ O9 r8 G3 ?! o4 _
  462.         mov     cx,[pos_x]8 r# M$ u. N# H' M: |4 q7 d# \! O
  463.         mov     dx,[pos_y]
    - Z* X- r  E* V& i/ k8 C6 l
  464.         shr     cx,3/ P7 U, V, C8 p- s
  465.         shr     dx,3
    ' D9 w6 w& x- h0 D
  466.         mov     ax,80% g" q7 e3 f" @8 ]' a! ?2 k* R+ L/ G
  467.         mul     dl) C" C3 U( O$ k$ ^2 o* \
  468.         add     ax,cx
    ! O, i; y' Y6 s% b( `
  469.         shl     ax,1
    1 D5 v% r1 R( T: j5 h! m$ P  b. q9 a
  470.         mov     di,ax
    7 M' T' C" d; M2 T: F6 Q3 {( K
  471.         mov     ax,0b800h
    $ I9 D3 k% [9 _0 \; F" H
  472.         mov     es,ax0 [4 g$ M' m( z' \8 o
  473.         mov     ax,es:[di]
    ; s9 p0 r9 b; d
  474.         mov     [save_char],ax
      j5 _! \. K! f( j' @# t
  475.         not     ah
    " b0 [1 }3 [4 G
  476.         and     ah,7fh  Y" ]) e8 K1 j' k) w
  477.         stosw$ i1 l, ^- W9 d* O
  478. no_show:6 X) V4 I. ?( o
  479.         mov     bl,0aeh
    5 c1 @8 }2 |- f1 p
  480.         call    keyboard_cmd7 p- l+ r9 @* o: J
  481. 5 W$ b* P3 t8 A; _2 f
  482.         mov     al,20h
    / {; s3 X/ T" L& ^
  483.         out     0a0h,al
    4 @- x1 U' ~* ?
  484.         out     20h,al1 k6 q( Z/ ?6 Y7 H( ?8 T

  485. 0 E7 s0 `: X# y+ I+ }" d8 A" R# s
  486.         pop     ds) g- D4 |. z3 [; K
  487.         pop     es
    , F6 R- w, o: Y
  488.         pop     si
    1 c5 @7 E, \4 q; ^( A
  489.         pop     di
    6 C6 Q: T. c7 T% Q% C: ]
  490.         pop     dx
    : |2 ]4 x: @: r& t  C
  491.         pop     cx
    6 b: E2 F% }4 K% G% @
  492.         pop     bx$ B+ |: r1 S: H; @
  493.         pop     ax
    3 c( e* j, O  a+ v
  494.         popf6 s( ^! s. y% e
  495.         iret
    ( u" I# p/ q; h, ^! I" w+ i

  496. 9 @+ @7 [7 P) C. E
  497. first_time      db      19 D, L0 `7 D2 U1 _' }9 G
  498. buttons         db      0
    8 Y8 X2 ^$ s9 U% h- t1 r" }
  499. pos_x           dw      0
    6 D! J& v7 A1 A5 m5 J5 \& V6 V0 n
  500. pos_y           dw      0
      P8 F3 d9 u. n0 I8 S' {
  501. sm_flag         dw      01 I) M2 U; K! R# M% f
  502. save_char       dw      0
    : b( `$ o" t2 D* u5 n  g2 z$ F2 d
  503. x_move          dw      03 O  Z8 e! u. @1 [7 ]! |; g
  504. y_move          dw      0) j) L' W5 ^5 p) f" i% Q: @( G. |
  505. x_max           dw      639
    # ]: N" Y' L  \1 [
  506. x_min           dw      0" @* Y, R& @2 l  w5 U+ I4 t
  507. y_max           dw      1995 u! Q4 p0 z  _( F9 y' Q1 d' [
  508. y_min           dw      0; C2 T1 t! ^5 f8 ?, W
  509. user_subroutine dw      0,0
    ) l7 c8 X& ~# ]2 x3 `3 H
  510. user_mask       dw      0* o7 M& R6 x* g+ H
  511. temp_mask       dw      01 l9 ^6 m: r. s8 G+ _( S
  512. : h( k8 u& b4 C4 `/ f
  513. keyboard_read:
    ( [, q, J8 U  O: L7 s5 p7 R( S
  514.         push    cx
    * M1 W0 J" S. G- F6 i
  515.         push    dx3 T4 ]; {: A$ Z4 V6 f8 b; b: m2 f: [
  516.         xor     cx,cx' D$ U/ ]5 f, q0 }; ?' o2 W
  517. key_read_loop:3 U, P5 a) ]* z
  518.         in      al,64h6 X3 [  y7 V3 X, @) @% R" b1 {% }2 P
  519.         jmp     $+23 ?. L0 e. u5 L$ [1 U
  520.         jmp     $+2
    1 q" [- K6 `8 r: t9 U1 E
  521.         test    al,1
    ! y! N- O8 N: A! w2 q
  522.         jnz     key_read_ready, B& F0 m. _8 N2 |' a
  523.         loop    key_read_loop  G9 m/ R" ~( E/ k
  524.         mov     ah,12 y2 x% s- S/ t
  525.         jmp     key_read_exit1 ^( u$ o6 J0 Y2 S0 f
  526. key_read_ready:
    & O( x% e/ i  O! `8 u2 e
  527.         push    cx
    % E4 |& Z- g7 O6 ?9 H( B. R8 c
  528.         mov     cx,32! P3 G$ A' Q( T3 R
  529. key_read_delay:  v/ F. r' f! c5 e4 w
  530.         jmp     $+2; m+ s) }* O+ `% p! Q% M
  531.         jmp     $+2
    : {. v# N5 a7 h% t/ T8 w
  532.         loop    key_read_delay
    $ Q1 P7 w! M9 O3 K! A, W. K( L
  533. ( f$ D1 Y* I6 A/ T. h
  534.         pop     cx- r3 L; e9 O7 n7 z$ L: s

  535. # a9 z' z* y# m! v% b
  536.         in      al,60h
    ( l7 J% Y9 V, G6 l
  537.         jmp     $+2
    8 p/ L5 ~, ~: s6 A' [( a
  538.         jmp     $+2
    * y9 C5 P1 G+ z& k9 }
  539.         xor     ah,ah- j' U2 y5 Z6 C, K  s( n/ K
  540. key_read_exit:6 x+ G7 x+ Z2 i
  541.         pop     dx- Z' R+ ~, A) B' ~5 g3 a  O) ]
  542.         pop     cx8 v7 ~  e9 G* |/ X- V
  543.         ret: x7 l2 O3 c% ]4 n, \
  544. ' P2 g: `7 [$ J, j
  545. keyboard_write:* G. E! K5 F& `% e  [' u$ D& D
  546.         push    cx0 g7 W7 T; H/ }* Z2 b% g
  547.         push    dx
    : e$ Q: u/ P4 J( x
  548.         mov     dl,al$ s2 h4 j" L( Y& c' h8 }+ k; Z
  549.         xor     cx,cx' X& e  n# K# a- P! z* D% r
  550. kbd_wrt_loop1:' n; _! ?1 E" _  S
  551.         in      al,64h
    , B' y6 J# ~$ T
  552.         jmp     $+2
    ! y! W7 u" V. k8 p
  553.         jmp     $+2* u6 O5 E' }7 S5 Z2 ?4 L' J1 X( Z
  554.         test    al,20h
    0 y# [0 Q1 x  v6 m8 i4 \, R0 }
  555.         jz      kbd_wrt_ok1
    5 @2 A6 }4 Z# ~# t9 }0 P
  556. $ T' f: g. A% b/ n9 B
  557.         loop    kbd_wrt_loop19 @5 i, n2 P# k& b+ p
  558. $ D5 J- I6 h# t: t; E% o0 c0 v
  559.         mov     ah,1. w' l* s8 q* b$ c, `
  560.         jmp     kbd_wrt_exit
    0 Y0 [  S, t6 _
  561. 0 p7 q, r* j2 w
  562. kbd_wrt_ok1:4 W/ b, X+ J: n4 m% `  z
  563.         in      al,60h
    ( M* Y- ]+ ]( m; x

  564. . ?. h. f' S1 e/ i+ `- ]- s
  565.         xor     cx,cx
    % d- ?7 N1 ~7 I: M( x# Y6 g
  566. kbd_wrt_loop:
    ) E+ |# c5 i$ W
  567.         in      al,64h
    ; o% Z! i" u7 }# y8 K7 N8 \
  568.         jmp     $+2
    2 V& r& I6 \/ p8 \
  569.         jmp     $+2
    ; H  }4 J: \8 D/ u4 A+ F
  570.         test    al,2( Z( B$ t( l; ^: ^" F" o5 u: b/ w/ G) n2 A
  571.         jz      kbd_wrt_ok
    ; Z7 c/ Y3 b+ W. s

  572. % E/ \" R* F8 f* a& ^( A8 V
  573.         loop    kbd_wrt_loop
    ( H1 U5 t5 }: j) I5 Z- a' j
  574. , D1 V1 c! @. V2 f2 E7 m! {* ~
  575.         mov     ah,14 T9 u! q9 n9 S9 ]5 `" K
  576.         jmp     kbd_wrt_exit2 `# `. a( @& s- [. e

  577. ! S* H8 x9 b% o. b( y6 l% G
  578. kbd_wrt_ok:
    4 O* R. B1 ?) j
  579.         mov     al,dl
    2 m  {! J  P% ~+ d) ?
  580.         out     60h,al  `' H  X& q/ F( M
  581.         jmp     $+2
    / U$ ~' _* P$ V0 l/ d5 ~% [
  582.         jmp     $+2
    ' R: ]4 V. E' E3 M- ?
  583. 2 s1 Z4 z* @5 ~8 Q, Q: N/ A' Z8 D
  584.         xor     cx,cx* @3 P+ U+ {7 t, ~/ `& c. ]2 u2 K
  585. kbd_wrt_loop3:
    ! X, M" k( u% C" I
  586.         in      al,64h4 Y6 ^3 e6 ?. L% Z
  587.         jmp     $+2
    5 k5 m  p( G7 o
  588.         jmp     $+2
    % S2 ^, ^7 ~% J% b# A8 z+ q7 \
  589.         test    al,2
    2 T0 x, l+ f) H. V8 l: W" W0 E
  590.         jz      kbd_wrt_ok3
    " k' r3 C! C  x6 ^- Z
  591. 5 T% x/ m) F; u) {; G6 {
  592.         loop    kbd_wrt_loop33 \4 x% p5 @2 R2 R$ ~% T

  593. 3 R, Z  @/ {+ F1 X  N* ?% k( {
  594.         mov     ah,1
    9 ^) M: I( \: Y% Y; W
  595.         jmp     kbd_wrt_exit9 h/ A+ ^( H/ g, i4 q1 M
  596. " ]' }( i/ ]! E( ?' e- _+ A# |  x
  597. kbd_wrt_ok3:
    2 I8 V5 a0 Q" Y3 a6 ]1 A
  598.         mov     ah,8
    7 y$ O6 t$ r' w. v2 h9 }
  599. kbd_wrt_loop4:
    4 n# ?, l# n/ b' f; b2 u
  600.         xor     cx,cx
    ' N. z5 N# n5 o" _! a( ^+ Z
  601. kbd_wrt_loop5:9 L) U$ l; R9 J6 ~( W
  602.         in      al,64h( m  O4 o. K7 P' _/ m
  603.         jmp     $+2
    % d3 o( m+ @/ {( y
  604.         jmp     $+2
    , q5 Q9 w5 h+ R
  605.         test    al,17 Q( ~0 X- D& I8 Q# V) J( ~# S" g
  606.         jnz     kbd_wrt_ok4
    0 C1 X7 p$ t" A

  607. + q8 Q& r8 G/ b4 X8 k
  608.         loop    kbd_wrt_loop5
    8 s6 K: s$ o7 e* m9 k; g! M
  609. 8 h3 B6 o" t9 t8 {' V7 ^9 G
  610.         dec     ah
    7 P* \" C& S' ^( [8 }3 ^4 j# q
  611.         jnz     kbd_wrt_loop4
    * {! L6 \- Z$ T# M# {* f8 x
  612. 6 M1 c; }( V3 v
  613. kbd_wrt_ok4:, Y9 D0 m; n1 I4 [. H) T
  614.         xor     ah,ah5 R2 J% q1 s$ Q! A
  615. kbd_wrt_exit:+ k9 B4 e4 ^' a; X% k+ w1 M
  616.         pop     dx
    " I; u7 w4 U  a1 j) ^
  617.         pop     cx
    $ y$ x' f6 R$ B3 I) X
  618.         ret
    , B) [- t) X" I4 n, ^) Z
  619.         
    # G1 J# o# B5 y: S' z4 ~2 ?) s
  620. keyboard_cmd:
    1 u- e: @; I% }0 q
  621.         xor     cx,cx
      i4 R$ R0 \7 X9 i: \
  622. cmd_wait:5 j, d$ j1 k' O* Y
  623.         in      al,64h: n; g2 `8 ], P( [* q
  624.         jmp     $+2
    2 {& Z- T6 Z! @: a' J) p
  625.         jmp     $+26 ~& D: V! ]/ v/ l. Z9 R
  626.         test    al,2
    - f) H% q; e  g; F7 D7 y6 F2 @
  627.         jz      cmd_send+ m, |* w9 u. t7 `6 x  B
  628.         loop    cmd_wait
    : R1 u4 H5 l! U( k
  629. ) U* U% [" ?, Z; [) h  \- p
  630.         jmp     cmd_error( e+ R9 l/ i8 T4 X7 O+ ^

  631. $ h$ x7 E7 }/ y: i! `: v, H
  632. cmd_send:; U2 |  ~* A& H. c) x; L! |- R
  633.         mov     al,bl
    # l* k1 s' f" I  Q" ^
  634.         out     64h,al. v8 G3 z! G) u1 n9 f) T
  635.         jmp     $+2
    0 B8 B4 x; N1 b5 `" D
  636.         jmp     $+2
    " @+ s8 w' @4 S6 e6 }: i; W& i
  637.   V: D5 f) ^, d$ u) |4 ]) T! c
  638.         xor     cx,cx( C; ?+ Z# g2 ]0 T
  639. cmd_accept:
    6 d1 {' r% s/ c( _) Y& Q8 w
  640.         in      al,64h
    8 l9 R  b4 O4 G' q( `
  641.         jmp     $+2! L' }, k! O" T6 |" q3 c
  642.         jmp     $+2" y3 [% a. z9 M  e
  643.         test    al,2* J8 B( |5 a" ]$ p  D
  644.         jz      cmd_ok
    + Q0 G4 D' T! H) {$ M
  645.         loop    cmd_accept
    1 |+ z' F  v" T  }. z1 [' A
  646. % {2 t- [5 O3 ^- U' S* |" R
  647. cmd_error:; S' O; Y/ G) j+ p( r
  648.         mov     ah,1
    ' N# e& P! s, N4 S
  649.         jmp     cmd_exit6 H6 M$ h' _' X* J% [+ ^; T
  650. cmd_ok:( r4 a; m6 y- B; N( x& Z
  651.         xor     ah,ah) u9 N9 M" x: t- Y8 l3 v
  652. cmd_exit:6 Q4 r7 j$ @1 ]7 Z
  653.         ret
    # W; w' p" ~. f
  654. ( ]4 v2 I4 f& W+ S! B( g8 Y  t
  655. new_33:
    2 Y# y% C* _7 l. s0 H; Y, A
  656.         cli/ n$ E0 k: Q1 S/ h1 T/ _- I% C
  657.         cmp     al,0. ?' N) T* G& D7 @# m- K- {0 q+ Z
  658.         je      reset_mouse
    $ j" v* ~8 k# ~% G1 r# Z, ?1 n
  659.         cmp     al,1
    : j/ N8 i  Q/ m1 `: y) [# O
  660.         je      show_mouse" [2 d, L9 C; v; D! E# D9 m! a
  661.         cmp     al,2
    % \. @2 p$ m: L' }7 q
  662.         je      hide_mouse
    : K9 o9 `4 D$ {4 ?' C6 N/ j9 D
  663.         cmp     al,3
    4 X! l1 s/ S$ r5 |
  664.         je      get_pos% S8 d* v( }2 p/ S
  665.         cmp     al,4+ ^) Y, [' \* D5 F0 X
  666.         je      set_pos, L3 A' V2 k; \1 z
  667.         cmp     al,70 P/ W+ O0 _% k- I
  668.         je      set_hor_pos6 M9 l- y: J  N- z" P0 @
  669.         cmp     al,8
      l  |" x% U. b" f1 [4 b& K( E% J
  670.         je      set_ver_pos
    ( m- d# H( n, h% w9 B6 k
  671.         cmp     al,0bh
    / W: X5 D; g) J1 t$ }- H
  672.         je      get_mouse_movement
    5 M" ^9 H! S: {2 W9 B% r
  673.         cmp     al,0ch
    2 a9 i7 s% i" j
  674.         je      set_subroutines2 G; r* i4 R, i$ R4 y
  675.         cmp     al,14h5 b, c' U/ q" E$ U7 c
  676.         je      swap_subroutines' l/ o' H( S, j- x0 ~$ m( s
  677.         iret4 Q$ Z# Q$ O3 N: a( p
  678. 8 \* a/ w2 R% y9 _( a
  679. reset_mouse:& ^; k: h+ A/ N1 R" b7 T* X* S
  680.         jmp     _reset_mouse
    # j% z& m0 g! K
  681. show_mouse:  e0 ]2 a. b9 X
  682.         jmp     _show_mouse! X' H( n) a* b' i7 M" W. F
  683. hide_mouse:
      R9 c: ^0 @; E  ?
  684.         jmp     _hide_mouse. f& B* r/ _9 w5 M
  685. get_pos:" i# e* G  G* d8 }4 r, Z. L# ]
  686.         jmp     _get_pos
    % U5 p/ D4 f6 E4 Z7 ?& |
  687. set_pos:
    ' R3 d( `, v7 \5 x: I" C
  688.         jmp     _set_pos/ ]% Q$ e2 i- Q  v
  689. set_hor_pos:% A4 D! @# b" S. ~
  690.         jmp     _set_hor_pos
    0 U* r; ?% i4 l# f" a
  691. set_ver_pos:# J3 r% h. _% f3 O0 Q
  692.         jmp     _set_ver_pos
    3 J! y* E1 r: i8 r
  693. get_mouse_movement:
    - j8 b5 @0 D8 m3 B& \/ Y' M
  694.         jmp     _get_mouse_movement
    7 {5 @6 P2 o9 J" n) z
  695. set_subroutines:
    . j6 c. K9 q% _4 }4 y
  696.         jmp     _set_subroutines
    ) D9 u& F  E! ~" @
  697. swap_subroutines:# u8 u( S9 R3 b* C3 C5 G* u
  698.         jmp     _swap_subroutines
    1 f6 L; m/ N& o9 U9 C

  699. ) a* e# ]; t4 T. [$ N
  700. _reset_mouse:
    ! S: `: \1 Q" V0 g+ B% q
  701.         mov     byte ptr cs:[buttons],0
    / h) ^4 {$ Y! c
  702.         mov     word ptr cs:[pos_x],0
    ; _3 F7 M' ~% W( {0 c/ O
  703.         mov     word ptr cs:[pos_y],0
    , u8 f* I# J3 Q- Q2 \, q" w
  704.         mov     word ptr cs:[x_move],0- S! E+ Y* Z5 m3 A9 ^
  705.         mov     word ptr cs:[y_move],0' N7 e7 J" B7 L
  706.         mov     word ptr cs:[x_max],639
    # C5 @0 w( ]5 p' G$ O7 }7 ]9 S9 j
  707.         mov     word ptr cs:[x_min],0/ ^$ d6 m. {' k6 ]$ g; l
  708.         mov     word ptr cs:[y_max],1999 }, {* Y9 j) _! x+ J5 g
  709.         mov     word ptr cs:[y_min],0# P) \. F% |: P$ }8 m0 D, q
  710.         mov     word ptr cs:[user_mask],0
    , `. l, N( A! T* K+ |& B  B
  711.         mov     word ptr cs:[user_subroutine],0
    " g5 A( j" F9 K: ~4 ?
  712.         mov     word ptr cs:[user_subroutine+2],0$ _; g; Q5 [+ }5 w. @, }
  713.         mov     ax,0ffffh" C- N( u5 g% _: D0 I; M* p
  714.         mov     bx,3
    7 p. q* V5 Q* J+ Y- `
  715.         iret; L& H! D( I  C; H$ m% n5 X. ]/ c

  716. 4 `) s3 i# l. h' ?! r  O
  717. _get_pos:+ S4 F3 @+ G4 g* B+ L7 y
  718.         mov     cx,cs:[pos_x]0 _5 Z$ n5 }9 u2 e- M
  719.         mov     dx,cs:[pos_y]
    9 z+ F/ B$ @! I- ~2 T
  720.         mov     bx,word ptr cs:[buttons]4 o5 \* d) M5 m1 d) Q: P
  721.         xor     bh,bh
    9 u+ O# Q" J. y' F1 n
  722.         iret9 g- U7 X  S5 \$ t
  723. . H! t5 B& x5 Q% s' ~2 q2 h
  724. _get_mouse_movement:7 b  z% S" V: L( g% o. c7 `8 t2 D1 _
  725.         mov     cx,cs:[x_move], u! A+ {2 A  R$ J% |9 F
  726.         mov     dx,cs:[y_move]- ?. ?/ w) v: b' \! T
  727.         mov     word ptr cs:[x_move],0
    : H  B/ Y4 P7 W5 P$ s2 {4 v
  728.         mov     word ptr cs:[y_move],0
    - l+ u. k7 F) v7 D, \
  729.         iret
    % ?3 X+ Z0 A) R9 ~" M4 y

  730. 0 }/ o8 J2 V8 o3 a6 k
  731. _show_mouse:, n/ w, R1 r4 l4 C; j$ ]
  732.         push    ax
    ) q; x" _) n1 Y+ l7 b
  733.         push    bx' c/ `& w/ j: U
  734.         push    di
      Z7 O( M, r& J* Z/ z. D
  735.         push    es# U6 Y+ D1 u% B# K( s0 E5 B2 q
  736.         mov     byte ptr cs:[sm_flag],1+ O! f1 S/ {' G$ W, ?1 c
  737.         mov     ax,cs:[pos_y]
    ( f- g8 X8 d3 a" M0 i: N
  738.         shr     ax,3& g# y4 O- \# W9 e$ }$ p% I2 E
  739.         mov     bl,80- |. l  {3 B" Z, Q9 x
  740.         mul     bl% U0 u/ k0 q1 H3 K
  741.         mov     bx,[pos_x]
    6 O9 F3 P3 `+ C& P9 b) n8 J
  742.         shr     bx,3
    ) Q& Z* B$ L- i3 o5 ~; w1 ?) w
  743.         add     ax,bx0 w4 B' d, X% X2 L9 f
  744.         shl     ax,11 b7 L" F. ~9 Q7 U, H' J# V
  745.         mov     di,ax% [4 r& n3 J" b
  746.         mov     ax,0b800h8 r; |% n& \. y5 W% o( u) Q! e5 ?
  747.         mov     es,ax
    ' M- |* d3 @7 m6 J+ E7 D& G
  748.         mov     ax,es:[di]
    - \) l6 p4 i% K2 x4 o
  749.         mov     cs:[save_char],ax% @4 w. h! B5 L' f
  750.         not     ah# m# W4 }# A0 X: `; j/ m/ L
  751.         and     ah,7fh
    : C& |6 @6 f* E' R: l# \
  752.         mov     es:[di],ax( {* C- ]" ^8 \  d, h; }$ b+ n
  753.         pop     es
    % M* ?+ ]- K9 `1 b0 A
  754.         pop     di
    6 a4 E3 d: _4 O" E3 J/ l. h
  755.         pop     bx
    & u) l" W. I/ t) X: u! R
  756.         pop     ax
    / d6 o# u  ~+ o  C% z1 L
  757.         iret
    - r$ e- T- z) J$ A9 |8 Y+ t
  758. * Q6 S/ b/ J; ~4 ?5 y9 {
  759. _hide_mouse:
    : ]: f# A9 F6 r/ i0 {
  760.         push    ax
    4 `) I6 g; B1 z% E" |- j5 S
  761.         push    bx1 A8 Y( e0 W; I! l  T
  762.         push    di3 j* ]' r) |0 C, |% v, l$ r& f5 v% L
  763.         push    es
    % t1 _$ G2 y7 q, C( o
  764.         mov     byte ptr cs:[sm_flag],0* z& v* h1 v" b, I
  765.         mov     ax,cs:[pos_y]
    ' P4 G4 K" j* b5 u% Z$ @
  766.         shr     ax,3
      C. m) p( r& k" U! o
  767.         mov     bl,80
    6 c  k8 X, ?: Q9 B  d% |( ^" M
  768.         mul     bl
    ! u3 T2 m" d. E8 I7 c7 p$ v
  769.         mov     bx,[pos_x]
    6 z" d- Y% Q# Z- H5 q& h8 R2 s2 a
  770.         shr     bx,3
    : _$ y/ h& J; V* J
  771.         add     ax,bx5 S4 k" b& [) _  K% L) U- y, }; g  U
  772.         shl     ax,1
    # n3 r0 u% G; T; _8 Y5 ]4 E( c
  773.         mov     di,ax) y/ s7 C4 a) V3 r. [
  774.         mov     ax,0b800h
    $ B+ M  F7 k: {
  775.         mov     es,ax
    ; d6 i6 S7 Q" I" X, k+ E' z5 I2 s
  776.         mov     ax,cs:[save_char]
    " c9 D: c& P  i
  777.         mov     es:[di],ax3 m$ b2 E  Z! G$ i; h
  778.         pop     es
    ' M& {3 `2 W: @# e
  779.         pop     di$ e( S: x. _8 n+ X
  780.         pop     bx
    $ o: v" z$ |+ N$ }0 s8 ~& Y
  781.         pop     ax
    1 D" t8 m' s! E$ Q
  782.         iret3 K: `" @. l; P2 T; y6 F

  783. 5 g$ s1 S/ O- ]! O1 D2 t
  784. _set_pos:& E3 a% v9 J& T: U# v5 l6 x7 u
  785.         mov     cx,cs:[pos_x]
    : S2 d2 S: @- e8 h
  786.         mov     dx,cs:[pos_y]
    ( D- ^0 ], C7 ]: f. u5 M% o
  787.         mov     word ptr cs:[x_move],0
    ; B+ m: z1 [; F% [: @
  788.         mov     word ptr cs:[y_move],04 Q$ D1 ^0 ^2 J$ Q4 O
  789.         iret
    : i0 V. D- U* \) G7 Q; k+ t

  790. + b+ J& L1 y6 y
  791. _set_hor_pos:
    * J+ L' [- k/ @. A4 g
  792.         call    max_min6 _0 f& R# [6 s  p3 e$ i
  793.         mov     cs:[x_min],cx) U3 Y0 @" @% g9 Y3 L7 P" k
  794.         mov     cs:[x_max],dx# h2 G2 j  S0 M! K  B
  795.         cmp     cs:[pos_x],cx
    & U: m+ _, t! K# {8 x
  796.         jge     good_hor_min" t& Y1 [. J6 L+ S: Z
  797.         mov     cs:[pos_x],cx
    5 E1 q+ Y! B( [! b4 g
  798. good_hor_min:
    / D1 t' ?1 i- i4 k
  799.         cmp     cs:[pos_x],dx
    + T; ~9 x) J9 r& L
  800.         jle     good_hor_max
    ! x6 x/ c3 C5 j* u$ }4 }# F; d
  801.         mov     cs:[pos_x],dx6 U& m8 p! X" b. y+ w
  802. good_hor_max:' D3 X2 K" e/ p  G0 L
  803.        iret7 z1 b) d% f  ]% f
  804. ' C, Z! s7 V: I* C$ X! g+ x
  805. _set_ver_pos:' y5 K& t/ L  a. b
  806.         call    max_min
      G  s) d4 z6 }; a( @& O1 N: O: c
  807.         mov     cs:[y_min],cx
    % n; `# v' P" k5 Z& t( P! {5 H0 f
  808.         mov     cs:[y_max],dx
    % f3 |5 O) q1 }! u7 v6 N
  809.         cmp     cs:[pos_y],cx" h6 j& j2 }9 v+ f- W/ N
  810.         jge     good_ver_min
    7 @; C6 @- K* b5 I2 S5 e) M% `2 o
  811.         mov     cs:[pos_y],cx/ w3 @& H9 |' _8 Q
  812. good_ver_min:
    ' w& @) L  ]% \8 g
  813.         cmp     cs:[pos_y],dx
    / L! G  ^1 O9 M+ `3 O$ f9 }+ M9 v
  814.         jle     good_ver_max
    4 e1 M, w) y" {
  815.         mov     cs:[pos_y],dx
    6 A" K" N, Z5 c3 @! m% h5 U
  816. good_ver_max:0 X, W+ h+ z/ Z( _
  817.         iret
    # R0 J7 r0 D! B, G& i% u
  818. 8 E$ |+ T# [9 _3 g7 n3 Q9 t
  819. max_min:- s$ q/ X1 Q$ E, }( Z8 x8 J- ~4 n
  820.         cmp     cx,dx
    3 R. b* g, i) ]5 l) K5 w$ p# U4 h
  821.         jle     no_swap5 e. q0 A% q2 O
  822.         xchg    cx,dx  o  m2 C- @! F% b) F( B- ?( ^
  823. no_swap:
    6 O6 A3 V2 L4 g# c8 V( W
  824.         ret
    ! Z/ H4 V7 c$ N2 D3 H" }

  825. 0 }5 b1 R5 `. @# T, B# h) _2 a
  826. _set_subroutines:: V6 {* M! C6 T- J/ r+ G7 K
  827.         mov     cs:[user_subroutine],dx
    9 ?3 _. ]" z% ^3 S: C; i* B
  828.         mov     cs:[user_subroutine+2],es4 U9 @7 o6 L: u; E
  829.         mov     cs:[user_mask],cx8 N5 v1 ~! q0 k8 Q; b' v6 ^
  830.         iret
    2 N" w2 g; @2 D9 t1 R- a) @7 @7 U
  831. 6 D5 t. M4 W9 v5 b
  832. _swap_subroutines:! @0 I8 k8 T" k0 U7 d& Q' H" v
  833.         push    word ptr cs:[user_mask]
    : C8 n. h! N' D  H
  834.         push    word ptr cs:[user_subroutine+2]
    8 z* U/ e# d/ F# Q% T* |
  835.         push    word ptr cs:[user_subroutine]5 R# d" j" R7 z  e) _) B1 y+ W
  836.         mov     cs:[user_subroutine],dx
    & A! O3 B: c! V$ C
  837.         mov     cs:[user_subroutine+2],es; }$ Q* r% \4 g. M! @+ s
  838.         mov     cs:[user_mask],cx0 ^* x& ~- ?: `1 z8 ~0 }
  839.         pop     dx
    % l- U) e* G+ R8 R1 e7 X
  840.         pop     es1 R  [- C, E4 f! @9 z$ I: Q
  841.         pop     cx
    9 s! @8 \4 I; w4 C
  842.         iret
    2 D. ]1 P" ~' E/ ?$ J1 T5 j2 |
  843.   s8 ?: D6 j' U% D: f0 e7 g
  844. memmouse        endp0 w$ C4 c: @, G' Q  m" A* q
  845. 5 y, d8 y+ p- a$ o4 b
  846. endof_start:! u" _  Z3 \" o( _# H% m: n

  847. ; n3 d9 @5 |$ D' s- \
  848. emsg db 'No mouse driver install error!$'$ ^( \& ~/ O+ `  ?7 J9 `4 I
  849. old331 dw 0
    % H2 j/ N* _# ~; m7 l% {) [
  850. old332 dw 03 G: _, l0 S/ a  T6 ~+ t
  851. old741 dw 0
    . X6 E/ n* M( L/ f' K0 {
  852. old742 dw 01 N4 N- l8 m. [; B$ C
  853. memcopy db 0* W# E+ |* U0 [+ g4 ~: l# @) `
  854. okcheck db 07 c' \8 _, I- U
  855. pass db 0
    & A- L9 J& F8 |/ A+ C9 _, W
  856. chkl db 0
    0 z3 p5 K% O2 B
  857. lk db 0
    ! B7 m2 b, }' V. k1 V1 R
  858. chkr db 0& i* g& `; d1 E! Z" L1 ?9 d1 C: _
  859. rk db 0
    ! Z: X' L  y8 e3 Q8 H& _8 |: u
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    $ f% c; `* |( ~3 ~" l( {
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '1 H  k5 D  I5 U0 E
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '% C, h7 ]! [  E1 A9 `; @' [6 L2 ~# `
  863. db '                                                                                '
    9 P& B+ [) ?0 }7 I9 O
  864. db '                                赏屯屯簧屯屯突                                  '
    4 ]6 q& `7 m& o0 t& L0 m" r
  865.         db      '                                ?OFF汉OFF?                                 '3 J; c  d# W- h# c( }9 a
  866. db      '                                韧屯屯既屯屯图                                  '/ Z+ p- `: w3 X$ E6 _
  867. db '                                                                                '
    ; [  X9 c" R- |& ^
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ': g) F8 n6 p7 W& a8 O# Q$ }! l* J
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ; B0 C) _0 Z3 h+ h6 E! b
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '* u  f8 y2 [$ d  M# v2 A0 o' t
  871. ( e7 Y! b+ t  A( F( H
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
5 ?1 J8 a3 @; F  n6 Q哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
/ j8 t+ ]( c+ g
! @$ X: X7 l1 A8 A谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:06 , Processed in 0.047033 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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