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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
& X# B& Q. k4 y9 u- z4 c7 Z3 {* w* @( Y
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;! N6 _, D1 z% D" z1 P
  2. ;          Ufoit PS2 Mouse test program   Ver 0.93 S% S% s7 Z) D2 a# L2 C& {
  3. ;                                         By Bini.Yi 易祝兵
    ! i  s  A$ |7 P% ]2 j; Q
  4. ;                                         http://www.ufoit.com 计匠网, M% s4 R9 x% v/ @9 b: q& q0 @
  5. ;                                         2002/04/06 YYYY/MM/DD$ D, \# t* S% e1 v( K& p
  6. ;% B6 ^! g. e! p* d& b- L7 E- ?/ A
  7. ;          . c9 I/ |( j3 Y7 q/ z# T
  8. ;          This program  test the mouse button  click and move.
    4 H, P6 M/ I7 f% o& f% M7 [
  9. ;8 A3 b1 |2 q/ x1 M; |" ^0 g

  10. 7 R3 I& ]8 B2 S& H7 a# z8 Q0 x
  11. .model tiny
    $ O; T+ P; V0 Z$ ]! M7 E3 f" P
  12. .5863 F9 L! {6 E  Z
  13. .code
    $ l0 ?6 `1 r4 c4 m, `
  14. .stack  100h
    1 C6 S  [& _( U- J2 n& l0 ?
  15. .startup8 \& u' h4 Y4 n$ i9 L
  16. pusha7 Y! r+ T4 n' E1 W+ w6 |9 l6 {( l
  17. mov ax, 3533h" V$ j) f7 P  q! \
  18. int 21h' N5 H- ]- n) {, o
  19. mov word ptr cs:[old331],es
    ) ]9 F; v' h  G0 z4 e# j
  20. mov word ptr cs:[old332],bx( C! b! H9 C8 I7 G
  21. mov ax, 3574h0 A) f! o8 t  \6 x6 u
  22. int 21h  O4 ]. D3 a7 k' b4 p
  23. mov word ptr cs:[old741],es
    ) {9 t- F% A% U& w: W  G+ b/ C
  24. mov word ptr cs:[old742],bx6 C  ]+ j1 _8 j! C
  25. popa( D$ e1 t, V0 H4 N5 b6 m9 N' k
  26.         call    memmouse" G$ N2 v! u& `. l- l; T1 d
  27.         mov ah, 006 g& G6 @  D3 _% U
  28. mov al, 038 K/ K( m. G/ X' k4 t
  29. int 10h* M, j- b  y& J# \
  30. mov ah, 06
    : t% i% w, }8 \* o# u
  31. mov al, 0, q  C- D9 X1 F- {. J
  32. mov cx, 0+ `# F9 W# |1 `
  33. mov dh, 24% \& i" e: \+ B1 {, S
  34. mov dl, 798 t! H7 w. z3 ]3 k3 o  n" l; E
  35. mov bh, 07h
    # [/ T* y9 q6 R! J2 M; O  k
  36. int 10h
    + A+ _7 U2 N# x
  37. mov ax, 0000
    ' T. H& o$ m" G3 K$ d. {
  38. mov bx, 0002
    + D% R3 W1 n& H2 K5 x8 ?4 q( R
  39. int 33h
    % N5 [! K; I( C# T. w. [7 t
  40.         cmp     ax, 0000           ;if no mouse drive install% N0 a$ e) H( x# s' H; b% O( b
  41.         je      errormsg           ;show error MSG
    # F$ f0 }7 {+ ~& E4 f: @% S; j
  42. mov ah, 02
    1 L( J  X$ S, k& k1 `
  43. mov bh, 00
    / D2 R& V$ u. v* s' k2 u
  44.         mov     dh, 25             ;Move point out screen! z' O4 j7 ?/ |( S
  45. mov dl, 79
    ! K" X4 ~& n/ q' k8 s- _, s) @3 i
  46. int 10h% h% q2 _5 U' W$ ?" t: P& U5 @
  47.         call    showmsg            ;Show info
    " @' \$ A- t4 P8 g) H3 D
  48. mov ax, 0001  v  k2 O7 I+ z$ \# M7 [
  49. int 33h+ R- p8 U  A8 u& g9 P, b2 }
  50. ; mov ax, 000ah4 W: P3 w3 P) u7 Q" ~4 \
  51. ; mov bx, 0000
    - y3 D& I0 G4 r) _* ?& \# J
  52. ; mov cl, 0h
    ' o9 s  \* j* i: i) R! m% t
  53. ; mov ch, 0F0h* @# c! R: g$ b5 t) U
  54. ; mov dl, 0h
    / r( J  f  C# M
  55. ; mov dh, 0F0h3 _; h+ Q* f% w+ n8 j" O. m
  56. ; int 33h
    6 n- ^, C7 m. F
  57. mov ax, 0004h
      h% w6 V7 h5 T) S. C- ]
  58. mov cx, 0319
    3 k' u1 [, V! x& Y- S' @& ^
  59. mov dx, 0103
    : |4 ~2 M8 O* O2 _
  60. int 33h- H0 `2 f& V0 F( v$ ?0 @% `" C
  61. casemo:                           ;Case button click and point move
    * [9 H! F( i. x7 G1 |
  62.         mov     ax, 000bh         ;and keyboard press
      Y4 U/ I9 E1 J# p  K
  63. int 33h6 e" h0 Z+ i1 g! k" O. e
  64.         cmp     cx, 00h           ;if point move....X
    3 ]* ~5 e- N* E, C* d) e, K
  65. jne xmov. R4 V1 i, B1 E& ~9 B# ~
  66.         cmp     dx, 00h           ;if point move....Y
    + F+ v+ l0 t2 J; m  O1 u
  67. jne ymov  |' q% w- H- F/ ?$ z0 R
  68. xymovend:                         ;X.Y move end. O) l  r% f* `* i: @  a; g# ~( J
  69.         mov     ax, 0003         
    $ W" K) A# U# F  w  }$ Z
  70. int 33h7 n- c1 o- N) b, r! M
  71.         cmp     bx, 0001          ;if left button click  show ON$ X$ {5 }) _/ l5 f1 i8 O
  72. mov si, 1828; n9 Q/ H6 \& Q; X7 N; m
  73. je listl+ Y: y1 r" C# P; c& l4 z) e) L
  74. mov si, 1828/ v  a) R" X( F6 V: B) N' A
  75.         jne     nlistl            ;if left no click show OFF/ @, i* Y  j3 ?
  76. testr:
    , o) b1 X; p1 X. T6 q  m- f* B& Q3 U
  77.         cmp     bx, 0002          ;if right button click show ON. U- u) f. l0 T, O6 _' W' B5 ^3 H
  78. mov si,1842) A0 _+ x9 v7 K5 V
  79. je listr8 t/ m, B9 k2 v1 @6 \2 r
  80.         mov     si,1842           ;if right no click show OFF
    # O% a! m& p  r& Q5 t9 k1 ?
  81. jne nlistl; J( n8 K! y% a
  82. casekey:* \& _9 ?' N; }& Q  H$ t& [
  83.         mov     ah, 01            ;if any key press jump check. N2 R  P! f! q2 X
  84. int 16h
    4 {, @4 e( Q# J# w, R
  85. jne kpress: a- E5 e# I/ s2 i2 Y/ ^  T
  86.         mov     al, [chkl]        ;check x flag# \7 ]! D8 `4 g5 s! i* w9 q/ a
  87. cmp al, 02h
    6 d- f/ T2 h& f
  88. jnb chkok" J" Z1 `- ]& X  Y$ S* I& f9 E9 B7 t
  89. jmp casemo
    % F6 d" X8 z& U& K4 I
  90. xmov:                             ;if X moved, get the X flag+1, P% w# k$ r' N2 U: `1 P
  91. mov al, [chkl]
    + ?2 t0 b- o7 w+ E
  92. inc al
    - y' e! F7 W0 {$ e/ ~
  93. mov [chkl], al4 |  S% X6 X' B: D& r$ L/ Q2 F
  94. call passok2 f( N$ a! B( p& ~5 G6 ^% y- d
  95. jmp xymovend- L$ Y( j) Y( t" |( V& U) u0 n
  96. ymov:                             ;if Y moved, get the X flag+1
      H; R" S. G  Z
  97. mov al, [chkr]
    0 c' c2 {7 H: x; O
  98. inc al) `4 K, }5 S% m  H
  99. mov [chkr], al! m$ A- R* H: k+ @: d4 \
  100. call passok7 D- ~; M: h4 u, _
  101. jmp xymovend
    : {& r4 K2 Y  I0 r
  102. ) A5 B$ ^. @# G: u0 M! o/ ^4 r+ H* U5 U
  103. passok proc near
    : }  s& L0 G; ^" M! C+ p
  104. mov al, [okcheck]
    & K8 s1 H0 S' `+ h( ]
  105. cmp al, 12 O! D# _7 y# a
  106. je let0
    * ^3 P$ q6 O! P5 n. M% a
  107. jmp passret
    5 k7 X# C( k" ?3 L# V  i
  108. let0:
    & `7 F; c2 T- _: e; b5 S
  109. mov [pass], 1# O2 g, y. B8 ]8 o' b& B
  110. passret:) c1 k) Y1 m' ^$ T/ I. _# d
  111. ret1 K& O& E9 a1 d* U# P. U
  112. passok endp - C/ S0 E) ]2 @; _
  113. 0 R7 G! ]# ]) ]3 e
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    - F) F& \( Z* e
  115. mov al, [chkr]5 o  E8 O  [# ~2 Q- S
  116. cmp al, 02h
    2 g. ~5 Y; h3 r& M* t
  117. jb casemo
    0 M) q7 n$ n9 K! c
  118. mov al, [lk]
    8 n" O* y! k" \; W' N) _' S
  119. cmp al, 19 S+ x' y$ u" i) n0 O
  120. jne casemo* N- _. j1 C6 }$ j
  121. mov al, [rk]
    / C$ @$ b) w% I) O8 p: ~
  122. cmp al, 12 k0 H, n7 p- H2 O/ |
  123. jne  casemo
    " Q4 l1 F8 I' E4 q7 L$ b7 x
  124. mov [okcheck], 1. X4 E& G4 Z2 M4 n5 T, `. M  w+ |! N  S
  125. mov al, [pass]
    8 E! R2 z1 o3 N8 ~9 i+ Z& O+ G0 S
  126. cmp al, 1
    ; s/ g6 Y; @# H4 Q! \. A3 [
  127. jne  casemo% q  T" s/ v$ o  B9 D5 k+ O
  128. mov ax,0002h  k5 p4 ]7 l8 \$ c& I$ z  z9 X. s
  129. int 33h5 \# e) C) n' L( Y- }2 r: \
  130. call cleascr
    ' l" W7 d2 `- \1 ]3 F

  131. , s( z; S# G, |0 V' y4 l
  132. call oldint! ~' i& n* ^' B
  133. mov ax, 04c00h) ^2 b# _8 T" v) Q3 J
  134. int 21h
    7 `, z: l/ s: i1 h1 x" H$ ?

  135. * ~+ d" n* Y# V5 K8 o' F5 P2 @
  136. okexit:
    * D$ j9 w; @4 B' I/ V$ t- S& }% E
  137. mov ah, 4ch
    . T# u- b7 n+ B, D  J0 j
  138. mov al, 0
    8 T* I# C6 t( v! i( M0 E+ N
  139. int 21h; {3 X5 @3 U: B
  140. listl:                                 ;Show ON
    2 D2 [, x+ v; P4 K( V# p8 x$ g
  141. pusha2 Y1 J! A5 Q2 O2 L$ f7 y
  142. mov ax, 0b800h! e# m9 v7 v: j5 Q, j/ O
  143. mov  es, ax7 R# I; C3 w2 X3 d" I/ C
  144. mov ah, 47h8 f9 Q# h$ s4 y1 C
  145. mov al, 20h
    5 J% S0 v7 w/ J9 t- A+ _
  146. mov es:[si], ax
    4 @! c& b2 V0 }1 y$ L/ O
  147. add si, 02
    / H3 k1 J! X5 w4 p% [
  148. mov  al, 4fh/ L$ Q; }" H# z+ r& w! \1 h: ^; f
  149. mov es:[si], ax: [6 L! d' P0 k" s: Y
  150. mov al, 4eh8 _! e2 h0 C* m
  151. add si, 02
    9 G/ `* }& e. _! m3 `0 V' S0 ?
  152. mov es:[si], ax
    8 r* I0 f" ]% D2 ]' `" ^9 Z6 P) D- n8 D
  153. mov [lk], 1
    ) q" F  H3 w* O
  154. popa
    ) ?! `9 m* N" V# `1 v$ x% j
  155. jmp testr
    ! {/ K5 i* ?9 f# b8 H8 G
  156. listr:                                 ;Show ON( B' [4 }0 b4 V7 c
  157. pusha+ f2 F0 [  J1 O' Z* V  D* Z
  158. mov ax, 0b800h  ?4 T: [3 H# j: V! _; o- ^
  159. mov  es, ax
    : f6 ?0 Y8 i9 x4 c( K
  160. mov ah, 47h
    6 _( o) n% u5 ]! J% l
  161. mov al, 20h
    / p. c1 R! p. `$ d3 S- S# K
  162. mov es:[si], ax
    , n6 G! z$ Q1 U6 I5 ^8 \8 J
  163. add si, 02
    / [3 `* }9 G- @8 Y; o3 r/ g
  164. mov  al, 4fh* F/ S3 F+ s: }
  165. mov es:[si], ax; C* z: t6 O6 w  C* H' z
  166. mov al, 4eh
    : ~/ {8 T) F2 Z9 b' F# Y0 t
  167. add si, 02
    5 c* n+ d. @) A- F: j
  168. mov es:[si], ax
    " Z, A1 G  p3 L) w" ^: h4 ?
  169. mov [rk], 1
    " q. b) R' Y5 E, L- |, [
  170. popa# j6 c) ]) w2 m5 L. B& p2 u) }0 N
  171. jmp  casekey- g2 h8 P/ Q" W) p- j

  172. , \. h* K- J: ?1 [( `3 V7 R- G
  173. nlistl:                              ;Show OFF0 B0 r0 Q, S3 e& e3 @7 ]1 @
  174. pusha   
    % v  z0 Q7 x- a4 w  e* C
  175. mov ax, 0b800h" `6 `0 u" b" e7 @
  176. mov  es, ax" S* ?% B6 Q& x; V2 p! ^4 m: f
  177. mov ah, 17h
    : ]/ l; f. a' H, B$ @+ S0 o
  178. mov al, 4fh
    ' F8 T& `1 R% Y# _
  179. mov es:[si], ax
    # @2 f6 d5 `+ A7 y$ f. }, f
  180. add si, 02
    4 [2 H! d. f; G5 y* d. J
  181. mov  al, 46h
    & Y  L! U8 V, x! j! N
  182. mov es:[si], ax
    ! s8 @6 a3 c# v8 |& i
  183. mov al, 46h( Z2 |1 }  q! s3 d- J
  184. add si, 02
    " J" R5 j# d8 o
  185. mov es:[si], ax% k: ]+ s% k. ^* C  b
  186. popa5 C: ^" l0 {' _/ @
  187. cmp si, 1840
    - p  A! n+ F: K5 m' ~8 j% y
  188. jae casekey
    - E( U0 O* T% w! l# A( S
  189. jmp testr
      r) D) R8 F( y
  190. 0 v9 h6 F/ H) I3 u: ^; |
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    3 x) d# @6 ^: A% R6 N, V- i
  192.         cmp     ah, 01h             ;and return a error
    , F7 `0 [7 J, ^: I2 ]. K, ^* l! U
  193. je exit1
    & x! j0 E5 `( z0 M6 m) _: C% s
  194.         mov     ah, 0ch             ;if press other key then clear- t8 [3 |! ^% ^* x* E0 W2 E
  195.         mov     al, 00              ;keyboard buffer
    " H1 Y6 O6 ]! w. m4 H" s# T& _( ]
  196. int 21h, D( Q* G8 _$ n1 F+ @0 \7 A# W( h
  197. jmp casemo 1 O! a2 H7 J- c  ~" S4 |
  198. , }0 o5 E: m: R. a* E
  199. errormsg:                           ;if mouse driver no install
    . u% r6 w+ I5 Y
  200. call oldint
    0 ]1 p- F* x5 U' u+ ?2 J! h* A
  201. lea dx, offset emsg5 V; g* V7 \/ a0 e4 n
  202. mov ah, 09h% b9 p% d+ f+ f" m  j% s! d
  203. int 21h5 O  G! ~3 p* x# m- X
  204. mov ah, 4ch, N% q4 C: T- |9 N- V
  205. mov al, 28 K, e  t( a4 ?5 b+ r$ ?
  206. int  21h. m* [/ Z, J( B1 e0 g% w) M# a

  207. ( W1 A' _& [+ Q, u6 y7 V* w
  208. exit1:                              ;error exit8 u/ k+ H* F! M+ J" Z% D
  209. mov ax, 0002h! s) Q! U; [8 f3 v4 s/ w( F+ K
  210. int 33h
    & w7 d/ R5 |7 @
  211. call  cleascr0 p0 k2 X3 z# e7 l
  212. call  oldint' l; T: z% \+ x  \+ ?
  213. mov ah, 4ch, w8 ^+ s( j8 Y
  214. mov al, 01
    / ^6 I; V& ?6 a% v
  215. int 21h
    & q+ w' X8 K# n, W5 y" ^0 D& Q
  216. ) L6 |8 Q, L# Z) h# E- P
  217. cleascr proc    near                ;clear screen, U0 \  l1 Z& E$ @( V
  218. pusha
    + H" @  @" l. o6 N# k
  219. mov ah, 06
    % e! w) F% S% o8 d) ^
  220. mov al, 0" x* F2 a5 i) n  S
  221. mov cx, 05 X2 b) q7 M2 g; y6 K5 A. D
  222. mov dh, 24
    ' ^' g$ L6 q4 Q3 i
  223. mov dl, 79
    9 k8 i" {# F  X1 V! J! ~
  224. mov bh, 07h7 _( I) K& H1 d
  225. int 10h' v4 y% G4 H1 x) M1 ]( {
  226. mov ah, 02
    9 e4 U, I/ P+ H
  227. mov bh, 00
    ) P7 f+ w% N( L3 p$ I
  228. mov dh, 0& N) S5 T4 L. c( R+ i4 q" d
  229. mov dl, 0
    3 i% \2 ], g! y4 \# `5 R; J
  230. int 10h
    7 e/ l' c& m& i1 ?. J- C
  231. popa& G2 `9 j, n1 V5 g) a4 i7 |3 V
  232. ret
    1 `& K2 x5 @" y9 o8 \+ E$ D; c2 u
  233. cleascr endp
    ! t+ b# b8 V3 K1 n1 Q+ y& F- ]) X
  234. 7 V2 X! |4 D, K# i
  235. showmsg proc    near               ;Show info/ G# Y* {* {. k9 e
  236. pusha
    $ s  g' `& `# v1 {
  237. lea di, offset showms" g5 x  [$ k2 ?0 \, d9 z) i* F+ [: {
  238. mov ax, 0b800h) @$ K8 F" N! D# h
  239. mov es, ax
    6 Q. K+ f9 H6 X$ H( I7 L
  240. mov si, 0
    ; ~4 c6 o6 c: y5 m# J
  241. mov cx, 480
    & l2 p% q: \  F, Y. i& S
  242. mov ah, 07h4 g+ E. p( K6 e( w! `! [9 {
  243. @@:
    1 \$ W  k+ ?+ V0 m  h0 i& J
  244. mov al, 20h0 T0 y& t4 G* `) s7 M+ }3 N
  245. mov es:[si], ax
    " L2 N' S+ s* ?# w
  246. add si, 2( F8 n; I, \+ j( ]8 |5 _
  247. loop @b
    " J, _7 c2 F  y* n$ q3 G
  248. mov cx,880! V: u/ l! r5 G0 y0 C  r7 x4 l' |
  249. @@:
    ' e5 w* M" f2 {- B
  250. mov al, [di]
    9 z6 R9 e/ v! Y6 N- I5 a
  251. inc di4 S& K+ O( B6 r4 h2 I. m" P/ \
  252. cmp al,20h7 T( h% J5 _4 X! _: O3 Q
  253. je showch1
    7 U8 p, L, [! N8 c
  254. mov ah, 17h
    * f& k7 E& B8 X  Q' k  D
  255. jmp showch3 2 L( F/ g5 `( t  w/ U
  256. showch1:/ @2 s1 h  R4 N0 f, S
  257. mov ah, 07h
    7 h2 S5 w  e3 o1 }& ^+ J/ _3 P
  258. showch3:
    3 y7 C$ p/ @& f) u7 ]
  259. mov es:[si], ax
    " ?. u/ t" J( M' |! p
  260. add si, 2
    % o8 l8 o' h; z# P( _4 s
  261. loop @b
    0 G( d$ P2 A5 g
  262. popa3 o+ G& |4 c9 k! P7 o1 Z& i
  263. ret
    7 f4 F2 K8 e0 d0 F# F
  264. showmsg endp
    + ]2 u  M0 D, U( q3 Q/ Z

  265. + ]4 Y8 z8 o' m' [2 ]8 h) X
  266. oldint proc/ L; W: I. m: F; V
  267. pusha) @8 Y  h* w* G2 f' ]) k# E) K
  268. mov ds, word ptr cs:[old331]
    1 N2 h! C7 E( @' }8 r% \: ?5 u
  269. mov   dx, word ptr cs:[old332]
    / O$ C# {- ]/ z. h& R. {
  270. mov ax, 2533h
    ( \! e* }, R7 o
  271. int 21h
    ! X/ y% T5 X1 W, u2 ~  ?
  272. mov ds, word ptr cs:[old741]0 t& k9 f" H' n8 y
  273. mov dx, word ptr cs:[old742]
    1 w' x$ [% w. u+ C- w" j
  274. mov ax, 2574h  s0 y6 m& h* h1 T% u5 W0 i
  275. int 21h
      k% ]& ~4 l# m  `( a
  276. popa
    - V( k" ?0 W" @" H6 r
  277. ret
      @/ l2 u7 U' p2 s
  278. oldint endp
    7 \; T5 O5 C: k" o$ L# G: \& O

  279. 5 B0 B& b+ ~8 c$ y( R9 b
  280. memmouse        proc5 j" U9 s) y( X8 K7 L7 i) f
  281.         xor     ax,ax
    - r* E, C5 n+ ^, D/ U
  282. int 33h
    8 ?) t5 ^' x8 X1 t. Z. U! B7 T
  283. cmp ax,0ffffh% k; Y! t" p9 o# C/ W
  284.         jne     not_loaded  |- }9 B* G7 p4 h4 z
  285. mov [memcopy], 12 `6 Z+ e9 |8 l( ^0 Y
  286. ret, M( V4 a- Z+ a; T, V* U$ x

  287. 3 Z1 s: M/ F# h$ h# Y, R' z& v
  288. not_loaded:; j2 o8 d5 V  U6 z/ F) W" v7 H7 h

  289. 4 L1 w$ @1 s* U6 |- |
  290.         mov ax,2574h
    / ?2 F) _2 P  N. b3 [
  291.         mov dx,offset new_isr
    9 w' z7 z1 }! K
  292.         int 21h2 G2 |0 Y5 u( f: T- l! `

  293. + I9 M0 V3 `, P' s& j$ ]
  294.         mov ax,2533h- ~2 n0 b% p8 U! I
  295.         mov dx,offset new_33
    + ]) g$ |, F3 [# ^  ?) @* K0 R, I6 j
  296.         int 21h( k# r. }# z5 L$ }9 K
  297. 9 t3 E8 y3 k1 z$ }$ x: O
  298.         cli* I9 U5 v; [2 x
  299. 4 A1 x' c4 o2 b: D7 A. h4 P
  300.         mov bl,0a8h
    7 f" f4 I: Q  m" Y1 D
  301.         call keyboard_cmd. Y& A  b6 x; u8 K$ Z% D. t( s
  302. ) ?  K1 z, t+ ]% d8 j$ d7 Y4 e- \
  303.         mov bl,20h! r: E: I3 Y/ Y6 O0 {
  304.         call    keyboard_cmd
    % y6 s, e! D8 y0 u
  305.         call    keyboard_read
    , P2 m: ]; i8 v( b
  306.         or      al,2
    : A; y& ?/ _1 ^  M# B. T
  307.         mov     bl,60h+ x) u- k' p- [
  308.         push    ax: C2 @+ V# f6 n" |2 o$ B
  309.         call    keyboard_cmd
    + C7 k0 M3 A1 M/ i
  310.         pop     ax
    1 ^, Z% A1 W" K% C
  311.         call    keyboard_write' I/ Y$ W- U* Q) s
  312. / l* p1 d0 I9 Y5 L$ t
  313.         mov     bl,0d4h5 W- T# `' t  _3 ^% s* s
  314.         call    keyboard_cmd
    % q8 C# s# R8 D$ V, p
  315.         mov     al,0f4h/ g, {8 [: P# o* m) c
  316.         call    keyboard_write
    : T/ ]1 _; s5 r  V* o' Q) D6 e! m, b

  317. + P: S9 y& t& A8 I3 G& ?  v
  318.         sti
    2 m3 v, ]9 L# `& O
  319.         ret7 Z, ?( f0 h+ F
  320. call_user_isr:
    0 E. m6 [% T8 c# {% g
  321. db      60h  A2 p# M3 M+ L) W& T" Z
  322.         mov     cx,cs:[pos_x]" Q+ f: q9 M( l) Y6 P9 Y; j/ T5 u9 D
  323.         mov     dx,cs:[pos_y]2 n8 n" n" n, T* S' t0 n
  324.         mov     di,0 ;cs:[x_move]
    + U3 o3 b4 I+ F) m9 b. g3 _
  325.         mov     si,0 ;cs:[y_move]
    4 {7 s% d" B4 k9 z
  326.         mov     word ptr cs:[x_move],05 ~( O( z$ \+ ^1 w2 J
  327.         mov     word ptr cs:[y_move],0
    : K) m5 K% C1 O) h9 d. _: J, X
  328.         mov     bl,byte ptr cs:[buttons]
    0 C9 G/ w6 ~) z( z
  329.         xor     bh,bh
    5 B2 J" ]6 Y) m4 w* ~9 E
  330.         call    dword ptr cs:[user_subroutine]) c" X/ }0 Q; K* H$ D  q
  331.         db      61h
    9 K& c' A4 r! U
  332. ret
    & c3 J8 M2 u' H9 q# g! X$ s
  333. new_isr:
    0 N1 x, V" E$ _5 Q' L
  334.         pushf$ r8 D; C* I8 @2 T! X$ Z# K
  335.         cli, D& v+ |( b6 H. U+ R" s$ D4 Z
  336.         push    ax. d, k0 G- [" L1 i- j: ~# c
  337.         push    bx; a/ {  a6 {$ M/ L: D" D/ n* X
  338.         push    cx2 x: b, J( U4 n7 [4 g
  339.         push    dx$ _" U9 w  j/ n  E( P  D
  340.         push    di
    ! n- W" E9 X8 E; I6 l
  341.         push    si+ a% x) F) e+ {. m2 _% G
  342.         push    es
      z9 t5 o* F; k( H* c
  343.         push    ds' o) p( \- _1 C
  344. 0 N' h* D( D" s. u% |% n* J. |, W
  345.         push    cs; Y7 q, p% w: Q
  346.         pop     ds
    & `) X  l+ c% K# b; o& a
  347. 8 d0 h: U6 d, E$ e$ x
  348.         mov     bl,0adh8 @. h) ^+ [) a7 I/ |" h9 Z
  349.         call    keyboard_cmd
    : Q9 ^* A8 U2 K

  350. ( C3 s( G0 U! e) s3 ~3 \) o/ t
  351.         cmp     byte ptr [first_time],06 d. a  }, R1 O8 C
  352.         je      not_first_time
    3 u' R2 l8 v$ e# V& x9 p

  353. ( n+ H" }9 o' M0 h6 R. G: T' s5 S
  354.         mov     byte ptr [first_time],0
    & i' ^3 n$ s0 T
  355.         call    keyboard_read: [8 o0 |3 f" q) [; ^* J
  356.         call    keyboard_read
      h/ O1 R% e) K$ t" z# a
  357.         call    keyboard_read/ d  K; p8 _* c8 F/ X# q# }: T
  358.         jmp     no_show
    . Z( G3 D: [# {+ k
  359. ! h6 G" k8 c  ^- @( I
  360. not_first_time:' P! {$ V. S+ ?' J
  361.         mov     word ptr [temp_mask],0
    " e2 B, J' b7 {; Z

  362. % r) J1 E+ R" F7 m
  363.         mov     cx,[pos_x]9 F* s' @3 V# \4 C
  364.         mov     dx,[pos_y]: Y+ t% ~: |8 F

  365. ' D" L! Q+ @' a# d! h$ S) b+ Z
  366.         call    keyboard_read2 i' g2 o8 ?( s8 E' ~) D
  367.         and     al,7 ;3
    " M; o( _8 b: }3 p. {
  368.         mov     ah,[buttons]/ h- O# R7 {* V. a
  369.         mov     [buttons],al9 Q8 W! ^  d( C$ g
  370.         cmp     al,ah
    & j3 E+ o1 h4 E1 W, C( c. y
  371.         je      no_button_change( s% f1 y* U3 Q% s3 M; F
  372.         and     al,3
    , \+ f  t1 B7 o& f
  373.         and     ah,3
    * j% m7 {) r& O2 n* p" i
  374.         xor     al,ah
    3 `8 \# U: N* K7 p  Y  h  J- ]
  375.         xor     bx,bx
    5 o* D6 E1 W* ^8 r+ v% \
  376. 3 b9 S) W* ^7 ~+ x" V% A
  377.         push    ax
    & X/ [) G: ?# J0 }5 _
  378.         test    al,2/ M) l$ |& U* L6 @& s0 H4 _' |3 R
  379.         jz      no_right_button_change
    # P  u8 V0 F+ B" S7 }4 r
  380.         and     ah,2: C7 ]- D$ H/ n5 _/ y$ _4 K
  381.         jz      right_button_pressed6 H% Q- C+ S) q) ^
  382.         or      bx,16! H( t- s3 B% ^
  383.         jmp     no_right_button_change
      q- `; C) X4 P! }
  384. right_button_pressed:
    8 b* t! E+ R# ]7 E& d4 ?( ~) @8 a
  385.         or      bx,87 p1 i9 h7 m4 ~0 Z
  386. no_right_button_change:! i8 b' y- u& p% @2 m; O

  387. 3 n) w7 ^$ S/ |0 \2 K! Z+ }. \2 A
  388.         pop     ax9 P) J" o* ]1 }1 G0 f( C  q
  389. . U+ \, N- H. o8 Q2 a( l! o, g
  390.         test    al,1- n, B4 A8 j% T$ M
  391.         jz      no_left_button_change3 s2 R) S( }7 n, O- w8 F( d
  392.         and     ah,1. T# c6 Q3 X. r2 l
  393.         jz      left_button_pressed
    8 d, s: T, ?6 Z% n
  394.         or      bx,4) W7 Z. a  I3 w! m! f
  395.         jmp     no_left_button_change+ B# R9 T+ W0 @2 U3 N
  396. left_button_pressed:; g1 A( G8 b3 G4 x
  397.         or      bx,2
    2 v! |) K* V* n4 m6 W3 P; Z' t
  398. no_left_button_change:
    ( I( |- J$ C$ r7 |7 M: J* I- ?

  399. ) x$ A7 h6 z! s) T( e
  400.         mov     [temp_mask],bx
      T. x- c8 F' S; x5 X9 `9 c, z
  401. ( ], d: o6 D7 o$ _, x- C
  402. no_button_change:
    . p4 [) t5 Z3 M. g5 T# Q
  403.         call    keyboard_read' t$ M% Z" P5 x$ j
  404.         cbw! V% b( n3 R" o( I
  405.         add     [pos_x],ax
    ; e3 `, K& `* B* t/ ~
  406.         add     [x_move],ax( O* W& G: Z* A* M+ B
  407.         mov     ax,[x_min]
    & @* c& E) s' _4 {1 ^1 E4 o3 ]
  408.         cmp     [pos_x],ax1 D$ L3 a$ I4 a1 p
  409.         jg      good_hor1/ {3 F4 s7 {! S$ I  q# q# ^6 D& Z: l
  410.         mov     [pos_x],ax; l7 }, p2 Q& P; @' S; F5 D/ s# P
  411. good_hor1:1 W7 q- z4 n6 G* w* w% w
  412.         mov     ax,[x_max]
    ' e9 T4 B" |4 C4 f" n! d
  413.         cmp     [pos_x],ax/ t% @# i. M8 t
  414.         jle     good_hor2
    1 ^( p1 c* Y# a7 Q- g; s
  415.         mov     [pos_x],ax; k3 I+ l- h+ n- r# y' k
  416. good_hor2:
    $ p& o2 w# W) H0 M8 ?

  417. 0 ?& S5 x7 w5 o3 [/ Z. v# N  p
  418.         call    keyboard_read4 d9 e9 P2 a8 ?9 ?6 i$ y* D
  419.         neg     al
    ! S8 I6 @1 q' h% }& L$ Z$ Q# N
  420.         cbw
    ( O: S- e: H3 F$ x3 x5 L; a& g( ~
  421.         add     [pos_y],ax
    7 g% a. \4 N7 H, X, V. \
  422.         add     [y_move],ax* C, }( O5 Q6 y: V. o- M" F
  423.         mov     ax,[y_min]- l. [% E, d0 s* r! \2 K/ _
  424.         cmp     [pos_y],ax0 b8 L$ e+ x' P0 x. E
  425.         jg      good_ver1
    % H" n1 ^/ r2 a
  426.         mov     [pos_y],ax
    . u9 M2 _$ c4 Z' t- k5 z8 J
  427. good_ver1:9 @; b  w- B4 u; Y% L2 Y: D/ A
  428.         mov     ax,[y_max]
    4 @2 f  k" m) q$ L, }9 p/ g
  429.         cmp     [pos_y],ax
    % b- _4 F" E+ ^( `
  430.         jle     good_ver27 Z1 D, X& r( _8 U7 F0 Q
  431.         mov     [pos_y],ax+ N- d& `! y9 u: w+ P; Y4 w9 @
  432. good_ver2:% _; h4 D3 S- |
  433. % {# ~, y7 S8 Q3 ?7 O
  434.         mov     ax,[x_move]1 u+ d- F& J8 |9 Z, \
  435.         or      ax,[y_move]* n0 R3 Q8 I6 a) i0 q5 t
  436.         or      ax,ax. D# n9 ]( _* x: H9 v( {0 P1 H3 {& z
  437.         jz      no_change_position9 s! J: a9 L4 r& l4 G3 e* P
  438.         or      word ptr [temp_mask],10 y' F1 C# [' r# l% E/ L% P1 F
  439. no_change_position:
    3 K8 p# W! r1 h# q7 o
  440. - l5 }. s" T. \* |
  441.         mov     ax,[temp_mask]5 G+ ^; L2 T; a
  442.         and     ax,[user_mask]% o* @. i) K# z; i* J
  443.         jz      no_call_user
    % q1 f/ P) _7 P: I& @2 r. [0 q
  444.         call    call_user_isr, Y9 Z4 k5 J, Z' g
  445. no_call_user:
    * c+ T* G1 A6 P

  446. 9 ^7 J# D2 \' S0 `
  447.         cmp     byte ptr [sm_flag],1
    % [6 t+ W/ b/ I% u  A
  448.         jne     no_show
    . Y0 M; N( d- ~5 [' m  \

  449. * y( [# E+ D' ~3 V% q5 z
  450.         shr     cx,3
    4 T1 i9 J  M* A6 K3 z
  451.         shr     dx,3
    / }$ w, Y+ x; `$ H+ T  s
  452.         mov     ax,80. B9 @* l: L" ]3 E# f* ]! k( I
  453.         mul     dl7 B  d& ^( i! C# v4 Y# K7 F
  454.         add     ax,cx
    8 p/ {7 P+ _4 D9 o. S5 l- I  h+ d
  455.         shl     ax,1) B, f& I" }- D. K/ {
  456.         mov     di,ax
    8 n7 c3 \* U4 o& h8 U1 |' t1 ]5 F
  457.         mov     ax,0b800h1 X) m% [" q. G7 `% a% [
  458.         mov     es,ax
    $ v* o* L+ h! U2 C2 ]) c* F
  459.         mov     ax,[save_char]5 q: K% `6 t- H+ @8 s
  460.         stosw
    $ q5 L( O' ^6 m

  461. . ]  ?( g' N3 N. x  p( ~' b0 A
  462.         mov     cx,[pos_x]# W0 ?) L6 n1 k( G. F2 K
  463.         mov     dx,[pos_y]+ K. |7 C' B, @: R  Q& y) Y
  464.         shr     cx,3
    3 f1 z" ], U6 u" e  _: _9 `3 ~
  465.         shr     dx,34 u0 j0 B7 e3 P
  466.         mov     ax,80
    % t! b: h  g  {  n* r
  467.         mul     dl* b& }" z# i7 l* m1 ~( n" u! j
  468.         add     ax,cx' S1 I4 d; j! D, S" J- p6 u: s
  469.         shl     ax,1: b! ]* u4 O' @
  470.         mov     di,ax% r1 b' k  N$ }+ i3 V3 j3 w
  471.         mov     ax,0b800h1 Y. m& F) A0 Z. y6 x, H
  472.         mov     es,ax
    & a2 {. V  C0 ^' C6 r
  473.         mov     ax,es:[di]! H; ?- N" R% K( p/ }
  474.         mov     [save_char],ax
    " a, q" E- c; s) S' ^' A
  475.         not     ah; P4 q( `$ I! ?+ ]) {
  476.         and     ah,7fh
    6 O1 L$ J3 i( d& H  y5 b( d! a
  477.         stosw7 ~* K' q- R2 U: E& v2 N& {* A
  478. no_show:6 k8 Y, l9 l8 g7 o" V9 C
  479.         mov     bl,0aeh4 N" h! D5 ?$ k2 v
  480.         call    keyboard_cmd% ]- j# }; Q; v+ k# q& o2 k! R

  481. 9 o) s. x2 e! ]" V1 c/ V6 ]
  482.         mov     al,20h
    + L; f3 z; _0 G
  483.         out     0a0h,al
    * d. O& ^! ~% A9 G6 I: r
  484.         out     20h,al
    , W- v1 c  b% q9 n

  485. / [7 X5 Y! V) f  i  E1 Q
  486.         pop     ds3 X! I8 I. ^2 Q' P; F- {: p
  487.         pop     es! ~5 b& d8 `5 t* Z2 |6 o  w
  488.         pop     si
    ' g" I% x( H8 `8 L1 D! @3 ]" F
  489.         pop     di
    7 _+ g3 C$ a% q9 u5 h" {
  490.         pop     dx
    " }: z+ H; U5 O8 S2 {+ ?+ ^
  491.         pop     cx
    4 B; G4 R1 r: _' y, e
  492.         pop     bx& t3 U+ u6 t- g: `" K
  493.         pop     ax
    0 R# |) I9 s- x% E
  494.         popf! z! Q, R. i- D2 @. b# C
  495.         iret
    ( u, j. M" p( O

  496.   C  A) U. C5 A* X6 a
  497. first_time      db      14 f2 p3 M" n: t
  498. buttons         db      0& `. s: M2 v6 P! m$ p9 e; k
  499. pos_x           dw      0
    2 J' f' n' o: Y$ U0 X7 d8 @
  500. pos_y           dw      0
    , ]+ G1 ?! Y2 K' v1 Z6 K4 `. r. d
  501. sm_flag         dw      02 \0 Z) H4 Z# e# [+ e- y, e
  502. save_char       dw      0
    ; ~* |" @% E) `2 R
  503. x_move          dw      06 P1 e' i' s& H* W
  504. y_move          dw      0
    / U( y) c: y# G
  505. x_max           dw      639% H7 o( J& b. _. U2 V
  506. x_min           dw      0
    & a& M) l0 C3 T: A
  507. y_max           dw      199
    ( k6 s6 Z" f" Z1 L1 C0 M5 }' [
  508. y_min           dw      09 R! H% u/ S* v1 Y# d
  509. user_subroutine dw      0,0
    0 |" z; ~: F% o% ~/ l7 a7 _
  510. user_mask       dw      05 D8 }, h( ]+ t* O! {" j
  511. temp_mask       dw      02 B( e9 o* y" H+ V

  512.   K. Y2 |& l0 |) C' e; U$ S2 C
  513. keyboard_read:
    ' x6 N6 O- P$ V1 p; y8 s, }9 N
  514.         push    cx7 `& Q' G% r( U0 Q# S+ T8 y) \5 \
  515.         push    dx# \1 E, N! \) g9 X4 `
  516.         xor     cx,cx
    ; R/ R8 _( `: T/ [7 N' `6 e
  517. key_read_loop:" F& m8 _; P* b) @+ J/ o
  518.         in      al,64h
    : {; }9 o/ d2 m0 }( k* b0 E
  519.         jmp     $+2
    ( `* ^5 n$ i/ ~
  520.         jmp     $+2
    + N0 b0 a7 r# P2 \# h
  521.         test    al,1
    / q2 [* z! B4 X& o' X: v
  522.         jnz     key_read_ready
    $ U- L2 v3 v  ]
  523.         loop    key_read_loop* L* F! J! S6 ?% C
  524.         mov     ah,1; A4 q. X  y; ~1 S3 A
  525.         jmp     key_read_exit
    3 _. a& t3 k' P5 T  J- C
  526. key_read_ready:* P' G- w; ^- d. C
  527.         push    cx
    3 q; \; L9 z7 F. E3 ]4 L
  528.         mov     cx,320 A7 \7 O  |" f" p* b1 T: k* E
  529. key_read_delay:( C) K1 a) z+ c) ]
  530.         jmp     $+25 L) p2 O8 w/ y
  531.         jmp     $+2& V# t. H) _9 K; |3 W
  532.         loop    key_read_delay
    # _7 A7 e4 |9 _" j
  533. 7 S/ p" g5 B9 [
  534.         pop     cx
    & K: o  Z$ v6 |4 G& B3 l

  535. + o$ r* J6 i6 {8 v% i* \
  536.         in      al,60h5 {  a: v! J$ S
  537.         jmp     $+2
    + _# i! {( G5 y5 r
  538.         jmp     $+2
    ( l/ i% q0 J+ ~* N
  539.         xor     ah,ah
    8 }7 v; p  r) F" t' @
  540. key_read_exit:
    6 i4 E3 L" o) n! `/ p
  541.         pop     dx1 R, H% ]4 j6 U: u. N: a- P
  542.         pop     cx* Q3 B( A7 Y, r9 Y; ~6 O' `
  543.         ret
    ' d7 T; F9 F& E( c0 S% b4 ^# E" ]
  544. 6 p. b$ {# d/ ]3 j0 Y
  545. keyboard_write:
    ' Q, D2 p" y! k8 S: d6 T- J
  546.         push    cx
    " ?5 g1 O1 w  l4 i4 @3 |% D
  547.         push    dx
    0 e$ {* k" J$ z9 ?" E8 b. o2 |
  548.         mov     dl,al
    / x/ Z$ c1 F/ m- Y: C8 G
  549.         xor     cx,cx
    ! Q: U4 R6 R  m& q
  550. kbd_wrt_loop1:, P' `3 u3 {/ B' e/ e! s2 ]- S8 w2 I5 m
  551.         in      al,64h
    / [( t) y8 L. q
  552.         jmp     $+2
    3 b$ O0 R( M0 j. X
  553.         jmp     $+2: _- d+ G. m5 o
  554.         test    al,20h5 s. L- }1 ]; m1 n% x8 s
  555.         jz      kbd_wrt_ok1# D8 _& h8 K/ D. h& d! B! D- i+ z
  556. 5 {% A5 f2 F9 N9 U2 o
  557.         loop    kbd_wrt_loop1
    , v: `2 k1 t7 V: b6 X/ N8 N

  558. 2 u, v' I3 U, j; u; N3 ^
  559.         mov     ah,1
    3 A2 m5 g5 R6 W7 {4 z; y8 N
  560.         jmp     kbd_wrt_exit
    6 B" ?, n; z3 I0 X3 ]
  561. ) M3 ]9 ~0 g! I8 q9 c  v/ V( z
  562. kbd_wrt_ok1:/ y! o- E7 t: Y: r( x* @$ Y: M
  563.         in      al,60h, `6 [* b! R6 g7 y3 H

  564. : z( h, R- i9 _* L9 x/ w
  565.         xor     cx,cx
    . w5 ]3 w8 ^1 B0 t! _; `8 h4 R
  566. kbd_wrt_loop:
    * Z* x, g  n+ r: y) V+ y! C  E
  567.         in      al,64h
    9 p% u  b- \8 M5 n" k
  568.         jmp     $+27 V9 K! H, {! n4 u9 s$ V3 A
  569.         jmp     $+2
    ' Q; ^3 D2 e1 \
  570.         test    al,2
    2 Y( N  }& o& n) }
  571.         jz      kbd_wrt_ok' N+ g: @5 e! ?7 y7 T; O* A# I

  572. ) z* H4 O3 |9 F4 r; c
  573.         loop    kbd_wrt_loop
    ; j  t1 k$ E$ H# j) y8 N* Y
  574. $ M; f8 h5 }" M5 ^+ ^% D0 K
  575.         mov     ah,1
    / M$ j% U- J/ S% C8 M& _
  576.         jmp     kbd_wrt_exit
    * x% B" E; K; Z1 z. i$ ^( Q, y6 O7 A

  577. ) J# x) ^# ?1 ]$ t7 y2 J
  578. kbd_wrt_ok:) a8 ^6 G8 g# U
  579.         mov     al,dl& D& U6 _! \3 \8 y6 |/ A
  580.         out     60h,al* [- |: }" o3 Z4 P, b
  581.         jmp     $+2( C0 N& q$ K, c/ O; j
  582.         jmp     $+2
    4 ?1 \. f0 O, z) y1 x

  583.   Q( K, a" K) u7 P+ ^7 K
  584.         xor     cx,cx3 V  I0 x  ]* F3 a$ H& M( j* W/ h1 n
  585. kbd_wrt_loop3:! u5 N3 @- E$ N0 }1 e) f
  586.         in      al,64h
    ; T# Z4 _- b! u# p8 l9 W/ j' K
  587.         jmp     $+2
    % v: r. E7 z, @% e) E, X
  588.         jmp     $+27 T1 M4 L) V, x6 \  q2 O$ J
  589.         test    al,2
    ! w2 W& v. A0 p- O
  590.         jz      kbd_wrt_ok3
    ; D& O. _" [) F" G/ O+ V% K
  591. 4 W/ K* R' O5 m5 p) E4 U
  592.         loop    kbd_wrt_loop3$ p9 x5 J2 C2 e& h

  593. # [8 v/ N4 |+ v* q4 N1 j3 n/ L
  594.         mov     ah,1
    # G$ ~7 t- h5 J, S2 c
  595.         jmp     kbd_wrt_exit( c. S# ~2 }! q; e

  596. . B6 ^( u7 S( b/ T) j3 E
  597. kbd_wrt_ok3:
    + T6 j$ o# ~. K' E
  598.         mov     ah,8/ P6 L- E; g# S8 I9 o  u
  599. kbd_wrt_loop4:
    # Q) X5 r. y: @" K' F
  600.         xor     cx,cx
    2 [  K; @6 i* p+ H
  601. kbd_wrt_loop5:
    ! l: a% T' K  @
  602.         in      al,64h
    / o; b' o0 Z8 }! U' a; E3 |
  603.         jmp     $+2
    / T( ?& o4 m6 M( v7 {( [' r/ X
  604.         jmp     $+2, Y) f2 [! i8 n/ J! W9 U- X
  605.         test    al,15 D9 @/ r3 c/ t/ B- W: {# }6 K
  606.         jnz     kbd_wrt_ok4
    & k3 x& _/ g: {  v1 M2 R% [4 c' x
  607. . N( W1 _" y; F- u1 Y" Y  r) d
  608.         loop    kbd_wrt_loop5) g3 \3 J' g9 }/ Q2 H/ h) B5 S

  609.   M% y+ l" k4 s. H6 J% }+ a7 G
  610.         dec     ah7 d/ F% h2 _7 {
  611.         jnz     kbd_wrt_loop4
    8 [1 B* G  ?, R) e; L
  612. / g# m- g; ^) u' c" x
  613. kbd_wrt_ok4:+ U; w  G0 V7 Z6 C4 V1 y
  614.         xor     ah,ah
    9 `% E2 `& ]. m3 b" H* r
  615. kbd_wrt_exit:- x5 l" g; d: E4 C
  616.         pop     dx% C) z9 r& I6 Q
  617.         pop     cx
    : y8 N4 o9 `) k$ q
  618.         ret
    * v3 s1 g8 E& B6 X' y
  619.         $ |6 N' ?$ c: V; o$ N# {- b! q/ t3 R
  620. keyboard_cmd:$ u5 B* n; ^: e# \) _
  621.         xor     cx,cx
    4 s; L4 j+ U9 Q& J% T( F
  622. cmd_wait:$ d; U* Q3 r+ z* M. B  ^+ D
  623.         in      al,64h0 L  p& C( J) Z1 @1 X8 X
  624.         jmp     $+2
    ( |8 B$ W; I. Z4 G4 l
  625.         jmp     $+26 }; e) _( u3 s  ~3 ^" U: J) I
  626.         test    al,2, K* G' v4 ?& [4 O
  627.         jz      cmd_send
    4 W" Y( t+ q6 T; D: Y# b) x
  628.         loop    cmd_wait& u: U7 \7 }( [5 J- E& m, d; [0 e

  629. + n; O) @( H& G% b
  630.         jmp     cmd_error! L  A: T7 X) F6 w. P* o! T' k

  631. 6 {$ B  D# F# t5 i# a3 {
  632. cmd_send:$ y5 {. F5 i% Y9 G& r7 h) v
  633.         mov     al,bl( b% J- T8 K' B! |
  634.         out     64h,al. E( i+ U- V* o; \: E! p
  635.         jmp     $+29 n0 z$ q' K/ y. K
  636.         jmp     $+27 Z) j: _# C1 r% ?

  637. 6 v1 p( Y# j8 f9 U
  638.         xor     cx,cx
    : E) i' f$ S$ K: j# D
  639. cmd_accept:  O/ z- M1 H3 w% F' D: a, ~
  640.         in      al,64h
    / _3 q5 P$ `! m- r, @) D" c; A& p8 b+ W
  641.         jmp     $+2
    9 f# x: w4 ~4 _
  642.         jmp     $+2; T/ i& H% ^  D! @6 @' Y+ }
  643.         test    al,2( s6 S" _, w3 E/ D, [
  644.         jz      cmd_ok( s  k* U& V5 E
  645.         loop    cmd_accept
    2 D+ }- r, ?# f1 M4 f! x# J

  646. + T: w8 F0 t! m) W# z
  647. cmd_error:
    - e8 P( ^( X2 r3 u3 v7 ]
  648.         mov     ah,1
      Y9 }8 r. v* L, W" s
  649.         jmp     cmd_exit( n: G5 x" j5 n( A  L1 W' u9 _" \
  650. cmd_ok:( L% o0 S& V6 j# A6 `$ d
  651.         xor     ah,ah: U: u5 m+ U' u! c
  652. cmd_exit:' M& x+ i4 U# z4 Q' a2 [  j
  653.         ret/ J& k* U$ i( ]$ ~% S

  654. + f8 Y5 e/ F- H3 M2 ?5 |' f/ M+ z6 N
  655. new_33:
    / _( Z5 ?/ Q9 k( h
  656.         cli
    ! _  M( A% p  N- L
  657.         cmp     al,0
    3 |1 K2 Y7 O; H/ e# u: Z
  658.         je      reset_mouse; D- w& D5 j8 c4 h1 q! S
  659.         cmp     al,1! J+ W3 v/ w4 a9 b0 ?0 H
  660.         je      show_mouse2 C+ P# p/ V+ h! `2 s) A  I3 q
  661.         cmp     al,2" S" L0 ^% k1 n
  662.         je      hide_mouse' s/ ]- v, T' g' T7 v5 b
  663.         cmp     al,3
      L8 {) ]+ v" y/ |% m
  664.         je      get_pos: u% E0 F# a9 f% r8 j2 i
  665.         cmp     al,4
    9 V- V0 ]1 v% ?( c
  666.         je      set_pos
    % p* N$ s! \+ u: n7 ^/ s
  667.         cmp     al,78 R  s. {' F, b/ ~2 Z
  668.         je      set_hor_pos3 l# K4 L6 p, q- P% {7 R
  669.         cmp     al,88 u& L- t0 s9 {9 t: [$ @/ Y
  670.         je      set_ver_pos
    7 y. g/ F% g1 ^$ n* g
  671.         cmp     al,0bh/ r  w; W! l' B3 M6 W/ T/ }
  672.         je      get_mouse_movement
    " X$ ^3 _' b( t- ]6 O# J& A8 M
  673.         cmp     al,0ch
    1 P+ r! n# Q: v) T. d+ G% V
  674.         je      set_subroutines+ R: E4 v0 w+ f, q6 B
  675.         cmp     al,14h, i; l( h- B( d5 g# o
  676.         je      swap_subroutines
    0 n8 S" t+ W/ b: K# o5 P
  677.         iret. g! g  N4 h( p" e% o
  678. : _8 G  x0 C; A9 q
  679. reset_mouse:
    8 G* X& M. u- U$ u; o9 a
  680.         jmp     _reset_mouse
    - C' T3 O" a6 I3 f" k
  681. show_mouse:. ^7 I! K$ J# \7 f6 H
  682.         jmp     _show_mouse
    9 G3 g2 @0 v  X2 @, Q
  683. hide_mouse:. G6 M1 Q& R5 _) d/ O* W, H/ d" Y
  684.         jmp     _hide_mouse" D2 o* o9 V# K
  685. get_pos:- L% b( r. ]" _8 J" z$ o
  686.         jmp     _get_pos2 A0 l: F' Z" ^5 E
  687. set_pos:
    , `* U! w- b& j8 I( a- w
  688.         jmp     _set_pos3 F8 E, D  s; q
  689. set_hor_pos:
    " d% x* t% T/ D( r
  690.         jmp     _set_hor_pos
    " f1 t" f: u; o/ h
  691. set_ver_pos:
      v  ?3 K0 u4 G
  692.         jmp     _set_ver_pos1 k% P1 x) P3 \0 @" a+ ?
  693. get_mouse_movement:
    / \) T* E- t; K+ |* _
  694.         jmp     _get_mouse_movement
    + z( d* ]+ f$ R
  695. set_subroutines:8 r" R% u8 L9 M8 F/ `) H
  696.         jmp     _set_subroutines3 N; W+ B* d. R% x
  697. swap_subroutines:
    6 K) x, ?* t, ]7 s+ f+ o
  698.         jmp     _swap_subroutines+ A4 b2 o4 `4 ]% J4 C! `# k
  699. * I1 @- R2 R+ ~% x! z
  700. _reset_mouse:5 D! I# y( o, p6 ]/ W
  701.         mov     byte ptr cs:[buttons],0
    " \; o; E4 C4 ^. L
  702.         mov     word ptr cs:[pos_x],0
    + G2 T- L. d! f& e: e
  703.         mov     word ptr cs:[pos_y],0! s9 X2 f" O! _( w6 G# Y- ?! Q
  704.         mov     word ptr cs:[x_move],0
    : t% T( y/ M1 H5 o" x: \0 Y
  705.         mov     word ptr cs:[y_move],08 o* p5 I3 U& I" L; H+ l
  706.         mov     word ptr cs:[x_max],639
    ' j9 @3 r* r# n/ E6 C. ~* B
  707.         mov     word ptr cs:[x_min],0. Q- T- ~6 z% _+ P
  708.         mov     word ptr cs:[y_max],199: A( F# e, D( p) m
  709.         mov     word ptr cs:[y_min],0
    9 \0 e# _1 q3 C' a5 I5 q
  710.         mov     word ptr cs:[user_mask],0, G% ]) H2 k% p
  711.         mov     word ptr cs:[user_subroutine],0. \5 }9 X& `  v: ?9 y# `2 `
  712.         mov     word ptr cs:[user_subroutine+2],0- G( p* G( f  c/ N+ H" L
  713.         mov     ax,0ffffh" J. U9 }+ a9 s
  714.         mov     bx,3
    % e9 h, |/ D  x8 i  `
  715.         iret) ?) n1 z3 o  x. J
  716. 7 K3 }( t+ M3 W/ k# Z" R" j6 y3 [
  717. _get_pos:
    ! K: F: Y% c9 a; w$ E8 t- _3 g. q2 h
  718.         mov     cx,cs:[pos_x]# @! f4 i; s% j& H( M
  719.         mov     dx,cs:[pos_y]& d3 M* o" i5 ~$ e% V- r4 p3 `
  720.         mov     bx,word ptr cs:[buttons]0 ?" @1 n0 j. P. X, I" I* P- w! I
  721.         xor     bh,bh( v8 m1 z5 \/ M3 G1 k
  722.         iret% s  g# p) v  P* m% ^6 B6 g" b
  723. 8 n5 ]* Z0 ]+ x8 k; j. p
  724. _get_mouse_movement:0 v0 P5 j, x- [8 z0 P# X
  725.         mov     cx,cs:[x_move]
    5 @  V' z. p9 j4 Q
  726.         mov     dx,cs:[y_move]% m4 ?% Q1 H5 E: k. G7 V
  727.         mov     word ptr cs:[x_move],0
    ! Q2 r$ C2 A* J* v+ u
  728.         mov     word ptr cs:[y_move],0
    + m. V4 V5 k3 ^9 `
  729.         iret$ W4 Q( H5 g5 Z/ l6 l5 L

  730. 7 o1 W/ y/ _- f9 {8 Z3 q$ A' Q
  731. _show_mouse:' \) N4 g/ E& ]4 B1 a
  732.         push    ax
    % s: Y; L1 j' h6 n& t
  733.         push    bx
    ( F$ S6 ], n  a/ F6 K& J8 [
  734.         push    di: s6 d9 m5 Q! g, {8 [8 @; g# [2 c
  735.         push    es
    : E$ U% m( D0 k: N, U- X
  736.         mov     byte ptr cs:[sm_flag],1" E' I' |- G4 S3 F8 Z4 x% D
  737.         mov     ax,cs:[pos_y]# k; e4 X7 F: Q+ x! J
  738.         shr     ax,3
    . a3 |& [- y1 m1 V+ ^: b
  739.         mov     bl,809 s( U' o" ~- N+ q7 g
  740.         mul     bl
    0 V* s% R1 `2 w2 U/ g* ?
  741.         mov     bx,[pos_x]
    6 ~8 Y# n* E2 T
  742.         shr     bx,3
    0 \. S( e; `5 c; I
  743.         add     ax,bx% q& B  v$ Z$ P. t. a
  744.         shl     ax,1( v( b. i. l2 v* ~4 r
  745.         mov     di,ax
    # u. q, S" Q" [/ M2 d. J
  746.         mov     ax,0b800h
    ( f3 d/ p- T/ T: ]/ d" k' g, A
  747.         mov     es,ax
    - r3 D0 v/ B5 C* ^0 Q7 g
  748.         mov     ax,es:[di]
    6 E1 J" E4 U/ X! T4 m
  749.         mov     cs:[save_char],ax& v+ J' j: ^6 `" \9 O& t" C( ^
  750.         not     ah* L- H! J$ {8 w% B
  751.         and     ah,7fh
    ' ~1 [9 m9 X2 t8 d$ x( @  R
  752.         mov     es:[di],ax
    9 ^  K! Y' |1 s" C1 @; |; Y$ x
  753.         pop     es
    & s, j7 f: F5 O- H& N
  754.         pop     di# Z+ P2 x1 K( w, F! n, z9 e2 K
  755.         pop     bx2 y6 o/ r9 @/ F
  756.         pop     ax4 |* g) o4 _6 T# O6 z
  757.         iret: ?, P: Z. O# r& B( Q5 K9 B1 a
  758. $ U) I9 I6 L! W3 N" L& ~. L& r% {! d
  759. _hide_mouse:& I+ m; t3 x' e% l
  760.         push    ax/ p8 K) j% G% R2 D
  761.         push    bx
    - {$ i9 [  C2 W! L1 M4 E- y( K
  762.         push    di7 c' P4 j8 t8 `8 O+ P
  763.         push    es
    * M! n. w4 ^" }3 |# q) L" _4 H
  764.         mov     byte ptr cs:[sm_flag],0( Y: S: t. S/ u6 I
  765.         mov     ax,cs:[pos_y]
    5 ^5 e& n7 `! A! ?- K1 x+ ~
  766.         shr     ax,3
    0 [( v5 S+ [$ M4 ^6 g" t4 x
  767.         mov     bl,80, p7 s7 m0 ^% E: u" m. k
  768.         mul     bl) l8 w: h+ S5 @8 W* `
  769.         mov     bx,[pos_x]
    $ I6 D8 g8 W: O' c5 H2 c/ Z
  770.         shr     bx,3
    # s" P6 c" Y7 P! r
  771.         add     ax,bx
    # p2 Y( P7 ?* e8 s; E
  772.         shl     ax,14 G' P  z# p5 ]- i, [5 U7 R
  773.         mov     di,ax# Q+ X/ |! e% V) r9 X' \: u& q* w$ e
  774.         mov     ax,0b800h+ b+ W2 x3 {* L& w7 }4 G/ ]8 h
  775.         mov     es,ax% r% i4 E6 C( B& p" m
  776.         mov     ax,cs:[save_char]
    # J' k  O/ m+ L* i& y
  777.         mov     es:[di],ax
    5 E4 L. u# X  ]- Z) ?- u
  778.         pop     es9 ^# D7 S/ d5 W" \, h! m& Y
  779.         pop     di4 @) N, L+ \, a; ~
  780.         pop     bx* E( H/ ]9 y# b  d5 V5 ]
  781.         pop     ax
    2 m- C1 V9 y: o# }5 @( C
  782.         iret: y/ }5 H* _' Z' R" I2 P
  783.   j+ ~: g) i& J) ~
  784. _set_pos:) I! F! y0 p3 \2 e: y6 d; S+ }
  785.         mov     cx,cs:[pos_x]/ g  e: F. ~" e
  786.         mov     dx,cs:[pos_y]
    1 V6 B: m4 P; O" o
  787.         mov     word ptr cs:[x_move],0
    . a! L! @+ T6 }
  788.         mov     word ptr cs:[y_move],0
    % x' ~& R0 U# x; A' i, D
  789.         iret
    * d, W& ^$ \* d4 u

  790. " Q! y* M6 P  K1 i& n  C
  791. _set_hor_pos:
    " W% n$ t( S5 y7 n: }! Z, X
  792.         call    max_min
    : g( D% ~5 @. k  W6 f2 ?
  793.         mov     cs:[x_min],cx
    ; D0 A9 {* k! b4 y
  794.         mov     cs:[x_max],dx$ ]/ W1 D+ Y9 @4 u/ N/ k. V. f
  795.         cmp     cs:[pos_x],cx
    ! R# `: m' R6 g) h
  796.         jge     good_hor_min
    . [' }2 k& {2 E% I/ K
  797.         mov     cs:[pos_x],cx$ f+ `' t6 p" B1 k" a
  798. good_hor_min:
      ?5 [; S7 ]& d; }2 E
  799.         cmp     cs:[pos_x],dx
    : Q9 O& q0 Y& [; V
  800.         jle     good_hor_max% y0 @- ]6 M* T, E( X- k* e% Z
  801.         mov     cs:[pos_x],dx, {( w8 ~; ~6 r6 S
  802. good_hor_max:
    # U3 t0 E* K! R5 `( R
  803.        iret7 X' O' t# M. F) N2 S

  804. " @$ ~6 q. q/ x! ^. X/ j2 ^
  805. _set_ver_pos:/ B' R$ C& T* B
  806.         call    max_min
    : {. Q* h; a( |) p* Q9 l
  807.         mov     cs:[y_min],cx* i7 U, E3 L! m3 o) c5 b" b
  808.         mov     cs:[y_max],dx
    6 B/ }6 W- O# T3 W" j
  809.         cmp     cs:[pos_y],cx
    7 u7 V' Z$ Q+ X) ^
  810.         jge     good_ver_min4 V# v8 G5 {) a, W' N1 s
  811.         mov     cs:[pos_y],cx
    1 F$ q+ k( x, S! {* F
  812. good_ver_min:
    8 ~' N9 c. D: }
  813.         cmp     cs:[pos_y],dx
    . e2 H- [- V% P4 z" J& W
  814.         jle     good_ver_max' d: m% [# U- i1 I/ P/ ?: a
  815.         mov     cs:[pos_y],dx; L! c0 D+ H$ c0 q; r2 e* K+ s
  816. good_ver_max:
    ' Z; a) h: m4 K
  817.         iret
    & v8 S4 V, u) U
  818. 2 S: }. {6 f8 o2 @4 K
  819. max_min:
    7 Y- w/ |8 P# w! G: O) c0 b
  820.         cmp     cx,dx
    0 J# L: M) ^% W6 l8 L8 f
  821.         jle     no_swap
    ; K! h: U* H* J* v$ |  A  N
  822.         xchg    cx,dx1 @* X' f8 P4 M: c
  823. no_swap:
    + m' r6 v" [, w( _7 @! k0 |/ q
  824.         ret  ~' J9 K. Y. v
  825. ' v+ t' r' H1 e/ u9 u
  826. _set_subroutines:3 O& e9 X- q+ N; `
  827.         mov     cs:[user_subroutine],dx
    # k; X* B9 I0 t8 \2 ~0 b) w1 O. o6 M
  828.         mov     cs:[user_subroutine+2],es4 V) F# ]) r- G! q! y5 l' c( J
  829.         mov     cs:[user_mask],cx
    / G# g% g7 l& |8 f# m! ?! ]2 G
  830.         iret
    # b) |. c; K2 j( C6 o: U! h
  831. 9 X2 M. c8 Z1 r" l, o5 U2 _
  832. _swap_subroutines:
    " a5 Z- F% @) j" [3 ?
  833.         push    word ptr cs:[user_mask]
      c1 B! n4 M" M
  834.         push    word ptr cs:[user_subroutine+2]
    % ]% E; O; N* U4 l$ `# F  \
  835.         push    word ptr cs:[user_subroutine]
    9 U9 Q& l( F9 Q# c1 P
  836.         mov     cs:[user_subroutine],dx
    9 J6 ]4 e& T9 @& ^* y' u4 D6 @, z
  837.         mov     cs:[user_subroutine+2],es
    ; v9 B! _7 U& d8 \2 w
  838.         mov     cs:[user_mask],cx
    # }$ F# ?) \  x+ r- T# C
  839.         pop     dx
    6 `# O  i2 G; Y6 Y% \
  840.         pop     es+ t6 @5 }5 ^/ S) S4 D9 s' B9 ]) [
  841.         pop     cx
    9 r+ q3 M0 m# L; A3 y$ h
  842.         iret
    , O6 D; y3 p+ B; N8 e
  843. 4 H  `9 I) o4 N& Q& X& T) N
  844. memmouse        endp- h- J6 P; k, D2 V% X! Q. B

  845. 0 h( B- S4 j$ M& \9 G
  846. endof_start:
    $ M; j* {$ e/ d# |  w% q

  847. * G/ ]' s1 u# F3 ^% q) B1 ~5 w
  848. emsg db 'No mouse driver install error!$'3 h! y! O* [2 u! U, s& K
  849. old331 dw 0
    8 }5 H7 Z. k- }5 {7 D4 v, u1 S' D
  850. old332 dw 0
    1 B5 y, Y8 F+ |6 A, @# H+ a
  851. old741 dw 0
    6 x  h7 n- N" e+ y
  852. old742 dw 0
    5 i7 v8 d' Q+ Y) m8 E4 ^
  853. memcopy db 0
    $ a7 P7 I" }; h9 B, ^) g
  854. okcheck db 0
    8 J2 L0 |  Z. V6 |# ?6 ~+ g
  855. pass db 0
    ( u& R: Z+ g/ h5 U; Y  n
  856. chkl db 0- \6 I! P( @6 D
  857. lk db 0/ J: H- k& a' I! l, L- m
  858. chkr db 0
    # N5 R" b6 T' b" `" a
  859. rk db 0
    - d- Z" e0 q  E7 G& p
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '$ J& i: ]. Y7 w+ r
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '  J% }. F+ F5 O7 d9 a- C% }
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ; A+ x+ N* E( e
  863. db '                                                                                '/ B; z/ p" @* s( l$ E
  864. db '                                赏屯屯簧屯屯突                                  '
    / Q( s1 D. s5 U/ w  m# F% [7 L
  865.         db      '                                ?OFF汉OFF?                                 '
    1 c( L- B5 c+ A3 g( i
  866. db      '                                韧屯屯既屯屯图                                  '
    3 p9 O' s  [/ S6 f) H) s3 d8 ~! p
  867. db '                                                                                '( ^; w3 [! B3 ~& Q% ^( U; P$ c3 H
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    4 Y. s; p" A; @1 k7 e# Q* [# p
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ) u9 N6 |) h6 c7 d4 T0 D
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '  v7 q8 o- x  {5 I5 V
  871. 6 i  _$ a& \! y7 }( ]
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!" V9 t0 p$ E. i# q9 a. `) |0 L
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 3 M# {( M, i8 k+ [& a* P/ J1 B

$ f. h; \9 A0 Y8 F谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:09 , Processed in 0.270468 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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