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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。% [* L  ~2 ~6 w9 F# L" d( b
4 a: ?3 s/ Y# `6 ^- o4 m! V0 T
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;5 j" a5 [8 g$ Z. L4 a$ I3 X- Y
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9! ?) _& D: |2 X/ J
  3. ;                                         By Bini.Yi 易祝兵/ g" V1 v$ d# e9 S/ q, m
  4. ;                                         http://www.ufoit.com 计匠网4 t4 q4 u0 K! X. ?$ G
  5. ;                                         2002/04/06 YYYY/MM/DD
    ; x4 \* q/ S4 O$ k
  6. ;2 z% s3 l: ]8 |3 n- z6 r) J
  7. ;         
    $ V- A* ~7 E. T% e
  8. ;          This program  test the mouse button  click and move.
    , P" M, s" R0 M$ s- N( W$ j
  9. ;
      z, {$ q5 P* W% ~
  10. 3 |+ L8 z1 J: `& q
  11. .model tiny
    * ^+ p  s9 m# C) e* `
  12. .586
    2 G! N2 B) p& D8 N
  13. .code
    & G' `0 g1 h$ l& h, W
  14. .stack  100h: l  u2 s5 I6 K5 Q) X
  15. .startup
    - M+ S+ v# r9 _/ V, U6 r
  16. pusha
    6 B! j; p, J7 Z  Y" |$ |2 k% q
  17. mov ax, 3533h+ c1 l3 L0 g/ ]6 k( h  Q
  18. int 21h4 Q, e, p& A; s* C( t1 q' B9 C
  19. mov word ptr cs:[old331],es1 T  a* {$ n& j- T
  20. mov word ptr cs:[old332],bx; G7 V( \' v' w# Q: I
  21. mov ax, 3574h
    + b2 p5 Q& q9 R, M7 x8 K0 _
  22. int 21h0 a7 X8 B+ p3 J4 ~$ w
  23. mov word ptr cs:[old741],es1 g+ L2 B! b; j  k# [5 G" u, v
  24. mov word ptr cs:[old742],bx
    % L/ d+ _1 T8 G# ^
  25. popa
    ) O7 G2 V& L8 r8 x- X
  26.         call    memmouse
    ' N* Q: w$ Z0 ~( O( e, Z$ ?' k
  27.         mov ah, 00
    9 {0 H: @6 F/ O; E2 O7 j
  28. mov al, 03
    5 }9 K" X( x6 r4 J% c
  29. int 10h
    # Q2 g& x) g" N0 ~$ b$ u( H
  30. mov ah, 069 w( ^# w+ y: q/ i: @1 b7 q) p
  31. mov al, 0
    - e. W3 c6 A) W. S& P2 E4 n
  32. mov cx, 05 X; u- r( j' M  h$ t+ E6 r! u
  33. mov dh, 24, \1 R# G5 g; T
  34. mov dl, 79# _! F4 I0 r' m( o4 c
  35. mov bh, 07h1 m- ^4 @" ?* {, N9 }
  36. int 10h
    5 k( j/ _8 P& u1 [8 k6 [
  37. mov ax, 00004 H* |1 i# {6 N) S" G
  38. mov bx, 0002
    , p; J# z1 J; u% H8 ]( n
  39. int 33h
    % s; p# d2 j9 V/ N# H
  40.         cmp     ax, 0000           ;if no mouse drive install
    2 M  D  b7 e/ |# y4 C/ k8 [/ u
  41.         je      errormsg           ;show error MSG
    " M8 G2 ]& k4 g( f
  42. mov ah, 02/ y9 y) ^" j3 q1 O5 z5 _
  43. mov bh, 00
    2 w5 ^- C* M& X: [4 c% L
  44.         mov     dh, 25             ;Move point out screen) e9 L% H0 P6 q! e. m
  45. mov dl, 79
    9 ^$ S; q! C5 Z% [
  46. int 10h9 g$ G. y8 C8 o$ E* [
  47.         call    showmsg            ;Show info
    1 c; k% k. H$ ^
  48. mov ax, 0001
    . u5 s7 {8 r, e. B' o" V; j0 w, C
  49. int 33h
    $ X% k9 o, |8 E- j" \0 R
  50. ; mov ax, 000ah
    ) \4 X* J2 O8 o5 H6 w$ L3 }
  51. ; mov bx, 0000
    % o6 ]3 {) A: ?6 o3 C
  52. ; mov cl, 0h
    3 E+ E- t9 p+ A; ?- i
  53. ; mov ch, 0F0h4 c* \/ ]: `9 d* B( r
  54. ; mov dl, 0h0 i/ C* ?' W( `* ]  ]6 d& Q
  55. ; mov dh, 0F0h7 M1 F. {7 ~8 ~
  56. ; int 33h6 ]3 ]! N+ p$ V
  57. mov ax, 0004h% n2 O9 E+ n9 j  r" S2 _- ]+ V
  58. mov cx, 0319! V; E1 Q- x% _! o
  59. mov dx, 0103+ v0 l/ e3 G4 `/ z/ h
  60. int 33h# C, e  t3 I. F/ W  r% o4 p, {+ E
  61. casemo:                           ;Case button click and point move
    ; V9 q2 e& G# _# D6 r
  62.         mov     ax, 000bh         ;and keyboard press4 y: }2 n2 U9 O
  63. int 33h
    3 ~2 X4 F! G9 {! g9 g
  64.         cmp     cx, 00h           ;if point move....X
    - D+ }. b* G$ u$ u/ J2 \8 p9 J
  65. jne xmov
    5 N0 w$ k9 c+ N) I, H' o, S
  66.         cmp     dx, 00h           ;if point move....Y+ H) F1 M7 A; o1 c, m  [
  67. jne ymov% k  `. w" t9 k4 X4 F9 b
  68. xymovend:                         ;X.Y move end
    . h% M& b. ~9 ^0 X
  69.         mov     ax, 0003         
    , ]% q  ~" P. W! k
  70. int 33h% Y- V  L6 N  Z- i; u2 x3 R6 e
  71.         cmp     bx, 0001          ;if left button click  show ON
    $ ?/ T% O  t$ t) k* ~
  72. mov si, 1828
    & j2 o; d/ p- c* I
  73. je listl
      p. L, o5 U8 ]) t8 Z
  74. mov si, 18284 K1 y2 ~, F5 m, q' p1 G
  75.         jne     nlistl            ;if left no click show OFF4 M1 H6 a5 V& Q- z8 K
  76. testr:
    + Q7 P. a; U1 k. _
  77.         cmp     bx, 0002          ;if right button click show ON, J8 @6 m5 R) @0 g0 h. E
  78. mov si,1842/ X5 D' @5 v4 [6 Y8 Z5 B
  79. je listr
    6 _7 H$ V/ E4 C( ~- m: y, T) u
  80.         mov     si,1842           ;if right no click show OFF
    5 y& E8 \  v0 ^" z- S( R  X
  81. jne nlistl
    ' x6 k5 Q" i' p2 U9 E& W  N7 ?
  82. casekey:4 B" w, E. ?1 j7 ~3 g4 s/ y
  83.         mov     ah, 01            ;if any key press jump check
    2 x9 O8 t: ?  Q2 B" _  x8 B3 t
  84. int 16h; A( p9 ]) a9 ?* z; i
  85. jne kpress
    5 t, M7 P8 I! ]* p! L
  86.         mov     al, [chkl]        ;check x flag. t$ B7 {$ U0 N  n! {# A& p
  87. cmp al, 02h
    1 G* y4 ^3 ~) Z/ b( M6 J
  88. jnb chkok
    5 t) K) [/ V% q- r- p( d' p/ w0 g
  89. jmp casemo: H  C7 ~) e; T
  90. xmov:                             ;if X moved, get the X flag+1
    8 \  D' T3 O  K$ Z
  91. mov al, [chkl]! b- P' ?  i4 x7 [
  92. inc al
    , F% V! H( ^& `4 p# _
  93. mov [chkl], al+ [+ l5 R# H' x) n6 U
  94. call passok# [4 q. }# M8 y5 T! j
  95. jmp xymovend/ b, r- o) L! E
  96. ymov:                             ;if Y moved, get the X flag+1& q: T4 N* i! ]# s- ]
  97. mov al, [chkr]! _! G+ y8 u4 V  Z
  98. inc al( t1 {6 D/ r' |) J8 t6 N1 ~7 b$ f4 X
  99. mov [chkr], al, \' ^  k0 W' Q/ Q( ?, K8 A
  100. call passok" J. {9 Q/ d1 A
  101. jmp xymovend* O0 \' h5 p- _9 x* M
  102. * X3 J' U: }. _- }
  103. passok proc near5 r) l/ _3 j* V) S/ G) c
  104. mov al, [okcheck]0 `4 C6 b* [& H0 I* H
  105. cmp al, 1' v6 x! x5 ]1 w# x8 B. r4 z1 D
  106. je let0* I1 h7 k+ G, U% b
  107. jmp passret+ q( d: W: _$ g1 ]6 t! @
  108. let0:
      o; s3 b/ |' N) M* ]% L, Z
  109. mov [pass], 1
    6 z) W! F/ }8 G! t- \
  110. passret:
      N) o- m1 \3 A! H0 i, Y
  111. ret! o* |9 s# D  ^2 f4 D1 }& b
  112. passok endp 0 E$ ?- h' o0 |6 P
  113. 5 F: b; B( O! o3 y3 L4 h
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    & g/ e/ h- U# T1 c% S, `7 y5 t- D
  115. mov al, [chkr]$ Y7 W; c3 F6 |7 s4 J' v
  116. cmp al, 02h
    8 g2 m  ?. ]- P4 ~% _+ |
  117. jb casemo
      l1 N: u% w& f; z
  118. mov al, [lk]4 z) l% r0 ^2 L8 U' E8 d; i( X$ [
  119. cmp al, 1
    2 t) ^4 t" _; J2 w! }: e- U$ `
  120. jne casemo
    7 m, E1 ]. z1 M' I
  121. mov al, [rk]
    1 U8 C$ E' x$ V0 W& r6 \
  122. cmp al, 1/ L. E8 ^0 d; O5 w9 o
  123. jne  casemo/ }; J: }/ a8 N9 V2 \' Z
  124. mov [okcheck], 1
    4 @& w, ?1 c! X, l1 m  _( s6 {" P& z
  125. mov al, [pass]
    % G+ g9 `0 G& G0 r- H' @8 l
  126. cmp al, 1
    - ?+ Q" z2 m9 f- Y7 X2 e
  127. jne  casemo
    & L" X9 e# l2 |  B( i/ d
  128. mov ax,0002h! V! L5 j) S  F. z; s! {
  129. int 33h
    2 j- T' `# B3 n1 E9 V0 ]
  130. call cleascr
    : s& K  t3 Y/ ~3 v, l1 R* |/ r
  131. , W2 l; [# @- t# |
  132. call oldint
    - a8 B6 e1 i2 X. }( o7 k' K
  133. mov ax, 04c00h
    ! X" M# v4 \1 G0 I. s5 S4 k/ u8 t/ O/ `/ r
  134. int 21h
    . I  ~" g* M, a) K8 z

  135. ' S: @! g1 `2 z  f8 P: N$ L
  136. okexit:
    8 L0 `3 `, f* k1 A! \( B* O
  137. mov ah, 4ch
    9 P; W! X; W( ^6 `( T, ?
  138. mov al, 0
      t% a3 Z) f1 d/ f& Q) b) V
  139. int 21h
    : u9 }( x6 s1 d6 s* Q2 R# U% ]/ x( ]
  140. listl:                                 ;Show ON
    + m9 a0 j; j2 w" r/ g1 \
  141. pusha9 w% j- L, X  O2 |& H1 ]" i
  142. mov ax, 0b800h/ Q3 U. h% C% X( i, f
  143. mov  es, ax% G) |; O  _& p& J2 g5 y
  144. mov ah, 47h* s/ y6 T) I/ o6 y! \- B) y
  145. mov al, 20h
    " E! z: ~. R0 x
  146. mov es:[si], ax. ^2 }  R+ b8 T
  147. add si, 02$ N1 _2 U. a: S
  148. mov  al, 4fh
    5 s6 C2 v) s! v9 d5 K, V8 z  w
  149. mov es:[si], ax
    4 x7 ~) w; u+ F$ U- F- b
  150. mov al, 4eh& |  o1 N+ |3 m- W+ t
  151. add si, 02/ D! N! y1 f" `' y+ j
  152. mov es:[si], ax9 |: Z' ?5 @# @# _- I; N; F
  153. mov [lk], 1
    5 J3 |" y& a  \
  154. popa
    4 y* g* o% u* C6 Q  ^
  155. jmp testr6 h2 Z- o: z4 l9 Y6 E( j6 q
  156. listr:                                 ;Show ON- l$ L' E! O" P  E4 X! q0 m# P% C
  157. pusha
    3 ?0 c% \" e% b* i
  158. mov ax, 0b800h1 w" d- n! j* a; U% F+ j
  159. mov  es, ax
    ; G: a$ m9 t4 e1 f. O! _$ I. J
  160. mov ah, 47h8 K+ H1 x. Z/ V  o! c& k
  161. mov al, 20h' T0 C3 ]; o/ @
  162. mov es:[si], ax
    : s% u; l: u. f4 o9 x" d5 e$ o" C, i
  163. add si, 02
    ) z, i0 B2 c5 I9 _5 z( ~
  164. mov  al, 4fh( d! f% @4 J: [) E9 c# J
  165. mov es:[si], ax
    ; W# z6 @. }% a
  166. mov al, 4eh
    . r( q9 R4 A/ W$ `; ~7 r- Y1 d
  167. add si, 02
    # j( Q4 V$ w3 T5 |* G% p  O
  168. mov es:[si], ax) T: A( f: J. c+ c) D0 A4 ]
  169. mov [rk], 1* ~9 E- X' ?+ U% v6 Y6 v3 [" H
  170. popa
    - j) q& q3 S# x+ Q2 @
  171. jmp  casekey% U1 d/ [' G; v$ L) I
  172. ! C/ V* c. k6 j( O4 x3 T
  173. nlistl:                              ;Show OFF: v6 X5 W5 `5 l9 [$ H7 D
  174. pusha   
    7 r9 m; b7 U( P1 J4 d
  175. mov ax, 0b800h9 q2 I7 \( Y! z% i+ f
  176. mov  es, ax
    * f; I# D6 w4 c- Q& S( k- D2 X2 b* G
  177. mov ah, 17h
    * Q# Z  T' c$ s. d. O$ x0 i
  178. mov al, 4fh9 V1 Y! N. z& ^: z3 j' \! ~- y, i
  179. mov es:[si], ax
    5 _1 b. g& v0 V% R4 @; e6 k
  180. add si, 02  U& n1 o/ R1 N% E4 H% }) @8 r
  181. mov  al, 46h, X. {3 i8 _9 F+ g: M& }. `
  182. mov es:[si], ax) a: ^- `; h4 W9 B
  183. mov al, 46h) H' I- s; f, R" g/ }2 n
  184. add si, 02
    2 M/ K) _9 f4 M, V' i7 p  ~" s: S
  185. mov es:[si], ax3 t1 B( K) V, y8 h* Y' e
  186. popa
    7 w' j; u  l/ W2 o% j0 _; L
  187. cmp si, 1840
    9 }& p& t6 |( z" n" E5 W/ j" \5 W
  188. jae casekey. v) P7 ^9 d; U8 ^7 G$ l
  189. jmp testr
    $ x+ e6 r4 j$ _4 c* D0 ^% c5 A
  190. - L/ V; ?6 h" W% x/ P
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    $ R8 @; S4 o( @5 J' G' m
  192.         cmp     ah, 01h             ;and return a error
      S3 y) s! v  u9 _4 B$ a' Q% b4 `5 |
  193. je exit1
    ; E" v, z& A3 m0 ~/ Y5 c! k; n
  194.         mov     ah, 0ch             ;if press other key then clear7 d3 I+ o8 [' }- @6 O$ c
  195.         mov     al, 00              ;keyboard buffer( J  M' P  i; Y, p& F6 x* `
  196. int 21h
    5 U. e8 z6 F  e* ~
  197. jmp casemo
    3 Y0 u, k; v4 ]$ D! t7 y6 z. K
  198. 6 w. d# `& N& s6 Q
  199. errormsg:                           ;if mouse driver no install7 b1 }$ i! W; y$ T, ?: h/ r
  200. call oldint  D* E8 H, Y, a' {0 g2 m
  201. lea dx, offset emsg
    ; @6 w) `$ c) A
  202. mov ah, 09h
    5 G9 ~6 a# P2 Z2 {: }: ^2 S, L
  203. int 21h
    , n; t  U, }' M( @
  204. mov ah, 4ch
    5 y" @' A6 B5 b9 a& z: M- H
  205. mov al, 28 C- A% M* }: F/ o
  206. int  21h
    * S) `1 [' w1 V% D; i7 D
  207. 3 V# l' V$ E( T$ m6 D3 c+ C8 a
  208. exit1:                              ;error exit
      {2 x" C' T7 p9 z. [+ o3 ^# W
  209. mov ax, 0002h7 W& s& [6 L3 @& ]" i
  210. int 33h
    + _5 D; i6 q' l( }/ R
  211. call  cleascr
    1 a8 ?3 t. F$ M7 ?4 v; k1 ]
  212. call  oldint
    1 w/ {; ?* j1 P( y* E6 j9 y9 d
  213. mov ah, 4ch1 H$ J1 l  m+ M2 C+ ?% m' D( l% Q
  214. mov al, 01
    & J. n1 [6 G1 f& [. z: A
  215. int 21h
    $ l  e# o+ [" U- }8 }

  216. 8 k1 _' u) h$ D' Y% S: t
  217. cleascr proc    near                ;clear screen- O' r( `# n; k! d1 N3 _
  218. pusha
    8 v% X% V! g  F' M) T6 `3 x, N+ O6 w
  219. mov ah, 06
    9 v) A% ~8 T' G8 q; U
  220. mov al, 0/ d. X& R, t1 P' s
  221. mov cx, 0" m5 k+ A; d# x3 q
  222. mov dh, 24
    1 M2 O8 T. w8 A  F/ U) U
  223. mov dl, 792 ]: h" w0 B, F/ S
  224. mov bh, 07h
    ! T2 c5 o5 ?1 P2 \
  225. int 10h
    0 o/ b/ V, a/ j* G! }1 K8 Z
  226. mov ah, 02# O6 e5 W5 n1 A5 ?; \- f" o: }5 r! Z
  227. mov bh, 00
    ( D( p$ Z- [1 u0 d- U
  228. mov dh, 01 f6 {1 F9 E& e6 @
  229. mov dl, 0
    0 h' C% b/ g9 M  W; g  |$ G
  230. int 10h
    # {( X# s/ y- D2 M6 M* q3 L
  231. popa, o9 o/ z$ {, [8 d/ I
  232. ret
    + D% ]0 M. P" [3 c. S
  233. cleascr endp
    % U+ B+ h" h8 e
  234. 5 J( N7 {- b0 L; a- z
  235. showmsg proc    near               ;Show info. x" I+ A" R3 T4 j7 t$ ~
  236. pusha5 j3 E5 c+ n$ u9 Y; O
  237. lea di, offset showms
    2 W. o9 k3 G( h. U& n0 [
  238. mov ax, 0b800h$ \9 w# ^' [  p
  239. mov es, ax1 o; E+ E" j' I6 {
  240. mov si, 08 d/ o! N. r" N  c5 ~0 Y
  241. mov cx, 480: w7 W7 q8 l* v  f  y/ L% m
  242. mov ah, 07h6 V9 w& B, b/ R9 z7 T4 o! r. w
  243. @@:9 ?# l6 c' {2 z1 f( T
  244. mov al, 20h3 C' A9 `2 l7 D6 I2 Z
  245. mov es:[si], ax- d, Y2 ]! a# i) C% f0 f" z
  246. add si, 2
    / m& k, ^# y* v; ]' N# e
  247. loop @b
    2 v( S- {9 ^. h! M
  248. mov cx,880/ p% c" u7 m( |1 |& V4 b2 s  a
  249. @@:! K0 X9 q- a3 f
  250. mov al, [di]
      j2 ~$ x/ `2 d7 b
  251. inc di
    # G2 e3 P( @* |3 Z" e
  252. cmp al,20h
    6 Q) M, n) A7 w% o- e: A
  253. je showch18 E& i/ _+ q" e6 S' ^9 Y
  254. mov ah, 17h
    + r* {4 ?& U: H. M; h$ }  k
  255. jmp showch3 1 O8 K$ k' ~" R: T7 I- k6 ?" T
  256. showch1:8 `( A+ K$ T' I& `! r
  257. mov ah, 07h 7 j1 M  {7 C* Z& [) U& \/ X1 }6 E
  258. showch3:0 S6 q# U& y$ e" \) h( P/ j
  259. mov es:[si], ax& `6 x$ z; K. |2 k1 ~
  260. add si, 2
    & I; T! A* V( x) m8 s+ z6 T
  261. loop @b
    % V$ ?' T% e9 I# D  U( m8 A
  262. popa
    4 h8 @1 r2 q6 `. [* u1 ], R+ j
  263. ret' E) Y  L' u2 z. s2 A
  264. showmsg endp( O( |9 c( S2 N6 T1 E
  265. + O( U0 v+ j2 B3 N3 O% S( |" H  V
  266. oldint proc" K" m, C8 h* h# H7 u( R& G; _1 j
  267. pusha
    ) H9 w, z. a9 T4 a* S, H7 _
  268. mov ds, word ptr cs:[old331]
    8 V8 I; p+ I$ j$ c) P/ s
  269. mov   dx, word ptr cs:[old332]
    / b) g2 K+ U$ }' D6 Z; l
  270. mov ax, 2533h# I, `& ]$ J9 {- B- j- o- ]8 N& G
  271. int 21h
    8 T+ }, M9 h, A9 O4 |3 W, n
  272. mov ds, word ptr cs:[old741]$ c# m# ^( T) _& B3 b9 J$ C
  273. mov dx, word ptr cs:[old742]. R2 Y( c7 s% ^5 x5 y
  274. mov ax, 2574h
    4 Z* a2 g! S$ u# ^/ K: Y. Y- l1 L
  275. int 21h
    , S) y! f% s" T% y( k) M9 R/ t" f
  276. popa  t7 \* h  P5 T. I
  277. ret
    $ E) ~9 }7 S( H! J
  278. oldint endp
    6 X2 M3 \7 k( u) W6 j4 a

  279. ' _- G3 U3 N' I5 c
  280. memmouse        proc
    / N, ^+ z; T, j' ?+ b
  281.         xor     ax,ax
    ' F$ P2 G0 A" _; e4 F
  282. int 33h; Q& K: u" K  Y8 u
  283. cmp ax,0ffffh
    3 Z6 ~  L3 h5 r* e; b6 P4 f
  284.         jne     not_loaded* J2 _( F/ C9 d
  285. mov [memcopy], 1* W' y  v6 f9 e  S: a
  286. ret
    , ]! K4 [( D8 z1 l' Q+ a! B
  287. ' o3 i3 _1 W6 m# X
  288. not_loaded:' g' B; j' X2 R/ L4 S* A9 x

  289. - q) Y! g0 ^3 U
  290.         mov ax,2574h
    ( X. i0 I- [4 ]/ w
  291.         mov dx,offset new_isr) [% ]' F! y2 G
  292.         int 21h; ~' E; Y& |8 M4 J$ V

  293. 4 K) {1 F$ a+ Q
  294.         mov ax,2533h
    + F9 g6 ]0 X9 L% E  K- U
  295.         mov dx,offset new_33
    / w6 k0 I$ e% y) w  i' O
  296.         int 21h
    # c6 \  w. T9 Q) t* O8 J
  297. . `( {0 B8 S/ Q8 a6 L2 n2 `. k
  298.         cli
    - p6 e: \; D* L* G* R9 n1 s+ T
  299. % `" g: ?9 E& M- p4 y; a# i7 _# e
  300.         mov bl,0a8h
    ! V9 |. d* W5 r) [" E$ U6 m
  301.         call keyboard_cmd
    9 C  ]8 i$ x' ?9 r& N' X) U4 P: B6 Z

  302. . h3 b+ R% `" x$ P2 W
  303.         mov bl,20h1 Y6 }$ X, K1 O2 X$ p
  304.         call    keyboard_cmd
    8 B9 \/ }+ _! s
  305.         call    keyboard_read
    ; a. r( ?! R3 Q% B
  306.         or      al,2
    7 W; d9 U( a+ E% K2 E
  307.         mov     bl,60h
    ' @4 W9 V* [3 o! l% k4 }6 g
  308.         push    ax
    6 L: Q8 v3 g& n- h+ e1 I- S0 v
  309.         call    keyboard_cmd
    " p' l: N; O2 P* P9 _/ E
  310.         pop     ax
    9 k7 m2 _: c! w8 \) x' m/ ?6 A! Q4 Z
  311.         call    keyboard_write' A5 Q0 A: j! U% b# C0 A& X
  312. ' r# u' L" n' D  W; i
  313.         mov     bl,0d4h
      Y# ?! i9 L% a+ N- ]
  314.         call    keyboard_cmd) t2 i$ M7 F- j: e: j
  315.         mov     al,0f4h( b  |6 l, Q& R# P% H- c
  316.         call    keyboard_write
    - `) E+ T, F8 G+ k1 V3 U
  317. . L' I7 W  Q+ L5 q( ?% U% g; M
  318.         sti9 I5 W. Q$ E" v: s
  319.         ret
    ' ~3 T! A0 R. W6 y+ N! b  ~
  320. call_user_isr:+ ~; [+ y% k( l1 Z" W; ^' j1 N: U4 q
  321. db      60h8 k. C! r5 i" n) i7 v
  322.         mov     cx,cs:[pos_x]; _. v- z0 Q0 \- h  K2 M' @1 H
  323.         mov     dx,cs:[pos_y]
    ! b, j# B: C" x- k7 L# C
  324.         mov     di,0 ;cs:[x_move]
    " D, l& [9 `% A2 V/ O4 f# D
  325.         mov     si,0 ;cs:[y_move]( Q9 L1 P/ y3 p$ w/ f0 p! L
  326.         mov     word ptr cs:[x_move],0" o3 J& g# p4 G) U) _; g
  327.         mov     word ptr cs:[y_move],0: W7 a+ d) B9 j5 [
  328.         mov     bl,byte ptr cs:[buttons]  p' \3 u7 v) J0 S3 u$ c6 P' n- b
  329.         xor     bh,bh3 E( Q1 X  t  U9 ~8 e3 A) A
  330.         call    dword ptr cs:[user_subroutine]5 b5 s& @7 E- A, W( C- g( x
  331.         db      61h% m5 ?! Z6 Z( @& i! b+ j
  332. ret
    9 A3 h+ K" ~! r+ f7 t% W' B
  333. new_isr:# _; P* P2 i1 T* d1 H3 o
  334.         pushf
    . ]/ r& H+ P' U0 l1 n- V" X  z
  335.         cli, {. L5 ^1 q& X3 H( _
  336.         push    ax. r3 b! ~. v( U. }$ F5 X+ Q
  337.         push    bx
    - i( J. u& ?# V: `9 F! B
  338.         push    cx
    % M" |* ]$ t' x( |
  339.         push    dx' ?, s! H- C. H+ H& J0 v
  340.         push    di/ p0 B- o( I& V$ P. K8 d
  341.         push    si9 F/ C) q% Z; H. ?
  342.         push    es. @5 J! D' g7 n; y8 h
  343.         push    ds
    + ]( \* m# l1 t2 G5 F
  344. 0 \; }5 U5 V! U- o9 u1 e, u; p  ]
  345.         push    cs* D/ b& K& m, ]! K' w
  346.         pop     ds
    3 {4 k7 B6 V" h' B8 }
  347. 8 N5 t$ `7 ~# m; x
  348.         mov     bl,0adh& f0 p& |& K" a/ x
  349.         call    keyboard_cmd3 h) B) k. Y. u) C0 D: N4 ?  w% b# y. u
  350. " E# d3 I& N  i. R+ a( T
  351.         cmp     byte ptr [first_time],0
    $ {" H# a2 ^" m0 i+ A2 {- B
  352.         je      not_first_time2 ?( b+ I. T. D4 z) m9 Q/ g+ v: A7 S9 N
  353. . p; q( a6 {* z' {/ m! R2 Q, V
  354.         mov     byte ptr [first_time],0
    / f* `8 k% C% Y7 q
  355.         call    keyboard_read
    , ?4 M& W$ H9 U; |% K2 {( t! O: q
  356.         call    keyboard_read) K, _; H/ g0 v, a3 A2 ^; n5 M
  357.         call    keyboard_read
    ; j7 f( Q& ~3 J. a% q6 \4 Z
  358.         jmp     no_show
    ; b3 H- O5 Z/ x+ x( Z  }

  359. 7 G5 F1 V/ Q8 N" M6 i# J
  360. not_first_time:& {+ d  _' _: `* c- d$ G2 c3 @
  361.         mov     word ptr [temp_mask],0
    4 n" p2 Z4 b- |2 c( |* ]
  362. . c9 o# z, _5 L. [. ^) H
  363.         mov     cx,[pos_x]4 ?3 D4 p4 W; t/ o$ Y
  364.         mov     dx,[pos_y]
    & f, g+ n! {1 `, j) F' X! F
  365. 2 `$ Y. W/ F( o1 |
  366.         call    keyboard_read' ]: C" A. h5 i- H; O0 b8 I& e
  367.         and     al,7 ;3& _- C0 ]- _% t' q& }
  368.         mov     ah,[buttons]
    7 }. \. [3 H8 {) w' W) I$ L5 z  o
  369.         mov     [buttons],al
    2 D9 j# M# M; T; _
  370.         cmp     al,ah
    7 A/ k) O. l" g3 y, l
  371.         je      no_button_change
    2 R9 A  H: }2 K7 T7 M/ R5 n
  372.         and     al,3" f) q4 [9 a4 I% Q
  373.         and     ah,3
    : X, S4 N  X& j3 S
  374.         xor     al,ah3 T# o/ c$ T5 A8 t
  375.         xor     bx,bx( F) f" n5 z/ v6 E& Z7 }3 O

  376. ' x0 x6 P- c% v! v7 C5 d
  377.         push    ax+ ^+ W7 D, Q( r- ]0 G: |" i, g
  378.         test    al,2
    : r. j, E& p; R' A, o
  379.         jz      no_right_button_change
    , B7 S- A9 J5 G1 C% |1 w; g- M
  380.         and     ah,2* b, d- K: J8 x
  381.         jz      right_button_pressed" L2 |- b0 S8 D$ u
  382.         or      bx,16( E! \6 v. @( i/ q6 r- e' E6 {  Q
  383.         jmp     no_right_button_change+ G: P2 h4 f: D1 N4 Q
  384. right_button_pressed:' Z" x2 g* V( Y: [
  385.         or      bx,8$ u8 X) O8 s2 I" t
  386. no_right_button_change:
    % i# s3 p' |2 z+ o! f, a1 `

  387. - u% y+ Y% q6 f4 A
  388.         pop     ax
    " o, X& o, M1 J) z! ~6 R
  389.   q; N" C- C5 D- ?
  390.         test    al,18 _8 d  J/ y5 v9 d5 X
  391.         jz      no_left_button_change( ], {0 A+ Z! [* t* l
  392.         and     ah,19 e& V9 ?9 @5 H1 i3 S* M
  393.         jz      left_button_pressed
    ' z* @3 W9 o+ U9 Y
  394.         or      bx,4
    ( k" I' g2 ~$ U' i/ k% ~- V
  395.         jmp     no_left_button_change
    1 [8 N5 n; }: ^
  396. left_button_pressed:
    5 V: q- H5 q! Y8 {8 G4 f/ S2 L
  397.         or      bx,2" l( M2 z+ X/ L4 ^
  398. no_left_button_change:7 P7 H# O' L0 X2 Z3 v; w% X+ ^
  399. 4 E9 P9 ]+ r0 \, y; ?# N5 J
  400.         mov     [temp_mask],bx/ q6 q$ X& i  [) c5 L" y
  401. ! o& ^- q) S3 I# g
  402. no_button_change:8 Z( U( b* Z, I
  403.         call    keyboard_read
    ! v6 ?/ R* }: ], j
  404.         cbw' I0 k8 b  Z  \- M7 \/ N8 L, M+ j
  405.         add     [pos_x],ax
    4 V- j4 W! n. y5 C. U: e: N1 T5 _
  406.         add     [x_move],ax
    - M0 ?, Q+ ^2 y* ]. [
  407.         mov     ax,[x_min]5 x" a1 Q" D" T$ \2 e
  408.         cmp     [pos_x],ax* T  R- h: f- o& F: m
  409.         jg      good_hor1) `" U0 c+ ~3 E) P
  410.         mov     [pos_x],ax
    + P# b7 ^) i+ a$ t0 V  S7 \. [) N
  411. good_hor1:
    & |  S& F7 ~+ f# r
  412.         mov     ax,[x_max]8 p( G/ r: r& a! {3 X# z% @0 @1 I! G
  413.         cmp     [pos_x],ax6 i1 T7 l0 ]3 j3 ?
  414.         jle     good_hor2
    * c( J: V1 H: o. G8 a! S* u! E
  415.         mov     [pos_x],ax
    2 J6 h) L' }9 l4 t8 ^
  416. good_hor2:
    0 ^6 ?- m; b, k$ c

  417. ; E; i( i, z6 n% k# X; w
  418.         call    keyboard_read
    # ]6 X" D' k7 e
  419.         neg     al* ^7 O' L4 u, Y1 [8 B9 [
  420.         cbw6 ~( r/ M2 i, P& u
  421.         add     [pos_y],ax$ M" P- y+ C( a
  422.         add     [y_move],ax# l1 r/ z! R4 I3 v/ N
  423.         mov     ax,[y_min]5 ^& h7 F/ F# a
  424.         cmp     [pos_y],ax
    2 E7 k$ p+ y8 Z2 w4 t& Y$ b7 {9 }
  425.         jg      good_ver12 E- J) f! U: z6 E) K
  426.         mov     [pos_y],ax8 A  J& @3 r: ]/ u" J+ P
  427. good_ver1:
    ( V* _4 K# p4 X( ~, u
  428.         mov     ax,[y_max]% z! E& e' Z* N# ?+ x. a
  429.         cmp     [pos_y],ax
    , [% q# s) _. t, ], b' e+ B
  430.         jle     good_ver2
    & i+ J7 p2 S/ S7 ?# @7 @: z8 j2 v
  431.         mov     [pos_y],ax! P) f) ^6 N" Q  Y/ D0 @/ |
  432. good_ver2:
    . V9 K( ]) v6 ^- f& S. D  P
  433. . H( r. N  k0 s- o7 _. d/ {6 u, d8 m
  434.         mov     ax,[x_move]' D, ?; I* L' G
  435.         or      ax,[y_move]9 u9 \1 n. S/ {' N
  436.         or      ax,ax2 u8 y! i% b8 W
  437.         jz      no_change_position
    , u0 F( t% x% P" i2 g& u
  438.         or      word ptr [temp_mask],1! t" ?0 G: @5 v& N! o+ d
  439. no_change_position:. W! ^- b! u, ]0 `. V2 h& x

  440. , o7 a* ?) `( r  A+ f
  441.         mov     ax,[temp_mask]
      _% u2 A) k# v% r# w  ^6 C- \
  442.         and     ax,[user_mask]
    1 j/ o' K0 q1 X7 s# ]5 x
  443.         jz      no_call_user
    * {0 S: y) I$ Q7 g
  444.         call    call_user_isr/ U' f( `) z5 U5 E  P- u4 `8 k
  445. no_call_user:. q6 S0 ]5 a# q3 o# j# A
  446. 0 r+ O, X5 L$ p  H, H; ^: E
  447.         cmp     byte ptr [sm_flag],1
    2 d+ d( W& ^4 b6 l( {6 m
  448.         jne     no_show  v" t, d5 z# @% f7 M$ L
  449. 0 G6 R, D- A: W2 D$ u# ]1 m
  450.         shr     cx,3
    # A5 w4 M- u  L, n
  451.         shr     dx,3
    % K; T! q4 L) R" N1 w; c5 T8 Q
  452.         mov     ax,80
    ' |) u6 q  J5 B+ s$ D
  453.         mul     dl, T# W5 a# F! ^/ V
  454.         add     ax,cx
    ; e" i& N/ N/ L$ C3 _3 u3 E
  455.         shl     ax,1
    : z) t+ m2 W% P& S
  456.         mov     di,ax
    ' e4 J0 [5 U9 P' m
  457.         mov     ax,0b800h5 j9 h2 f7 a3 S
  458.         mov     es,ax
    3 s* }% P2 s, K$ O2 |1 b( c- I
  459.         mov     ax,[save_char]
    7 P% ?" c  b& N, p& S/ ]
  460.         stosw8 q/ u, v: T! S% b0 S
  461. , m8 p( x4 k5 K5 U$ `0 [
  462.         mov     cx,[pos_x]% o% U' r8 k6 D1 W
  463.         mov     dx,[pos_y]
    ; k  z, i- g7 X5 z! o
  464.         shr     cx,3
    ' K( P! ^  _% d$ T. ?5 H9 }
  465.         shr     dx,3
    * v* {3 z3 d% Y6 w# H
  466.         mov     ax,80& [  H  n9 s# }! \3 N
  467.         mul     dl
    ' a" U! }! \% t8 s: A4 v7 U! k
  468.         add     ax,cx  L# ?! `3 Y7 s6 O
  469.         shl     ax,1& O) v5 J: R* X) N
  470.         mov     di,ax5 P# q$ @+ q1 y, a; m
  471.         mov     ax,0b800h* j8 m: ]: k, s* j* T0 S
  472.         mov     es,ax) C& F) V9 D' |: `: ]* \
  473.         mov     ax,es:[di]
    ' Q- s+ H6 a1 d5 Q7 P5 e1 t' k" H
  474.         mov     [save_char],ax6 l. M+ q  y7 N7 z/ ], M1 h6 \
  475.         not     ah* l6 @9 v5 p( C  S) D
  476.         and     ah,7fh
    , m! d, D* Z: j1 i3 L
  477.         stosw2 v8 b9 f0 _" [
  478. no_show:5 L0 i/ \6 C1 k- U2 W
  479.         mov     bl,0aeh/ `* ^3 p( ^) T: l/ v6 b
  480.         call    keyboard_cmd
    8 }& y7 M; T: V

  481. 9 K5 W( F- k& k6 V
  482.         mov     al,20h
    3 D6 B- t: E/ s: b& B% y
  483.         out     0a0h,al
    # F% I0 [3 S: N1 [3 F  k' J8 c4 [
  484.         out     20h,al! c5 n- F9 v' G

  485. ( D; `8 R2 Y" [0 `* M
  486.         pop     ds5 n) H3 N1 T7 k4 j3 a3 F% L0 n- A5 a
  487.         pop     es
    # t3 }  r( D- U( B, B6 ^
  488.         pop     si
    9 n3 u3 h6 O+ V' `
  489.         pop     di2 E& V1 X+ q% |4 O, H( c% \/ w5 e
  490.         pop     dx
    " S+ R: ~9 Y! Z
  491.         pop     cx1 V& }  f! H7 b# `
  492.         pop     bx
    5 U/ R6 ]& _4 J0 Q- `9 S
  493.         pop     ax
    # Q9 O; y7 Q) y) C# J
  494.         popf
    . ?7 z! A& z* U" w5 c3 e- |% G
  495.         iret! w3 a5 C! N1 ^; y& q

  496. 9 k" I! {6 p8 o/ f& {
  497. first_time      db      1; p/ D$ I: t. F! d# Z
  498. buttons         db      0+ U. c- }8 m1 W, D
  499. pos_x           dw      0
    * B. c( J$ s9 d% y' ]" ]
  500. pos_y           dw      0% _, _! W" {6 _5 f) K; I
  501. sm_flag         dw      0
    ) c3 n( ?2 d# }) x9 y
  502. save_char       dw      0
    : ~  n! }) _7 Z
  503. x_move          dw      0
    # O. G7 i3 t* {; X9 u; B8 B
  504. y_move          dw      0) l- c: i/ o( t' e
  505. x_max           dw      639" }  ^. ~. i  e) I5 n) l$ g# P
  506. x_min           dw      0
    # s8 X9 s9 Z8 h1 ~2 v$ d, s
  507. y_max           dw      1998 ]% o; G& p$ |8 j6 S7 ~4 [2 v, b
  508. y_min           dw      0
    # q6 o" n: E5 [, M, ]
  509. user_subroutine dw      0,0/ k" P" F0 X2 _  X" ]
  510. user_mask       dw      0' Q. R+ C0 B! W: S2 b8 |
  511. temp_mask       dw      05 M* G4 B1 d5 D3 V) z! y; w

  512. 5 t9 @3 w3 I' d$ P; Y# I/ d0 ^. R
  513. keyboard_read:
    3 L: `6 X3 ~( b5 s0 d
  514.         push    cx
    5 ]' {" y# a& p" u/ m. W6 k9 g
  515.         push    dx
    2 E- Z- a+ K5 l1 P7 i0 k
  516.         xor     cx,cx
    1 S) G/ ^! q+ X5 v+ b/ g3 ~- z
  517. key_read_loop:, @$ i: u/ N1 M0 C: q5 `
  518.         in      al,64h" F5 I5 `& N- C
  519.         jmp     $+2. E4 t5 b. f8 O7 P3 H7 p8 g- h, [
  520.         jmp     $+2# }- S* k' L. {4 x- I
  521.         test    al,1" w$ ?4 v& @' Q5 y3 f/ x9 [
  522.         jnz     key_read_ready
    4 g9 B, j, k: ~$ H
  523.         loop    key_read_loop
    ; y7 P% `9 B7 n# b
  524.         mov     ah,1
    : p, x# `% c6 O3 P; t- j" S
  525.         jmp     key_read_exit
    " A% t$ Y8 r2 R5 P% V9 c$ R0 n
  526. key_read_ready:8 ?1 e5 I. R0 t. i/ g
  527.         push    cx
    5 m: u. X) s( b; |4 L
  528.         mov     cx,32
    3 z$ u. i) b4 l! V9 u/ ^
  529. key_read_delay:1 N7 v; l8 H3 {
  530.         jmp     $+2
    2 y* r- B- \/ r1 W5 x4 ^& o
  531.         jmp     $+2
    % \3 B: O  ]% s; o9 ?
  532.         loop    key_read_delay
    9 N2 ]; \8 L) `" M2 a' C
  533. * I) M  I% X2 g% z. Q
  534.         pop     cx
    3 a' \! i9 _$ h
  535. & [- T6 v# p5 Y/ {, k
  536.         in      al,60h
    3 p" J$ R$ Z8 W+ L) A, r
  537.         jmp     $+2
    ( S; _8 t( G5 m' h0 O! p
  538.         jmp     $+2
    5 h. x; f. u( E% r
  539.         xor     ah,ah* s! W6 d! `* X& K" U# t( n+ q+ J
  540. key_read_exit:
    , p& P: E+ t9 b' ?
  541.         pop     dx0 M! ]. T4 N+ ^, \9 c7 S8 ?
  542.         pop     cx9 ?# M4 i7 A( m% T* @& C$ a
  543.         ret  n- H: W6 B- b' l

  544. 1 Y* ^- y! [; G# j- q
  545. keyboard_write:
    9 F1 v0 H$ k; j3 {+ ?$ O
  546.         push    cx* F3 G( C' K4 C# J
  547.         push    dx5 l5 H: s2 L- Q' f
  548.         mov     dl,al/ |( [( r0 M3 r7 o5 o! X9 x
  549.         xor     cx,cx
    3 ?/ t1 o' {7 X8 N2 ^9 t$ ]
  550. kbd_wrt_loop1:! D# G$ e. O1 Z- S; o2 O
  551.         in      al,64h; @( |! j" z. T! I/ k/ _* O
  552.         jmp     $+2- B5 c" F0 _6 M- A
  553.         jmp     $+2, W3 @7 P* D" J. X* e7 }
  554.         test    al,20h
    + U& i: u- _7 u4 T# m- E; C  J
  555.         jz      kbd_wrt_ok1
    8 k4 V% g6 X0 h
  556. % x, C: Z0 C0 t% o3 D$ \
  557.         loop    kbd_wrt_loop1: U* U7 q2 Z* u

  558. , c1 o4 r. q3 d  R
  559.         mov     ah,1
    ' k" E& z. e- d3 S4 F
  560.         jmp     kbd_wrt_exit
    7 n) ?  T0 `3 [& m

  561. 7 a; S; ]  B7 D" r3 d0 Y; L9 p
  562. kbd_wrt_ok1:* e: u4 E+ T$ n
  563.         in      al,60h: q7 k9 v5 |" c  i: G4 M6 X: O

  564. ! u* b8 ~3 j/ D9 Y5 n( R9 |
  565.         xor     cx,cx( j& T. g6 h/ s
  566. kbd_wrt_loop:
    - d/ X$ y5 Y# p2 f
  567.         in      al,64h1 b/ k1 l; f4 N9 |7 ]# [
  568.         jmp     $+22 ^* x' v3 a- Y3 C1 z
  569.         jmp     $+28 f& p5 F/ E' v: F8 j, L8 h  m
  570.         test    al,2
    % @+ M9 F! S( _5 g! t
  571.         jz      kbd_wrt_ok
    / T) w  F, C3 H6 P; h
  572. & R2 C6 X0 X, l& v' H. o. U
  573.         loop    kbd_wrt_loop
    - t) [5 @7 `- A' [: B7 o
  574. ! p6 u$ z( g) u( K; d) f: p
  575.         mov     ah,18 ?7 u4 x. G: S2 t2 V/ l
  576.         jmp     kbd_wrt_exit
    % W; _" U% P) Z9 y3 Y. D  `: @

  577. ) ?1 M4 X& Q4 q: _! J' e
  578. kbd_wrt_ok:
    8 g: P) p, b3 c, V$ a( k# n7 o" p
  579.         mov     al,dl( N' Y6 D! A( ~2 y
  580.         out     60h,al
    & X- M+ H* X6 }) ]
  581.         jmp     $+2
    ' o$ k7 k9 l# v; G9 D
  582.         jmp     $+2) q* I; `5 _8 l0 [3 _/ {7 q

  583. - x* C$ e& A" c# w2 t
  584.         xor     cx,cx
    , R, i6 B; P5 O6 v
  585. kbd_wrt_loop3:. O1 N3 j% ]9 ]
  586.         in      al,64h# y7 x2 C7 d2 ~+ D
  587.         jmp     $+2
    : u  I. X& a6 ^; Y6 ?1 [; t# g5 G5 \
  588.         jmp     $+2* l. _. |( Q, T9 {0 ~% P
  589.         test    al,2! A; N: o7 ]2 E- F3 O
  590.         jz      kbd_wrt_ok3# K! q) o& P  l, {
  591. 4 w$ u# I' w  V( b% F/ j* v
  592.         loop    kbd_wrt_loop3% _; F' c% c( ]- A: I; B* X4 w0 y

  593. 9 h2 R3 z6 a1 L4 R9 E9 b4 B; h  f
  594.         mov     ah,1! i; _* v/ C6 F3 G6 E, y: c
  595.         jmp     kbd_wrt_exit1 b$ }( ^1 R$ f5 L) }

  596. ) l$ c1 f; _: V' N% w
  597. kbd_wrt_ok3:- o! b/ e; M+ I/ d% }: k, N7 I+ R$ Q$ G
  598.         mov     ah,8( e4 @1 U7 s* t
  599. kbd_wrt_loop4:
    " f0 A, i* I: r0 g5 A5 D7 N% t
  600.         xor     cx,cx" x3 I0 r. r2 z+ F- X; x
  601. kbd_wrt_loop5:
    , Y" T0 d1 b) G4 u' }. |0 a
  602.         in      al,64h  f7 I. V. @4 A: t) T  R
  603.         jmp     $+2
      ?8 x/ P4 Y* {+ z0 `
  604.         jmp     $+2
    ( b- E1 i; ~, y, p7 C
  605.         test    al,1
    0 b3 w# V3 a" s( G: N  Y* b$ _
  606.         jnz     kbd_wrt_ok4
    8 G: m5 P6 H, B- m# _. {( z6 I

  607. % R! y* m* b. a/ V  |) ]& q/ j
  608.         loop    kbd_wrt_loop5. A- X; s& V) j# l  \& S4 [
  609. 7 p, z3 Z  r( b1 i/ A3 ^
  610.         dec     ah# l7 D3 E, o2 Y8 j; Q* {# v% }% h1 x" u+ D
  611.         jnz     kbd_wrt_loop43 Z' s7 z' e2 r! r: J6 k' W
  612. 9 v; I6 t+ \3 t+ t: @2 {: J1 h* W
  613. kbd_wrt_ok4:+ @& q. a7 B7 P5 P- q% N
  614.         xor     ah,ah
    7 C. G1 Y$ M; r$ ^8 |3 E
  615. kbd_wrt_exit:
    2 v9 X0 ^2 p$ q  u7 W& e  W$ y, J5 L
  616.         pop     dx
    % J5 O) g" {% J6 M4 w
  617.         pop     cx
    + n9 q, c. d7 A# R
  618.         ret4 g: x( z: y8 }$ P; S
  619.         
    1 Z- i5 b2 j% Y3 a1 l2 n7 l
  620. keyboard_cmd:
    8 ?/ q6 {( ?2 S8 r5 x
  621.         xor     cx,cx
    1 `1 k2 C" s1 w1 {" R9 V' u7 Q
  622. cmd_wait:5 l. x/ M' K3 f' v7 s4 A+ {
  623.         in      al,64h( ^; f" F5 t8 k" d' m- k
  624.         jmp     $+2
    " x! u& U9 u6 h: O2 T* W
  625.         jmp     $+2
    ) X; _+ D: ]9 }! s9 \7 W: X
  626.         test    al,2
    7 Y  C9 Z, |% p9 {* d' T
  627.         jz      cmd_send3 f" ?( N% H+ b% J8 U
  628.         loop    cmd_wait" ~: e3 A. S4 s+ l! Q% @" u
  629. & L/ r+ h( Y/ ?
  630.         jmp     cmd_error' S0 R+ e9 B  v0 Y1 Z( T5 A

  631. 9 t  {5 I  E+ i8 Y
  632. cmd_send:
    1 G; _. Q0 u; d2 o6 F# j- [
  633.         mov     al,bl
    $ ~2 N; k% e4 ?- E% u# Q8 L8 G
  634.         out     64h,al% J& p! A! W0 D! p
  635.         jmp     $+2
    . h" i# I9 f* E4 K
  636.         jmp     $+2: c' x9 h' c) c

  637.   d- R; X) J9 O4 d
  638.         xor     cx,cx
    - S$ M5 Z) f& z
  639. cmd_accept:! S- ?3 s; p, w& W) q
  640.         in      al,64h
    1 e( J, E5 ?2 S+ w
  641.         jmp     $+21 C; Z+ b; y" h0 _& q. r4 o$ b- ^
  642.         jmp     $+2
    : c7 U# P* b0 b& i9 \
  643.         test    al,2
    5 |4 T' h3 g8 i9 P) M& y' ?, V
  644.         jz      cmd_ok7 N- M/ l- Y; M4 r
  645.         loop    cmd_accept
    : [6 N4 E% ~1 S
  646. % m" l$ ]7 i# t" a5 n: U0 S& _" z. O
  647. cmd_error:# s- W, p7 j. t! w7 ^6 f8 u
  648.         mov     ah,16 M$ S3 \6 J% S1 m# s% {8 A
  649.         jmp     cmd_exit5 n% y4 ~% j$ f. F7 u# k. [
  650. cmd_ok:" f( ?; n, N+ o5 d9 x, h$ m
  651.         xor     ah,ah& }+ n: G; G0 f5 u: c) d6 ]2 O% M
  652. cmd_exit:6 s; i3 j4 b5 U1 x1 N5 c
  653.         ret
    , i( l/ B6 ~+ g7 B

  654. ) N$ v: @9 ?9 g" ?0 W3 U0 Z9 P; Y
  655. new_33:
    0 u! A3 |2 A. L# u! W8 \
  656.         cli5 A7 P' i  d7 {. T; |* p& K8 M
  657.         cmp     al,0! w  C/ Q  x# k# s8 `6 E0 A
  658.         je      reset_mouse) d+ a* x- P- Y" }: c4 e
  659.         cmp     al,1
    2 l! r0 V7 d' D7 X! M9 L( t1 A  x
  660.         je      show_mouse
    & s! }' D9 w9 M1 }  I2 [
  661.         cmp     al,2. M+ }% V' e1 A
  662.         je      hide_mouse
    ' B) \* x- K; E. K* j- U6 @
  663.         cmp     al,3+ N/ N1 m, b3 l& L2 T
  664.         je      get_pos
    7 A- P# x0 ]4 f5 _5 Y& e
  665.         cmp     al,4
    - t3 S$ E8 N$ H, [. [: Y) @
  666.         je      set_pos1 V4 C1 r: e8 e7 }
  667.         cmp     al,7
    # G8 b( _2 d7 d; l2 y+ r; C9 D
  668.         je      set_hor_pos
    9 Y# U& a+ F5 c' a
  669.         cmp     al,87 T$ Z3 q4 q# {3 P, R
  670.         je      set_ver_pos0 g/ o: Q- h% P+ l% ?0 h
  671.         cmp     al,0bh1 q" }2 ?8 n$ f3 Q! }
  672.         je      get_mouse_movement
    : ]# X! P' y' @) A  O
  673.         cmp     al,0ch9 T3 }- _# }: l. A3 f
  674.         je      set_subroutines; o4 Y7 }8 l5 C! F: s
  675.         cmp     al,14h8 ~$ ~+ w4 o" V9 J
  676.         je      swap_subroutines
    : O! N7 c  L- H, c$ T" n
  677.         iret8 p* p: ^9 V8 n/ C7 M, W

  678. ' M0 D- i3 M1 Q/ Y2 L$ W
  679. reset_mouse:
    $ o! {1 n& s  J+ s. A" p+ Q2 M
  680.         jmp     _reset_mouse
    4 d& F& Q  e6 d5 E! A
  681. show_mouse:
    5 N% F! W0 S5 C9 D0 }
  682.         jmp     _show_mouse% @. P5 G) G  b) C( t
  683. hide_mouse:7 u  t4 _5 u' G. W
  684.         jmp     _hide_mouse
    7 I' b" K9 g, O
  685. get_pos:
    ( R" L7 b! Q" {4 j$ N7 G8 P7 J" z
  686.         jmp     _get_pos1 A4 {! _8 Q7 {: U
  687. set_pos:$ c+ R9 Y, b( r. w7 b0 e' Q4 v
  688.         jmp     _set_pos
    " O# r/ c% I2 @, z" W
  689. set_hor_pos:
    " L/ _9 Q" K. Z# B' f5 {& A7 }
  690.         jmp     _set_hor_pos
    ( a7 `6 H9 {$ h& r: B- t
  691. set_ver_pos:
    1 Y; X1 G# X4 v' V8 y
  692.         jmp     _set_ver_pos
    ! I6 D0 a- s5 j7 {
  693. get_mouse_movement:
    1 n: i" r# K% F) N
  694.         jmp     _get_mouse_movement: @9 y3 e* c$ J  N: N1 m
  695. set_subroutines:5 i& n' x8 L( ?9 {2 `) ]  ^
  696.         jmp     _set_subroutines
    4 j; s/ U" i# a( R. S, U! ?
  697. swap_subroutines:: h9 h- e% j3 t4 `. Z, C, l
  698.         jmp     _swap_subroutines6 i9 y1 [7 F. v. P$ @0 p

  699. - \: g! w3 Z, e
  700. _reset_mouse:" o) C& |& k5 s
  701.         mov     byte ptr cs:[buttons],0
    * N5 |5 A  b* z. i/ A- [4 U
  702.         mov     word ptr cs:[pos_x],0, r+ Q+ l) ~' N1 s" `
  703.         mov     word ptr cs:[pos_y],01 i' X6 H$ O3 P* T5 M7 z& v
  704.         mov     word ptr cs:[x_move],0
    7 O# f8 j# M) t5 C3 \* h  J  k
  705.         mov     word ptr cs:[y_move],0
    # k& C8 O0 v1 }! L: N, o9 R
  706.         mov     word ptr cs:[x_max],639- B. N* |( N6 \
  707.         mov     word ptr cs:[x_min],0
    ; s0 _0 ]; G3 [6 I2 P
  708.         mov     word ptr cs:[y_max],199
    & K; i* H/ F" t# N" b- ?
  709.         mov     word ptr cs:[y_min],0
    " t) f& J+ g9 e- z: }% Q" `1 C
  710.         mov     word ptr cs:[user_mask],07 m1 j# X8 v( }
  711.         mov     word ptr cs:[user_subroutine],00 g. v1 h7 a$ P4 P$ J
  712.         mov     word ptr cs:[user_subroutine+2],0/ Y# J7 E0 ^' k, }7 E
  713.         mov     ax,0ffffh
    - B% R, Z% b$ N5 H' i4 z
  714.         mov     bx,3
    3 Z5 e% d  A- s5 A2 I6 L
  715.         iret. [* O1 `+ \4 Z% ~! s6 |  J6 ~
  716. # h3 @: T' Y" }! w! K
  717. _get_pos:
    & _4 A, P# ^+ }
  718.         mov     cx,cs:[pos_x]3 w  L& Q9 f  \! g, p
  719.         mov     dx,cs:[pos_y]: ?) C: a" p  X6 T! A: U$ w
  720.         mov     bx,word ptr cs:[buttons]8 W, P" ?4 E. p1 E" K, A% i7 j. u
  721.         xor     bh,bh$ U5 Q  Z9 D0 r$ c" R/ ]
  722.         iret
    ) e7 B, I+ J7 v9 |% R; |. ]9 Z

  723. ! L5 E/ O/ v6 e9 {
  724. _get_mouse_movement:+ s; @" d0 O* N, D2 i* b: R1 O
  725.         mov     cx,cs:[x_move]0 V/ y, i* n+ \2 I5 f( _+ u" [4 R0 g
  726.         mov     dx,cs:[y_move]
    + R# ]" Z  k& i& A! d7 b( F! W0 y- O
  727.         mov     word ptr cs:[x_move],0
    9 u& F/ f) x& r/ ]. H
  728.         mov     word ptr cs:[y_move],0
    7 j! |9 k& g) C( i5 Y
  729.         iret8 e3 w3 a% B# R8 p  Z  i& v
  730. 7 I$ _  M! N" j" m* G- E: Y
  731. _show_mouse:$ w% c; R2 h8 E+ q8 _* o
  732.         push    ax. ~. C5 R3 c& p3 ^9 F, L
  733.         push    bx/ v0 i2 ~6 i9 @) T
  734.         push    di- y* o* u8 g" n% e9 S( s
  735.         push    es
    5 V3 v  e% s- y# b3 ]& G0 Q
  736.         mov     byte ptr cs:[sm_flag],1
    % J  v4 ~, F' D. R
  737.         mov     ax,cs:[pos_y]
    $ |5 h+ j9 X. L9 |$ m
  738.         shr     ax,3
    ! g+ t/ Y7 q3 p0 U: k+ E
  739.         mov     bl,80
    . N% b. W! s, C8 h, J8 [2 n
  740.         mul     bl! u5 O- k; [8 i/ J8 r, {
  741.         mov     bx,[pos_x]' `6 A  l! S- o+ J1 G% h
  742.         shr     bx,3# @' @& p; l) k* z
  743.         add     ax,bx
    7 R1 m- ^' {' I7 N8 R6 b
  744.         shl     ax,1% o4 I- h' y( g# f
  745.         mov     di,ax
    ) R7 p2 H0 }+ G
  746.         mov     ax,0b800h' X( y- g" u0 }
  747.         mov     es,ax
    # P; s& T- z1 |. J- R! a* N  y
  748.         mov     ax,es:[di]7 y) l6 k' c, Y
  749.         mov     cs:[save_char],ax
    " L6 J; C* H) m) p9 U) i
  750.         not     ah
    7 ^7 \* e. e# u5 l3 Z+ \
  751.         and     ah,7fh
    / H0 ]% U3 S+ H! [
  752.         mov     es:[di],ax
    ) ~# u" x2 ?# N% O7 g4 u% m
  753.         pop     es! p+ Y3 }# }/ s9 r( s
  754.         pop     di+ j1 r9 D  f& L  J% x( H7 `
  755.         pop     bx
    % A* y0 b( q- u* u0 E+ n
  756.         pop     ax. T6 T) W" c" N& }$ f
  757.         iret& V) T+ L7 ?/ e! |; P) b$ }
  758.   {1 x+ E: p' o  ^/ F/ `0 w* [! x+ Q
  759. _hide_mouse:; [1 X% X9 ?8 h0 x4 @$ \; y
  760.         push    ax' o* d  s- c# }, U
  761.         push    bx' [( _+ T  y8 U- w1 g1 U7 S
  762.         push    di9 Z8 t8 W0 p% q3 f0 t6 ^% s
  763.         push    es
      T1 }7 @: q, L# `
  764.         mov     byte ptr cs:[sm_flag],06 \  {/ }. M" w7 y3 M% T
  765.         mov     ax,cs:[pos_y]/ V: P$ z' b8 u& X
  766.         shr     ax,3" M8 P7 I: H# V
  767.         mov     bl,803 @& X) m0 y& c0 n
  768.         mul     bl& D) _! O6 _# \5 E
  769.         mov     bx,[pos_x]+ c0 G0 c6 ^" _0 h" o
  770.         shr     bx,3
    . J" \4 _1 u! O/ {9 t. w
  771.         add     ax,bx
    0 c% O! M. _6 c4 Y
  772.         shl     ax,11 E# H* @3 ]. e0 X1 S
  773.         mov     di,ax9 V/ y3 F2 ?* k+ Y
  774.         mov     ax,0b800h/ w- s  x' R2 i$ o+ {
  775.         mov     es,ax
    % k2 u' j( Z8 E2 d6 A: c
  776.         mov     ax,cs:[save_char]
    , W% C% G( d; r8 F, C8 s
  777.         mov     es:[di],ax2 Z. E5 Z* M& s6 s2 K+ r5 I
  778.         pop     es
    , Q; W7 J" G2 v- v4 W) v' O
  779.         pop     di
    * V. ^# x$ ?1 c' }$ ^4 H
  780.         pop     bx
    6 u% p- @8 c% z) I0 ]' h) S
  781.         pop     ax0 s9 I) J( j3 X4 L- H9 e
  782.         iret4 F  I7 P2 ^' B& Y

  783. 9 b0 P$ a- o  Z6 T5 \  G: W; Z
  784. _set_pos:$ B* u$ s, v5 a- m2 Y
  785.         mov     cx,cs:[pos_x]7 O% n7 Q& t8 U
  786.         mov     dx,cs:[pos_y]
    / u# U+ z* ]8 f$ ^* S
  787.         mov     word ptr cs:[x_move],0- M* x% K7 Q) {( n4 k+ g
  788.         mov     word ptr cs:[y_move],0
    / d4 c* p) g& e# ^- N1 H
  789.         iret
      d& H  M! X" S
  790. 0 b2 c" m& A: L2 k
  791. _set_hor_pos:# J6 }) t9 Q0 I1 d% U2 G
  792.         call    max_min
    " c# K( f1 E# v
  793.         mov     cs:[x_min],cx
    : _5 ~1 n" j4 c% i0 O! ^/ G: R" |
  794.         mov     cs:[x_max],dx
    # v9 n& t7 C6 D0 u/ A+ Q
  795.         cmp     cs:[pos_x],cx
    ' Z; r* I1 ^$ O6 {" s- {
  796.         jge     good_hor_min+ s7 B; |( q) q- k# _" E7 S; Y; d" K
  797.         mov     cs:[pos_x],cx
    8 s  R8 A6 K* C, X
  798. good_hor_min:
    . {" n+ S/ @# r- s% v
  799.         cmp     cs:[pos_x],dx
    % I& Y3 A$ ?( N. u+ j0 \$ J; q9 N
  800.         jle     good_hor_max
    , {+ x" d. O0 u5 u; o
  801.         mov     cs:[pos_x],dx9 M. y: g6 k8 D: s, V
  802. good_hor_max:1 ]- d( R7 G& W4 J" ~3 D
  803.        iret3 W. |1 g+ T+ T. w

  804. 4 i5 C! E3 Q( S) _4 F6 w
  805. _set_ver_pos:  i/ H4 }, y2 t( o$ n4 T
  806.         call    max_min
    1 B* e: o! ^5 n9 k% \9 ]  C
  807.         mov     cs:[y_min],cx: F  l" h4 x8 P$ t, j
  808.         mov     cs:[y_max],dx
    3 m/ T4 B. w% y! R% \1 r$ u  H/ R1 `
  809.         cmp     cs:[pos_y],cx
    + q! I* W& T5 L  |0 O$ f0 L  @
  810.         jge     good_ver_min% H8 G/ h0 u  z
  811.         mov     cs:[pos_y],cx
    2 o6 C) C- _) ]2 n5 [" p0 q/ ?
  812. good_ver_min:
    * e, m$ B0 D/ Q- {$ Y" W
  813.         cmp     cs:[pos_y],dx
    3 \0 H9 q( Y8 r
  814.         jle     good_ver_max
    / V8 I% `' R8 P" [* q1 G
  815.         mov     cs:[pos_y],dx
    ' }. s, P" ^' V% o3 Y
  816. good_ver_max:8 T2 R9 ?! z- |
  817.         iret+ v5 W. A  W! \. y2 P4 {3 ?. Q$ L, a

  818. 7 \4 g5 `" }: E( S, u
  819. max_min:
    , `2 U) ^1 ~* R9 n* V
  820.         cmp     cx,dx
    # d9 x5 p0 `$ o2 H, E) T; Z
  821.         jle     no_swap
    $ \" |+ n0 m/ {  q" D. \: v  U$ _4 i
  822.         xchg    cx,dx
    0 V+ D# c/ t  ]% h/ Y! s
  823. no_swap:* J3 Z6 r: X; A. @" J) n; E; l
  824.         ret
    2 o, T# E5 @  E4 Z0 O% ~" l5 G

  825. ! V  ^8 l: Z4 P- D
  826. _set_subroutines:/ E6 _/ }6 L. c1 Z; c& U$ Q
  827.         mov     cs:[user_subroutine],dx6 q; x4 N9 m$ ^9 E7 B+ P
  828.         mov     cs:[user_subroutine+2],es
    ; N0 z! j- n4 G
  829.         mov     cs:[user_mask],cx( |% h" {' V) u' q% [
  830.         iret
      Q8 t% i2 r: B( u

  831.   t( }& H. _1 Z3 c# i" n
  832. _swap_subroutines:
      K5 B) z* o& U
  833.         push    word ptr cs:[user_mask]' ]6 O5 ^8 v+ L5 A  W
  834.         push    word ptr cs:[user_subroutine+2]
    ; S2 Z: m# P" _* S  j' _
  835.         push    word ptr cs:[user_subroutine]* r1 l. `& T) A! U4 w
  836.         mov     cs:[user_subroutine],dx
    4 \4 [& t& ]9 A# x, m) \
  837.         mov     cs:[user_subroutine+2],es( V! Q0 n* K" y- E' y' z4 p
  838.         mov     cs:[user_mask],cx
    ) }3 F) q9 M1 {9 H: P" b% B
  839.         pop     dx, |& a* y7 j% H
  840.         pop     es+ r# n9 B- A) K' V5 Z
  841.         pop     cx
    1 m8 Q# n9 x+ t3 c
  842.         iret7 b2 o. U' x! K# M: X

  843. 1 B$ j7 E" h9 ~, b2 z2 }
  844. memmouse        endp/ D' F* o4 |/ m1 P

  845. 8 d1 [2 @; F3 A" D: w. V
  846. endof_start:
    9 x* U! K0 _  \, ^$ T' q: m

  847. 4 e% R* z* B* P( }6 y2 \6 F# I
  848. emsg db 'No mouse driver install error!$'+ j7 M" N( G: s; F* x9 y( Z7 t/ y
  849. old331 dw 0
    : t& a0 Z4 w7 I' G
  850. old332 dw 07 s! ?% M- o0 i4 Q1 i
  851. old741 dw 0
    ( b* I8 D+ `* ]0 @5 E. _2 V% w
  852. old742 dw 0
    5 Q% c% \% r- j  x# W6 W9 y* l
  853. memcopy db 0
    4 T: u; H6 i" k: i! s+ w
  854. okcheck db 05 o) k' w& V3 }  {" T" M" P
  855. pass db 0. d: ~# G6 e  Z0 ~% a; x! \
  856. chkl db 0
    . B" z4 \& Q  I2 a* U
  857. lk db 0$ ]8 V, n) ?" o
  858. chkr db 0
    * i7 T' v; q) T
  859. rk db 0
    " Z# b. W( V4 r& b! {# e6 [, d/ Z
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
      U! B8 c0 F0 x9 R# ]
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '- D* p5 p. d6 H7 `$ |, e( l
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '. Y) _8 z3 _( c8 j2 n* N
  863. db '                                                                                '
    5 s( q2 T. v1 j. h. _! u1 _2 b6 G# \0 S
  864. db '                                赏屯屯簧屯屯突                                  '; v' h. ^) ]( e( S% K& P4 ]* \
  865.         db      '                                ?OFF汉OFF?                                 '8 C4 x" |7 H- L. y
  866. db      '                                韧屯屯既屯屯图                                  '
    ' R- p+ P6 r" Z5 x) N' }& c
  867. db '                                                                                '" d7 t: h" |8 W) C3 h+ m: }5 t
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '( x! l0 P* `& o! [. z! y4 x3 R
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 2 p0 W- s& s7 w& D: U5 P2 T; ]
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '/ l6 W7 o. B- _: Q0 K
  871. , N. n& l" W/ ~7 }, u& M+ B( u
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!' |. Q+ I& h5 M4 e$ x: B
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
+ R; s: Z; W6 G. J" J2 s8 H9 k' ?  |3 R
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 10:35 , Processed in 0.032302 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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