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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
% ^2 t% u1 H+ q/ ]/ T% U0 s- S
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    1 @; Z0 X' |; z4 e
  2. ;          Ufoit PS2 Mouse test program   Ver 0.91 _  K3 e3 f" a* f# ?; j
  3. ;                                         By Bini.Yi 易祝兵
    ; V  G; H9 D# m: t& |! ^
  4. ;                                         http://www.ufoit.com 计匠网! G1 N; X$ t: J  u( s( m& A( A" Q
  5. ;                                         2002/04/06 YYYY/MM/DD) E4 V* U7 F3 @. H6 n* e) j
  6. ;8 X+ b% b6 ]7 Z7 z" `# k$ G: Z, v
  7. ;         
    / h7 L) R( ~- u  K% j9 s: E
  8. ;          This program  test the mouse button  click and move.
    7 k8 C6 v) L0 Q# J! T( e) e
  9. ;) t# N9 [% J3 L6 L  b9 H9 R

  10. ; [5 }5 r! z0 C5 J
  11. .model tiny
    0 `% j4 P( f; I" s
  12. .586( ^0 C% i4 K: V9 c' e
  13. .code: J  T9 h/ |+ v& V0 x' B
  14. .stack  100h
    2 J& Z9 m, p' S
  15. .startup7 d" L+ |* q3 g8 d
  16. pusha. n( k# \) C. s
  17. mov ax, 3533h
    6 p& ?: e; t- l, ]
  18. int 21h* k' u. e# a. |, n
  19. mov word ptr cs:[old331],es
    4 f4 f0 c& ^* P# y2 s
  20. mov word ptr cs:[old332],bx
    8 O2 A5 A& @9 z/ {- w
  21. mov ax, 3574h: J% `# H2 M6 ?2 ~4 g/ J0 W
  22. int 21h
    6 y# p3 I+ F% |, E& T9 ]) i/ ^
  23. mov word ptr cs:[old741],es
    " `: s4 @6 r9 A3 M+ W0 O" }
  24. mov word ptr cs:[old742],bx" X7 Y% A8 B7 E( H. j9 E
  25. popa8 o5 a3 j" t2 D- O6 f8 a9 Z# w3 w( G2 f
  26.         call    memmouse
    7 ]4 L' U$ ^) Z6 C
  27.         mov ah, 00
    7 n& f0 r( j! N% X) {  c  g
  28. mov al, 038 f; a( _. m# U8 g( V6 k% G) S
  29. int 10h
    ( ]# c* k5 q1 G) k0 `6 G
  30. mov ah, 06' `7 D; Z0 v( Z0 i- Q
  31. mov al, 03 |  g+ J' `& x" ~& L, [
  32. mov cx, 0
    6 X: G. ^9 @3 i
  33. mov dh, 24/ A3 }$ N' V% X3 L4 |1 c7 i. Y
  34. mov dl, 79
    % D: \2 g9 Z7 z( f( S9 R/ C0 z
  35. mov bh, 07h9 a+ Z/ K7 L! U$ S( K$ y' E" s
  36. int 10h, _' [3 h, P, F) g6 h
  37. mov ax, 00007 G# i3 [& K3 }+ h
  38. mov bx, 0002
    : V: x. ]0 p; N4 C; }* B
  39. int 33h
    # _. D8 u" @/ {7 ^
  40.         cmp     ax, 0000           ;if no mouse drive install. ~8 N. |2 a: `+ F
  41.         je      errormsg           ;show error MSG
    2 o, J9 j1 _7 E+ E; W
  42. mov ah, 02
    ) J' h6 v3 [* b9 P) j8 _- p
  43. mov bh, 008 ]" D! p5 ^2 h5 [% A& E
  44.         mov     dh, 25             ;Move point out screen3 f' i+ y# K0 I! `0 I
  45. mov dl, 79
    3 `8 b: T. n6 s, _2 O! j
  46. int 10h
    0 y+ ?% `0 d: j0 E7 s9 ]
  47.         call    showmsg            ;Show info
    ( x. K; g) }* _+ X- V
  48. mov ax, 0001
    . h% H, O5 Q( M: o4 p
  49. int 33h
    6 T+ W! v+ i5 i3 @
  50. ; mov ax, 000ah5 U6 Y- K, K; X# H8 c4 a( q% \. `
  51. ; mov bx, 0000
    4 r# U. b& r& s  A6 ~+ S
  52. ; mov cl, 0h
    8 _2 e& |; J& Q0 G9 X( q) V
  53. ; mov ch, 0F0h
    1 N5 M9 g! Y1 y& G
  54. ; mov dl, 0h4 p! K* {* W1 Q# [) ^
  55. ; mov dh, 0F0h
    % [: T3 w; C! m
  56. ; int 33h
    ; R% j- t  ~7 K& Q3 U
  57. mov ax, 0004h6 n0 f! i/ j1 w- Y1 b
  58. mov cx, 03191 |" }3 R: U' F6 O' ^1 p7 ]
  59. mov dx, 01035 H% k; ]# g8 a* Y
  60. int 33h2 Y+ n- g  S0 U- ^" |2 W: t6 r. ?5 [8 Y
  61. casemo:                           ;Case button click and point move
    & n9 f# c4 |' W- w7 F1 Z
  62.         mov     ax, 000bh         ;and keyboard press- g, t( t" E4 `. B& B" O- h" k
  63. int 33h5 n' p+ O4 l4 z$ F+ M! k4 T) A
  64.         cmp     cx, 00h           ;if point move....X
    / ?& V) \/ J$ F8 o
  65. jne xmov* V9 o7 a) ^6 `' R
  66.         cmp     dx, 00h           ;if point move....Y
    ; J. }: o  ~9 I
  67. jne ymov3 X2 i% h+ G: e% S- j5 g) z
  68. xymovend:                         ;X.Y move end
    7 E& Q7 _7 g: h
  69.         mov     ax, 0003          ( x* ]" o, b2 k5 J; q8 l' V
  70. int 33h# \9 u& w+ Y- {
  71.         cmp     bx, 0001          ;if left button click  show ON, D" A- Q7 U8 q4 n$ [3 y
  72. mov si, 1828* r. u0 ^/ E1 n) O3 i2 T" _
  73. je listl) [6 {. ~$ E+ Q6 J0 s
  74. mov si, 1828
    . z/ F; a+ z0 X9 f. h. z
  75.         jne     nlistl            ;if left no click show OFF9 e3 ]( w( f) \/ O
  76. testr:' A( K1 i  f. X2 M; @, P
  77.         cmp     bx, 0002          ;if right button click show ON1 \, l9 ~; q8 a4 D& K
  78. mov si,1842
    # s: a4 D) D- D3 ?( [
  79. je listr
    $ S- F6 {! B0 b0 e
  80.         mov     si,1842           ;if right no click show OFF
    + p; |! q# {' l* d, T" y* Z
  81. jne nlistl) t& V: d  \. U
  82. casekey:
    8 B. f! `! T0 m# j* e, t/ C
  83.         mov     ah, 01            ;if any key press jump check
    1 V0 x' K6 l* d3 w" S6 q' n
  84. int 16h
    + p" N7 ]9 O( e1 D) d
  85. jne kpress
    : X" u7 r5 k3 P7 O5 D
  86.         mov     al, [chkl]        ;check x flag" G' v/ _7 o# L* A; M
  87. cmp al, 02h) P+ X( u$ r8 K2 t3 ~
  88. jnb chkok
    6 l; L) q3 w! G5 R
  89. jmp casemo
    3 l6 Z1 L( _% G" r
  90. xmov:                             ;if X moved, get the X flag+1
    1 o% R, B! Z$ A# ~
  91. mov al, [chkl]
    4 J+ b/ H2 G, m4 R! n
  92. inc al
    * K' W& p; H( M  x7 ]9 g. M2 x
  93. mov [chkl], al
    ; [9 p$ [1 Y* h6 {7 x, j$ g1 N( b! [
  94. call passok$ c% C( I2 o5 J
  95. jmp xymovend$ t/ ?" y3 z% c1 _
  96. ymov:                             ;if Y moved, get the X flag+1
    , W7 A% C5 j4 `) j' b, E; `
  97. mov al, [chkr]' b; g: Y' k. q
  98. inc al
    " ~3 L* ~8 v7 x$ s% m4 C! k4 Z
  99. mov [chkr], al  _' k* F; Z( g* J* i: |/ r: @
  100. call passok
    8 O0 R( g" Z" s: n# z7 z
  101. jmp xymovend$ p! M$ i6 w5 i0 W

  102. ) W5 h( a. x1 F9 V
  103. passok proc near$ u( X# M0 O6 j7 n
  104. mov al, [okcheck]) L2 O& b( E) s# Q8 \) j; _) U0 A
  105. cmp al, 1, M3 l0 m. |) {$ B+ S* O0 X0 ^/ y
  106. je let0# k2 e9 ]0 D9 T/ X7 Z: u' F1 z% `
  107. jmp passret
    ! p; N+ Q0 a& K/ \3 A, M
  108. let0: 1 M+ j  D4 c; C* G
  109. mov [pass], 1% X4 U' U0 a! y0 t" B1 Z
  110. passret:, J0 o* }* t4 n" q# ~5 c6 L
  111. ret7 A9 ~/ Q! A2 I5 ]7 Z0 h
  112. passok endp 5 u) r1 L, X9 R) k* y

  113. ; [$ f0 e# Z& c5 H4 z4 z
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS; s! u  b6 }7 O  t+ O! F
  115. mov al, [chkr]: c! `, J; }( u
  116. cmp al, 02h
    4 i2 T% H" s, ?6 `& x/ s- V0 N
  117. jb casemo
    : G1 A* u5 S) P$ m$ O/ M9 q. m
  118. mov al, [lk]3 x+ s: E: W/ q
  119. cmp al, 1. a6 H9 q5 c' ^+ g& [. G/ z
  120. jne casemo
    ( I7 X7 ^0 ]; b' l
  121. mov al, [rk]* L7 P8 u& U# k' c4 t& o$ b
  122. cmp al, 1
    9 u; P6 V- ]6 {2 r7 Z& P  G
  123. jne  casemo$ @% {- X) q3 d: z7 N- l
  124. mov [okcheck], 10 t9 K) p; N: j& J- l$ W, J* d5 B
  125. mov al, [pass]9 b1 x9 R2 _* a6 ~
  126. cmp al, 1+ _; O" u5 m3 V. O6 ^' K
  127. jne  casemo
    / z* m- {/ H1 s2 O
  128. mov ax,0002h  U7 ^0 v% Y8 Q3 b
  129. int 33h
    % c; Q7 p/ q# n" \
  130. call cleascr! Q* i% K8 Z1 M1 Z+ ^4 h  x. g- H
  131. - D" c2 {4 q" J# J/ j
  132. call oldint
    ' k; I0 v+ f) s. B8 O* }/ E! d
  133. mov ax, 04c00h
    % Q7 w& \  F& H4 R( i
  134. int 21h" r+ I! S2 ~7 o8 ^; P

  135. 1 A8 A# l+ x  J7 r/ M
  136. okexit:
    . c8 }4 B2 v* G$ B; F: s# ]5 C
  137. mov ah, 4ch0 L. }. @! Z, B! ^  Z6 o/ u
  138. mov al, 0
    " `# c6 A! q1 L: A" p0 X7 d# o6 `
  139. int 21h  F4 N( H1 o* T& A- b
  140. listl:                                 ;Show ON) [! h$ O8 t5 C+ C
  141. pusha
    8 |4 I6 p& r* P. V+ W
  142. mov ax, 0b800h
    3 ?6 q7 E6 S, t: p8 l# v/ d# ?1 R
  143. mov  es, ax
    ( v2 v# o* s  s0 S( ^
  144. mov ah, 47h
    2 U6 o7 J" s1 m) a) d2 Z) |
  145. mov al, 20h* r* {" k: V; N; _, k; H4 r
  146. mov es:[si], ax
    0 W: W* B. G( c$ |( \! X' |$ h% X
  147. add si, 02" ^2 L7 O3 d; m  x9 g8 d
  148. mov  al, 4fh
    5 F  ~+ j5 D. z5 W
  149. mov es:[si], ax2 t" @7 v* F! b  ^- Y) d. V2 g
  150. mov al, 4eh
    , L  N- |% f$ ]& G
  151. add si, 02
    - J9 p+ Q5 T1 {& {
  152. mov es:[si], ax
    - a' w7 @7 r) r2 ?
  153. mov [lk], 1
    % M9 L. e: g+ u
  154. popa
      t) b7 F/ {+ s; @6 e3 N! n
  155. jmp testr
    / @  Q) C) h0 C0 G6 R. |
  156. listr:                                 ;Show ON
    ; _+ t" `! t3 @# l) V) ]
  157. pusha
    8 e3 Q+ `( h* P  B8 ^0 [
  158. mov ax, 0b800h
    * B2 h; V3 E5 @2 @4 W
  159. mov  es, ax
    ; R+ Q6 T$ k; R( I+ L' g
  160. mov ah, 47h
    % m4 i* m  Z4 V# |" i
  161. mov al, 20h
    . V) i, {  h) y7 l0 F- q3 t# @! a
  162. mov es:[si], ax
    & [# L  X4 U) x+ {
  163. add si, 02" T" T' u' L! S0 B( R8 ?0 }* H7 ^
  164. mov  al, 4fh
    # _  l' J( ~- A5 M; @
  165. mov es:[si], ax" {& a! }/ a. J. M4 E
  166. mov al, 4eh0 l+ d2 x; l+ I2 p& q
  167. add si, 02$ f( p2 h. C/ n, i/ @" {6 E# I2 M
  168. mov es:[si], ax
    / m  X3 J' Y& s5 s: a
  169. mov [rk], 1
    ( Z1 |) s( t) v
  170. popa
    6 S/ h* `; L2 C+ w- j* U  w
  171. jmp  casekey& S# P/ w7 o1 t* v
  172. ' C' u; L$ n( ^9 [. @
  173. nlistl:                              ;Show OFF+ X/ }) E$ @& O
  174. pusha   / G/ Y' ]. i3 j/ d( a8 a
  175. mov ax, 0b800h
    - K2 W; {$ Y8 }, g. v2 ]6 X$ b
  176. mov  es, ax
      t& l% R( _4 S9 S$ _
  177. mov ah, 17h) z7 y: t4 d5 X- s# k2 |
  178. mov al, 4fh
    & O; v( {+ c2 w  ^) J9 r$ p
  179. mov es:[si], ax1 Z, D, x6 Q. Y1 [/ ~7 C
  180. add si, 024 p6 `( n8 P3 w( g, W/ m( Y0 H6 g
  181. mov  al, 46h$ ?8 A' W! I2 n$ E
  182. mov es:[si], ax$ Q+ O8 q4 G6 ^! @$ q( L! D
  183. mov al, 46h
    % B8 P" E& Y/ b$ W: W* f8 e
  184. add si, 024 A  _! F# z5 U
  185. mov es:[si], ax' A& z4 }+ S, ?! k  g0 \' N  T
  186. popa4 O5 T+ R+ T' x( G
  187. cmp si, 1840* A4 B5 O" ^: v) t9 w0 j7 M& a3 z
  188. jae casekey% V0 _8 h! B7 S
  189. jmp testr6 c9 e5 ]5 Q' f5 ?3 |$ }( c  P
  190. . ?9 {2 g" O. B, M2 s9 m; o1 u
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    $ O" x4 c3 A' z) I! _
  192.         cmp     ah, 01h             ;and return a error
    + B3 ~9 M, X( D1 z
  193. je exit1
    4 B9 e# X8 m! W* W- x- q1 l
  194.         mov     ah, 0ch             ;if press other key then clear  k2 u6 G4 `3 n
  195.         mov     al, 00              ;keyboard buffer) E8 M- d) q1 T7 P0 X1 q
  196. int 21h; ~& _) X2 L- N9 p. V+ A7 w
  197. jmp casemo ; v# g' A  S) B+ Q' [% o0 K, F
  198. 9 y* e6 p2 l% i7 g7 i
  199. errormsg:                           ;if mouse driver no install
    4 H& `" U1 A: ^/ s& C) Q+ Z
  200. call oldint
    4 b3 ^8 V0 z4 s" p/ T
  201. lea dx, offset emsg+ B6 N2 a5 ]8 G5 r9 c! h4 W3 X6 L
  202. mov ah, 09h
    ( j7 `, \% n8 W- C  u9 [4 k
  203. int 21h
    ( _5 f0 ^3 p# }$ @- {' a
  204. mov ah, 4ch/ B' ^/ q; h% u! t. ~. l( e
  205. mov al, 2
    " W1 {: m' a/ C* ?, n6 s% C" l
  206. int  21h* F' u& O; v% a: ?. [/ _9 t$ U
  207. # f3 A  H# t7 ^- Y: y7 g7 z
  208. exit1:                              ;error exit% L8 {3 ^) W+ k# n' R4 C+ {. [
  209. mov ax, 0002h" R$ ]0 P9 z0 F0 [6 \3 Q# K: _* w
  210. int 33h
    ! U: t% W' I8 `/ y& I8 r. d
  211. call  cleascr
    & K8 c' T* @$ M& I6 {: f
  212. call  oldint1 p/ ~; k2 a! m
  213. mov ah, 4ch, i" P$ U4 x. @8 A0 e5 D
  214. mov al, 01% H9 P$ O) @6 |
  215. int 21h
    1 i' z# A+ y6 }$ u

  216. 9 L0 B2 E$ S6 |" g
  217. cleascr proc    near                ;clear screen' h4 x0 h  T' z. |: l
  218. pusha
    + Z. y' B" G1 _% V2 C
  219. mov ah, 06
    / k4 f" _/ Q* m: N$ \2 n
  220. mov al, 0
    + _9 t9 G8 V, ]7 ]( K: O8 g
  221. mov cx, 0
    7 P. i2 @/ B; D, m
  222. mov dh, 245 d3 T5 v9 b5 y- ]( M5 N. v$ `2 \% t( z
  223. mov dl, 792 Y# p% z4 b+ T8 k; [! E7 e
  224. mov bh, 07h
    / r/ e3 B, c, W! ]0 B8 y
  225. int 10h
    4 }. ~. v5 ^! R' n& `
  226. mov ah, 02
    4 o& i/ H2 {% @9 k! L9 c9 S
  227. mov bh, 00
    ! l8 C9 P# a; U7 T6 a
  228. mov dh, 0! W" l7 l- F8 N* z4 F! W$ W$ U* e
  229. mov dl, 0
    8 i& b) R5 g+ a% o: T& |" l
  230. int 10h- c" q( I& M  Y9 [3 k
  231. popa
    8 X. l3 c, x+ a
  232. ret( O. ^8 q# ?$ O" ~/ N, j
  233. cleascr endp
    + [7 a( `: V6 P: U

  234. # m8 O3 A# A7 l. z8 t4 l
  235. showmsg proc    near               ;Show info2 x% F6 b% U7 ~4 T4 n
  236. pusha# T! g) N& F7 C  k8 A
  237. lea di, offset showms1 b& p/ v3 Q& D; @
  238. mov ax, 0b800h
    9 v9 Q' v# b7 ~3 |* I8 Z
  239. mov es, ax
    , P# `0 G! L' V
  240. mov si, 07 e' K! C# r$ h  `. Z0 a
  241. mov cx, 480
    9 L% D/ m7 m, U( K! l7 ^
  242. mov ah, 07h. L& L' Z. z6 H$ k- C" `- k
  243. @@:( h- h; N/ h8 ]9 u& Y
  244. mov al, 20h% }" ?! ?. F3 }! N; g6 h; Z
  245. mov es:[si], ax. z( n1 z1 o4 m
  246. add si, 2
    ' M/ \! |3 w4 _, x
  247. loop @b
    2 S  P# I& I% h
  248. mov cx,880, d  l6 l) p6 ]1 ^+ ^1 x
  249. @@:
    7 `9 j2 p; I* {* P; W
  250. mov al, [di]
    / Q- t) P% D/ i/ o- \
  251. inc di% a6 f5 z7 y/ ^3 \) n/ G
  252. cmp al,20h: Z+ v+ i! P. ]
  253. je showch1
    2 |7 t5 n6 p/ T% o
  254. mov ah, 17h
    # q/ h6 H& I/ C5 H
  255. jmp showch3
    0 H) u- E  }: P. C" }* {9 v
  256. showch1:: }; `" _" a; o8 K( M
  257. mov ah, 07h
    ) A6 o% M$ D8 v3 V
  258. showch3:
    + Q! i, F) F- _/ m; r/ `
  259. mov es:[si], ax
    2 p8 i# t6 }6 g7 V) y% H
  260. add si, 29 z9 Q! @* F# J/ L& `
  261. loop @b
    " f/ P) Z, f7 x; j  ?
  262. popa! H9 D' j! e: e3 p6 w
  263. ret4 w* j# M, g  u- h8 z
  264. showmsg endp
    ; L" e, G0 B6 X7 t" F

  265. 2 b/ X, n) o( L( {0 F
  266. oldint proc
    7 {8 P; R# X4 Q* ~8 e
  267. pusha! v1 S# A1 X8 B) p2 Q# y8 t  p5 {) L$ ?' c
  268. mov ds, word ptr cs:[old331]
    ( ?! g3 v8 j  m* Y- {! s0 T0 Q( A
  269. mov   dx, word ptr cs:[old332]
    " y  X+ n) J; u/ ^# t% E: o
  270. mov ax, 2533h3 C0 i0 a' f6 d( ^) o" l! [
  271. int 21h0 I! b$ u+ V6 A  c# H7 z1 r
  272. mov ds, word ptr cs:[old741]
    : M/ M) T7 w3 |+ O& e
  273. mov dx, word ptr cs:[old742]4 W% L$ m6 ?8 k; ]6 _
  274. mov ax, 2574h
    0 M- {: ]  {; s( o
  275. int 21h
    2 i$ d: j/ P0 ^6 G# j
  276. popa3 l7 G9 O, A* l3 R) |# A2 B
  277. ret1 k7 e) Y- U2 R5 z( T; _
  278. oldint endp; }, T- v; G5 X! A! [
  279. 4 ]. P8 _! d0 u, K
  280. memmouse        proc
    : x, ~! x3 `7 t! k  a
  281.         xor     ax,ax  o6 z) s- O; _+ D' x
  282. int 33h
    & |  {* _7 ]- M
  283. cmp ax,0ffffh
    ; [4 ?+ |+ \! [
  284.         jne     not_loaded
    # ?$ G1 v& Y4 J+ a5 {( ?: L% d
  285. mov [memcopy], 1
    * _4 x  o* z) d0 k7 V
  286. ret
      z' J0 {; p# v4 y5 {
  287. - K( V  M  A3 ?
  288. not_loaded:
    * D  W+ h( J1 h8 {# v" P: [% A4 v! W* j
  289. ; w: o7 q5 d! S4 R2 {- Z: {4 x
  290.         mov ax,2574h
    : N$ L0 A- m6 G+ C# L- B
  291.         mov dx,offset new_isr6 B/ k/ n1 j9 M& \) R% L) ]$ ]8 b
  292.         int 21h# D( N" l  w+ x2 L: ]
  293. 6 e6 K; t: B8 v& f# w% x
  294.         mov ax,2533h
    , l0 }: d3 t) d. G2 q/ h+ m$ O
  295.         mov dx,offset new_336 X, `! H/ Y8 [
  296.         int 21h
    & \  s, u$ U: j" R

  297. ) d) [. F/ r) @
  298.         cli6 B' D; L% _' g2 l3 w, i: @# z" p
  299. 7 Q4 |) C+ B: g7 Z1 P1 `4 W
  300.         mov bl,0a8h5 y) X& A# V2 m
  301.         call keyboard_cmd
    & c3 g8 F6 ]4 U- I; S

  302. 2 T2 `- [% L9 M
  303.         mov bl,20h
    " W9 B( M% {4 k
  304.         call    keyboard_cmd4 d' Z: d! B$ S+ N
  305.         call    keyboard_read
    ( p4 m7 D' b4 ?: J. `
  306.         or      al,2
    1 G9 u( s2 J! U( K( y% O
  307.         mov     bl,60h
    7 e  B' D5 i3 |* b" |# ]8 ]2 _( |9 d
  308.         push    ax1 w' [8 t+ y: }  L
  309.         call    keyboard_cmd4 k* z( `5 d# q6 t, x% X( ]/ R
  310.         pop     ax
    ( o% I9 n5 b) A. b& C
  311.         call    keyboard_write
    0 o0 m/ {" [# V# q7 M
  312. 7 w' ]# ^% Y2 w0 L# ]
  313.         mov     bl,0d4h
    " g6 y3 r, G# b  R9 {
  314.         call    keyboard_cmd+ g2 z0 f, X, \7 q, m
  315.         mov     al,0f4h
    - K. g- Y* [" Y5 ~/ i' P
  316.         call    keyboard_write  H  H; K& E  I2 L# Q3 N

  317. 5 D1 o, I( j/ t$ S1 X' V3 f
  318.         sti
    . z) u7 ]8 Y  Q! Q5 {" O9 L& ?
  319.         ret( Q% w' n$ m1 C" }* m( }) i/ f
  320. call_user_isr:
    6 [' M# }6 z6 }: T& U3 z2 j
  321. db      60h
    4 q4 V  z9 h/ k
  322.         mov     cx,cs:[pos_x]0 H# e0 s- j" R" x5 V8 a8 \0 |
  323.         mov     dx,cs:[pos_y]
    $ ~: l9 a' i1 i
  324.         mov     di,0 ;cs:[x_move]
    6 ^* M/ N* U+ p; b" S) E8 t
  325.         mov     si,0 ;cs:[y_move]
    " Z- d0 x- Q0 p( Y" ~
  326.         mov     word ptr cs:[x_move],0, \5 y9 t2 g7 S3 ^3 j
  327.         mov     word ptr cs:[y_move],08 X0 a9 `: D( l
  328.         mov     bl,byte ptr cs:[buttons]% A* [2 ?3 p7 W
  329.         xor     bh,bh3 w+ A2 `: a8 S" B# z/ k6 S
  330.         call    dword ptr cs:[user_subroutine]
    ( W/ z$ Q7 }1 {# T8 P+ v- S
  331.         db      61h
    6 S# F* i: s! k  i  Z; b
  332. ret: u/ ?% P4 n. i  P7 T* d- ?4 j5 Z
  333. new_isr:
    ' y* X1 G$ s2 e5 [
  334.         pushf; q7 Y3 C- f, ]& C  ?3 w; Q
  335.         cli
    - b# R  W2 d9 x( p& _
  336.         push    ax* n* m6 p' R/ {; @2 ^  M. e8 }
  337.         push    bx; Z7 K! z* t; t9 L
  338.         push    cx3 X& F' M/ M$ L% N
  339.         push    dx2 b- N& u3 `& C# ]2 A+ @
  340.         push    di# m! |5 C5 b! P* e
  341.         push    si; q$ E$ K* ^( \
  342.         push    es2 e7 o7 A1 q, j. h
  343.         push    ds
    5 z% G1 W7 ?5 T* ?: Y
  344. 6 S, U1 u7 w9 j1 k9 r
  345.         push    cs
    ) ^% x0 J2 ]/ {' u
  346.         pop     ds
    ( ^$ C& \( N& t2 T% j
  347. ! B7 E$ f( g* H' I
  348.         mov     bl,0adh
    % ~- a! j$ v* `$ U# y0 u* v6 u
  349.         call    keyboard_cmd
    " a3 j( `  Z2 z8 `4 W

  350. 1 D% W+ S4 l0 a6 z# H1 k" s! y
  351.         cmp     byte ptr [first_time],0! W9 A" F% J1 \* Z! ~  \; h; D% ~
  352.         je      not_first_time. F$ V7 ]' a+ K  _4 U1 _
  353. ( k; _. A/ ]' t* v; l
  354.         mov     byte ptr [first_time],0
    $ s* K: I1 f) w* V
  355.         call    keyboard_read
    & S# {. }# ]7 X/ Y" R' b' L0 [
  356.         call    keyboard_read1 e$ w" c2 _) D' h. ^6 b! c
  357.         call    keyboard_read) y. j, v: W' q; E
  358.         jmp     no_show# z0 G3 }" G/ x0 |8 F+ J3 P

  359.   ]0 x+ ^) o  G8 r% D
  360. not_first_time:% \$ U) `6 {1 s. `5 o  N
  361.         mov     word ptr [temp_mask],08 K* k9 z/ q; k  D, c1 o
  362. 9 n6 @; ^0 O8 a8 r2 v' ?3 p
  363.         mov     cx,[pos_x]
    0 J( l7 m% w. ~2 U; W1 ^# U9 `
  364.         mov     dx,[pos_y]
    3 M9 @. p5 \5 z( x! y
  365. , `& h( R& x0 o- u, N! P  W" I
  366.         call    keyboard_read
    5 m+ P" g  ]' c- _
  367.         and     al,7 ;3' C# e2 S3 R- {
  368.         mov     ah,[buttons]
    5 k0 ?8 S" f9 a' D8 B- T/ G# W
  369.         mov     [buttons],al9 p6 y- H5 W/ |( o
  370.         cmp     al,ah( |5 L7 C1 o- W/ O0 B1 E- u
  371.         je      no_button_change
      p: m- j1 p) a8 C
  372.         and     al,3
    : Q  G* s' c" H, B/ Q& L/ l4 d
  373.         and     ah,3
    * v8 ]$ D4 L5 ]+ `2 q7 c; T* F
  374.         xor     al,ah
    / D+ `: W. k* W& J
  375.         xor     bx,bx( Q+ j8 K& L: s7 v6 J! d
  376. ' f* G  P  `/ y5 O, A$ N
  377.         push    ax
    , m- |! h8 n" r9 d1 S
  378.         test    al,22 ]8 n$ I4 o! J1 P5 N, f
  379.         jz      no_right_button_change8 Y; \! J' A" Y/ l$ {; [
  380.         and     ah,20 u5 X8 q4 Y- o1 I& ~& R0 |
  381.         jz      right_button_pressed- [# y9 F! r+ }+ x7 c1 Y' K1 M
  382.         or      bx,16
      Q% j; L5 b' V) a* K1 q$ ?2 c5 I
  383.         jmp     no_right_button_change5 |3 K; b4 R: l; g# b
  384. right_button_pressed:
    6 ^9 i* W/ _" t- f7 l
  385.         or      bx,8
    - ]. V$ M) Z! K. G3 ?1 Z8 K7 B, w" h
  386. no_right_button_change:5 X# A; o5 K# a! \
  387. + Y# O2 ~& x3 D" b- I
  388.         pop     ax
    ; [+ c' B9 B0 N. J* ^; n
  389. ( i/ X1 y" d; [; ]# [, F
  390.         test    al,14 k0 S* K& _* U
  391.         jz      no_left_button_change4 l, V9 P5 \# T! G6 F) A; N
  392.         and     ah,17 ]1 D3 J+ {! U4 e1 {% D6 |, o0 t0 _
  393.         jz      left_button_pressed# {9 [. h( }2 r1 N6 |; @
  394.         or      bx,4" b, n4 D! L. \4 Z- U+ M
  395.         jmp     no_left_button_change
    * \% q+ f/ v0 M& u* I
  396. left_button_pressed:
    " K" L/ N( h. K
  397.         or      bx,27 h+ }5 R2 f; P8 K5 D9 Y
  398. no_left_button_change:- D, g% g1 S# |' O1 k( l3 ?
  399. 0 p" J3 d0 d. B; C7 R
  400.         mov     [temp_mask],bx
    ) v" @3 J/ A9 d6 C4 k7 b$ N

  401. / R5 f( j+ M+ \6 J1 f  s
  402. no_button_change:" k' D) _/ d2 N2 R- h- H
  403.         call    keyboard_read
    ) c" P( K2 f2 d& |
  404.         cbw
    * L& B/ M; I1 `/ K
  405.         add     [pos_x],ax
    9 a, q+ h: `3 o! A# v
  406.         add     [x_move],ax
    % w% @3 e/ w& q, X& a  q0 v
  407.         mov     ax,[x_min]
    2 q6 q  l- f7 g" j$ {% w/ Q, x6 w
  408.         cmp     [pos_x],ax
    ! R* c( }: i( a1 g3 S
  409.         jg      good_hor18 K2 m$ [5 k8 R* x1 y6 Y
  410.         mov     [pos_x],ax
    / q1 F2 p( x3 R$ f" g5 o! U
  411. good_hor1:9 f; a- {- R6 T" _. ~- X2 H" W3 z
  412.         mov     ax,[x_max]
    * ^+ q; g( Y+ J& m- d; }& M
  413.         cmp     [pos_x],ax! E% P; f; q3 ~$ V0 {5 x0 k
  414.         jle     good_hor23 i  e# Z6 S( [
  415.         mov     [pos_x],ax
    ) O' f+ ~9 i2 k- U
  416. good_hor2:
    6 f. ?* K, {8 [- L
  417. 4 B5 c- r3 J7 a$ R; K7 ?
  418.         call    keyboard_read
    5 V9 ]: @# y7 r+ {- T3 X4 ]3 Z
  419.         neg     al0 E3 Y* u# X4 t
  420.         cbw8 h8 K( n8 _1 y; z
  421.         add     [pos_y],ax
    + N. ~" P  F$ p+ U3 I: I
  422.         add     [y_move],ax7 n9 O# K4 C$ |: b/ @
  423.         mov     ax,[y_min]
    . n. ]: q7 m# M; `( A& J
  424.         cmp     [pos_y],ax2 a5 q! A* \1 x9 V
  425.         jg      good_ver1
    ; o5 T% G# r6 {) N; T6 b$ O
  426.         mov     [pos_y],ax
    9 K6 B# M6 n0 Y6 }; G# c8 R
  427. good_ver1:
    ( k6 d5 A0 c" U
  428.         mov     ax,[y_max]
    + K; j3 M) Y8 v8 e* f( O9 B9 E
  429.         cmp     [pos_y],ax
    . y! m9 I; }* _* i  @: n3 E2 K
  430.         jle     good_ver2. D+ ^1 w. l, e+ G4 k2 H! j
  431.         mov     [pos_y],ax, I" ]  S" M7 }+ X2 E# m& y* X
  432. good_ver2:7 ^- F* L9 i2 M
  433. - P1 c/ p! g  [0 `0 B4 G* {
  434.         mov     ax,[x_move]
    " @3 I, c- X6 W* h
  435.         or      ax,[y_move]$ V& @: b1 M+ U. K/ W
  436.         or      ax,ax5 ?* p) B& \5 P; r
  437.         jz      no_change_position+ o) |, E) a, ?! u* P' V0 z: I& k
  438.         or      word ptr [temp_mask],1
    7 S3 k4 m# i; d( Y
  439. no_change_position:# c+ t/ v/ x& I; X5 F; b

  440. 8 A/ P, f# ^4 R) `
  441.         mov     ax,[temp_mask]! b) R1 {# |/ h1 }! U& f3 p
  442.         and     ax,[user_mask]0 g3 Y: ]' L8 w1 E% u
  443.         jz      no_call_user
    4 }& c. _9 }- o, f9 H) p1 v4 y
  444.         call    call_user_isr  M  H0 W( K4 v( Y
  445. no_call_user:
    & T; x3 D- j. _" K6 ]
  446. * m+ c; N' D$ E' b: @
  447.         cmp     byte ptr [sm_flag],17 D) \# ~6 g' g% f* r
  448.         jne     no_show/ P4 {1 z, t; }0 z  \" ]* U6 |
  449. . u# r3 O/ F7 F* p1 Q
  450.         shr     cx,3* S# P3 ?& X% v5 H, _
  451.         shr     dx,35 l8 o7 o+ W% O. \6 Z
  452.         mov     ax,80- @" S. n0 {2 ^9 [2 z' O+ N
  453.         mul     dl1 [. a+ q6 f3 f( j9 v$ h
  454.         add     ax,cx% n. F0 H6 h2 e4 ^- `5 q1 R
  455.         shl     ax,1/ T5 [1 v7 W! l! }9 N0 ^
  456.         mov     di,ax) q! {( {5 l- r1 A5 Q2 E. l2 P+ Q
  457.         mov     ax,0b800h
    1 d, [* @' l% w1 A* j( h
  458.         mov     es,ax0 h2 {; Y. P! `5 [
  459.         mov     ax,[save_char]& T& ~! @0 l1 |4 s8 S
  460.         stosw
      w, F; y6 V8 {
  461. 7 `4 Y1 l. l# N
  462.         mov     cx,[pos_x]
    ! K& w- Z3 S0 H  b, s- [/ U2 S
  463.         mov     dx,[pos_y]' `( ]' d- n& O7 r$ \* |' m
  464.         shr     cx,3( }8 R# U. a9 i. i& G+ F; @/ g  Y
  465.         shr     dx,33 m. z( r8 ?) u+ s
  466.         mov     ax,801 O1 A7 g5 A1 T
  467.         mul     dl
    ' b; b/ q; M2 J+ K, A8 q* T$ n
  468.         add     ax,cx
    6 h- ^- w8 P& Q/ X& ^4 F# E$ @
  469.         shl     ax,1
    * y, ~; K1 Z& V% i
  470.         mov     di,ax
    - Z" D: ^* e% H  J' d7 |
  471.         mov     ax,0b800h. J  R/ l5 |' P& o8 [2 b
  472.         mov     es,ax0 t0 O% d; l) }
  473.         mov     ax,es:[di]
    / X/ p  ?; e- W# v9 _6 k
  474.         mov     [save_char],ax2 L4 f3 o6 s4 y/ n/ c
  475.         not     ah; r! @3 N" s" w7 U$ S4 |( |
  476.         and     ah,7fh, d! B8 T: W3 N' {; p, e, ]
  477.         stosw
    ) e7 n  o  j3 s; m
  478. no_show:( S% g6 E/ _6 H1 N, V. b
  479.         mov     bl,0aeh- e( p+ [6 d9 d) A3 z, P
  480.         call    keyboard_cmd/ L- M( R, o( c, _
  481. ' g1 ?8 M9 n, Y4 [. K& l2 Y, Y% M
  482.         mov     al,20h
    1 C" Y9 G+ q9 l8 D
  483.         out     0a0h,al
    * _8 c6 t' T5 ~- H! g  t3 X2 K
  484.         out     20h,al  O4 A3 O: i1 Q- U4 t5 q
  485. : I5 z6 v) I% S1 T+ J" T% J' ?
  486.         pop     ds
      I' A/ q7 L/ t$ _) ^
  487.         pop     es
    ( w( z( z: [. O" W
  488.         pop     si
    1 _. z9 e' a1 N
  489.         pop     di- U; v1 m3 D1 ?4 a
  490.         pop     dx
    ) I' S4 [' [# Z1 P% W' Z# k4 e
  491.         pop     cx/ U7 c" R, b: B4 [* V
  492.         pop     bx. h+ _5 R8 N! N% j
  493.         pop     ax4 Q! `. R6 ?  [
  494.         popf$ k8 S" Y6 z9 s, }* z2 q
  495.         iret' n! i5 q% Y8 a# ^4 y1 K$ H

  496. 1 r# m: [6 _; u+ l  t" ^! T
  497. first_time      db      10 s* k2 j# M/ L& _
  498. buttons         db      05 q: p' Q9 T. v, f' n( }! \3 b
  499. pos_x           dw      00 x) X1 I! l! g9 T6 p7 K
  500. pos_y           dw      0$ b+ `7 A, G& w1 p) [" X
  501. sm_flag         dw      0
    # Q7 q0 D" z& \: \6 S
  502. save_char       dw      0" j% b; U2 F5 T$ D! y3 x
  503. x_move          dw      0
    * n8 ~' c/ g; |8 R/ I
  504. y_move          dw      0
    . R& n3 b) ^+ o6 }7 i4 v
  505. x_max           dw      639! w2 E3 F1 D2 {& `
  506. x_min           dw      0
    . L1 Q! b+ g5 W$ W% {. a
  507. y_max           dw      199
    5 i& N. O% k' C' T% ~; \: k( z
  508. y_min           dw      0
    9 P) A# n0 }- a2 k/ H
  509. user_subroutine dw      0,0' C* y+ G" T8 @5 s
  510. user_mask       dw      0
    ) v/ m* j. s" b5 \6 z7 `4 Y
  511. temp_mask       dw      0
    0 G. S/ ^* o: L0 R! e9 c
  512. , B1 F3 ~- n8 \+ o& [* A
  513. keyboard_read:0 ^; [" ~+ ~& R
  514.         push    cx
    : B$ O6 \3 n8 p4 \# ]$ x( l
  515.         push    dx8 x1 l8 ?8 T- l5 w$ }% {. B
  516.         xor     cx,cx
    , C2 j  e0 [8 Z9 g- m  b( k2 r
  517. key_read_loop:
    ( E6 o# l, ^. s3 t9 u
  518.         in      al,64h/ W. w$ e- ]% R6 @. |6 S# |
  519.         jmp     $+2( g9 R2 h  |: @( ]$ ^
  520.         jmp     $+2" y: R, d9 B' N7 T0 K4 b
  521.         test    al,1
    5 F6 g! a8 W, F+ ^
  522.         jnz     key_read_ready- \% \% t1 U: S8 G; w0 i& N0 |
  523.         loop    key_read_loop
    : [, Z; ]3 S+ r5 E# k8 c, i6 N4 U9 K
  524.         mov     ah,19 e: n4 K7 E* s7 w7 Z- O6 E# K
  525.         jmp     key_read_exit7 Y9 S; e9 _7 y- s7 n
  526. key_read_ready:! U9 @" F) p+ o, J' a; v, b. w
  527.         push    cx
      A8 U/ Y7 l3 Q7 e+ b( p
  528.         mov     cx,32: a# B7 Q# E5 ~  L
  529. key_read_delay:
    ( l, |2 |- ?7 w0 @1 X( M- G
  530.         jmp     $+2% w! [  ^1 x- b) I# P9 ~
  531.         jmp     $+2- `  Z( I/ b- h& g& h( v) U
  532.         loop    key_read_delay
    + a7 E& L# ]9 E

  533. # T, s2 \. C% C1 m, O
  534.         pop     cx  O( o# B8 h: ?: b- ?; q
  535. / {# I7 s2 g! m2 Y, Y( |. f/ V
  536.         in      al,60h
    , H7 K: H1 s9 _9 s! K
  537.         jmp     $+2
    7 E& }( ?  a0 l( j1 D2 X0 E1 k
  538.         jmp     $+2$ }% n# L$ {0 ?; c" }" p( C) _  [+ G
  539.         xor     ah,ah
    % ~. e) y; T! l; l" \$ R
  540. key_read_exit:
    # i2 [+ v, N6 V2 Y
  541.         pop     dx6 X1 P$ _! m5 j8 A! }7 R  ~
  542.         pop     cx
    ! H2 Q' o6 S* U; X8 O, X6 x' J& w! {. I
  543.         ret3 G; {" `9 z- j4 u/ Q5 W

  544. 0 p4 X7 c" L( |6 ~0 j5 A/ k& X1 g' ~
  545. keyboard_write:
    " F% ~) q  H3 Y$ B& j
  546.         push    cx% e+ `+ Y" F8 ]( Q8 t
  547.         push    dx
    ; v3 Q- ~5 a( D1 t2 v3 P; t
  548.         mov     dl,al
    7 x! l! v3 r% [$ J: G8 K
  549.         xor     cx,cx
    % }' i* g* j# t8 @! `% x) p
  550. kbd_wrt_loop1:
    3 ]$ Y6 f9 O7 j2 v; e
  551.         in      al,64h- V# T* I5 }* V  n5 ^- \; U- z
  552.         jmp     $+2
    0 X$ M+ V/ `+ ~% O0 w  B# I2 v
  553.         jmp     $+21 p$ c7 c0 c* d% u0 q" [
  554.         test    al,20h# p/ S# d1 B, x2 P
  555.         jz      kbd_wrt_ok1. l" S, f' n9 y, o. s# s
  556. ! {( U6 C% X1 M! c4 E
  557.         loop    kbd_wrt_loop12 ]  r2 [# \4 N6 R# _4 s* P
  558. ) w! ~. ?  P5 L- I# r! ^- J2 [4 L" d
  559.         mov     ah,1
    ! L1 I, t* _7 }' t$ Z% m. ^" X+ h# _
  560.         jmp     kbd_wrt_exit, r: m+ C+ l% a
  561. " K* g( X& A1 a& \) x5 n
  562. kbd_wrt_ok1:
    . Z' N4 P. d& P8 j4 j
  563.         in      al,60h* x/ \3 D# L7 ]1 a" l3 U) U

  564. # t8 S: ~. L7 E3 v1 w( `
  565.         xor     cx,cx2 l  Q# K/ r. V. N  ]3 `
  566. kbd_wrt_loop:
    ) F, M  h  P( i+ P: Q
  567.         in      al,64h
    ! q* u- l# a8 Y1 G# Q2 N
  568.         jmp     $+20 }+ j3 U0 r+ w; t; x4 {3 z% w
  569.         jmp     $+27 C' N+ L% f4 M( r3 p  l2 w$ }& m
  570.         test    al,2
    $ E# l  z: |* r- z. Y! a
  571.         jz      kbd_wrt_ok
    * |; ]& J& O3 U* t8 A

  572. $ z  Y$ L& w, ?
  573.         loop    kbd_wrt_loop
    0 j* I. q/ _2 u/ z7 P  M

  574.   n7 U2 v1 p% U
  575.         mov     ah,1! _" z: U9 s) T6 S9 {2 I5 G
  576.         jmp     kbd_wrt_exit+ B8 u0 S9 D, {5 R) d
  577. 1 b: ^; p0 ^9 x+ L' C' T
  578. kbd_wrt_ok:- y8 a! P/ \; P7 [0 ]
  579.         mov     al,dl
    $ |) H$ n- B& M
  580.         out     60h,al( O% L0 M& Q* o
  581.         jmp     $+2
    " }. i1 s/ k8 {! |5 e& \9 l
  582.         jmp     $+2: E  e4 @4 t/ \9 T
  583. 6 [4 v0 ~' c% Y. O
  584.         xor     cx,cx
    ' d! g1 f2 I2 b) @8 w7 X" L
  585. kbd_wrt_loop3:$ K% _3 s- Q" i: W2 Q- x5 p* W
  586.         in      al,64h  i/ t  N2 h. \  v( K# `& x
  587.         jmp     $+2
    6 y6 R/ \0 [; E+ u; C+ K2 J
  588.         jmp     $+27 Q( W3 p- `6 ?0 G3 P0 i* E" P8 ^! K
  589.         test    al,2
    ! v: e4 A! B% O6 U0 e/ S1 D
  590.         jz      kbd_wrt_ok3, H( N: s% u0 B

  591. 1 y: f  H$ B' S2 b. c5 z& b+ Z
  592.         loop    kbd_wrt_loop3
    ; Z5 P/ d7 a2 [- R* M
  593. $ N- e6 r; E# ]1 U
  594.         mov     ah,1
    . h- |$ i' K& R; _% Y
  595.         jmp     kbd_wrt_exit- B. }$ Y6 E; ?+ _+ `2 x( y

  596. * j& W/ H7 ^+ `9 S+ o  o& H* N
  597. kbd_wrt_ok3:
    : I' A( |) V, J4 }9 I1 B0 a
  598.         mov     ah,8
    - u% S: Z. A- e3 ~- C
  599. kbd_wrt_loop4:& V/ d9 s6 G5 V. Q8 K. W+ @0 ?  d) B
  600.         xor     cx,cx
    3 |2 O* O) o$ }/ ^0 @. T1 m$ h
  601. kbd_wrt_loop5:
    ' ]! q- M  ]3 T" G$ R( M
  602.         in      al,64h- S$ {% ~0 n; B6 R
  603.         jmp     $+26 k7 Q3 ~7 c) z' a6 w& L& O
  604.         jmp     $+2* i* y/ c' p3 f) [* v& K0 L$ r
  605.         test    al,1
    . g7 t8 o# P; [, F3 g
  606.         jnz     kbd_wrt_ok4
    $ p) U% d7 T. Z6 D5 \/ l) T

  607. ( w( e$ l7 H2 i) |2 q3 E6 X5 g2 K  S
  608.         loop    kbd_wrt_loop56 y6 V9 U" U: d4 A
  609. : R& d  @! |& T3 Y" Q* ?
  610.         dec     ah
    4 @1 B5 G* t9 J9 b, g$ f
  611.         jnz     kbd_wrt_loop4
    ; e2 p( h. f6 r6 x; [- k

  612. + f& X% {! h& D) c5 k
  613. kbd_wrt_ok4:7 s# _* L2 b- {* m  e
  614.         xor     ah,ah
    $ z0 h2 ~1 b- U5 U
  615. kbd_wrt_exit:
    9 E% B* f$ k" u- d1 d1 K1 T  F4 u
  616.         pop     dx
    - u# t7 O+ e3 C
  617.         pop     cx
    % R7 X! y' ]' {5 i
  618.         ret5 {3 p8 P  w2 Q, g+ r
  619.         * \- \: j2 L6 A& s( x
  620. keyboard_cmd:
    ; B8 y, e4 G* w% Q* X! l- I6 }3 n
  621.         xor     cx,cx% S3 E" e0 b! d' z( m) ~
  622. cmd_wait:8 C# ]" [: j) {
  623.         in      al,64h  M' y: b* S9 R1 |: a. z
  624.         jmp     $+27 u; O4 f8 r3 I: T+ i4 U
  625.         jmp     $+28 ?! e( s+ E5 f) x) ~- P
  626.         test    al,2
    # V3 G+ I9 K8 D. b7 R
  627.         jz      cmd_send( O) w9 _6 a1 o1 p3 U, v: s  U
  628.         loop    cmd_wait. p8 }/ x, m9 H" ?

  629. ! u9 e& U/ u3 A+ W; b8 I3 p5 O
  630.         jmp     cmd_error2 D" @; ^7 T  P3 @

  631. ' e4 e1 A% l# I6 Q
  632. cmd_send:# X3 M; |0 B4 H4 F, T3 @# i+ d* [
  633.         mov     al,bl3 U$ D9 S% {8 b7 p8 _( Y2 a
  634.         out     64h,al
    " V& g/ n- ^( f
  635.         jmp     $+2$ B, e2 K  X6 p
  636.         jmp     $+2
    / t& l% w6 G8 Y) V( ?& R% O: t
  637. ; J3 ?/ P% d' b# v; D
  638.         xor     cx,cx4 ?  E/ l! u2 g) y
  639. cmd_accept:
    / S+ U6 [& q. g$ f
  640.         in      al,64h  Q6 `1 b  g" O7 |- Z; W9 T4 c' ~
  641.         jmp     $+2, s9 R9 Q5 d) _6 D% ~! \- ^
  642.         jmp     $+2
    3 }& S8 c% b$ I6 L0 _  y$ V
  643.         test    al,2$ _5 i6 n$ F( V
  644.         jz      cmd_ok' r7 @5 ^9 D; Z+ T5 a9 ^
  645.         loop    cmd_accept
    - ], t/ k- s' ^2 U  G( ?$ H" M/ X

  646. ' U1 z4 m" b: r, M9 a9 ^5 i
  647. cmd_error:
    ' S/ K9 Y, T. x8 ]- B+ B
  648.         mov     ah,1# L$ j2 C# {% P) F, N; C
  649.         jmp     cmd_exit
    ( H  `, U! S: l" ]2 u4 @* @
  650. cmd_ok:# m, f+ T$ S4 @+ {& A& {) w5 a
  651.         xor     ah,ah
    ( P1 a) X1 N9 {1 {
  652. cmd_exit:
    " L% I1 R" a- w: J6 v  `
  653.         ret0 C& m8 A' d# E2 `- j
  654. * f/ W* P! t( E7 n1 m
  655. new_33:; U7 f# L7 f4 D
  656.         cli
    4 G2 e- A" Z5 A' D/ t' u' |6 z
  657.         cmp     al,00 C' k5 x9 T) a& L
  658.         je      reset_mouse! a6 p" z3 f" ?$ Y" b1 p! g; M! b6 W
  659.         cmp     al,13 K! q: A. p5 e2 Y0 I: d
  660.         je      show_mouse
    ( E4 h, U! e* V* D
  661.         cmp     al,2
    / [  W  d3 b0 o  Q: c; A! z2 P
  662.         je      hide_mouse, P2 A5 N, {$ ]! a' a
  663.         cmp     al,3
    ) x% A- I' u% z" f* J9 i4 y# p
  664.         je      get_pos
    , a6 Z' I& `: g. r+ ^# L
  665.         cmp     al,4
    5 K& @5 D; F2 b
  666.         je      set_pos& F* C- K. j6 g; R( P- g2 `, I; }
  667.         cmp     al,7. w& h" K' y  ?% k2 m/ Q/ X& q# Y
  668.         je      set_hor_pos
    $ Z% \% w9 T& k
  669.         cmp     al,8
    - S* _8 ]: Q9 @2 X% m
  670.         je      set_ver_pos
    3 s: E/ A: Y  i- s1 C$ s3 N
  671.         cmp     al,0bh" n# H, ^3 {/ D! M5 z" W' u
  672.         je      get_mouse_movement
    , B  ?* F: m4 [3 l0 M5 x
  673.         cmp     al,0ch  }/ K" d8 z' q  a0 m, @2 b
  674.         je      set_subroutines
    " C- ^2 I: ]# W. K$ H7 e% D8 \* h! V9 U5 q
  675.         cmp     al,14h
    3 ^. s% x( u. i* n8 |
  676.         je      swap_subroutines
    9 E4 h( K+ S" [6 n
  677.         iret
    ( @/ j5 r/ c% f5 A8 D4 v( ^" S

  678. # A; _. T1 N5 ]7 F
  679. reset_mouse:
    8 _9 C& U4 @* H* R
  680.         jmp     _reset_mouse
    ) b1 @" r+ G& S6 p7 y
  681. show_mouse:, |) A; `# C) B
  682.         jmp     _show_mouse
    ! w3 T7 M0 g/ Z' i& Q' h
  683. hide_mouse:
    ! ]* }* p9 q! R! U; ~- Z8 I
  684.         jmp     _hide_mouse$ I. T" o% X* s+ N' {; A
  685. get_pos:
    ' i  B5 M( A) {2 n
  686.         jmp     _get_pos) `8 z# q* h1 m" J9 A
  687. set_pos:
    . [% ]. e9 l# G! g$ Q! a
  688.         jmp     _set_pos
    9 t' u; x0 E& A! r( ~2 e* h
  689. set_hor_pos:; [' C8 l4 m4 G9 n' h
  690.         jmp     _set_hor_pos
    3 z, r4 H) D4 Y$ |5 Y
  691. set_ver_pos:2 i6 K2 K+ U/ {# a
  692.         jmp     _set_ver_pos2 l; o" Q& o2 d" L1 f5 [
  693. get_mouse_movement:/ I5 b8 r8 A2 ^3 S+ ^  }: r
  694.         jmp     _get_mouse_movement
    6 v# L1 s4 ?, Y
  695. set_subroutines:
    + ~9 n, w8 a+ \- Q  s* p
  696.         jmp     _set_subroutines
    1 Y3 |/ w' ]5 r7 ]5 o
  697. swap_subroutines:) u7 j' f9 C# `3 V' S
  698.         jmp     _swap_subroutines0 m) ]& q# g/ P9 f2 |& c! n& e
  699. 5 L) R+ ?6 r# G4 n' {! h( l* R+ [+ `
  700. _reset_mouse:9 F7 Y# A* a8 l, r. Z
  701.         mov     byte ptr cs:[buttons],0
    " t$ U- u, o& q! s- P5 V$ f
  702.         mov     word ptr cs:[pos_x],0
    + k! b7 ~$ o! ]
  703.         mov     word ptr cs:[pos_y],0
    % n7 f, L3 I" H' Z* r+ E9 K
  704.         mov     word ptr cs:[x_move],0
    3 k9 o# t' q$ m# p6 @
  705.         mov     word ptr cs:[y_move],0
    . l) {- N" ]9 a, b; `; B
  706.         mov     word ptr cs:[x_max],639
    - C) t/ X& Q! J/ E4 C: u
  707.         mov     word ptr cs:[x_min],0
    ; J  A# n+ o* k& R- W8 F" Q% j' v
  708.         mov     word ptr cs:[y_max],199
    : @4 g6 q- ]! v
  709.         mov     word ptr cs:[y_min],0
    + P" o" m" J: _( {/ A2 M0 f9 A8 _4 Y
  710.         mov     word ptr cs:[user_mask],0
    * `8 c+ j3 R, I5 y- ~
  711.         mov     word ptr cs:[user_subroutine],0
    5 }- n  t5 }- Z3 z
  712.         mov     word ptr cs:[user_subroutine+2],0( X% I1 Y4 Z, r! d1 Y
  713.         mov     ax,0ffffh* H2 t! y" f( L% Y0 f
  714.         mov     bx,3+ N9 X9 Z5 y; W9 r- V4 ], F- J+ u9 h6 c
  715.         iret  Y! H# F3 Z; [$ D) F, N

  716. & i# {* u  \& B7 t/ [1 h1 a8 q4 L1 ~
  717. _get_pos:. b% L* B6 v. i6 [/ z! \$ X* G
  718.         mov     cx,cs:[pos_x]4 @9 l0 G! ]$ d; C7 h
  719.         mov     dx,cs:[pos_y]1 e) @3 Y  D! ^# s  Y
  720.         mov     bx,word ptr cs:[buttons]
    " {1 ~$ ?1 \" }1 g. V
  721.         xor     bh,bh4 D% O/ }: Y/ G2 A& B2 ]- r" E/ b
  722.         iret
    3 L' p/ S+ {' C! _
  723. % P! W; z0 J9 T+ K/ {+ j
  724. _get_mouse_movement:  j0 c* R. |6 X
  725.         mov     cx,cs:[x_move]( t+ v0 F' C# Y8 E" l, F
  726.         mov     dx,cs:[y_move]( h; \( `8 v" f8 p
  727.         mov     word ptr cs:[x_move],0
    - c7 m2 o1 ?+ X3 {! c
  728.         mov     word ptr cs:[y_move],0# P4 @# [% G/ B, e( s" y
  729.         iret
    * I; C$ U3 \& O# t; l; f4 Z. G- l

  730. ! r3 w8 K7 g/ c- |& s; ?
  731. _show_mouse:- j% `. \; [3 Q3 p; f. W; h
  732.         push    ax8 N1 s  o6 ^1 F: g/ f6 V
  733.         push    bx3 y) y  m4 O! M" r5 b
  734.         push    di
    . f7 }: F+ s2 l7 Y
  735.         push    es
    , _2 I8 v. `6 ]; j: e1 r
  736.         mov     byte ptr cs:[sm_flag],11 K( s! I: _, ?8 }$ m. t
  737.         mov     ax,cs:[pos_y]
    , h4 p: f9 f4 n. D8 N
  738.         shr     ax,3; b% x( `: U2 y, G" n) \: w
  739.         mov     bl,80
    % |7 M; {3 h. }% A" z( ^. d
  740.         mul     bl
    $ q$ \. q- I4 T
  741.         mov     bx,[pos_x]  Z0 S) f6 ^  g" x+ ^! g! T
  742.         shr     bx,3
    & f+ O1 L/ x  l- o1 F  I
  743.         add     ax,bx1 k) h( a6 G# q+ {+ d$ R* u2 |
  744.         shl     ax,1  A& r" Y( p- W& r6 t5 }
  745.         mov     di,ax
    5 f7 n, l8 O9 \( M. {. H
  746.         mov     ax,0b800h+ C* v1 K, U7 i: T9 R% r
  747.         mov     es,ax
    $ X  |% r, C, Y1 {0 X
  748.         mov     ax,es:[di]# `/ E# v# i9 B% ^9 D% o
  749.         mov     cs:[save_char],ax
    " \% v$ P" k0 ]; P$ E; O/ q5 n! t
  750.         not     ah3 I9 _3 a. ~! V7 Y
  751.         and     ah,7fh
    4 H; F  @+ v& n; q3 C& O, ]6 ^
  752.         mov     es:[di],ax$ V' `' [2 b) D' r
  753.         pop     es
    0 `5 Z, s; \, n
  754.         pop     di' C8 {& V+ Z/ y; y! s9 W2 V
  755.         pop     bx: a# P* x- H4 z& ?8 h
  756.         pop     ax
    9 r! U0 y' y* a: S1 H  |
  757.         iret4 `$ E4 o: D# V/ Y

  758. 2 N, s- ^  w/ q4 c1 Q
  759. _hide_mouse:
    9 c! ~: n$ S  O, `, i: L8 }
  760.         push    ax
    & C7 H. F6 ~4 v' E  j
  761.         push    bx1 h, G$ z3 m3 s2 M7 [- ]
  762.         push    di; [8 K9 e, @" z5 X
  763.         push    es2 `# \: z6 Y5 \3 ]$ l! y( p
  764.         mov     byte ptr cs:[sm_flag],07 ^! |9 x, J$ ~$ w4 Z
  765.         mov     ax,cs:[pos_y]
    * M; T6 j  ^4 E
  766.         shr     ax,3% p. J/ S: T/ D# N, W- _
  767.         mov     bl,80
    : f8 \! [, S* `/ D: U5 k) G
  768.         mul     bl. J* x8 a) [6 N2 v  w* V) M
  769.         mov     bx,[pos_x]
    / ^/ f- U5 p1 y
  770.         shr     bx,3
    - B5 i; z  p/ J; C5 e+ X. a# l$ p
  771.         add     ax,bx; l* `5 c) t( ~' r- B
  772.         shl     ax,17 k3 f1 r2 P) v* C6 A" N# }! |
  773.         mov     di,ax
    , q) p9 t6 m$ _- q8 u3 f
  774.         mov     ax,0b800h9 h' M% M+ k0 e- y+ N5 W: L5 n
  775.         mov     es,ax1 J5 ?1 G7 d; x# ~
  776.         mov     ax,cs:[save_char], e. w) V" P. X4 j# P
  777.         mov     es:[di],ax! j; G6 s$ V" a% E9 ?) H: Y
  778.         pop     es
    : z6 J6 r1 P+ X" a- i
  779.         pop     di0 ?, X! C5 h9 D3 M4 B
  780.         pop     bx9 m/ q5 }+ E1 v5 q
  781.         pop     ax
    ( R& h7 Y' R6 f  a
  782.         iret7 c; q4 C1 J' ?
  783. # G6 J; a& S1 p4 |$ K5 j7 J
  784. _set_pos:# c7 H: z4 ^. q4 v- H6 `' m  {
  785.         mov     cx,cs:[pos_x]
    - z5 E: C( I: C) b$ I* @' x% n0 |
  786.         mov     dx,cs:[pos_y]* @1 g( V* ^- w+ O6 \0 H
  787.         mov     word ptr cs:[x_move],07 R. G0 }( U! j+ s- A8 j
  788.         mov     word ptr cs:[y_move],0: p+ U$ n# `  {
  789.         iret  ^& c" b- P* _3 }, Z+ Y1 G
  790. - u+ I% Q0 {" x$ ?( A2 A
  791. _set_hor_pos:2 }0 F- ~0 l) o8 j$ E% ]  g4 k! x$ a% A
  792.         call    max_min# C; `# o$ H* z# R. _7 S( O0 T# \
  793.         mov     cs:[x_min],cx# P) l; d( N( [1 V1 _
  794.         mov     cs:[x_max],dx- {! r1 p. T3 {6 ?/ p' Q
  795.         cmp     cs:[pos_x],cx; F6 r3 b8 c- l! Z
  796.         jge     good_hor_min
    ' F0 |1 y4 K  d# q. y# `8 N) @
  797.         mov     cs:[pos_x],cx
    + B+ o/ R% }* J& `, {
  798. good_hor_min:
    " _. K' A6 A5 @2 T7 c+ U
  799.         cmp     cs:[pos_x],dx
    / n+ b1 v% S8 L& I
  800.         jle     good_hor_max
    ; ]1 ~) H. d6 ~5 }8 H: Z( A) t6 T
  801.         mov     cs:[pos_x],dx. V: X& c$ o  K  }6 Z. v
  802. good_hor_max:+ x: c) W5 l  @4 u8 l/ t
  803.        iret
    4 M  L2 I8 w$ d6 a
  804. - r0 Y7 B# R- X" p! A
  805. _set_ver_pos:
    $ |4 f' d% D; d( O. w+ t( L
  806.         call    max_min
    / v' U8 g" Q6 G- I+ A3 j( ~0 a* `! F4 ^
  807.         mov     cs:[y_min],cx) @3 g  i1 Z% Z! y9 z/ j
  808.         mov     cs:[y_max],dx
    2 p0 s9 U1 w9 \
  809.         cmp     cs:[pos_y],cx( [3 ?3 g  J. C( t0 U( }
  810.         jge     good_ver_min
    - i3 M. z1 Y; A! Z7 |2 |
  811.         mov     cs:[pos_y],cx
    $ h. I" V2 X( ?3 G, k, Z' i- C
  812. good_ver_min:/ [1 w! [5 \7 c, R' w
  813.         cmp     cs:[pos_y],dx0 j7 K' |  b/ ^+ h5 N
  814.         jle     good_ver_max
    0 ~2 E6 ^$ o7 w6 I% H& {8 G
  815.         mov     cs:[pos_y],dx
    - D2 v8 k1 U, Y9 [/ ?3 U/ H/ b
  816. good_ver_max:: Q7 M) J* b9 w
  817.         iret
    2 @/ s) X- D4 P! O
  818. ' e' @  t9 u" E( F0 T. t; {  k
  819. max_min:
    5 G( q2 A; H; l' J
  820.         cmp     cx,dx/ s) t  G7 y7 y+ \6 G
  821.         jle     no_swap
    3 k9 r  r  i' D/ r- M1 s% F; z
  822.         xchg    cx,dx
      H4 J4 {: i6 j$ H6 {7 t
  823. no_swap:
    ; {/ d, M7 S7 g
  824.         ret& \* }" F0 D& y- W8 p% `
  825. ) \% x6 t+ p& f: h# Y
  826. _set_subroutines:$ p3 Q; s2 l9 Z- t3 O7 x
  827.         mov     cs:[user_subroutine],dx, w/ A; e5 t1 [; Q4 f1 U
  828.         mov     cs:[user_subroutine+2],es
    ! b4 H& Q6 v+ i1 b
  829.         mov     cs:[user_mask],cx* s% d7 r0 u5 K/ c
  830.         iret+ {8 o/ ?' K3 a9 ]3 M! W

  831. 4 M3 ~( W& R: J' a/ C2 O, b- T
  832. _swap_subroutines:
    3 I3 K+ d5 A1 v0 h: M' }) {
  833.         push    word ptr cs:[user_mask]5 d$ _# z$ Q- [' z) J* Y
  834.         push    word ptr cs:[user_subroutine+2]' h/ x# L# ]6 P7 l
  835.         push    word ptr cs:[user_subroutine]
    1 ]; \* P7 H& y  k0 n6 _6 l/ D- ^
  836.         mov     cs:[user_subroutine],dx3 C6 H$ H' C5 R/ q+ L( b8 E8 _( _: V
  837.         mov     cs:[user_subroutine+2],es( F8 S5 u. c* j8 s* @/ z! i( S
  838.         mov     cs:[user_mask],cx( P: |: c3 d/ l& I
  839.         pop     dx
    " T. B& Y6 N" T  c, F( G' }
  840.         pop     es
    " O7 z0 L. x& w( p1 G
  841.         pop     cx$ c6 }" h3 g4 D/ [+ d7 {
  842.         iret7 L* ]" j! N: u$ C
  843. . b: z& ?6 f+ i2 N% A
  844. memmouse        endp) x0 W& b: K1 ?1 E; |$ \

  845. . f, _& W4 X( y7 n6 F8 Q( A
  846. endof_start:: s# T5 i; _3 i3 Z/ R# j3 T
  847. 9 I3 n$ R8 T/ N/ U) k& r
  848. emsg db 'No mouse driver install error!$'
    5 [4 Q  r; z/ z5 o/ o. C4 T! M  S
  849. old331 dw 0' b* b0 l: y2 `2 K2 w4 ^4 o
  850. old332 dw 09 ~4 n& L" i- O7 w
  851. old741 dw 0- |* ]1 x2 b4 _, D
  852. old742 dw 0
    0 O$ e2 o( E& D" r
  853. memcopy db 0  ]* {6 w) F4 N
  854. okcheck db 0
      X5 p8 a" W( k5 Y% ~- [/ K8 I
  855. pass db 0
    ! p3 X% t' w; a
  856. chkl db 04 I9 u( M0 V8 I& F. T
  857. lk db 0
    " _; ]% M; _' }. [! J3 |& ^7 W9 X
  858. chkr db 0
    3 K% M" T8 [- O. z
  859. rk db 0
    : C; e: b( z. Y0 f' \% ^3 j. ~7 R
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    6 n+ l4 G4 x; c
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                ') V7 A2 `6 a4 _
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    - q, b# R; _6 G+ T7 n& |
  863. db '                                                                                '& [2 Q: Q( z& \7 c: I  ^8 X9 |
  864. db '                                赏屯屯簧屯屯突                                  '
    - z3 j0 ?' T  Z- [' l2 F. h
  865.         db      '                                ?OFF汉OFF?                                 '3 ~- @- C( r( I$ v2 ]
  866. db      '                                韧屯屯既屯屯图                                  '$ b  b+ K2 w2 j: V0 z) f! d% G5 w
  867. db '                                                                                '4 k3 y, R( e$ H! k: N/ R$ [
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '& O5 {! ?3 s) L2 T" C
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' ) G# g3 {, r, P& J
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
      ~+ i9 [3 ~$ A+ m. Y

  871. ; S0 D) t6 T- y: S: i# |# ^
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
( l% G6 V  m0 x! b9 Z& }哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 4 G2 w! K2 E1 m# k

( }) c, y! N9 P  ]4 z谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 10:17 , Processed in 0.036636 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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