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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
' h8 E/ w: Y/ o' u
/ x/ a, A( R, f, ?3 h代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;# Q" M7 y$ @% Q! ], M' R
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    8 P! [/ C' C4 H) ^* C+ i+ H
  3. ;                                         By Bini.Yi 易祝兵( S, h8 a$ Q( T- n5 E) T) X& ~
  4. ;                                         http://www.ufoit.com 计匠网
      @# h; r5 E' @% X
  5. ;                                         2002/04/06 YYYY/MM/DD# A0 v* e7 c, r' ?8 @' g
  6. ;
    2 ~8 e: ]+ ]& q# W5 p' v9 [  _
  7. ;          " e: q2 I: d5 y; ~# o0 Y! j
  8. ;          This program  test the mouse button  click and move.9 |# m% K' z: Z" h: q$ t
  9. ;
    0 _. @; v0 l2 o8 F$ k7 _4 A
  10. ( b+ N' Q/ o5 l! H  \8 i# H
  11. .model tiny
    3 {" N; b. V7 G: L0 Q/ G; n
  12. .5864 R% d4 U& K' I% Q
  13. .code
    - m% d) a; n: J
  14. .stack  100h0 `& a7 q0 c: R9 {- ^( E6 s' D
  15. .startup
    ' q( T  K% |+ Q
  16. pusha
    - o/ t! o  h# v. _# o' i! E
  17. mov ax, 3533h
    5 N1 H& `& ^7 Y
  18. int 21h' ~- `; n& B; U: q/ u2 @2 X
  19. mov word ptr cs:[old331],es
      {2 l% K- y$ Q4 V8 @- t
  20. mov word ptr cs:[old332],bx
    / ~% g  y6 V5 Q( D3 @
  21. mov ax, 3574h
    ! M4 |1 c& u8 ?; B- Q) r. T8 A
  22. int 21h7 _3 k+ ?7 P1 G, ~. E' v
  23. mov word ptr cs:[old741],es0 r& y! ^/ p  y3 ]5 s- h5 g
  24. mov word ptr cs:[old742],bx
    / t4 M3 z) n: Z) X; C4 O/ P
  25. popa% D2 g8 V" Q5 B$ v( V
  26.         call    memmouse1 z3 Y! O& ?: H5 I- d/ z* r2 `
  27.         mov ah, 00
    ' ]  m3 h3 {" @- x1 k
  28. mov al, 03
    6 a3 F8 s1 L* v' H* J  B! z
  29. int 10h4 z" m( B. _( L
  30. mov ah, 06
    * q* S+ r/ e) A1 N; [2 F2 O
  31. mov al, 0# R- ^7 K" n& d5 i6 U+ n: Z
  32. mov cx, 0: f/ ^' }* N0 o/ R' f9 e2 A, y
  33. mov dh, 24+ }2 O8 A$ |0 O$ x5 @* Q1 j
  34. mov dl, 79
    9 a4 m6 ~: T# J
  35. mov bh, 07h
    2 `: o, m0 i/ ^2 P5 T# ]
  36. int 10h. U# z  @, _+ u8 u
  37. mov ax, 0000) V+ Z1 j6 @# F% F% r
  38. mov bx, 00021 |: V6 w9 F+ f7 O4 M- q- x" V
  39. int 33h* n- u6 ?( z* h
  40.         cmp     ax, 0000           ;if no mouse drive install
    9 P* E( D) H. X) S7 P- t
  41.         je      errormsg           ;show error MSG
    0 l" W; y! @( O7 n" l+ ^
  42. mov ah, 02
    1 d7 u6 |6 s" Q+ {! r* b5 x: y
  43. mov bh, 005 g9 g, _- N6 L4 ]
  44.         mov     dh, 25             ;Move point out screen3 z2 {8 W" `6 h! T$ K# A
  45. mov dl, 79# i3 c4 U3 f7 K6 d
  46. int 10h
    7 v+ A7 \6 F$ g9 ~2 l
  47.         call    showmsg            ;Show info" Q" v( j$ B. E5 N( w. I
  48. mov ax, 0001
    ) O* y' Q) D  R: O5 ?" P9 m
  49. int 33h+ C6 j. E/ C$ G* d6 ^
  50. ; mov ax, 000ah
    1 B$ V1 [5 o* e! i7 V& _
  51. ; mov bx, 0000) h, ^. q. t3 T; y! m1 ?1 J& W7 x& P2 u
  52. ; mov cl, 0h) [! ?  c: D9 d1 s+ q
  53. ; mov ch, 0F0h
    # l5 r5 h" x- T$ ^& a. C
  54. ; mov dl, 0h
    0 v& u! d$ Y% _8 [( C) g
  55. ; mov dh, 0F0h
    2 ~" R6 F! g/ D! P- y" O
  56. ; int 33h- G. @5 c. |' `6 l0 Z5 j
  57. mov ax, 0004h
    ) G; m  U' [5 K3 q
  58. mov cx, 0319( J% k5 p& o% v; W0 z
  59. mov dx, 01039 o" T4 P0 C0 M8 L
  60. int 33h  D2 P) R) c2 X3 [  U  d+ E
  61. casemo:                           ;Case button click and point move ! ]; \; |5 J# V' y% Z4 U
  62.         mov     ax, 000bh         ;and keyboard press
    6 A( y0 n; ]$ @, O6 b( v
  63. int 33h1 G$ Y$ a. q% D/ u- G4 _; ~
  64.         cmp     cx, 00h           ;if point move....X# O7 C8 b, C8 X
  65. jne xmov
    # g3 x/ G; y9 T. o/ b
  66.         cmp     dx, 00h           ;if point move....Y: w  _% H* x9 B, [
  67. jne ymov
    + j, ^4 M9 G& k4 Z# l. ]
  68. xymovend:                         ;X.Y move end6 A. X' r# N  @* ~
  69.         mov     ax, 0003         
    0 ]- H0 x4 ~: z  {$ d( p
  70. int 33h
    ; S8 e5 X/ U7 s
  71.         cmp     bx, 0001          ;if left button click  show ON
    0 o$ Z" f; c; e. _; g, z- \
  72. mov si, 1828, r5 V! P6 q3 A& W9 S( f! ^# f) w- m. o9 E
  73. je listl
    ) B1 [$ b6 I" y6 r3 p! }
  74. mov si, 1828' J2 {+ R* j) r* F4 p) h
  75.         jne     nlistl            ;if left no click show OFF
    6 {* L; ?( R7 T# e! Y
  76. testr:) \" p; |* H! f0 n* p
  77.         cmp     bx, 0002          ;if right button click show ON5 O) E8 [- }+ M( m- g
  78. mov si,1842
    5 ?& _) x& d1 S$ a# }9 [9 o" ]
  79. je listr
    ; m% N0 n# k* g/ E8 @$ F9 }
  80.         mov     si,1842           ;if right no click show OFF
    2 ^! L2 n/ W6 G( |/ @
  81. jne nlistl, g# k3 c" _" {  \; _
  82. casekey:
    ; R% u  e. n# j( L6 p8 J' e
  83.         mov     ah, 01            ;if any key press jump check
    8 p. ^. y* n" J  T3 {
  84. int 16h: ]$ ]- x. c4 G8 O# S5 ?
  85. jne kpress5 h  f' @- C2 {5 D/ U. F* h6 G% w6 ~
  86.         mov     al, [chkl]        ;check x flag! d0 [4 v9 a9 ]# i2 x# o0 g2 D$ ?
  87. cmp al, 02h6 D3 A8 H$ \1 b4 m9 Y
  88. jnb chkok
    $ ?* U2 V; ^' t$ G; y5 Q" K
  89. jmp casemo
    8 J6 T, [! o' n" ~: |( ?% e
  90. xmov:                             ;if X moved, get the X flag+11 R0 b9 ~6 b3 J& }
  91. mov al, [chkl]: c  B1 n2 g  A9 d# Y" |# y; _
  92. inc al
    ; @5 h0 o2 C5 ]4 |! {/ Z3 ?" D
  93. mov [chkl], al  T  q5 z0 Q% o( B  P$ S* F
  94. call passok
    ( U; |& Q2 Y" y$ s" x$ |& _3 {
  95. jmp xymovend, J; X- z# ^1 `, T1 M6 l/ e
  96. ymov:                             ;if Y moved, get the X flag+1& @- L, A7 G+ N9 R/ M8 U4 h
  97. mov al, [chkr]1 x, T. f; h) I, q, V
  98. inc al
    ) e& }$ ]4 P8 m. W; `+ d. N
  99. mov [chkr], al% J2 F  \1 j! e" K
  100. call passok
    $ G9 A8 A% n7 C6 @0 _
  101. jmp xymovend
    2 H, L2 n/ A" q  o  l
  102. + j6 Y( \# |2 K# j7 q! z- }8 b
  103. passok proc near
    7 k. R8 r, }  c
  104. mov al, [okcheck]
    5 t3 U' w3 J& z7 W, M9 \" g
  105. cmp al, 1
    8 B( Y3 C( v" u3 R: P- [& U. X: E6 q3 f
  106. je let0
    ! C! o2 g4 l2 W) v; \/ }& d6 y) [
  107. jmp passret* r+ [  Z$ a; J. Y- i! k
  108. let0: . @  x8 b6 ]3 ~6 ?
  109. mov [pass], 1" p+ L! Z" e6 q# C9 y: A( Z' A
  110. passret:
    . j" |5 L2 X, P/ x+ g' Q
  111. ret
    7 g" ^5 t" w" e: l- x
  112. passok endp 7 |% x- ~4 a' w& A, Z
  113. $ E* R" }; s0 {
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    1 J; q: k1 T# h. O3 N& F$ @
  115. mov al, [chkr]- i6 x. o% m) W' A! O. y/ N# B6 z4 p
  116. cmp al, 02h
    # |; K  p1 }3 k8 [; ?' \6 D
  117. jb casemo2 h8 X4 V, b4 |: ^3 n2 b* c0 l
  118. mov al, [lk]- n2 C$ V! x# s! j. c+ o+ x0 C' l
  119. cmp al, 1
    6 s5 D) q  c) `2 J- a% Z6 M3 Q
  120. jne casemo
    2 s& W' d" _) J' Y  c6 c
  121. mov al, [rk]
    + E2 O7 u+ l- ^" m& p
  122. cmp al, 1
    - ~4 F* @5 @6 a0 |
  123. jne  casemo
    7 N9 Q% Y: c$ T! W7 J
  124. mov [okcheck], 1" C8 [+ ^2 X  m7 j: B8 @. i) p
  125. mov al, [pass]; t' [8 R0 s3 L1 Z
  126. cmp al, 1# F) r" B; o; G0 Z7 d: v
  127. jne  casemo
      k5 ], w; U4 V( \! z
  128. mov ax,0002h
    8 D$ }, o$ T) K: }' B
  129. int 33h+ k( r. w: i3 n& }  b6 R6 }% z
  130. call cleascr) R" d4 H+ L% N
  131. 3 Q0 `1 E/ s- H" n. @/ A3 N
  132. call oldint  ?3 |8 r8 R' P- w. f3 S" c
  133. mov ax, 04c00h3 a7 u) i: E4 E/ j- M: F0 q
  134. int 21h1 ^# d' n- Y% F0 @; x
  135. 8 I, x" V" r& [6 i: i
  136. okexit:
    5 y$ z; F% V' b0 h" N3 r4 G& Y
  137. mov ah, 4ch1 e, D7 V  o& P' }, O/ H
  138. mov al, 0
    + b9 [; ~% W  t3 _- s6 i, Y
  139. int 21h9 U) ^0 D7 J* a( [
  140. listl:                                 ;Show ON- g5 B4 o% H" ?- C% E- h* [* M
  141. pusha! T5 P! }4 Z9 f2 v: x7 l8 f& K
  142. mov ax, 0b800h
    1 m( n+ @# Z5 \( h* R8 U
  143. mov  es, ax3 L6 O0 x  p" L. |' p9 f
  144. mov ah, 47h5 Z/ U3 V/ r& n
  145. mov al, 20h
    / `  z1 T& n% }3 [  F! Y, @
  146. mov es:[si], ax
    2 z& a- B0 I. ?+ E5 x7 r. p3 t
  147. add si, 02; F! I+ i' x1 Q4 B- \' z
  148. mov  al, 4fh
    + M: Z' [6 }' Z( P+ k  u$ A
  149. mov es:[si], ax
    1 R7 O* H3 l& F" J! v: V
  150. mov al, 4eh2 ]9 J1 e+ B- v1 c5 z4 y* p
  151. add si, 02% i9 m9 f3 g2 v" Z, K) T
  152. mov es:[si], ax
    ! b  l) e6 c- o' b+ W: O
  153. mov [lk], 1
    4 ~9 R1 z* S  b: A
  154. popa
    ( `) y' j$ q1 t( z* @
  155. jmp testr- g6 q! P6 e& L. a7 c" i: E9 E
  156. listr:                                 ;Show ON$ k- G" u5 j$ Z+ ^+ p) L/ M
  157. pusha
    5 w! B; k. R' X  x
  158. mov ax, 0b800h5 ~2 g6 [# ~# i2 X5 [9 x& H
  159. mov  es, ax
    ) \" e* l' k* h0 p9 s0 l4 f7 ]4 E, d
  160. mov ah, 47h) i* i# V9 ^' n% U4 s7 [
  161. mov al, 20h# |5 K+ i( p! w% n# e+ P7 r  p
  162. mov es:[si], ax
    ( q0 I; f9 V8 Y& x
  163. add si, 02
    ) H. S8 z; \2 @* `& u: {+ q" X: Q
  164. mov  al, 4fh' w* P9 r6 i- M( m+ M! R
  165. mov es:[si], ax
    " K+ z. M; \' c6 l& M7 ~$ L% ~2 t/ q
  166. mov al, 4eh$ y* I$ P, X1 m' N
  167. add si, 02( B* P. {  f& g  r( ?: `0 c
  168. mov es:[si], ax
    1 B( ~6 e8 I! w' j) C. H3 y
  169. mov [rk], 1
    0 B- U, E/ e$ D! K. z8 x/ T
  170. popa  J# A6 U+ q8 S: R0 |" d
  171. jmp  casekey
    9 i6 g, b. |0 X* M  p& b9 t

  172. % [8 u7 b" ~3 l/ W% `: k
  173. nlistl:                              ;Show OFF$ X6 ]' T3 h2 E& C
  174. pusha   
    - Y& v( i+ D5 w* y! U
  175. mov ax, 0b800h* N% d: i5 q+ m$ l
  176. mov  es, ax
    : B  W4 C$ H1 |* M* F
  177. mov ah, 17h
    0 ]$ Z8 F! L: j" \  L& N
  178. mov al, 4fh- [/ z6 E1 h& j! i
  179. mov es:[si], ax" ^5 B" s# A0 P' N
  180. add si, 020 r2 H" x% `5 v6 C1 t
  181. mov  al, 46h
    3 I5 t; D$ e+ k, J( q( k+ H
  182. mov es:[si], ax
    : z: H2 N: o, R+ `/ b( |1 c
  183. mov al, 46h
    $ l4 J# g" ~4 H) D% Q
  184. add si, 02
    6 L4 l) w7 W+ V; ^, `% l" N
  185. mov es:[si], ax. C5 ?" I* E6 s7 K, H/ d& ~- |
  186. popa
    - `0 u7 v. A# F$ Y
  187. cmp si, 1840; z2 O5 q9 t6 L% `
  188. jae casekey) c1 Z6 p% l6 i% c- L3 @9 P7 W7 w! }
  189. jmp testr
    8 _6 r) y/ w6 X* U
  190. 1 n8 X: K* i2 r6 R
  191. kpress:                             ;Check key press if press<ESC> then EXIT( R1 U' I1 U- Y9 V8 n
  192.         cmp     ah, 01h             ;and return a error  [% u6 G7 \5 e, y* X( j
  193. je exit1
    ( ^) ^! R& n3 k' H3 Z( I
  194.         mov     ah, 0ch             ;if press other key then clear7 w& K( c4 n7 ]* @0 i( }
  195.         mov     al, 00              ;keyboard buffer0 s+ v+ Z0 g5 P7 F* d* w# G$ m$ o
  196. int 21h' Z/ d, v% g& c: p
  197. jmp casemo
    " N; z0 h2 [1 E& o) P0 s
  198. 4 I. x4 X1 [( x% e
  199. errormsg:                           ;if mouse driver no install2 ?) A8 Q( P! B7 Q- p# Y# G1 F
  200. call oldint. s: H: o+ y2 @. a8 ~
  201. lea dx, offset emsg2 n" e/ L2 l( H8 R1 E  N
  202. mov ah, 09h
    ! N$ X( R$ D  p5 r. a3 O% P5 X
  203. int 21h8 G; M$ R. u. w. l3 g
  204. mov ah, 4ch
    ' X7 L1 H' i& [. c' s0 I) j
  205. mov al, 2
    , \" ?$ G* Y( E8 _
  206. int  21h6 ]( S9 w9 j: w  {  v; W

  207. 7 k4 _: F. g6 Y2 Y: \3 o
  208. exit1:                              ;error exit
    # ~3 N+ X. T  T' L! t
  209. mov ax, 0002h
    " |1 Q% M9 `' X; x% X* G* T' m
  210. int 33h
    ( B1 l* ~% D* }1 O; V9 b1 C
  211. call  cleascr0 B2 Q/ U3 _# v, m5 d/ z- J
  212. call  oldint
    / ?: q3 P2 J' G  T
  213. mov ah, 4ch
    + c2 U5 P, T! |/ H, \3 a% K& |
  214. mov al, 01
    5 S! w. R% Z: z! g6 a/ A
  215. int 21h3 j- f& e2 O( l4 B; V

  216. 3 N3 E% O0 y8 B
  217. cleascr proc    near                ;clear screen6 H- o0 R# S& `& l) f  v( U
  218. pusha
    / W8 F2 l0 U: y0 c
  219. mov ah, 062 W3 @( d: V) h# i
  220. mov al, 01 x7 c3 M% Q& b; g' S5 x
  221. mov cx, 0
    . `: m2 F0 z6 b, B0 S- T# U# n% E$ Z% p
  222. mov dh, 24& l6 n1 x; _6 q2 s- h/ w5 ]7 F
  223. mov dl, 79% U& U# V8 X9 k& v1 j% |  [
  224. mov bh, 07h
    8 Y/ k9 `" v* ~, Y3 ]4 Z  r
  225. int 10h
    1 ~: K" p; x; Q* f/ k# `( _
  226. mov ah, 02# o. I- p: B# d
  227. mov bh, 00
    5 @- g$ r7 @) M: X3 q" \) n( M9 D7 b, A
  228. mov dh, 0( ^; ?" W9 @! n* N+ S
  229. mov dl, 0
    ) s* G& i; B+ q# M3 x  A
  230. int 10h
    / {1 K- }3 k5 X1 m
  231. popa
    5 Z; @& B! \3 ?) ]/ Z4 j& t
  232. ret
    : W0 s. \& Y1 O  ?0 w  s1 ~
  233. cleascr endp* z" \/ s. G* j9 p1 n0 w% q
  234. $ D/ N3 B: @1 Y$ H; q0 C
  235. showmsg proc    near               ;Show info0 v+ E2 b* m& ^9 u, P; J0 e
  236. pusha
    & @% J+ M% e2 A, E, M, A2 {
  237. lea di, offset showms
    $ G8 v' S% O; F" O0 u
  238. mov ax, 0b800h
    # j) m; L& n% [6 h" n0 j& k3 Z
  239. mov es, ax
    3 j$ {1 x9 {3 G- K+ E
  240. mov si, 0
    : H% f, F7 m7 Q. R
  241. mov cx, 480
    ( i" c/ D, @1 J5 B( b) L2 U
  242. mov ah, 07h' D2 X3 }9 Z  L% t# c. I
  243. @@:( a& t: i* s+ W8 }9 c0 W4 q0 r) U5 d) `
  244. mov al, 20h* S1 [. k. F# ^" T( G' D+ o
  245. mov es:[si], ax$ l6 f& ^: i3 b$ j+ v" l
  246. add si, 2
    - R3 z9 E8 m5 h
  247. loop @b
    5 I( ^) p' ?" J; Y1 l0 ~% d
  248. mov cx,880
    - r$ X. @7 M  l! s
  249. @@:
    4 l( N" \# ^0 v) K* q/ F
  250. mov al, [di]$ m( v; F- ^6 a2 K  S4 u
  251. inc di
    * W6 c% d% ]' i, z. D% V, D& ]! c
  252. cmp al,20h: T# Y& O0 j1 ]# w
  253. je showch1
    - F1 O- {3 J1 l
  254. mov ah, 17h1 _, g' ^6 d$ m% t$ d. I
  255. jmp showch3 5 h, ~3 k4 a7 N; ~5 g
  256. showch1:- j& g& m+ }( m# w* O- a
  257. mov ah, 07h 5 O1 _7 z* G3 `" O9 i) \8 ~
  258. showch3:+ A+ A+ ^+ {8 U5 n5 m) U
  259. mov es:[si], ax
    3 Q" Z& Z- @, `. t
  260. add si, 25 L; I, i. r; m4 [6 |
  261. loop @b
    ) K: K# S/ F/ J6 Q7 C( o! g
  262. popa: _# w3 @& L; ]# K
  263. ret! R8 R. A1 r0 n  `; j/ _# E
  264. showmsg endp
    * a2 p$ [: t6 T8 z; |* Q7 S

  265. : J( u& o1 ^2 m! C
  266. oldint proc, g3 s1 ?7 y! X9 k3 g- g& z
  267. pusha
    . l& e1 f& z, p- r" X
  268. mov ds, word ptr cs:[old331]
    9 w  n4 X' B, R: I
  269. mov   dx, word ptr cs:[old332]
    % p. x0 X% [1 |* C3 ?, G+ t+ f3 E. }
  270. mov ax, 2533h7 e' l( z# b: \; O7 J
  271. int 21h
    " Q3 @* v% t4 K' F8 R9 T
  272. mov ds, word ptr cs:[old741]8 F' }' G) _" E' h
  273. mov dx, word ptr cs:[old742]
    * l7 I9 P1 y( ~2 u7 f$ g1 o5 o
  274. mov ax, 2574h7 ^. I+ B) B9 m$ D" k
  275. int 21h4 X  E1 t- A) T* O6 y
  276. popa
    5 r0 ^- V3 B# Y1 K
  277. ret
    : t0 {! [, i+ D& d, M9 J
  278. oldint endp5 G1 u, c2 ^9 `# u- y! v

  279. ( i. ^; k) a1 ^- }& V" i
  280. memmouse        proc
    ' p/ I# S- q  |; W
  281.         xor     ax,ax
    ! m8 p! q. x9 b6 `7 C( l
  282. int 33h/ H- i  ^' A6 O9 ~+ k
  283. cmp ax,0ffffh
    ' G/ L% ], `/ b$ }3 t7 f% E& V
  284.         jne     not_loaded. o  m7 Z1 A# e
  285. mov [memcopy], 16 k, {6 }. N' e8 n
  286. ret# b+ }/ u' m# H: @* f  ?

  287. 5 s/ \8 O7 Z7 {3 R* @0 E* }
  288. not_loaded:4 w! p' S; t* {6 E  D0 j4 |/ G

  289. / I" u- a2 q& A7 d% a
  290.         mov ax,2574h/ D+ J, g9 W/ k" H1 ^' A! d8 o
  291.         mov dx,offset new_isr
    ' ^5 z8 e! G) c2 S
  292.         int 21h
    2 p2 ~' G% ]4 o# e8 o* t5 A7 @0 L! `
  293. & c  a1 P8 F1 z
  294.         mov ax,2533h
    . @, O4 ^8 ~: ?* B
  295.         mov dx,offset new_33
    $ U2 J8 t: X5 u2 {
  296.         int 21h$ y& `! Z4 z$ c3 G3 P3 ?9 U

  297. 3 n$ w" q$ B0 y  i
  298.         cli
    , b2 c2 j' w( `! n

  299. & E2 [6 G  ~4 w/ V4 y0 S
  300.         mov bl,0a8h( b, a* u( g7 ~, a1 t
  301.         call keyboard_cmd
    * m1 I1 ?, C( `1 r- [

  302. + D7 F  c( }, K2 E) ?7 q3 B
  303.         mov bl,20h
    ' t* c5 f4 b  x" k6 f$ d5 }5 n
  304.         call    keyboard_cmd$ s8 Z0 L- E/ K& x1 B# e2 b8 m$ j3 S
  305.         call    keyboard_read5 L" @/ H; U, Z" C$ S% ]  b
  306.         or      al,2( y# L; R' j1 Y  p* Y
  307.         mov     bl,60h' j4 E; t6 p/ I
  308.         push    ax8 ~% C# w# R  N) L8 @
  309.         call    keyboard_cmd, ]/ P* D0 K: O3 i  t$ j; v
  310.         pop     ax! `. X2 h( H2 T( ?, U$ u! `
  311.         call    keyboard_write
    " V% O2 N) v* o+ y6 f& _

  312. % ]6 R; T$ L  k4 |) Z+ n$ c
  313.         mov     bl,0d4h2 Z, B4 `# Q) Q  E: E$ b, Y
  314.         call    keyboard_cmd& ^* q9 ^2 k  v: K3 E+ q1 N9 R% ^
  315.         mov     al,0f4h7 B- |3 k" k& ~: c
  316.         call    keyboard_write$ p0 W& [) A! `" k1 d: C( Y9 D

  317. ( D5 C6 e$ K% i( a* g
  318.         sti3 p7 S) y% a" M: }# U4 u( E/ Q! i$ Q
  319.         ret' Y, R( N. x/ R: X$ l  R
  320. call_user_isr:
    . `2 R  P' D. n% u" r9 S4 T2 i
  321. db      60h9 ~. S, X) _* a7 z5 V
  322.         mov     cx,cs:[pos_x]5 K+ Y6 U# l: v5 z$ n, O, c! e
  323.         mov     dx,cs:[pos_y]
    ! V  Z. k" Z9 ?; j1 r& c# r
  324.         mov     di,0 ;cs:[x_move]  {4 N' Z1 i! i3 W# L2 @6 R
  325.         mov     si,0 ;cs:[y_move]
    2 d; U( ?" U+ L( D$ U: m; w4 R& C
  326.         mov     word ptr cs:[x_move],0
    6 L8 V  u: J8 Z6 [: ~' P+ x
  327.         mov     word ptr cs:[y_move],0- f4 n$ i$ \4 ^3 X. y& _
  328.         mov     bl,byte ptr cs:[buttons]
    % {7 f3 E1 W9 ]& G1 w/ X' B7 n! T
  329.         xor     bh,bh" J. y% q5 b0 C) r' N7 Q
  330.         call    dword ptr cs:[user_subroutine]3 {6 ]1 L' E7 |
  331.         db      61h# @; j* K( j4 x
  332. ret( I& O3 I7 y  t9 |. i/ O! j0 B
  333. new_isr:
    ; B8 E/ `9 y; O4 ^; ]+ b. [) f
  334.         pushf
    3 K% ^, L# G0 S' j% K
  335.         cli
    / Z& O" w. Q7 `& Z2 ~5 F
  336.         push    ax
    / W" f! f5 [% J1 B6 t: d) p
  337.         push    bx" X! u5 r9 A8 P1 t7 W8 B5 U
  338.         push    cx
    $ e5 b- z# `5 m. j2 w# [
  339.         push    dx' w& J3 u6 R1 M# |
  340.         push    di
    0 ]+ U+ G1 D' u$ b. K; `+ |# b
  341.         push    si
    * |: d/ N( x" z" `- r4 t" g
  342.         push    es' R6 [  b9 b: W4 Q( J% r- ]
  343.         push    ds
      J7 z/ i2 T1 d( c4 h3 B% v
  344. / ?7 S9 h6 |0 E" w0 j" s& L4 p  @$ i
  345.         push    cs7 V; g& p1 T$ T* W! N5 N. a
  346.         pop     ds" o4 H) D+ r% p+ ]% g

  347. 2 o; @) A3 W$ q9 \- q- t2 [
  348.         mov     bl,0adh
    : i3 [3 \# q3 q* }! ~2 F* p
  349.         call    keyboard_cmd# d' w/ c" G8 O8 d3 R

  350. / ~  F, i) p  j2 V3 ?4 d
  351.         cmp     byte ptr [first_time],01 x* j6 m0 d( b
  352.         je      not_first_time
    3 {6 K4 z7 _- \1 U& [( Z% ?( F
  353. 9 c. ]% X! b9 @
  354.         mov     byte ptr [first_time],0# \( ~: n! P' \7 n7 ?$ C0 U
  355.         call    keyboard_read
    % S. u5 k' O) z  J
  356.         call    keyboard_read
    7 t" Q# M5 O5 D* I
  357.         call    keyboard_read- u1 l& m  L# `- h5 B
  358.         jmp     no_show
    0 H2 Y, z7 A- s: |( B+ |
  359. 8 n4 l3 z$ m9 }( A9 ]# I
  360. not_first_time:
    0 ^/ m( Y! M4 F+ H* ]; A3 ?
  361.         mov     word ptr [temp_mask],0# d! i7 l/ i# h( v) a7 c& r

  362. 1 o! }, p' n$ H; N- v% Y& M3 s1 j, t
  363.         mov     cx,[pos_x]  a0 R3 s7 c1 }2 X$ Y
  364.         mov     dx,[pos_y]( v3 B# x2 Q7 B: W  f0 N; ~

  365. # N: }1 g9 {; d5 Z* d- E1 s0 x6 ^
  366.         call    keyboard_read
    , E) a% y  f* M, e
  367.         and     al,7 ;3
    # v( |3 b& Y! ]/ C% y) i
  368.         mov     ah,[buttons]
    % e8 {" F! T( E1 \5 q. q% X; F
  369.         mov     [buttons],al
      C' r8 g( B% Z9 \5 v) u5 I; b
  370.         cmp     al,ah
    * K+ ], h" l+ ~% Z; }- v, _9 M+ n
  371.         je      no_button_change$ ~- Y7 M& \  @- W
  372.         and     al,3
    % F  s. Q$ T/ V" s# P
  373.         and     ah,3
    4 l$ H( J4 a- i
  374.         xor     al,ah
    ) h* ]2 g) K/ X: G0 d
  375.         xor     bx,bx
    8 u5 B/ T$ A1 @4 i0 m/ S( A
  376. 3 n$ y8 N: j" ~) [: d0 t; ~4 ^
  377.         push    ax( {9 _- R. k( R* {8 q: ~
  378.         test    al,2
    $ |9 ]% k7 u0 a5 Z* F$ z% x# c
  379.         jz      no_right_button_change
      f/ s; ]( `3 }7 s, q
  380.         and     ah,27 I7 f  d6 L. w$ Z$ j7 n
  381.         jz      right_button_pressed
    ) p$ f* k. @( A# ?; G
  382.         or      bx,16
    2 h/ N3 ~8 U. J7 C3 L
  383.         jmp     no_right_button_change
    3 U+ o( I0 o: r* B
  384. right_button_pressed:- s, O+ W) q$ T9 E% E- @9 Q
  385.         or      bx,8
    7 z3 O; ~0 F- o6 l
  386. no_right_button_change:3 L7 H8 O' U8 u# |; t$ A

  387. 3 c7 }  ~: s! n8 q# A
  388.         pop     ax+ d( x! v* Q* Z, M0 J4 O- I. I

  389. 7 W# R1 S+ G$ M
  390.         test    al,1
    0 I) U& s# z3 U* ~' Y* Q
  391.         jz      no_left_button_change( H1 {& ~& E) e& |. |6 _% r
  392.         and     ah,1. C# A' q% |6 W
  393.         jz      left_button_pressed9 H; e! a: }1 Z) ?: \# E! ]' Q
  394.         or      bx,4
    6 U+ V0 C% |, B% C4 w
  395.         jmp     no_left_button_change
    - @! s" [& l' u1 r: n
  396. left_button_pressed:
    / l( k/ \  c6 R7 `9 L
  397.         or      bx,2. I4 S. c1 e  x5 M. u
  398. no_left_button_change:
    1 [7 p% y3 m  J3 M" _# a

  399. 9 J; ?! R5 R4 r1 I: J, ?5 r
  400.         mov     [temp_mask],bx
    # O4 f( i7 q% Y- q- p2 n. X  H
  401. & }5 f: j6 W1 ^
  402. no_button_change:: s* d) F" K  j. M* w8 _* F
  403.         call    keyboard_read
    1 Z7 }5 g: b- I7 S4 L
  404.         cbw' T- u+ D, D# W) Y) R
  405.         add     [pos_x],ax! p) s! w" i/ D5 Z
  406.         add     [x_move],ax8 o4 T8 |2 O0 L4 c
  407.         mov     ax,[x_min]
    1 U% T# z: z- v: p# D$ U& j
  408.         cmp     [pos_x],ax4 z' `) z9 s5 i
  409.         jg      good_hor1
    . ^8 \. z$ K) b" s- u
  410.         mov     [pos_x],ax  o$ ?+ U3 z- Q( L
  411. good_hor1:
    - `- {9 g+ j' |  g0 Z
  412.         mov     ax,[x_max]
    8 K* z( g6 }/ a. x  n
  413.         cmp     [pos_x],ax) R* @# Q3 n" z
  414.         jle     good_hor22 ]9 }: R  N) E/ @; u( P
  415.         mov     [pos_x],ax% r/ Y/ q6 Q0 K: S) @1 k5 v* y
  416. good_hor2:: _$ i! O$ Q& A" r3 R

  417. . Z; N! B$ _9 H) D1 l# a  Y2 l
  418.         call    keyboard_read2 k2 n+ A3 T# V/ Q7 h
  419.         neg     al
    0 e, d3 q" e- C, j8 M2 t
  420.         cbw% n" i  F  c1 S; C
  421.         add     [pos_y],ax* K8 e/ k* a+ b* M7 S' W
  422.         add     [y_move],ax- v6 f; j7 u8 v# l
  423.         mov     ax,[y_min]
    2 }! c: c& z& T; J# e" p9 k
  424.         cmp     [pos_y],ax# s, c: J% M, a' I% Y) R3 @: Y  y: Z
  425.         jg      good_ver13 X# ^- K' w1 q9 z
  426.         mov     [pos_y],ax* u+ \- P7 T: \( U% M( g
  427. good_ver1:
    $ R8 e4 m6 i0 ?( g
  428.         mov     ax,[y_max]
    0 J$ V8 n3 Y) _, ^. ~
  429.         cmp     [pos_y],ax
    , t( [% e% M9 }4 ]6 v
  430.         jle     good_ver2& j8 O6 u7 A; v  D7 o* C4 H
  431.         mov     [pos_y],ax) B4 B% V+ s& s# A
  432. good_ver2:: ^' Q- n* f- o- H: I4 D& n6 V7 ~
  433. ' w8 v& y/ J6 O6 W1 X
  434.         mov     ax,[x_move]
    4 a6 P" V6 @7 H0 j2 b) ]9 a
  435.         or      ax,[y_move]
    / X; l! F( v- r; N
  436.         or      ax,ax( f+ Y. Z# A- {& @+ s
  437.         jz      no_change_position5 P1 z+ K8 P3 S
  438.         or      word ptr [temp_mask],13 o0 `6 H% ~+ G: O
  439. no_change_position:
    + e9 r/ G- P8 w) X

  440. ( O9 c0 @; I* F/ j/ s" n
  441.         mov     ax,[temp_mask]
    + ^4 B' v) |  ]" i  t- R
  442.         and     ax,[user_mask]
    4 Y9 y" D& [) @
  443.         jz      no_call_user
    ; `% K# e& G# C4 _% v
  444.         call    call_user_isr
    - y- Y; U) d. J$ V! Q
  445. no_call_user:7 G& H- U  z9 v
  446. 7 k6 S# q2 \; h6 e3 T, R
  447.         cmp     byte ptr [sm_flag],1- L! j1 O9 F1 y0 K, s: h8 z
  448.         jne     no_show
    0 q6 W2 L+ h* @

  449. 5 |" }+ ~- x, g3 r
  450.         shr     cx,3# P+ U9 ^: _% k" j" o- m) `( z
  451.         shr     dx,33 I# c0 @( j( ?9 r/ n% h- ~
  452.         mov     ax,80" ^; @7 z+ n+ l. C2 |+ L! h
  453.         mul     dl$ u: j* l  Q! h/ Z
  454.         add     ax,cx
    ( P" A* ]& s0 I) r# q9 r
  455.         shl     ax,1
    ( T* P" T1 O( f6 a- Y1 h
  456.         mov     di,ax
    ' y  b$ `2 x6 W
  457.         mov     ax,0b800h
    ' J  ]( Y$ ]: |! a
  458.         mov     es,ax
    . F! F- E* F" P; u( {
  459.         mov     ax,[save_char]
    % U: p; Y/ ^, E
  460.         stosw
    & R" G1 C+ r( u4 ~  \/ ?

  461. + T1 i% F" B+ V* _+ a; ?$ b; g
  462.         mov     cx,[pos_x]
    - s! z9 ?, j8 q2 ]6 z
  463.         mov     dx,[pos_y]; L# l$ w6 f0 w; h: G4 b
  464.         shr     cx,3+ d6 o. j4 R! {* M) i
  465.         shr     dx,3
    " x1 ~+ l- |0 b* U& u! T, Y$ @4 J
  466.         mov     ax,80( N( P8 z1 Q& J, H' E$ ~: C1 q* C, X: u
  467.         mul     dl: h& E  F: {* I) w, r
  468.         add     ax,cx# T+ C6 o3 l7 A  z7 H
  469.         shl     ax,1% T% v$ l2 ~3 l; `% A2 u: u
  470.         mov     di,ax$ d, m- d% Z9 N6 A3 r+ `
  471.         mov     ax,0b800h
    " C0 L4 F" F: q0 {$ U
  472.         mov     es,ax" Y  N  ?! l" a/ l
  473.         mov     ax,es:[di]
    $ j" k3 P0 ~4 T- x" o% Z0 M# B
  474.         mov     [save_char],ax$ J1 a  N& C# N7 E3 j7 c
  475.         not     ah# E; Z, [/ u( |& ?) f1 V3 P
  476.         and     ah,7fh
    + n; r4 S/ w( x
  477.         stosw
    % ]4 P3 V) }7 K* a7 w7 l8 A
  478. no_show:! {# {4 s$ L. q# ?( }+ C
  479.         mov     bl,0aeh
    ! m+ t; G* Y) K$ j0 w
  480.         call    keyboard_cmd+ u0 e/ b8 A1 O4 ?, l0 u( A/ V8 E6 r
  481. 6 m7 V* |4 q0 L5 O; c/ T1 e1 m
  482.         mov     al,20h, n) }: P' [1 B: ^" u: c* G9 R
  483.         out     0a0h,al
    1 t* O6 ^5 R! T  c% I( X
  484.         out     20h,al
    . a/ j: ]1 A5 p7 j2 t& e! u
  485. " H7 Y7 _( E$ M
  486.         pop     ds8 D6 G; B, T$ k) \9 p
  487.         pop     es
    2 l) p! n9 W% i% K
  488.         pop     si$ O+ c; V3 q9 d: P4 i1 O: d7 i2 z% ^
  489.         pop     di
    4 B$ [7 b$ t  V, [) S
  490.         pop     dx
    $ F4 c, P$ c  ?  W& h
  491.         pop     cx
    1 V; Y$ h2 N& F8 ^
  492.         pop     bx5 Q% Y9 `) h0 E( t/ q; J8 i
  493.         pop     ax
    8 R8 ?9 H, Q7 j
  494.         popf
    # v+ h6 Z. Q' o1 y) P  G
  495.         iret& ~: p4 }3 Z1 F/ I
  496. / k! e- T% E2 P, S$ [; @; N
  497. first_time      db      1
    1 y$ _4 U/ X6 K" O8 \3 Q- y- V
  498. buttons         db      0
    3 C3 l2 K7 @& @4 V# q: j- q) ~
  499. pos_x           dw      0" V0 b6 ?2 I* u1 H+ h2 H9 D
  500. pos_y           dw      09 |/ i; a( k2 ~; ]: s/ f& }% n
  501. sm_flag         dw      0
    * \: j% n# N9 [" O  H# b) N% l
  502. save_char       dw      0
    " a7 d' ^2 ~1 P+ h: Z+ Q/ d
  503. x_move          dw      0
    2 y* o/ R# i: C6 {; u
  504. y_move          dw      0
    2 a' D- ^' G5 m$ N, q- j
  505. x_max           dw      639
    , Z. U( `- V! C/ u
  506. x_min           dw      0
    & d$ A! f& Q% t3 |. Y% m
  507. y_max           dw      199( e! Z4 A' l# p/ Q9 v& _
  508. y_min           dw      0& F& U! Y: q( z- T2 {
  509. user_subroutine dw      0,0
    ! g, Y. W$ W! R! ~) r( \3 t
  510. user_mask       dw      0
    ( h3 p" {5 J' n: U
  511. temp_mask       dw      0
    $ Q+ `  N$ Y7 |& H( S8 w; n: Q  ~

  512. ' f# l; f/ w* g4 H4 {
  513. keyboard_read:
    3 n& q; A; G+ ]3 O0 E4 E! P
  514.         push    cx3 }& u1 k! x" |
  515.         push    dx
    : Z3 l' F8 ^4 W$ k
  516.         xor     cx,cx
    3 e$ @5 ~& `% L% P5 [
  517. key_read_loop:6 F  v! |* F! F
  518.         in      al,64h' D* f! Y  e9 O  V# U5 J! I  N
  519.         jmp     $+2
    5 R+ F* V3 v' Z5 O! W
  520.         jmp     $+2
    7 I4 y5 S, r. {- ]/ M' R
  521.         test    al,1
    % Y- I0 f7 U% \2 q
  522.         jnz     key_read_ready
    $ J" P, t! `$ k" \3 j' ^/ K; H
  523.         loop    key_read_loop# D7 a# z# {( c0 ^! Z: ]
  524.         mov     ah,11 l# z/ {, D! p1 m
  525.         jmp     key_read_exit3 @+ |# ?0 r3 v
  526. key_read_ready:# ^# V2 h7 R) v+ ~2 k3 q" w& Q- M
  527.         push    cx8 ], p% H7 I" R% V* \6 ?; [
  528.         mov     cx,32# ~, I" A# Z$ n, C2 ?# J7 J  _
  529. key_read_delay:
    ; }: V! c8 s! b2 B
  530.         jmp     $+2
    2 E2 }" X1 R  _  e5 [0 A
  531.         jmp     $+2
    % M3 n# K) ?4 d) d. y# G
  532.         loop    key_read_delay
    7 W4 x: Q4 {* M5 F9 `+ W
  533. # h2 ?9 Q! `) J* n6 m
  534.         pop     cx
    & x7 x0 b. b; v: @. X7 E

  535. 7 K8 B4 W* h* p3 w! _5 {# o
  536.         in      al,60h
    - ^4 h. h7 z: ~, K, k) J
  537.         jmp     $+25 A4 G4 A  a! z  L. U5 m1 w2 Q/ q1 ^* e
  538.         jmp     $+2
    8 o0 w+ Z& T  n  B/ P
  539.         xor     ah,ah7 d2 l+ f; \/ D" d
  540. key_read_exit:8 z, g$ S' H' O6 Z$ @
  541.         pop     dx
    ( y5 m) D# Z- l" I5 C
  542.         pop     cx
    . N' R% y! N; ~! k8 f$ k1 L
  543.         ret
    ( A  I8 V) K% {

  544. 8 G* I. W  x3 r* d
  545. keyboard_write:
    - d) S! `0 U# H+ f
  546.         push    cx
    . E3 R% {+ P! S  B& }
  547.         push    dx
    + Z0 H# M! [, C% {
  548.         mov     dl,al
    & V* q& N3 I. b
  549.         xor     cx,cx; H8 d8 r, ^) z& h+ K
  550. kbd_wrt_loop1:3 x( M" F8 g) b) H3 j% Q
  551.         in      al,64h8 ~/ v+ j5 D$ X9 H& e
  552.         jmp     $+2
    4 S' {$ A" E0 H6 f
  553.         jmp     $+2
    0 @0 v4 P9 k- p5 n1 g5 j
  554.         test    al,20h* |7 _3 P; Z; X
  555.         jz      kbd_wrt_ok1
    / A# g* c4 C  D% _1 ~6 t) J

  556. 1 e  W+ P" H; T+ B
  557.         loop    kbd_wrt_loop16 q0 e7 _6 U+ |3 U" h  W1 k  Y

  558. & W3 Q/ w% \9 y* ]/ o3 C+ J
  559.         mov     ah,1/ V: k4 ~) w, u, Z1 O0 S9 }
  560.         jmp     kbd_wrt_exit4 f0 N" \" O8 J' W

  561. # U! g1 \& t  a( a/ \: R; i+ _
  562. kbd_wrt_ok1:
    8 w1 K' y- {$ V1 J: I) g6 H5 g
  563.         in      al,60h
    5 Z* ~- X' Z( X" }
  564. : m" \- [4 l5 [5 N* p
  565.         xor     cx,cx+ K: `+ @' Y2 I# I- a! X
  566. kbd_wrt_loop:4 ~! k3 t$ n2 V2 j
  567.         in      al,64h
    - z, r, |& _% l- T( p( M
  568.         jmp     $+2+ ^) m& R# Y. t8 z/ j% _
  569.         jmp     $+2+ _, f% s0 _7 E2 E# }7 ?
  570.         test    al,2
    9 X5 e" L! L! e& L4 W6 V9 {+ R
  571.         jz      kbd_wrt_ok
    & D- b2 D! V8 x  b9 @  p

  572. ( v5 t% B& l& ?& j! A9 |
  573.         loop    kbd_wrt_loop" R( Q* x6 O, f0 K( q3 U( t) e  Y& F* a

  574. 4 T* k' F; {, ^( `0 k
  575.         mov     ah,1
    - u  x* Y) l2 s# X' O# H/ G
  576.         jmp     kbd_wrt_exit+ Y" g  c: G% ~! O' A1 S& ~

  577. 5 c/ t- F5 {1 u1 K
  578. kbd_wrt_ok:& v  ]$ M+ o8 c3 Y: r! S2 q9 l/ p
  579.         mov     al,dl) ]  U9 T/ e1 O
  580.         out     60h,al3 A7 {/ k6 I. m2 B7 I
  581.         jmp     $+2
    ; P! ?% ^! P' r
  582.         jmp     $+20 b) b1 ?5 X9 T- X  u* F! L

  583. 1 {* v3 R1 p* P  c9 B0 {' u
  584.         xor     cx,cx
    # P' O+ Z% _, t- K$ [5 n
  585. kbd_wrt_loop3:, K/ j% n: a9 x- Q+ `
  586.         in      al,64h
    & @1 d% [; \* r' K
  587.         jmp     $+2
    5 x2 G9 J: U' O' n
  588.         jmp     $+2" i. g& R3 L" G
  589.         test    al,2
    ' a% I2 R# U! ~$ t- c6 c
  590.         jz      kbd_wrt_ok3" u& A, q' Q( x2 V

  591. 2 Y* n) a/ D1 @; v7 h8 G9 W4 p
  592.         loop    kbd_wrt_loop3
    " ^( ?* U7 H: X& O7 I( H; n

  593. 6 d- {* e3 Q6 T3 T3 ~
  594.         mov     ah,1
    ; u: |6 V, s& A" t' e; j
  595.         jmp     kbd_wrt_exit9 I6 H4 Y3 }' D
  596.   u1 Y8 w6 m( Y) r2 F9 E; c; ]) g5 j
  597. kbd_wrt_ok3:+ y6 Q5 _% m" D0 D9 u0 F* b
  598.         mov     ah,8
    $ z5 v1 }1 \& ]" O5 u
  599. kbd_wrt_loop4:* Y* f/ H7 B8 O- E& O. ?3 ]2 Y
  600.         xor     cx,cx: s0 ^  \5 K: H1 [, \& O1 ]3 [
  601. kbd_wrt_loop5:* L9 F& N# _% C; s( ~  C4 ]& }
  602.         in      al,64h
    3 {, L) |6 x; D* q2 j
  603.         jmp     $+2. E0 {. X1 H/ j
  604.         jmp     $+2
      S# ~0 O% f) N5 ~: Y/ C+ }+ Z
  605.         test    al,1% ^  k% {. z7 ]( u- H! B$ [. ?+ d% ?
  606.         jnz     kbd_wrt_ok4
    , z$ g3 m5 N  {! w, _
  607. ; Y3 ^- k2 r/ H% C4 z
  608.         loop    kbd_wrt_loop5
    1 I" M2 W$ g" l/ n: m$ O3 g. R

  609. ! q8 ?+ @* v$ ^2 |2 n3 y+ @
  610.         dec     ah, F3 @4 |/ C2 {  L
  611.         jnz     kbd_wrt_loop4$ \# T0 z7 I7 Y: A& T
  612. 5 v  U' o. ]: ?# E# U  v# z! `% W! C
  613. kbd_wrt_ok4:8 d7 U, z' a: q7 w$ K- P% u6 Q
  614.         xor     ah,ah
    ( `: d- F' A" v; d9 S
  615. kbd_wrt_exit:
    2 s8 d, g) y  M! h
  616.         pop     dx
    , D' H) J6 h1 G( D2 Q' i
  617.         pop     cx
    0 p+ i' h, |2 w; `& x# V; j4 K
  618.         ret
    ) d% L" A, J) O: x3 ]8 `
  619.         
    3 {" t( x# E7 L$ k; `
  620. keyboard_cmd:/ T  B7 H7 e* _1 n4 ^# `9 Y/ `8 `/ ^# c- h
  621.         xor     cx,cx
    8 Q" a" l6 T& w# x0 ?2 l1 B
  622. cmd_wait:
    ( K, [1 U- Q* Z: I. d
  623.         in      al,64h
    ; X+ A1 H: g: h
  624.         jmp     $+2
    ; o; J8 G% n1 k8 V
  625.         jmp     $+28 J  V8 E7 J5 B, i2 Z
  626.         test    al,2
    9 A8 X8 G; @! b! A; ^) z( C
  627.         jz      cmd_send: U- i2 @' B! Y8 @( F4 N
  628.         loop    cmd_wait$ x" N/ M7 k# l4 A6 ?- r

  629. 1 x2 k( h9 s  c
  630.         jmp     cmd_error' l& ]/ k- ^8 y/ Q/ Y
  631. $ ?, J3 k' f5 C( f/ Z2 ?0 R
  632. cmd_send:  X2 n( [$ L: j4 e
  633.         mov     al,bl; P2 c' [$ `5 T$ f
  634.         out     64h,al/ }! m( `( |4 o& v
  635.         jmp     $+27 N) @, G: t4 I  A4 ~
  636.         jmp     $+2  q8 c: p9 H0 C8 P- a9 m" M" D
  637. 7 m9 a, z1 O! @5 F8 A; }
  638.         xor     cx,cx6 r% }. t# e4 N4 ^8 f9 D
  639. cmd_accept:. j$ R2 D9 Q+ C% {% ]4 _
  640.         in      al,64h& v) W' D6 r" T: z6 K9 a/ o
  641.         jmp     $+2( Z2 \& g1 |/ [* I
  642.         jmp     $+2" a* Z, B6 J0 L: x
  643.         test    al,2
    $ @( f8 b7 j! g
  644.         jz      cmd_ok
    7 f9 S, u- O' `6 j% k0 g# k7 u% D8 [5 l
  645.         loop    cmd_accept2 A/ m% c  X8 H% u7 D5 b8 m  a- L

  646. " Z% N7 g; ~3 D6 I( j- w
  647. cmd_error:  B3 O6 k. a/ [3 W
  648.         mov     ah,1' @  c% L/ C. X. q% v
  649.         jmp     cmd_exit- E2 ~$ v8 Y) L' T+ ?: c  C& o, n
  650. cmd_ok:
    ; N) R, S2 p6 d; Y
  651.         xor     ah,ah
    & h  X' l- t+ P( o
  652. cmd_exit:3 J9 P4 f9 V& Z+ R2 X
  653.         ret
      c7 i+ E' b* R) e

  654. 8 b( U, l& G* \' K5 i
  655. new_33:
    " P) L0 v3 Z/ k3 w
  656.         cli& Q8 ^; c2 @! R+ A, p* Z: u3 O
  657.         cmp     al,01 T! e6 A. h- W- o/ l# B
  658.         je      reset_mouse
    3 e: Z) u6 M( o6 V  j2 q
  659.         cmp     al,1
    8 Y) }$ {6 M/ V5 Y% X% ~: `
  660.         je      show_mouse
    ) t5 [# f( b1 z1 r% S, ~0 h# X% w
  661.         cmp     al,2
    , k- [8 d1 U0 y. \& p
  662.         je      hide_mouse6 j& z  i$ A5 \; y
  663.         cmp     al,3
    ) V8 l8 k. v4 W
  664.         je      get_pos. f; |5 G9 w4 v
  665.         cmp     al,4* P0 }: i$ [1 @% z( A9 B
  666.         je      set_pos
    ) @) R. V; S. [
  667.         cmp     al,7$ h" X" r- l! F7 t
  668.         je      set_hor_pos
    - ~5 L) P6 A9 Y% R* q0 _( ~
  669.         cmp     al,8
    & e/ }* x8 ^2 {5 p
  670.         je      set_ver_pos
    , j' a( O5 N: ]: Q6 D9 `
  671.         cmp     al,0bh
    : O4 A6 \7 d' o& V. Z
  672.         je      get_mouse_movement) z3 m; V5 |$ @4 F- Q$ }  U
  673.         cmp     al,0ch
    . R" x5 [4 \: S6 ^0 B
  674.         je      set_subroutines5 y/ j  |2 c2 S/ e" u
  675.         cmp     al,14h4 H# K) E7 v$ m; D% r; p
  676.         je      swap_subroutines
    ) \3 w  A% U2 T' e9 L
  677.         iret
    ' v6 N3 c  X( v4 T1 o- g! D
  678. & c% ^8 ]: X  y9 J2 ~
  679. reset_mouse:
    . C6 S8 U- x% Z& S3 @& A
  680.         jmp     _reset_mouse4 x5 E  u1 U1 y' U- F
  681. show_mouse:& T/ n+ s$ q* c  S9 S$ z  f9 G
  682.         jmp     _show_mouse
      v9 X/ p9 _5 N) p; w/ j, E+ d
  683. hide_mouse:
    8 _! i! X! V8 z( I' V
  684.         jmp     _hide_mouse1 A0 x0 s3 D/ y' p0 e6 {$ [
  685. get_pos:
    5 z& d! }& `9 M: C9 g. l; t
  686.         jmp     _get_pos
    & v4 M: v8 g, R
  687. set_pos:
    8 C) k  y0 A, F. y* ?3 n5 m
  688.         jmp     _set_pos
    ! Y5 P' [4 Z( u5 I* y  n& t  A" m
  689. set_hor_pos:
    8 l: P# }3 ]/ z% r9 w  a
  690.         jmp     _set_hor_pos( q, {1 l3 {" m
  691. set_ver_pos:
    * F: x; P0 B* }- k  ^- h: f
  692.         jmp     _set_ver_pos! @, M+ v. B( e' \( u" F
  693. get_mouse_movement:" W% m8 S) W5 G3 Q+ D
  694.         jmp     _get_mouse_movement7 l/ Y% ?5 S: j0 w
  695. set_subroutines:
    # t* C0 \: }0 u" e6 m
  696.         jmp     _set_subroutines) ~/ d$ i0 @+ A/ @
  697. swap_subroutines:
    / y3 l/ N9 d. y6 W
  698.         jmp     _swap_subroutines
    $ |8 @) Y3 f3 S! ~1 j  @
  699. 9 C' g  u& j$ Z$ N/ O0 {
  700. _reset_mouse:
    $ M% M) g: R. @& K( z* h
  701.         mov     byte ptr cs:[buttons],0( u5 |; v8 q- X6 p
  702.         mov     word ptr cs:[pos_x],0) h. v4 o' o. L6 D* D* L
  703.         mov     word ptr cs:[pos_y],08 k9 J) N& |9 q+ B
  704.         mov     word ptr cs:[x_move],0
    * v, P$ o7 t$ v& l
  705.         mov     word ptr cs:[y_move],0
    " q! R! s6 \) I7 k: i
  706.         mov     word ptr cs:[x_max],639
    & _2 H9 R+ b" o# ^, z. o
  707.         mov     word ptr cs:[x_min],00 j1 \$ n) l# q" y5 |1 ~, Y$ m
  708.         mov     word ptr cs:[y_max],1993 x# e3 L, F* r9 [- M
  709.         mov     word ptr cs:[y_min],0" K7 h6 d2 y0 u* u1 ?
  710.         mov     word ptr cs:[user_mask],0
    ( X; T# Z1 N) B: }
  711.         mov     word ptr cs:[user_subroutine],0
    ' W3 V+ Q* Y9 K0 q1 _- y* ]
  712.         mov     word ptr cs:[user_subroutine+2],0' p  D, v3 f+ E. F2 t- Y5 o
  713.         mov     ax,0ffffh
    " I6 t7 d$ R6 V) j  C8 k# N
  714.         mov     bx,3
    % a$ C9 ^( H( E/ H
  715.         iret
      f4 {: c% z0 l1 |8 x5 T8 |
  716. # m: i: o+ x# H- N! S1 n
  717. _get_pos:/ i( c8 D7 A7 U4 k/ }3 S" Z+ p
  718.         mov     cx,cs:[pos_x]
      h: k5 R. A* [% H) x" ?4 ?, S) ^
  719.         mov     dx,cs:[pos_y]
    $ L4 _+ X2 X7 k1 @- W4 ]
  720.         mov     bx,word ptr cs:[buttons]' x2 V* k) ^) d' y4 O& u. ^" i
  721.         xor     bh,bh: ?/ j' [! o9 f  G
  722.         iret9 h( N3 z, Y6 L' g

  723. # R) s( j* [' O& Q" W1 U- E
  724. _get_mouse_movement:7 |. ], w# b# o9 K! o, n4 r1 u
  725.         mov     cx,cs:[x_move]
    " f6 u! b1 {5 l; Z" K4 W* ^  O- R
  726.         mov     dx,cs:[y_move]
    ! I2 ]. [5 D6 M. u5 e+ v# p0 y2 G5 C9 @
  727.         mov     word ptr cs:[x_move],0; G3 Q0 s9 ~, V7 A% ]4 H6 z% {! b
  728.         mov     word ptr cs:[y_move],0; p  s4 P) ~# I- U2 s
  729.         iret
    " n" A# q& u3 K1 n" L- t$ G; U
  730. 2 I, A" H6 N. P: w
  731. _show_mouse:( P) b: U* Q8 C! @
  732.         push    ax
    " H7 G4 z! p" W3 ~: b
  733.         push    bx  P! H3 s8 D: J+ V
  734.         push    di0 E! R7 b. m3 g3 D2 Y" W
  735.         push    es  f: M# u; N+ p3 m% e# ~/ t
  736.         mov     byte ptr cs:[sm_flag],1# o( W" c' A# }7 V* E
  737.         mov     ax,cs:[pos_y]# W! b+ H4 X* H- l' \* |
  738.         shr     ax,3' Z+ T. A+ k: Q/ l" K8 ]4 P% s! X2 s
  739.         mov     bl,80; {3 g( u+ M" e" O( b: {' w
  740.         mul     bl% V; t7 f' t7 K* U
  741.         mov     bx,[pos_x]* K9 }% u6 v& F5 ], \6 M
  742.         shr     bx,3
    ) v0 N2 ^1 t! M( s- d/ [* j
  743.         add     ax,bx
    ' V. y' a; j, W) H/ D3 @8 [
  744.         shl     ax,1
    9 f3 g% q/ D( r9 v) n; |$ B4 G
  745.         mov     di,ax
    & m/ U2 {& j" R6 \2 q( G; B
  746.         mov     ax,0b800h
    7 k; f* e+ P5 }5 X" z/ e
  747.         mov     es,ax; v6 ^9 d) @) w; t. G) }
  748.         mov     ax,es:[di]
    1 `) x1 f9 c5 n) o' \5 t, p1 a
  749.         mov     cs:[save_char],ax
    # D" V- ~8 b2 |/ R2 {( C" f  t
  750.         not     ah
    6 n- y" B2 ~, }; K2 l& P' ^8 s6 J
  751.         and     ah,7fh1 }. H( y" x* D& I4 |
  752.         mov     es:[di],ax/ _& {& d' k  I3 A( V9 C$ x' j
  753.         pop     es+ R4 Y$ K% A$ V0 X" P" E- u4 c
  754.         pop     di
    + x4 i0 F3 q' v% M" [6 R
  755.         pop     bx( S0 |. c* J$ e& k/ x
  756.         pop     ax7 c5 {& F) Y! V' ~2 s3 _5 p! p7 o
  757.         iret6 X& b. I+ {3 W

  758. 5 ^0 x/ r: D7 ~
  759. _hide_mouse:
    : h- O, f4 [0 W( x3 b
  760.         push    ax
    # S5 {1 S0 p; g# ^
  761.         push    bx# M* G% M0 t4 C. |. ~# s: i
  762.         push    di
    0 I: a6 q2 m8 R- y9 _/ Z' q
  763.         push    es- ~; R8 g) m* S5 u% b$ X- X( k* X
  764.         mov     byte ptr cs:[sm_flag],0* }) |7 L. h& U% X! \/ L$ o, r
  765.         mov     ax,cs:[pos_y]
    7 q# K/ v% Z$ R
  766.         shr     ax,3; C. F  s" a( a, {- r
  767.         mov     bl,801 t4 {8 A9 Y. |7 v% {! p# G
  768.         mul     bl
    8 |  V& H; V( \% j5 ?* k2 i
  769.         mov     bx,[pos_x]2 S" Z, Q* h, X( J* h3 p  B: k
  770.         shr     bx,3. z0 P( @& ^. D9 U1 s
  771.         add     ax,bx& u. g6 p- T, B4 R
  772.         shl     ax,1
    1 ^1 p/ r% r$ ~/ {  |% v
  773.         mov     di,ax: m" j; e1 s% a5 o$ y) V# @; i& }) A
  774.         mov     ax,0b800h8 y8 Z  h, Z4 v: p$ @. f4 s& j0 X
  775.         mov     es,ax
    $ Z5 t( B' O" f* D3 c
  776.         mov     ax,cs:[save_char]
    + i1 a+ Q0 u+ ~7 k" g* ~
  777.         mov     es:[di],ax+ \0 n! O! E7 r
  778.         pop     es
    $ x* i$ P$ p$ X2 T6 Z) E6 T
  779.         pop     di! z/ K& @: X4 P9 j0 F, q
  780.         pop     bx
    " r9 ^4 q2 D, v) }# x
  781.         pop     ax+ s4 E5 S+ M' \
  782.         iret8 p' U$ b2 Z& T1 R: E8 Q
  783. , D6 H+ M8 ^7 H( K2 L' a
  784. _set_pos:
    3 C  y# d4 ?: W  _
  785.         mov     cx,cs:[pos_x]
    5 T/ A2 r: R3 G* {
  786.         mov     dx,cs:[pos_y]  l9 D' I2 e# R* I0 l
  787.         mov     word ptr cs:[x_move],08 ^: ?: E7 I# |3 l8 S3 y: h* T9 K! V  _
  788.         mov     word ptr cs:[y_move],0$ |( _2 Q5 O& S" M4 h
  789.         iret
    : @1 H- g3 A( l7 z% i# J( J5 \3 S. L

  790. $ f! V9 q0 U% I1 ?: l4 z3 W
  791. _set_hor_pos:4 X, a% s$ h' k" c! K
  792.         call    max_min) ^8 o2 U( x9 b6 U
  793.         mov     cs:[x_min],cx) F: [3 D, K8 `
  794.         mov     cs:[x_max],dx4 M* ~1 x6 r$ D; z2 \6 _
  795.         cmp     cs:[pos_x],cx
    ) ^2 \0 C6 Z: i
  796.         jge     good_hor_min5 p) ~( Z0 W( N. ~
  797.         mov     cs:[pos_x],cx
    * j2 `& m% V! m8 W% |9 b
  798. good_hor_min:
    ! m8 E: r4 J/ ]
  799.         cmp     cs:[pos_x],dx/ @0 N) O4 w# }$ \+ o* I3 b
  800.         jle     good_hor_max
    0 z9 [4 _4 v( @/ o
  801.         mov     cs:[pos_x],dx
    % j+ d5 B3 f3 E; p/ P2 d
  802. good_hor_max:+ u/ b1 Z) E3 ^, g; V: T  C/ g
  803.        iret
    " t7 p, v$ f) Q+ r7 t
  804. 5 z7 f6 D* |* g7 G! o
  805. _set_ver_pos:' O# |; Y. m9 J# `
  806.         call    max_min! O% k: [! ?( W, Y
  807.         mov     cs:[y_min],cx
    / K5 p; K/ I6 D- G$ |# X; z8 z+ M
  808.         mov     cs:[y_max],dx! m; E: w, Y6 Y' v' \
  809.         cmp     cs:[pos_y],cx
    ; A; _7 C' J* f4 f. c' D
  810.         jge     good_ver_min: L! w! F( @) E/ |0 F3 S7 T* ^+ a1 c
  811.         mov     cs:[pos_y],cx
    $ g$ `3 O0 X" G0 E3 H/ d8 f: j
  812. good_ver_min:( K5 I# w- y& n* m' L% z
  813.         cmp     cs:[pos_y],dx! W$ ^4 j, i( X1 p# p8 _3 f
  814.         jle     good_ver_max$ _  ^$ p+ H, J6 p, C  |0 s0 d
  815.         mov     cs:[pos_y],dx; @9 c. y/ P5 G0 y% M' t
  816. good_ver_max:
    # i) P& s2 s! v
  817.         iret4 S% ~0 C- W- Q1 N

  818. $ v& r, M+ ?$ R% Y
  819. max_min:
    5 R9 D* R8 Z! m5 q
  820.         cmp     cx,dx
    6 @4 z+ F5 ^5 o) j
  821.         jle     no_swap9 }4 b1 U. Y; [' s! X6 ]# W( F% q; i
  822.         xchg    cx,dx
    & }8 J0 J3 N# \( ~( l: o0 o
  823. no_swap:
    ( G7 X% Q( R- b7 p+ W
  824.         ret5 G3 m, z5 _: \6 T5 t0 r* M) Q
  825. 9 b( j+ b/ |9 S
  826. _set_subroutines:8 U2 i+ |8 i& }. o7 w! `
  827.         mov     cs:[user_subroutine],dx
    % p) `$ {* z6 \) H; g! o
  828.         mov     cs:[user_subroutine+2],es
    2 E6 B  W' F. D1 r# g% n/ V- A
  829.         mov     cs:[user_mask],cx
    & W8 H0 b4 x2 z
  830.         iret
    - X% c  s: B, ?' }+ l7 B' s6 `% C: E
  831. 1 i5 G  w( N  s4 N) F- L. Z) P
  832. _swap_subroutines:
    * Q+ S5 V5 C* J; X$ y
  833.         push    word ptr cs:[user_mask]
    2 h- b1 m% p: C2 k/ h0 O* h
  834.         push    word ptr cs:[user_subroutine+2]/ R: ?7 Y! y8 o8 ~& L/ _
  835.         push    word ptr cs:[user_subroutine]. |  o' o! E: |! I! j
  836.         mov     cs:[user_subroutine],dx
    $ P2 e1 E' \) y
  837.         mov     cs:[user_subroutine+2],es% p, z& ?$ B& g- K9 b& r- n) e
  838.         mov     cs:[user_mask],cx; R) i' F9 t- [8 y* j  J
  839.         pop     dx9 I; M2 b0 K7 O& B
  840.         pop     es" F6 Y) y* n. @# d% E# W. ~7 O
  841.         pop     cx
    3 x# t6 `4 a) U3 a7 o
  842.         iret& H( {8 V+ y$ C9 K% i+ w# {
  843. * L, O: ?0 e3 K% d! [2 {* ^% T% g
  844. memmouse        endp
    9 S8 @/ Q7 W0 S. R2 Q& U

  845. - ~  t0 \- D6 Z4 b
  846. endof_start:- c% Z" a; t  k  c2 q$ \# p: w

  847. 8 ~1 z* Z2 N( p) ~6 B9 _9 U
  848. emsg db 'No mouse driver install error!$'
    + B1 W8 k% f! \/ `4 I) \2 A
  849. old331 dw 0' d. Q; F) `" e$ i
  850. old332 dw 0$ W" P0 g5 E% x4 O# L7 F; \+ b
  851. old741 dw 00 T$ u& m4 k& U4 ~( Q9 l1 q
  852. old742 dw 0/ A* z* x' ~, w! ?
  853. memcopy db 0
    : e2 {/ i- N9 }5 m2 y
  854. okcheck db 0  |3 I$ T, B8 Q1 X5 E
  855. pass db 0
    3 p( y/ s( P- e5 y1 ]8 {
  856. chkl db 0
    ! ]& f( C* v8 e9 a
  857. lk db 0
    9 O/ A" C6 g$ b0 \& }* X& \) N
  858. chkr db 0
    3 N- ?( d! r$ N% `' ?9 ]! r; ]
  859. rk db 0
    4 T* J6 j* L9 ?, F7 l! _
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '$ d4 j( Q% O' l$ C' z
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    5 V" F) }& d2 _/ p3 \) u7 P* Y
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    + n& q: v* |8 B" G1 a
  863. db '                                                                                '' |/ D2 c, S/ O4 o- h
  864. db '                                赏屯屯簧屯屯突                                  '" N6 y4 d% P2 r% N7 L4 w
  865.         db      '                                ?OFF汉OFF?                                 ': f2 x0 x: g1 F+ H
  866. db      '                                韧屯屯既屯屯图                                  '
      M- z# }2 U+ E) T) ~- U8 P
  867. db '                                                                                '8 h/ z1 g0 L3 D5 Y
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    * u% B" r0 R/ L2 R; Y& |3 w' L
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ( Q3 G( |$ z: S, |8 _
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '8 [1 R7 @0 z( F  i$ n
  871. " n2 T9 F  c- M
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
; ]0 b2 b3 |0 x0 }1 Z哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 9 |! h) Z4 f$ l3 u/ P; z5 t: \. L

' E7 g" D* c% I谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 21:25 , Processed in 0.188220 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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