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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。  t$ ~+ L; O1 v( I$ b( o" J& }2 l

0 \) @$ H0 _1 ?, j3 ]$ p  H代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;1 i; m9 o6 N5 r
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    & U/ w( \) i2 o# ?- y
  3. ;                                         By Bini.Yi 易祝兵
    ( ]+ S. Y5 z' v$ ~; e) U: ?' j
  4. ;                                         http://www.ufoit.com 计匠网. a2 {! L8 ?4 _! V( t4 e# m
  5. ;                                         2002/04/06 YYYY/MM/DD# w/ O7 M" g; Z4 l( J
  6. ;
    ' J5 h! X7 |  P5 G/ K" C
  7. ;         
    4 c# A& w6 w1 w" J
  8. ;          This program  test the mouse button  click and move.: X5 c4 I/ i8 V5 ]  c$ l9 f
  9. ;: a3 ~" _5 F: K3 }: b+ l: @

  10. , k/ U- @+ l6 b; I! p
  11. .model tiny
      t/ ~# Y4 l8 Y
  12. .586
    1 o) a& M% s/ o5 |- f9 y
  13. .code  {' G3 n2 _$ `8 v* m
  14. .stack  100h& O- H0 H6 d8 M( ?0 x; l
  15. .startup
    / A0 X( N3 c7 w/ }- d, C% ~
  16. pusha
    7 _1 o0 o8 W% n: @9 Y
  17. mov ax, 3533h
    9 z+ B. x( m9 G4 Z8 @" w; I, G% S+ k
  18. int 21h- \; c8 c1 R0 q. m
  19. mov word ptr cs:[old331],es
    ; x) A' P, _( Z0 G1 e2 v! \
  20. mov word ptr cs:[old332],bx) b) O0 B8 X8 H% V
  21. mov ax, 3574h% o6 P1 p$ X6 `. x+ f
  22. int 21h
    / k. O, u" J( [& j: m4 [3 w, Z
  23. mov word ptr cs:[old741],es3 T3 _7 H, n; U4 V! D; f& ~( u
  24. mov word ptr cs:[old742],bx
    / K) ~1 ]( [* B. |
  25. popa
    / g' z8 u0 [3 A+ V
  26.         call    memmouse! G* g0 c- u. W* L
  27.         mov ah, 00( f7 i  P% i6 A) U
  28. mov al, 03
    3 R- S. v) n5 v" b
  29. int 10h
    ; w- I: F* c/ L7 Z
  30. mov ah, 06
    2 X" c) M& z0 L
  31. mov al, 0
    6 F3 T+ a# t! A) o+ R6 Y
  32. mov cx, 01 N/ X& s" G9 b% a9 p( L: k
  33. mov dh, 24; `! I, K' G, L! w  G
  34. mov dl, 792 p) T' }1 V  w) b5 D7 R4 k
  35. mov bh, 07h! H1 N9 d: r* X0 _0 w) f; A: L
  36. int 10h
    - h) M2 t4 I  G: L" v
  37. mov ax, 0000" p8 `& e. r7 h& F9 k, V4 Q
  38. mov bx, 00027 x/ V$ T/ i" c  S! u
  39. int 33h
    3 }& T' n6 `' f- U5 k3 ?$ X2 Y
  40.         cmp     ax, 0000           ;if no mouse drive install
    ( T7 b" f+ F4 o2 S+ _
  41.         je      errormsg           ;show error MSG3 n4 n. G% y) z% ~5 i. `: C
  42. mov ah, 02
    8 @% G* ~, C* Y* x5 f+ Y
  43. mov bh, 00" _2 @, A& l6 P5 P4 \4 x
  44.         mov     dh, 25             ;Move point out screen2 M3 a/ u( d6 u% P# P: @. z7 R* r. I) ?
  45. mov dl, 79
    0 Y/ ~% N, f$ X: B, ~4 H- v
  46. int 10h( q8 `& n3 R0 p6 b/ p& U; x
  47.         call    showmsg            ;Show info
    - d2 A: E- F9 o8 e' G
  48. mov ax, 0001$ u, c2 I" a6 n" J
  49. int 33h, m+ `. ?" m1 s+ G+ B4 Q
  50. ; mov ax, 000ah
    : h- K- T: v& P
  51. ; mov bx, 0000
    " h: f$ e5 h% z
  52. ; mov cl, 0h
    % e/ B$ Z6 m1 }. w( e
  53. ; mov ch, 0F0h
    ) w+ |* w' A* N$ _; W
  54. ; mov dl, 0h& F" K( V8 k4 Y
  55. ; mov dh, 0F0h
    : Q9 C0 c5 T7 y. o0 x/ A' |
  56. ; int 33h7 l( q" C2 x; d3 h( r0 c# L/ S
  57. mov ax, 0004h# ?* o1 H( Z. u0 U8 h
  58. mov cx, 0319! y  y' e) j2 j  T
  59. mov dx, 01035 {2 Y- w% S( E
  60. int 33h
    2 o0 U4 {6 [( ?( N# [' |2 h% D
  61. casemo:                           ;Case button click and point move % Z+ |/ ^0 \3 J+ X  A# c
  62.         mov     ax, 000bh         ;and keyboard press
    0 S/ R5 Q  {# r/ ?
  63. int 33h
    - E6 t9 d- y/ D6 y; I# |
  64.         cmp     cx, 00h           ;if point move....X
    0 @0 Y% C. H) o
  65. jne xmov9 \7 O" m7 v, z& s& _
  66.         cmp     dx, 00h           ;if point move....Y) m2 o  ?- A2 E, I/ H. e
  67. jne ymov
      g& k8 J  |' Y0 E2 ~: A1 a* `% b
  68. xymovend:                         ;X.Y move end
    5 W! B1 }3 n2 K3 D$ `, S
  69.         mov     ax, 0003         
    ( H& f3 a! r8 v0 l  P& W
  70. int 33h' O( A" F  Z# l, U
  71.         cmp     bx, 0001          ;if left button click  show ON
    & {6 Y4 @, C3 x- w, q
  72. mov si, 1828- s) T. S' J+ t( T) \
  73. je listl
    ) K& p* |$ k, ~2 q
  74. mov si, 1828
    9 }- d1 _' e+ K- ~
  75.         jne     nlistl            ;if left no click show OFF
    + ?) J8 X- q4 ^8 C* M
  76. testr:, Z1 [4 ?' E4 I& a) q4 ?
  77.         cmp     bx, 0002          ;if right button click show ON
    ' J' m+ W8 A: O! I+ b) a6 H( Z" d% V
  78. mov si,1842% i' v* u/ {  ^2 P* n$ }7 a+ G- g
  79. je listr) ~3 H0 ?( }7 x( o2 o
  80.         mov     si,1842           ;if right no click show OFF
    . H7 `3 q) U. Q/ @1 Y8 g/ i( O
  81. jne nlistl
    ! E% D# _: p# T  T8 ^
  82. casekey:
    ( `; ^, a6 m# ^# v6 C
  83.         mov     ah, 01            ;if any key press jump check
    - N# Q9 ^5 Q+ T' t( W3 C# h
  84. int 16h
    - w0 E4 Z( P) h. P3 }& Y+ y; n2 z
  85. jne kpress/ x$ w2 V2 P" [
  86.         mov     al, [chkl]        ;check x flag/ g6 i$ ^3 |! i7 v9 N
  87. cmp al, 02h
    * Y8 _0 B: d6 |3 C. l0 G8 e
  88. jnb chkok
    0 I2 V: z5 M# c1 a9 {
  89. jmp casemo2 K5 q$ V7 i0 k! c
  90. xmov:                             ;if X moved, get the X flag+19 j8 d' w  N2 w# {: C
  91. mov al, [chkl]
    + t* G& Y" l: Q, d+ j- ~
  92. inc al
    9 Y- Z* F6 M: ?( A$ a8 R
  93. mov [chkl], al
    % {$ Y: y( h/ e, \  [4 W
  94. call passok& z5 L& e. e. m# E8 x+ Y& C
  95. jmp xymovend  ?" _5 n/ u- B
  96. ymov:                             ;if Y moved, get the X flag+1. ^7 J! Z6 p" P2 e$ i% g
  97. mov al, [chkr]
    + Y) t1 O2 z! m) \+ W
  98. inc al
    ! j2 x/ p& G9 G- v# x% j  [
  99. mov [chkr], al6 Y7 n! e9 w, |$ A' v
  100. call passok# p: J3 ]4 h4 h$ [" w
  101. jmp xymovend2 e' c  J. Z0 J# H$ J2 A7 H

  102. 8 d  G& G% d6 C$ Z
  103. passok proc near
    2 S# }: @& m) {  e
  104. mov al, [okcheck]6 E6 E$ `' W) ^* H
  105. cmp al, 1
    0 F- V) @% e; @3 t$ {8 J* A
  106. je let0' ]% z0 N1 m9 T) O: m0 ]
  107. jmp passret: h$ x& V; @- e
  108. let0:
    ; w7 c( b) n. i2 Z) X% k+ C
  109. mov [pass], 1
    1 r4 H$ J! B* K( s( \& M
  110. passret:
    4 N7 V, y0 h" r+ r& \( b# N/ W8 ~
  111. ret8 l# `  W6 |1 X7 \# U
  112. passok endp $ @) b+ [, i! ]

  113. ( p# q3 m  \, x/ Z# }1 u0 w
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS! e+ V" @# z/ k3 p' d' i
  115. mov al, [chkr]
    ' [0 T# g: t& t; n
  116. cmp al, 02h
    , \7 B3 w3 Z3 @# S3 n
  117. jb casemo
      Q) U, |4 M" |/ m) Q
  118. mov al, [lk]
    8 @8 v" M& b; ~: f/ h. E6 d* |
  119. cmp al, 1) ^0 N# y" g, i( C$ y
  120. jne casemo& l7 r) @3 q6 k6 N$ @2 l4 @: W
  121. mov al, [rk]$ k. A1 @" ?! `9 r
  122. cmp al, 1
    4 F; D7 R/ t& J8 g' y0 t/ z5 l8 l
  123. jne  casemo5 U; Y; I1 C# l3 D' d
  124. mov [okcheck], 1
    3 l) J9 E2 C1 x  m: d/ M
  125. mov al, [pass]
    / C4 d' z- t: S+ `  G1 a! s
  126. cmp al, 1
    ( U! c. L  w9 i, x# P0 d' S' N2 a
  127. jne  casemo/ |0 j+ ~+ Y  ], c; x5 k( t
  128. mov ax,0002h
    8 U1 M: a) _! }  p6 _3 J
  129. int 33h
    ( S1 j; O  O6 D  H1 o
  130. call cleascr
    7 n5 L" O# i# b" v" X
  131. . p) K" f! _9 c  S' C
  132. call oldint" j1 O; P) v* D, I
  133. mov ax, 04c00h
    , N( Y0 N$ l" \& W
  134. int 21h6 R6 U! k5 i  j4 X, A8 X
  135. $ T6 e- Z8 t! y
  136. okexit:
    " U/ l2 l- \) v  t/ M
  137. mov ah, 4ch# D& |; X/ K. i7 ~& P, \0 {
  138. mov al, 01 H6 }! n! m' `" e
  139. int 21h
    , z' d% I& A7 Z+ J9 G" [
  140. listl:                                 ;Show ON
      f" h  e* W; r
  141. pusha; A: b0 X3 Z3 g" E% ]# l
  142. mov ax, 0b800h
    & L; ~& ]  r1 B0 T3 K
  143. mov  es, ax
    / _- A9 r. V% Y+ J+ `$ c
  144. mov ah, 47h
    2 j; G7 u* `+ [( _/ e8 j+ C! x
  145. mov al, 20h
    " V3 u) d( |9 T  r- I7 u
  146. mov es:[si], ax3 d4 n0 X6 }9 X' j- b3 u
  147. add si, 02
    4 w  I; @' W2 I
  148. mov  al, 4fh
    - D- `2 ~* H0 ~: `- \- x
  149. mov es:[si], ax
    + A. m$ i( _8 F' \/ c( i5 A" g
  150. mov al, 4eh8 _% n( ?1 V" ~1 b9 @5 b
  151. add si, 02/ n3 o+ O5 Z& {" C
  152. mov es:[si], ax
    $ }0 l: B8 j4 g% N( d) u. w
  153. mov [lk], 1
    : C0 e8 T- N  ]9 k! q4 ^
  154. popa
    + o' e$ Y6 K5 ^: W
  155. jmp testr( J" C# A; [) P; @, a! f6 G
  156. listr:                                 ;Show ON" a9 |. f% E; D  b
  157. pusha- T/ _8 p" C2 a$ X. g! R: C& I
  158. mov ax, 0b800h& X* Y7 P" K# e+ _( r
  159. mov  es, ax% C6 P9 O1 i& _* ]7 K" C6 q  g) l
  160. mov ah, 47h
      c3 k4 q( t  K3 B; A  J
  161. mov al, 20h# t# j; s+ i1 @/ Z9 S$ m
  162. mov es:[si], ax  |. b  ~7 Y! H" f' s
  163. add si, 02
    2 z3 X- c4 J" S' c# B, o
  164. mov  al, 4fh
    , c$ |. e" I) c- w
  165. mov es:[si], ax+ p( z) X5 N6 f& P! c4 k, D
  166. mov al, 4eh  t0 O6 F! I2 t& h/ p, ^3 C, K
  167. add si, 024 V0 n2 {, I3 B8 K
  168. mov es:[si], ax; f% h+ w! T& J, \( h$ r7 w3 z
  169. mov [rk], 1
    7 L3 {* F7 w+ i7 P" |* `/ Z
  170. popa1 o( ?& y# W3 U4 E# k
  171. jmp  casekey
    . {9 s$ o' [" J9 ?* G, a- X

  172. 9 D) M$ i. {, o6 ~4 G* O2 O
  173. nlistl:                              ;Show OFF
    ( \2 ~9 \4 i" I% ^6 ^1 ^  M3 ]
  174. pusha   3 @: l& d8 o, D7 C; a: a
  175. mov ax, 0b800h
    " I8 H# D4 A8 [
  176. mov  es, ax/ X5 h6 @$ W7 s
  177. mov ah, 17h
    % v" Y% _+ S6 o$ K; y# h1 T" b
  178. mov al, 4fh
    7 ~9 Z: u, L+ m# E  v
  179. mov es:[si], ax+ u0 C  g1 H' B2 L
  180. add si, 02. T; M( k* \: f0 K# }( e1 _9 ?
  181. mov  al, 46h
    : `. K1 j" P. D; J$ C( w
  182. mov es:[si], ax
    : b3 G) c: l  t# s
  183. mov al, 46h, l. }6 m/ J3 l, F. f* }1 w
  184. add si, 02# l/ u/ M: E! e9 L- Q2 a6 Y
  185. mov es:[si], ax
    9 K3 E8 i6 @5 v4 p- V4 v
  186. popa
    % h$ n8 l3 H- h% A" l* \: x9 B7 d
  187. cmp si, 1840
    ; B/ }& k8 G: C) K$ a8 A9 H( Q0 A
  188. jae casekey0 n# \( B( I+ j, D) \7 N
  189. jmp testr
    ) S9 ~) V. B3 O0 A3 g# Q1 U
  190. 4 h; e# ^+ X( l
  191. kpress:                             ;Check key press if press<ESC> then EXIT9 T# \: ~$ L8 s. M, \8 l
  192.         cmp     ah, 01h             ;and return a error8 u. U% }0 L1 T& Y
  193. je exit1% s+ E! ~9 ~: W
  194.         mov     ah, 0ch             ;if press other key then clear9 i4 A4 Y+ A. ^6 N* d7 z3 E0 i
  195.         mov     al, 00              ;keyboard buffer4 B. y, S) e9 p9 g
  196. int 21h
    - j) p4 T( S' d, P, z7 Y( E7 N, G
  197. jmp casemo
    . N+ M2 }7 _$ N! m! ?7 a6 B/ P: N' q
  198. : q  W1 }3 |) e0 h7 v( Y( P: i: K. d
  199. errormsg:                           ;if mouse driver no install
    : W+ z4 C& a) e* {8 \. G, I# g
  200. call oldint
    + A5 N) f, M0 c
  201. lea dx, offset emsg
    - W' y1 V% ]: A+ p8 n: i3 k& p
  202. mov ah, 09h1 y- G4 A0 z6 y
  203. int 21h
    / M2 b( W$ i, U- a
  204. mov ah, 4ch. E9 V" K2 ?) O4 U/ ?, S
  205. mov al, 2$ R* d4 B& n% i" E+ w
  206. int  21h8 g6 G: a" W* E" I, l+ _

  207. ) |; S4 V( ]* B7 g
  208. exit1:                              ;error exit
    5 }+ U4 Q; x3 W# P
  209. mov ax, 0002h
    ; m$ a: C1 m$ k" p. @
  210. int 33h5 \$ P: U5 p: P* b
  211. call  cleascr) @- `  N+ ~- m* C% X/ M0 C9 O
  212. call  oldint8 F+ \" V8 X! m( H
  213. mov ah, 4ch, ?* t1 X% J8 D1 z; k1 f
  214. mov al, 01( ]' V. z/ j1 S/ p9 C5 A
  215. int 21h8 ~" i* ^. E0 b

  216. 0 c$ V# U- x) \9 v/ |2 w
  217. cleascr proc    near                ;clear screen- e. p/ e/ p) D
  218. pusha
    + F# V4 {0 x6 g. x1 y/ i
  219. mov ah, 06; n5 A: r& C: Y7 Z5 R
  220. mov al, 0" o9 N/ o/ W& K2 v
  221. mov cx, 0
    " s# C" b! h1 u# H
  222. mov dh, 24$ r, N) ?* J4 w
  223. mov dl, 790 r. b2 L  u2 ]/ s2 ]; U
  224. mov bh, 07h/ M9 J, N5 B& D0 A
  225. int 10h( c( q$ J& Y" {& l9 w
  226. mov ah, 02
    9 ?0 W. D+ C5 C1 q/ y5 s2 [' r/ e
  227. mov bh, 00
    ) \% J% L5 F0 \6 F
  228. mov dh, 05 }5 v9 ], g' U4 o. P" v
  229. mov dl, 0
    0 |- [) K% M$ f6 n7 |
  230. int 10h! Z- X9 o8 A! o8 z- g& n$ `: S
  231. popa9 G) F- x6 i" @6 z+ p
  232. ret
    9 [3 Y$ @8 K9 m7 Q& a* w( \7 @
  233. cleascr endp
    4 {$ a! J/ |3 \" S: U
  234. 0 j  i: \! S- _
  235. showmsg proc    near               ;Show info: o+ c/ y) L! L* C
  236. pusha
    ) L* d( x. G' S0 l; R; D. {( t
  237. lea di, offset showms6 T# t7 ?/ Q' l: g( r
  238. mov ax, 0b800h7 f" S) ~8 m3 L) ]  W3 C2 B
  239. mov es, ax. R2 _# Y; ?" I3 p7 k
  240. mov si, 0
    3 E/ Q8 J( y* r. T0 X
  241. mov cx, 480* e" n) N. z5 B' ?- ^4 U( z& A
  242. mov ah, 07h
    - I! u. F8 B7 r0 Z! M5 M5 Z! L
  243. @@:
    / c8 r- O0 m$ Y9 m
  244. mov al, 20h2 u, W1 {1 `( R( E4 i" u: Q2 G6 X, Z
  245. mov es:[si], ax# N3 P7 F& h9 z
  246. add si, 2
    6 t8 P9 M: T0 ?# z. Y% x2 y. W) D' w* ~
  247. loop @b+ e) B, z2 `5 i* C2 r0 t
  248. mov cx,880
    - G+ h0 a* y" w! }. N3 R% M
  249. @@:# u- Z4 k" [; j) Y3 Q
  250. mov al, [di]# Y' ]' x" W" f& j, i# L
  251. inc di
    % [' r6 l2 q5 o$ G+ o% \! l
  252. cmp al,20h
    9 c' y7 K% G2 c$ d& V
  253. je showch1
    ; S5 ?" z& ?& ^, B
  254. mov ah, 17h/ r! q: k* w/ d
  255. jmp showch3
    0 x7 p$ S2 ^9 l4 e
  256. showch1:$ q# I6 C( d. v- A  a" c+ s
  257. mov ah, 07h
    . Q9 h& I7 e+ ^" b1 n" p
  258. showch3:
    , e  f  ^, J0 ^/ o/ P1 w2 n2 j
  259. mov es:[si], ax/ c& A( o2 M! a$ ]1 p
  260. add si, 2
    + U: c3 Y9 C6 ]+ i5 e. s! D
  261. loop @b
    ; X8 x. G9 n4 a! X. o3 F, T/ w- e
  262. popa
    / D- V0 O$ Z. b+ a- H' O% w
  263. ret% B( s2 t  O9 m" W
  264. showmsg endp0 V* k; _% g2 ^. D; l

  265. % q$ }8 B2 j* V$ O: n5 }
  266. oldint proc$ u) s, k! j4 D. M
  267. pusha- ]+ X0 B1 [- o. o1 _
  268. mov ds, word ptr cs:[old331]
    % |4 z( q3 |% h
  269. mov   dx, word ptr cs:[old332]! m, G( y$ H  A: ?# C
  270. mov ax, 2533h* q% R  k# F: I4 n! @
  271. int 21h$ k. i& h$ d# C; s' [
  272. mov ds, word ptr cs:[old741]8 N6 A. z6 K" l) D- u
  273. mov dx, word ptr cs:[old742]
    $ m3 U1 n2 G& x% m9 {
  274. mov ax, 2574h
    2 l9 e  P- I* P+ J
  275. int 21h8 O" i/ X0 _* X& ?5 o
  276. popa
    ) a5 h4 z+ R# @6 a5 L
  277. ret
    5 z, D* y7 J3 I5 K- n
  278. oldint endp8 u4 N; h2 j0 ^' ~% x. ?

  279. / H; W+ P  X' N: P* q( G* o  v
  280. memmouse        proc
    2 A$ E: i$ J1 u0 ^
  281.         xor     ax,ax$ l8 e0 t- i3 x/ ~4 y
  282. int 33h
    " E* X# k2 K8 T/ K* s# w* p
  283. cmp ax,0ffffh
    9 V5 G7 [" M& \
  284.         jne     not_loaded/ q- A$ K+ z' [9 j, W: t' `+ i
  285. mov [memcopy], 1
    & E+ ?' h2 s; F/ @% ~
  286. ret
    1 U! R6 \+ U+ |6 p; v" K0 _+ O3 y
  287. : Z/ F% r0 a! s6 @/ Q. l
  288. not_loaded:
    3 b. u" N/ R$ K. [. M0 ~: x
  289. - E+ P1 w$ [. ]+ H. L- b# V
  290.         mov ax,2574h
    $ c0 M5 t4 f5 P
  291.         mov dx,offset new_isr
    / W+ X: L) |  \2 ^' \2 {
  292.         int 21h6 B# R5 |9 o; O) s& L+ `
  293. $ |. c6 [1 Z4 w
  294.         mov ax,2533h" Z. J2 f5 W1 |9 I0 Q( w2 n+ k
  295.         mov dx,offset new_33, ]3 S1 h3 ^# U/ y. d. L: ^
  296.         int 21h3 p6 g* ~! j0 p3 l
  297. , Y9 M% V0 _/ E# P
  298.         cli
    $ d5 ]2 y% Z4 u; c6 E$ _* G

  299. 0 D% k, W* z1 M4 a" D8 J3 p
  300.         mov bl,0a8h, q7 ~/ ?1 l' O1 y( F
  301.         call keyboard_cmd
    5 q0 s5 A( p. [2 W) Z; w

  302. ! e6 ~3 l' X# z* n
  303.         mov bl,20h
    $ H6 f. Q6 f' B  _& x2 U$ a' d
  304.         call    keyboard_cmd, p+ l, R3 o% k# \7 L# v
  305.         call    keyboard_read
    ! i1 W# g# G: t0 o: q2 T
  306.         or      al,2: _2 U6 W; ]; ]# Y5 c( n
  307.         mov     bl,60h
    1 d$ ^$ L/ p# M& u9 D  F- p- s) T
  308.         push    ax
    0 c+ D/ j! r4 Z! w9 z
  309.         call    keyboard_cmd& T7 @& w7 F5 d+ E2 v$ y$ v1 A7 }
  310.         pop     ax
    8 T, y! s: }9 K7 _2 D, h; t
  311.         call    keyboard_write6 m- a" H" z( d" T" `# g

  312. 6 J0 w' @8 a8 k$ K" q4 K1 T# [
  313.         mov     bl,0d4h
    5 X1 Q8 n/ c5 ?% d
  314.         call    keyboard_cmd
    # q# H" u2 f% @  a& I  C. g
  315.         mov     al,0f4h
    7 I" L' j" H8 |* r1 w( q
  316.         call    keyboard_write. X& K7 F, g4 q! b8 S: O; K$ M
  317. , Y$ H2 C3 {( _, R3 e0 W
  318.         sti! ?- c! j  h( W0 c% ~; _( g& u7 K
  319.         ret4 v5 c# ^7 ~$ p; [) ~* _
  320. call_user_isr:
    ; w0 J& v/ P; z* R( E/ L7 G! c
  321. db      60h: H8 ]$ `5 c/ }" q2 D  t
  322.         mov     cx,cs:[pos_x]3 f; S. Y) @2 N! N
  323.         mov     dx,cs:[pos_y]
    # D9 I! V3 q( W, X: z1 A" g( f& Z
  324.         mov     di,0 ;cs:[x_move], ]8 ^% x; S& u" s& f3 {7 ~' j
  325.         mov     si,0 ;cs:[y_move]$ m, [! L8 l1 m5 u
  326.         mov     word ptr cs:[x_move],0
    - m$ f+ U. l* k! ~) N
  327.         mov     word ptr cs:[y_move],0
    0 ]6 O& X) I; s) s, T
  328.         mov     bl,byte ptr cs:[buttons]6 J3 ^& F2 N' Z0 E1 T* X
  329.         xor     bh,bh
    5 c; I, Y7 P0 x4 O" G
  330.         call    dword ptr cs:[user_subroutine]( D! ^% ]/ L  m. i( T
  331.         db      61h
    1 N5 X5 I% S+ x* m
  332. ret+ M: D6 c; @1 r
  333. new_isr:
    ! n0 G8 e% w& W( Q. s
  334.         pushf0 D3 l3 n9 s5 z6 \. }
  335.         cli+ f4 [6 |3 s% l# ]6 w) _
  336.         push    ax- e/ p  }( P9 ~+ ?4 a% F
  337.         push    bx# s. h  \  U9 Z3 P+ h" S# g
  338.         push    cx
    1 H) M% e/ M$ X& [# h  h8 y
  339.         push    dx4 Y: T; k4 t0 f( }" f/ h7 Z, l
  340.         push    di% P% ?  ^2 A3 k" `- O1 Y
  341.         push    si
    7 g$ e; T- }- J: g# n
  342.         push    es
      O( K. A' x8 }' c! g2 L6 L
  343.         push    ds
    / h) u3 B/ y9 q# u
  344. % ~$ U" k5 k0 Y3 h
  345.         push    cs! v' K% ]7 f3 X- q
  346.         pop     ds3 a+ A8 A; v# S) y

  347. 3 A' m" S+ \1 E* |  M: T3 I% x7 R
  348.         mov     bl,0adh- p; v5 c8 g  Y1 ]0 g, `% w
  349.         call    keyboard_cmd
    2 C, f( k- B# v& J1 ]) H

  350. + {, S* q- f& ~
  351.         cmp     byte ptr [first_time],0
    0 n9 p2 X8 S, G" p6 h
  352.         je      not_first_time
    * B( o. o) d3 |% O

  353. 9 j: h% Q  t7 C! O1 |9 |
  354.         mov     byte ptr [first_time],09 r6 i: H' s7 V& f
  355.         call    keyboard_read
    ' Q- O9 u- v+ y$ m9 j; d/ M
  356.         call    keyboard_read  O0 [# U3 b- x5 Q. L# T3 H4 e$ M
  357.         call    keyboard_read- K) S3 y7 P% p
  358.         jmp     no_show8 W3 }- g" d- [

  359. 8 m. u6 X, X1 H& B3 o0 y
  360. not_first_time:
    / N0 q( C8 |0 b. T8 a. j6 Q# N. G
  361.         mov     word ptr [temp_mask],0
      _" X2 g, v+ X/ I( \; `

  362. 0 m1 ]! Q5 ^3 P
  363.         mov     cx,[pos_x]+ g4 t+ E6 H; p$ \) \1 C! {0 H/ q2 F0 m
  364.         mov     dx,[pos_y]
    4 l- @2 A& [% U6 O8 D- T; w

  365. 8 V' V5 T# |4 ]: g3 Z  m/ @
  366.         call    keyboard_read! H4 }1 w- e) j% D  ?$ F
  367.         and     al,7 ;3
    ; L6 J( W& s4 O  H
  368.         mov     ah,[buttons]7 u7 j. z# S( }9 ^
  369.         mov     [buttons],al
    . w3 Z+ N: z- g2 K2 L. R+ W
  370.         cmp     al,ah% d% J: d. N5 J, S
  371.         je      no_button_change) U4 m& H- Q% x: s% N
  372.         and     al,3
    0 I$ R) k! d2 t- ^4 n8 h8 m3 v
  373.         and     ah,33 ?/ B9 Z+ f; h8 t4 H% ~
  374.         xor     al,ah9 p1 o. F! U$ d8 |& x) ~
  375.         xor     bx,bx
    9 `/ k2 ]/ l' o" j
  376. 7 p3 x( e% a5 ]! t9 Y7 }+ R2 S
  377.         push    ax+ g7 b( s( d+ y* L: B4 }. j7 N& n
  378.         test    al,29 E! C: K% K  ]. m3 M& Q/ l
  379.         jz      no_right_button_change; |# F3 Z9 c& y8 k/ Q9 n$ Q
  380.         and     ah,2
    " f* G* z; d* e0 I
  381.         jz      right_button_pressed$ B/ b$ T) h: {, q3 p2 Q( A& @
  382.         or      bx,16
    & x6 `) |: F0 f9 n
  383.         jmp     no_right_button_change8 q2 c7 D7 n: s; _) e: L  G- T
  384. right_button_pressed:7 e2 F3 X5 v+ Y, E
  385.         or      bx,8
    ! [' N  T- }. y5 N
  386. no_right_button_change:( `7 ^1 s' J$ h6 d2 P  [

  387. ! {% S- o4 o2 V
  388.         pop     ax
    8 C8 q& ^0 J4 L+ W
  389. 5 I# q0 n* q+ D- D- Q! V
  390.         test    al,1
    3 G: P7 A" ]- H6 [; n
  391.         jz      no_left_button_change
    3 S: K4 w; o. y5 ^
  392.         and     ah,12 c% f& {* C' f* e  r) V* H
  393.         jz      left_button_pressed: d, g2 }/ D2 m2 d; I+ f
  394.         or      bx,4
    4 Y- r) g5 j. [3 S
  395.         jmp     no_left_button_change
    1 o% `; D9 o  k8 U
  396. left_button_pressed:
    : ^7 |0 k, X, I- \4 p
  397.         or      bx,2  s6 d3 U9 H/ J3 k  I9 z! M( i" {" v
  398. no_left_button_change:
    ( e8 E3 r7 @/ `2 l& W" h0 |" u/ ]# j3 o
  399. , i5 ]& K: G  S8 m; ^* }5 R
  400.         mov     [temp_mask],bx- @, z* j  l9 Z6 t" w
  401. 3 O0 g8 x  z( `" Q6 v6 \  s
  402. no_button_change:# s+ `5 i9 k" B" N- {/ R4 M
  403.         call    keyboard_read
    . D& K% `( S/ _) U( N, R
  404.         cbw
    - S' \0 _% @8 s- m+ g6 o
  405.         add     [pos_x],ax
    3 N) @$ F8 n" ?6 W5 g! R# b
  406.         add     [x_move],ax2 U9 a: W. W$ k3 I, Y/ h% I6 t
  407.         mov     ax,[x_min]
    2 m# k$ @. s! A! x# I) S' u/ @
  408.         cmp     [pos_x],ax
    - l# G* O) w! V# P( S1 s
  409.         jg      good_hor1
    2 k& b' _" ?# I, H
  410.         mov     [pos_x],ax
    " q5 k: g3 N5 M
  411. good_hor1:
    + P& Z) D7 F1 k; c( E
  412.         mov     ax,[x_max]1 ~6 ~" D) l* A5 X2 O: B
  413.         cmp     [pos_x],ax2 Z. A6 l1 K) l: [6 z
  414.         jle     good_hor2$ H' ]4 C' ]* T) d
  415.         mov     [pos_x],ax
    4 x; ?2 r7 T6 n
  416. good_hor2:
    8 H5 p& Z. f* @% T' b% Y

  417. ) @$ D* w7 e2 U$ l, Y
  418.         call    keyboard_read
    * R1 m1 e9 {; c3 u
  419.         neg     al
    , Z! d( u- _3 n8 Q4 F) |; a
  420.         cbw1 w' c) I2 \3 A
  421.         add     [pos_y],ax! J8 V9 \6 Y& A
  422.         add     [y_move],ax
    : H& i* K, w* J
  423.         mov     ax,[y_min]" R6 l& w. {0 K3 B/ n! T: A
  424.         cmp     [pos_y],ax, T: r; t6 H# _( o# H
  425.         jg      good_ver1, T# I" T/ h9 H  y; Z4 S2 {6 J
  426.         mov     [pos_y],ax& _& R. H4 M# Q7 X8 H  S
  427. good_ver1:
    $ z/ v, w; R1 \4 r$ Z% N
  428.         mov     ax,[y_max]2 j- ^5 F- o. L. @) Y
  429.         cmp     [pos_y],ax# p* I2 L1 ^- }9 z
  430.         jle     good_ver2! D9 m5 Y& d! K- S; O& u
  431.         mov     [pos_y],ax
    0 Z# p! s+ D9 P  h; w
  432. good_ver2:
    / ~) b) a8 V, W1 e  {$ u0 ?
  433. , ~# @0 k+ R0 B8 j
  434.         mov     ax,[x_move]
    $ E3 B+ V  w4 H! Z4 `+ T: Z, {; ^
  435.         or      ax,[y_move]
    * `) l) Z9 a- H( g! G8 G
  436.         or      ax,ax
    - q! v) j, a2 B$ o4 ]( E
  437.         jz      no_change_position
    ' i2 x8 n$ Q5 H4 L& S( r  |0 L: U; T
  438.         or      word ptr [temp_mask],18 G& R2 N# R5 d: B
  439. no_change_position:
    8 l( A' J5 Q8 o4 z) x; r) K4 {
  440. * v, U8 q/ f& H9 @9 q. u2 g( \
  441.         mov     ax,[temp_mask]
    7 o1 c; p  k0 u# `8 _: w
  442.         and     ax,[user_mask]
    # \; T3 n/ h& w/ o, x# a; S
  443.         jz      no_call_user
    + _% n% o4 j0 n% ]
  444.         call    call_user_isr* p" |: W6 L" W# f
  445. no_call_user:' e4 m: F/ I. o! g* c
  446. . p  V6 p7 H* L3 h2 x
  447.         cmp     byte ptr [sm_flag],1
    % x. _* c( b# R0 E8 v8 Q" g, K
  448.         jne     no_show, a. B8 W2 x5 j% h+ W: z, z

  449. 8 ~7 s% ^: u' ?1 ^( B
  450.         shr     cx,34 l$ S, V! I$ S8 H
  451.         shr     dx,3) I$ e% P0 Q" Y" ]# _) U5 _8 {
  452.         mov     ax,80  }# `% y& `4 b3 w0 Z; @
  453.         mul     dl
    & l5 x( b/ |. D) b2 z- Z6 [
  454.         add     ax,cx3 t9 H3 X1 c  \# K- F* I% I  H
  455.         shl     ax,10 I; r, X7 i! ]# u0 V
  456.         mov     di,ax
    5 J& c  t8 r; \( h6 W' M! i
  457.         mov     ax,0b800h
    # l0 j7 y3 O; j
  458.         mov     es,ax3 n% x9 Q7 {: ~* d8 @0 C  g* [
  459.         mov     ax,[save_char]9 U& x1 E- V& A2 {9 ^. \5 M
  460.         stosw
    5 j8 O2 G* ^: k9 _1 a
  461. 5 K1 x; ?' m# _7 d: E
  462.         mov     cx,[pos_x]6 r! [( Y, k- h
  463.         mov     dx,[pos_y]
    . @, x7 a4 |' U. R( A$ I+ }1 m
  464.         shr     cx,3
    7 G' A" m# P6 `1 C8 ~: E
  465.         shr     dx,33 v- {- O7 }. f2 S
  466.         mov     ax,80
    / [% b0 ~5 V: k0 m' s. ~9 p
  467.         mul     dl
    + M3 ~: X4 S- s+ T5 |, K
  468.         add     ax,cx8 F# g2 ?8 s' z" V- g
  469.         shl     ax,1
    2 k- J- H. P3 a! d
  470.         mov     di,ax
    ; r; e. Q+ J8 H+ K6 u
  471.         mov     ax,0b800h
    9 _' r* n/ A9 \8 g- f
  472.         mov     es,ax1 L& j$ R/ [, A* ]7 [" e) s0 l( n  \4 |) I
  473.         mov     ax,es:[di]
      |# x( q6 e0 n
  474.         mov     [save_char],ax
    # p/ ^$ E1 v* Q
  475.         not     ah7 J1 B0 z0 E# Y: n3 u! z2 ~0 H! l
  476.         and     ah,7fh7 m0 U# a7 _/ F& |* i
  477.         stosw
    0 g4 J# O2 P+ A; k
  478. no_show:  I. S9 J/ }; g; W0 X% i0 s2 O
  479.         mov     bl,0aeh* o8 J( ?) }+ |" O/ o
  480.         call    keyboard_cmd
    ! O7 Q4 r( a& [' [! L  N1 s; l7 l

  481. 2 y8 ^* \: l8 J3 u1 g6 H
  482.         mov     al,20h
    , K  P0 `4 b: p# N) R
  483.         out     0a0h,al
    # N+ T* w# U7 j2 }. K6 m
  484.         out     20h,al
    $ P& T) L2 [6 D4 n6 e4 `

  485. + B6 i$ n8 t( g
  486.         pop     ds5 k0 H# O% \4 {1 f
  487.         pop     es* t# z5 v8 L8 E- e9 j2 J& Q
  488.         pop     si; V  E2 ~% R' B! r
  489.         pop     di* _$ L4 V: H; F  @7 W/ H; e
  490.         pop     dx/ d# J1 T) E5 R& n4 R9 \8 z" |$ ~
  491.         pop     cx0 c% o+ E+ w2 f" j: M9 D5 V$ G8 h
  492.         pop     bx1 D/ S) N/ }& H6 y, Z/ e
  493.         pop     ax6 l8 H! L  h- i% M9 l
  494.         popf
    ! x! u7 @. ~( q' o( d( g' V2 {
  495.         iret$ M2 f3 ~5 m3 D

  496. ; C- O% b8 c0 Q& G& R+ u4 i# w8 p
  497. first_time      db      1
    ! o  O9 r% p& }! _
  498. buttons         db      0
    ; |! B' w( W: [7 v$ C# B7 Y
  499. pos_x           dw      0* O9 G! \0 i' b& |" V
  500. pos_y           dw      0
    4 P6 }4 H( y. W8 u4 q; `# ^
  501. sm_flag         dw      0$ ]! u" Z. E9 L5 W  u
  502. save_char       dw      0
    . w8 u+ U/ I! p: s* G
  503. x_move          dw      0* e: F/ p$ M9 ?% [4 r
  504. y_move          dw      07 h; u6 v5 @/ I; [+ _
  505. x_max           dw      639
    6 C2 o6 t* N- k  D3 b3 N
  506. x_min           dw      0, g' f! A# n$ Z- t( L) v
  507. y_max           dw      199. c( @' s4 T" W0 ]4 x" i, m
  508. y_min           dw      0
    ' c9 H/ f, O" `
  509. user_subroutine dw      0,0( w6 @# U" @3 R+ N5 H
  510. user_mask       dw      0) C, C3 G: P. R7 ?. p1 A! I
  511. temp_mask       dw      0$ T" a5 T/ @- D7 w- U
  512. 2 _" [( {3 O: y9 Z( j
  513. keyboard_read:
    . c' c  J+ i0 ^1 [# o! Y& `
  514.         push    cx
    9 q& q: f) C0 h0 N& v! `
  515.         push    dx6 j  \9 V# `. p" T# {; o% X% v4 \/ c$ W
  516.         xor     cx,cx
    0 T% W+ q2 e7 L+ J: h+ Z4 k
  517. key_read_loop:( f% u+ }+ C* I
  518.         in      al,64h
    ) {3 v. j0 I- j& m
  519.         jmp     $+2
    9 `. V1 M: L9 a! Y: D% |5 }! ?
  520.         jmp     $+2/ a5 g& _( ^4 [+ x) @. M& h1 a
  521.         test    al,11 g, \* ?& I0 f( b" H
  522.         jnz     key_read_ready
    5 S/ W' k5 [2 e9 c! H
  523.         loop    key_read_loop
    3 `" |9 a2 u# _* A( v1 p, R
  524.         mov     ah,1
    + A; P+ z7 O5 p/ T
  525.         jmp     key_read_exit
    5 `5 c: s" V2 N/ G
  526. key_read_ready:
    6 o  K6 X3 f0 y2 I" E2 j4 ~
  527.         push    cx
    ( i# G2 w: v, }* \
  528.         mov     cx,32  G% `' v) j% _6 n( C
  529. key_read_delay:- t- ~- t/ T* [: M/ {& `8 W
  530.         jmp     $+2% C4 y& ~# ~( }1 |$ {' E3 {
  531.         jmp     $+2
    2 ?& g" L) R6 S7 l- ~2 T5 k8 f
  532.         loop    key_read_delay
    ! D: c; }0 Y! O- n
  533. % F* @" y' i, d& J0 F0 F
  534.         pop     cx  v8 y- Z8 e5 y! P, B+ {( y4 `
  535. % T3 o2 j3 e6 z# L5 M
  536.         in      al,60h/ g* ?3 l# f9 ]8 k4 [
  537.         jmp     $+2& O5 b/ `6 W$ Q& P
  538.         jmp     $+2# u7 ?7 ^0 M- N- J& J1 {  s
  539.         xor     ah,ah
    + O# S" `$ ^$ L2 f5 X0 B* g6 A
  540. key_read_exit:- ]" O5 L9 G+ C7 H4 N( Q! t2 @6 Y) z- p
  541.         pop     dx
    , `1 V& Z1 Q, t4 x8 L
  542.         pop     cx
    : e3 a5 x+ g1 Q% a
  543.         ret
    * E7 [0 c  a' t+ y& _
  544. 7 Y4 E! k0 a% {* Z  w# ?
  545. keyboard_write:0 m0 ]9 K4 y' V' L
  546.         push    cx; Z2 S" c( x/ a& {
  547.         push    dx
    # v3 U# ]) z$ D0 D9 {3 u
  548.         mov     dl,al* L- y6 K3 M" E0 r0 d: j) O6 e2 v! U
  549.         xor     cx,cx! K4 E( Q) R: j/ B) Y$ g
  550. kbd_wrt_loop1:
    : ]  g* L, E/ i7 G9 i
  551.         in      al,64h
    3 V% y9 y2 S3 N% O% k
  552.         jmp     $+2
    & b+ R- ?5 i5 }7 e
  553.         jmp     $+2# b5 w  K# x  w. z& f
  554.         test    al,20h
    $ {( m" X; b( [+ M& m! R1 |6 Y; h
  555.         jz      kbd_wrt_ok1
    & [" C0 D6 W4 g9 K
  556. " k) L' O" R5 }+ ]6 u
  557.         loop    kbd_wrt_loop1
    ; n2 {8 ], t0 S. ~& Y  W1 ]
  558. 9 n3 C) @2 o, C0 i- m* ^) F5 E& Q# d
  559.         mov     ah,18 t* Z5 r! h1 g6 v( p% P* u
  560.         jmp     kbd_wrt_exit5 b. J; J: K4 r9 E+ s9 {6 |

  561. 0 f6 L8 k& w$ i9 q9 ?' g2 x4 Y' `3 |
  562. kbd_wrt_ok1:
    - d: R) Y' Z" c( U. K+ i, p
  563.         in      al,60h
    ( [& v0 u+ b0 Z( y9 a" S1 ^

  564. * d) E% ^6 L1 J5 ]$ C: x
  565.         xor     cx,cx
    % I1 N1 X9 Q3 C  |
  566. kbd_wrt_loop:0 n+ g- Q" f4 K' N
  567.         in      al,64h
    ! i* d2 L4 g- }; d3 P
  568.         jmp     $+26 \- m# W' p1 R0 }
  569.         jmp     $+2
    ) o* h* s2 w" b- Z
  570.         test    al,2
    ! k& O' U/ v& h* }
  571.         jz      kbd_wrt_ok
    ( E% V7 g+ T- l* z

  572. 2 @, q" e+ l6 L' l9 f4 D4 a
  573.         loop    kbd_wrt_loop' v1 R  S! J* I
  574. & f( R: @/ ~, ]3 I
  575.         mov     ah,18 F0 k0 B# Z* T1 }& H- q' Y
  576.         jmp     kbd_wrt_exit. N6 r3 h4 ~5 m. p% V
  577. $ \3 n1 D" L: `
  578. kbd_wrt_ok:: g6 A$ z2 p. z/ M: M; j
  579.         mov     al,dl! j5 v# C" ]5 f+ M
  580.         out     60h,al7 c) K& r+ k* c5 f4 p7 Z  d$ [
  581.         jmp     $+2
    . l" {, s# t- M' P( D& j  A
  582.         jmp     $+2
    9 `; D! F" X5 n% L4 m2 x% t

  583. ( A& U! I' \; R
  584.         xor     cx,cx
    6 E0 I3 \0 q2 p: Y! o0 ]. ]
  585. kbd_wrt_loop3:5 A% F/ A* Z: y
  586.         in      al,64h
    2 b+ }& q/ B1 Q3 U( l
  587.         jmp     $+2) H) Z' w& j7 Z; P/ h) U
  588.         jmp     $+2/ j9 X. a; }6 }( C. O2 y  q( E
  589.         test    al,29 O+ g& K- \7 }& K! U
  590.         jz      kbd_wrt_ok3
    : |% b( V" w6 X* W' G

  591. , e9 O) l- v% k+ u/ c9 E
  592.         loop    kbd_wrt_loop3
    , ]) y" H% y0 o6 u
  593. % o% f- y, r$ }% ]# ^, x) O1 k
  594.         mov     ah,1- @2 m2 j1 `6 O! |- g, ^% h7 t4 ]
  595.         jmp     kbd_wrt_exit, A: O: F  e: s9 `- c; B

  596. - `! `& w! A# S) B  \+ w4 C& S7 j0 {
  597. kbd_wrt_ok3:( K  @4 G; U- E
  598.         mov     ah,81 F/ R# d; }3 a3 J  p8 P
  599. kbd_wrt_loop4:+ w$ f8 ~3 v' Q/ w9 D
  600.         xor     cx,cx
    3 o3 i# q" @; F4 R$ I/ r6 `* L
  601. kbd_wrt_loop5:9 a6 Y- C" A6 k; j
  602.         in      al,64h
    3 {5 L+ q+ O3 F3 X: V% E/ I
  603.         jmp     $+2
    / C; u& Y: b( h  s
  604.         jmp     $+2( M8 v& f9 K( w' R9 H
  605.         test    al,11 M" }: O3 O0 {
  606.         jnz     kbd_wrt_ok4. q' B, L  k6 R+ Z9 c) @9 U  B
  607. / t( U, Y0 p) q# j8 h
  608.         loop    kbd_wrt_loop5
    7 b' ]( E8 I' c* ~3 {9 M0 ~

  609. , `9 h) u. j' e
  610.         dec     ah
    ; I' K6 W! _5 D# n% u
  611.         jnz     kbd_wrt_loop4
    & O0 D; c: J/ `* _6 q
  612. ' d, h' N$ \' h- S
  613. kbd_wrt_ok4:
    # N7 [3 F- f" B! h- ]' p
  614.         xor     ah,ah5 c7 P7 ]% z, _. Q
  615. kbd_wrt_exit:' T+ E' P3 ~. z% L5 ~
  616.         pop     dx2 Y/ T9 s8 m$ d* u! i6 \* ^5 G
  617.         pop     cx* a0 Y7 y& `1 c5 U+ l
  618.         ret' k9 \: f/ u7 {' T) R
  619.         , ~1 V+ i' d  Q4 }, h/ k
  620. keyboard_cmd:
    4 |! h. ~3 v; A: @9 F
  621.         xor     cx,cx
    0 D0 I" Z/ Q4 ^3 ~& n
  622. cmd_wait:' l/ _/ B6 H- N( {" t7 I, q
  623.         in      al,64h
    2 s0 \4 \" J' y# r8 I
  624.         jmp     $+2
    5 ]8 D7 J/ S. P7 k1 Y
  625.         jmp     $+2) Z4 U9 d1 m/ q, F1 |& j- S
  626.         test    al,2
    + U& }6 b. l6 j$ C# n
  627.         jz      cmd_send
    , A: O0 g( x' Y0 ?8 O" r5 N
  628.         loop    cmd_wait
    $ r1 T$ L$ y* P, F  V
  629. 1 x1 A8 d7 h6 z- U: ?3 C1 n
  630.         jmp     cmd_error
    - f( E3 c. P# ^. v8 Q: y
  631. ( u6 `0 G/ t: m/ M& k9 Z' |
  632. cmd_send:' I: `/ f5 q# l8 k& H8 z: d
  633.         mov     al,bl0 e+ N1 `( x' F. D! K/ c2 ^3 C
  634.         out     64h,al
    # L$ V9 Z0 A4 Z5 \9 R
  635.         jmp     $+2( ?1 P! y4 H" `' J) F$ L2 c
  636.         jmp     $+2
    1 U5 T: i- J7 Z; ^7 y' o& ]  r+ L

  637. 0 a& t( L: A' I" v$ n: @4 g
  638.         xor     cx,cx
    3 c: y4 `* O9 r; z& y% l0 d
  639. cmd_accept:
    % `8 a" J2 e* S" F' y' B2 p
  640.         in      al,64h
    9 \2 L7 B  N& Y4 R0 z  C
  641.         jmp     $+2
      R3 Y; ~3 G3 o$ s/ v& H1 u& J" Z7 |
  642.         jmp     $+2$ G( r; }- C# b# \, d- L% Q7 r+ K
  643.         test    al,22 d9 Z% k# G# X/ T
  644.         jz      cmd_ok- N6 R- g$ _9 P- a' w4 ^. d+ Y# u
  645.         loop    cmd_accept
    1 A, \7 }- c- }' I4 I! r
  646. ; L6 \0 I8 x- l, v
  647. cmd_error:. g% S; P7 s+ X
  648.         mov     ah,1
    ) n, ]$ B2 \$ ]; _3 Z1 S
  649.         jmp     cmd_exit  y- z% T5 q! N' i
  650. cmd_ok:% u; \4 b' D2 k- ]8 B
  651.         xor     ah,ah( I) }9 w" G2 L" J
  652. cmd_exit:
    , G& u9 t6 P) @% I
  653.         ret: X" b6 A( [, M/ a5 d% P
  654. ! v3 A* m' }$ Y7 @( |) ?: ~
  655. new_33:, Z: K0 n6 h, g  ~. l5 S' i
  656.         cli6 @" q) B8 T' f, c. f# H7 z$ n
  657.         cmp     al,0
    & R' H# Y* V8 r  {2 q
  658.         je      reset_mouse
    : y, _3 D9 I3 J0 w/ O- g
  659.         cmp     al,1& M- ]$ S" n1 f
  660.         je      show_mouse. T7 O7 j1 F( O6 M9 m& K! G5 X% s# a  y
  661.         cmp     al,22 Q) V8 G1 r! C/ T
  662.         je      hide_mouse
    1 N- w# f  W4 N, ~5 t
  663.         cmp     al,36 I7 t3 T% o- N
  664.         je      get_pos
    1 Z  L5 W, q7 l: Z
  665.         cmp     al,4- V5 M) m+ y; ]7 y$ P. ~
  666.         je      set_pos
    ! R) @  B9 F$ t; c$ F: v3 C
  667.         cmp     al,7
    # e" s9 C/ l2 }& l
  668.         je      set_hor_pos! \# z4 n) w9 \$ ?3 r$ T
  669.         cmp     al,8
    " Z0 e5 a' V  r6 @3 ^9 _  ?
  670.         je      set_ver_pos
    ' I  }+ v2 w1 v  y
  671.         cmp     al,0bh; s# c  n8 `* k* z6 l
  672.         je      get_mouse_movement
    & y1 r0 v0 k. n9 Q
  673.         cmp     al,0ch7 m) p' G4 U# u% Z
  674.         je      set_subroutines
    8 e2 P7 v4 P2 [& `( j
  675.         cmp     al,14h- N  l, K8 n" F9 B% [+ T
  676.         je      swap_subroutines8 J6 m# J) p6 G1 c9 w
  677.         iret
    ; }* I1 l  b" e) K/ ^% _- o
  678. # H9 G6 p3 ~4 P# s( o
  679. reset_mouse:
    0 {6 S6 A$ t* R! l$ H
  680.         jmp     _reset_mouse5 A+ W8 J# w7 b6 t
  681. show_mouse:  x/ ]4 S6 l3 V0 o, T7 z- F. ~  U
  682.         jmp     _show_mouse
    : [) Z- W3 G5 T, C. p' j
  683. hide_mouse:
    0 U( j1 [' ]1 j/ p
  684.         jmp     _hide_mouse  D: E& ~5 c: w# R( O/ K2 [
  685. get_pos:
    - D) Y( f/ @5 p5 S' v. q
  686.         jmp     _get_pos9 F3 o+ D! {1 x/ R# T
  687. set_pos:
    ) J. \( C! s. O6 a8 I) r5 T
  688.         jmp     _set_pos2 Q1 _. p) m) a( H  S/ t
  689. set_hor_pos:
    . R7 \" j" s  q1 }4 X$ u0 J
  690.         jmp     _set_hor_pos
    % N2 u) ^# u) y. L% n% H; d
  691. set_ver_pos:
    7 u- u5 ^7 [( J5 N: ~) p& {5 c2 @
  692.         jmp     _set_ver_pos
    , P, v: A( Q/ p9 m; h
  693. get_mouse_movement:
    + n* k: R! W& Q2 v/ n4 o' R, \1 i) H2 H
  694.         jmp     _get_mouse_movement
    # `$ r/ X' z/ f2 J9 f8 R
  695. set_subroutines:6 C/ }( S. Y5 {7 I3 Q, o( u
  696.         jmp     _set_subroutines
    . o4 `: c1 I+ E1 ]2 P* f
  697. swap_subroutines:
    , I- F; z: q+ \5 t2 p
  698.         jmp     _swap_subroutines4 ]% V" o1 J& e- |, ^5 ~
  699.   C: \' W; a- _4 a( C0 B/ i1 d9 U
  700. _reset_mouse:
    & X0 H/ \5 R* X( H3 H. A9 }1 I- @
  701.         mov     byte ptr cs:[buttons],0
    9 C3 |( y8 V' j- E- h1 q
  702.         mov     word ptr cs:[pos_x],06 |0 B$ t8 c9 P+ U/ Q5 I
  703.         mov     word ptr cs:[pos_y],0
    ; _( O7 Z" ?: n) s6 N
  704.         mov     word ptr cs:[x_move],0
    : E9 T# L: Q$ a# F/ Q
  705.         mov     word ptr cs:[y_move],0
    ) P3 a; D6 _3 T% f3 p! n
  706.         mov     word ptr cs:[x_max],639; W1 n; `# ]- D
  707.         mov     word ptr cs:[x_min],0
    : |8 _/ @1 n: ]
  708.         mov     word ptr cs:[y_max],1998 x) o( R3 _+ A! M' \8 X, f
  709.         mov     word ptr cs:[y_min],0$ W9 A/ `+ }# T, A- B& b) p  Y8 R
  710.         mov     word ptr cs:[user_mask],0
    ( Z/ k+ I% [+ ]. ?1 Y: ?$ i& ~
  711.         mov     word ptr cs:[user_subroutine],0
    3 J6 |0 C: O/ x; M/ H. Z; Q4 s
  712.         mov     word ptr cs:[user_subroutine+2],00 ]; [' e( x1 d- K3 Z, _4 |
  713.         mov     ax,0ffffh
    1 _9 n% |4 a  ^( C/ g  V# O9 I
  714.         mov     bx,3
    5 t& N+ E$ l( z. E5 `
  715.         iret0 P: g1 K$ n" q% G' w: w. r2 q5 v
  716. * ?( f# m* v6 c" `
  717. _get_pos:
    ) a, G9 r2 J- v7 H+ M
  718.         mov     cx,cs:[pos_x]
    , R8 e& y$ o, G) T9 b+ }6 _5 E: p
  719.         mov     dx,cs:[pos_y]: P$ m% q- [' c) V* R/ N
  720.         mov     bx,word ptr cs:[buttons]4 v( I' w, S) F! L9 y* Q3 d
  721.         xor     bh,bh- B" k# c6 ^- ], [
  722.         iret
    + ?8 Z9 [& c% B8 X- Y

  723. ( O7 F: z  y2 h2 y! \2 K/ p
  724. _get_mouse_movement:
    " z, D- u- S1 r
  725.         mov     cx,cs:[x_move]
    ' i- L  q3 ?& }9 z2 ^9 N& ?
  726.         mov     dx,cs:[y_move]
    5 g2 f4 h, J, v
  727.         mov     word ptr cs:[x_move],0# a7 V+ }2 V$ p
  728.         mov     word ptr cs:[y_move],0
    : ]& Z7 [& q0 B- u, C& f& L( f9 q
  729.         iret
    % f/ n# J) s; r; A
  730. 6 n4 S4 Z' y$ D
  731. _show_mouse:% N* e( w: c# {+ M0 I
  732.         push    ax$ L. c, W9 N  W% R4 e
  733.         push    bx
    ' P- C- F$ v$ R: {0 j
  734.         push    di
    / l+ B; S; d# p
  735.         push    es9 s; P+ Z: D* p, a
  736.         mov     byte ptr cs:[sm_flag],1
    8 h& r! `3 q$ w& q& b
  737.         mov     ax,cs:[pos_y]' h# u( @# z. o3 n8 y
  738.         shr     ax,3" r3 s# m. @) z1 g3 \' {; W
  739.         mov     bl,806 |& L) `( V; i: _! j7 ^
  740.         mul     bl
    + L# w/ _3 ?1 @, Y% ^
  741.         mov     bx,[pos_x]
    ' j. J7 ]9 d0 @1 ], h2 \! m
  742.         shr     bx,3
    & Z4 G, n7 F, o# z5 ]
  743.         add     ax,bx. A& t# |& M/ V* L' d/ ~# h
  744.         shl     ax,1% a5 {1 J& K, }* a' Z* q
  745.         mov     di,ax% n+ X0 u( ?- G
  746.         mov     ax,0b800h( e' u6 P4 \& m2 w  C
  747.         mov     es,ax
    " S1 @2 e6 c+ z; L' s6 w
  748.         mov     ax,es:[di]
    ! i) c8 r1 I- Y) H9 Q' t6 b
  749.         mov     cs:[save_char],ax& H; U/ B& O' E% q
  750.         not     ah
    2 K4 I5 a0 A  j
  751.         and     ah,7fh8 H& p. A1 b; B
  752.         mov     es:[di],ax
    * F0 @. U. k' M) F8 @" u
  753.         pop     es- p: Q3 p: U3 K
  754.         pop     di: g1 v* P6 Z9 M
  755.         pop     bx2 y3 N: Q) ?: P1 N
  756.         pop     ax
    7 `, L- {2 ^. J3 ?, f- x
  757.         iret5 E) O! ~  |* W

  758. 3 ~; E9 C# d5 W4 L! m7 x' ^8 X0 ?/ u
  759. _hide_mouse:
    ( P9 h9 m2 q" P/ i' f8 e
  760.         push    ax; J' N- Y% \! h. i4 y1 }7 J0 }' E: S
  761.         push    bx- i! p/ `0 ?" b3 J* v  y4 @* ^* H
  762.         push    di
    9 N+ v' k- c: `7 o9 I
  763.         push    es
    $ s; v3 s3 J" \' T' ~$ H7 K% J7 d
  764.         mov     byte ptr cs:[sm_flag],0
    ; F" C- c3 D+ R  f& v: m5 j
  765.         mov     ax,cs:[pos_y]+ _9 k) g- }* h" t' P  i
  766.         shr     ax,3/ h: _% s9 x% ~8 t5 ~
  767.         mov     bl,80) f  p& S$ t# _, _7 _8 d
  768.         mul     bl/ a% {7 E3 w& A
  769.         mov     bx,[pos_x]# W2 R& b4 A& U' K
  770.         shr     bx,3; Z" g- ?" i  |1 O
  771.         add     ax,bx
    4 s6 I4 |; n* y9 g* \6 [
  772.         shl     ax,1
    & w- g+ `' x( `
  773.         mov     di,ax/ u8 ?2 k1 y$ p+ o
  774.         mov     ax,0b800h% h0 s. k. |# o+ J0 A) t
  775.         mov     es,ax( x" I6 M* V0 Z% I# W
  776.         mov     ax,cs:[save_char]
    1 \* J  L! f7 w6 F4 p7 L. s
  777.         mov     es:[di],ax6 N2 V% S8 |+ `; `( i8 U# y
  778.         pop     es2 p% M1 e- K! h  }  F, `
  779.         pop     di; l  G( I: `) I9 s( j, q
  780.         pop     bx
    : v$ l+ m; O! v
  781.         pop     ax9 D7 b; y0 y% l; w
  782.         iret
    9 r& F3 g3 k  @0 R. w: A4 t3 t' Z6 M
  783. ' `1 s+ q/ ^! r6 e& e- D- }+ v
  784. _set_pos:0 D, u" u, p! r- B
  785.         mov     cx,cs:[pos_x]. a& b3 A  ?% k: p5 Y0 ~
  786.         mov     dx,cs:[pos_y]( g( M! ~6 W' L9 l, d" Z
  787.         mov     word ptr cs:[x_move],08 g% N' z$ U6 a+ a7 d6 ]
  788.         mov     word ptr cs:[y_move],0
    ( u" K$ n4 D* \' Y, m
  789.         iret
    / F1 P  e+ B9 ^: v/ ~) Y6 ?4 v

  790. 8 n. W) I4 B1 f  `5 V. d; f
  791. _set_hor_pos:
    $ d$ ^, P2 d+ N0 k% W4 x1 N! X
  792.         call    max_min
    3 n/ W, u9 N- G8 e- m' Y2 s
  793.         mov     cs:[x_min],cx" r, I# i7 g- u3 ?! E: X
  794.         mov     cs:[x_max],dx
    # G6 [6 |+ `) m  z) M
  795.         cmp     cs:[pos_x],cx  R, `" M+ \; c0 m2 b& y
  796.         jge     good_hor_min
    # ?5 F% O% [) A/ t2 t, @. x
  797.         mov     cs:[pos_x],cx
    " }  B0 R' P2 q/ \& J1 `
  798. good_hor_min:5 ]. Q: }! z  Y& b% c6 `
  799.         cmp     cs:[pos_x],dx
    2 |" d/ v* a% o+ q9 a3 h) S
  800.         jle     good_hor_max
    & T, g; T: j+ g# b" C  s5 i
  801.         mov     cs:[pos_x],dx
    % j. `& J. O3 D. X+ {5 J
  802. good_hor_max:
    0 ~* n7 `( _2 H( j+ ^
  803.        iret( D, b4 Y0 a  g: d/ G0 S4 [

  804. 4 p% _' s- n& y8 j
  805. _set_ver_pos:
    $ {  c  L1 ~5 h2 x
  806.         call    max_min
    5 @; ]+ Z6 q1 p9 w- h$ Q5 S# O. k) `
  807.         mov     cs:[y_min],cx8 l& p9 P3 q. }+ n. {( X- H! f. `
  808.         mov     cs:[y_max],dx
    7 W, f( n  q* A! a
  809.         cmp     cs:[pos_y],cx4 g  ^$ ?4 C4 d
  810.         jge     good_ver_min  n1 T) F  L6 L/ v
  811.         mov     cs:[pos_y],cx; r5 `& }: a- f
  812. good_ver_min:1 p3 O  i7 P7 }
  813.         cmp     cs:[pos_y],dx! B& T+ B. L7 Q
  814.         jle     good_ver_max$ L  N: G3 Z. d' z& w
  815.         mov     cs:[pos_y],dx
    7 a% m7 q! v( I$ `1 f/ D' W
  816. good_ver_max:
    : p: p4 h/ o2 e* \+ ]! \4 e# ~5 H( L
  817.         iret/ C+ l, a+ |3 s$ ~3 e: m$ v

  818. - ?0 z, c- ]) Z
  819. max_min:- r- b0 |% O9 _3 c, d
  820.         cmp     cx,dx
    , F9 n  c5 f* `* O) m; Z
  821.         jle     no_swap
    5 t7 m5 t% t/ y3 a% o
  822.         xchg    cx,dx0 Z9 K7 [5 H! N# V( i3 Q
  823. no_swap:
    7 S4 Z5 y6 _: J
  824.         ret
    2 L2 t) R+ K9 H, k9 b
  825. 5 S1 n+ \! n6 G# A. Q8 T: |
  826. _set_subroutines:
    # m6 a  d* c  a9 \
  827.         mov     cs:[user_subroutine],dx6 R: `' f5 `3 ^
  828.         mov     cs:[user_subroutine+2],es
      z* M2 [3 Q: O; Z
  829.         mov     cs:[user_mask],cx2 r5 N. B) f; V0 ]) s& N
  830.         iret1 |# y+ u/ G1 r; X+ G8 |8 M
  831. ' V+ |( w* U' Z" \
  832. _swap_subroutines:
    6 ~6 y9 _" L) M2 e
  833.         push    word ptr cs:[user_mask]
    . `$ C! S5 v+ b8 [! m) l' x
  834.         push    word ptr cs:[user_subroutine+2]  N  U2 |, p3 C. v, i
  835.         push    word ptr cs:[user_subroutine]+ W) N7 t1 p4 H$ G
  836.         mov     cs:[user_subroutine],dx
    & X- e  \& t+ c& l& l
  837.         mov     cs:[user_subroutine+2],es' _' u: n8 g% Z7 R& ], k7 J
  838.         mov     cs:[user_mask],cx2 e; V  H% f0 x* {7 T
  839.         pop     dx( J6 o) T9 H/ O$ D' n: ^/ G
  840.         pop     es" x  F, W& a+ X6 Z" c8 U% E& |
  841.         pop     cx8 n; J5 X) }3 O
  842.         iret
    ' T/ a# g* m  S; E5 i+ k
  843. 3 @1 v# |1 s# y2 g
  844. memmouse        endp* M2 |1 n8 `3 P+ E4 l
  845. 7 h$ R7 A/ R' Z% H1 d
  846. endof_start:
    4 p/ E" H6 N! c6 Z; Q

  847. 5 j! m) O. m0 i; P. R
  848. emsg db 'No mouse driver install error!$'% ?: c) i9 |9 [" B4 \9 e& l
  849. old331 dw 0
      _8 m- [  {6 z) u* `* J
  850. old332 dw 07 y5 L5 G$ K: r
  851. old741 dw 0
    , o1 w# S. r# z( r2 Y% }
  852. old742 dw 0
    ' i4 b- f( F% n$ O, T
  853. memcopy db 0% m6 y. ?( O  r3 e
  854. okcheck db 05 S# X+ f% n9 ]8 Z5 q7 Y8 ?
  855. pass db 0; o+ j0 n- i; T5 B! r* M( j
  856. chkl db 0' P7 T7 t8 c0 [+ B8 n, H
  857. lk db 0
    9 [; L9 l5 l4 X7 \1 M2 ]
  858. chkr db 0
    $ c4 E8 {1 N" B
  859. rk db 0
    + e$ d9 O4 @& r6 G0 j5 V6 J
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '8 l& Y5 Q8 o7 }5 \! w$ j+ S
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '$ b9 p+ _. y3 o2 k
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '7 U: {8 B: {6 a% h2 P2 X
  863. db '                                                                                '6 ~# E1 d& _# {3 D9 Z
  864. db '                                赏屯屯簧屯屯突                                  '
    9 K8 ]" [/ H# J  L- K3 r
  865.         db      '                                ?OFF汉OFF?                                 '
    ; F; r4 n4 a! f, Y+ {
  866. db      '                                韧屯屯既屯屯图                                  '
    ! ?0 a6 L% m4 k" v3 C8 `
  867. db '                                                                                '# i- g& K, Y% n$ S8 |
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    5 \0 y; _# J6 H6 w% U4 x
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' : i' q5 R: K' g, ^6 R
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '1 y3 n0 r+ H8 ]* x, s

  871. & d  B# B6 {( W( g, Q( w5 P
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
8 K' j! Y. z7 |$ Q+ C& [4 A哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... : }& R5 X' f, S8 q0 x$ l1 {- Y1 j

3 f8 e+ G' U2 `2 G: @8 O# E谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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