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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
9 r- n3 |- E4 m) m, s0 ~& s/ m& o6 f7 S' ~+ V
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;. [% `" l3 j7 {4 g
  2. ;          Ufoit PS2 Mouse test program   Ver 0.98 Z' }# I- w' \. Y
  3. ;                                         By Bini.Yi 易祝兵6 i2 f, s9 ^% p  F+ [7 a, v
  4. ;                                         http://www.ufoit.com 计匠网
    6 t- v  j1 x9 z. d
  5. ;                                         2002/04/06 YYYY/MM/DD3 |; C4 g0 P0 w( @1 C( ]( c; l5 e
  6. ;
    0 e, o1 ?2 Y: P# o- Z: O
  7. ;          0 \& p0 k7 t8 M* h$ B* d* U
  8. ;          This program  test the mouse button  click and move.
    $ Q/ @& N) N# E0 r7 K3 z6 Y9 t
  9. ;
    6 o1 a1 u( g" ^  L' E

  10. 2 M6 `" g4 ], n
  11. .model tiny
    " R" h! y$ b3 [: s0 }$ u
  12. .586
    $ ~9 a9 H" N0 N& u* z
  13. .code
    9 y! {0 q3 I+ X
  14. .stack  100h, n5 s: B! C+ ~! p7 {
  15. .startup- V) v/ ~1 I5 P- n; r& a) d' D
  16. pusha) n. p$ N/ `3 Z* z
  17. mov ax, 3533h" H- ]0 b; ^. Y$ a) d  k, k! E, W
  18. int 21h
    , z9 |2 o0 s0 M5 G& \% k. [
  19. mov word ptr cs:[old331],es$ H5 f/ D# f" }0 ^3 T/ S( I
  20. mov word ptr cs:[old332],bx/ ^* P4 J6 v, g3 N, w+ n6 Y3 F) c
  21. mov ax, 3574h
    5 g- [% G: f7 b: N
  22. int 21h
    * ?* A9 X* w6 H! b5 {
  23. mov word ptr cs:[old741],es' W4 E1 n% x5 p4 t3 R! X
  24. mov word ptr cs:[old742],bx+ z8 s6 \4 r  x! n& w$ p
  25. popa
    6 X/ p# Z# O) M, A1 j6 d
  26.         call    memmouse2 s1 v5 V1 E, ^' B( J4 m
  27.         mov ah, 00+ R8 Y! ~: U: O9 E* K* A
  28. mov al, 035 B, a9 D: v# X$ g9 ]% y2 H* P
  29. int 10h
    7 t* H1 I. \$ N5 y
  30. mov ah, 06) Q3 P" \  b( P0 ]* A8 L: p
  31. mov al, 0
    9 x8 ~& e/ V0 d4 @' @- d
  32. mov cx, 0" _- {: G3 {1 x3 i3 f; j9 v# M
  33. mov dh, 248 s3 j0 i* X0 P) F' i
  34. mov dl, 79% B: L! A9 b2 p4 V
  35. mov bh, 07h
    3 l; b" o5 j" ?5 Y) V
  36. int 10h
    % t( t) G8 E: Q( S0 ^
  37. mov ax, 0000
    5 Z7 t( g4 H, Q% B5 R: j9 u
  38. mov bx, 0002+ K, }% O  X/ z7 `$ q& L$ h6 G
  39. int 33h
    " L) E' P4 A! t" N7 C' @
  40.         cmp     ax, 0000           ;if no mouse drive install2 H% d7 N2 Y- ~& ?5 l% t# Q
  41.         je      errormsg           ;show error MSG% v/ I2 i4 r7 b( X
  42. mov ah, 02: R  `- V9 [( Y
  43. mov bh, 00
    7 x: |2 E3 E- a" z. W# L
  44.         mov     dh, 25             ;Move point out screen/ J# B' a1 Y1 q) j3 t: }
  45. mov dl, 79
    " P8 @" e+ t2 z! M% Z! B
  46. int 10h
    # L3 @$ A  V" n+ U; z1 k4 @# `
  47.         call    showmsg            ;Show info7 P+ s: ]+ O  S) i# f! N. b# v8 _7 d
  48. mov ax, 0001
    " I% T* a! u( E. g( c0 b
  49. int 33h
    & X1 _6 Q" S) E" {
  50. ; mov ax, 000ah8 _9 B7 L- {# E1 O2 g
  51. ; mov bx, 00007 p5 }5 m$ U8 @% I
  52. ; mov cl, 0h
    . q! Y5 r# `/ x+ O# o$ [0 N
  53. ; mov ch, 0F0h6 i. x  c3 L2 W2 ^$ Z
  54. ; mov dl, 0h
    . j$ ?& L+ j! T; J; r4 Y
  55. ; mov dh, 0F0h& y7 h$ u: v$ K- {! z
  56. ; int 33h. D7 Q% y3 |+ L' ?+ |5 i
  57. mov ax, 0004h
    + I8 \1 c# A. |8 B$ {0 d' _1 E7 E) o
  58. mov cx, 0319
    5 s7 B9 D( k5 O+ t& T( {! p
  59. mov dx, 0103
    ( q+ A. i) @& [. v
  60. int 33h
    / X  d! J7 v$ b: q1 |" P
  61. casemo:                           ;Case button click and point move / F( P7 q& j1 \; u4 z
  62.         mov     ax, 000bh         ;and keyboard press
    2 {# X" l$ I8 _  [$ G7 e
  63. int 33h
    , M/ Y7 x  `) l$ ?8 M
  64.         cmp     cx, 00h           ;if point move....X+ o. l! J6 |- k  V/ O
  65. jne xmov* {, o5 y, c' C8 x7 J2 T, J7 K6 R
  66.         cmp     dx, 00h           ;if point move....Y
    * x% D, S2 E9 h8 u
  67. jne ymov9 q, S% r1 G0 b( [( v" N
  68. xymovend:                         ;X.Y move end
    3 M" C* u! ?' l' v  {) o) z
  69.         mov     ax, 0003         
    ) e1 ^% C2 @" N$ A- |
  70. int 33h
    * y, K+ `) s# v  b
  71.         cmp     bx, 0001          ;if left button click  show ON
      H3 O/ R( |  k  Q5 e
  72. mov si, 18289 A: f) P& E  R' z  _3 B
  73. je listl
    2 [# ]! N4 m7 W. j
  74. mov si, 1828
      F, N1 `% b5 x" I$ J0 N
  75.         jne     nlistl            ;if left no click show OFF5 T: O/ b/ J' s7 d* S5 P2 B
  76. testr:
    , A) [- X5 \. Q3 u  c) r& n
  77.         cmp     bx, 0002          ;if right button click show ON
    - @9 J8 X! x* m- N$ y& ^7 k. p
  78. mov si,18421 y9 m. h8 l5 H0 d/ H$ j4 F
  79. je listr
    % K+ M# q, Z& I) l  n% c! R
  80.         mov     si,1842           ;if right no click show OFF" v% t9 E  L! ^; u
  81. jne nlistl) C7 ?, F# {+ ?( F, g$ F! l$ B
  82. casekey:
    ! F' `! y5 }% F# Q/ D
  83.         mov     ah, 01            ;if any key press jump check
    / Y/ P8 z, B0 N0 k- c' L
  84. int 16h7 F. x) q3 O: B, C# t" n5 R& ~9 g
  85. jne kpress
    5 f, A' W+ B; }2 ?, x. f4 w
  86.         mov     al, [chkl]        ;check x flag3 g  D4 E8 I1 M' i+ a2 y! d
  87. cmp al, 02h
    9 C! E, N% c+ ]+ J
  88. jnb chkok
    " c; c% W1 S" K
  89. jmp casemo" Q' f+ ~+ q$ B6 u# X0 k/ d
  90. xmov:                             ;if X moved, get the X flag+1
    5 E- J+ W0 _7 V) i
  91. mov al, [chkl]
    * Z7 ^$ P+ m6 [1 v$ ?4 X0 f& Z6 g
  92. inc al7 @- h6 t5 V& A- o
  93. mov [chkl], al
    6 A) `! ^1 G% o3 }2 q: x- n
  94. call passok' u6 b% L2 V6 `5 @  {3 U
  95. jmp xymovend  ^* p/ f3 f1 B: W0 e7 f( d) e: {
  96. ymov:                             ;if Y moved, get the X flag+1! R9 D: p" c3 W! Y
  97. mov al, [chkr]
    " b/ @, u) T1 F2 K; p
  98. inc al
    2 J1 Y' b/ x8 C3 t1 d
  99. mov [chkr], al' x  H9 X$ ], H) C% Y& {
  100. call passok: D# A: f' g" X
  101. jmp xymovend
    ) J! O1 f2 J. u1 _; m0 Z* x) Z
  102. 2 X# W! H  o) }
  103. passok proc near/ I: D) v/ k- J; N5 z4 J3 l; h+ D5 `
  104. mov al, [okcheck]
    1 D6 }+ h2 ~& f1 C
  105. cmp al, 1
    2 e. @5 V' F9 l+ _9 F) T
  106. je let0& d# s: t9 d, a9 B7 R4 @; a
  107. jmp passret9 J+ D, U. r: \: z6 t7 o# i5 S" M
  108. let0:
    6 M  I! t" X) a7 `- s0 T
  109. mov [pass], 1
    2 N: Y$ P( e% `- T8 }2 a6 l' D
  110. passret:3 O$ A. b) b. X# k) v
  111. ret2 Z. _" w5 }! R/ K- h
  112. passok endp
    ( l# }" ?- ^/ z# w
  113. - j. K; ^. o# r1 q; C; L
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS- _. l( O9 T6 U6 ]1 d
  115. mov al, [chkr]( b% ^" w/ q8 i9 B# v: d: [! r
  116. cmp al, 02h
    " T) R1 ^# Y) F* K4 x( K
  117. jb casemo
    5 s$ f) e- `  Q9 o0 g% b
  118. mov al, [lk]; V4 u  p8 O  W2 I! m* B
  119. cmp al, 15 t$ r/ P7 o) W; ^6 b. t( G
  120. jne casemo
    ' \* P$ k9 G# \) Y0 K/ h
  121. mov al, [rk]
    " p  C+ G5 q' e7 K$ V" w' t
  122. cmp al, 1) }4 w1 G! b* n7 H
  123. jne  casemo+ H2 l) v) ~$ x9 r* `1 i) b
  124. mov [okcheck], 15 f% S6 |+ M1 [5 Q# J) w
  125. mov al, [pass]$ m: V) [$ C, C/ j2 X% W8 G2 k
  126. cmp al, 1! o5 w  ?0 Q. Z' K
  127. jne  casemo
    4 I3 A! H) O+ S2 K! D. p5 a5 E- m
  128. mov ax,0002h4 ?, K' c0 W2 |  o7 G' K
  129. int 33h
    ! P1 \9 ?4 @* H: E; ]7 |7 g4 i4 n
  130. call cleascr5 p: A* S& s1 x" [( @
  131. 0 o: z& h& H* W
  132. call oldint
    0 Q4 X4 y2 w0 H4 b, g
  133. mov ax, 04c00h4 s* A/ h3 g' r" L7 A
  134. int 21h! ]( F( K4 X; p. ~" h, J/ q1 q

  135. - L$ h) {4 ^; C7 q$ v7 N# j9 K+ S
  136. okexit:
    * h, [( _# ?( o: P: r
  137. mov ah, 4ch2 w" Q+ m8 j9 m- C
  138. mov al, 0
    . b. K9 k* m- ]7 b1 f
  139. int 21h9 O. u* G. H1 u  e3 {0 R$ N
  140. listl:                                 ;Show ON9 E9 H* b  |: Q+ b* O' V9 U, f% n0 a
  141. pusha
    : ?: Z# Y; f. n: Z8 b+ z" ^8 d
  142. mov ax, 0b800h
    0 I% K! B0 u: u) w" ?- |/ ~8 _5 i
  143. mov  es, ax" v( G% l% O( K: a
  144. mov ah, 47h( P  g3 d5 W- P4 t* g! [5 ?9 E
  145. mov al, 20h4 Q5 l) s) s) S8 A
  146. mov es:[si], ax, l3 T( p  j0 k5 u, U4 ]: B- h* S
  147. add si, 02+ y! N7 I( E: N
  148. mov  al, 4fh) p5 r  U& U, ]/ W9 ^
  149. mov es:[si], ax
    , d' Q9 f3 q6 g- y6 `% T
  150. mov al, 4eh
    ) G) s0 g* {( T. x
  151. add si, 02" V$ @+ ?" O8 G( F
  152. mov es:[si], ax
    * _0 f$ D0 }  h
  153. mov [lk], 1" {0 z( G- }$ H* K8 q" ^
  154. popa
    ! c. i3 V3 F* h3 k4 T' O( }4 X
  155. jmp testr
    ( [% `: `+ \1 {0 w4 C
  156. listr:                                 ;Show ON
    4 W% N- x- O4 {1 G) `2 m& e( P
  157. pusha% h4 M& {0 D! W, p* g1 _) |9 H* b
  158. mov ax, 0b800h
    7 G7 N$ P. i8 e+ n. U
  159. mov  es, ax" k; X4 P, g* I
  160. mov ah, 47h
    & b! K7 \) F& x- f8 t
  161. mov al, 20h
    , d& ~: ~6 ~0 V+ k, A! r
  162. mov es:[si], ax/ J  ~% |$ _( W. Y6 ]. H
  163. add si, 02
    7 g. E6 W3 b4 o
  164. mov  al, 4fh
    ) B! d/ i0 t. T: ]' h" c) J1 z' ?& `6 L
  165. mov es:[si], ax
    ; n+ p: T, w$ d2 q8 w3 X
  166. mov al, 4eh
    / {  [7 m4 q1 I1 t% \/ z5 r
  167. add si, 02
    : _/ G; X8 N- F$ ^
  168. mov es:[si], ax
    ; g# s1 Y5 _+ l: Y
  169. mov [rk], 17 c1 t+ j) a, s( {  R2 G. W5 E
  170. popa% R+ \% c2 x, @+ ]* T9 e- q- B
  171. jmp  casekey
    $ n# }' S8 V- ^6 ]5 h0 g; P

  172. ! T* h- _' p' r$ c# u/ k" N, v
  173. nlistl:                              ;Show OFF! j; i6 \6 I" O( y+ T) F  l
  174. pusha   - ~  |4 y. J: S2 ?( g
  175. mov ax, 0b800h
    - T: ?3 P& {, s1 Z: q, d# H' @! U
  176. mov  es, ax2 I1 o* d9 [) Q1 e0 P( N
  177. mov ah, 17h
    6 l/ O5 Z& f# ~* A# E
  178. mov al, 4fh9 d7 }0 B9 d" y% N$ f& Y6 \. q
  179. mov es:[si], ax
    - @2 [3 Y/ j' N9 m
  180. add si, 02
    # ?/ b; _: |, a$ u6 X5 A! M
  181. mov  al, 46h. I; A. t9 ]" c8 q6 s! ^
  182. mov es:[si], ax# K+ j1 U) U0 X5 {+ }6 C
  183. mov al, 46h" z* Q) T+ y$ A1 d1 }$ L" a
  184. add si, 02
    8 }( F( f' L: c. {
  185. mov es:[si], ax
    3 s% |; {' c4 {: |; g
  186. popa
    3 ^8 I$ M1 F( t! ]
  187. cmp si, 1840" L- |4 [7 X+ @" Y2 i2 Q2 ?
  188. jae casekey; V: G! \9 Y  m
  189. jmp testr
    ' |. I3 t1 _6 y6 d% F/ a
  190. 5 b2 C' o( l5 v7 I# @* `4 [( f
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    ) R) ?. S3 Y( x0 t: r
  192.         cmp     ah, 01h             ;and return a error2 r9 S" e. s9 C2 B3 x
  193. je exit1( g$ x6 \) E# O
  194.         mov     ah, 0ch             ;if press other key then clear) H% Z1 C) u& P; ~
  195.         mov     al, 00              ;keyboard buffer
    9 `9 ^2 S2 P/ H/ T+ k- R
  196. int 21h" N$ [9 T, {$ A
  197. jmp casemo
    6 A; B0 P$ k' e4 Q
  198. % f2 D8 Z3 G4 J' B2 p- z) t
  199. errormsg:                           ;if mouse driver no install
    . [# c8 Q; e2 G" n" q) j
  200. call oldint
    & a% R# c( }( E  {& a2 r2 N7 \
  201. lea dx, offset emsg( f& `- A* V) U! S. e- d
  202. mov ah, 09h
    . p6 P1 S8 _% f( N6 l  S
  203. int 21h* t, r5 C  i1 V  W( K1 O* I9 L' g
  204. mov ah, 4ch
    0 j( T3 m4 C( c7 n
  205. mov al, 2
    : F# S1 O: Z6 ^: a1 J! O
  206. int  21h+ s, i1 |2 Q7 P  e1 S& V

  207. ) f. Z* C" c2 T; V8 \
  208. exit1:                              ;error exit# f( }9 {2 |& ~
  209. mov ax, 0002h9 W0 i+ z* {9 J) H  O1 I
  210. int 33h. e  s5 v, I& z; E) M
  211. call  cleascr
    + ~7 o  x; @( d. ?& V+ G1 U, T8 I
  212. call  oldint" I& D# O4 F# M0 ~2 u# w
  213. mov ah, 4ch8 c- k- @, Z5 P) @
  214. mov al, 01
    4 U; @% b: y" h1 \
  215. int 21h
    ' `4 x$ u8 _7 ~8 z0 `% d6 W- }

  216. 4 k3 X) {* ^' n; T
  217. cleascr proc    near                ;clear screen- ^* p, G& `. x* n' L
  218. pusha
    1 {4 j0 R* ^; P0 [
  219. mov ah, 06, r. a6 @, ], y) x# R& I# Y/ j
  220. mov al, 0
    1 u' M3 w" v* s' U: P& |1 r" p$ E
  221. mov cx, 0/ ]* G4 ~4 t" S" U$ ]& d
  222. mov dh, 24
    ( x6 ?9 V% a7 e
  223. mov dl, 79" f+ T; N8 N2 N' V9 Q! G( B, j
  224. mov bh, 07h& K# r2 P1 @8 ^) |  _! g
  225. int 10h9 s1 X; I6 `, R. e1 Y8 L' t/ w
  226. mov ah, 02
      w" r8 G, o7 D2 o) g* O* ?
  227. mov bh, 00
    6 ?/ ~6 a% S1 H" ^
  228. mov dh, 0, x) W7 V1 R, t- }
  229. mov dl, 0( p! |/ s9 {& [" j5 `
  230. int 10h
      l6 t$ R! e! R( ~
  231. popa" T/ |6 ?; ~* L+ b4 ^
  232. ret5 t- ~+ C: P  l0 k  a1 r5 J
  233. cleascr endp
    ' q8 i" H6 s( @. M) ~/ z& L. Y
  234. % a' |& \5 E; g2 E0 N$ a5 E" Z
  235. showmsg proc    near               ;Show info  b  X' U- E# k0 Q. U
  236. pusha
    0 I( f! c# ~$ |( h- h3 q
  237. lea di, offset showms. Q; ?" ]/ F& e9 v9 y
  238. mov ax, 0b800h
    ! |( ?$ X  C6 S: p" [
  239. mov es, ax8 x  D9 ]4 |, Q# g
  240. mov si, 0
    ; w. \; k0 D1 U/ W# B
  241. mov cx, 480/ ^  l+ H) R3 l& i
  242. mov ah, 07h
    , _, L! N( T1 O8 B0 n* I
  243. @@:$ [4 T9 N; k! [; L+ w/ F! X  U
  244. mov al, 20h/ e/ D* Z( m1 Q$ z& ^
  245. mov es:[si], ax- ]# S# z( o4 o3 x; e5 z3 s- U
  246. add si, 2
    " B) M) G# w7 G$ w6 Q3 Q
  247. loop @b
    ) ]$ V' \, }4 b7 l) }0 \+ Q
  248. mov cx,880; N3 f4 ?. R& K. C8 [& s; a" W
  249. @@:2 V+ g/ u: _: A+ }7 t! p
  250. mov al, [di]0 F7 ?9 f$ `+ Y9 k$ a( f* J% F
  251. inc di" t, h! p$ Q1 W8 l( v# W4 `
  252. cmp al,20h' _0 R  f2 s/ q) z
  253. je showch17 T3 ~4 }8 k$ E2 r( U
  254. mov ah, 17h5 L3 w1 H5 W0 j- k% U7 r
  255. jmp showch3
      }2 X( y( w  O4 z3 g) v
  256. showch1:
    9 u8 k8 [( s, f# W
  257. mov ah, 07h
    % c  ]( @5 W: U/ `. c) R, H
  258. showch3:
    , S. D8 ^. C8 p: }
  259. mov es:[si], ax
    / s  o  f+ q7 h6 z& N1 O  l: }5 `
  260. add si, 2, E# R1 B! |; j, p! Y
  261. loop @b8 y/ P$ H3 B8 a( U# I
  262. popa
    # a( U* S9 d9 b- W% T0 r
  263. ret8 ^" ]% n9 W$ o" p" w$ Z* H
  264. showmsg endp
    ) X0 O% {2 K! F7 F
  265. % D+ w+ O$ D) M
  266. oldint proc4 J3 _. o; @8 \/ w
  267. pusha$ i0 h" T6 c, \3 S$ J4 I6 o
  268. mov ds, word ptr cs:[old331]
    # L+ w5 P! I$ O- `
  269. mov   dx, word ptr cs:[old332]( j# \; [1 b* ^0 G# p+ o& H
  270. mov ax, 2533h
    % L5 A8 a) s" O5 Q, c
  271. int 21h
    - s9 b4 J# q" |  F/ u8 x/ d  i. O
  272. mov ds, word ptr cs:[old741]( C# F$ b0 F# m  w, e: {* r) p
  273. mov dx, word ptr cs:[old742]
    + O: J, L, Q, d$ o. }  D1 U
  274. mov ax, 2574h! r. N- B7 U( m& R* Y" ], {
  275. int 21h% R4 p' K  j: L- Q5 _2 J1 }
  276. popa" v, W- ]2 }9 e  O! i- X6 p
  277. ret
    : ]5 }# \: k+ U) N$ r
  278. oldint endp( G* d' T/ L$ @1 c
  279. : m4 S: M6 Y+ R3 D3 u1 x' W
  280. memmouse        proc
    - l& S& E, P/ l3 [7 p
  281.         xor     ax,ax4 f/ f* A+ s0 C
  282. int 33h( [; O2 H+ g0 P# p
  283. cmp ax,0ffffh
    1 b! S' p5 I5 a0 g
  284.         jne     not_loaded
    & e/ W8 h* A; F1 d+ d  d7 R
  285. mov [memcopy], 1
    2 j3 G( n0 I/ ]
  286. ret- o) N' E- x& u! S& ^

  287. # `/ u. R) V3 ]' }  ^5 r
  288. not_loaded:6 g# m+ F. V" }% }1 \/ q
  289. 4 n6 W% Z; |# z0 W1 ?
  290.         mov ax,2574h
    ! i& \5 s& T1 P8 M
  291.         mov dx,offset new_isr
    ; ]# X) l7 v& p
  292.         int 21h1 E3 ^" w3 a- t

  293. . C, Z$ O; V1 @9 Y, Q' ]
  294.         mov ax,2533h$ q& ]7 Y% ^% b8 f
  295.         mov dx,offset new_33' s& \0 f+ o- Z! M( F# V
  296.         int 21h
    ' ~% F  W. Z$ q! D" M' {

  297. 2 {( K# z/ J5 a7 y
  298.         cli
    0 [  \+ R' x5 x5 W+ ?+ {

  299. * e& g2 j" |. s5 g
  300.         mov bl,0a8h
    : a) P! P; M! [" V
  301.         call keyboard_cmd0 ~% U* H, M0 \' ?
  302. 3 p; a" W* o) u. f$ ]" Y
  303.         mov bl,20h9 X# }+ ~8 I% E' {3 D
  304.         call    keyboard_cmd
    3 u+ Y/ M3 t8 d
  305.         call    keyboard_read
    / [3 k1 g& z- W4 Z0 g, T6 u$ L6 ?- ]; \
  306.         or      al,2% p. a8 ?+ b* E: K2 s
  307.         mov     bl,60h
    2 X+ G8 L7 d  Y# T0 S8 c
  308.         push    ax
    # G3 p' Q% n5 X& J0 T/ L3 j
  309.         call    keyboard_cmd
    / l  O( f1 h3 y! |  e- g
  310.         pop     ax6 @! y6 {# `+ M
  311.         call    keyboard_write
    6 t% ^( l0 [, ^$ t& b/ I# Q6 J0 _7 y

  312. # E& m. \9 r: v! ]- c8 P
  313.         mov     bl,0d4h
    # b+ Y% i) I; i) W% f) Z: O
  314.         call    keyboard_cmd
    & V! o- r: @/ s! A
  315.         mov     al,0f4h
    , C5 F5 a, F* v0 _9 c
  316.         call    keyboard_write5 B/ g, k0 W+ m& I: @6 r& ~

  317. 9 D% o; O  X4 j+ m
  318.         sti
    ) ^6 {2 E# V. g% P( t9 S( h
  319.         ret. M! X0 s# f5 G" h4 \
  320. call_user_isr:: }% d' K1 ]( m
  321. db      60h
    - M1 u6 Y& l3 v) D
  322.         mov     cx,cs:[pos_x]
    4 m( q' j1 p9 ?$ j9 }; G
  323.         mov     dx,cs:[pos_y]; W4 m! U$ o4 T* C, ~
  324.         mov     di,0 ;cs:[x_move]; J' {' e& W% ~
  325.         mov     si,0 ;cs:[y_move]1 D4 I6 c7 P* E3 o+ t: a
  326.         mov     word ptr cs:[x_move],08 _+ @6 b. I* X" c. p5 p2 R) h( [; `
  327.         mov     word ptr cs:[y_move],0. F9 p; U; a7 h5 b1 w
  328.         mov     bl,byte ptr cs:[buttons]; s/ u! E9 J$ A+ d5 K9 K6 |; _
  329.         xor     bh,bh% C. i& i. x' t
  330.         call    dword ptr cs:[user_subroutine]) i. @5 \: f) ]& x+ X4 a: l# P4 P
  331.         db      61h. e, N2 i& K1 ~2 K/ ~% `6 t% Q
  332. ret
    - a# c5 e, _1 r- z
  333. new_isr:( h  H( M7 w& m/ q2 ?
  334.         pushf
    3 A* p4 t& ~/ s
  335.         cli
    4 x7 M! Q- A# k
  336.         push    ax
    & a9 ^' a+ B8 M" b' y
  337.         push    bx) M8 v, e: V6 [- o5 f' X
  338.         push    cx
    3 r/ A* L$ v) K2 [. l
  339.         push    dx
    - i4 c4 d7 D. s( B7 s; q
  340.         push    di! R* [" C1 T' g4 b1 g
  341.         push    si2 e6 h0 y" @# y' f, G+ E
  342.         push    es
    6 v8 e/ C( G/ h# ~
  343.         push    ds7 r! M4 C" e0 h/ y% z
  344. * w# \5 m. v: ]0 M
  345.         push    cs
    $ s4 ?; z1 Q0 x  b8 b
  346.         pop     ds
      q6 H# S4 [8 g0 m) M4 i8 M

  347. , ]# S) x0 x: o
  348.         mov     bl,0adh
    ; J* f5 L1 j7 e4 m% N* K& t
  349.         call    keyboard_cmd" ^4 Z6 S5 y# n1 P$ D
  350. ; u# U) `7 O. n- ~4 L
  351.         cmp     byte ptr [first_time],0- L* |* P% E: c# F. g# ?# F" r
  352.         je      not_first_time7 N* c, R0 ?# c
  353. / f9 Q. W/ U6 v! p
  354.         mov     byte ptr [first_time],0& {9 I+ \- N- H9 z
  355.         call    keyboard_read- _- R2 R  v. u/ c* i
  356.         call    keyboard_read
    # ^. q" D# O* `! x2 w
  357.         call    keyboard_read/ k- L, z9 O5 Q+ m; Y# B& L% r: ~; D% V
  358.         jmp     no_show& l+ b" H+ I; p2 z8 o& I4 _1 z
  359. * k: E. Z# o- E4 c+ {* R
  360. not_first_time:. K  k  ]: r3 m3 w" B. Z# [" N2 J
  361.         mov     word ptr [temp_mask],0  a( u; j8 \! L

  362. 0 \: G7 ]; {. R/ O3 _% D
  363.         mov     cx,[pos_x]
    2 q8 `# i# l3 Q" b' Q8 _8 Q5 F7 P
  364.         mov     dx,[pos_y]
    # |1 I/ y4 {. Z) e8 Z

  365. ' e, h) b) g; R
  366.         call    keyboard_read
    8 \& ^: N, P- I# f" g" X
  367.         and     al,7 ;3. [) H& Q6 i/ A# X
  368.         mov     ah,[buttons]
    & q& n3 c2 E; K' f) A1 V1 i
  369.         mov     [buttons],al
    ! W. l! @, \7 g
  370.         cmp     al,ah
    6 x9 q. a' g" _% a$ |
  371.         je      no_button_change
    3 |0 i$ g! n& T9 o- @3 N
  372.         and     al,3; p$ t" O* J3 A4 I4 k& M: h9 V% P
  373.         and     ah,31 W" p3 Y$ ?! a5 L
  374.         xor     al,ah' f  H% H; g) q% s9 K) F
  375.         xor     bx,bx  T$ [4 {) u/ y- Q% t
  376. , j0 z/ R' I7 S) _3 m7 A: `
  377.         push    ax
    . ]' T$ d8 @# \$ m3 K% d% h) L
  378.         test    al,2( |) |% j; v4 N' H4 _6 N; F/ t- f% U
  379.         jz      no_right_button_change
    - N! g) |; _" L( O
  380.         and     ah,2
    ' e: {" q3 M) H& T( k
  381.         jz      right_button_pressed# W7 T6 f, q) h# C# F& ^
  382.         or      bx,16
    , P) V' ~$ a0 N  X6 ~7 W* G
  383.         jmp     no_right_button_change
    / A% Z- y0 k% A9 }5 u
  384. right_button_pressed:
    3 x% j+ h0 k3 r8 O0 m- ]
  385.         or      bx,8
    . M" o, L( T" h% N/ h( a
  386. no_right_button_change:( j4 D2 x8 S; D7 L4 Z8 C
  387. , k) m0 P( O% p: K- @) {
  388.         pop     ax( }: k$ v. z8 ?- U. f

  389. " N1 k4 P; q( ]9 L: @6 n
  390.         test    al,1
    9 n2 @; m4 h0 P- W1 r. z: i
  391.         jz      no_left_button_change
    9 U8 V9 E) L' ^$ H* Y* ?
  392.         and     ah,1/ `& c  b1 P1 Z& v/ O- N+ l0 r. A
  393.         jz      left_button_pressed4 o( [& \; r5 V1 p
  394.         or      bx,4, B; Q4 i9 s9 m7 v6 L  N( \
  395.         jmp     no_left_button_change' t9 x% ]/ a* G" |% Z! [$ _
  396. left_button_pressed:, e: g1 Y7 u2 a' U5 ?4 O3 p3 Y, p
  397.         or      bx,2
    - v8 H0 W( o- }
  398. no_left_button_change:
    ; V- n6 c4 {' N. z% ]# K

  399. - O8 g' ?  }! C$ T3 g5 ~
  400.         mov     [temp_mask],bx' x% s! X, x+ n9 T! i! ~# \/ Q. [

  401. ( Q. [, C2 B% H! x
  402. no_button_change:
    + o1 o' I& f1 O, m
  403.         call    keyboard_read, x( {% m9 e6 o/ V+ K  T$ A, k9 r
  404.         cbw/ J2 X1 j9 e3 g: O" d5 X
  405.         add     [pos_x],ax4 f( [1 H- `4 i  ^- V( P
  406.         add     [x_move],ax
    & W5 u% I' X2 g1 x# E, ^+ O
  407.         mov     ax,[x_min]
    ! d, z5 ]. p# [) _1 F3 M+ i
  408.         cmp     [pos_x],ax, a% @4 h7 ?6 c5 v- E! Z
  409.         jg      good_hor1
    ( M: K2 o; Z! m. `( [9 Y
  410.         mov     [pos_x],ax+ K, @1 ?3 R0 \8 A3 T
  411. good_hor1:
    9 O) S* C; s% a- Q" m
  412.         mov     ax,[x_max]3 O4 B; t8 l0 p% J1 ^; r) J" Y
  413.         cmp     [pos_x],ax: l8 h8 x& Z3 B. c
  414.         jle     good_hor24 B- O7 q: g5 _! ]1 f  T
  415.         mov     [pos_x],ax
    : I( I* X2 A5 a3 r6 M3 K( |( N5 h
  416. good_hor2:
    7 e  d0 r1 x, V# r; y2 D5 L

  417. # r" v9 N5 X- i. A& V. A+ ~
  418.         call    keyboard_read% g1 p/ d; ^6 p9 V; T
  419.         neg     al0 `0 g7 b& {; p; R: }3 M6 T
  420.         cbw
    ! o7 j$ }( N8 O' |3 |) W
  421.         add     [pos_y],ax8 `$ w- q3 F( s2 G8 k! R6 q
  422.         add     [y_move],ax/ a$ J; d* `5 b" X- f" l* w
  423.         mov     ax,[y_min]5 A, G+ x  E) `/ r# \- U$ P
  424.         cmp     [pos_y],ax8 i3 y% R$ ~  w4 }  y) E  e
  425.         jg      good_ver1
    , T! n! c# X, Y* B
  426.         mov     [pos_y],ax; K8 L+ Z7 L/ Y) R
  427. good_ver1:2 ?; A, P- G5 C# p9 A7 H- L
  428.         mov     ax,[y_max]+ K% o5 K0 t+ v. i8 d
  429.         cmp     [pos_y],ax0 k8 p% n" Q  a7 Y* |: x* C2 i
  430.         jle     good_ver2
    ' H1 C. X  r7 s
  431.         mov     [pos_y],ax
    ; b  B! ^* ]3 t* l7 j+ a
  432. good_ver2:. q+ ?1 k8 V! m. M

  433. 3 v8 n6 K4 _+ D$ v
  434.         mov     ax,[x_move]
    ) T! {8 L$ L9 \9 b
  435.         or      ax,[y_move]& l, [, ~- }! N& Q
  436.         or      ax,ax; x, g/ @1 d, `5 f! b4 n
  437.         jz      no_change_position
    ! a$ ]% O% L! @3 B1 O; R2 ^
  438.         or      word ptr [temp_mask],1
    0 X% `! h8 Q+ m' D- ^4 F
  439. no_change_position:% ]/ Q7 u! [+ i+ p! N
  440. 3 g( K+ ]1 b( c' Y1 o
  441.         mov     ax,[temp_mask]2 }+ m# {* m/ k6 {; K
  442.         and     ax,[user_mask]4 u! ^, ^0 `9 r/ `' N
  443.         jz      no_call_user: r! v) z* H6 p7 [% v  a' C3 ]" r# _
  444.         call    call_user_isr) o% _! J" B8 D" W( ~: W
  445. no_call_user:
    * O5 {* |, b. S  E9 D0 P: j% }
  446. 7 q8 y. Q* N% r
  447.         cmp     byte ptr [sm_flag],1
    + w) i( x: ~- O, X+ S, W
  448.         jne     no_show. q4 x2 z0 K" U9 \

  449. ! I& r5 Z2 o9 C$ j9 u
  450.         shr     cx,3
    * Q! j( l$ _- n( o+ @# J' }" X
  451.         shr     dx,3; K+ ~: L. s: @8 K
  452.         mov     ax,808 a. W8 ~/ f# z  V* u
  453.         mul     dl+ |# j' u5 \8 A1 K- \
  454.         add     ax,cx
      f# s: S& C- V7 F. W( b
  455.         shl     ax,1
    2 A' v+ A& ~7 r  w, }! h
  456.         mov     di,ax, }* c0 X# L4 i5 n$ f) g9 b3 U1 R
  457.         mov     ax,0b800h
    . a' D. u) T+ H9 Z& f1 Z
  458.         mov     es,ax
      m, i  l( `5 u9 l
  459.         mov     ax,[save_char]. [& S; R8 _/ {8 d; P# Q# i
  460.         stosw
    ' {* y5 I; P5 o4 w  ]

  461. ' r% B4 ~1 c! J% }
  462.         mov     cx,[pos_x]
    * w& j' d5 {  ^6 _3 t: S* `3 L
  463.         mov     dx,[pos_y]
    % p! `8 X- ?" }
  464.         shr     cx,36 p8 W( T; d( v/ l' W
  465.         shr     dx,3
    ; w; M+ z, K5 `9 i+ b, o
  466.         mov     ax,80
    ' y: ]6 I, E2 \0 L, ]6 d6 c1 m, Y
  467.         mul     dl
    ( c, ?" a/ e( Z& |7 ~
  468.         add     ax,cx% x3 B1 ?/ [, Y1 S
  469.         shl     ax,18 d2 o# m& ~; X: I1 }  b. E
  470.         mov     di,ax
    ' z* s7 e* o4 K" U$ b* x( n0 }
  471.         mov     ax,0b800h
    8 K( v3 g; |/ e( X# S! C' y1 z
  472.         mov     es,ax8 @+ e' q/ v, [, b
  473.         mov     ax,es:[di]5 K1 w! A9 K: z: N- ~7 |
  474.         mov     [save_char],ax0 m2 `4 J! ~% M# I+ i
  475.         not     ah  |7 D1 g$ ~7 }! A5 U" t
  476.         and     ah,7fh0 J, X( b1 n, Y5 M3 z
  477.         stosw) @8 P0 M5 }4 k0 H" A; R( T5 ~
  478. no_show:
    % `; w. e+ j2 k2 ?% [- R5 b- o
  479.         mov     bl,0aeh% Z5 E( u. i( i
  480.         call    keyboard_cmd% L' p6 C4 U& `& W: o

  481. - v1 @% F9 b+ m  s/ q$ J* C
  482.         mov     al,20h7 q$ {3 u5 M: N! t. y" j" |2 p" j
  483.         out     0a0h,al, l: b  b) R. S0 T" C3 k; d, D
  484.         out     20h,al
    0 h/ q  [) G& }2 a
  485. ' R+ y5 d' J! o' d
  486.         pop     ds
    / e; C/ h8 J4 k0 V' }
  487.         pop     es
    & i3 M+ o; g5 }3 F: B
  488.         pop     si; ]1 X9 Y$ l( Z+ e
  489.         pop     di
    # p4 t7 z5 x0 Y  B, |1 u4 X* I
  490.         pop     dx
    ; k+ A. K* U" O+ m" x
  491.         pop     cx$ C6 B$ m; ]2 E2 ]3 Z
  492.         pop     bx
    # e" N& d* P! O9 Y2 Y: K" d
  493.         pop     ax& I" y' n$ K9 ~+ W. j. l% r" `
  494.         popf% k" X# _* z( R9 P; N  s4 \
  495.         iret
    ! O' U: `" _/ B6 _' b. l. [; W% U5 \

  496. ! v7 b, y$ M+ `: U8 S! K1 @" U
  497. first_time      db      1
    ( M$ u* p! f& C& p; W( r2 e
  498. buttons         db      0
    - t; P0 C7 t+ N9 R' x% C
  499. pos_x           dw      0$ h1 C' M" a# W. ?1 m8 a9 o
  500. pos_y           dw      0
    , [, ^1 l3 l/ g3 s5 [
  501. sm_flag         dw      0
    6 x0 E) G5 d" W. ^8 T/ u
  502. save_char       dw      0
    ' K* [- r9 u4 ]2 [; Z
  503. x_move          dw      0( J/ p( [+ [; n
  504. y_move          dw      0
    , r% S. ^6 u% m8 X9 P! `9 ^4 I
  505. x_max           dw      639
    1 M6 W3 a' K; [. a/ v# W
  506. x_min           dw      0. U, I0 J1 {. D- U
  507. y_max           dw      199
    & {, f. j* D# i0 v6 q2 `$ \
  508. y_min           dw      0: W( L  S) K+ k) z
  509. user_subroutine dw      0,0
    / E* U0 F: T. f- R) U
  510. user_mask       dw      0
    0 Q! `* O4 m6 m& B6 ?- [  t2 F
  511. temp_mask       dw      0" l4 r2 C% ?0 Q* e3 W) i- i
  512. 1 k, j  d: I9 O/ Y
  513. keyboard_read:
    9 X1 F; ^4 o8 ~7 L; G3 e3 p  n7 D
  514.         push    cx
    , D0 U: P7 G% J8 T
  515.         push    dx
    4 j1 M! V3 u. ^$ u  ?
  516.         xor     cx,cx5 `& K. h, t$ [' _. d
  517. key_read_loop:
    ! }7 [. Q. ]  s6 ]+ D* G9 u. w! f
  518.         in      al,64h
    9 l5 q0 \$ I. h; F; R5 P& f
  519.         jmp     $+2# k1 i9 K- v0 [. ~
  520.         jmp     $+2) w5 O$ J- {- @
  521.         test    al,19 Y: N7 E& x. l: Y! g( t
  522.         jnz     key_read_ready
    2 Q8 I$ S3 n$ p& [) d
  523.         loop    key_read_loop
    / b# I3 W6 }# _/ U
  524.         mov     ah,1* Z( I$ N8 q& X2 H
  525.         jmp     key_read_exit
    $ U% q$ V, \. Q
  526. key_read_ready:
      H/ c* r, Y7 a, C7 B( N
  527.         push    cx! w+ \1 T0 W1 K
  528.         mov     cx,32
    4 F( A) y+ k8 i
  529. key_read_delay:
    % l" E6 C! g5 e& k, C
  530.         jmp     $+2
    1 m* f" t! F; z
  531.         jmp     $+2
    ( F" e$ F6 D: ^& V
  532.         loop    key_read_delay
    # [, V9 Y# d; F( J- ?: o
  533. 4 d5 e# b5 u: x7 j
  534.         pop     cx. Y( v: ?) o* X' x3 R

  535. 3 X' D8 P2 n! f% ]- t
  536.         in      al,60h
    ; H( ~: K2 {- E8 P
  537.         jmp     $+2
      N; r7 z4 k, W
  538.         jmp     $+29 R+ S4 N, p! L' P
  539.         xor     ah,ah0 i% c! U0 w4 _4 P8 q9 w* m
  540. key_read_exit:  J" b+ e; N' q* i, a1 H
  541.         pop     dx
    ; a3 J6 l3 N- |. W% V
  542.         pop     cx
    9 y5 ^8 f' m% M+ _# r  @1 W! f
  543.         ret
    ! t+ P+ [' d, h/ A& i3 S9 K6 \

  544. , k: ^4 I# Z' f9 m! N7 j5 ]
  545. keyboard_write:4 f# q. L( [% s3 z
  546.         push    cx
    " `+ T8 b, Q( \8 d! l
  547.         push    dx0 G. }; e- j% s
  548.         mov     dl,al
    7 p& M0 |) ^, B; T7 p6 N& ?$ S
  549.         xor     cx,cx+ c! h  v" o! w; I' S5 _: B: Y! {
  550. kbd_wrt_loop1:8 S  D' u$ N  K/ X4 M
  551.         in      al,64h
    ; U$ j% ~6 k+ u7 J! d2 k
  552.         jmp     $+26 D6 M$ f1 K+ u( l( c' V+ H
  553.         jmp     $+23 R% \9 P/ ]! M# Y) T- C: i# i7 r
  554.         test    al,20h, H1 L  r! Q  U5 s# B4 h# I
  555.         jz      kbd_wrt_ok14 o8 N! A1 m9 K1 n6 `

  556. ! J. }4 W0 o* g, D
  557.         loop    kbd_wrt_loop1
    4 O  ]2 k% r& y9 p
  558. 0 M* z- O' M3 x% J8 X9 U* L
  559.         mov     ah,1
    7 H* P) v7 `. h
  560.         jmp     kbd_wrt_exit6 B# u; y6 H. G& z4 L' r

  561. 3 l1 K) L7 ]2 |5 r9 E5 ^3 k
  562. kbd_wrt_ok1:) B3 H/ `: M9 s# t5 P: h' n! d) q- w
  563.         in      al,60h+ X. o7 j: T/ {# J

  564. - u: L  e7 m0 J/ I! ~
  565.         xor     cx,cx
    $ E2 @) m: Y& g9 `6 F: G! p
  566. kbd_wrt_loop:! K+ G: J! k  X* C# Z
  567.         in      al,64h/ u) A! g- }4 K! u. T; g
  568.         jmp     $+2. b8 v  b/ ]8 }' o
  569.         jmp     $+2
    0 T. H! ?9 y. H- y, j. t# W* y
  570.         test    al,26 I+ d6 Z/ j8 R& r2 H
  571.         jz      kbd_wrt_ok* I- z* ~" T% ?, E6 @: D! n8 {
  572. # g) u/ Q' @' O
  573.         loop    kbd_wrt_loop7 @' s6 E% P0 f0 Z9 ^; k& ]( w* m

  574. & I+ L, P1 p2 v. `; P; q
  575.         mov     ah,1$ I$ D5 O$ Y% b2 S' l$ j
  576.         jmp     kbd_wrt_exit- n4 L8 u  r) j# ~3 A6 Y$ u0 k" G
  577. / p4 B& ?% F1 n' a3 g* R
  578. kbd_wrt_ok:. G) }6 U0 V$ R, T' V5 u1 z* W
  579.         mov     al,dl
    8 ?% U8 H9 y/ H9 @( ?
  580.         out     60h,al
    ! M: G0 F9 Y" G3 S' v
  581.         jmp     $+2) `7 u' _3 p; l7 o, _! I  V. K
  582.         jmp     $+2
    0 u- z  C- [- M4 [  f6 R: w$ H

  583. 2 X. h* Y0 g% L2 r8 B7 @% o. T- y
  584.         xor     cx,cx; A% d! Z2 d' X( t  {
  585. kbd_wrt_loop3:8 O" J/ n% i$ Z; n* W& M* b
  586.         in      al,64h3 P; X" P# |+ h1 z) X
  587.         jmp     $+2: C& I5 `$ S7 v3 |
  588.         jmp     $+2% }* L9 q: n% U5 ~& h
  589.         test    al,2
    2 M/ A1 N( K6 B  B& l
  590.         jz      kbd_wrt_ok3
    9 q7 l0 j2 m. n3 t) i) B
  591. 2 U+ _3 Z" ^% g" S' b" l* a
  592.         loop    kbd_wrt_loop3
      R6 \) c+ K' ~, w8 Y
  593. - G: g7 a* \; r! k- \1 Z& l; L0 {
  594.         mov     ah,1
    - k) l( }: h  i) k# w' ~4 {  B1 d
  595.         jmp     kbd_wrt_exit6 h  w2 `9 |9 U4 {5 D  K# w

  596. 6 B' Q) j# _/ j9 \
  597. kbd_wrt_ok3:
    4 v0 i. l( x3 b- I+ w. Q
  598.         mov     ah,8- j8 \- h4 ]( [1 ~
  599. kbd_wrt_loop4:
    % O/ G8 v2 a9 ?5 i2 c+ v4 \4 D
  600.         xor     cx,cx
    5 s4 p) z2 S3 b. b, }; a& l3 D. V
  601. kbd_wrt_loop5:! \+ {' X$ o5 k- H: W
  602.         in      al,64h
    8 j8 }8 B& A) ]- r/ Z3 ?  B
  603.         jmp     $+2. L0 ?: P7 ]2 |. {  z& `
  604.         jmp     $+2# @' L& B; l! m( F2 P
  605.         test    al,1
      b( L+ t* U8 E' z9 S4 J3 M
  606.         jnz     kbd_wrt_ok47 ]! h8 G2 Q2 H* @
  607. ) O5 K# G4 a) b4 h- j
  608.         loop    kbd_wrt_loop5
    4 ]3 M; E6 a$ y1 W& |- w2 y

  609. ' }3 P3 z/ b7 M. S4 R& H! ]
  610.         dec     ah
      v+ l0 I3 t+ u4 T
  611.         jnz     kbd_wrt_loop4
    . W6 M4 [0 b4 N$ W

  612.   c$ k# W) q- L
  613. kbd_wrt_ok4:! D+ K# w% J# N
  614.         xor     ah,ah
    $ e" o7 q% D" x2 Y( g. W
  615. kbd_wrt_exit:
    $ W5 H% U# n5 T* c
  616.         pop     dx2 G: V6 Q" F: t# C
  617.         pop     cx
    6 [7 L; B5 E5 p
  618.         ret
    # ]$ x8 z& k, _! L( ^$ }
  619.         9 c0 b; g8 K/ r, @2 H
  620. keyboard_cmd:' c% I$ V2 X+ y, j1 C/ X
  621.         xor     cx,cx6 Y* T1 {+ E) }+ `# j
  622. cmd_wait:
    % L2 w! O6 P6 r* F* y) ?
  623.         in      al,64h
    - N1 B# V  e& d9 E2 ?6 l4 a% ^
  624.         jmp     $+2
    9 ^' _" Z! }, O7 S- r# w, H
  625.         jmp     $+2
    3 b1 i) e& u7 ^; K
  626.         test    al,2
    $ F' e4 b% u" v, g0 G
  627.         jz      cmd_send
    ( v! \8 ]5 }; _! y% X& W
  628.         loop    cmd_wait- V+ K9 v  A; \- O; a' b0 Q
  629. * S$ R) ~* R) z9 V
  630.         jmp     cmd_error
    ( c) ]. f/ h3 A- m+ @8 i7 l6 ~
  631. 7 ]& Y" |2 i+ ~+ z- n% m3 Z
  632. cmd_send:8 }% a. H* g% g3 A! r$ z  N
  633.         mov     al,bl
    & N1 v+ ~9 ?- Q0 M
  634.         out     64h,al7 n. w7 H& x6 N) |7 O  o
  635.         jmp     $+2
    * g2 v7 y8 }# D8 d) ?! H
  636.         jmp     $+2; z0 E6 b0 K+ o. R% \, K
  637. ' }9 \* q0 K# S: M" R. @0 g
  638.         xor     cx,cx+ Y5 w; o$ E& k8 A/ o
  639. cmd_accept:4 }  |3 d2 _9 u) B3 E
  640.         in      al,64h
    3 O. a. n0 T9 \: m' r
  641.         jmp     $+2
    $ ~) ]- E+ w. J! }0 g
  642.         jmp     $+2
    ( e3 c3 G$ F2 c1 |! @+ |; k
  643.         test    al,22 B# r: y9 u% v' ~0 n7 I
  644.         jz      cmd_ok
    6 N! D: n5 d* |( c9 v& o# Z
  645.         loop    cmd_accept" z. ^2 r' C9 L

  646.   t/ S& e/ Z  n) J& I! f
  647. cmd_error:! @0 P; F- h5 X. t7 j: E7 w  }% E5 ^
  648.         mov     ah,1& A; ?3 s5 Y* }% m
  649.         jmp     cmd_exit% [& X3 \- |$ A) `% z
  650. cmd_ok:1 p2 J, d; c2 q. i# t+ k
  651.         xor     ah,ah. `9 `3 I& Q2 d7 G% l+ A# G
  652. cmd_exit:5 L% B: \  b( G6 @0 |5 M
  653.         ret* L9 x' m- K. q% ]/ k) G4 {( d/ v

  654. 4 E8 T0 y. B% x; I' l+ v% S4 r
  655. new_33:
    - @8 h, y4 M1 q# c$ r* z3 H
  656.         cli& E- N4 J/ ?2 m; w) u9 E
  657.         cmp     al,0
    5 ^2 D$ S" J' ?0 W
  658.         je      reset_mouse  ^) M: T+ i# _* `, h. U
  659.         cmp     al,1. e& z3 b$ H5 }$ @# A
  660.         je      show_mouse. @) H  {# }3 p
  661.         cmp     al,2
    % _( W' Y2 x, y9 b" F2 u- [
  662.         je      hide_mouse) m( d. S. ?$ I2 G* U$ t% |
  663.         cmp     al,3
    ( C3 P4 ~1 J# L
  664.         je      get_pos
    + D! z/ `* e1 T! S) b
  665.         cmp     al,4
    2 v& e( ^6 ~. K. s8 u+ f& {- E3 N
  666.         je      set_pos) ?8 s" I9 ?1 W- A( s, h; j! c' e
  667.         cmp     al,7
    " V& l' \: I' w. P9 a. c3 }; X9 J9 {
  668.         je      set_hor_pos" S8 d* L5 k" \; Y
  669.         cmp     al,8- ^1 c) i  B% x2 R( V. \# E- a  A
  670.         je      set_ver_pos7 X4 N2 k! }& m$ e) {
  671.         cmp     al,0bh" q* ~( e& j" H3 ~% I
  672.         je      get_mouse_movement
    + T2 L# {( Y) m2 f6 Q
  673.         cmp     al,0ch
    1 n; D! O- d6 b1 I- I, ~
  674.         je      set_subroutines
    0 |% E% a- R* V! I+ |. m
  675.         cmp     al,14h! L: U! H& Z3 m! `% ^& M; A9 K9 a* w
  676.         je      swap_subroutines
    : t5 _- b# e! M4 Z2 g
  677.         iret9 v5 [4 x/ j; _8 }  W1 W

  678. . e' k9 x6 A. s* Q4 i
  679. reset_mouse:
    + g* D) p8 z6 [' U
  680.         jmp     _reset_mouse
    # ?. r- J, K) k9 o  b2 A! k
  681. show_mouse:" B% r4 m! D. k
  682.         jmp     _show_mouse/ k% A: @! q) k- R3 ?% z
  683. hide_mouse:
    7 T& r4 d  }0 I6 C4 W+ |, U
  684.         jmp     _hide_mouse
    0 |4 V: o' I* a
  685. get_pos:2 H4 t! y& |. [- A/ K
  686.         jmp     _get_pos" x+ v- h) F1 r; c$ p6 n
  687. set_pos:
    # \' U- {8 U0 D1 ^- @- x' d5 X
  688.         jmp     _set_pos
    , c7 i4 W$ [' y( j9 Y- a
  689. set_hor_pos:
    + N8 v: S% Q& K
  690.         jmp     _set_hor_pos
      `" m0 r  m" _
  691. set_ver_pos:5 Q/ @6 S) G! n0 ]; _; E+ j
  692.         jmp     _set_ver_pos
    # n* E" g+ r: J5 P
  693. get_mouse_movement:
    ; o3 b% V7 G3 `3 i) H
  694.         jmp     _get_mouse_movement
    0 F! t8 W+ f9 {# P) J
  695. set_subroutines:3 e  G7 G! S* c  z
  696.         jmp     _set_subroutines
    + H  N8 O8 N, a  y
  697. swap_subroutines:
    / V, d0 h$ [; Q% a$ j! @* d
  698.         jmp     _swap_subroutines) b4 h& O" s8 H0 b% J

  699. + r. |/ ^  x0 z* f* T) E. i
  700. _reset_mouse:
    ' R+ p9 C# ~% ?5 h# R5 `& M. C
  701.         mov     byte ptr cs:[buttons],0
    # k2 U& d& F* J( p1 M
  702.         mov     word ptr cs:[pos_x],0
    - Q* z+ W# @; F+ _% R
  703.         mov     word ptr cs:[pos_y],0
    * l, m* ~6 F! N) L# O) V: K
  704.         mov     word ptr cs:[x_move],0
    8 Q. F) y6 J! ^
  705.         mov     word ptr cs:[y_move],0
    8 m- E0 t  C8 W( F4 D8 U
  706.         mov     word ptr cs:[x_max],6394 F4 _0 m8 N; M
  707.         mov     word ptr cs:[x_min],0
    ' G7 c# w  C3 A/ k" Q- n2 H. `. F/ w
  708.         mov     word ptr cs:[y_max],1991 M3 P, T! x( C3 y2 W- M* Y& N; W
  709.         mov     word ptr cs:[y_min],02 w: D6 j; `2 @+ z1 u# g; t5 J, G
  710.         mov     word ptr cs:[user_mask],0
    6 a; w& `$ D1 s8 ?, n2 ~# v; X' u
  711.         mov     word ptr cs:[user_subroutine],0: C' O1 Z9 m' I6 a* U/ a2 t
  712.         mov     word ptr cs:[user_subroutine+2],0
    6 V- Y8 k4 i. `" S4 e
  713.         mov     ax,0ffffh
    2 u( d" c: v7 c7 f  k6 M7 a
  714.         mov     bx,3
    * V9 x7 ~% l& L- Z2 r% j% e$ O5 k4 S" B
  715.         iret, B4 t& s0 A$ x, w

  716. 0 R$ U- r6 v* F9 p+ b# w
  717. _get_pos:% @; O- I- @- w, n
  718.         mov     cx,cs:[pos_x]# H+ s, \/ p7 c$ M* r) w5 K
  719.         mov     dx,cs:[pos_y]9 Z0 v7 L# q1 `1 `7 p
  720.         mov     bx,word ptr cs:[buttons]
    : P, R" {! ]( ~( U. N5 u
  721.         xor     bh,bh
    ! M! X5 I" O; v
  722.         iret
    1 d' Y$ r$ l* A) }& k
  723. - y" L& u5 u9 E* L" J2 O# x& X
  724. _get_mouse_movement:
    $ M7 S4 d3 q/ E" e
  725.         mov     cx,cs:[x_move]
    & l. e; q# q6 F/ B' q" Y) z
  726.         mov     dx,cs:[y_move]
    % S+ c  l. W# c% }  U
  727.         mov     word ptr cs:[x_move],0% ~5 L1 J+ j2 p
  728.         mov     word ptr cs:[y_move],0
    3 X, s/ ~: C( l- g, F2 ~, ^
  729.         iret
    9 z5 U: _" O. [% Z% h' g9 G
  730. * y! q+ n( A& Q1 H
  731. _show_mouse:
    ! [, z# p1 O; ^/ b
  732.         push    ax: C: C9 A% B5 z9 k7 `7 C0 O
  733.         push    bx
    ! Z" g# ^% \! E" r' q
  734.         push    di
    1 Z( o+ `5 B' i/ F' w* b
  735.         push    es% K. ]* d& Q) w
  736.         mov     byte ptr cs:[sm_flag],1
    + a7 P$ L  [$ p2 @) L( @: D
  737.         mov     ax,cs:[pos_y]/ E0 D- }: R- o4 h) U
  738.         shr     ax,3
    1 F( \/ O4 a' j5 F- |
  739.         mov     bl,80- A8 b4 X. K- b7 D9 z4 ?, g# V
  740.         mul     bl# @. F- Q+ B* L4 w
  741.         mov     bx,[pos_x]  w% x. h4 i! r5 X; m
  742.         shr     bx,3
    : k0 g* h/ U3 E
  743.         add     ax,bx$ l9 k0 O! F; w  Y9 ~7 T3 G8 }
  744.         shl     ax,1
    . D, c. W4 G. E- ?  O+ z! w. Y
  745.         mov     di,ax/ _3 a+ x' q7 C9 \
  746.         mov     ax,0b800h& ~; U9 t. n) Z. n0 E8 {; k* e
  747.         mov     es,ax
    + [+ o' Y8 k1 v5 `+ K
  748.         mov     ax,es:[di]
      {; x9 g# j' y9 p+ q
  749.         mov     cs:[save_char],ax
    - c4 L9 L( F9 X: G5 M5 G
  750.         not     ah
    9 P1 [3 f0 ^5 r2 C7 V
  751.         and     ah,7fh: Z: i1 T# ~. k! L( K
  752.         mov     es:[di],ax: ~( o% i# e" H/ ]5 o& Z" U
  753.         pop     es
    % q/ U  S  g% K4 u
  754.         pop     di) q0 F) {$ O6 v- n0 k
  755.         pop     bx0 a7 v  W. l: j
  756.         pop     ax
    # W7 ~& \4 y0 P. O  g
  757.         iret
    8 g6 l9 I8 X5 I9 F
  758. ( `  t, W" G! i* |$ q2 \
  759. _hide_mouse:, E  A1 U2 @4 h/ w2 X
  760.         push    ax) W) R" P; X4 {2 }5 y
  761.         push    bx
    & h# A: S: {7 m
  762.         push    di
    " l  J% a; W. h0 {
  763.         push    es
    % u2 a5 P# ^" z; [: V5 C0 `
  764.         mov     byte ptr cs:[sm_flag],04 U  |. w' e4 B& }  F- I. D
  765.         mov     ax,cs:[pos_y]
    , m3 j8 l% c. o0 [' E' y
  766.         shr     ax,3
    % P! L4 [% T' r0 [% _
  767.         mov     bl,80& _" F# l& m% o9 x  v; V8 z2 K
  768.         mul     bl
    ! l( z$ \  G* |
  769.         mov     bx,[pos_x]
    & Q: }* Q/ P$ U- m
  770.         shr     bx,38 r) ]6 e. h5 D2 h
  771.         add     ax,bx
    % P7 S3 w/ y- z) B, l/ ~8 Z
  772.         shl     ax,1
    / u! O' p7 a* S
  773.         mov     di,ax
    5 s  i1 o2 }! v4 Y1 n" Q
  774.         mov     ax,0b800h
    ' i+ f4 T0 R" {, I; U5 a( `
  775.         mov     es,ax4 Y' t8 W* \% ~
  776.         mov     ax,cs:[save_char], _& }5 @/ R- M8 E, P
  777.         mov     es:[di],ax% ]" E9 n& t% w' g3 @
  778.         pop     es
    1 {8 ^& n' c+ d, P% w1 N8 p* }1 T6 o8 C
  779.         pop     di- B- f( M. Z. |& b
  780.         pop     bx
    " k9 ~4 M& c* z1 i
  781.         pop     ax1 N" K5 }1 e2 }+ L9 a
  782.         iret$ L; O- P9 c5 D; g3 |% l% `

  783.   ]& O$ V3 q) V! @: |
  784. _set_pos:
    # n' o) Q+ E, O- Q& S
  785.         mov     cx,cs:[pos_x]" f8 Q: t6 T8 m+ Z+ |( `2 d
  786.         mov     dx,cs:[pos_y]' w2 }- G) k+ T0 ]: O, a9 m
  787.         mov     word ptr cs:[x_move],04 D% F- y# f% s
  788.         mov     word ptr cs:[y_move],0
    ! t, V  S, @; R% k# k, c# I
  789.         iret
    " p9 Z3 ^+ w! `9 b5 U7 e

  790. 5 A5 Y) ~/ ~3 m
  791. _set_hor_pos:
    1 m7 \7 ^2 ]+ ]8 ?# x) \; i" O
  792.         call    max_min( k5 y1 \! J* n
  793.         mov     cs:[x_min],cx
    / f( o5 f- ?, p* ~
  794.         mov     cs:[x_max],dx: _; m4 s' M% c$ W
  795.         cmp     cs:[pos_x],cx
    * L3 T1 D( Y7 S  `8 S
  796.         jge     good_hor_min
    ; ^5 ^, K4 b* |! [$ Q
  797.         mov     cs:[pos_x],cx; ]) S9 b0 b" _& r
  798. good_hor_min:
    / G. N) H; h! R2 K# T6 _- ?& ]
  799.         cmp     cs:[pos_x],dx
    ) ~0 j: o  n/ `* `8 J
  800.         jle     good_hor_max5 ]4 a6 n* X- }/ A# F7 B, w& _
  801.         mov     cs:[pos_x],dx- s  ^" [5 q% t$ G6 P
  802. good_hor_max:
    ( U( d! y7 }  o' M
  803.        iret) x6 t: N5 ]! }; [4 X* z
  804. 4 J+ Y* A& e6 y  F8 }( g4 A% a/ L
  805. _set_ver_pos:( F- W. e( T$ G# Y
  806.         call    max_min
    1 N3 P: C9 f% C9 z9 o
  807.         mov     cs:[y_min],cx
    . \! D; m, R( q
  808.         mov     cs:[y_max],dx
    * x  g4 i. L7 _
  809.         cmp     cs:[pos_y],cx+ }- |; Y( V* s! X
  810.         jge     good_ver_min
    : w0 P) R) O8 }  \
  811.         mov     cs:[pos_y],cx
    # v( H' i" |5 C: Q5 ?8 \, R
  812. good_ver_min:% _8 U$ D, b1 [5 l/ v1 B
  813.         cmp     cs:[pos_y],dx
    / Z2 w; }) U3 C
  814.         jle     good_ver_max
    ' H  N0 _' p' w
  815.         mov     cs:[pos_y],dx
    : d# R$ b% E- M' b7 z) l# r5 y
  816. good_ver_max:1 y. D% Y5 K* I" D1 f
  817.         iret: t0 J' @9 ?  L6 m. F7 X% _' N, K

  818. 4 W4 D+ a9 E$ h* E2 L, |* h. v
  819. max_min:5 Q! c: X$ o  l: F
  820.         cmp     cx,dx
    # D* ?  V: o7 f$ ]
  821.         jle     no_swap
    : Z1 Y9 q- b' v  Z
  822.         xchg    cx,dx( B1 A# P1 D& h( d9 E& x
  823. no_swap:
    , y; H- e. c' ?! n' C% b; c% A
  824.         ret
      q# M1 ^& @7 Q4 [/ U; V
  825. ; T& z. e# v6 d% i- @6 a8 |
  826. _set_subroutines:5 p) U/ N- Z! b+ E
  827.         mov     cs:[user_subroutine],dx# N/ l- Z8 t' }' \# ]2 c
  828.         mov     cs:[user_subroutine+2],es( `# e" v& P9 B
  829.         mov     cs:[user_mask],cx
      o% r, E# |* {% x" V5 ?* M
  830.         iret! B' C) W) F2 L7 b. [* e* z
  831. * S: }8 y- {$ u
  832. _swap_subroutines:
    4 g) P% o# S) x; Q* i" v/ @4 C
  833.         push    word ptr cs:[user_mask]
    . M* G9 _1 H: C+ A9 R( w8 S
  834.         push    word ptr cs:[user_subroutine+2]- D/ l& l! z1 W9 E
  835.         push    word ptr cs:[user_subroutine]# @. p- }3 s6 N. }& }. b. N
  836.         mov     cs:[user_subroutine],dx
    * r) y1 s( [5 s! R
  837.         mov     cs:[user_subroutine+2],es
    9 F# x6 C7 G5 q# \+ m2 J- o
  838.         mov     cs:[user_mask],cx
    8 @3 [  ^6 l( M9 C" w& [
  839.         pop     dx5 s$ `1 i3 @; j, S, b
  840.         pop     es0 [" ~6 h  O6 x2 I) ^. c
  841.         pop     cx
    / i! e: a' M5 s6 _) G" K
  842.         iret
    ' R! O7 Y; ]. T! {! z2 V. B3 y
  843. # A1 n% s, Y' B* o. G7 D2 {
  844. memmouse        endp
    # L  w: A1 W; A/ z" U0 X, f/ k
  845. 8 f3 S0 Y3 J. i2 B+ g
  846. endof_start:
    . D; s* k/ T; a8 ]+ ]
  847. 1 \# }% i- c! f, y- B0 M
  848. emsg db 'No mouse driver install error!$'6 G/ B4 u3 O2 l* q
  849. old331 dw 0
      Y0 q+ O' T9 u5 o# k7 [) D
  850. old332 dw 0
    3 A. b+ \4 [! Q$ q" u0 S
  851. old741 dw 0
    + [$ L9 g: m. S9 C: q1 c3 B
  852. old742 dw 0
    5 J- g( S1 q. g  H" |
  853. memcopy db 0- ]: y& @0 t) w# H& ~
  854. okcheck db 05 N$ a, Z3 [# h+ T7 r0 a
  855. pass db 0
    ' {% D( H; }; n, `, j
  856. chkl db 05 y/ d# R4 j( N* V3 t% j) F
  857. lk db 0
    $ {0 m$ z) l. H; J- N
  858. chkr db 0- C; L9 n+ o. y
  859. rk db 0
    / F9 N# E5 k/ v: ?
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    4 ~  d' [+ L9 q2 q
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '* ], G. E8 B  k
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '- Z6 ?* S) M; ]7 `9 N' H0 m: |
  863. db '                                                                                '
    # n. a9 T2 z9 e( T" _2 K* p
  864. db '                                赏屯屯簧屯屯突                                  '0 w' V( V7 t( `( G
  865.         db      '                                ?OFF汉OFF?                                 '
    4 d$ s2 B& X& ~- x
  866. db      '                                韧屯屯既屯屯图                                  '
    , Q9 E" v: u& H- M  ]
  867. db '                                                                                '  E! D  H/ }9 y1 {* X
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '3 f; B/ V7 X+ F, Y. r) y  @$ |( z
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 4 W; M0 o- H  w' Q5 R/ q( x
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    5 b& v% I) e' [# S. {( p  `
  871. " V7 n! w2 l7 P1 r) L" L7 \
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!  P3 N6 ~$ _! J" h
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
: v! J) S5 Y& N1 I0 |
7 o& J, x) l1 u/ W  x3 g4 U谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:45 , Processed in 0.061351 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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