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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。1 A% Z. @! o" w2 t1 O& n
7 o+ d9 u3 @4 s! `5 ~3 M
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ! A: E- o6 {# `/ H$ T0 B0 r
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9. Y. F, f9 t# T
  3. ;                                         By Bini.Yi 易祝兵
    % ]0 P/ D6 O  B  I  S3 r
  4. ;                                         http://www.ufoit.com 计匠网; U8 D% Q$ x+ z! J; G5 T7 W
  5. ;                                         2002/04/06 YYYY/MM/DD
    # `' m8 g6 {: I6 D
  6. ;
    . \) j2 M& C* P3 K
  7. ;         
    5 M  T) H* S8 F
  8. ;          This program  test the mouse button  click and move.
    1 {9 O1 ~; a) o
  9. ;% ~; F& a7 Y6 z/ b7 d  r

  10. . W' X4 @4 W7 ^" C0 X$ _% h) Q, o
  11. .model tiny& j& U' O1 K8 k- f
  12. .586
    3 M0 i6 l2 ?( O% A; n
  13. .code
      Y% d" l4 S8 W' p, e8 I
  14. .stack  100h
    ; t2 K" c( F- {) x1 o' q& r0 F
  15. .startup5 O* b/ Q, p3 G
  16. pusha0 P; [6 g- N8 ?$ V* l
  17. mov ax, 3533h
    / A$ W0 [- R3 [; s7 a) @$ \: O* f
  18. int 21h
    ' l& f1 E/ ?* S, K
  19. mov word ptr cs:[old331],es
    # t5 m- Y: I# V9 j; l% a
  20. mov word ptr cs:[old332],bx
    ; ]! U1 D/ |, m$ Z- P
  21. mov ax, 3574h
    # o0 `/ ~8 t( V4 x
  22. int 21h
    + |$ z, P- C7 w' p
  23. mov word ptr cs:[old741],es
    7 I4 W- P" _1 o8 i  o
  24. mov word ptr cs:[old742],bx, n8 }+ h5 B: ]
  25. popa
    , L0 t% o) M3 F1 r  _# x, _
  26.         call    memmouse
    % L% z/ p9 E0 ~4 b1 b1 r
  27.         mov ah, 00- M: X; X8 h! M& S0 h8 t. z
  28. mov al, 03
    8 l) _2 ^, i3 z4 v( q
  29. int 10h
    - B2 P0 I& m/ \! n+ Y7 v8 J. q9 ^
  30. mov ah, 06- i" O9 }4 o# o7 o/ J5 J6 ?
  31. mov al, 0) r5 [- S# {9 I0 F, z" q
  32. mov cx, 0
    # x- c+ ^, C* c2 Q+ p  `7 M" a. f
  33. mov dh, 24
    9 G( G$ {* Q+ c3 `) b) ]5 k+ o
  34. mov dl, 79
    ' k; L+ p- ]+ `9 X& _
  35. mov bh, 07h
    5 ~. Q/ \+ }) B+ P
  36. int 10h
    1 b2 |  P& N' A. x9 H8 @8 Y
  37. mov ax, 0000
    2 @# K3 _1 k% ^! x0 @1 _
  38. mov bx, 0002: }: W( ?( P0 t0 s$ q
  39. int 33h
    ! [8 W# F+ ?' C! k' j
  40.         cmp     ax, 0000           ;if no mouse drive install  A% N; K! B( D" T  t+ b
  41.         je      errormsg           ;show error MSG. L2 B4 U, n/ ^$ M2 `" ^' [1 B3 E
  42. mov ah, 02
    8 d: O8 ]( Y# U+ C4 [+ S, T$ Y7 {  e; s
  43. mov bh, 00
    1 k' L# e: C3 @: D" ?  t% E6 d. c2 P& X
  44.         mov     dh, 25             ;Move point out screen3 v" l* _: T1 S
  45. mov dl, 79. I  U3 e- B  b$ C& Q5 E
  46. int 10h
    - J, @- W8 m5 Y8 n
  47.         call    showmsg            ;Show info
    & I6 W  D- g6 G8 p- f
  48. mov ax, 00011 \( m' |% H0 w# U7 R' `" Z
  49. int 33h, U; C' K9 b1 h" p4 e3 X
  50. ; mov ax, 000ah8 H( e9 Y- _) m- |* K
  51. ; mov bx, 0000$ g) y* U( \# N' S
  52. ; mov cl, 0h
    # U* R, z+ s3 A: f0 G6 u. v$ K
  53. ; mov ch, 0F0h
    % Y: O; Q6 [8 f( y0 ?; A* L0 ?( y
  54. ; mov dl, 0h
    . P- \# f/ ?. ~! l% I
  55. ; mov dh, 0F0h+ X% b$ a5 _. ^) }) O, S
  56. ; int 33h
    0 ^9 n# Z! I2 @) g1 i
  57. mov ax, 0004h
    6 \9 l5 e3 j* v* f8 x7 Y  i
  58. mov cx, 0319
    . U. j1 @' A: Y. n
  59. mov dx, 0103
    - K& P6 L: ~5 C0 S
  60. int 33h2 v5 n9 u7 r4 m
  61. casemo:                           ;Case button click and point move $ c2 j/ y* c1 A4 i- \
  62.         mov     ax, 000bh         ;and keyboard press9 t# Z5 J: i+ X: ]
  63. int 33h. b+ t+ ?( h: v
  64.         cmp     cx, 00h           ;if point move....X# m, i8 y6 v6 O, P. E; P- Y
  65. jne xmov
    . V+ {$ ]& @) F$ X
  66.         cmp     dx, 00h           ;if point move....Y% j( u3 s+ L* M8 P) j' k9 e- ]' R) h
  67. jne ymov8 E: Y% P' `0 x# o+ e
  68. xymovend:                         ;X.Y move end6 L( l3 N# M) r
  69.         mov     ax, 0003         
    $ D# z7 {5 }' B
  70. int 33h
      v& U- F0 B3 X) ^* T
  71.         cmp     bx, 0001          ;if left button click  show ON8 _- ~& z: d8 o9 _9 A& L
  72. mov si, 1828
    1 P1 P. \* G6 ~2 _; g) Y
  73. je listl6 v2 c5 f& X; H  w( b- {
  74. mov si, 18281 ?0 I; P1 z  l6 {6 {8 y
  75.         jne     nlistl            ;if left no click show OFF( N% C3 Z, A+ F/ [
  76. testr:
    " |) z) U, q4 z. K6 H$ n& c
  77.         cmp     bx, 0002          ;if right button click show ON
    % C  I2 `1 y3 q0 [4 _
  78. mov si,1842
    5 M; o" t# @( ?! @3 ^
  79. je listr
    6 j3 I& ]& |. {# v. T
  80.         mov     si,1842           ;if right no click show OFF6 @  O. K+ R" i, p
  81. jne nlistl* D& N. e; j4 o, Q' O& A
  82. casekey:$ y- r1 z6 `. C3 O) s3 G
  83.         mov     ah, 01            ;if any key press jump check) ?" s# q& [: J* e, W% E# l9 O
  84. int 16h
    5 ]  t: I3 D! J+ v5 ~7 m2 H
  85. jne kpress" h! E. I& m9 i3 m) Z7 g" |
  86.         mov     al, [chkl]        ;check x flag
    4 f/ G. h* d! x- f9 j, [( G) B
  87. cmp al, 02h( K8 t' m2 \9 c6 `, _5 z: [# G
  88. jnb chkok) T3 Z! J! z/ s2 K# f. W
  89. jmp casemo
    & X4 }+ \4 K0 P8 P+ ?6 s
  90. xmov:                             ;if X moved, get the X flag+1& u7 [! E0 \- K7 v/ A1 x* n7 [
  91. mov al, [chkl]
    ; x- k1 [' v% d7 k1 }5 D& X0 B
  92. inc al% H# s7 [% ?9 A& F9 r' j1 g: C2 ~
  93. mov [chkl], al
    5 p; S5 k6 c* G" i, w2 f: U$ V
  94. call passok
    0 \+ \, N3 F( H+ w! s5 R
  95. jmp xymovend" X9 p3 w* }: q; ]; F
  96. ymov:                             ;if Y moved, get the X flag+18 j0 F! S, q: t# [1 E! y6 [+ }! X
  97. mov al, [chkr]+ L3 r; d& _$ P9 n: \
  98. inc al) q- l" n' ]' v0 N! P' x
  99. mov [chkr], al% w6 U- ]+ C* G4 ^  ~
  100. call passok3 k: J, i; v5 ?  T* P& W' d$ U
  101. jmp xymovend
    6 [# y( k& t6 R* W' O; P& p( G# ^

  102. 5 b$ c2 k- ~4 _+ Y( }; {
  103. passok proc near+ r2 `5 N5 r  S+ J- K
  104. mov al, [okcheck]
    7 v" X6 J- I- B! B
  105. cmp al, 1
    / W8 _8 f, ^) s
  106. je let05 h+ L! J3 q/ u$ f) h% a3 v8 _
  107. jmp passret5 ~5 f- p7 O0 u, r+ B# x8 Z
  108. let0:
    ) Z' A/ ?- B! G& D" \, F2 \6 y. E
  109. mov [pass], 1
    8 s2 e& Q' j; w+ C" |' W# F
  110. passret:  S) i* q& b# O4 a
  111. ret
    # O2 J% |% l* s
  112. passok endp + G2 T& |/ F/ E2 b( r
  113. / {5 Y* s( I. z; a3 e: ~: u7 ^1 M
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS* W6 \7 R/ s) l! U
  115. mov al, [chkr]; _2 u. g5 e* H4 g7 _
  116. cmp al, 02h& ]: u! I. {  l' Y; z* E
  117. jb casemo
    & U6 L2 N! u- J$ K4 l
  118. mov al, [lk]
    6 k2 p. F4 j! L% V
  119. cmp al, 1, C, w: N% [3 z+ v3 F& i) P
  120. jne casemo( @, s- y* N' X
  121. mov al, [rk]
    & n* v( F- f+ g0 D$ ~+ ?* q
  122. cmp al, 1
    6 f! ?$ G  b4 A
  123. jne  casemo8 `% ^" [; ?0 \" u- X* [1 _) n
  124. mov [okcheck], 1$ k4 g. E  m( Z5 t" a
  125. mov al, [pass]3 a: x  ^8 x  a
  126. cmp al, 18 F+ |! r& k5 P  q  Y: A; c% O
  127. jne  casemo
    & f/ W. V# `( W; l& y) D: F
  128. mov ax,0002h/ U- z$ M5 w$ y% y% B& M- m
  129. int 33h; P4 B' i) e& C" Q4 d
  130. call cleascr
      W: S. i5 o' P( S8 E4 O5 N* D
  131. ' n$ L& ^# J: z/ Y
  132. call oldint- ^0 ~2 l" v) H3 U# p
  133. mov ax, 04c00h
    / _" u& p# u4 T3 E( L
  134. int 21h& g3 H3 n) [: f9 Y5 J
  135. 9 x0 c2 A5 g1 V6 J( J, H
  136. okexit:
    0 x" m; S) `. t2 l. }
  137. mov ah, 4ch- r/ {/ h% {! h
  138. mov al, 0; W+ P4 L4 k1 x3 l: U
  139. int 21h% y" b. z0 B2 x* I$ {) i/ p/ ?/ o
  140. listl:                                 ;Show ON9 F2 J- r+ `  S' G9 {
  141. pusha$ R* v; M2 Z7 [/ _
  142. mov ax, 0b800h
    ' x4 {9 Z1 g  @% m) q# s
  143. mov  es, ax6 d; y4 M6 K4 b% o2 ^
  144. mov ah, 47h" u8 U8 f+ T; o/ w. n
  145. mov al, 20h  U1 S0 @( H* K( o, X; E
  146. mov es:[si], ax
    % ]5 c2 `% @" h
  147. add si, 02) z# W0 p4 t! J$ _  }! ~1 ?, ^
  148. mov  al, 4fh5 m9 h$ u! O  s0 [; q/ }
  149. mov es:[si], ax
      ^7 d) X2 N. \& [  O: M' O4 ?) b
  150. mov al, 4eh. Y7 m4 e7 v" \+ T& x0 _+ Q) q4 X
  151. add si, 02% v+ ^, q5 H5 _7 z' {
  152. mov es:[si], ax0 v4 ~" Y( r# k# e! o$ S5 D
  153. mov [lk], 1
    , ]/ k" s3 f7 E& m0 t& l
  154. popa
    + i) r! N) ^$ w8 m" o5 W
  155. jmp testr- ^" b2 l  d, a) I: U/ x# S
  156. listr:                                 ;Show ON
    6 y1 K) q/ ^* u( b% E9 r
  157. pusha2 O) w$ w8 s+ _
  158. mov ax, 0b800h
    # f5 E7 l9 g' C) F; ?0 Y
  159. mov  es, ax
    0 `7 c$ ?, |6 E! |2 Y) |& b" _( j
  160. mov ah, 47h( W% p, ~: b' a3 j
  161. mov al, 20h
    7 L. z7 E2 M% q& Y; a( r0 \
  162. mov es:[si], ax
    0 m! r+ M! y1 o- z
  163. add si, 02  f% o7 w1 \# W* i8 z) V
  164. mov  al, 4fh
    6 @- [% G8 ]% ~8 d2 k* w
  165. mov es:[si], ax7 {2 h" [8 N' t8 C
  166. mov al, 4eh
    $ M$ p% O2 V4 Z2 k/ y
  167. add si, 02% L/ D! e- Z3 g4 L7 I  e7 ~
  168. mov es:[si], ax
    7 O5 W! x- a& r# d5 `
  169. mov [rk], 1" M! N3 X" {; `  o4 g8 h
  170. popa; E# @. A5 U/ ]" J7 m
  171. jmp  casekey
    * i! ?! }% _1 L& ~/ \
  172. 0 R! l) I( }; ]* f" w& q: L4 n
  173. nlistl:                              ;Show OFF
    % J$ x3 `* n' A$ D  w& D, A" L
  174. pusha   
    1 c1 [4 G  W* a- w
  175. mov ax, 0b800h  V3 j2 a" ~8 |7 y: y$ L3 \
  176. mov  es, ax
    1 N5 X  h% i, z8 w4 R1 I4 Z
  177. mov ah, 17h
    1 I% V+ c" c. v2 p+ e. T( ]
  178. mov al, 4fh0 z$ ]: h# Z' K, }7 Q9 ~
  179. mov es:[si], ax3 k: W: T4 a: W
  180. add si, 020 n" [; e1 C0 H/ [! P; O
  181. mov  al, 46h8 r$ ?( w" K2 _- S# o; S+ d
  182. mov es:[si], ax) p/ P& _* i* B* k4 K1 g1 R! x
  183. mov al, 46h
    3 b( O9 O' D, G, G4 f; \2 w- v
  184. add si, 023 u' i+ v8 N- T' g
  185. mov es:[si], ax
    & C7 e/ N0 ~) v! L1 v9 D* m
  186. popa2 I  c0 ^/ \5 L% i* X1 ^% T2 q
  187. cmp si, 1840& w- R& F5 x0 M; d  n
  188. jae casekey
    ; f& M8 f: ?1 _8 C; z" F1 T4 G
  189. jmp testr
    * K- q8 l6 N% z9 l0 ^
  190. $ F6 r% J2 W5 I
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    * [  a2 M3 y$ X
  192.         cmp     ah, 01h             ;and return a error
    / @6 A' q6 i5 q
  193. je exit14 o3 P6 m" ~" I$ x
  194.         mov     ah, 0ch             ;if press other key then clear
    $ P5 M* B9 o# o  x- J! Q# ^
  195.         mov     al, 00              ;keyboard buffer1 A4 u  u4 c+ G5 @+ r
  196. int 21h
    5 I3 a7 v- L/ J: s
  197. jmp casemo
    # y1 c/ p6 ~: d/ V, x9 c

  198. 4 b9 f" x8 C% g; a4 V6 F$ l' @
  199. errormsg:                           ;if mouse driver no install9 B0 |7 S7 u. X- Z7 J' w. e
  200. call oldint+ U9 A3 A+ P* K3 R# _' l' B
  201. lea dx, offset emsg
    0 y8 V) J( i/ T- T  L* C6 J
  202. mov ah, 09h. n$ t& b( X9 F# H5 Q! b
  203. int 21h8 t. C$ H5 f/ u  b' c
  204. mov ah, 4ch
    , B. S3 T, u" F) l1 h/ Y2 J
  205. mov al, 2" U& o4 s2 j# J* v4 r* L
  206. int  21h
    1 M$ f/ U( n3 C5 y

  207. 3 I5 n9 ]! ]  q# C
  208. exit1:                              ;error exit
    2 Y4 _- N& b1 x" `
  209. mov ax, 0002h% \; ?( Q$ W# c5 a3 Q
  210. int 33h
    ! ^' _" C" ^& Y( P: ~# a8 ~. q' C
  211. call  cleascr
    2 c$ S) ^8 f1 A( B- O, F1 c+ @1 ^
  212. call  oldint% \/ y  l. ?% F
  213. mov ah, 4ch. C6 ^3 T5 N, T! c. O
  214. mov al, 01
    . G4 Q6 ]# k8 J" j; y7 F
  215. int 21h
    : e% K. k8 N" {. b

  216.   [7 B" p, v9 `! ^
  217. cleascr proc    near                ;clear screen. E( q* y, V7 \# r0 J
  218. pusha
    - k  f1 H  k+ I: p9 i/ q( N9 t
  219. mov ah, 06
    + M9 ?& y& a( w( `1 [
  220. mov al, 0
    3 y2 P/ |1 A5 q1 o0 ]9 B
  221. mov cx, 0
      h) e% C* e% e% `5 s! ^& n- n
  222. mov dh, 24. L: [0 P4 J8 [
  223. mov dl, 793 n8 r" ?  r$ g, e+ z& k1 o
  224. mov bh, 07h
    & ]% ~2 F7 c. O- Y
  225. int 10h
    $ ^4 c, V  a; C0 G/ u% I
  226. mov ah, 021 F4 b1 W; U0 `. C
  227. mov bh, 00
    / Q6 D/ {  k9 a6 W' b  {
  228. mov dh, 05 `5 b2 J  F: a- w
  229. mov dl, 00 _6 a5 i! ~$ d. _
  230. int 10h& v7 G# w; B- ]" L$ t/ u
  231. popa
    + J, e5 {7 m/ X6 Z0 G9 M
  232. ret
    ; C5 P5 u6 a1 }0 U- d
  233. cleascr endp. z, K! r" y0 q& H0 |! {: D

  234. 6 E( A# J- ?, j$ |( m4 E2 D. V
  235. showmsg proc    near               ;Show info
    2 }$ T* T) s, g5 H# q+ o
  236. pusha
    3 Y, |. ]& Z( S5 N1 @
  237. lea di, offset showms
    * O; C* c4 K; L" C6 K0 U7 o
  238. mov ax, 0b800h" ?. u: P& ~* ]9 d$ K6 `, K
  239. mov es, ax
    % L3 Y9 M! L( }. n/ v; }: D
  240. mov si, 0
    7 E; ~: i; ~. B7 y, ?
  241. mov cx, 480+ @1 a" q6 B4 n* @5 T7 s' [
  242. mov ah, 07h/ x( L5 @0 }% |9 p* b3 ^0 Q$ I
  243. @@:' p/ _" c8 j3 z: b0 [
  244. mov al, 20h
    ' c* E4 `1 p0 S4 x  g5 ?. \9 J% ]4 D
  245. mov es:[si], ax
    3 K, w* B; q& @# {2 f$ `2 _
  246. add si, 2% S7 u& W% y* S* K( L  W2 E
  247. loop @b3 c, u, S& \+ g! N  h& Q6 O# w
  248. mov cx,8806 g6 k. ]0 O  z3 e- z+ H
  249. @@:2 M/ e0 C9 }, {  L
  250. mov al, [di]6 D9 j2 R" W& j' v9 G; ^& ?
  251. inc di2 v6 y6 U9 g! C% S7 t/ @0 {
  252. cmp al,20h
    / h5 l; G1 u' p4 K
  253. je showch1" u: Y0 [  f3 S& u  a
  254. mov ah, 17h
    4 i) b! B  L8 ~# S0 @0 C" \  ^
  255. jmp showch3
    & B4 O9 o1 y3 h
  256. showch1:8 |6 {: {' H5 N
  257. mov ah, 07h
    4 Q4 `4 F. _2 I: `- @/ v! G
  258. showch3:2 V$ b1 Y% D& S
  259. mov es:[si], ax6 Q/ `5 d- s; t3 @; l8 p! W
  260. add si, 2( J+ \' L3 u% f; c
  261. loop @b$ ^. B, \; w' o
  262. popa2 K8 A' Q' O7 \2 n' J  R) a# s) T
  263. ret6 n6 l- G# P9 B! r9 i
  264. showmsg endp
    * Q) q" ~) Y- N# L4 n

  265. ( k4 }3 v$ p. I6 v0 Y; X: \. y
  266. oldint proc- _5 \" n* u. _1 Z) Z# F* M
  267. pusha7 j# ]) L9 \  V. e
  268. mov ds, word ptr cs:[old331]& W! ~) x7 w5 Q! C0 w/ T5 h
  269. mov   dx, word ptr cs:[old332]
    # b; L% X$ |  Z0 N
  270. mov ax, 2533h
    ' R6 V  f" q; O  _1 `
  271. int 21h
    + n2 Z; N8 c8 p: E0 F' i8 |8 Q
  272. mov ds, word ptr cs:[old741]
    3 d: d/ |/ E( r0 E6 K* H$ v
  273. mov dx, word ptr cs:[old742]
    0 @7 ~2 }% F& v. W
  274. mov ax, 2574h+ Y( M' q. J& `8 w0 G; w" b% `
  275. int 21h
    0 F" H: \* u- p2 D0 H
  276. popa/ V7 E0 V- }9 e
  277. ret( a5 o4 ^  r5 k0 m% m* S4 p. l2 |: |
  278. oldint endp
    & W1 `' e) g& ]

  279. 0 A8 U+ U& {. \( x# i
  280. memmouse        proc
    " S) W" [- p8 B+ f
  281.         xor     ax,ax6 c/ d& d5 @. s5 w5 I/ J
  282. int 33h
    . W/ a5 x( _  B' G9 w
  283. cmp ax,0ffffh
    . V; e: M1 c- ^. r1 Q
  284.         jne     not_loaded8 ^  X" U' D# J$ @- l
  285. mov [memcopy], 1
    4 Z- W0 E8 }( _% Q) F4 s# b
  286. ret& w# b( x/ C7 O6 d! Y) P& N! I# [

  287.   z3 y' r+ U# k# S
  288. not_loaded:
    * S: w$ [9 {3 o' y" a. E: B
  289. 0 i: h4 b5 \8 @% Z' M
  290.         mov ax,2574h/ ?! W8 J* R; c9 g+ q. W
  291.         mov dx,offset new_isr- ]0 x" P* r0 f% k% P8 |/ g2 m
  292.         int 21h
    ( ~" k' F( N  D% N. R

  293. ; ?7 u5 W/ \& i, Y
  294.         mov ax,2533h% S1 r( f7 R# h$ j
  295.         mov dx,offset new_335 s) U, F6 U$ A$ A' N
  296.         int 21h
    - A& G/ O% }9 q6 i. ?+ k; m$ b) N
  297. + h& ^! c9 A: x
  298.         cli8 c# B7 _, O8 A0 T

  299. + {7 V, g, w& E
  300.         mov bl,0a8h% G  e$ i; a3 }( E! _8 W; Q
  301.         call keyboard_cmd
    9 V8 g( {% q  N4 P* m# @5 a1 Y

  302. 4 Z& l; A8 k+ v" `
  303.         mov bl,20h+ s, c$ T7 X5 H
  304.         call    keyboard_cmd, K% F+ `. Y, H8 u: x
  305.         call    keyboard_read
    $ P' Z& N' A6 m: [/ @
  306.         or      al,2& w3 ]! i) w% v
  307.         mov     bl,60h
    : p& M$ }4 ^+ `1 i
  308.         push    ax
    * H. G8 u/ e- F9 l# G
  309.         call    keyboard_cmd
      J- |1 c$ {# b* z5 |
  310.         pop     ax, D! M: R$ g) B# D% t$ x( E6 G
  311.         call    keyboard_write0 `4 S$ _+ U& X4 ^- \+ R+ }7 R

  312. 3 G" b6 r- F. }% P: @; O
  313.         mov     bl,0d4h# J: r' t$ v7 U! T0 B
  314.         call    keyboard_cmd
    + q. B% `: t6 B! Y  t6 a' a6 n, g
  315.         mov     al,0f4h1 g' l5 u% ?% u0 V! U" K5 w
  316.         call    keyboard_write  A9 E4 v: E: \

  317. 8 B6 s& v5 G6 I# q- @' i. o
  318.         sti
    0 K& j0 m# {6 H8 {! N6 ~
  319.         ret
    7 ^) J9 k3 ^4 p& v  C  m$ d
  320. call_user_isr:8 \4 @. v9 r* N0 ]9 G: q' U
  321. db      60h
    $ w3 n6 J) ~8 |2 r3 p% l1 P
  322.         mov     cx,cs:[pos_x]5 W( w2 [- \& s6 z  T* W+ }9 ?
  323.         mov     dx,cs:[pos_y]& B2 t. S/ Y: W# M+ J8 r
  324.         mov     di,0 ;cs:[x_move]& \2 o) a. m' A# t3 r
  325.         mov     si,0 ;cs:[y_move]$ n3 ~; x$ Q5 n' O9 n, y
  326.         mov     word ptr cs:[x_move],0
    5 O! w1 \9 G! [: d" ~
  327.         mov     word ptr cs:[y_move],0# w0 b4 B* Y6 V
  328.         mov     bl,byte ptr cs:[buttons]
    * @) F: I/ m" Q- m0 T1 z' s" M
  329.         xor     bh,bh
    , Y5 c7 E- s( Y: J5 Z. j! F
  330.         call    dword ptr cs:[user_subroutine]
      B+ P  S/ j% Q5 B, o2 I3 k
  331.         db      61h- n/ Z9 h, T* Z2 ?9 N
  332. ret
    4 _- S9 V/ [: G# H/ m0 E
  333. new_isr:( R7 V- d9 _7 n& Q" N( @
  334.         pushf" E; ?$ a9 }( [( z8 w
  335.         cli
    # J. Z. i8 \' Y5 [% e
  336.         push    ax3 O9 B  ~" g& y* \! [; U+ Z
  337.         push    bx! g5 Q, L' G/ r8 ]6 Q( [& f
  338.         push    cx+ {/ y0 e6 t) s1 R" W8 ?
  339.         push    dx
    / e2 A3 N. t7 u8 Z6 y" W0 y
  340.         push    di4 d. z, v/ G- e: @
  341.         push    si5 G6 a3 E: q9 |
  342.         push    es
    , C6 k3 [% J1 D9 P5 _
  343.         push    ds8 E: U6 m+ M  E0 U

  344. $ ~. G/ _, D' ^/ b: ^- D5 E  s
  345.         push    cs
    / f/ ~0 q) S0 z0 L, j
  346.         pop     ds8 V+ E' P7 A- @1 p% U% T- \. t2 m

  347. + ?( t6 [" T9 l& g8 t) r8 x
  348.         mov     bl,0adh
    % }$ \- K! u* ^7 d- w5 c7 p
  349.         call    keyboard_cmd
    4 I( d( P* `; d% b
  350. 0 @) p3 K6 I; U6 n9 O! t3 ?2 X( h
  351.         cmp     byte ptr [first_time],0
    % N' |% o6 ?) t+ L7 B6 c0 }9 q
  352.         je      not_first_time/ t$ i" _/ z) w$ ]2 f

  353. - P7 P" g6 V8 Y8 D8 d: f% C. A
  354.         mov     byte ptr [first_time],0
    / I: s# X3 l4 w: e" F2 M4 |# a
  355.         call    keyboard_read" \0 Y" @" A; Y& ^7 U
  356.         call    keyboard_read
    ; L% f, s0 p+ R. f3 Q5 x" Q* K
  357.         call    keyboard_read9 n, l1 d/ U: l8 W. h) t( v1 Y. v
  358.         jmp     no_show
    5 C, ?8 j! b# D" t; }% }$ l( E, o

  359. ) i1 p) @0 e9 B+ f
  360. not_first_time:
    6 z  P3 Z! n5 g
  361.         mov     word ptr [temp_mask],0. |* g  b2 M, x1 i$ n% c8 s- W

  362. ! H5 X- T) T0 B) E
  363.         mov     cx,[pos_x]
    * |" H& P5 N% S) u% l# ^, h
  364.         mov     dx,[pos_y]
    $ U+ ~7 f; c% h7 A

  365. ( _" ~2 s. h5 t9 ^* o
  366.         call    keyboard_read4 c& t$ T8 ]5 a6 ^/ T' g
  367.         and     al,7 ;39 U; M1 E/ g$ `  Q# n; }, e( ^, O
  368.         mov     ah,[buttons]
    / c* X& |7 R! D
  369.         mov     [buttons],al. ]. W! T7 ^! P( W
  370.         cmp     al,ah+ U# r! _4 c& E
  371.         je      no_button_change# U6 `& o5 M$ F% A; t4 R
  372.         and     al,3
    + Q- a7 i* @4 v, t, X
  373.         and     ah,3- U# [3 L: G# A, s2 k" T
  374.         xor     al,ah; U& p6 [$ U$ e# ^; s7 x
  375.         xor     bx,bx
    5 ?/ r- ?$ {& V  B& s  o
  376. + ]6 Z$ X$ `6 e% j) s, p! C# u
  377.         push    ax/ d+ i  t/ y( [; W2 J, ]2 R
  378.         test    al,2/ D- k2 i% Z' @0 E3 S+ f* k- v$ e
  379.         jz      no_right_button_change
    1 c  i; g* ?# Y2 H9 _2 e
  380.         and     ah,2, c( L1 ?1 Y; z( X8 s$ F% d: r
  381.         jz      right_button_pressed& W: p6 ]7 K( q7 E2 W* x
  382.         or      bx,16; s% c1 o! ?# p1 c) X
  383.         jmp     no_right_button_change
    ) ?, c7 r% g) \2 o4 C! ]+ R
  384. right_button_pressed:2 u4 J5 G; G! K- u& C- p; q3 r
  385.         or      bx,8
    0 f' ^; t; q4 E: ~( M! c1 S* t
  386. no_right_button_change:4 ^9 n9 l1 }$ a# M# {8 u9 V

  387. 9 C: l1 f/ G. M: p" P
  388.         pop     ax" T6 T- M+ W) \7 s6 |& z

  389. # `; b0 m* c8 U1 E
  390.         test    al,17 h! J: N: O! _* x6 O
  391.         jz      no_left_button_change
    9 w( l' O1 K/ ]) K$ G* r2 m! W
  392.         and     ah,1
    7 c, n; j# H- V/ E3 x
  393.         jz      left_button_pressed
    8 u6 E. o1 l+ p$ r, V/ v- J
  394.         or      bx,42 m3 c; }! ]+ P9 _$ U' [
  395.         jmp     no_left_button_change
    & X9 |5 c. ]( x5 x6 S# g
  396. left_button_pressed:
    ( f. Y. [5 e  S3 ~
  397.         or      bx,25 f7 {* c4 F, `1 U
  398. no_left_button_change:
    / ~; j* S, K/ O- S
  399. - |4 g: V: `( J' G( o
  400.         mov     [temp_mask],bx: E( _# P5 z% d1 N

  401.   n, t9 N: m7 F0 d2 E7 l9 h9 v
  402. no_button_change:  w* }! |" P2 y" m, s* U( @. Y
  403.         call    keyboard_read
    6 \. u1 r' g# p" s3 h
  404.         cbw7 T# k7 I8 S: z% B# w
  405.         add     [pos_x],ax
    9 X* p2 a- V" x: X- d: |
  406.         add     [x_move],ax
    , c' O5 e% ~& z9 X; R  C( I9 @
  407.         mov     ax,[x_min]
    ! O( Z9 C9 k( Z1 a) w
  408.         cmp     [pos_x],ax, X  e/ l5 l! m) P# y7 u5 `
  409.         jg      good_hor1
    . R" E6 E1 u9 W2 K# N5 W
  410.         mov     [pos_x],ax2 M* W; @" ~( Z" W) w  J
  411. good_hor1:# k$ q  _9 Q8 j6 L- B' E- r" |
  412.         mov     ax,[x_max]
    - G* y9 O" q) W( J1 R: s' P4 B
  413.         cmp     [pos_x],ax0 q" Y: T5 r* b& `( a0 ^- W2 a
  414.         jle     good_hor2
    : q' ^: c9 g; C) @
  415.         mov     [pos_x],ax
    , z+ A  u# x5 ~8 H3 a( U0 A; [
  416. good_hor2:; n1 ~/ X+ X2 L8 l# ?# S5 s/ _" _
  417. ' i' S" h" A4 z; ]! o, J2 m
  418.         call    keyboard_read
    6 {/ L( }$ b$ \& h9 }7 ^% x; q
  419.         neg     al
    * p. y) m# C% X- S! h8 e
  420.         cbw" \- b0 ~) n: e9 Z0 v2 Q) H
  421.         add     [pos_y],ax
    , u7 P) r6 m* p  o/ k
  422.         add     [y_move],ax
    5 r: n* `9 w7 y0 y) R* ~
  423.         mov     ax,[y_min]
    $ O/ Q: y3 S- \( x" m8 \: m/ D' @
  424.         cmp     [pos_y],ax
    " s, ?7 h( a8 \" p
  425.         jg      good_ver1
    & y: E3 L% |+ K, ?/ k$ X
  426.         mov     [pos_y],ax" m7 c" z1 W9 q8 W' {+ _0 |
  427. good_ver1:; ]- s1 e( m! c0 b' k" i
  428.         mov     ax,[y_max]
    # l4 i2 |9 ]( t' s$ P% N
  429.         cmp     [pos_y],ax
    7 o: J/ K) g; }( L3 i# ]
  430.         jle     good_ver2
    - ~+ T/ b1 c# X/ S6 `
  431.         mov     [pos_y],ax& t' W: `) P2 |
  432. good_ver2:/ e3 s0 [' v$ u0 {$ |# c) l

  433. 6 L" l  D) c' i1 }6 O
  434.         mov     ax,[x_move]" |! h' B9 `8 f3 N# L) y  W) W
  435.         or      ax,[y_move]2 `* F' Y; R0 j: M7 u- K
  436.         or      ax,ax
    2 {1 G3 \. R- k5 Z4 w
  437.         jz      no_change_position
    + n& _  p6 a# X5 t7 f
  438.         or      word ptr [temp_mask],1
    ; m9 T" m1 `) \3 C& U% e, g
  439. no_change_position:0 {% J4 N# w- L' `  Z1 P( ^  N$ I

  440. - {% u3 S/ j: o* s0 |
  441.         mov     ax,[temp_mask]
    . T7 ^" M7 w7 F" {2 E2 S! W
  442.         and     ax,[user_mask]
      h: S$ J5 L, M2 b0 r  _
  443.         jz      no_call_user
    ) r$ H+ [% g" {0 q- y
  444.         call    call_user_isr
    0 B8 h1 D5 T+ h4 v% }
  445. no_call_user:# E9 @' {) T# c! j
  446. % L/ H( s" v/ Y' Q5 ]8 B. T
  447.         cmp     byte ptr [sm_flag],1
    7 u, V2 l& h# m+ T% J
  448.         jne     no_show* g& l# x4 ~8 k5 Y2 U; N
  449. 1 B( X# y5 V7 [3 N1 T! k' D
  450.         shr     cx,3( H  K# ^& Z: e3 s$ P; P/ ^
  451.         shr     dx,3+ [+ m' x, ^" i) c4 M5 X
  452.         mov     ax,80
    ' i$ h3 g( h, L2 o% j+ A( {3 v4 z1 P1 [
  453.         mul     dl0 p6 Y# {6 U4 n2 B3 Y6 V
  454.         add     ax,cx1 m" I$ W8 ]+ o1 j3 M- ?" \) I
  455.         shl     ax,1
    ; b6 W) o) H: k6 {+ V$ H
  456.         mov     di,ax. `/ |5 x5 ]7 b  w- i- b/ @
  457.         mov     ax,0b800h
    ' [* [& w+ h! L2 e! Y% G4 O
  458.         mov     es,ax
    9 V5 p' B( e4 |) a
  459.         mov     ax,[save_char]
    0 Z& @1 W) q" d  y
  460.         stosw
    . Q# U" U6 f. z, z- q% G' C" M; R( S

  461. * `  M: V: E; i8 o, o- M$ \' Z
  462.         mov     cx,[pos_x]: M9 a' J: s, m% D% f2 }5 E
  463.         mov     dx,[pos_y]. c/ ?# o) j: o3 d. v$ Y9 `
  464.         shr     cx,3
    - h! O! J& P( w- E* `2 a3 m
  465.         shr     dx,36 x+ n/ O! Z4 H% f! ^' `
  466.         mov     ax,80
    % d/ T! e- K+ Q
  467.         mul     dl
    4 k1 v6 G  c+ ?' h
  468.         add     ax,cx
    " N8 `9 b1 y8 }* c) H1 O! n, @6 {
  469.         shl     ax,1
    1 t( `3 w3 ~5 M1 y4 G& q( S) U
  470.         mov     di,ax' ~/ Q" |% h$ L/ d! g/ @. T9 U' y
  471.         mov     ax,0b800h9 M: m0 J. U) Z* B' y% q
  472.         mov     es,ax, R$ j/ k# I% ?& k
  473.         mov     ax,es:[di]
    + }, M. U+ e3 w0 A0 A- ^3 O: z
  474.         mov     [save_char],ax: Z; k5 E. g8 {/ U, m
  475.         not     ah( M  |+ W  W/ M
  476.         and     ah,7fh9 E9 B8 c, A1 e3 g, }
  477.         stosw: g& Z4 x' n* L2 y
  478. no_show:
    9 a" E" O" C( F* |
  479.         mov     bl,0aeh+ E; Y' g8 q0 q1 n
  480.         call    keyboard_cmd8 V7 [& Y7 z& M6 a' I+ L- E" E
  481. 1 ?# {9 d& n' c5 R# r' _
  482.         mov     al,20h( L& o6 H6 h$ h5 w- r' @6 k
  483.         out     0a0h,al
    0 t" A/ k; m: P. Z. X/ \
  484.         out     20h,al; N, a( t% w- W3 x% R
  485. * K: \3 C* Q6 T. p: B; n. J- w+ j
  486.         pop     ds
    ! s/ B$ W9 l5 [: ?" l) ]
  487.         pop     es
    " m0 A& [! ~2 @3 p% ^" H" J3 b" i
  488.         pop     si9 x" N- Y/ V; `* ]
  489.         pop     di( \9 ^' z1 X/ {3 P: {% J2 b6 N
  490.         pop     dx" @! Z0 A% S# o0 K) \( c  V0 F
  491.         pop     cx7 s: Q6 g$ v* c) q( r6 o/ J2 a; D
  492.         pop     bx8 A- M/ f6 a+ R( {9 p
  493.         pop     ax
    / \% L, f3 B1 ~4 y; b
  494.         popf
    8 [7 V" F5 E6 I4 U2 n9 h* i6 I
  495.         iret# a% L5 ]  m5 }$ y# P. ~0 O- h
  496. 8 ~: c9 x- r! b
  497. first_time      db      1
    1 g1 w# q3 o* h7 @$ }
  498. buttons         db      0
    2 }1 d) m$ r: D1 s
  499. pos_x           dw      0
    4 d4 J2 l! [; G8 T
  500. pos_y           dw      0
    " |* q2 y2 L) s
  501. sm_flag         dw      0) T0 w5 X+ u% ]! T/ ?
  502. save_char       dw      05 i2 X2 G& e7 ^' \$ l* u
  503. x_move          dw      0
    8 r& N6 x6 Z3 @: p* S( f6 |
  504. y_move          dw      0
    " T1 w: r, O( Q) f6 J# `. q7 \
  505. x_max           dw      639. W$ J; z$ k& r
  506. x_min           dw      0
    + q- \5 @% Y7 |. h6 x' l5 Q
  507. y_max           dw      1991 Q( [& D" ]8 x# v6 v
  508. y_min           dw      0. `" h9 ?% [8 \" ]- b; A. N
  509. user_subroutine dw      0,0% x1 w9 t7 {9 Y  a
  510. user_mask       dw      0
    ) ^" ]- x( A+ o3 O# }' s. l
  511. temp_mask       dw      0
      H4 l. h, W$ `
  512. , Y+ A4 X* X' J$ Y# `+ x" \
  513. keyboard_read:
    & g& {6 G( o1 Y' g
  514.         push    cx; B* z( T7 \  `0 }
  515.         push    dx4 K. e- F% x- ]5 `% _5 s  ]
  516.         xor     cx,cx
    9 {/ _* e, d3 j4 g" M, d
  517. key_read_loop:
    ; T) Y$ I! }- y, X1 Y9 L  P
  518.         in      al,64h$ t. C2 U) C2 e0 H0 a* y/ M! P
  519.         jmp     $+2
    2 w4 D" p$ d$ M) h7 D: U) W
  520.         jmp     $+2
    5 F% M; A0 {, ~/ Z9 k9 h
  521.         test    al,1
    6 W( @$ X+ N  S) H
  522.         jnz     key_read_ready, c/ A9 q2 _; {
  523.         loop    key_read_loop
    7 z0 d: x$ f4 C8 D0 d
  524.         mov     ah,1
    1 o  W8 S# ~+ h/ F
  525.         jmp     key_read_exit3 R+ X5 y; [* Q* ]4 b( x: c* `
  526. key_read_ready:/ o8 Y$ {0 H  v5 o
  527.         push    cx2 |6 Y  x$ @( x4 k. N) U& {2 C" X8 I
  528.         mov     cx,32
    , Y7 D3 i; u2 ^' f( p7 J( J6 r
  529. key_read_delay:  B  X6 ~; T7 K' S
  530.         jmp     $+2$ g9 _5 ]  B! `* G5 o  T; x' ?
  531.         jmp     $+2
    " j" |7 C) c# L! W* S
  532.         loop    key_read_delay
    # u. w& K* A7 A4 W0 I

  533. 3 B/ g0 K6 B# ?
  534.         pop     cx1 t! l$ l  k( L% m# s& y" @
  535. ; ~: m9 H' X( J9 {2 k
  536.         in      al,60h" Q5 ~5 V; h5 Q: q+ f, j  J8 H4 S' K' S
  537.         jmp     $+2
    & Z& ]* T7 R$ m% J
  538.         jmp     $+2
    ; `* z6 _/ }8 d/ c7 V3 W! x) D
  539.         xor     ah,ah9 E& q$ ~4 y' U4 ~
  540. key_read_exit:. R" n* O: f8 i. n/ ^
  541.         pop     dx
    2 ]6 b7 o& [% a! S$ G: H: Q
  542.         pop     cx; q' e" `# i# }9 M' U  M2 {- n
  543.         ret# o( H+ X/ Q) r6 m* g4 A4 n
  544. 5 z$ O* I& n) R* K$ |
  545. keyboard_write:4 C2 Y' r3 p0 A, e% p+ R# {) h
  546.         push    cx5 O& @. j, W5 P! D& J; U: S) H
  547.         push    dx% n+ ~' ~+ w$ ?/ g+ n4 ?! P5 \
  548.         mov     dl,al8 l$ w. G8 T- J+ u' r; {! Y* ?
  549.         xor     cx,cx
    - `7 K0 r5 d3 _+ p6 {
  550. kbd_wrt_loop1:: F& B* E; R, B# s. ~
  551.         in      al,64h: u6 t$ I- Y) U6 s( t9 G6 ?
  552.         jmp     $+2
    7 W: `7 I- ]" X# V" r# H; @  i; o
  553.         jmp     $+2
    % t" S' |" i6 E$ |# H; v, R. S
  554.         test    al,20h
    6 x3 T  l. |/ |; j
  555.         jz      kbd_wrt_ok1
    1 X/ O! Q* l# k5 K

  556. * B6 t" M  j; s
  557.         loop    kbd_wrt_loop1( f" C( j% k* j7 p1 u0 g! N, ^) I

  558. " d: ~  F  ~9 x5 n! C4 F
  559.         mov     ah,17 t; \9 o& d# s+ _- U6 g2 {
  560.         jmp     kbd_wrt_exit( u' k# d* {' ?$ s4 J6 i$ V( J

  561. & D& I: v/ k2 P( S& H4 F" b
  562. kbd_wrt_ok1:
    & G) x/ |! i7 s, e% \  c' v* y4 Q
  563.         in      al,60h
    , i" U  c, H# D2 O

  564. # R3 m- {& `: v7 q/ I$ h. K+ z
  565.         xor     cx,cx
    + I6 }3 c! l3 h* h8 |7 w* ?
  566. kbd_wrt_loop:
    0 A3 Z1 p4 q. b: U
  567.         in      al,64h' O6 a3 A0 I/ A/ A: _, |" L3 \. P3 S
  568.         jmp     $+22 B' I1 ~  u4 g; `2 I( _
  569.         jmp     $+2) z% a9 \# D& O
  570.         test    al,2
    : m/ n- C0 a, i4 ]
  571.         jz      kbd_wrt_ok# N" a+ |/ A7 C& S
  572. . M8 }6 _9 c  v2 I
  573.         loop    kbd_wrt_loop* [' k- F/ Q: _% L2 o; S" W" H
  574. 1 v; k5 D) q- d# {
  575.         mov     ah,1
    7 r- p) E. {% ?4 ?! l" F- _
  576.         jmp     kbd_wrt_exit' t: h& j% i2 V0 I$ A" R
  577. % E$ S% {- V6 Y; g5 M4 }
  578. kbd_wrt_ok:
    # t1 C2 f2 X* D3 h9 Z( e
  579.         mov     al,dl' D* y/ r# W7 c: O
  580.         out     60h,al
    , L4 c) d1 C$ q9 _+ l5 B' j4 y
  581.         jmp     $+2: N6 f5 ~- f3 H1 _
  582.         jmp     $+2
    % ~" \1 @4 S5 r+ R" w
  583. ( b" d7 D/ D2 ^2 ^1 V( E
  584.         xor     cx,cx9 V3 l9 |& L$ G8 S4 }4 h& T: [
  585. kbd_wrt_loop3:' ]$ x) w: \' e2 [( Q$ W
  586.         in      al,64h
    : U1 c0 W$ Y. K. R" m: n7 Q( |
  587.         jmp     $+2
    6 s" H* q  d% w) |! o& s
  588.         jmp     $+2; j4 \4 C+ j. k3 z' }0 A* x4 ^" O
  589.         test    al,2' g% }4 E2 F! q4 w
  590.         jz      kbd_wrt_ok3; ~+ C- e& g# l/ I, D

  591. , h7 |. _! ^) U  x- Q  c
  592.         loop    kbd_wrt_loop3( }; t& @' a# ?0 a# H, S- Y, v1 t
  593. 6 g' n. Y# E/ V* N& ~% W5 e
  594.         mov     ah,1$ p% g% H* ^/ ^) j3 A2 o
  595.         jmp     kbd_wrt_exit
    " _# m0 I8 e. ^% b

  596. - z4 ]9 K/ g" N' p, n% D$ v
  597. kbd_wrt_ok3:& I/ ?( \. m! B+ x. p; Z* Q
  598.         mov     ah,8
    4 ^: h* I  p( L, I: t8 d4 e
  599. kbd_wrt_loop4:/ c+ u3 E0 s; G+ i! T% e7 P
  600.         xor     cx,cx
    * k1 U  o+ ?" m' Y. }' A
  601. kbd_wrt_loop5:
    4 \* Y+ p% L4 y& Z2 D$ r$ Z
  602.         in      al,64h
      B6 c1 A5 M3 O. K7 N
  603.         jmp     $+2$ K6 u6 z1 i" @; k/ d8 u
  604.         jmp     $+20 q8 P# d* C; y6 ?/ }
  605.         test    al,1
      ^$ c1 v+ d9 G) A8 a8 u1 a
  606.         jnz     kbd_wrt_ok4; f0 ^, q4 t- C8 S! z1 F3 b

  607. " t% ]! L5 t; w- @; q
  608.         loop    kbd_wrt_loop50 N  n  t: i4 [* {- A: }
  609. . X  _0 e2 c- J: A+ `/ O# ?
  610.         dec     ah
    , _7 L/ Q, A" g: R7 \2 A0 U! k# R* Z
  611.         jnz     kbd_wrt_loop4
    9 r9 G" U4 [, X4 w9 V8 r( t6 D6 X

  612. 8 G- t4 b) }  Q0 E
  613. kbd_wrt_ok4:
    0 Q+ C% }# S4 v- Q+ T+ X
  614.         xor     ah,ah& }7 c+ r& f) \8 z! O2 _# f* a" N8 r
  615. kbd_wrt_exit:3 J) T: P: {. F! s# ~3 a5 A4 `
  616.         pop     dx3 J. L; g4 `6 |. N) b  U* F
  617.         pop     cx
    ) s5 }6 N  ?* Q( r) V  G- ?
  618.         ret
    ; t5 F+ B  R! |. ~
  619.         $ I2 y2 o, W( S0 r- I# i
  620. keyboard_cmd:
    * v0 O. s3 q3 w( N) n* v8 N/ j
  621.         xor     cx,cx
    ! P  Q) f. ]3 K! `/ Z9 ]
  622. cmd_wait:
    2 M: \. h! C. ~8 G; d6 A1 F
  623.         in      al,64h; {' l7 @+ Z4 J- N' e" t9 N* R* t
  624.         jmp     $+2: Y: U) h" H1 i5 q7 v* B
  625.         jmp     $+2
    9 X/ c! Z" p$ X# L) X1 p
  626.         test    al,2# E/ n  P( Z" R' V+ G
  627.         jz      cmd_send
    & n6 m, d9 Z9 }; F
  628.         loop    cmd_wait
    1 h9 n2 F% E1 Y4 {

  629. 2 F7 C9 m: ?2 @* u
  630.         jmp     cmd_error3 p) m* _/ j" l) z2 w2 L/ z
  631. : ?; u* ~  K4 r! ^; Y7 v1 y
  632. cmd_send:
    3 [* K7 V; x: _3 k4 |
  633.         mov     al,bl
    ' L6 e0 z" h) n( o- k# F$ ~4 A$ j
  634.         out     64h,al
    $ ^3 X2 s: T  b! A0 s; o
  635.         jmp     $+2
    , E9 B$ j8 m9 _$ s5 G
  636.         jmp     $+28 f4 W6 l% ]7 ^  `: N" f( N% D
  637. 4 X7 v4 R$ ?* V) C
  638.         xor     cx,cx
    $ e# N8 i' C1 k9 V- g
  639. cmd_accept:0 e* _! r$ u# }% k' P( M# n
  640.         in      al,64h
    3 S% U9 a4 H3 N2 V4 T
  641.         jmp     $+2
    8 \1 ^1 C  S' j" {" J
  642.         jmp     $+22 y0 i5 B" ~4 @( D5 Z. h$ l- I+ A
  643.         test    al,26 }2 a! x" K; h$ E
  644.         jz      cmd_ok2 ~- _; X* i- K4 Z
  645.         loop    cmd_accept
    ) ^" ]9 f+ V, S# T" |
  646.   P4 I8 ^' Q' Q( I3 @! T+ j" D+ w
  647. cmd_error:7 P5 c2 b% s( ^6 D6 M
  648.         mov     ah,1
    ( q) S+ d" {, |; u- l& _
  649.         jmp     cmd_exit4 C% F6 |; ]! \' V. y
  650. cmd_ok:; k; U/ Z6 q0 J# r
  651.         xor     ah,ah
    ! U9 e$ B2 l7 x0 E. l3 c2 S! }
  652. cmd_exit:
    + z1 w8 U* C1 U8 Z3 C2 o2 w/ K
  653.         ret/ o# g% l, p2 y; _7 I

  654. ; ^/ C; ]4 P1 v
  655. new_33:; ~7 }3 c. @" s) v% y8 P6 G1 `
  656.         cli
    9 p( S; b: }. v+ z( a. |; F
  657.         cmp     al,00 r5 W3 |. E! v7 b
  658.         je      reset_mouse
    ' z, R  L. @+ _9 _
  659.         cmp     al,1! Q" E4 E% g0 K2 k4 ^! P* ^
  660.         je      show_mouse
    5 m4 |0 j0 [6 A0 j& V- O' ]
  661.         cmp     al,2& Z* M7 b0 ^5 |( k0 i7 o1 \3 F2 T7 {
  662.         je      hide_mouse. q% C  U! f: _
  663.         cmp     al,3
    : i9 u! \$ n1 X9 s
  664.         je      get_pos2 Q: }6 R9 I0 |# I0 R; Q6 X1 |5 m
  665.         cmp     al,4/ ]' V) Z. s7 n7 n' s' F6 @
  666.         je      set_pos0 E6 Y9 D! M# p7 M* b! V
  667.         cmp     al,7
    * _% y/ I  y* ^" W
  668.         je      set_hor_pos
    / @$ p2 R$ P2 J8 d& U6 Y
  669.         cmp     al,8# y3 A5 x) N, Y1 o
  670.         je      set_ver_pos
    # b( s$ F8 a" z6 ?
  671.         cmp     al,0bh
    ; g$ y; Q* S! V- U1 I
  672.         je      get_mouse_movement
    - m6 }8 E+ z/ H# r5 s* D
  673.         cmp     al,0ch
    # N3 x& U. E. Q, Q* y: u
  674.         je      set_subroutines
    - O. Y. o& o' d( k1 H6 C
  675.         cmp     al,14h4 q# V- a4 G7 y) W& D0 G; L
  676.         je      swap_subroutines" X  K0 S4 s* e8 ^$ M5 z
  677.         iret" c/ ~* T& T/ E5 ~8 K9 t
  678.   Z9 A1 C# O4 x# t" ]2 \" Z
  679. reset_mouse:
    5 T% l) \; L* C
  680.         jmp     _reset_mouse
      Z) e% ^+ B$ ?9 j( g9 A) L4 C7 ?. A
  681. show_mouse:1 ~4 `4 I+ H; d/ E
  682.         jmp     _show_mouse
    4 p, i' K, b& X. _$ ~
  683. hide_mouse:
    * ~) ^# ~- X) ]
  684.         jmp     _hide_mouse
    2 h% @* Z- n1 I1 J
  685. get_pos:
    / c1 L* `" ]' c4 ~4 g
  686.         jmp     _get_pos* J- S; y* i8 F) S- c1 P* w# y! m
  687. set_pos:0 e5 y) j- v7 O  Y# y+ U
  688.         jmp     _set_pos
    2 V2 e5 H) l# R$ H& [, _
  689. set_hor_pos:5 E  @4 S( D8 @: }/ d
  690.         jmp     _set_hor_pos
    5 R0 E; q4 D7 Y% `5 X, ?( f+ B, x
  691. set_ver_pos:2 i8 L' n7 J) Q$ P/ _
  692.         jmp     _set_ver_pos; A8 ^0 [# b8 f& v
  693. get_mouse_movement:
    ) j8 e& \2 a: o/ d
  694.         jmp     _get_mouse_movement
    8 n( R& h( M  Q. k( M9 M
  695. set_subroutines:* J, v! S" Q. N; n2 E
  696.         jmp     _set_subroutines/ f, `6 N3 _# {* E5 j, N+ g
  697. swap_subroutines:, K  x$ [6 b+ G- e/ e9 J
  698.         jmp     _swap_subroutines
    - `& P  |  R: W  R! |
  699. . b$ ]8 k9 F  p* t- P
  700. _reset_mouse:0 b* ?: A4 p1 G1 C0 Q! A
  701.         mov     byte ptr cs:[buttons],0
    4 \) g  _" Y! B1 x- u5 m% l
  702.         mov     word ptr cs:[pos_x],0; r) U' W3 g5 S  q" k7 j7 A) w
  703.         mov     word ptr cs:[pos_y],0
    $ j  j6 }/ f9 S5 p, b
  704.         mov     word ptr cs:[x_move],0( `4 Z' a8 z0 L  d
  705.         mov     word ptr cs:[y_move],0
    ' ?  a1 t! A1 N8 S! p
  706.         mov     word ptr cs:[x_max],6394 e4 c1 e  z& A. a
  707.         mov     word ptr cs:[x_min],0
    6 \1 R3 @7 F* S9 |# }- L
  708.         mov     word ptr cs:[y_max],199
    7 j5 }$ g+ h3 w/ `3 p. _
  709.         mov     word ptr cs:[y_min],0& R6 P4 L5 \) s* o
  710.         mov     word ptr cs:[user_mask],02 _8 p7 P; d" r
  711.         mov     word ptr cs:[user_subroutine],0; j& Z' m5 O7 ~  r
  712.         mov     word ptr cs:[user_subroutine+2],0
    ; X; s/ K9 e4 B3 z7 n! d
  713.         mov     ax,0ffffh
    9 R$ H9 ^- R. C. p
  714.         mov     bx,3+ v  k- j$ ]8 n" p! o1 ?
  715.         iret
    3 l4 ?  W$ v8 P( _! X9 p% y

  716. : ^+ a! {' f8 W4 B: N$ s& z* v
  717. _get_pos:1 o3 \, S9 L" Q! X- q2 b0 t' e/ f  k
  718.         mov     cx,cs:[pos_x]
    , H+ g# ]; _9 D# J. x
  719.         mov     dx,cs:[pos_y]% v7 V: M1 d/ T5 V3 |! @) ^$ u
  720.         mov     bx,word ptr cs:[buttons]
    + `; W, [* U1 J7 Z7 _% U/ R
  721.         xor     bh,bh
    9 a& Y9 `* |- t- K+ a8 N
  722.         iret
    8 f: h2 b1 F+ _3 u7 h" z

  723.   A" [9 P3 ]% E7 t. x/ q6 M/ m& m
  724. _get_mouse_movement:
    / f$ W7 o4 @# d* h% ~
  725.         mov     cx,cs:[x_move]- U3 s( A  P, `$ v& c
  726.         mov     dx,cs:[y_move]
    . _4 v+ g% I7 M
  727.         mov     word ptr cs:[x_move],0& Z, [, G, ~  O% W
  728.         mov     word ptr cs:[y_move],0! k' `1 C$ u. v5 e( y
  729.         iret
    ; |9 l' H8 [, @8 G# b
  730. - `- N9 i! s" P, F, c  p
  731. _show_mouse:
    , d3 y' {/ ]3 V3 ?" H: ^
  732.         push    ax) Y3 T# A2 y# D* O9 o* Q  h
  733.         push    bx
    2 u% m7 L# i8 f$ K( w4 X, e+ b
  734.         push    di
    " u- K% X& U: L: o$ e
  735.         push    es
    1 f1 }2 i: F( o
  736.         mov     byte ptr cs:[sm_flag],1) P5 Q: ~: G8 j! ]4 E
  737.         mov     ax,cs:[pos_y]
    ( t' y6 Z& Y, t+ @8 O
  738.         shr     ax,3$ g, J$ }6 A4 Q7 c
  739.         mov     bl,80
    ( P. _- ?1 L- ?' `" }% N
  740.         mul     bl6 i, U, Q& i  y7 t* ?( g4 ^" O
  741.         mov     bx,[pos_x]
    ( O: [6 r; A( x$ l. a: S- y% o
  742.         shr     bx,39 M6 S( J& \  @7 z
  743.         add     ax,bx
    , l$ X5 Y" N' K& x
  744.         shl     ax,1
    - j( t! E$ ^' p; H
  745.         mov     di,ax
    9 Y& `( y+ K6 x$ q" i
  746.         mov     ax,0b800h
    / E* Z# v2 _8 z
  747.         mov     es,ax
    4 X$ k5 G' Q: s
  748.         mov     ax,es:[di]
    ( i9 W( X* Q9 n/ e. a: d7 N
  749.         mov     cs:[save_char],ax& C1 `5 {! u# P& Q6 ?  a" s0 M! }( ~5 P' t* b
  750.         not     ah
    . Z; j: T$ ^0 g. r! A2 r& T
  751.         and     ah,7fh) l, c) }8 [1 T8 C
  752.         mov     es:[di],ax5 |: @8 C* V- X3 T7 e
  753.         pop     es
    8 Y  ~  o* W/ |2 Q$ W& V/ N5 z5 P
  754.         pop     di
    ; ]& J. b$ r; a/ n$ M9 z
  755.         pop     bx2 h4 p; j( X! U. m4 x2 {
  756.         pop     ax% w( J/ w, t, l/ O, b
  757.         iret9 b. W5 b+ X6 ?; h- o; t
  758. - ^. u( e3 D: e
  759. _hide_mouse:
    7 {( B4 @, r2 X/ J1 [
  760.         push    ax
    0 P5 k  |* K* `  q: ~
  761.         push    bx5 Y' T4 B; I, x
  762.         push    di! r; L! ~: S0 F7 G& o" y
  763.         push    es% W# p  ?: w9 W' T+ ~* D  `$ ?
  764.         mov     byte ptr cs:[sm_flag],0& @* I/ X2 r; ?8 z6 }: j4 L& b% ]
  765.         mov     ax,cs:[pos_y]) @! g4 s( }- a7 j* a( H
  766.         shr     ax,3; ^% B5 F  u' k& \" }4 G
  767.         mov     bl,80' f; I; t9 M+ f1 m0 E7 d8 F6 K
  768.         mul     bl" Y& E, W. u# X+ q5 _2 W
  769.         mov     bx,[pos_x]4 d( X" D( b- V$ K" d) G; z
  770.         shr     bx,3
    6 t$ d, h, }! b
  771.         add     ax,bx
    . \) M* k. o8 R
  772.         shl     ax,1
    ! q6 i+ I% ]! d  K+ C
  773.         mov     di,ax
    4 _! b8 j* ]- W: n
  774.         mov     ax,0b800h5 D% g% }1 T/ |; r
  775.         mov     es,ax+ M/ ^& t1 {$ l: y2 @
  776.         mov     ax,cs:[save_char]
    : c% c6 d6 L+ {9 o
  777.         mov     es:[di],ax
    8 \' r* w; p1 E* g9 ]3 |
  778.         pop     es( F- F0 b1 m3 X  W! V4 D+ O
  779.         pop     di
    ; m- q, b) N3 H
  780.         pop     bx
    & D* C$ d* T6 i$ @4 ~0 Q
  781.         pop     ax) t3 {5 U% P* p- E8 [
  782.         iret7 \; T. e7 Q/ p# u# O, m; o3 m

  783. & M' E# F: j. h% \
  784. _set_pos:! T/ p, R: T0 o% Z+ z0 l
  785.         mov     cx,cs:[pos_x]7 V8 O5 l9 K) \5 H0 T
  786.         mov     dx,cs:[pos_y]
    , N" _5 d  ^& p; u
  787.         mov     word ptr cs:[x_move],03 c4 u$ V3 a' M9 F1 L& U
  788.         mov     word ptr cs:[y_move],0
    % O" k- \/ e, I/ J/ D
  789.         iret
    9 ?0 P1 L" h9 i# c0 ]; Q
  790. 2 Z1 z1 t* E) O, R& ^
  791. _set_hor_pos:
    3 R5 W& y7 ~. Q: M, B
  792.         call    max_min
    / r2 L6 e; e* R) x+ C
  793.         mov     cs:[x_min],cx
    ) a# V0 m5 z+ a! ^+ b- o
  794.         mov     cs:[x_max],dx
    ! R% Y/ K0 k' t+ I' ?
  795.         cmp     cs:[pos_x],cx+ a, I. v7 s/ a3 k) M! J% W& \
  796.         jge     good_hor_min
    6 L1 i; e9 m* V" |' s
  797.         mov     cs:[pos_x],cx
    ! Q* ?. t# D9 F0 ?
  798. good_hor_min:
    # z: |- f3 Q9 A
  799.         cmp     cs:[pos_x],dx' P; \& ^- v3 X
  800.         jle     good_hor_max
    , U& i! E, \6 r% j
  801.         mov     cs:[pos_x],dx; }1 F; N0 ^8 i! P7 O' w6 J
  802. good_hor_max:/ I. i# [8 D8 t
  803.        iret; \9 Q/ p) L/ A( _. b$ }$ V$ s+ P
  804. ; ~( G& U0 n0 _+ D& F7 K2 s
  805. _set_ver_pos:: M3 M/ V8 `6 m. \- e: R' y
  806.         call    max_min) _2 {+ m* a9 x. B* u9 n
  807.         mov     cs:[y_min],cx6 i6 K/ o& [, g+ z( j
  808.         mov     cs:[y_max],dx
    2 h% }; ^& U$ t! e# m& b$ X& u  ~
  809.         cmp     cs:[pos_y],cx
      R  [- X& w. W7 e" v& @, E
  810.         jge     good_ver_min/ H/ _+ W5 o8 H1 P$ d! O/ x. H6 g
  811.         mov     cs:[pos_y],cx3 K+ X" D) F& W5 O6 \. {8 e
  812. good_ver_min:7 L: u. S3 ?  s
  813.         cmp     cs:[pos_y],dx; f9 ]4 o  K) ]  B1 x; Q; W" j
  814.         jle     good_ver_max4 n! J# o8 z: S
  815.         mov     cs:[pos_y],dx
    # ]+ B6 f* }/ M. z3 }
  816. good_ver_max:
    * P, N* X! I  F' O, f* u" b
  817.         iret! H9 e2 ^) t: d% w
  818. ) ^( z* W7 i% h; F6 A
  819. max_min:' l! O" a# X. ]+ W1 `" V4 h
  820.         cmp     cx,dx; n* g2 q3 `1 ]0 s
  821.         jle     no_swap% k3 T: q0 ~3 t) p% m! K) I
  822.         xchg    cx,dx: a' g% c) v# ~( @
  823. no_swap:
    * f/ Y% r9 `; v. @& y2 [
  824.         ret
    1 e" E# ~, W- e* U
  825. " ?1 ^) Z# q: P8 _: W, L9 t
  826. _set_subroutines:/ _8 }6 x" _+ b3 C% z9 V: {7 p9 L
  827.         mov     cs:[user_subroutine],dx# f, u# Y5 B7 i2 {
  828.         mov     cs:[user_subroutine+2],es5 R% @8 j( l% Z& Y% @
  829.         mov     cs:[user_mask],cx# A( j% f& S% H3 T9 e7 I" E7 O
  830.         iret
    9 r( C4 [* ^1 ~. j3 k5 x; V* a

  831. 5 C$ O" [7 v# H, _. H# N! d; B
  832. _swap_subroutines:% g& _) G* E  P# C' M
  833.         push    word ptr cs:[user_mask]
    ' Y; {+ P8 N- x$ ]$ U8 }8 ~
  834.         push    word ptr cs:[user_subroutine+2]
    - s0 \! e7 q2 |* R. Z" ^: d
  835.         push    word ptr cs:[user_subroutine]' d2 }. t5 |, F$ c6 K: f
  836.         mov     cs:[user_subroutine],dx1 q& h+ _* M. }1 ^  h% U
  837.         mov     cs:[user_subroutine+2],es
    8 v) ^% o4 ^9 V: Y8 j/ |
  838.         mov     cs:[user_mask],cx
    # m% Y4 H9 {1 o( p3 q7 J0 \
  839.         pop     dx0 N) ?) m: R" q3 f8 j2 x
  840.         pop     es
    " I- I3 N5 I1 n! u4 V7 X
  841.         pop     cx
    5 @9 ?4 g. p! g* A* U. v5 T
  842.         iret# _3 R2 w% X' @* E
  843. ! z3 w" g: |# }
  844. memmouse        endp
      }' H- [. j2 j6 V
  845. ; K( g. n/ t+ z2 N
  846. endof_start:
    ! t# p# x  b. x9 y

  847. ! _$ E9 B7 O, A7 [% F  {
  848. emsg db 'No mouse driver install error!$'
    % v- g$ {* Q: k4 T# ~% l# W
  849. old331 dw 04 q( j$ p- ^$ ]
  850. old332 dw 0
    + ^. u/ o' m3 W
  851. old741 dw 0) t* }. E& N6 ~  {3 |
  852. old742 dw 0. L- Z1 @1 B1 u8 a2 ]2 ~) b  Y1 I
  853. memcopy db 0; E% b3 U6 O! E; P9 M5 P
  854. okcheck db 0
    / R& Q* w+ p) @+ z; L
  855. pass db 0
    0 }. Q2 a% M7 R" H* K( d3 C
  856. chkl db 0( l6 }' r. [6 O/ ?
  857. lk db 0
    3 d7 q& E' P/ w! C  J6 S/ V
  858. chkr db 0
    9 H9 c0 |. x0 G& j. B! `& ~
  859. rk db 0
    - B7 l/ A+ m7 g; g+ m2 x
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    % }6 c( U$ h: g6 t: ?
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    0 Z& V7 B7 d, U$ X1 |1 j
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '( \1 Y1 P0 R5 j
  863. db '                                                                                '
    ; X5 w# d5 f" U
  864. db '                                赏屯屯簧屯屯突                                  '
    4 n9 P% o# Y! x! B5 \2 |) E
  865.         db      '                                ?OFF汉OFF?                                 '
    % M* V; o; g$ D: v7 |; f- @  S
  866. db      '                                韧屯屯既屯屯图                                  '  I  F4 X2 [% z
  867. db '                                                                                '
    5 d4 W* k+ f0 F( q' J1 @5 l9 }0 O' `+ f
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    $ N8 |( ^2 p  G
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ; ~, o7 \" X  d
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '; |6 g0 E( x. w& ]! ~5 n

  871. ) W" ?+ D2 C9 `& _
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!* U0 I5 D/ s+ c8 N
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
; p1 i- h8 y5 B" G+ U% L! j
) ~9 Q, u2 W1 @* U8 L- @( D9 ]谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:18 , Processed in 1.268664 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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