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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。( K$ r2 G( B) A/ v$ W
: B& w- P2 R- r
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;2 ^/ Q& r* U. W/ |
  2. ;          Ufoit PS2 Mouse test program   Ver 0.95 l& V) ]% Z0 ^6 ~4 M
  3. ;                                         By Bini.Yi 易祝兵, P  G; J, ~. d
  4. ;                                         http://www.ufoit.com 计匠网& k! F. ?. t2 U
  5. ;                                         2002/04/06 YYYY/MM/DD
    3 t4 j# R5 s) N1 k) d! ^
  6. ;2 ]6 s8 {( E/ E# v4 j
  7. ;          * }) F2 Q6 {( _2 @9 I
  8. ;          This program  test the mouse button  click and move.( r9 ?4 P- g/ V& t
  9. ;- g4 o! s- ]- V& o& J

  10. # R6 W, ~: n' q! b9 ?  A
  11. .model tiny
    4 K- J) X$ Q5 M. F/ j% R
  12. .586
    0 p5 q% q# s3 M6 R
  13. .code; N6 H9 n( C7 q% f
  14. .stack  100h/ Q$ S7 q4 T2 X( z! h
  15. .startup  C; [& a; ~  i' T4 R  J/ l+ F
  16. pusha0 f* F- i% z: s9 I! e
  17. mov ax, 3533h
    : h2 s5 T3 z6 j3 i' C: E
  18. int 21h- C4 |: Y) j* F, F4 ^* U7 @
  19. mov word ptr cs:[old331],es
    8 O- z/ O" t/ r, @  j
  20. mov word ptr cs:[old332],bx
    1 w, V  q( v( Q8 C% H6 E
  21. mov ax, 3574h
    & e- p% u2 n+ ^' ^
  22. int 21h5 i$ }1 F6 m$ X$ ]  c( C
  23. mov word ptr cs:[old741],es
    1 L+ V1 Q+ l+ K5 F
  24. mov word ptr cs:[old742],bx6 ]2 m) n* I& J& o
  25. popa
    ! O& r" |0 D* M7 h
  26.         call    memmouse% k. Y' j5 z( L- h! f; i# J
  27.         mov ah, 00* E. @! \9 p  ~' A3 p0 b
  28. mov al, 03
    3 ]2 J- y6 j0 r% n  M. b
  29. int 10h! N- h2 V/ o$ G. F- U7 ]" r
  30. mov ah, 06' A( q8 r! J' j6 Q
  31. mov al, 0
    2 q+ G3 w# F2 }% W6 @8 r
  32. mov cx, 0
    ! U( Y% D. k  V/ `0 R+ [& G; k
  33. mov dh, 24  r3 U6 E! u" |7 {. D
  34. mov dl, 79* I1 I) g. y8 f8 Y6 v* ~$ u5 s4 G
  35. mov bh, 07h9 v5 C: y# Y; @, C  i
  36. int 10h' D+ n/ e* y! Y) n3 `
  37. mov ax, 00009 @, `, e6 m. z5 G& ]  V& _2 Q
  38. mov bx, 0002, B. A+ \& Q# f/ ~6 R
  39. int 33h
    9 W  d5 R0 [7 z( s
  40.         cmp     ax, 0000           ;if no mouse drive install
    ( j+ O+ p5 g4 n. ], v
  41.         je      errormsg           ;show error MSG
    - ]/ }9 `9 _' W
  42. mov ah, 02
    / O) l: W. V9 P
  43. mov bh, 00
    ; f6 n( L  ]  @' P
  44.         mov     dh, 25             ;Move point out screen) r" S& Y. m! u9 |. _0 D2 _0 s" O3 g8 M
  45. mov dl, 79
    ' ^# J" _# N. r, V2 V* }
  46. int 10h9 F) a8 q" J4 S! B2 q, i/ m+ J5 l
  47.         call    showmsg            ;Show info/ {5 P4 M( D& i. J! r
  48. mov ax, 00017 u4 M8 P1 H; J% l. Q7 ^8 X3 V
  49. int 33h
    4 o3 u; C0 ~; N8 D- ~
  50. ; mov ax, 000ah
    2 v; J, Z* `6 E; g/ u2 W1 z$ i
  51. ; mov bx, 0000
    # q+ u% [3 P. ~: M0 e! \
  52. ; mov cl, 0h/ u+ u& J! k. N  Y% G4 I+ V' O; N
  53. ; mov ch, 0F0h
      @, f$ J! @( _5 b4 S
  54. ; mov dl, 0h# N0 E- M( c. ?  `3 A
  55. ; mov dh, 0F0h
    & M7 r0 A$ Q2 J$ ]/ u: }; v
  56. ; int 33h
    - p2 M, @$ f- i; S1 Z& o; n
  57. mov ax, 0004h3 b8 b( \" Q9 z/ p3 ~
  58. mov cx, 0319" A) e" G. x0 v) o+ v
  59. mov dx, 0103
    & c3 w* Q& Y% p, e" r" b. K/ i% m
  60. int 33h
    ; @3 [- H8 s* l4 E1 n4 U
  61. casemo:                           ;Case button click and point move - _" f% ?* d: b6 Z+ Q
  62.         mov     ax, 000bh         ;and keyboard press
    8 I* F- {" d# t/ O6 x4 I' p
  63. int 33h2 G% V% k# b/ ]& G
  64.         cmp     cx, 00h           ;if point move....X
    & Z+ @' b! k* P  n# Z+ O9 k
  65. jne xmov
    4 P* L: U: Q3 u! [/ i3 b( U
  66.         cmp     dx, 00h           ;if point move....Y+ b1 @/ l' Z$ s" u# N6 e
  67. jne ymov
    / s6 R& L) Z0 e
  68. xymovend:                         ;X.Y move end
    ! |& d/ ?) l; L" W/ u( f1 e
  69.         mov     ax, 0003          9 I) t: g; A5 y. Z: V# B% I( C
  70. int 33h
    2 k  U' s$ h4 m" j3 M) d
  71.         cmp     bx, 0001          ;if left button click  show ON/ z' U, C$ ~- U* X2 L: v/ M$ M; S
  72. mov si, 1828
    4 x. d. u! ?) h9 r4 j
  73. je listl
    7 ~, K1 i1 e  K- n5 D
  74. mov si, 18287 k- B3 y7 i* X& P) I& |) Y4 `& `% W
  75.         jne     nlistl            ;if left no click show OFF
    ' S" F4 c  j7 I( ]
  76. testr:2 T; a+ _) R' ]- F" }5 h/ S- Z
  77.         cmp     bx, 0002          ;if right button click show ON' P; q) y; t8 p8 \) [2 Z
  78. mov si,18428 x4 B" ~" s' ^6 Y" V
  79. je listr
    ! J' v/ e% C5 P
  80.         mov     si,1842           ;if right no click show OFF; ~, A* `6 D+ @" I5 Q
  81. jne nlistl
      E( K8 f  J/ m0 ?! k3 j% s
  82. casekey:( `5 j, O) [  y6 ~9 U' C4 j- x6 g/ \
  83.         mov     ah, 01            ;if any key press jump check" g  b9 ?5 w0 @$ y
  84. int 16h
    7 m  q' O$ f- _& A; ~9 I$ w, I. o
  85. jne kpress2 ]0 p  {5 u3 S+ b. e
  86.         mov     al, [chkl]        ;check x flag
    % h) z8 F" R$ {$ c9 s! m" @6 w( C- H
  87. cmp al, 02h
    + V8 i& [1 J/ X: |# r: w: \% I
  88. jnb chkok
    3 E4 _* m# z) m
  89. jmp casemo
    , Y; M& C1 m/ u9 M' O* t( O1 _
  90. xmov:                             ;if X moved, get the X flag+1
    " e3 a+ X8 A, s; y' `
  91. mov al, [chkl]! ?4 }0 L+ [: d! u, H
  92. inc al
    * l" f- ~% q7 M4 Z* R& Z# l
  93. mov [chkl], al6 Q, I! N2 P3 A) I
  94. call passok
    / i0 ~- Z$ N. ]6 K0 }
  95. jmp xymovend
    : g) T" `0 ~9 p
  96. ymov:                             ;if Y moved, get the X flag+1! t) u* n$ a  R
  97. mov al, [chkr]
    . L  C4 k9 r) S, ^$ s
  98. inc al
    0 r6 b1 K: w4 [
  99. mov [chkr], al
    , R" I; D5 c* W  o0 g: X; [8 O7 ?
  100. call passok
    ' X+ v; Y2 F, a8 x3 R$ Z  y
  101. jmp xymovend
    % s' w9 H- d5 r% k

  102. 5 B- x9 E  I. Q4 _
  103. passok proc near
    0 u5 f) I7 H% i5 r5 i
  104. mov al, [okcheck]
    - Q# P9 D1 s5 w5 I- H& L! ]. H
  105. cmp al, 11 [5 D( P  n1 s) K# I( Z
  106. je let0
    3 P: B0 g  A$ y$ c9 f, q
  107. jmp passret+ h2 G' w* n4 A8 ?1 c
  108. let0: ' x3 k% g4 @# H0 r. d
  109. mov [pass], 1$ G4 {/ l* b; \+ N/ K
  110. passret:
    % [: M) _% q! l( L7 k) d" ]4 T/ e
  111. ret
    1 ?, X: f( x4 l
  112. passok endp
    . o1 z& n) f2 Y

  113. # F8 l  s6 Q6 Y0 Z
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS+ U/ a5 a, g2 X
  115. mov al, [chkr]
    " n7 J1 }4 @& s, k' y! a7 O
  116. cmp al, 02h" X6 z: g  l% {4 o5 H7 m+ k% V- f5 J+ V; K
  117. jb casemo+ k: A# b% C! [! }' T* c% ]
  118. mov al, [lk]
    % d7 v( j/ r7 D4 i6 S' e
  119. cmp al, 1) z* C+ o8 S) O% _5 y2 J0 x# Z
  120. jne casemo. R9 V* V, R1 r7 x0 B% `5 @
  121. mov al, [rk]* d2 P) s5 M- a; E9 \- W) E- |
  122. cmp al, 10 Q0 \/ v1 f0 @# m5 Z
  123. jne  casemo$ T4 }! J% s3 Q! L: P! ]
  124. mov [okcheck], 1" h$ Q8 z# F, V6 y$ D$ k, Q9 \
  125. mov al, [pass]
    " o/ ]8 s# Y  \- b( e0 R; L
  126. cmp al, 13 T/ ~6 v# g8 h. ?, r% X
  127. jne  casemo5 ]! j$ l  {1 }- P
  128. mov ax,0002h
    0 F- q  a% ?7 i% t  Y: c/ i
  129. int 33h, _8 B; }1 L# N% x/ `
  130. call cleascr
    ) y. |4 s" J! s* d% J

  131. 1 w& x9 L6 G1 b9 `0 ?, @/ C
  132. call oldint7 Y& T! |: s  {* D
  133. mov ax, 04c00h
    ) e, t2 B5 v; W/ G. @. N% O
  134. int 21h8 r/ S$ A/ L( o
  135. * M0 U( r' f2 W/ B; \* `
  136. okexit:' \+ n: y- J" Q% Z
  137. mov ah, 4ch
    & E/ h' ~) e7 f. T+ |3 ?5 W
  138. mov al, 0
    + e9 d& ~) l5 G; P
  139. int 21h
    5 ~: Q: V2 o  ~9 f3 S
  140. listl:                                 ;Show ON! o$ `4 w( ^; \6 N
  141. pusha4 j( B( ]  A% @
  142. mov ax, 0b800h- N  n4 X8 \+ I+ M1 \
  143. mov  es, ax/ }1 Q, u: B7 d+ e8 E
  144. mov ah, 47h
    % `, j% a) G& f' Z2 N: C5 x! X
  145. mov al, 20h
    ( p* W$ O, {- n) p. I* n- O( P  B
  146. mov es:[si], ax
    4 w& p+ ~- E$ e1 r- n
  147. add si, 02- x; M# J7 b2 e0 Q) A$ ~" H+ V
  148. mov  al, 4fh
    3 r: G$ S# X4 ~/ R. p2 _, K0 t" q
  149. mov es:[si], ax+ w4 {5 S3 }1 i% N3 q6 a, D
  150. mov al, 4eh
    4 K1 q. Y3 s, w$ U& J
  151. add si, 02
    " ?( R$ r1 u( w1 E; g! g' z
  152. mov es:[si], ax
    4 y/ a7 A$ M# Y9 d; Z2 J2 E
  153. mov [lk], 1
    ) e# n8 q  T4 \: I
  154. popa
    ! F" m2 \7 q8 ]
  155. jmp testr
    : W- ~- L( C% w
  156. listr:                                 ;Show ON
    : G; r% d, Y; ?- F( A) t# g, V
  157. pusha. y, \+ a1 A. c" h3 h' f: a, W
  158. mov ax, 0b800h
    . @4 y6 I# A7 ?& u, y% H
  159. mov  es, ax' x( q& i/ N6 u. m
  160. mov ah, 47h; u$ H! b. M" E3 [) t
  161. mov al, 20h2 W6 b1 v  `( z: k
  162. mov es:[si], ax
      W+ M4 I. T+ j; ]' Z
  163. add si, 02" E7 ~; [' t' I2 @
  164. mov  al, 4fh
    9 V  Q7 I6 W/ i3 m- }; h8 o- v
  165. mov es:[si], ax
    1 E9 \5 `% J; g8 U4 T" T$ t0 H
  166. mov al, 4eh
    $ G& _* ]+ M2 b/ @
  167. add si, 02) R6 ]  n6 w# c: }6 b* P) K
  168. mov es:[si], ax2 t& t8 L3 m; X- S1 Y' r
  169. mov [rk], 1
    - H% G7 g! @, Z& V% y
  170. popa
    * ~. t4 o8 n" g! `% c9 S. z
  171. jmp  casekey
    / z$ z, r- I+ x& I
  172. ; p4 q4 v, L0 f4 F0 N
  173. nlistl:                              ;Show OFF
    " P5 @, h3 g" O4 c3 g
  174. pusha   
    . _4 e& v# c" z
  175. mov ax, 0b800h
    5 X  l7 q- p6 K$ r/ a3 j
  176. mov  es, ax
    / Y# X+ l3 S# z' M
  177. mov ah, 17h
    0 y: \3 o9 h0 N& o3 ]: s& M3 f- @) X
  178. mov al, 4fh
    9 D) C) W- _& m9 @. k# k
  179. mov es:[si], ax& }' ^3 t- @' \1 o9 W
  180. add si, 02
    ) T9 C8 F( Q$ j/ p$ D( e- Z. s
  181. mov  al, 46h; n, x! J6 p9 l- R6 ^7 c
  182. mov es:[si], ax
    , I, w- j2 W5 T3 m' Y- N) C- j
  183. mov al, 46h/ D+ c6 W, r4 V" ^  j3 g
  184. add si, 02
    ( K' B# W* t6 F( Y- N& D' O
  185. mov es:[si], ax
    # U5 Q( l3 k6 P  p+ S' F
  186. popa
    + Z; V. w' |/ M* S
  187. cmp si, 18405 d8 ]7 M* j4 q- c2 {
  188. jae casekey
    2 _: z% v% b  N. |$ m( Z* g
  189. jmp testr
    1 ^9 C6 ?6 H' u- o

  190. ' F& B5 `- A' F; G9 K3 b2 o
  191. kpress:                             ;Check key press if press<ESC> then EXIT" l& s; V3 a! M1 G: b! \+ `, q- \
  192.         cmp     ah, 01h             ;and return a error6 l$ [% t( S( ]; @3 o
  193. je exit1
    6 W7 H9 C6 @" F# @! x
  194.         mov     ah, 0ch             ;if press other key then clear1 K* H; g9 i8 _: _8 v1 m/ ?% y$ P
  195.         mov     al, 00              ;keyboard buffer
    ; }; e$ ]: u3 K9 O
  196. int 21h/ Z: J2 }/ G% X/ q/ U" k2 Z$ P/ |. h
  197. jmp casemo 2 J5 N0 m' M: o2 G+ |0 h

  198. 5 ^, e9 C( M% ~, D: j
  199. errormsg:                           ;if mouse driver no install; a( Y+ d% _- x3 L9 l8 k
  200. call oldint
    5 c3 S7 I+ n2 J7 P
  201. lea dx, offset emsg! j7 a/ U9 j; I! F
  202. mov ah, 09h! p# n7 R5 [% c, y/ J
  203. int 21h
    * f: }& {& N( x  d
  204. mov ah, 4ch- u$ ~8 ^0 ?1 k
  205. mov al, 2
    $ S& T0 _1 W% ]( _$ G6 ]! E; I5 d
  206. int  21h
    " H" u! R8 b' x5 K
  207. + L" b* c! l: u
  208. exit1:                              ;error exit+ @( S8 u5 e  A- z* |/ f) C
  209. mov ax, 0002h5 b3 o" j/ F5 t2 y5 N
  210. int 33h+ D) p6 z/ i& \: i. l
  211. call  cleascr; Y1 v/ U: W0 W
  212. call  oldint
    / W2 n4 u: N" I& b9 ^# W* S" N+ o& _
  213. mov ah, 4ch
    ' i9 x! }% `6 z$ q* N) ^+ {) \/ L
  214. mov al, 01
    % G% K+ m9 u) e4 {/ \
  215. int 21h
    ; v8 ?5 \& f% e+ \0 W
  216. + a) b& P- k0 ~% _! Z) n5 v: X- D) p
  217. cleascr proc    near                ;clear screen  E7 n) N* }/ n- ^7 N
  218. pusha- Z9 P3 p& W" t  ^/ L/ ?
  219. mov ah, 06
    3 z$ x0 F% t; w% P' X
  220. mov al, 0% g# p6 P6 O' Z! i0 r( S! }' T
  221. mov cx, 0  ]: w1 N0 T) f" v
  222. mov dh, 249 T, ~9 S- v2 _. u3 H: z
  223. mov dl, 79% B/ y; c; K! U6 W$ ]
  224. mov bh, 07h
    9 j5 x0 ^' U7 s. t4 B. B
  225. int 10h, X) J- ^5 f* g5 H
  226. mov ah, 02) F$ Z$ t+ u" I/ m
  227. mov bh, 00! g- f4 T: }& R
  228. mov dh, 06 `. C8 B' |" A) r0 y. b& q% R
  229. mov dl, 0
    0 h6 V. k8 }: c: b( i. F- A( G
  230. int 10h+ A% H- t8 J) G
  231. popa
    8 p9 B- h& I' P: F/ E
  232. ret' Y5 _) |6 A& L
  233. cleascr endp* g' K, o8 ?, ~1 f) I- S, L

  234. $ i6 L; P) d' n. Q3 ?
  235. showmsg proc    near               ;Show info+ P  V5 q# g; }
  236. pusha
    5 X/ b% y; F. z6 B' c9 D
  237. lea di, offset showms
    & r, g% E; r( I* p* k8 c7 g& g
  238. mov ax, 0b800h
    7 ~0 a4 Q$ `- K2 c
  239. mov es, ax
    2 ~7 S# Q1 ]% F
  240. mov si, 0
    9 v/ p/ N! \( G7 ?9 j0 r0 p
  241. mov cx, 4802 {( a9 |* X/ @$ Y8 R8 C* z  B
  242. mov ah, 07h8 ~9 m& R/ N: I
  243. @@:3 q/ x+ y/ n& }1 Y( |
  244. mov al, 20h7 X) n' ]  N! z  N: _6 y
  245. mov es:[si], ax) `6 N% I3 U9 x6 {! P& O  j9 ^
  246. add si, 2
    7 @- }# U  F1 @; c4 ?
  247. loop @b
    / @; u6 J% \9 ?* V, [1 ~
  248. mov cx,880* M# b  R. c5 U  L6 P7 r" d1 s
  249. @@:
    3 Z5 Y% p( R; w9 ~
  250. mov al, [di]
    " B& ^; s) P$ P/ |' N% R8 C
  251. inc di
    ) i5 q+ w8 y! q$ g
  252. cmp al,20h
    : z! Z  X7 v: @% ~4 l9 I) M
  253. je showch17 |0 Q1 W3 Y& j' C3 `
  254. mov ah, 17h+ k6 j: Q: Y! R- L+ F$ }
  255. jmp showch3
    5 N. `0 y2 R  d5 K
  256. showch1:
      J, K6 D" [( i
  257. mov ah, 07h
    1 y+ u/ N2 \; @4 o& F6 |
  258. showch3:6 j. Q& R; W8 u: V8 p  e
  259. mov es:[si], ax) ~  p- R8 S9 f" N7 T; s
  260. add si, 2
    2 L: R$ N. v6 J4 x# r$ u; [5 r' D; U
  261. loop @b
    6 g0 L' d7 c% A+ M+ t! ]* D2 H
  262. popa; o8 g9 a7 n3 Z6 e5 W) [( w
  263. ret
    5 O, j( z" L, I
  264. showmsg endp
    4 U* l6 ^2 z' c: X$ l7 @

  265. 5 X, ]: n' w  T  N
  266. oldint proc
    " \" a% @. W$ W2 }5 C
  267. pusha
    9 `5 W  N) v5 x( v
  268. mov ds, word ptr cs:[old331]: p2 e6 k( \7 y" j; c
  269. mov   dx, word ptr cs:[old332]! I' Y7 Y, X4 r8 K; g+ D# b$ R9 {
  270. mov ax, 2533h( O2 b) x8 }1 I
  271. int 21h
    ; X( {  H2 [  D! `; L
  272. mov ds, word ptr cs:[old741]# _1 e" K$ u' k4 R
  273. mov dx, word ptr cs:[old742]6 ~# \- k  [, i* f, I( O
  274. mov ax, 2574h
    4 K' T  ^7 J! K  f( c
  275. int 21h
    6 z& @7 R( a6 ~) p: R4 `- z
  276. popa" Z: f2 M7 p/ Q" L
  277. ret
    8 X  n! n! h* M
  278. oldint endp
    $ q3 g# e) C* F% I: M
  279. 4 [' _. Y- ~9 Z0 |" S
  280. memmouse        proc1 p! L8 {9 ]) a
  281.         xor     ax,ax3 U7 `5 I$ Z# X
  282. int 33h
    ( p  O1 I5 N6 a: E, {- f/ F
  283. cmp ax,0ffffh3 t! n7 c6 R# u0 p6 P* A5 G2 j
  284.         jne     not_loaded
    ) G- w+ a" u. N$ H# N* E/ M
  285. mov [memcopy], 1  _6 Y6 {/ ~6 r
  286. ret
    0 N4 f7 X2 q$ O8 m2 m
  287. , e0 T5 u! B6 w: F) o% m: W
  288. not_loaded:
    6 V4 z7 u5 d0 x1 G7 {
  289. / A  Z6 e# K$ k4 m
  290.         mov ax,2574h
    " a# s+ J+ j7 \7 Q& M
  291.         mov dx,offset new_isr
    # o8 t6 W$ _0 W3 U0 D8 l
  292.         int 21h! A* h: ?9 U4 \
  293. . m/ m7 |! l8 f) m# W& {
  294.         mov ax,2533h
    / F. X- E- z; M" e$ o( v
  295.         mov dx,offset new_33( D& m9 g  K" W! A
  296.         int 21h" C+ b5 p/ i  q& H3 N; M7 |9 x

  297. ) p1 t  U2 M" u: z; L
  298.         cli
    $ t& g. ~! U5 i+ ?0 I. n2 S- W( |* K4 J
  299. ) p9 p6 p6 _4 H$ |9 u( C; k
  300.         mov bl,0a8h2 J' @" [+ w2 v
  301.         call keyboard_cmd
    : N* K6 S" V. q3 j9 H. W; K! j% K) J
  302. + P' }5 \% |4 F/ ?
  303.         mov bl,20h
    # L# |) ?/ H* y! @! B; y
  304.         call    keyboard_cmd" s; \. l  Q  @% E+ ]. f6 p
  305.         call    keyboard_read3 o9 x2 i' \: m4 [5 f
  306.         or      al,2
    $ T; \9 d1 I/ F: }; Z
  307.         mov     bl,60h" x" ?" ~* ~) ^6 q
  308.         push    ax: X0 b- k/ ?. D+ o' B* J
  309.         call    keyboard_cmd) v5 {7 A4 D) V6 \% y" n) b; i3 A3 j" v
  310.         pop     ax
    ) |0 q. D5 V/ _
  311.         call    keyboard_write
    $ `& g2 |( ^! A8 V
  312. & Y3 d( ~+ @2 i7 N0 e1 }
  313.         mov     bl,0d4h! y4 u7 l4 U  O1 C. C1 X
  314.         call    keyboard_cmd
    6 o& h7 `9 B0 x9 d
  315.         mov     al,0f4h
    ; f4 s- \3 ?) w! U
  316.         call    keyboard_write; B- {, U) |+ L

  317. * H' J, E, O( G% B" |3 i
  318.         sti' D3 z4 y; o5 ^* h+ j' C
  319.         ret) A8 F0 R8 a' }$ K. _
  320. call_user_isr:
    * d2 X- z! Y3 ~9 v* F6 S! h3 g, s
  321. db      60h3 P# z# n# B+ s# g  L
  322.         mov     cx,cs:[pos_x]
    & W8 W/ {1 e4 ]! P6 \
  323.         mov     dx,cs:[pos_y]$ p, T, ]& o! G5 ?
  324.         mov     di,0 ;cs:[x_move]% s* e' q9 T; h' ~8 q+ U
  325.         mov     si,0 ;cs:[y_move]& e- w0 v4 ?6 w1 |8 R5 [0 ^# f
  326.         mov     word ptr cs:[x_move],0
    * L( O0 |1 P' W# o: C9 X  e
  327.         mov     word ptr cs:[y_move],04 r7 S5 L7 `# @" |/ N3 g( m
  328.         mov     bl,byte ptr cs:[buttons]7 R) u( G6 C5 P- k& D
  329.         xor     bh,bh$ [1 l& ~8 [: ], n1 D* C- E' ?
  330.         call    dword ptr cs:[user_subroutine]
    / F% x' Y* ~# S; {9 N
  331.         db      61h0 b+ T& s# n" |' a8 e0 C( M
  332. ret
    5 ?: Q1 Z% \* ]* [, v3 `; g9 y1 w+ p
  333. new_isr:6 u8 \; r' Z4 H5 z& C/ p+ K* z
  334.         pushf# L$ I( p/ a4 R9 g  R- \3 k. t
  335.         cli
    / m6 o8 @2 \8 p5 O( V
  336.         push    ax
    ' S2 z* f: X, X- L; q7 w! D
  337.         push    bx
      {$ ]; F* i% {( X& |9 F' k* X
  338.         push    cx
    7 ^$ E1 `6 l$ n8 `* i1 e
  339.         push    dx, N' U8 S9 o# K$ J, M+ a9 Z' U: t
  340.         push    di7 ]/ a+ j1 d: E: R
  341.         push    si/ r& w0 c/ }3 C* Y' ?
  342.         push    es
    $ {, V  |5 b3 I1 l; u3 @
  343.         push    ds& y! w/ r9 m) P1 K# K* _( L
  344. 4 X' t, f, F$ j7 S7 V6 f
  345.         push    cs
    0 h" z2 o1 B& O6 u% t
  346.         pop     ds
    ; @- G5 V. B" ^( P+ X+ m

  347. - \1 ?; R6 }! Y( k$ d* @5 ~
  348.         mov     bl,0adh+ R0 ]4 l, B9 c8 v" C) ^7 y
  349.         call    keyboard_cmd  i& @" A- X5 Q1 X6 b: a/ T

  350. # z7 s- X; P, ^* f8 w2 F: @3 o
  351.         cmp     byte ptr [first_time],0; A$ K5 M% `: H$ B! @6 s
  352.         je      not_first_time
    : C# C4 y( M7 W4 G: z7 E3 {' i

  353. 0 u8 L5 Q% P  x6 j& U: {
  354.         mov     byte ptr [first_time],0; w# m# `8 J6 C8 ^/ ~' G3 p, j
  355.         call    keyboard_read% S4 ~$ k, ^* L5 {6 x1 g$ C. n
  356.         call    keyboard_read
    / Y& D# |5 `9 T$ ^8 y5 G
  357.         call    keyboard_read
    * D& R  [) v4 C) I" N& K$ s# a
  358.         jmp     no_show, h+ ^- P6 |/ L" Y% e6 }( @# y

  359. # m7 T2 a. X# o; d% I; D  M, c
  360. not_first_time:
    5 ]+ G: {3 ?! Q8 N7 t0 {
  361.         mov     word ptr [temp_mask],0. S! E; o3 ~2 _9 }# _- G0 Y

  362. . K3 Q* z. L( `: n3 O
  363.         mov     cx,[pos_x]- }; i# x2 ?/ \# P
  364.         mov     dx,[pos_y]  l& y8 @# H& z& P3 v( F

  365. , d" g4 A1 \4 W
  366.         call    keyboard_read+ g7 @5 o5 z! @! _; F
  367.         and     al,7 ;3
    1 N* ?& d' Z: R" b9 I/ }# `$ O
  368.         mov     ah,[buttons]0 r, X6 [. `$ o  \
  369.         mov     [buttons],al- `* E7 V1 H0 g# u& G9 _
  370.         cmp     al,ah
    & l0 Z! P6 |, v" `7 _
  371.         je      no_button_change4 g6 X) F" E( F  ?9 f8 K" ~
  372.         and     al,3
    7 C$ U7 ~1 A7 S! l3 D5 f0 L  D
  373.         and     ah,3" H+ r8 ~9 t1 h& O/ a) f8 T
  374.         xor     al,ah6 c" u* j' Q" W5 j4 E
  375.         xor     bx,bx( ?0 b* E* N" V0 [( M; O$ K6 Q6 k6 c
  376. " j3 i+ R2 E( J! }' K, y1 `
  377.         push    ax# d. C( [6 A! x# ^) r+ j
  378.         test    al,2! [( l9 {6 w; K& _
  379.         jz      no_right_button_change) \0 V2 p, H! f7 ?4 ^
  380.         and     ah,2
    , @' K0 e! ~0 [7 o4 W
  381.         jz      right_button_pressed1 O7 e2 o" c  `+ @  w9 b; M# d8 v
  382.         or      bx,163 c. N' x/ |5 p" s, u
  383.         jmp     no_right_button_change! l3 e/ e- E$ n& C1 q( W( W
  384. right_button_pressed:% j; d3 ]: \* ?/ T$ [
  385.         or      bx,8" U/ ?* G  m( k7 k# Y
  386. no_right_button_change:
    0 R6 o, L. ?; o8 h' y
  387. % c' i8 M! }9 w6 j
  388.         pop     ax1 E5 G7 J5 X9 ~2 B" c/ n

  389. 3 m/ O3 [) m3 X6 e, ~
  390.         test    al,1- |8 P9 _# M  W/ N
  391.         jz      no_left_button_change
    0 W% R) k$ V  t! @# [# z
  392.         and     ah,1
    0 C5 d% L/ i+ R2 X3 A; @
  393.         jz      left_button_pressed
    4 f& A4 }% r' \1 B% t5 l2 w
  394.         or      bx,41 M. e. m0 y$ f/ {0 h
  395.         jmp     no_left_button_change
    ' g/ f# T) }, U8 P8 N% ]% w0 b7 z; O
  396. left_button_pressed:: U8 j0 E5 e8 Q( R5 g
  397.         or      bx,2
    9 f4 |) y: H* L9 ~9 b
  398. no_left_button_change:
    5 ?, c8 B% c4 ~

  399. 7 ?, F, V! ?+ [5 w" @- J8 V
  400.         mov     [temp_mask],bx$ j7 v4 E" L5 R" L

  401. 0 U# N3 B  ?$ }) M" I% ^
  402. no_button_change:
    2 P" t4 e% r1 d2 _9 h+ B( K% E0 n
  403.         call    keyboard_read: u" s1 H8 f2 T* Y7 I/ E0 B; r
  404.         cbw
    ; a  W0 r# m$ i) y
  405.         add     [pos_x],ax
    / d" P% }. T  F' Q
  406.         add     [x_move],ax
    5 [: O8 g4 H6 V% I5 J8 M; C, \
  407.         mov     ax,[x_min]8 ]; h6 ^' [! i7 U$ n$ M
  408.         cmp     [pos_x],ax( n. g4 f# y: ]/ }" v) m& u
  409.         jg      good_hor1
    % m) j9 f6 p% e5 R1 E* y' u
  410.         mov     [pos_x],ax
    ! A' u8 b! h) P& i5 r8 Q2 i
  411. good_hor1:: ^& s+ F2 G+ F' M5 t: M) q
  412.         mov     ax,[x_max]; j8 X3 n1 r/ h, ~& q  }
  413.         cmp     [pos_x],ax
    ! ~0 X6 A: O2 m8 A5 e/ L+ _( _
  414.         jle     good_hor2
    ) r5 J6 w7 H3 q* J- j; E1 }( I
  415.         mov     [pos_x],ax
    # D8 x: m6 V5 L+ o3 |$ D
  416. good_hor2:' N1 c1 w) U1 {
  417. ( q8 x" N% p+ u$ f: [
  418.         call    keyboard_read; _2 G6 R  n/ `
  419.         neg     al
    + ?' j0 G! X& K4 N1 S
  420.         cbw2 [# L5 d9 C# ~6 [
  421.         add     [pos_y],ax0 ^7 S; x$ ]2 H* f* r
  422.         add     [y_move],ax2 k8 q8 a4 s1 T% I
  423.         mov     ax,[y_min]
    1 {/ J/ C0 u; Y, ~" D  _# F
  424.         cmp     [pos_y],ax
    ! M3 d& N* P7 s6 c" P
  425.         jg      good_ver1' f$ H( [' G# {/ U
  426.         mov     [pos_y],ax
    - o5 l7 r0 N( A( n1 u) u; |
  427. good_ver1:" r7 O. k+ {. O1 F5 a+ O' f$ _) R- E
  428.         mov     ax,[y_max]
    & m& }7 z6 t4 C. k6 I- _7 @- j
  429.         cmp     [pos_y],ax  D& ]1 n- [( F! @
  430.         jle     good_ver2
    0 K. Z2 M/ w) B/ w% X+ n1 o/ R
  431.         mov     [pos_y],ax
    , X! V  e9 I) \4 z0 Z) z: l! m+ S! y: c
  432. good_ver2:% I/ w! p. k* S8 q7 L5 k# h

  433. ; Q9 g0 s, T- e2 ]
  434.         mov     ax,[x_move], g' I  ^6 A  A$ o
  435.         or      ax,[y_move]6 t4 Q8 [3 M$ y# @9 X+ m
  436.         or      ax,ax5 D  J+ N& o/ V3 h2 b5 d
  437.         jz      no_change_position7 D) K0 W& J2 a* T8 P6 B
  438.         or      word ptr [temp_mask],1
    1 V, G1 M$ S5 l2 u# E
  439. no_change_position:* B* S4 j0 \" @* d2 J! |# ~
  440. $ _; q6 `/ ^! e! {# v0 C
  441.         mov     ax,[temp_mask]
    ; ^9 M* O' ~( d, U
  442.         and     ax,[user_mask]2 i9 y, @" D( z) J, f
  443.         jz      no_call_user$ t& L. g. `, W2 x$ T, Y# M
  444.         call    call_user_isr7 q, Y0 S- N. m) Y: D+ y
  445. no_call_user:- D% y& L  M  p5 K

  446. ! Z* X3 i, W% L
  447.         cmp     byte ptr [sm_flag],1% u1 _1 X) N" b  }; F8 R& `( N! s
  448.         jne     no_show
    7 g) C. b8 f3 C& j4 G7 D* U
  449. - e& l4 n; a5 u8 K% G6 V
  450.         shr     cx,30 q9 P. S) i* j; z. ]- i
  451.         shr     dx,3; Q" B0 A+ m, H/ f
  452.         mov     ax,80" Z' n$ g! C5 Q; q  s4 h7 Y8 ?. M' s8 i8 l
  453.         mul     dl
    3 v0 a1 z% ^1 ?
  454.         add     ax,cx
    2 m- ]7 m! a4 c3 o7 l8 T% q$ Q
  455.         shl     ax,1
    . {% f. @# L/ z  ^
  456.         mov     di,ax9 K. r& A4 G3 w+ A- M9 d1 r
  457.         mov     ax,0b800h
    . }, F5 _- n- R) E) t4 [. V% a4 F/ }
  458.         mov     es,ax0 s) j( v% u3 n' j
  459.         mov     ax,[save_char]1 J4 v; {/ @( F" {$ G. Z9 @
  460.         stosw- X4 u1 E3 ~9 `7 u( b" w( ~* X. A

  461. - q  Y$ S, @/ r" S1 _+ p) A
  462.         mov     cx,[pos_x]
    5 ^, g8 _' a! u4 ?/ ~5 K5 Y$ k
  463.         mov     dx,[pos_y]
    + e# [+ t$ Y9 K! S9 ^2 `% m
  464.         shr     cx,3
    8 q/ G' h5 i* J* i3 p( n6 P4 N) @
  465.         shr     dx,3
    * X9 a6 }& N/ G5 S% s# E
  466.         mov     ax,804 ~& J5 F' h$ U  [
  467.         mul     dl* h6 `. h# t7 [+ c8 X- a
  468.         add     ax,cx4 v* ]# }3 K) F. O7 D' V8 F1 _
  469.         shl     ax,1
    . W+ X0 N% k# b0 x% P" F
  470.         mov     di,ax! X; y1 L! I( X* K4 J0 ]
  471.         mov     ax,0b800h
    6 e" x3 ^. O! p' S$ k+ U1 Z
  472.         mov     es,ax
    4 i% x! I4 _, \$ A: k
  473.         mov     ax,es:[di]( K' X6 [- K, A5 i% f$ A) A
  474.         mov     [save_char],ax
    3 q3 l, [3 y- `4 V6 m. F; V) x
  475.         not     ah- v6 Q  W) p8 D+ I/ t. q
  476.         and     ah,7fh: A1 I5 _( R( D- b9 R6 ]
  477.         stosw. g# c, ^2 V( Y  \
  478. no_show:
    . a6 Q, e. \! |6 n* a& X
  479.         mov     bl,0aeh4 |. z& ?- c+ R: u! V4 U
  480.         call    keyboard_cmd
    * |: o. i+ ?+ q4 P4 G- k

  481. ! K; S: T- A8 ^) o" `% {
  482.         mov     al,20h
    " O& ]5 j5 A- k% P& F. G  c2 w
  483.         out     0a0h,al
    2 k& H: ^  e1 I$ j
  484.         out     20h,al9 X* H, t  g6 `% T2 v8 Q7 s" V9 Y2 ?
  485. * N5 F% o6 j7 e, g, A, P$ F( N
  486.         pop     ds% T. H) t6 c' w& z7 f
  487.         pop     es
    ) N0 p4 ]0 B9 E( j) r' H- _9 `
  488.         pop     si0 d5 ~1 X% x9 g( [4 K1 G2 R# W7 t
  489.         pop     di' e5 U# I1 T" |/ f6 O# |7 V
  490.         pop     dx
    / N- S& C2 i  |: ]
  491.         pop     cx
    # J9 t( d3 G- U4 [
  492.         pop     bx
    $ s7 J0 t, X' L0 S+ g$ e6 v
  493.         pop     ax
    4 _4 G' L  i" ~' J$ Q) t5 _5 k
  494.         popf  q$ @; \8 P7 w& G
  495.         iret
    ' D7 j* _* A6 {1 ^
  496. 4 _; v# g; t* t5 q! a# Y8 g+ _
  497. first_time      db      1
    9 k& Q3 h% ]4 E
  498. buttons         db      0
    7 W$ g* ~& q: u( D6 J9 Z
  499. pos_x           dw      0  x+ B) {8 K3 {) t& l  z
  500. pos_y           dw      0
    0 O& k0 D; D# ]1 Z% G% S) r( o
  501. sm_flag         dw      0
    0 J' i; F) q) u( h; {" [
  502. save_char       dw      0- F0 ^: q9 L( |5 Q* ?! E
  503. x_move          dw      0
    & |$ w. V" j+ g6 {' ^
  504. y_move          dw      0
    5 t) e  d8 u  w6 B9 k
  505. x_max           dw      639* _* p' \6 b  r2 M) l* a1 V$ g
  506. x_min           dw      0
    , F4 k/ H9 c! H& U% D
  507. y_max           dw      199' W! K7 d& t( g& R1 \; }0 X  o
  508. y_min           dw      0" K6 j3 q, C% i
  509. user_subroutine dw      0,0! ^' y6 ]3 f+ J" x# _# J
  510. user_mask       dw      0
    9 h8 {$ f  p1 a
  511. temp_mask       dw      0
    . t1 D; |1 L: s  s1 e
  512. 4 H+ k' B5 B0 S% s! F
  513. keyboard_read:0 R; L. p' ~8 f/ f# r3 E; \6 u
  514.         push    cx; \+ ]+ L- w" U1 S2 u& t2 Z! G
  515.         push    dx; o7 s! p; O# I: v5 ~: D# x
  516.         xor     cx,cx4 ~& k1 t6 U) y
  517. key_read_loop:
    ! f8 I. j1 x2 K; Q, _
  518.         in      al,64h8 c. s; N. _" Y& f8 j# H; f
  519.         jmp     $+2: k: h! T( R4 R* w& b
  520.         jmp     $+2
    2 c8 ?. [) `' \- `
  521.         test    al,1
    . t, p) I, X6 r; m
  522.         jnz     key_read_ready; \1 L; W9 l4 w) i) I# E1 t" O" a
  523.         loop    key_read_loop
    : @8 y6 u* @) Z$ e
  524.         mov     ah,1
    $ P4 `5 s9 E- D+ P6 L# d
  525.         jmp     key_read_exit
    ' j+ Z5 q' d& g9 v7 X( ~5 V0 n9 ~
  526. key_read_ready:2 E+ C1 t7 N! F  C8 g1 y0 ~
  527.         push    cx
    & ?: I! S, A7 ~. F% d' X. P0 B- ?
  528.         mov     cx,32
    0 u) S: o1 t1 t: A& Z( z
  529. key_read_delay:
    - w0 |2 r. M. Y
  530.         jmp     $+29 ?) _: U$ I/ }
  531.         jmp     $+2( d9 |  O! N# Q
  532.         loop    key_read_delay( ~0 ~) h  V: Z6 d2 o
  533. 3 h5 x  ~$ I8 `
  534.         pop     cx
    # Q2 k9 q- P! H1 U4 n

  535. 8 s% l8 C8 d# N; Y( h, L
  536.         in      al,60h
    - M4 B" K! _1 r1 ^$ X
  537.         jmp     $+2
    2 z6 R4 Q  V7 c/ }$ ?; F
  538.         jmp     $+2( K/ ]  |2 ?9 [4 m" p: N7 P
  539.         xor     ah,ah1 ^/ A2 r6 H, x1 i
  540. key_read_exit:
    " g1 |1 K/ G/ W
  541.         pop     dx
    " |2 k! h! z/ Y' i! ]/ s
  542.         pop     cx
    2 c# i2 M* {0 q( J  k
  543.         ret8 p, K$ _9 b, p) D0 f) \

  544. 6 }3 s2 C$ Y4 Q
  545. keyboard_write:+ n6 [2 C$ i0 F
  546.         push    cx' l( L" k, Q) e/ S/ H2 ~) [
  547.         push    dx" f9 w6 {' w) ]/ }6 W# {
  548.         mov     dl,al* T1 e" w% Q; T5 T3 v3 D
  549.         xor     cx,cx1 t6 G0 [$ ]! i1 n. A4 S
  550. kbd_wrt_loop1:
    , |4 N7 o4 d9 g3 j) Q
  551.         in      al,64h
    6 C6 p! ]/ `" ?; o
  552.         jmp     $+2
    7 A$ Z; F" _' d6 Q/ W2 n
  553.         jmp     $+29 J0 f7 p0 e! D& @% [
  554.         test    al,20h
    + x8 r9 U! e+ v: m& v# h1 F
  555.         jz      kbd_wrt_ok14 |4 f% }1 t3 ]  @; y, m

  556. / G( S+ r; g8 s+ l* n
  557.         loop    kbd_wrt_loop15 I' [( s" ^# t& U2 X  n1 H
  558. ) g+ y& Z0 f- W! x  \) N. P
  559.         mov     ah,1( e) w& R7 y. u" Y4 O
  560.         jmp     kbd_wrt_exit/ u5 @5 K$ G+ S. C2 Q5 n

  561. $ p) W5 z& ^1 @$ D  V# A% y
  562. kbd_wrt_ok1:: z4 b- c4 a3 e
  563.         in      al,60h: G2 W' p3 {7 u
  564. * u( n4 B" A8 Z
  565.         xor     cx,cx
    1 L9 ^3 [/ N" M. ]5 m6 G* v/ S
  566. kbd_wrt_loop:4 w3 O* a, e( _" o" B7 [$ N
  567.         in      al,64h+ Q; }; Q3 B' w4 ]
  568.         jmp     $+2$ ^  ^3 ]3 F' |# L$ i" p; a
  569.         jmp     $+2
    % s0 H6 P4 U8 [1 S; }  i
  570.         test    al,2
    - p9 o/ ?7 b5 G/ ^3 N0 I
  571.         jz      kbd_wrt_ok: M5 C4 O1 @9 j

  572. 9 x$ i6 U% G1 c0 \* C2 q+ I) X$ F& a* G
  573.         loop    kbd_wrt_loop
    " _1 O& W7 }  H) h

  574. . \' t& {* L- l! R; l2 ^3 i" v# L
  575.         mov     ah,1
    ) U; G: q% D( q7 F2 |7 R
  576.         jmp     kbd_wrt_exit
    & l" G1 |9 s+ q8 y- I9 T$ |# x
  577. . A! q; C( T+ v5 A! c3 k' R
  578. kbd_wrt_ok:& \7 n: H. F  A
  579.         mov     al,dl& R* y* K& ~' _* Z! L0 G
  580.         out     60h,al! n4 X% y( i8 Q+ ?& o
  581.         jmp     $+2
    $ E/ b& A  A4 V
  582.         jmp     $+25 I1 B" ^$ F9 K/ ]3 Q

  583. & y1 W1 F3 {) p- G
  584.         xor     cx,cx6 x9 C0 |# Y0 O( H! F5 @
  585. kbd_wrt_loop3:2 Q& `7 j% B( ^" J
  586.         in      al,64h
    ' e7 b5 b% m2 D
  587.         jmp     $+2
    / c9 S* @  p& M& y; F1 M2 }2 B
  588.         jmp     $+2
    ' ~$ e, E) ^! K: m( n: a0 ?
  589.         test    al,2
    ; p. r7 m# ]* f& z; F
  590.         jz      kbd_wrt_ok3, l5 Y: c% G- g/ X7 n: t) _

  591. + c" A1 i- U* }; [4 ]  A# ?. V
  592.         loop    kbd_wrt_loop3- `. @; D9 z- j4 U* _: D5 h, G- s
  593. 7 {+ g1 H+ x( T% L
  594.         mov     ah,14 b8 i& F: U3 a4 W/ M1 t: S
  595.         jmp     kbd_wrt_exit
    - ~0 i+ c& ]0 H% g* A' [/ q
  596. 9 E- I5 M( Y4 X* Y! R; x
  597. kbd_wrt_ok3:
    0 ]$ g. X  K3 _) F( j$ L6 g
  598.         mov     ah,8
    & h( a: d) c: Q, f5 A
  599. kbd_wrt_loop4:* ~+ m5 S  r7 E0 D& R! |
  600.         xor     cx,cx0 Q* ?4 Q: h  E' R# q
  601. kbd_wrt_loop5:4 P( ]& Q' @+ i9 ]
  602.         in      al,64h7 K4 i) q& p6 [
  603.         jmp     $+2
    9 E: d& u1 A% g3 j! |( ~7 ^8 z9 D+ f) u
  604.         jmp     $+27 v( b; U+ }7 h$ l$ A7 Y/ M% U5 ?
  605.         test    al,1
    0 d: y2 R2 r: X4 X
  606.         jnz     kbd_wrt_ok4
    + G2 ?$ I6 D% a5 a
  607. ; ]$ K0 a0 @& Y
  608.         loop    kbd_wrt_loop5
    ! ?; t7 N2 r; k7 f$ G
  609. / o2 q; ?  e0 J
  610.         dec     ah
    ) O& R2 c+ a3 t7 e5 X' l, {
  611.         jnz     kbd_wrt_loop4; p1 z/ W( A6 f% M, [, x+ C! E

  612. , |- X: L! l/ P7 j4 K
  613. kbd_wrt_ok4:
    , u, V# }" k  _" Z: h  b1 w: t% s& T" v
  614.         xor     ah,ah
    ' w) P" b/ S4 E# w. H
  615. kbd_wrt_exit:
    # q% L8 s& D- e% C; A# t* ]
  616.         pop     dx
    ; m9 {+ m9 d% b& r: d
  617.         pop     cx
    7 t* ?1 n  d$ S  l5 Y7 R' y
  618.         ret4 g& G2 R1 q" S$ P6 F: q0 S3 S
  619.         
    ) t5 o* h3 k2 u0 c1 L9 i
  620. keyboard_cmd:
    " t3 [2 L# m; h5 |0 X
  621.         xor     cx,cx
    ( b' Q- _5 h6 ^2 }6 O3 z
  622. cmd_wait:
    5 @+ H- a. H- H# e' d
  623.         in      al,64h
    ! }. K# X3 X' G" m$ D  v8 D
  624.         jmp     $+2& t  E: ~0 j* `" R5 A
  625.         jmp     $+2/ X( n/ g. I( u. d" l
  626.         test    al,24 v+ L5 Z5 {8 e: D3 U. L6 X
  627.         jz      cmd_send
    : \% Z) j1 A& Y* ?3 E
  628.         loop    cmd_wait
    2 e% K. J* E8 v5 n
  629. . s4 ^9 y4 ?5 j# V' U# E
  630.         jmp     cmd_error
    0 K) x. j9 q# ]9 P0 I' \% y5 a* S
  631. 2 j; S* r; Q% L+ {7 s7 c' \* d! @2 {- \3 Z
  632. cmd_send:
    5 c: q5 ^* C  V6 K$ V$ K% A
  633.         mov     al,bl
    # q% [9 a' \0 u6 M( l1 u
  634.         out     64h,al
    # O+ ^1 E; B$ g5 R2 O
  635.         jmp     $+2( r5 C  s4 P% c% C$ p/ Z
  636.         jmp     $+2
    5 ?9 |/ t' ]- h- j# p+ O; D2 t$ d
  637. & f7 U5 t% v0 l. k) J+ w% i- }# l
  638.         xor     cx,cx
    * L5 {# }$ t5 i8 D) A& w
  639. cmd_accept:& w& t9 c! o' C* A# B8 V
  640.         in      al,64h& Y8 I$ h' v& N3 R, p7 B6 C+ m
  641.         jmp     $+2. F) d8 u$ i3 H' {+ F( {
  642.         jmp     $+2
    7 U* V$ o9 J/ A" ~% w
  643.         test    al,2
    / `: T8 L9 n) n  t
  644.         jz      cmd_ok
    8 Y2 S# ?$ j& B* j7 O
  645.         loop    cmd_accept6 V# \! J: w  g$ p( u* `
  646. & ]+ E1 @/ b3 u. U# m
  647. cmd_error:  @/ L& X4 s9 A. ?! y* i. }
  648.         mov     ah,1
    : M' b1 H: H4 i; j
  649.         jmp     cmd_exit
    ) L2 c; c! f1 q# @  i6 G" o
  650. cmd_ok:
    2 M7 J4 ^: }9 o& W1 _' N- J
  651.         xor     ah,ah7 Y- K  e1 T# n& j1 |
  652. cmd_exit:- A' h' _3 r  T, I% B+ x
  653.         ret' r3 D9 p6 i$ O1 r4 C9 q2 ]1 Q0 U: z0 f

  654. ( [7 d( j  I; M3 f/ Y
  655. new_33:
    ' t: a: A# o; i" I, T7 y
  656.         cli. w; v8 Y4 M$ C1 c! r4 j3 P
  657.         cmp     al,0
    ) ?' S6 B: g0 V; ?% \
  658.         je      reset_mouse
    7 e/ h9 v1 p2 Y) z
  659.         cmp     al,10 c2 M0 l$ k: z# x8 M) ~
  660.         je      show_mouse
    : Q$ P1 j. L- @( ?' v9 @
  661.         cmp     al,2
    & J) Y; o# Q  C' Y6 m- ?3 l1 k
  662.         je      hide_mouse* |. C1 _8 a' D
  663.         cmp     al,31 H. d+ g. v# e( M( I
  664.         je      get_pos% K6 d) B0 R% C
  665.         cmp     al,4
    8 L; K4 ]' L' m
  666.         je      set_pos$ H4 O  t1 C7 x9 V/ b' h
  667.         cmp     al,7
    3 K% b/ F& R. ?, \  f! j
  668.         je      set_hor_pos
    6 @% E! g  i$ P4 z9 Z' Y  j
  669.         cmp     al,8) E8 ?" w# \' }9 G5 Y
  670.         je      set_ver_pos
    5 K& y( T: L7 X- Q- }
  671.         cmp     al,0bh
    1 S- v( p! l# ?2 d* g
  672.         je      get_mouse_movement- T" ~; `% u. G4 S; o
  673.         cmp     al,0ch" B5 J; z' u8 c1 y: \3 k: P( q
  674.         je      set_subroutines
    $ R  v, V+ K. ?9 p! N5 O1 W0 d
  675.         cmp     al,14h
    + t, q( ]7 Q7 ?* |7 D5 B
  676.         je      swap_subroutines  p) X2 @& o3 ~# \  ~
  677.         iret
    4 D! P) G! p7 D
  678. ( [( ]' {0 u% ?* x0 F
  679. reset_mouse:( M) I3 [% X6 H) Q4 n  F
  680.         jmp     _reset_mouse) b) P* X( ]# m! `! M# i
  681. show_mouse:
    ) W( w; R2 j  \4 G2 [9 y
  682.         jmp     _show_mouse
    ) k. \9 m7 F' z$ D- E8 S
  683. hide_mouse:7 n1 c1 t: j$ w! A
  684.         jmp     _hide_mouse# l$ m7 i( R  \% y; M0 s2 E9 s
  685. get_pos:; i+ q7 `1 F3 O1 v; s+ O
  686.         jmp     _get_pos/ W+ `9 m; a7 d6 L  x  X
  687. set_pos:0 ~* d+ N5 t" ^# \
  688.         jmp     _set_pos1 v9 m8 z5 U% y2 T: W' |
  689. set_hor_pos:
    6 n+ U9 ?0 _; j# L  c# ~( y  C
  690.         jmp     _set_hor_pos
    1 H  V/ \: V7 v# M$ ?
  691. set_ver_pos:
    0 W' S" x0 {: d; g. T$ R
  692.         jmp     _set_ver_pos) r* ~% U  J2 u: q! ^3 t, r5 ^1 @
  693. get_mouse_movement:; t6 }& C3 k! k! D) }6 a
  694.         jmp     _get_mouse_movement
    . o; ~8 e+ I6 d3 d, K7 d# V* b
  695. set_subroutines:
      p9 x! e# Y9 P  m0 O
  696.         jmp     _set_subroutines* ]. S' L/ G6 G- r0 [$ L8 e  c- ]  H
  697. swap_subroutines:5 Q# T; D# d* f7 s# b
  698.         jmp     _swap_subroutines
    5 `3 F" n3 w- s
  699. 6 g5 K) v: p) ^6 a& V
  700. _reset_mouse:
    ( b3 e, e0 \+ X' }
  701.         mov     byte ptr cs:[buttons],0
    9 R1 `2 Q% v/ R* P/ `6 P
  702.         mov     word ptr cs:[pos_x],0
    3 L. i, d$ o! g- K6 Y4 w- B. i
  703.         mov     word ptr cs:[pos_y],0, \8 b  B/ q0 O: a: E+ l
  704.         mov     word ptr cs:[x_move],0
    + H+ T% e, e; P* n9 G6 Y( R5 k" `
  705.         mov     word ptr cs:[y_move],0% C1 W0 I( q/ U7 ^( S0 [& f: u
  706.         mov     word ptr cs:[x_max],639' N/ i) H8 t* t5 _
  707.         mov     word ptr cs:[x_min],05 u6 a' ^7 }& f- \& I3 f3 X
  708.         mov     word ptr cs:[y_max],1998 I, z5 L) o' V" z9 n6 a/ }
  709.         mov     word ptr cs:[y_min],0
    3 O" H) |/ k- I0 w
  710.         mov     word ptr cs:[user_mask],0' D7 e, B* p3 {8 A
  711.         mov     word ptr cs:[user_subroutine],0  l' T6 \/ S5 y: e7 D2 ]
  712.         mov     word ptr cs:[user_subroutine+2],08 t) J. F5 _  r! Q8 d& K+ y
  713.         mov     ax,0ffffh, Z- Q; \- R8 L1 J% P+ C
  714.         mov     bx,3/ }+ D& v+ d, A$ i) w1 @: r$ E
  715.         iret0 A$ {: X/ ]) A" e5 f3 S
  716. # U2 W" r  V5 Y5 V; t! A
  717. _get_pos:' D+ x$ V, Z" q  Q. ?& @+ P
  718.         mov     cx,cs:[pos_x]8 T6 \; f* B3 k  E2 n! j6 I
  719.         mov     dx,cs:[pos_y]
    5 L5 G+ ~0 M+ b/ d0 }- U
  720.         mov     bx,word ptr cs:[buttons]: r( {/ p. q$ L: @
  721.         xor     bh,bh
    + B; W2 q" I. i5 b, \( l: ^
  722.         iret5 L' a1 ~% |  S* ]5 ^
  723. + w% ?8 R$ J+ u( O
  724. _get_mouse_movement:
    2 e( m! w; C- }2 |- v- H# [
  725.         mov     cx,cs:[x_move]
    3 I% u! \1 o% j/ J) v8 N1 d7 H
  726.         mov     dx,cs:[y_move]
    ( h8 w' A) d6 k
  727.         mov     word ptr cs:[x_move],0# J; C5 }- h! c% E9 d$ C
  728.         mov     word ptr cs:[y_move],08 q7 |1 ~8 a4 \3 i3 r, {
  729.         iret
      Q0 z' L  J2 g& `
  730. 3 i5 q6 T# d0 l
  731. _show_mouse:
    : e/ k/ b+ r+ l# v! m  r0 b
  732.         push    ax5 t6 g, I9 u+ T, _% L
  733.         push    bx- U1 I9 u2 l$ o& w3 C
  734.         push    di: E4 ~3 H0 Q2 U  l2 o* g0 P
  735.         push    es
    7 J+ R$ k( g% R: f
  736.         mov     byte ptr cs:[sm_flag],1& N' C4 V. m# b: F; f
  737.         mov     ax,cs:[pos_y]
    6 u+ e( i  u1 s- L" `) {
  738.         shr     ax,35 K6 V7 E5 q  P0 I
  739.         mov     bl,80( m! c9 l) G+ w
  740.         mul     bl2 G" J0 U! S4 y, v9 m& I1 ~4 U8 o
  741.         mov     bx,[pos_x]
    : x1 \6 J( i: ?1 `% S; W) s# m) A
  742.         shr     bx,34 W! c1 L8 Z" b! G0 y4 @
  743.         add     ax,bx8 u8 |% {# r+ J: _  O4 L2 f
  744.         shl     ax,1
    ; H3 }- c2 r' g* R5 \* w
  745.         mov     di,ax8 C1 e7 z/ r, q& ~+ w
  746.         mov     ax,0b800h' T( B% q; c( B: X" Z/ C4 l1 g
  747.         mov     es,ax
    . w1 x5 G% v- w( i( p
  748.         mov     ax,es:[di]' s/ t6 e2 n1 v9 h( e* q% N# n' T! v
  749.         mov     cs:[save_char],ax
    7 w. T. n- `( d+ D8 p  i
  750.         not     ah
    / j: o8 x( Z6 W# T( L
  751.         and     ah,7fh+ y# h$ m4 i* e& M- P8 d2 a
  752.         mov     es:[di],ax2 k- N. J, i% W! _( L: T( g
  753.         pop     es. S9 r" O& S" D4 N4 g  Y" J
  754.         pop     di
    ) h" L7 R1 j  k9 w
  755.         pop     bx
    + ~7 w  h# |# O  x; [7 W
  756.         pop     ax
      S/ }: x9 k' [, ]8 y) Y
  757.         iret( j0 Z% A3 w0 a

  758. 3 X! w  A4 e8 y/ u
  759. _hide_mouse:( D0 k$ R1 l. V5 Q( j
  760.         push    ax
    - x3 p$ K) [4 d( N9 |3 A$ w
  761.         push    bx
    0 Z& }8 `$ ]) B$ ~* E1 E" w; e- S" n
  762.         push    di, {% f, O2 c4 ]7 I8 A+ J, w
  763.         push    es! A: y2 H. a6 Y* G( B2 Y+ `, v+ S
  764.         mov     byte ptr cs:[sm_flag],0# A1 ]) j: L& L3 R: }
  765.         mov     ax,cs:[pos_y]
      ^( n; a6 ^, u
  766.         shr     ax,3
    $ y6 Z8 N. z& I& ]; p. m
  767.         mov     bl,80# L, `; }& |# ^7 O2 a
  768.         mul     bl
    . R3 C" ^( W/ \" n
  769.         mov     bx,[pos_x]) T: m4 A% s& Y" {" G8 ?" x
  770.         shr     bx,3
    $ @. P. @# N+ M7 V2 l; V) Q
  771.         add     ax,bx
    ! k1 A- N: _; W$ x3 ]
  772.         shl     ax,1' X. c' e7 o$ d/ S* J( a* w) o
  773.         mov     di,ax) R" c+ ?( U# }2 N
  774.         mov     ax,0b800h
    0 T8 j2 @' l! z# x
  775.         mov     es,ax1 n# W1 L7 a# @- Z
  776.         mov     ax,cs:[save_char]
    5 I  r8 l. w' Q  a- i! R
  777.         mov     es:[di],ax
    ! l' Z7 B$ @0 ~) f! g
  778.         pop     es# B' |9 [* _+ }# L
  779.         pop     di
    4 {2 U! x* Z7 f; m  Z8 i2 s
  780.         pop     bx5 v$ ?: M" B* V
  781.         pop     ax8 s  x4 l9 K  e
  782.         iret
    ; V) ^; U, B% G8 i& u

  783. 2 v* _# d& M' x% V7 m7 w' F0 V# @
  784. _set_pos:
    1 H- L& g# k6 O, [6 n! p) X
  785.         mov     cx,cs:[pos_x]
    : J4 T6 T0 l5 e: N9 {/ h. c
  786.         mov     dx,cs:[pos_y]
    ; i9 t' L' g, u. L6 {; z; X, b' Z0 m
  787.         mov     word ptr cs:[x_move],0
    % \8 S3 i  O: J# u8 `) ~/ m2 _
  788.         mov     word ptr cs:[y_move],00 y, {, o& V$ A2 S& q* ^
  789.         iret6 v2 W* h( R# V5 X5 U' _1 k& S4 Q: x) F

  790. , g0 u! A4 f3 ^
  791. _set_hor_pos:9 a" ?  F! L+ m- W  t; z2 T
  792.         call    max_min
    3 N  ?* ]1 m1 H' P, [8 n, `3 t
  793.         mov     cs:[x_min],cx
    0 @% W2 }" h/ E/ R
  794.         mov     cs:[x_max],dx. L4 ^! T2 U+ Z' {4 F/ v
  795.         cmp     cs:[pos_x],cx
    + m! t6 \# [6 x/ J+ W0 c6 U- g
  796.         jge     good_hor_min
    / H( I+ `* }2 Y$ l4 R/ s
  797.         mov     cs:[pos_x],cx
    : V: n3 e# T2 Q' S* `  U
  798. good_hor_min:
      t; T- V4 Q: ~
  799.         cmp     cs:[pos_x],dx
    1 m9 I% s" r; Q% r
  800.         jle     good_hor_max- K! a6 [3 Q$ u/ {  k$ c
  801.         mov     cs:[pos_x],dx
    / e8 d  i- ^! {% P3 B" G# T% g
  802. good_hor_max:
    6 G- v- a. n1 v7 p5 ?
  803.        iret
    6 X5 v* w3 x0 w  x. M

  804. . y. b. H) e+ B* Y/ x* h! f
  805. _set_ver_pos:. S$ t9 E% c# A6 r! a
  806.         call    max_min2 L- g) `  q8 M  ~" Z
  807.         mov     cs:[y_min],cx
    # j! R0 U! j/ G8 ]
  808.         mov     cs:[y_max],dx) {" q3 r8 r! ?# Z( f: {
  809.         cmp     cs:[pos_y],cx  g5 m7 i1 y9 F2 O
  810.         jge     good_ver_min
    6 w! h$ G- `# k8 W  o" {5 X
  811.         mov     cs:[pos_y],cx
    1 e# J) A3 U+ C: g9 S6 ^# x8 @
  812. good_ver_min:6 L, u9 [5 \# f6 a1 y* L( }
  813.         cmp     cs:[pos_y],dx9 c& x& }! D8 W- a# b
  814.         jle     good_ver_max7 ]; e4 t& D& }4 q
  815.         mov     cs:[pos_y],dx) G6 x+ F/ V  q6 Y8 v
  816. good_ver_max:
    ' f8 V( Z" N5 Y& a6 R9 H
  817.         iret
    $ N# _' {. p/ o/ A3 ~0 }" M5 A* `
  818. , _' F0 G; ^& {0 L- o) I  e5 ]
  819. max_min:
    ) @% O7 k9 v  h; Y0 C4 R8 J/ q
  820.         cmp     cx,dx) D1 a4 F. H5 G+ _9 z! M
  821.         jle     no_swap
    . E: J% D4 L* d% z/ M$ [  Q
  822.         xchg    cx,dx
    7 _5 d$ k: k3 L9 q
  823. no_swap:
    * \: k* @# ~. A. {3 I
  824.         ret
    ; ^- C7 K( [0 X5 o8 v
  825. ' I3 P4 D3 C, [& B( Y
  826. _set_subroutines:8 Q" T  {6 Q* p2 l; O3 w
  827.         mov     cs:[user_subroutine],dx3 f& [6 t( U1 F! O- @: R' V
  828.         mov     cs:[user_subroutine+2],es
    6 D9 l+ C9 g- y; o* \2 N
  829.         mov     cs:[user_mask],cx; \4 u; U4 w" ^; d
  830.         iret" w  w) D* I& A2 Z' H6 @8 ^

  831. + E+ z4 L( Y9 f$ D( w
  832. _swap_subroutines:7 I  z+ s4 K- k6 u
  833.         push    word ptr cs:[user_mask]0 @3 Q" P: a4 M' A0 a
  834.         push    word ptr cs:[user_subroutine+2]
    ( h& o" ]3 e2 G9 a+ E/ H
  835.         push    word ptr cs:[user_subroutine]4 @$ C( i: s- J& F) |
  836.         mov     cs:[user_subroutine],dx
    , ?, d/ G: P, V3 y) P0 x
  837.         mov     cs:[user_subroutine+2],es9 n/ ~- G$ h( {- ~
  838.         mov     cs:[user_mask],cx
    $ }( q# T, R8 R) t. X% y+ f
  839.         pop     dx) N3 O- {% v6 x4 |5 h
  840.         pop     es# r; d, X% {- @, |
  841.         pop     cx1 C' p  Q2 e- b6 E3 o
  842.         iret
    5 Y' x& e, ~6 k: |2 F3 Q

  843. # J/ b6 v* T# M: J" c% [$ e
  844. memmouse        endp
    4 \% H- |9 s( U5 K

  845. ! M+ h3 o1 X9 k- a4 h8 ?
  846. endof_start:2 m  c1 X$ \8 ~

  847. - j1 v8 `' D& p# A
  848. emsg db 'No mouse driver install error!$'9 Z0 L; H. H* c! }3 I! G6 z% \
  849. old331 dw 0
    3 T% R& N9 }0 P3 B
  850. old332 dw 0/ y/ P& s2 X! g4 Q: a2 K
  851. old741 dw 0
    - ^) B) o+ g' `) o* m& O
  852. old742 dw 0/ ]0 p; F$ X! n4 q. ?
  853. memcopy db 0
    % }" d) o- j8 u6 F% V0 P! h
  854. okcheck db 0- n1 X6 h& i* z8 N
  855. pass db 0
    - ?9 A  d* m( x' s
  856. chkl db 0
    & m) h. c7 u' q8 O; n. z
  857. lk db 0
    ; {( O& i) G) K0 U
  858. chkr db 0
    , q. J! D/ m6 @/ ~4 r1 x, D
  859. rk db 0! q. t: |/ n7 Y' _. D% |& }1 p0 v
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    $ x" d; c& @9 H& f
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '# [& ~( @/ E$ A0 Z
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '6 y2 U) V+ b, @5 h
  863. db '                                                                                ': _9 N$ T5 n" g+ t
  864. db '                                赏屯屯簧屯屯突                                  '3 T2 E( n  X' I0 M6 G( j, `' \
  865.         db      '                                ?OFF汉OFF?                                 '
      A" k6 C. Z2 t# N! u7 C
  866. db      '                                韧屯屯既屯屯图                                  '
    $ o4 l6 U% {5 r1 W: D
  867. db '                                                                                '+ p& D; ^! q9 \# o& i# E1 M+ d4 ~
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '/ B% F3 l1 {1 s. F7 e9 G! a
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' $ a+ J3 x7 j9 w
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    - f: J5 n# u9 a3 r3 M

  871. ! `5 b- s+ I% g3 i4 ]# x( `
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
- |. i1 {( f2 |  y' L, p3 b哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
+ a; ]7 g. S  O; j" G% H
% s$ [7 G$ |* n8 x" a8 f谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:50 , Processed in 0.050401 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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