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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
/ m7 S. l6 H+ N5 [( J( G" R- r* b6 g( f
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
      V0 g' r9 d9 \
  2. ;          Ufoit PS2 Mouse test program   Ver 0.91 M: X, E& C' p7 Z1 c6 E" t; u6 d
  3. ;                                         By Bini.Yi 易祝兵
    ) e( @- c7 l4 @2 p
  4. ;                                         http://www.ufoit.com 计匠网5 ?$ j3 G, {+ d+ F
  5. ;                                         2002/04/06 YYYY/MM/DD
    $ k# K/ Q1 R6 ?5 u+ c  Z" T  `
  6. ;9 Z6 r3 H$ i% `/ g
  7. ;         
    + V' F# B# i  T' Q7 K
  8. ;          This program  test the mouse button  click and move.
    : \, M" f2 p. A; ?7 J
  9. ;
    : a# E5 h1 b( `
  10. ) Y0 v2 j( w6 b& |5 A
  11. .model tiny4 f( j  U2 p$ z/ ^! V
  12. .5864 ~' H0 q8 S' W: p; T* }
  13. .code4 k$ V$ D9 x: I
  14. .stack  100h3 ?# G. w+ q# _0 u- n6 a. X
  15. .startup
    6 X4 W$ j3 B( R+ H! S5 y9 T
  16. pusha
    # ?7 g( z& O# {
  17. mov ax, 3533h
    9 }2 F/ G$ e# D; G
  18. int 21h
    + J* Y' A) B8 y6 Z. j
  19. mov word ptr cs:[old331],es
    : U. A/ X1 i/ r/ H' I
  20. mov word ptr cs:[old332],bx
    7 e) A4 I/ U% f3 W! r( u
  21. mov ax, 3574h
    / }- f5 r6 k5 ^, P' H% R( D
  22. int 21h
    - ?' H* T# |2 s+ W
  23. mov word ptr cs:[old741],es
    2 l) ?/ w$ Q9 B6 p1 v
  24. mov word ptr cs:[old742],bx
    % {, W' t- a0 U6 f3 k  O
  25. popa
    , o" K1 p8 e8 ]/ _
  26.         call    memmouse
      t/ C; S$ W* V; y$ f
  27.         mov ah, 00
    " _! n- X  K+ U; k$ W! _& Q" z
  28. mov al, 03% Z! `, B& ^+ Y  h: D4 ~' b% i
  29. int 10h
    # `' `& E8 k! j' L3 r
  30. mov ah, 063 v; d: c  Q& M; ~  `1 }1 E* b
  31. mov al, 0; G% P" _  u1 E8 I
  32. mov cx, 0- Q" h5 R! F( A9 m6 h1 [( X
  33. mov dh, 24. ^: y5 G3 X3 h. O. n% ?8 t
  34. mov dl, 795 m6 h; l+ b( k+ v. N
  35. mov bh, 07h
    7 o5 t& ?4 V! Q, V3 ?
  36. int 10h
    % x5 C2 c8 N1 X% o
  37. mov ax, 0000) v9 Z3 r# r9 x. \* Z" j- c1 }
  38. mov bx, 0002
    # R, g, C3 I% I
  39. int 33h
    6 ^% h7 o5 r5 A4 z% A. e
  40.         cmp     ax, 0000           ;if no mouse drive install" p. ~0 b7 Y, J+ v- T* y
  41.         je      errormsg           ;show error MSG
    9 _' \9 ~4 S4 ]
  42. mov ah, 02* Q# e6 O1 ~( y: X( P. L; Y/ P
  43. mov bh, 00
    4 E6 S: c/ g' D% m
  44.         mov     dh, 25             ;Move point out screen# O$ m1 R# ^! K3 R4 A1 P9 L. H
  45. mov dl, 79
    3 W; r! v- x1 G. m# S* I, W
  46. int 10h
    ! s2 c1 ?( c* w! ]$ _$ a/ G, \
  47.         call    showmsg            ;Show info: b1 V; g# s6 z% _4 E% {  `$ p
  48. mov ax, 0001. `) j3 L! u1 a/ o: u8 t5 X
  49. int 33h# ^0 Z" s' [7 ~) P* h* W
  50. ; mov ax, 000ah
    ' o, L% H) N# I5 V$ Y& \
  51. ; mov bx, 00002 L& y- `+ n# J8 N$ m% w5 Q# e
  52. ; mov cl, 0h
    1 U6 {2 m* k1 S0 `" f- s
  53. ; mov ch, 0F0h
    ( _9 D  D8 [! a$ ]4 c0 J* K
  54. ; mov dl, 0h5 P" U+ g9 e* d8 P
  55. ; mov dh, 0F0h. W2 l# O$ d) N4 t8 {( ]4 {
  56. ; int 33h
    4 V9 h' w* a+ t& y4 S9 Y. h
  57. mov ax, 0004h1 }! g7 S1 l/ J' V/ i8 d" n' c
  58. mov cx, 0319
    1 ^9 k( C1 x: i) ~/ T
  59. mov dx, 01033 Q2 x1 ~' N! F! X1 P& T% u
  60. int 33h
    1 m& I) C; S2 f" g
  61. casemo:                           ;Case button click and point move : j. c' l) N" A+ Y
  62.         mov     ax, 000bh         ;and keyboard press0 _9 n3 w0 L& ]; d% I' e
  63. int 33h
    ) r1 I7 V" Z1 P
  64.         cmp     cx, 00h           ;if point move....X/ ]/ U% S$ k1 @+ p
  65. jne xmov7 l9 i& }* O( I; i: u0 `
  66.         cmp     dx, 00h           ;if point move....Y/ Q, R# z" e. c# t
  67. jne ymov4 F& a& a/ b8 w3 @3 j# p
  68. xymovend:                         ;X.Y move end
    $ Z2 c. Y' L8 s9 J# H- ]0 P
  69.         mov     ax, 0003         
    / r( T6 I7 I. t9 O
  70. int 33h
    7 c5 N4 q8 U: b: a/ r
  71.         cmp     bx, 0001          ;if left button click  show ON
    - z. X6 k; b9 \5 t
  72. mov si, 1828
    ) H/ w, B0 m1 o  J- H) N5 C
  73. je listl- N0 e) a# i$ ~$ s$ M% R! J
  74. mov si, 1828$ `6 X1 W# L9 H
  75.         jne     nlistl            ;if left no click show OFF
    5 P% A" \8 {% d3 ~" M
  76. testr:* g3 P4 U0 @" F9 ]5 [
  77.         cmp     bx, 0002          ;if right button click show ON: b9 D2 i; T4 n, B, X% G
  78. mov si,1842
    , K8 D5 b/ T6 n
  79. je listr
    . h4 g- j$ L5 D+ h+ I
  80.         mov     si,1842           ;if right no click show OFF% w/ ]0 V( p1 H# k7 Q% a( L( A. G
  81. jne nlistl1 i  Q; e) ~; V
  82. casekey:
    ; a9 M3 k- @; B- A
  83.         mov     ah, 01            ;if any key press jump check! e( [( ^. J! x4 k& o  R& a
  84. int 16h) V; e1 {7 l8 i* i
  85. jne kpress
    / B: O- s5 K/ @1 Z! U, o9 M2 x
  86.         mov     al, [chkl]        ;check x flag4 m6 ~5 o3 m5 t) q8 T0 [
  87. cmp al, 02h
    4 m. u  N- k, m  V
  88. jnb chkok" W# F! T" `8 c7 _  q2 s% \
  89. jmp casemo' r; \7 b3 ], v/ K0 C
  90. xmov:                             ;if X moved, get the X flag+1
    3 i7 D( U. P/ A( s% P! b
  91. mov al, [chkl]
    ! ?7 s2 K% A! T9 f) T. f0 @
  92. inc al4 ^6 D8 a' @5 G
  93. mov [chkl], al
    - V& _3 M* Z; V
  94. call passok
    $ W' [6 {9 p2 g# W* g6 C
  95. jmp xymovend
    # }/ G5 p9 O3 M; \6 K
  96. ymov:                             ;if Y moved, get the X flag+1
    $ ]) _# M% a  Z  g% B
  97. mov al, [chkr]: K6 A0 Q' m8 A0 q; V% [5 [, W
  98. inc al8 G4 R4 R& W, f! W' n. i/ d% g! q3 z
  99. mov [chkr], al1 N; d+ s* N, C3 i$ q- f& I+ g
  100. call passok7 H# ^+ K1 ?2 \4 y! @9 j8 Q
  101. jmp xymovend
    / l& E: k; `! _" p- S0 e
  102. ) a) n& o1 p( b* W* B
  103. passok proc near5 W% B! A" O& C% @" _. b* I
  104. mov al, [okcheck]) q) J5 D' B: I% j$ n" S, r& Z
  105. cmp al, 1# B$ ?6 Y9 Q& Z1 ]* J: P  e
  106. je let0
    + z3 z6 {" N- i2 f9 C, X! }3 w, g
  107. jmp passret
    0 \5 z. r) \5 l: w5 `+ S% U
  108. let0: ( d( l4 a2 G- V- A* r
  109. mov [pass], 1' c4 T) `8 @$ D7 P
  110. passret:
    % M+ s/ G' a/ u  P
  111. ret
    * Y2 y0 v% W$ H8 I3 P
  112. passok endp
    9 w' T$ S! W6 F# ^* f
  113. $ O( ?* ^6 i9 `: k/ l* e8 O
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS) ?* N! T1 {9 f- Y9 ^
  115. mov al, [chkr]0 w! d; B8 v; T- w( b
  116. cmp al, 02h; e" Q: }) m+ ^' n" N
  117. jb casemo
    ; g" ^7 D3 z& q; S  l
  118. mov al, [lk]  {2 _1 d2 D7 O' ]* z' q
  119. cmp al, 1
    , r2 H: D9 ^4 A  R" m
  120. jne casemo
    : Y3 S& B+ h6 }
  121. mov al, [rk]
    + P7 ?/ b& b0 }' k  ^
  122. cmp al, 1
      |1 w+ @  f! W5 T
  123. jne  casemo
    * X7 @- ~4 U9 ?  [  L( a' F! u& F
  124. mov [okcheck], 1/ e1 m4 c. N7 }% a4 J$ S
  125. mov al, [pass]# B. c8 F7 v5 `8 D6 s: T
  126. cmp al, 1
    9 W* \, ^4 z+ ~* z- ~% p8 e% o
  127. jne  casemo7 j7 }  h$ }- A+ Z3 F# b9 Q  {5 N6 t1 }
  128. mov ax,0002h$ J' d6 c! x4 _+ d' t' z  E
  129. int 33h. n" g( S! G' j/ D: {
  130. call cleascr
    * w% J2 O3 t: L" `

  131. . ~  b2 r8 h( d2 w
  132. call oldint
    ! f: F4 V9 K/ _' n( W
  133. mov ax, 04c00h
    0 k8 C; ?7 {4 ~1 ~
  134. int 21h& R. w' M* P7 Q6 x5 m

  135. ! b7 N6 V" j8 I
  136. okexit:
    1 e- S# W2 I% f7 t  L* o) S, K, n, Z
  137. mov ah, 4ch# |2 B+ |, m7 z3 n
  138. mov al, 0
    ) f2 t7 o7 Y9 Y, N
  139. int 21h. O7 ~9 T" }1 Z1 S& z
  140. listl:                                 ;Show ON
    - d' L# k/ ]# a, }, `. Z
  141. pusha
      n- W1 z' h; o4 ~2 [. H! S5 _# c
  142. mov ax, 0b800h. `; l" T9 K/ i! {1 _
  143. mov  es, ax! i8 E/ v! o! c. u
  144. mov ah, 47h
    : @3 x, N* r( s4 k. L/ a3 `3 t+ A
  145. mov al, 20h
    - s3 [2 s/ a" W9 a. v4 x
  146. mov es:[si], ax
    ( B$ D& o/ B7 S) x: F# F. K
  147. add si, 02
    , E: h5 Y& T' Z, e4 @+ Z* n+ a
  148. mov  al, 4fh
    2 k8 _8 i& Q" U  o8 A) a
  149. mov es:[si], ax& x) l& f& ?3 g; |5 u7 X) G
  150. mov al, 4eh# M+ h9 p3 q! ]4 W# a8 i
  151. add si, 02
    " b3 a% P* |! t* ^- r/ s
  152. mov es:[si], ax8 c3 @( n8 y0 p
  153. mov [lk], 1: I- F' n9 b# {! G  P7 @
  154. popa
    6 E, j5 f; e6 p( `+ I3 R5 p
  155. jmp testr$ L% _( k0 Z8 v, |  c$ N  F
  156. listr:                                 ;Show ON
    / a$ o$ Z) f6 P1 n3 y4 p/ I
  157. pusha. [9 _  H1 ~0 a* ~  q5 U; X1 I
  158. mov ax, 0b800h  N; R0 B4 Q: P  C; T& a* r
  159. mov  es, ax
    / Q6 X# d. B3 D" H2 c
  160. mov ah, 47h6 U. \/ G  N$ j2 K" B/ K
  161. mov al, 20h$ d; ^' q; m- ]. q5 z: n
  162. mov es:[si], ax, R" x1 r5 b9 `
  163. add si, 02
    1 @  j, q: A, I' [" S- s) K& @
  164. mov  al, 4fh
    6 @  T5 G. F7 x2 ?$ A  V
  165. mov es:[si], ax4 a' b9 B8 h! S2 k/ S
  166. mov al, 4eh' ~" f& n% s8 D9 O
  167. add si, 028 p! x! b# v5 k0 \( Z
  168. mov es:[si], ax
    # K: t5 _1 K% I9 ]3 Q+ t! b+ P
  169. mov [rk], 16 h; }6 X# P$ {) j& ~( J- E3 f" \
  170. popa
    . D# Y& K2 J) D) V# X. @# M( D
  171. jmp  casekey! Z6 R6 U' A  X' B( H

  172. $ N& G7 ]3 l8 g2 b  ^  ~
  173. nlistl:                              ;Show OFF8 y  b6 a+ n* G. F
  174. pusha   
    9 L5 m, v- _2 v# u: @6 F
  175. mov ax, 0b800h
    ) T9 x8 U; q( h9 r
  176. mov  es, ax; Q& i, u$ X# y0 o! y& @
  177. mov ah, 17h
    , D% n) U0 T6 G) q* U" y
  178. mov al, 4fh
    6 T0 z; [* i5 l4 e
  179. mov es:[si], ax2 X5 e- F, ~9 M/ W
  180. add si, 02# \5 k4 q+ A5 Q# s+ W# W# i; ], n2 q
  181. mov  al, 46h
    ! S' Z8 x1 w2 k) V( ^( X9 f
  182. mov es:[si], ax: L. Q: f' ?9 n7 F2 t
  183. mov al, 46h" }2 z: u  R' J: Q% }* C
  184. add si, 023 n6 T8 c/ D- v! _/ I4 _
  185. mov es:[si], ax) r. {; n1 G6 J+ c
  186. popa3 k8 F, P7 \0 h- h; j7 f# D, ~# V
  187. cmp si, 1840/ I1 w9 E$ O# Z' ]' [  w: M
  188. jae casekey" g, S6 z6 ^% z& H. I
  189. jmp testr+ X6 s2 h6 s  g

  190. : y( Z. L# E5 v- u5 G1 L
  191. kpress:                             ;Check key press if press<ESC> then EXIT# ]7 T! b5 m6 d0 g
  192.         cmp     ah, 01h             ;and return a error, @# `4 V9 t( E" {" x
  193. je exit1
    1 r! o; V" h# H1 M! D3 @/ W
  194.         mov     ah, 0ch             ;if press other key then clear7 s/ G5 N( ~! a5 }& \
  195.         mov     al, 00              ;keyboard buffer
    / {: D8 f7 r8 C" v3 C- R* r* M
  196. int 21h& d* ^% t) z9 _& i
  197. jmp casemo
    ! E7 ]- h! T$ ~# J

  198. ) W* y3 E" }7 G/ f0 e3 w: M
  199. errormsg:                           ;if mouse driver no install8 V* U7 l; \# j) G
  200. call oldint
    , l, H! Y- Y* H9 H
  201. lea dx, offset emsg
    : ?0 {$ o7 r" C) |" f
  202. mov ah, 09h0 f4 f* n: j, C  v; |
  203. int 21h
    9 }9 K4 r6 y9 n) k
  204. mov ah, 4ch
    & x7 c4 ~6 p' T
  205. mov al, 2
    $ \4 n% B) E; ]. N$ w6 q
  206. int  21h
    3 ^, [$ X& r  \' I! ]

  207. # N" |" y( Z! K$ S) v% }" @
  208. exit1:                              ;error exit
    % A: x! l) S8 R& {( J# O
  209. mov ax, 0002h
    : @- {/ |& w+ Y1 R3 q) f
  210. int 33h
    6 E8 P  V  _& F3 c+ ^( G
  211. call  cleascr
    / i/ g( W, W3 R+ q" E: R) E' b
  212. call  oldint5 e' ]! `6 Q( C/ N7 t; l
  213. mov ah, 4ch
    : Z( M# j7 D$ j4 a& {# C
  214. mov al, 018 w+ V5 V0 ^" O7 K. K9 F" A8 {
  215. int 21h
    2 K( \* Z, ~. a5 ?6 [, j

  216. 0 J  u' F9 B( f8 C0 }% X7 R% R2 }
  217. cleascr proc    near                ;clear screen8 {" y4 W1 d0 X; A. s$ g# P9 A# Q6 }
  218. pusha
    6 E6 [  ]2 S7 D. r; `; {
  219. mov ah, 065 g4 H! D1 R/ H, x; p. B
  220. mov al, 02 O' z- v3 u. ?+ r' T. u
  221. mov cx, 0: v% a+ c) l; p8 f% |4 S$ ]
  222. mov dh, 24- _; D0 H) N% |
  223. mov dl, 79
    & Z7 F/ x) P0 {% Q) N7 _
  224. mov bh, 07h
    3 p# d( b# m! M5 _7 r- ^$ k
  225. int 10h/ M4 j* R9 r6 `7 o$ P& U1 d
  226. mov ah, 02/ I: k7 s2 A$ S  X
  227. mov bh, 00  N% w9 A; s8 U  a9 ]; M& Q
  228. mov dh, 0
    3 R% u0 P  T; ]6 N6 @3 C8 O2 F9 Q8 L
  229. mov dl, 0
    5 S  P9 j: N; E8 O" p9 O
  230. int 10h( W7 c  v; E# b
  231. popa0 ~6 q( N1 L  q) L# {9 R
  232. ret
    " N- M: \3 d+ F& p1 u6 b: I
  233. cleascr endp/ i( W, I* e! ?0 k* `

  234. 7 G' p- X9 n: Y% H+ R( A
  235. showmsg proc    near               ;Show info0 T6 y8 Z+ y' ~& z. y
  236. pusha
    : T% E- f4 `9 r' H/ |& s4 n9 P* D( [
  237. lea di, offset showms
    3 ^$ I6 s$ N! W" J, c
  238. mov ax, 0b800h' h* h- c7 s5 E5 s" t
  239. mov es, ax* a+ m. n" \3 h2 n4 A* ^
  240. mov si, 0
    9 Z6 M6 h4 s8 W- w( h
  241. mov cx, 480+ x! w$ s! \( q& S
  242. mov ah, 07h& H1 T) j% b: \9 g* f4 H$ Y# u
  243. @@:1 R; w3 V4 D* d/ b
  244. mov al, 20h& X4 Y0 {' z. M
  245. mov es:[si], ax
    9 K4 I/ Q5 y' e& O# R9 n
  246. add si, 2
    ! @" P3 P- J+ [
  247. loop @b
    ' }6 m$ G5 a9 C" @0 u% W2 g+ y1 |
  248. mov cx,8807 y, P+ ?% C5 g0 R- P' m# ~
  249. @@:' c' k+ b; E7 T8 t/ d6 D
  250. mov al, [di]
    1 P, W- `1 @5 D: W1 O! p" i
  251. inc di
    5 e* ?/ O4 b1 o! f5 [
  252. cmp al,20h
    * q: H' n. M, x: }  X( _6 T8 l
  253. je showch1' I( c% R0 f! q, u8 t. |  G
  254. mov ah, 17h3 R/ S5 a/ F7 F( }6 y% d
  255. jmp showch3 3 W- d% T5 y" K; G! U. a. @8 Y) G( w9 w
  256. showch1:) p/ Y5 B$ y& w* R* }
  257. mov ah, 07h
    6 l0 j: {9 [4 {4 u& G; Q3 e! u
  258. showch3:7 p+ v8 P8 T+ A9 `
  259. mov es:[si], ax" z0 B5 _/ b( U' i
  260. add si, 2. D% }( @7 c. \' G
  261. loop @b7 |5 Q4 o1 K, Y2 R
  262. popa! u( ]5 M- \- M# d+ [% E4 P! T! l0 F
  263. ret8 l+ x! ]" U. z6 `5 y1 ]* T6 }
  264. showmsg endp
    ) z/ K7 X5 U( J4 U" Y
  265. 7 |. H6 u# G' u' X4 L
  266. oldint proc- P- B% K! T$ B4 V' [
  267. pusha7 q; K7 R' e7 f0 c3 b" r
  268. mov ds, word ptr cs:[old331]1 s" ~  h7 j4 ~% y
  269. mov   dx, word ptr cs:[old332]
    , g2 L& v0 A4 O8 e6 B5 \' P" L
  270. mov ax, 2533h
    ( @5 j/ {" P. s- x, _, y
  271. int 21h' \7 G0 S. R$ C
  272. mov ds, word ptr cs:[old741]2 o$ v. }, `" P' P$ h3 J
  273. mov dx, word ptr cs:[old742]) v+ {7 M5 d- R
  274. mov ax, 2574h
    ; [' x5 y" X% Z4 G
  275. int 21h4 Y$ x4 I! ~5 I% f( v$ \& O
  276. popa6 S1 \' V% |9 K2 z( w5 j1 ^. s9 B
  277. ret
    + }# C: m' b2 v: @' x& p, D
  278. oldint endp- X; q! r) P: o& N5 a: w
  279. * j: V1 J. \9 i  ?
  280. memmouse        proc
    6 q( l- f5 k; f/ S5 E* K
  281.         xor     ax,ax4 d# a: E. }6 A$ z& L9 v
  282. int 33h
    7 }3 d/ L. }! K
  283. cmp ax,0ffffh% `6 v6 x; o5 C7 M, E& k9 G
  284.         jne     not_loaded
    # l# g: h/ O# H) d  I5 L& v+ S
  285. mov [memcopy], 1& S, _' {' ]  B3 ~' a1 _
  286. ret
    % D( w: a2 c+ F# F/ p  X

  287. 5 ?- X( [- X9 h7 I/ M7 Q
  288. not_loaded:
    * o0 Q" f- Q* h0 H; W1 k& x
  289. % @0 u* p* ]& }% |% M+ @
  290.         mov ax,2574h) ^& f4 t/ j7 R& v0 Y
  291.         mov dx,offset new_isr* ^; k+ h6 }& R' d* q8 I! ?) k
  292.         int 21h
      ?  w) Y& x5 n: A5 ?1 a! I/ _

  293. ) m5 R" [  J/ a& `9 j4 E
  294.         mov ax,2533h
      D, ~$ @- X( b- U
  295.         mov dx,offset new_33) u: _7 ~/ t- k% |- a3 y' P
  296.         int 21h
    # }+ U1 [  J3 m5 _& @$ B/ V( Q+ D

  297. 3 I: e+ j# P( n' f8 I" L
  298.         cli2 H$ [8 {! c6 H) ?* V3 w" Z

  299. * D1 k! P; c% n/ m( H' H+ D
  300.         mov bl,0a8h* j/ B0 K  D: C! Y, Q
  301.         call keyboard_cmd( V( ]& K  o# n8 H4 b
  302. 2 O* z" R7 M/ I
  303.         mov bl,20h0 c* p8 _8 A7 a3 O. r" c8 \
  304.         call    keyboard_cmd5 U# z  @5 I0 s, e
  305.         call    keyboard_read4 `1 B/ j/ z9 U/ o, f: P* g$ M; [1 o
  306.         or      al,22 X4 m8 n$ s# B
  307.         mov     bl,60h
    , s2 O8 f, d6 ^
  308.         push    ax- L8 P; X+ R  n7 I7 z9 u
  309.         call    keyboard_cmd
    : @) \2 H! H8 J& r! J+ ?
  310.         pop     ax% J/ k; o+ A' U& K
  311.         call    keyboard_write
    ' H5 z0 D) L# P# ?
  312. 3 u/ p: l* p, @  s: j
  313.         mov     bl,0d4h
    # k- Z$ T) C* N7 |, y& T1 C. ^
  314.         call    keyboard_cmd  @1 E  n, v# q. t4 x9 S" E" \
  315.         mov     al,0f4h
    - ]1 j' k4 p8 D# d
  316.         call    keyboard_write7 D; c2 S/ j# T% v* A3 T& k

  317. " Z  a, ]* ~) z  O) U  V$ @+ t
  318.         sti
    1 V; ?, @' S* j0 R4 \$ o
  319.         ret/ |9 j0 Q" h* m) M
  320. call_user_isr:
    , n) W3 v, ], }( B
  321. db      60h* G$ v- [% H: G+ }5 [  r5 ~
  322.         mov     cx,cs:[pos_x]* k4 f+ J( q$ o1 v/ z" U8 l' k
  323.         mov     dx,cs:[pos_y]
    " v8 k4 e! [" }0 S
  324.         mov     di,0 ;cs:[x_move]
    , k; E$ G4 P# \) W/ }
  325.         mov     si,0 ;cs:[y_move]* u4 F' _& w/ _1 @" G
  326.         mov     word ptr cs:[x_move],0/ H1 x/ z; m, c+ ^8 c6 G
  327.         mov     word ptr cs:[y_move],0* U& X- ~& S& |, X/ Q. q/ h. a/ z
  328.         mov     bl,byte ptr cs:[buttons], b& i  C9 R. q* i
  329.         xor     bh,bh
    5 m4 s' ^7 U! ^9 N) u7 e
  330.         call    dword ptr cs:[user_subroutine]
    * M6 }' e; r( ^/ n2 m/ b& D
  331.         db      61h
    / {- R6 h' y# Y; t- Q" F
  332. ret+ ?% [+ M" b/ k
  333. new_isr:
    ' R* S2 X1 d  |  E5 s
  334.         pushf8 x1 r& v" N1 k
  335.         cli
    . A! Z. b. j. ?6 r9 c1 ^; c
  336.         push    ax  a- Z/ A" M7 G' Q- \
  337.         push    bx9 b# Q7 m- I2 C6 z+ @% x
  338.         push    cx5 ?4 l7 V$ T: u+ O
  339.         push    dx
      y) ~: n$ J- D8 D; h3 Z* l
  340.         push    di
    / i* k! s4 i) [+ g. U( l
  341.         push    si& `; n; p; o3 o1 ?+ Y" f9 D) v
  342.         push    es
    3 u  _2 V9 t6 n" e9 W5 Q4 A% F
  343.         push    ds
    , t5 s5 |9 h4 O4 r# @
  344. 4 O. c& O2 I4 j6 Q
  345.         push    cs8 a6 `& z# ?# v# G; b
  346.         pop     ds" x; O6 _9 ]% w

  347. ) i( r0 V( i/ V+ _  b
  348.         mov     bl,0adh* R& S) c2 z5 x2 |5 j% @6 m
  349.         call    keyboard_cmd; J+ N. f9 O; C

  350. ! g  ]. M8 h9 @0 ?( G7 ]: b
  351.         cmp     byte ptr [first_time],0
      P4 R4 V3 J- G# {, i
  352.         je      not_first_time, d. |+ p: U0 d8 F1 b6 Z
  353. ; w; O7 N& R6 n" `5 c2 I$ T, g& Q8 E
  354.         mov     byte ptr [first_time],01 I( A: V, T: A$ C6 ^
  355.         call    keyboard_read3 G6 p0 B6 j4 r1 H* m% |& }! Q
  356.         call    keyboard_read
    , a; Y" b+ U( _4 `* J" ~. l
  357.         call    keyboard_read
    0 H" Q4 g2 o! H! B0 h% t
  358.         jmp     no_show/ D* {0 Y) l% M! o; D$ f# D) V( [

  359. ; [& D1 V2 ?0 g
  360. not_first_time:3 J& `% j# x  v7 X* P
  361.         mov     word ptr [temp_mask],0
    8 G: W* \- h6 Z* u: }4 I# R% @

  362. 9 l7 x# ^# b1 H- i
  363.         mov     cx,[pos_x]; f1 o6 {5 ]3 A& W/ B
  364.         mov     dx,[pos_y]5 v- G- M) E3 ~5 M8 m  H: v

  365. 4 U- C- `& V9 Q" r
  366.         call    keyboard_read
    ; b9 c1 Y$ K6 d8 v- \6 a" ]
  367.         and     al,7 ;3
    % M: R- R$ Z7 K
  368.         mov     ah,[buttons]
    7 R7 G9 C2 O" N, r& @
  369.         mov     [buttons],al7 d- v" ~( @0 `& m
  370.         cmp     al,ah) @/ n  D0 I- R3 _5 {8 {
  371.         je      no_button_change
      s0 l$ x3 b( `
  372.         and     al,3* n, A$ c" m) Z. k
  373.         and     ah,3$ f" U6 d6 i5 C5 M
  374.         xor     al,ah1 {- G  d+ e" x, d5 E. h: R0 l1 |5 A3 G
  375.         xor     bx,bx
    . T& T! u8 z% i! S) n/ U, C* W/ Y

  376. ) X- }, H9 O! v5 x9 x( f
  377.         push    ax
    $ J0 z! q5 P9 I  r9 f. X4 `+ ^
  378.         test    al,2
    + o1 B/ r2 |7 K2 |& j7 r& b
  379.         jz      no_right_button_change9 \" i. T% ]& [/ b* U
  380.         and     ah,2
    , b+ |! [4 V9 B
  381.         jz      right_button_pressed1 z, A9 b' s2 C) i, N, k; J/ V3 E
  382.         or      bx,16$ d8 |' A, i0 l- c2 ~  }) x) n# m
  383.         jmp     no_right_button_change
    / z4 w/ q' |/ ~  @7 r
  384. right_button_pressed:
    6 d, _" L7 o) X/ D
  385.         or      bx,8
    4 s) W  U& |6 w: V: t. ?  c
  386. no_right_button_change:/ E) T; L0 O& z/ @
  387. & G* J2 y" U$ G
  388.         pop     ax
    7 x# z7 G6 g8 d! [* v) q8 Q
  389. , l' M3 P  b2 p& ^! ~) |/ O
  390.         test    al,1
    1 x( \% M' M. o) U. |3 ]- H) e
  391.         jz      no_left_button_change
    / [6 Y. w4 ^% B' H$ N
  392.         and     ah,1
    + K. h/ @* r; w' z8 q$ S2 w
  393.         jz      left_button_pressed
    ( T9 ]2 _8 R6 s) i$ }- S
  394.         or      bx,4; y8 l, F8 J2 n1 F) R5 w9 H
  395.         jmp     no_left_button_change
    7 M; v4 ~5 W( }) |; X
  396. left_button_pressed:
    6 d- N( e; J: y
  397.         or      bx,2
    8 X5 ]' e: P4 e3 \
  398. no_left_button_change:; d( ^; L* D& Q0 _( j
  399. ) r& [3 b" R: u) T! J* [  E
  400.         mov     [temp_mask],bx
    0 }1 T% s. R/ k& \

  401. " z* ]: ]4 J4 J5 p
  402. no_button_change:
    9 F( Z8 }1 q$ \5 s
  403.         call    keyboard_read2 n- J6 _# n1 T+ n. w1 s* t) B
  404.         cbw, m: D* f) J0 s+ g) d
  405.         add     [pos_x],ax
    - ^; z% L6 ~& v- {
  406.         add     [x_move],ax
    6 |' |" h7 q; A
  407.         mov     ax,[x_min]
    $ B5 P6 \* e8 \" L
  408.         cmp     [pos_x],ax
    3 G$ w, p7 l/ Z$ x+ \6 c% _8 K
  409.         jg      good_hor1* c; J2 r: y: e' r! d: B1 a
  410.         mov     [pos_x],ax
    2 m4 m  P. p0 ^  q/ Q9 ^  F
  411. good_hor1:
    7 Q: w$ G+ V. U# j% x/ C' d, z) P7 t: u: P
  412.         mov     ax,[x_max]
    & ^" \& o( I/ W/ W
  413.         cmp     [pos_x],ax$ H; w- V; s. ~, n' ~+ h
  414.         jle     good_hor27 H3 P- B+ I- \2 j' ~# `  T
  415.         mov     [pos_x],ax; w  l5 c& T9 J# N2 ^9 K8 Z% O
  416. good_hor2:
    9 l/ g6 a( u1 H  N4 n9 c7 d
  417. # p; W% v" v+ J+ @
  418.         call    keyboard_read& h* Y" M) O9 o' a+ v0 I* B6 _
  419.         neg     al
    ( N3 `3 z" f- x' U& @# h/ S
  420.         cbw! |  N1 M' F% h6 A
  421.         add     [pos_y],ax* t% J5 N& Y' G5 A+ p4 s
  422.         add     [y_move],ax
    5 \8 N( n4 l: N6 Y7 ~  ?
  423.         mov     ax,[y_min]* [) A2 e8 N: @4 n; x
  424.         cmp     [pos_y],ax
    2 {# `$ h! E6 @/ x( j
  425.         jg      good_ver1* {; ?7 f) c8 A
  426.         mov     [pos_y],ax
    " z: [  `3 M7 c1 Y' }6 H& Q: M$ \% h
  427. good_ver1:  k7 @8 [+ R5 ]
  428.         mov     ax,[y_max]8 N; n5 a- `" l0 s
  429.         cmp     [pos_y],ax
    + h  F; S; p+ O7 [1 d. p+ a7 m( s
  430.         jle     good_ver2
    . m3 R+ D. Q" \. |! o2 J
  431.         mov     [pos_y],ax# _$ D0 j0 j  K+ N) I
  432. good_ver2:
    ) Q7 }, J1 W/ |+ x" Z
  433. 0 X0 f. K5 r8 y) z
  434.         mov     ax,[x_move]; {; b  `' |1 r  q& z0 S
  435.         or      ax,[y_move]3 n( ~$ D3 i" d. Z
  436.         or      ax,ax
    9 G) \" d6 S& M& W1 b
  437.         jz      no_change_position
    ) m8 s& N% `; V; H
  438.         or      word ptr [temp_mask],1
    * c0 x. N, `4 v& D( W/ V& v
  439. no_change_position:
    5 w2 D  b8 y/ g% G0 Q4 Q$ ]
  440. 3 ^; ?5 _2 S* B/ ^* e; c  x5 T4 ]% m# v" ~
  441.         mov     ax,[temp_mask]
    . y1 T; u1 x2 J1 \& M1 x( C
  442.         and     ax,[user_mask]
    5 \. b# e2 v' l1 U$ F7 _/ m3 [
  443.         jz      no_call_user
    ) D' ~& H! ~# m0 C9 z
  444.         call    call_user_isr" U( \2 G# r, j* V; y4 O- \1 u
  445. no_call_user:, v4 q, u$ H: z$ @0 J+ s
  446. ' {; D1 L3 }, \) B' J# q- e( o
  447.         cmp     byte ptr [sm_flag],1
    ) ]$ V! D7 ?/ E: z0 T0 Y' u
  448.         jne     no_show
    " {" F$ {' ~* @* O; Q5 ?

  449. 8 e; ~4 g4 v7 t. P0 L( d7 N
  450.         shr     cx,3
    $ t8 z; a- O! ^
  451.         shr     dx,35 A8 b+ {6 {+ A2 D+ X
  452.         mov     ax,80! W6 u& q! Y3 L% ^( K2 [$ G8 y- _% V
  453.         mul     dl( _. U0 X$ i9 v
  454.         add     ax,cx$ a* _  ]# c* }& K0 L3 o
  455.         shl     ax,13 F' `; M5 ~+ Q5 C4 ~+ Q! [" T
  456.         mov     di,ax$ a7 S0 |  w) t3 ]7 A/ y
  457.         mov     ax,0b800h
    $ p& [/ n; u. P% r
  458.         mov     es,ax' I# n1 G7 y4 ~9 D1 w3 T4 o
  459.         mov     ax,[save_char]
    / E% o# \, L( k
  460.         stosw0 L3 k1 g+ ~! L1 c; _' N

  461. 5 q6 T" `8 |+ m& c5 C
  462.         mov     cx,[pos_x]
    / A5 ^# O) `" a: b0 D
  463.         mov     dx,[pos_y]9 u) j, V5 {! L$ c0 `/ C  v
  464.         shr     cx,3) \# _1 B" N3 b! `+ k
  465.         shr     dx,3# q4 \+ h4 u* }+ M. ^( ~; l
  466.         mov     ax,807 @, M1 V" \" [1 \$ V8 E/ L) ?
  467.         mul     dl
    % e' T4 H' ~2 g3 D
  468.         add     ax,cx0 C! ]* k. \* C! g
  469.         shl     ax,1
    0 P' y5 ?" l% Z  [
  470.         mov     di,ax
    ! g( G/ ^# y' w9 |. t. c% B1 h
  471.         mov     ax,0b800h
    6 i6 u5 z5 c7 ]7 \3 H5 s
  472.         mov     es,ax
    ' Q3 [' k8 f3 V5 l( f& C( `' _
  473.         mov     ax,es:[di]: ]: Z6 ~1 _+ n, w/ w  l
  474.         mov     [save_char],ax
    4 P4 [0 m1 Y9 n: z& W* C9 r/ Y8 F, L
  475.         not     ah
    8 [5 @" D/ v% Z" S" b! c$ u
  476.         and     ah,7fh, p! Z0 J; K4 I9 {% P
  477.         stosw
      y9 ?3 ~! e' L6 \
  478. no_show:6 z( t: l8 d! F: C6 S
  479.         mov     bl,0aeh
      h/ D& N0 B" V2 U* N
  480.         call    keyboard_cmd
    2 r3 `, p# g+ p

  481. $ i% j& f/ v$ q% c, W" H) T# Q- ~
  482.         mov     al,20h4 M- _( h+ U6 t( F
  483.         out     0a0h,al9 r4 m# |  T8 V& X' y; r& ^) ^+ m' W
  484.         out     20h,al0 t& L+ X- F+ C9 a$ J+ A
  485. : B# Z/ F6 I- {9 {3 U
  486.         pop     ds, g8 c2 j7 ]6 B& m
  487.         pop     es$ K- a1 N# Y1 C5 w
  488.         pop     si
    $ J/ w) \. A4 D& y
  489.         pop     di
    7 N% D* G" t# O
  490.         pop     dx1 g( f/ q! T" s1 [) s+ E. I
  491.         pop     cx, V* W+ O0 f, v8 d# s: z
  492.         pop     bx4 c# g- `- H: ?, N" |: {% Y
  493.         pop     ax
    , h0 [/ V: Y9 \5 ~! M" G5 N) P' K. \
  494.         popf9 B3 B  V7 A* \
  495.         iret* c# m3 [. O; k0 a1 v7 U% s
  496. 4 H6 @6 \+ k3 I) Z. }: D; D
  497. first_time      db      1
    * b8 X2 O2 I) z9 Z! V2 i% B
  498. buttons         db      0
    ) ]+ V/ X2 |6 f/ F
  499. pos_x           dw      0' Z9 \7 r  G5 F" S" L6 A- R  D
  500. pos_y           dw      0
    + e" w4 T$ x& N+ v; L  p5 ?
  501. sm_flag         dw      0
    + {1 U: P$ {, i7 R) Z) b) R
  502. save_char       dw      0
    , Y5 u% i# v# x3 w: X: P+ u
  503. x_move          dw      02 R3 g, K1 o  b) U
  504. y_move          dw      0& ]- ?# @6 k: C6 r' U$ p: S0 d
  505. x_max           dw      639
    1 Q$ U% L( B# i- H( u, A# N( h( K
  506. x_min           dw      0" h! E- p: Q6 _, L/ g! C
  507. y_max           dw      1996 R) k( P/ c) l2 d2 Q" C
  508. y_min           dw      0
    . B+ r* n) d+ j0 D
  509. user_subroutine dw      0,0
    % K, Q" Z' E: ?6 Y- a1 Q" X
  510. user_mask       dw      0, ~, |- A- j3 ^% V# q" F) Z# ~$ t
  511. temp_mask       dw      0" u2 i0 F) P/ g% Z
  512. 4 f1 X' O" W/ r6 a  M
  513. keyboard_read:
    8 X$ }+ u! ^0 s0 j. I
  514.         push    cx
    + H; R: }: Z# L( `: ?
  515.         push    dx# q- g5 I5 _; t8 f0 S+ x2 c) r
  516.         xor     cx,cx
    . A6 L% h' a4 @3 O6 a
  517. key_read_loop:0 e2 G' F3 n$ G! _9 ]/ s4 l
  518.         in      al,64h( m7 P1 q  N" O2 Q% x$ b$ ~& p
  519.         jmp     $+2/ b2 @6 S- Z# n0 R. J2 @  @
  520.         jmp     $+2% _. R6 ~8 D& G  E- f0 w4 s
  521.         test    al,1* T1 D& B+ T* b+ H  b/ u
  522.         jnz     key_read_ready
    6 F7 [$ y$ v* I) g% L8 e
  523.         loop    key_read_loop
    + B: K& {0 S5 \2 M3 m
  524.         mov     ah,1; b2 g% `( v) ?, ?6 P4 C6 Y
  525.         jmp     key_read_exit
    $ m* m/ S. q* L8 \+ i
  526. key_read_ready:) e) m) M1 j6 U& J) Z. G  O  l
  527.         push    cx
    ' d! {$ Y8 A& ]/ x+ z
  528.         mov     cx,32
    ( y) v) I( ]* {. H
  529. key_read_delay:9 t) h# K. f2 Q! }- P7 e! K
  530.         jmp     $+2
    + ~4 ~1 v9 Z& T: b- n/ O' B: ~
  531.         jmp     $+2
    $ @  F: y9 h- b, s- I9 {- Q
  532.         loop    key_read_delay
    , m% i5 H  @( j

  533. / a/ ?1 b9 s$ p  d/ V8 G; r( m/ ^
  534.         pop     cx! P' y( F; i  X" G1 ?

  535. 1 b3 K, ?# x# u& m6 S# h
  536.         in      al,60h: u5 V0 G- ~! c9 K2 L  g+ M
  537.         jmp     $+27 L( c' @7 H' D
  538.         jmp     $+2) D& j- o$ V# b: D
  539.         xor     ah,ah
    8 F, e5 i+ k# }0 k/ y  Y
  540. key_read_exit:! C1 A4 z3 O2 l7 ]* b1 J2 m
  541.         pop     dx2 B, h! _! }8 i) t* q
  542.         pop     cx
    : N4 E( `7 J9 a1 y/ k# `5 w
  543.         ret
    3 K( ^8 y$ S0 S( |) e

  544. & t# F1 U9 E" R# u9 I) S) w" D3 z
  545. keyboard_write:  \5 E7 X* i5 Z$ p- ?
  546.         push    cx. W3 T: G9 _9 R0 Y
  547.         push    dx, g1 }7 B2 p0 o; W' P/ ^* k
  548.         mov     dl,al- H8 L0 }1 _/ f5 w7 e' Y9 K
  549.         xor     cx,cx
    2 I$ w7 D+ V, |
  550. kbd_wrt_loop1:5 i) N) L- R# z% b  C* i7 M0 A
  551.         in      al,64h
    7 n+ u, U+ [4 A8 ~
  552.         jmp     $+20 z! ]) b; z6 A4 _+ c, Q( U
  553.         jmp     $+2
    0 w3 p: {8 l1 t7 q# m+ y; c
  554.         test    al,20h2 ]* M) _7 Q/ z" a, c6 q: T+ o
  555.         jz      kbd_wrt_ok1
    $ W, R) j' o8 E' l5 _: I
  556. 7 D& q# z8 C. g# y4 ^3 m; d
  557.         loop    kbd_wrt_loop1$ Y8 {4 C, u9 T- x" a! r
  558. 4 @5 b1 T# n- t9 V6 n
  559.         mov     ah,1
    3 Y; r6 P0 s1 z
  560.         jmp     kbd_wrt_exit
    & A- I6 z; v8 K. q
  561. " c2 L6 v! ]" _
  562. kbd_wrt_ok1:" b+ l+ b7 O6 r6 V
  563.         in      al,60h
    0 X6 c! l9 p0 I( y5 h

  564. , ^6 M$ B; H: b$ q# y
  565.         xor     cx,cx
    ( M- O6 C  `6 S  a; T
  566. kbd_wrt_loop:
    " f$ q" ^. Y" n' {  v& w, N
  567.         in      al,64h0 j/ _2 x" n' W. ]4 U/ V- Q
  568.         jmp     $+2
    , d5 _. `# V* u" ~& {
  569.         jmp     $+2
    / }. n& @+ @  L' S2 T. P
  570.         test    al,2
    " a4 \3 X7 }' ?* @
  571.         jz      kbd_wrt_ok
    " L7 s* @3 A+ o, t/ z: M

  572. " Y0 I" j1 W+ `5 O/ q
  573.         loop    kbd_wrt_loop2 L5 P! a4 i4 X% g
  574. * {: _6 e' @7 X, R; L/ r6 j
  575.         mov     ah,1) k! s1 Z5 w. d& f/ z. B0 w
  576.         jmp     kbd_wrt_exit; R, M" W- p8 o; r4 g$ Q

  577. ( e2 ~9 o1 o! m+ u: Z
  578. kbd_wrt_ok:
    + z/ c8 T. D5 T5 n6 T, @  [. `8 `. s
  579.         mov     al,dl
    7 s6 P. k8 F  x( T
  580.         out     60h,al( {/ @7 f6 H2 b' V7 c( c
  581.         jmp     $+2+ D' E' @6 h+ M9 V
  582.         jmp     $+2
    : U2 G/ ?4 ~" y. e

  583. # o4 x* E( u, R: |$ f
  584.         xor     cx,cx
    / z% R2 M! n4 M( s: Q8 g
  585. kbd_wrt_loop3:: Q# Y9 S& T. o" l% ]. V
  586.         in      al,64h
    + o$ X! Q' U7 X. ]
  587.         jmp     $+26 U; c# p: l6 u' D# ^1 C3 N( }
  588.         jmp     $+2
    9 X% a& Q( k4 h/ ?+ S1 W! F! [
  589.         test    al,2
    . [2 \# f+ e' y/ J* S
  590.         jz      kbd_wrt_ok31 U. C5 s& e8 n
  591. ; F+ t1 m# G/ {6 V
  592.         loop    kbd_wrt_loop3; f) o% K! [* n! H4 b
  593. , L: V! l4 ]7 U0 S
  594.         mov     ah,1
    7 u, c: ]: ^8 a9 [& i* ]' U; |
  595.         jmp     kbd_wrt_exit
    $ b# H3 j  \4 ~6 l7 q6 e2 F4 N
  596.   i1 U7 Z- }9 d  {  q
  597. kbd_wrt_ok3:- l* W* J. z2 p+ u
  598.         mov     ah,89 \7 W: I0 D: S4 H% S: |
  599. kbd_wrt_loop4:. Z6 Y7 Q" Y3 z5 E9 {& Y. R" {
  600.         xor     cx,cx
    + ^0 z9 I" [, B( k. p
  601. kbd_wrt_loop5:
    & g/ a2 K* U& c
  602.         in      al,64h; O1 B. z" A( l6 ]/ s
  603.         jmp     $+2' t5 f/ V# ~; ?6 \) y' ^) U
  604.         jmp     $+2
    0 r3 L% e& k2 O, r( t) y# @4 d- U1 ]
  605.         test    al,1' r: T8 t- c( k4 f7 S
  606.         jnz     kbd_wrt_ok45 |8 h) N/ F8 g, L

  607. ) E2 C/ `* g+ E9 T1 a& F& Q
  608.         loop    kbd_wrt_loop5
      [& @# Z+ l" O7 z
  609. 0 B7 c. z2 z3 r% _
  610.         dec     ah
    8 O  F8 u" G7 `- K+ N2 c
  611.         jnz     kbd_wrt_loop4
    + M' Z2 H1 }  j- ?4 B, d

  612. : L# o% z+ w) c- M7 }0 M7 C
  613. kbd_wrt_ok4:  _& w& s. g8 u( Q# [+ u
  614.         xor     ah,ah
    / B/ R0 C& Y8 t! \7 A; M1 ^
  615. kbd_wrt_exit:
      @1 p0 n  Z/ z1 X8 g- @) j" c) e
  616.         pop     dx) P2 G( M3 \( b" _3 M4 b0 Z/ W9 b
  617.         pop     cx$ j% y3 M- t7 c2 ^, n$ M3 l/ j; R
  618.         ret- R* \3 S1 I2 c5 A+ R2 J
  619.         7 c1 ~4 b9 m& L' U
  620. keyboard_cmd:
    3 s1 c& K- K: L
  621.         xor     cx,cx
    . e2 T- A+ m6 n; a) L
  622. cmd_wait:- V; y. i, ?. Z/ J
  623.         in      al,64h
    % ?. I/ P% `/ O4 i
  624.         jmp     $+2# Z) ?5 Q# q% y. g5 z% s; O" A9 P
  625.         jmp     $+2
    4 c  |9 o$ Y8 I+ I
  626.         test    al,26 G: Q7 X0 y( T5 u
  627.         jz      cmd_send0 Q- ]2 v5 g. M2 k: `" e$ a
  628.         loop    cmd_wait
    + I: n/ O( S- n& q$ y

  629. 1 d+ A1 C4 W" A
  630.         jmp     cmd_error
    * T  g. `& U6 O8 K  |' v) J
  631. 9 Q- G: g9 v1 {& T% I
  632. cmd_send:
    , [/ G/ z$ s6 z2 ?/ F$ f; N$ ~, J
  633.         mov     al,bl
    " ], ^3 H0 h. I' O
  634.         out     64h,al9 Y  i' Y! J! U: f  }: q2 S
  635.         jmp     $+2/ b4 k& n2 s5 K0 Y1 C7 i- \. C
  636.         jmp     $+2
    , p( u& i* s$ d$ K
  637. 9 {5 @3 n4 J' w5 p
  638.         xor     cx,cx$ P$ c+ n2 O# ~5 a# t" m
  639. cmd_accept:9 h8 |8 }7 f, I( A, m
  640.         in      al,64h
    7 N9 S8 t' E; @  v- m0 X
  641.         jmp     $+2
    / Q7 j1 I0 M+ Y& o2 f, [
  642.         jmp     $+27 ^2 d( C  Y0 Z) l
  643.         test    al,2
    : e+ v# U/ Q' C4 Y/ I% @/ S- `
  644.         jz      cmd_ok) O% w1 p  c5 e4 N" K) o
  645.         loop    cmd_accept
    ( q& R* S" K$ U: z5 E; |2 s2 \
  646. 8 D1 }1 G0 |4 T) P0 g
  647. cmd_error:+ G2 n& L% k  I; r
  648.         mov     ah,1. t- x% _( V) V
  649.         jmp     cmd_exit
    ! b& ]$ d, X+ G. A# g
  650. cmd_ok:
    2 K6 e" ]) M# U  A1 `
  651.         xor     ah,ah
    8 x# k  k/ m& `1 E1 ?4 Y- l/ `
  652. cmd_exit:
    $ i! ?" l% q. K3 Z; J, b5 t: j
  653.         ret
    & m- I( {8 x, S6 o4 c, }+ ^

  654. $ P" e, z  m$ S
  655. new_33:
    8 o# T( m  m; V8 l2 x  T
  656.         cli
    8 I% R: E7 K1 r; W# Z
  657.         cmp     al,0. x' x8 f1 k3 E3 m! U/ r
  658.         je      reset_mouse! R1 @% c! L/ T5 g. f% s: u
  659.         cmp     al,14 c+ w( D0 b* _0 ]+ f4 ~" K
  660.         je      show_mouse
    % `$ ^0 W, C& i" t3 o( |
  661.         cmp     al,2
    , k6 J5 _9 y! f8 o
  662.         je      hide_mouse
    4 O5 y, I$ K/ B' e, E5 i2 O
  663.         cmp     al,3* D' C5 S: W8 K$ y3 R' m9 C
  664.         je      get_pos/ }1 F  _2 c: z
  665.         cmp     al,4; w! W. H, `( }  u# q( }% q! Q( B
  666.         je      set_pos7 ~6 a4 r: p# |& a7 r" G. F
  667.         cmp     al,7
    . y: r: E1 E8 S/ u1 D3 D/ }2 q2 \
  668.         je      set_hor_pos% j4 X& r/ L, w# O" ^
  669.         cmp     al,8! u3 m( C) j+ M) t2 m0 ~
  670.         je      set_ver_pos. z  @8 }9 @3 x7 i! |2 G# {* A8 f
  671.         cmp     al,0bh/ {9 u1 g5 t5 p! r0 l' r1 J- l
  672.         je      get_mouse_movement7 L" k6 N. M8 `2 \. T+ q
  673.         cmp     al,0ch
    5 _, p4 M, {+ ?( F7 A
  674.         je      set_subroutines; B( ~3 c( N9 w: `! _8 n
  675.         cmp     al,14h' Z8 j; K7 g3 ^8 N
  676.         je      swap_subroutines/ b, B" ?0 _2 o0 v* O
  677.         iret
    ) z1 c* m& T, |0 K1 y) {7 x4 c

  678. 6 A8 y0 L2 R1 m, h$ I' V2 ?
  679. reset_mouse:5 r" ]7 R6 {6 V' `
  680.         jmp     _reset_mouse. m( F# {+ P/ M  L
  681. show_mouse:8 A. a2 i9 s3 g% d
  682.         jmp     _show_mouse' N. \  F. y4 `/ j; [5 M  ]& `5 j: V1 s
  683. hide_mouse:
    ) ~4 p5 N1 [# W; h8 Y* W* F
  684.         jmp     _hide_mouse
    0 U* t, h1 r$ H0 u! z$ ?& K, [
  685. get_pos:9 S2 b7 i( Z$ M
  686.         jmp     _get_pos
    7 T+ a. e, Y" S8 N
  687. set_pos:4 m+ K  M* `% q& l+ a$ H$ i
  688.         jmp     _set_pos
    9 m+ E' l. c" p  f& T' |, b
  689. set_hor_pos:( S3 r9 l8 L( E/ q$ c; O9 E
  690.         jmp     _set_hor_pos+ p2 {0 j0 X" s9 T( P* j
  691. set_ver_pos:
    ) I& P' v2 D/ g  `* g$ {
  692.         jmp     _set_ver_pos
    & J3 R' p- o% V% B: k4 T! T0 c
  693. get_mouse_movement:) c7 z0 h. H9 m6 x: }) F& D+ r- O
  694.         jmp     _get_mouse_movement) c; ~" _7 A+ y$ w  f$ Z
  695. set_subroutines:+ R8 i5 S/ L$ b' e
  696.         jmp     _set_subroutines1 Z- U2 @; f  Y* k
  697. swap_subroutines:
    9 m8 e9 E. m4 [- ]  F
  698.         jmp     _swap_subroutines3 W- B1 J7 C) D" M8 b1 p

  699. 7 H% J5 R' d0 m; z5 L
  700. _reset_mouse:
    / C9 p5 m" H. W9 }
  701.         mov     byte ptr cs:[buttons],0, x0 d1 A+ }7 o( R9 A
  702.         mov     word ptr cs:[pos_x],0+ A% x' [- O, z) v
  703.         mov     word ptr cs:[pos_y],06 _4 ~6 j# U7 j5 F7 W: ~
  704.         mov     word ptr cs:[x_move],0
    # A5 a+ `3 k5 F" f$ Z2 d1 s
  705.         mov     word ptr cs:[y_move],09 n, ~$ @# T1 ^# H' t( Z4 m3 J
  706.         mov     word ptr cs:[x_max],639
    + T& l. O/ ]! W
  707.         mov     word ptr cs:[x_min],0
    2 A) {. O  q7 ~$ k+ ^& U
  708.         mov     word ptr cs:[y_max],199
    2 I) F; s* Z: j+ R  n+ Y# q
  709.         mov     word ptr cs:[y_min],0* I' h' F& ~0 ]  s& r& D9 W
  710.         mov     word ptr cs:[user_mask],01 }0 E% w: }9 R' T, i
  711.         mov     word ptr cs:[user_subroutine],02 _) r6 B* N/ X8 D
  712.         mov     word ptr cs:[user_subroutine+2],0
    0 Q( a$ X  Q; B% S* T
  713.         mov     ax,0ffffh
    2 t  m/ W9 ^' K: s
  714.         mov     bx,3
    . m( S) B3 \0 a9 B
  715.         iret$ ?- a! c5 ^0 x

  716. 2 ^/ g5 C" u- z/ i9 m0 U0 O
  717. _get_pos:  \6 t0 y+ j# a: J
  718.         mov     cx,cs:[pos_x]( ^$ @$ E; b& }; y( {4 G/ M
  719.         mov     dx,cs:[pos_y]2 I9 [. s, C* P" U, r( E) J
  720.         mov     bx,word ptr cs:[buttons]/ K7 Q, \; z- ]) u8 ^
  721.         xor     bh,bh
    $ n- o6 \7 }" t# _7 Q* S1 w' m7 f5 F
  722.         iret
    " o  o7 @5 V: ]  ^. ~+ W- u  t
  723. " L9 @. X3 f9 g6 K3 E+ ^
  724. _get_mouse_movement:, z$ Z4 O0 X! ]# E4 [6 p7 y3 r
  725.         mov     cx,cs:[x_move]/ n0 l: W7 l6 b; v
  726.         mov     dx,cs:[y_move]
    6 b, F; l. ^1 a% y* {4 @2 ^. {
  727.         mov     word ptr cs:[x_move],0* S0 @3 y( l: l1 j" W
  728.         mov     word ptr cs:[y_move],0, D3 K% y* M& ]* o2 F  s
  729.         iret0 M8 t  f& D: X% U  V

  730. 9 E& O  J: z* ^+ L
  731. _show_mouse:
    , w2 p+ D# J% |  c* P$ n
  732.         push    ax" I' \0 N& \( V- D$ ?1 w& R2 `; b, M  f
  733.         push    bx% \9 K" V  p4 t) U5 a  C
  734.         push    di
    3 E: \3 Z0 k* S0 M: c
  735.         push    es
    0 _3 t% o. y4 ~: V' K+ z5 B# L
  736.         mov     byte ptr cs:[sm_flag],1
    0 i- Y  g) v! F$ n1 o- h2 w+ P
  737.         mov     ax,cs:[pos_y]$ v! [) {! ~: _" L3 |
  738.         shr     ax,3
    $ @8 |9 V4 A( {* ]  v6 n
  739.         mov     bl,80- m+ L( A- k( r9 D1 ?1 f7 }. M9 }
  740.         mul     bl
    8 q& E/ z# @$ n3 v
  741.         mov     bx,[pos_x]
    0 A# t0 u7 O8 Y9 g" d, |' C& H
  742.         shr     bx,3% w6 P* @! K7 o
  743.         add     ax,bx% M( A0 @6 T- D7 B" x
  744.         shl     ax,1' C$ N# q9 [2 O, `/ |& K
  745.         mov     di,ax
    8 |; X4 i. F8 J( v8 m* C& g
  746.         mov     ax,0b800h# K1 u, l" ^7 w# }
  747.         mov     es,ax6 |4 T6 d& d3 o$ u. a% d# p
  748.         mov     ax,es:[di]
    8 c* ]' r# i+ U# @2 C! q! Q
  749.         mov     cs:[save_char],ax5 r4 b3 _  @& C
  750.         not     ah$ q6 @/ Q) m( {0 a& O6 L2 ^) A
  751.         and     ah,7fh
    , }' C) C- ]  W4 b) ~
  752.         mov     es:[di],ax
    9 I: G, u& W: Z
  753.         pop     es
    ; k9 K4 I2 G6 G" r
  754.         pop     di8 O8 p2 Z# E' R) R: x6 g( N6 U
  755.         pop     bx5 l) o0 o+ `' k5 L" V" n
  756.         pop     ax
      D/ R/ P; i' T$ B% w7 |) _
  757.         iret" K& w, x0 t# u( u/ N- |' Z

  758. 8 l8 Y) b* `4 K7 i( Y7 |3 O  X
  759. _hide_mouse:+ Q* d& [  q5 E( e% X1 X6 ^4 R; S
  760.         push    ax
    8 d1 X, F  B" {! i/ F* J9 ]
  761.         push    bx( Y( T8 P# Z$ a% |
  762.         push    di
    , z, e, H5 q6 v) ]' F; t& K
  763.         push    es' ?! l$ [+ W) l$ C- X% i5 N
  764.         mov     byte ptr cs:[sm_flag],0
    % I" ~+ H! f! o4 C
  765.         mov     ax,cs:[pos_y]* D- V1 d8 v, U/ U' p# {) l/ \1 R) N
  766.         shr     ax,3
    1 y9 K/ J6 L0 F$ C7 F
  767.         mov     bl,80
    ' t7 L- x. g- z
  768.         mul     bl# B: t" g9 E, F" d: [5 t% \: ~! Z
  769.         mov     bx,[pos_x]
    " o, _( V7 P, F) q( ~5 R" `+ b
  770.         shr     bx,3# `! I3 o: a+ q
  771.         add     ax,bx
    - b" Y' G6 Q3 O2 d* j( ~
  772.         shl     ax,1' E4 }" [/ M/ c
  773.         mov     di,ax
    ( Q8 z% f  N; m& P0 L3 L" k3 s  e
  774.         mov     ax,0b800h0 f0 T8 b. ^! c3 m4 A* ?% w
  775.         mov     es,ax' J* [+ h4 A% E" S) ~
  776.         mov     ax,cs:[save_char]9 Q  [5 p% N' b& w6 B1 |; c! ]
  777.         mov     es:[di],ax
    ! V2 Z# S5 H( i6 V* D
  778.         pop     es
      g8 ?$ P# R4 k- v1 T
  779.         pop     di
    2 V" K- ~1 a* R$ d( t. d4 r3 T
  780.         pop     bx, ]  H2 ?. y. U  h* M* ~5 B
  781.         pop     ax) u, N3 }6 d! h# f2 g
  782.         iret& s& ]9 V5 V) |( ~

  783. 1 R8 V6 E* M1 M  |& Q* i, S0 ]
  784. _set_pos:
    ( o0 Z9 p; m, r$ z7 P4 Z# S
  785.         mov     cx,cs:[pos_x], n1 K7 E" j7 g$ D8 [
  786.         mov     dx,cs:[pos_y]
    ' @. x  P8 ^) l6 r# S2 U. i) {
  787.         mov     word ptr cs:[x_move],0
    * p9 e9 u: w3 l( |6 A
  788.         mov     word ptr cs:[y_move],0
    " R4 x+ \. G' j) ?9 a% v
  789.         iret
    : B! j: r5 F0 B
  790. 8 h$ ?5 Q! n. @9 _# k0 s6 }
  791. _set_hor_pos:
    / V4 ^7 f3 Z& {# f+ T: n% a) q
  792.         call    max_min( d! D8 @" G4 j
  793.         mov     cs:[x_min],cx3 o, S; u9 h* I7 l3 @  e
  794.         mov     cs:[x_max],dx& |4 y) G* [6 {1 x& t9 j1 r! J
  795.         cmp     cs:[pos_x],cx4 v1 |: X$ F; j4 Z) t* \6 i) O$ j
  796.         jge     good_hor_min4 M0 {! Q& A# r+ \% `
  797.         mov     cs:[pos_x],cx6 }4 C6 p! n( g7 Z: s, ]
  798. good_hor_min:  B) ^6 t; e* C& T: p5 @: `* _
  799.         cmp     cs:[pos_x],dx$ b1 p$ f9 b, I5 O: |0 C
  800.         jle     good_hor_max; }6 e8 x6 J* D  z- z! j+ n4 d
  801.         mov     cs:[pos_x],dx2 n% I+ m, {, v7 L
  802. good_hor_max:" d& N3 }0 i! Y+ L! @" \
  803.        iret8 {% I3 u  j9 W# @5 t) s- Y" ~1 s" B
  804.   j1 i5 l, A! H5 H; @
  805. _set_ver_pos:  }) Z* y% A+ s* x. @( J
  806.         call    max_min! s3 b5 A* ~; C2 W% G' `! c8 m( K
  807.         mov     cs:[y_min],cx
    . a/ I1 `7 t9 }3 X' _+ Q& p! \
  808.         mov     cs:[y_max],dx% p5 j, b6 Y" `: {! @( p
  809.         cmp     cs:[pos_y],cx
    ' X/ n# S5 N% Y
  810.         jge     good_ver_min6 X! ^4 C5 b) J- _' ?2 Q; O
  811.         mov     cs:[pos_y],cx/ P; o) E# R+ p' J
  812. good_ver_min:" k5 K( b4 w% t" G5 k
  813.         cmp     cs:[pos_y],dx# _# y$ \* Q" C; K) X
  814.         jle     good_ver_max/ P5 ^" D8 U8 _0 C8 `
  815.         mov     cs:[pos_y],dx
    $ u$ e; h% o5 F" v: z1 d! h2 `
  816. good_ver_max:
    , j8 Z2 ^4 |/ E. F6 y
  817.         iret  f# }8 [  l" J2 g0 ^

  818. 1 Y2 G( V1 u, ^1 N" n
  819. max_min:
    3 m8 C6 E6 o% _( y9 a* e2 U
  820.         cmp     cx,dx
    3 d4 D* L1 R' I6 n$ X) Q
  821.         jle     no_swap
    . L( L9 q; D. a8 F: n
  822.         xchg    cx,dx
    5 n* M1 b8 O( y+ y
  823. no_swap:
    & K0 |& f& V. O
  824.         ret+ [% v- f2 Q4 |
  825. 7 M' Y" R$ e  f& A! R4 e1 Y: v
  826. _set_subroutines:8 g. a3 V! T/ p, N, S0 N+ s, g
  827.         mov     cs:[user_subroutine],dx
    9 Q6 k2 r! f% C- V
  828.         mov     cs:[user_subroutine+2],es2 `2 X, z& r% s- `
  829.         mov     cs:[user_mask],cx5 [- q9 u6 Z" V: f
  830.         iret
    + J" C2 m6 X0 B9 R; x8 S) Y
  831. # U3 A! d! |% {% m0 }
  832. _swap_subroutines:
    6 k& N3 I4 Z' P3 d! @& I
  833.         push    word ptr cs:[user_mask]
    3 e# h9 w( |, Z: |
  834.         push    word ptr cs:[user_subroutine+2]) d+ w5 N. k7 e2 ?
  835.         push    word ptr cs:[user_subroutine]7 l4 A. S, @( s. [3 p* o. F2 n+ U
  836.         mov     cs:[user_subroutine],dx
    4 B+ F8 E7 Q1 D1 L
  837.         mov     cs:[user_subroutine+2],es" [! t. b8 L& f: p5 ?; R- G
  838.         mov     cs:[user_mask],cx+ O- @2 ^- Y  r4 L
  839.         pop     dx! g: N; G' c- o
  840.         pop     es) ^% ~1 U% w. ^
  841.         pop     cx6 z5 l% ^  V" P+ w' ~
  842.         iret( ]9 f- r! T7 G8 E, B, _" O

  843. ( j( m& t2 D1 U5 g9 ^9 v- `* a
  844. memmouse        endp
    2 u. i, v# A: t: F3 t0 A
  845. $ t, c- @8 H/ Y" D3 u" c' k4 Z, y
  846. endof_start:
    ! M/ x6 A, @/ q0 R# |

  847. + r- Q4 L) v0 U8 k
  848. emsg db 'No mouse driver install error!$'; ?  ]: [2 u8 x# b& H/ Q
  849. old331 dw 09 N" U; f) R& @: q4 g- X' ~
  850. old332 dw 07 C$ N' ]2 r# E  R8 Z' p
  851. old741 dw 0
    . {+ R  b$ t6 K+ e+ ~# v
  852. old742 dw 0
    $ L1 j- I' r+ `* E7 ~; ~: A
  853. memcopy db 0
    3 N- G+ r/ l% H1 U" ?+ D
  854. okcheck db 0
    % ~) K! B' T/ w$ v8 v) H0 ^. X* y
  855. pass db 0
    - Z) x$ w0 g+ }4 I5 A
  856. chkl db 0
      ~# \, Z. V& s8 f5 d) q+ @
  857. lk db 0: @% v0 ^! O. E3 M8 Y* ?
  858. chkr db 06 s' e* Z7 x; k7 f  x9 w7 E  O
  859. rk db 0
    $ E4 Q+ q2 v3 Y* n
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    . S/ t; K- d# B5 @
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    9 k' O, G: W9 Z, x+ Q5 B( g
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    9 a7 _9 ~' Z% L, ~0 X/ ]
  863. db '                                                                                '
    # a. s4 y* |8 H* R8 r
  864. db '                                赏屯屯簧屯屯突                                  '. e( u5 Z2 ^$ U- v
  865.         db      '                                ?OFF汉OFF?                                 ': c) ?" r! N9 j! I
  866. db      '                                韧屯屯既屯屯图                                  '
    ) F# C$ M$ t) m" [
  867. db '                                                                                '! ^* n; ~1 `6 i+ R& _- N
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '7 p6 I% I: |. p; Z1 N
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ) s6 _* C" N4 R  x8 @- A9 V! d
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    1 \& L. ^* g3 E4 p: d
  871. ) p( _; x; O7 M4 R
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
7 }) e5 |  [& c* B" m* Z哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
6 j( H0 s' w# f; U  C" I1 n& Z1 Q: O0 @  C/ Z' O
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 07:34 , Processed in 0.041663 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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