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

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

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

+ d4 K) I$ y% M2 j1 l代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;& O- ^; a2 V0 M  p! q
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9/ a9 y$ H) Y6 O, M
  3. ;                                         By Bini.Yi 易祝兵
    " p5 M% w- l6 h3 v/ g- ~
  4. ;                                         http://www.ufoit.com 计匠网
    : Y) X, o0 ~6 T4 y: @* S3 G6 N& B
  5. ;                                         2002/04/06 YYYY/MM/DD
    ' _2 B1 m0 _* i, ?
  6. ;9 w; P0 G0 _2 q8 L$ Z5 J3 y4 Y
  7. ;          * F, L! Q4 \: U. k/ b, G
  8. ;          This program  test the mouse button  click and move.% F4 I! \- O0 n/ P% O* Z
  9. ;
    ( P( w$ W% J! G- K
  10. 3 t2 o& O3 I! I' r6 O6 v
  11. .model tiny
    ( n' T* [" r' }8 m' ~) Z
  12. .586
    2 o. f0 \6 G3 X7 p9 t! H
  13. .code0 @2 X, j3 Y# [- D6 @7 {" }
  14. .stack  100h, g& u9 J" H6 `7 z& h: N3 Q
  15. .startup
    2 M% ^' E( ]$ Z9 f; d, P. ^& q6 b
  16. pusha2 v0 y5 v+ V* F1 l
  17. mov ax, 3533h
    , @/ w. h7 T: f* N4 [
  18. int 21h: f2 I3 g7 E9 Y. {& l+ k0 X
  19. mov word ptr cs:[old331],es* F2 l4 D4 u. D, ]$ ^7 }- |
  20. mov word ptr cs:[old332],bx
    # C7 s7 q5 n# t2 L
  21. mov ax, 3574h( a9 c6 w, d! I" b# x6 H: `2 U
  22. int 21h
    $ o- Y# j2 t8 }* |6 C9 q
  23. mov word ptr cs:[old741],es
    6 A2 \2 F6 i& w7 Q
  24. mov word ptr cs:[old742],bx
    - f0 O9 C5 J. `  c9 u5 r5 C; Z- t. D
  25. popa! x6 e; I, h  X
  26.         call    memmouse, O3 |* v: ?3 }+ \" l
  27.         mov ah, 00, U7 K) ^+ K# K! [
  28. mov al, 03
    2 `% R  _5 x) C8 J& Q
  29. int 10h5 B2 X3 F* k( R( _. r& K4 @# L/ ^
  30. mov ah, 065 r6 Z$ K9 o& a5 @# o4 G
  31. mov al, 0  d5 y. d  y+ x
  32. mov cx, 0
    % I) B; G& v, W+ `
  33. mov dh, 247 Z" W* j: h, o, _
  34. mov dl, 79
    1 `# Q9 u& o+ q. l- e: f
  35. mov bh, 07h' v( l; @6 X4 t8 Z6 v* C/ B
  36. int 10h
    % g) J, j) m: {& K( u
  37. mov ax, 0000
    7 R* f6 V( M& H0 Y  H9 x! u* w8 H' \& N
  38. mov bx, 0002
    - F8 ~" W8 a" `) [, D7 e
  39. int 33h8 h1 |; o& L3 }$ u
  40.         cmp     ax, 0000           ;if no mouse drive install
    : F  p. `9 T! J% ]' ~
  41.         je      errormsg           ;show error MSG6 `- N" X" ?6 ~" _; P. k. l
  42. mov ah, 02
    ' y* f* X3 h$ O$ ]- m+ M0 g: y) x
  43. mov bh, 00- K3 k4 X- L" F# V8 T/ N3 w& \" ~6 W% J
  44.         mov     dh, 25             ;Move point out screen
    5 H# Q" `* {4 K5 o; f* i( p& O
  45. mov dl, 79" C9 B8 I! `2 ^. e" T
  46. int 10h2 \0 \- ~1 H& q& ?4 |
  47.         call    showmsg            ;Show info
    ) N: }6 d' f, P& b
  48. mov ax, 00010 Z$ L% l5 |# b
  49. int 33h
    2 f  s* s7 Q' D5 H( T: }4 {  [
  50. ; mov ax, 000ah( Y' ?$ ^5 x7 ^
  51. ; mov bx, 0000
    1 `8 \8 G3 B' P9 f
  52. ; mov cl, 0h
    & S/ Y( S9 D' S6 o/ @+ x
  53. ; mov ch, 0F0h
    : @0 ~' Y% v3 o  s
  54. ; mov dl, 0h: l' {) G9 i" @$ q' B
  55. ; mov dh, 0F0h
    / a8 k' [2 f4 t% L' Y* c4 l8 k7 v2 z
  56. ; int 33h
    : N; S5 E, s% ]2 y
  57. mov ax, 0004h8 d4 @- \  S& g8 j% x0 E
  58. mov cx, 0319" q$ v9 G5 \( J, E: U
  59. mov dx, 0103
    * T4 H# q- |, D. b
  60. int 33h
    8 N- ?, m: Y! i( H# a% g
  61. casemo:                           ;Case button click and point move 5 y1 f# n0 Y/ v% ], J; h9 \
  62.         mov     ax, 000bh         ;and keyboard press
    - D0 A3 V2 P: _* o  `- s
  63. int 33h
    + }* M0 i/ A4 r. B( V5 D# W; `
  64.         cmp     cx, 00h           ;if point move....X  X- K9 r0 S* W% i  O
  65. jne xmov0 A+ ]+ b& |% }6 I
  66.         cmp     dx, 00h           ;if point move....Y  _% e( c3 A* Q! U, T
  67. jne ymov8 r2 ?  l* x; u0 D0 c
  68. xymovend:                         ;X.Y move end5 [9 x; ~% {4 I- d4 k
  69.         mov     ax, 0003          ; y4 K4 j/ L+ i
  70. int 33h* U/ R/ ]6 f. k. F; s& J6 r/ d
  71.         cmp     bx, 0001          ;if left button click  show ON, ]8 {2 A  l+ w7 A
  72. mov si, 18289 U4 l. ?) o  o5 y
  73. je listl: k3 X. M3 c( R: J
  74. mov si, 1828
    . h$ D1 z$ P5 E
  75.         jne     nlistl            ;if left no click show OFF
    . Q8 G2 p! t) V( X. l7 K/ A
  76. testr:& c# A+ Q+ J" x% ^( t3 p; h6 ^
  77.         cmp     bx, 0002          ;if right button click show ON
    ) g; E! L% F% j  q1 R- Y
  78. mov si,1842; w7 ^( T: B1 U8 A
  79. je listr
    & W3 Z: h2 N& D1 ~- j- Q$ H5 X
  80.         mov     si,1842           ;if right no click show OFF5 m/ J9 D7 F3 C: K7 `; E
  81. jne nlistl
    : v- ]9 h3 {: z
  82. casekey:
    * B. P2 Z( }$ {$ ]# T
  83.         mov     ah, 01            ;if any key press jump check
    ' b$ q0 X1 C( y3 ?: B
  84. int 16h# o5 l3 ^, ?- T" @* T* x; f
  85. jne kpress
    - P! q& T2 O0 d- _
  86.         mov     al, [chkl]        ;check x flag
    5 O) Q0 {% L6 ~' j
  87. cmp al, 02h
    / x% q4 E! k! |
  88. jnb chkok
    5 L: y2 x. w6 I! X% v+ Y
  89. jmp casemo- \" J& n3 [6 Q) ^
  90. xmov:                             ;if X moved, get the X flag+1/ L+ u- g5 F0 S0 Y  P. @, D2 O
  91. mov al, [chkl]& e+ H$ p  N! _+ R
  92. inc al
    " u' ^" h) _$ W: O' X
  93. mov [chkl], al1 x5 r7 M' L9 d) a- d
  94. call passok0 T3 Z' b) \  K8 l
  95. jmp xymovend* @8 a/ ~/ ~6 u6 W; V" `+ j7 x
  96. ymov:                             ;if Y moved, get the X flag+1+ k# l* E. g6 S# s
  97. mov al, [chkr]
    - a/ R! I+ g0 f( c
  98. inc al
    ; N" H1 \, C& R# j1 p4 w
  99. mov [chkr], al7 }4 F; i5 L0 ^: J1 x
  100. call passok( s$ U1 t) ?6 e2 Q5 l
  101. jmp xymovend
    , N% O; y" e) ?/ V& ?' ~/ ]' {

  102. ) m. ^. a0 j! P: g. ^( i
  103. passok proc near
    5 O8 N- g+ W& ?/ t! r( G! S' V
  104. mov al, [okcheck]- s! R$ `+ R4 P9 [# j$ {# ^
  105. cmp al, 1
    3 L; I3 p6 h& H+ R# \9 j* i9 e
  106. je let0
    8 _; l: t: S* b* K+ ]) @9 d
  107. jmp passret2 c+ ^* H) H& T3 x
  108. let0: 9 ?+ n5 ^+ _8 [  U
  109. mov [pass], 1
    ! M& \$ {/ D& j( d  F# L1 L4 W4 F
  110. passret:
    0 P& x  x- Z/ `
  111. ret
    " j/ P- F* w# B, S+ l- d( {
  112. passok endp
    * U8 z  S* R( M3 d  |) v( t

  113. 0 v% r5 o6 S& }$ {
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    ) {$ o8 x! Y/ ?" k/ S" v
  115. mov al, [chkr]+ q+ N3 N3 J* n5 F( i6 P7 Z
  116. cmp al, 02h
    6 Q5 v6 I: p% @4 ~
  117. jb casemo" U4 ?9 h5 O+ H8 t+ C/ k0 T% O
  118. mov al, [lk]
    2 B' ^) J& \' U
  119. cmp al, 1
    5 e; d) K( Z& a. C) U# y5 r! g( X
  120. jne casemo
    $ v8 d- p" Q& l) d" B2 a' G* `2 ?
  121. mov al, [rk]
      ]7 q5 t( O0 n" {# m, {
  122. cmp al, 1
    8 t* [/ T' B5 i  B8 b
  123. jne  casemo
    ! \' |1 {6 X3 G) A4 Z; T
  124. mov [okcheck], 1
    * f8 e( V8 I6 `2 h+ I- c
  125. mov al, [pass]+ _- C- A3 Y6 X$ F
  126. cmp al, 1) T# r0 T( {9 _1 y  _) c; S
  127. jne  casemo
    9 x* q0 J- Q) `3 p, ~) O$ o
  128. mov ax,0002h$ Y) C) f+ k5 v$ v. h  g
  129. int 33h
    4 {' a8 i; G% ^- q& g
  130. call cleascr
    0 M" L5 |- k9 u# ]- T
  131. 1 g3 d: m$ T! A# X% W
  132. call oldint
    ( C3 S2 r; ^: \! U
  133. mov ax, 04c00h2 D6 d6 B: g7 {% \
  134. int 21h
    4 ?8 A/ i0 O: \
  135. * F: P3 A  I1 B2 u' S9 s' y9 _/ X  N
  136. okexit:
    % s' U9 Y9 O% \, B  e
  137. mov ah, 4ch! o$ b6 N1 W2 }2 e# k
  138. mov al, 0+ W( l" K( q0 }" m; ^
  139. int 21h
    + o1 A' |* x4 }1 T  c; p
  140. listl:                                 ;Show ON3 N9 G. A) s) s. i2 L1 n
  141. pusha
    4 N2 f& Y% h- m; l& U
  142. mov ax, 0b800h- l" }: L3 {3 ~0 x  n
  143. mov  es, ax
    # q- c9 o8 Y: U" E
  144. mov ah, 47h
    9 R8 q2 Y- z6 z" q" T+ T% ]
  145. mov al, 20h, U0 C( D" x" j
  146. mov es:[si], ax" }! d+ y" s. A
  147. add si, 021 y3 C1 y2 x' d( V9 t
  148. mov  al, 4fh* n$ ~% A/ l! n1 k
  149. mov es:[si], ax0 e5 A& |0 I* z9 V) v: v* a
  150. mov al, 4eh
    + q/ I) M- k, q! R3 d7 h$ U
  151. add si, 02" c: |1 d, o1 R7 I) q% J4 c
  152. mov es:[si], ax
      O3 f+ s# R$ e6 H
  153. mov [lk], 1
    & _( {# }+ Y9 `5 @0 O9 p+ p
  154. popa* e# F) k# r& ]/ T# g; A- Z
  155. jmp testr
    ( L1 S+ ~% m2 [7 g! Y8 d, O
  156. listr:                                 ;Show ON
    # R; j" f+ z2 x. Y; \
  157. pusha
    2 E3 v( q% Y+ a
  158. mov ax, 0b800h& x1 C1 ^3 m6 t
  159. mov  es, ax
    . E5 k9 {$ I' C, f: J8 [# J
  160. mov ah, 47h9 W1 @7 @6 P! i/ L: i2 y
  161. mov al, 20h' ^# n! ^3 M2 v! A1 I
  162. mov es:[si], ax
    6 i) C7 G% x1 L: ?2 Y
  163. add si, 02
    # k3 J: |1 }: a  ?7 f# \
  164. mov  al, 4fh$ V' m' o( I! f: w4 A. U
  165. mov es:[si], ax
    5 |  Q1 v+ l6 h
  166. mov al, 4eh
    9 z' ]3 K- F' k7 L/ _  N! h9 ?6 ]* [
  167. add si, 02' ^5 X* d' q# x- ~3 {; F# A
  168. mov es:[si], ax- q, v5 @3 c" B+ R
  169. mov [rk], 10 F" o6 R- o0 ^) Z) ^
  170. popa
    3 _7 x3 V% [! C: \* l2 C
  171. jmp  casekey
    . n3 `6 `" i* g' X- H

  172.   `. p7 q% W% u9 j; T
  173. nlistl:                              ;Show OFF
    " ?6 r  n: p0 j
  174. pusha   * c6 p$ S/ v/ U- c8 z" C( W
  175. mov ax, 0b800h$ f, q* J. s( h1 Q
  176. mov  es, ax
    + i' A, ]5 @# K$ Z
  177. mov ah, 17h
    # X* E: N6 \' ?  ]8 d3 @
  178. mov al, 4fh
    ' ~9 {8 c) v7 r+ I/ \. Y
  179. mov es:[si], ax
    ' B6 b. Q7 a  k: y& ?2 `; \
  180. add si, 02
    ( [  a* e. `8 r: V
  181. mov  al, 46h, A( M. [. I9 j
  182. mov es:[si], ax+ Q: J! ?# q# H2 c
  183. mov al, 46h5 `! N4 p; h" @; J6 u
  184. add si, 020 _$ N7 a; D/ j
  185. mov es:[si], ax
    + i' r9 R$ W6 e6 }$ i; [, y2 P
  186. popa- N- R/ f9 {6 Z7 \9 e. B. \5 U
  187. cmp si, 1840- ?8 m: g+ P% X# a% `2 ~3 B
  188. jae casekey3 T$ ]: z+ M2 _( k' V0 I
  189. jmp testr
    0 G* h- q% Z' F! i( \! \1 a0 g

  190. ' q( [9 `9 D! y+ K$ Q
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    # f- o( z. V9 Z! A
  192.         cmp     ah, 01h             ;and return a error
    1 c9 X- V5 p0 l
  193. je exit1
    ! b- t2 s0 y2 S; c. u0 n! d* o
  194.         mov     ah, 0ch             ;if press other key then clear' E& b4 G. U, e7 n  K9 z9 J& y
  195.         mov     al, 00              ;keyboard buffer  U& E4 t# E7 m( [# w3 H, c
  196. int 21h
    9 W6 {) p- _* |  H6 W/ }1 _
  197. jmp casemo
    ; C* }* l' \8 P: e' _

  198. ; K7 Y$ A9 |& m6 `) c& V! o
  199. errormsg:                           ;if mouse driver no install
    " D' u. w/ h/ C- V4 L
  200. call oldint( [3 S$ r( s/ s2 W0 e# i
  201. lea dx, offset emsg4 ~. ^5 a. m$ D3 B4 c
  202. mov ah, 09h3 a' Q5 \% ~. |; T: A5 `" L1 y) {
  203. int 21h
    * w5 w$ B3 c9 H  Q
  204. mov ah, 4ch0 f. b6 I0 v% V
  205. mov al, 2
    $ B. l- b+ a7 W" _3 _, n! C2 x0 \8 H
  206. int  21h( m  O3 Q0 L5 L( M! D8 }: ^

  207. & D* ]! n; U' p3 ^5 v
  208. exit1:                              ;error exit
    9 r7 c' Q( o8 B
  209. mov ax, 0002h5 B! D$ H- c$ c7 E: z& t* D
  210. int 33h
    & r0 t; Q6 g4 k+ |1 i! p, `2 l
  211. call  cleascr- _7 ~6 u" q' W1 o
  212. call  oldint
    / \. h" B2 N( L" Z$ K
  213. mov ah, 4ch
    # \) g8 e7 ^  \" x: e7 o: A9 H
  214. mov al, 01
    0 ]2 n  Y4 |' K+ s5 O( f1 z
  215. int 21h
    1 C" I* H: v" \7 {& `, Q! q

  216. ( ]( u: N/ {. V* E
  217. cleascr proc    near                ;clear screen
    ! ^7 t' N7 ~" s3 Q$ n7 j# H
  218. pusha4 o$ p: i$ v; y% }) H8 o
  219. mov ah, 06
    / ]8 O; r( O: U/ X+ k
  220. mov al, 09 e8 F5 k2 E4 S$ C9 X
  221. mov cx, 0) G1 @* i: ?# ^0 K
  222. mov dh, 24
      G" S5 V" m3 D4 f; c& P* B5 U( a
  223. mov dl, 792 `5 ?- g' q' L8 c
  224. mov bh, 07h
    ; a' ~3 s  |% b- w+ z) t) v% j7 X
  225. int 10h, f6 r  n/ G4 W. ?3 y
  226. mov ah, 02* ?' e1 ]& G6 i+ k, W: X/ ?5 [6 d
  227. mov bh, 001 Z; ~; i6 c, L$ v; ^
  228. mov dh, 0
    ; e4 g4 ^$ a' Q( a1 r
  229. mov dl, 09 y! S, c; T; w% {7 z0 u& ~' l
  230. int 10h# L  C* l9 ?. D/ `( |/ K' c
  231. popa' l3 o8 ]* h5 [# g2 t9 F8 L2 l! f
  232. ret
    9 \, s& [7 y+ K2 {+ x
  233. cleascr endp
    5 {0 Z5 `7 b8 |7 b5 O

  234. 1 U3 ?) g& Z( O
  235. showmsg proc    near               ;Show info
    8 j5 V- ]# E) b
  236. pusha
    + H+ h% A; ?# e
  237. lea di, offset showms
    5 j; P( Z' C0 b2 Q2 m+ i
  238. mov ax, 0b800h' L# |. c0 Z8 d( @! C5 L! ]
  239. mov es, ax
    " S' v6 b3 `: M$ ?! @& c! _
  240. mov si, 02 @6 C5 F# {7 `7 @& M$ ]
  241. mov cx, 480
    / j0 |- ?' i. q
  242. mov ah, 07h
    " K% ^, y' o  X* |2 _- d+ v
  243. @@:( F7 t' w0 n2 C% h# k
  244. mov al, 20h
    * ]! v( T( r0 N4 ?6 J8 H- Y
  245. mov es:[si], ax' L$ t5 l9 c4 \& N( }% R; U9 Q+ R
  246. add si, 2! x& s+ o* U) Y- r% Y+ G+ B
  247. loop @b# p  U/ k, \  o/ m4 a. V
  248. mov cx,880  `- J' o. X5 n" z; W9 i
  249. @@:
    ; ^; y  A4 {& a0 z' _3 ^/ T& P& w
  250. mov al, [di]
    2 l2 |! V# D. Y+ j6 T0 _
  251. inc di6 |4 }; F, Q) [8 ?9 T
  252. cmp al,20h; `$ N" L8 t& q$ G9 ]1 |
  253. je showch1
    6 W& X" L) ^' p+ A
  254. mov ah, 17h) c( J- `, A) G  K3 U/ ~
  255. jmp showch3
    / a/ E! A8 p7 B
  256. showch1:% a2 i6 ?2 A5 ^1 `9 j: _7 J
  257. mov ah, 07h 4 W9 J, h  @; m& g
  258. showch3:3 c, e( N1 j# E+ {$ L
  259. mov es:[si], ax( [' t2 X4 W+ X( b
  260. add si, 2
    5 `/ r  R; d. M# `( b# `
  261. loop @b
    % r# t* \# v7 x/ X: L; X/ p
  262. popa  U7 F. g  W: N. P$ @5 V
  263. ret, h( V4 M( V# L/ t
  264. showmsg endp( M. ]0 l9 N7 u, E
  265. # |: N1 L! p- i5 A
  266. oldint proc$ M  h' g8 H% [+ ?# D( v: V
  267. pusha
    * U8 o  z. R, U  `2 }! L6 l+ y
  268. mov ds, word ptr cs:[old331]
    . c/ H2 f% P' `5 v5 ~' j6 F
  269. mov   dx, word ptr cs:[old332]* [% K7 X/ {2 d( R- o
  270. mov ax, 2533h( n  z  @7 g2 |9 r& j& s% g9 g
  271. int 21h
    - i& o# B9 p0 Q$ H1 U" l
  272. mov ds, word ptr cs:[old741]
    + m" _1 T+ H/ G; t
  273. mov dx, word ptr cs:[old742]
    ) z1 A8 @& R( g' g% S0 Q
  274. mov ax, 2574h
    6 [& K/ I4 I& M
  275. int 21h
    ) V- b( n. t: t6 ~" H4 l$ V; N
  276. popa
    & ^$ M7 K  l; R
  277. ret
    * k: B0 \! f0 J) l. ^2 P
  278. oldint endp( d9 ~- o1 M. \5 a

  279. . ]5 O( _0 r! J# V, R
  280. memmouse        proc
    . d- ^. ~+ g, k% V3 `
  281.         xor     ax,ax6 T+ I: `* n) c- U
  282. int 33h
    + L9 ]7 I( [! y
  283. cmp ax,0ffffh
    ( |: g7 G* t/ O; ?4 |
  284.         jne     not_loaded
    % ^0 X5 s9 K2 Y
  285. mov [memcopy], 13 {& C% p" l  v  L) o
  286. ret
    ) P  B  |* Z" P
  287. " t/ |4 B0 Q" v, w+ S
  288. not_loaded:" \3 ^% z. n6 R5 P( X: `: l# O
  289. $ x: E! v# q- H
  290.         mov ax,2574h
    4 Y7 \! `" n, N- f
  291.         mov dx,offset new_isr
    + b* f. d- i8 y: ?
  292.         int 21h5 ~) H0 |, e1 p, _1 T* n5 Y' {; Q

  293. + Q5 }: W( d7 }1 O) {
  294.         mov ax,2533h
    9 \/ y! ~9 \9 o) ^4 Y! K# y5 u* X
  295.         mov dx,offset new_33
    . i7 W5 Q0 X/ s  `4 F# {2 {
  296.         int 21h+ I8 x- R* w: F/ V& Q' a1 d& g3 Q
  297. ; q4 k* `$ J% L, J9 c6 A
  298.         cli
    : _1 r, N/ v9 q, t
  299. 9 p% y8 G. b$ |8 p5 b8 Q
  300.         mov bl,0a8h9 i- u2 }7 V- d1 L2 M
  301.         call keyboard_cmd+ J4 x" z) z5 k7 Z- {9 j
  302. 2 W6 g& m: o4 j* ~$ W. r: H
  303.         mov bl,20h2 ^  U  _9 j0 A, K7 ~& ?0 ?9 Y+ d
  304.         call    keyboard_cmd5 T6 b. n- ?+ Y7 w/ W
  305.         call    keyboard_read+ O% E* Q7 X& P9 z+ B% {
  306.         or      al,2
    - `- H, ]1 L; i. O- M) ^. a9 h
  307.         mov     bl,60h' \$ g" V! G3 }8 ^, J
  308.         push    ax
    0 {& e/ [" X1 V  Q" z. k
  309.         call    keyboard_cmd) L" N2 C" \& O
  310.         pop     ax
    & [) x7 h/ W2 f/ @) ]6 I- R
  311.         call    keyboard_write
    ) d* R; X/ p" D6 D7 F& F2 d
  312.   g$ z- R. F! X
  313.         mov     bl,0d4h
    + K4 u, F. F( d! s3 F% R
  314.         call    keyboard_cmd
    % q* z  E" ~( y6 {# `
  315.         mov     al,0f4h2 l5 D2 s: z4 G3 [
  316.         call    keyboard_write% m) z5 L4 Z/ M- K

  317. ! R* Y" f; q, o! W  Y- j+ S/ p/ T( Q! {) R
  318.         sti
    ( N: K# u6 u& I3 S
  319.         ret) s! O( k$ Q& R
  320. call_user_isr:
    . i& f, E: i( A* u
  321. db      60h! z8 i3 @8 X! O# A2 ^) F  q
  322.         mov     cx,cs:[pos_x]; r3 o5 J8 ]: }
  323.         mov     dx,cs:[pos_y]
    $ H% u# |# C) S" g$ |  e6 t
  324.         mov     di,0 ;cs:[x_move]
    2 i! d9 V  W9 b# y- V
  325.         mov     si,0 ;cs:[y_move]
    / V& {  x; _) n2 V' R
  326.         mov     word ptr cs:[x_move],0
    6 V) C( A% k* W  w9 T2 d
  327.         mov     word ptr cs:[y_move],07 x* B- y) S9 A$ Q5 V! R" ~6 D$ R
  328.         mov     bl,byte ptr cs:[buttons]( `) ^, @& T5 P  s' O# a
  329.         xor     bh,bh# j% Y. S4 r# T0 |+ S& ~! c' M
  330.         call    dword ptr cs:[user_subroutine]
    . a- |4 K+ j7 ^6 o6 F3 s/ g. r# }
  331.         db      61h, y! G8 x' j& T6 ^* h, ]5 p
  332. ret1 `  E: a- ]# Z
  333. new_isr:8 w+ C5 F. X- D& C2 W$ ]6 Y
  334.         pushf
    : L2 P/ g7 c. A  \8 k& L+ F
  335.         cli
    , Z# q" Y9 r! g8 {8 p$ g
  336.         push    ax. y2 ^; M$ ]1 Q2 a( R. O( L$ u
  337.         push    bx
    ! ^) s- X. E; b, S# _  u3 Y) z
  338.         push    cx  C4 h, |. n6 J: s
  339.         push    dx2 S$ L' |( J5 o1 C1 q( p
  340.         push    di
    ; V1 ~% [; [9 D7 Q7 }  a
  341.         push    si0 p. W& H) R; L' R2 a
  342.         push    es1 W2 F! ^- f1 g, Q* e
  343.         push    ds; ]* w+ L. d; k# q. s; y
  344.   ^' t  c$ {- @* r( {, Z
  345.         push    cs
    / U* M1 H) {6 O  I4 |: {
  346.         pop     ds
    " ~, f0 T/ [4 @) {6 n
  347. 4 q+ m: M  ^  w4 m( g+ r
  348.         mov     bl,0adh
    ; V- z3 ]% G; g7 H2 Q- h" o
  349.         call    keyboard_cmd
    6 A% k4 c1 P6 a6 F& V

  350. % x" D6 b1 i' A9 \
  351.         cmp     byte ptr [first_time],0
    5 f% Q+ ^# R7 b) y" _
  352.         je      not_first_time
    ' E0 H4 H+ K) D- k. R
  353. - C/ l& q. T; z6 I
  354.         mov     byte ptr [first_time],0, n  G2 _5 A" q4 U/ u/ C
  355.         call    keyboard_read$ @1 h1 K) u" z5 p: D
  356.         call    keyboard_read# X- _" a. r7 F: M6 I
  357.         call    keyboard_read
    % p5 t; q6 r; u( m
  358.         jmp     no_show' i7 v! y+ F- L+ g& ~8 P9 n* f/ E: x

  359. 7 |# ~+ j! v, x7 q/ c1 U
  360. not_first_time:
    9 |. {! x0 _  H: D* h
  361.         mov     word ptr [temp_mask],0
    4 D+ {2 S- G  e& g/ |
  362. * G' O7 I9 V# O. F# D# j- \
  363.         mov     cx,[pos_x]
    9 i' B5 |$ o! |# V- I
  364.         mov     dx,[pos_y]
    . r) p# Q+ D/ B: `9 R2 P
  365. 8 N) ^2 H6 i: E  a
  366.         call    keyboard_read% V+ |6 V- h2 {& [
  367.         and     al,7 ;33 p9 ^8 T9 [* Z# e
  368.         mov     ah,[buttons]
    : z$ V: g3 p* T. P4 d- [* I
  369.         mov     [buttons],al
    + I* x6 S: _: \3 u/ F" K
  370.         cmp     al,ah7 P! e7 z6 {+ h- [3 f: i
  371.         je      no_button_change
    6 K: ^4 C2 H* ]; i' m' \# G' d! @
  372.         and     al,3( Q6 ], P+ j8 o
  373.         and     ah,3
    $ ]0 c8 X0 n0 t. ?# |8 g
  374.         xor     al,ah' n6 y/ l$ w: x/ }" G1 G# O
  375.         xor     bx,bx
    . H) |% B4 H0 Z! J% M! V9 u: H( m1 B
  376. 1 r+ e+ E% F4 `! q4 y9 E( c% S8 K
  377.         push    ax; _  v7 O: V/ y" M! Y  A
  378.         test    al,2
    9 p+ ~+ P5 f, V6 j$ u. e* _
  379.         jz      no_right_button_change
    ( j4 B5 t; [2 ^7 j& s
  380.         and     ah,2: q, p5 o: T$ t* A
  381.         jz      right_button_pressed
    0 W5 m: W! `8 P7 o' H9 B
  382.         or      bx,16+ y" ~( Z* p" R2 i
  383.         jmp     no_right_button_change
    6 r# V5 M7 v& a2 v
  384. right_button_pressed:
    9 b* E& U2 u$ M: P
  385.         or      bx,8/ {! V3 T7 R& x; `
  386. no_right_button_change:; R- X4 \9 U  c; Q& W( Z

  387. ; Q8 R3 \7 |7 Y5 |# I0 C# k5 D
  388.         pop     ax
    8 k: _- @( @% S3 F

  389. " A& Z) d/ @, C
  390.         test    al,1
    5 W7 I0 l6 _# _& ^' ~
  391.         jz      no_left_button_change
    $ n" t1 ^9 j% l! n! y
  392.         and     ah,1
    # e/ W; y: @0 n! e0 Y6 `) O/ c" ^- ~
  393.         jz      left_button_pressed2 H$ x6 d; L3 ?
  394.         or      bx,4! L) V/ b% u, }) k1 F: l
  395.         jmp     no_left_button_change4 h3 a1 g' s1 L) O: F" [3 M* j
  396. left_button_pressed:
    9 K) r3 T  X2 K! p+ {: l  J6 H8 q% P
  397.         or      bx,2+ Y0 u' v1 `, N) \
  398. no_left_button_change:7 B# ?" K1 M2 L- q

  399. + b  e5 [: u+ O( P1 C/ ]8 U& h
  400.         mov     [temp_mask],bx8 c7 x* @+ s8 [* `  ?+ j; h9 o
  401. 1 ~9 M  ~4 o, ]6 o/ T& `3 w8 ^, a
  402. no_button_change:% w, I& j) x2 H3 s5 G
  403.         call    keyboard_read2 P( V( E- D9 [; M3 e3 q! v1 C
  404.         cbw  J* T& ~) F3 o4 v: v
  405.         add     [pos_x],ax
    1 I  a' `( f. \, |1 @% y
  406.         add     [x_move],ax# h6 i3 g+ A3 j) C; O* O
  407.         mov     ax,[x_min]
    ( z( P. C' Q' L0 S$ \7 v& F  Z+ ^8 A' F
  408.         cmp     [pos_x],ax1 M& g" m/ M0 o! W
  409.         jg      good_hor1* V: z$ H; K# L3 @
  410.         mov     [pos_x],ax$ Q& P' M, T$ X. t- ]+ I
  411. good_hor1:
      F! Y, a% e+ L! {
  412.         mov     ax,[x_max]
    7 r. ~# x( r5 _; U+ ~2 o7 ?
  413.         cmp     [pos_x],ax' X0 I) e  a) Q+ j
  414.         jle     good_hor2- R! b; \. z/ X3 G" B" `. h
  415.         mov     [pos_x],ax! W0 C. [6 b  F3 W* g( s( }
  416. good_hor2:1 N. Y6 C) M( `) ]' `- T1 ]; i
  417. $ O- k& D# W2 S/ u
  418.         call    keyboard_read% T+ ]4 y- @' O1 F
  419.         neg     al$ z- n5 o- d7 N+ w, s
  420.         cbw
    # Z7 P6 ~( U5 ~: S: u+ j2 c
  421.         add     [pos_y],ax1 z; z0 u3 I; n" f% `
  422.         add     [y_move],ax
    2 X% k& T' i& c2 F" B2 R
  423.         mov     ax,[y_min]' d3 ?9 p# [$ A2 c
  424.         cmp     [pos_y],ax, o4 P! b2 q6 q( [: \/ ~; j6 r) Z
  425.         jg      good_ver1
    . |; n0 T7 ^0 |3 [8 G/ w
  426.         mov     [pos_y],ax
      e# i% U4 k9 ]5 S) ]; b0 A
  427. good_ver1:
    # ^& O9 |# T, M6 F2 z9 y4 E
  428.         mov     ax,[y_max]# b$ r5 K1 \7 ?' ^" c* X
  429.         cmp     [pos_y],ax
    2 M1 \: w/ _, H( g/ d  @
  430.         jle     good_ver2
    3 ^: v  L4 U# x$ e" @' f6 _% v3 @
  431.         mov     [pos_y],ax
    ' \( }0 ]; O" @. y" R
  432. good_ver2:9 W+ a* I* E, f& z* R

  433. 9 y8 ^! B. f! H
  434.         mov     ax,[x_move]
    ' n- F6 ?7 O, h6 x
  435.         or      ax,[y_move]
    5 }# q4 g* m, p5 A
  436.         or      ax,ax
    / |2 k! G) ^) _" e" T2 \8 K* R
  437.         jz      no_change_position
    % L; ~* w6 P( r! X; ]7 G
  438.         or      word ptr [temp_mask],1' z+ L1 P2 w' r, M4 u% R$ T# C  `
  439. no_change_position:5 X. W4 p1 Y+ I  J# W3 A6 I9 A5 Y
  440. 9 ~/ j. X/ p: P- v
  441.         mov     ax,[temp_mask]/ F7 Q8 p+ C  t2 V2 Y5 v
  442.         and     ax,[user_mask]
    % P% I3 H" p6 E$ W/ x
  443.         jz      no_call_user
    2 h* k& F! @9 P
  444.         call    call_user_isr
    " H# F( R8 x. Q' ], b' m0 E
  445. no_call_user:
    7 _& t1 m% L7 r" T: m

  446.   l! d. h1 p( a6 K6 [8 F+ p. f
  447.         cmp     byte ptr [sm_flag],1
    2 o) Z0 N5 F/ T$ n
  448.         jne     no_show
    4 o) T/ ]" N! n( x+ {

  449. ' [9 @9 Q3 V  Q
  450.         shr     cx,3
    $ `0 ?& i- I7 y5 d. u
  451.         shr     dx,3
    0 d: V+ {2 i; R1 Q% E) e
  452.         mov     ax,80
    + G$ F* B  k- Z8 U
  453.         mul     dl
    9 `% t$ y( j1 I: W+ f
  454.         add     ax,cx
    # k5 f( A6 @. g" ?1 S
  455.         shl     ax,1
    2 b8 s$ @0 F$ F% R3 u7 j" |! D
  456.         mov     di,ax2 T8 W9 \! E1 l, B% c' p6 b0 l
  457.         mov     ax,0b800h
    # Q4 ^  T3 n( K( I
  458.         mov     es,ax' `/ g# Z. I8 E, l; Z& g9 h- Q/ c
  459.         mov     ax,[save_char]
    / N, u% g& }/ |3 v$ P/ R! ~& J
  460.         stosw, y+ `. m; V# k- J1 K

  461. , p1 O" v# H9 K$ q% R+ H
  462.         mov     cx,[pos_x]
    1 w  f  V3 r+ j9 f* F) R+ Y
  463.         mov     dx,[pos_y]
    ! A& L7 ^. `4 j( m3 E. L5 k; Q3 k/ ^' Z# D
  464.         shr     cx,3
    4 J9 |5 D( l9 W1 }  D! v3 R
  465.         shr     dx,3
    * b" G8 F" G/ I0 t, b* m
  466.         mov     ax,804 o6 N1 S6 z3 Y$ w( n
  467.         mul     dl" Z' }, _$ B2 |' {
  468.         add     ax,cx. U, [0 b# A% H, K) ~, c
  469.         shl     ax,1
    % D( L8 |  e6 p, p9 i
  470.         mov     di,ax" W" k  z& {* Y" I5 _8 R% Q& @
  471.         mov     ax,0b800h
    3 r5 o: T3 k' `% k3 T* H
  472.         mov     es,ax: T) a8 }- |3 Z0 I
  473.         mov     ax,es:[di]' K9 B+ b9 O# U3 b
  474.         mov     [save_char],ax0 Z4 @: f  C8 |. a' {2 [
  475.         not     ah
    & u) r4 Y( y; J
  476.         and     ah,7fh5 v- [3 E; m& O: v* r0 e- h
  477.         stosw
    % [" Q% w8 }' }# K
  478. no_show:5 S# T* D/ [2 `
  479.         mov     bl,0aeh+ V! o  p( }1 K; M" g4 Z0 l
  480.         call    keyboard_cmd
    - j& L; Y6 H5 u

  481. * a4 o* y# w( }" f
  482.         mov     al,20h
    1 S' A! {/ D  a, ]5 ]; u2 K
  483.         out     0a0h,al' J+ E9 K4 G/ |+ `+ G' f
  484.         out     20h,al# |( w0 K7 [8 |
  485. 6 B0 i1 |7 v. B9 ~3 M
  486.         pop     ds; V. q7 H. [0 L1 @0 k3 ~0 t- E: d
  487.         pop     es
    9 x3 {! U: e% ~3 C! O+ ^
  488.         pop     si7 H# j# N2 r. J" }
  489.         pop     di
    ! C6 c/ o8 z, A' X1 z- k$ [
  490.         pop     dx" ]3 H0 K/ m; D% h$ N6 o
  491.         pop     cx& ^: V  e& y8 r1 b! U
  492.         pop     bx+ W; a- A7 ^3 x. e" t2 O
  493.         pop     ax) I6 I3 e+ P/ W/ T$ z# m9 j
  494.         popf
    1 F3 \) {  Y: D4 \
  495.         iret
    0 `* l# v4 S+ I5 B! T( \

  496. % W8 H: V  \2 ]1 c, [4 m
  497. first_time      db      1
    3 c" e% _4 z5 h
  498. buttons         db      0  L7 u  v4 S* C; r+ H# U/ t
  499. pos_x           dw      0
    2 o) D9 w5 @  b. t' P- u  T
  500. pos_y           dw      0
    2 `5 i6 D3 Z0 h
  501. sm_flag         dw      00 N8 B6 F$ G3 f
  502. save_char       dw      0
    0 j/ z" _, d+ H( o3 Q
  503. x_move          dw      05 l/ _" S/ j/ ^! R# s, f
  504. y_move          dw      0
    ; j* p) c4 P8 m/ j3 i
  505. x_max           dw      639' }: r- ]# v6 {& A
  506. x_min           dw      0
    ' \0 `7 Z5 m4 c1 \% S" D6 N
  507. y_max           dw      199
    0 Z! d- z) x( y
  508. y_min           dw      02 {0 E" ^. P8 i& w# ?
  509. user_subroutine dw      0,0
    4 J8 s3 @: [5 ?; n% Q6 W
  510. user_mask       dw      0+ w6 h; A) F. s* L& E2 q  v
  511. temp_mask       dw      02 l  F  N3 J! F: H  G
  512. $ g, z$ g* t; X6 d  K7 K( h
  513. keyboard_read:
    % m) ]; p2 Q& `+ D9 H
  514.         push    cx
    1 t8 y) [- ^" J) y, V: ~
  515.         push    dx& J5 ^$ ]6 ?4 x: C2 ?% u
  516.         xor     cx,cx* q, @- J) U8 Z2 ^& B
  517. key_read_loop:) O9 P5 u" C( m, l9 D. N
  518.         in      al,64h
    ( l, k. f: W- P) h" c3 M
  519.         jmp     $+2
    : ?" g& |* G- k! t! w
  520.         jmp     $+2* ]& u, L6 O' o
  521.         test    al,15 s$ t6 E! [, b4 y( ]3 z' q% P: T
  522.         jnz     key_read_ready2 P2 ~1 F( D4 G) ?9 x; N6 t1 t
  523.         loop    key_read_loop  n, p6 u$ I- k3 e6 C. }
  524.         mov     ah,1
    " x) ^; K3 p2 A. G' }2 D1 B
  525.         jmp     key_read_exit, F) h# z; V4 _- U/ o+ c
  526. key_read_ready:
      t9 i+ s& E: F# b8 |& V' g9 a
  527.         push    cx
    2 C4 W0 g( t6 R$ y& E2 D0 f  h
  528.         mov     cx,321 Y! N1 x6 A0 ]0 _
  529. key_read_delay:! A& l# H( x) E6 u: K1 S8 P0 c% ]
  530.         jmp     $+23 N* f/ ]( \. _/ V  z
  531.         jmp     $+29 }: b% K2 m% S; i0 @
  532.         loop    key_read_delay
    ! w1 d7 h- J; [1 W6 {

  533. . J) m' S- @+ U
  534.         pop     cx& W& B5 f6 [( e; C" P; g) @7 I

  535. . G) R0 [5 o) Z! g
  536.         in      al,60h8 P4 g+ g# n( n  Q" P! Z
  537.         jmp     $+2& B, A; d) O  D. h! o
  538.         jmp     $+2, u* L& f- ?# @1 {9 ?
  539.         xor     ah,ah
    - A% T# P: M; p+ v
  540. key_read_exit:
    3 }$ Q  ^) x( L  Q
  541.         pop     dx6 B8 y6 \" ?8 S! g
  542.         pop     cx* j4 I2 U9 t  C8 _) r& a" d3 W- c2 u& ]
  543.         ret
    ) h) g2 B8 v. r' C0 Z* s! @
  544. - T( I) s9 N0 s; w. J4 @
  545. keyboard_write:; |7 z: A& q1 j3 \/ s5 U8 i
  546.         push    cx
    ! m/ E7 B# G# e' Y
  547.         push    dx
    - K9 |' x* Z, p  m: \/ \$ M
  548.         mov     dl,al
    + Y$ |( w8 m* b/ ^, V; R; n3 g
  549.         xor     cx,cx+ S  j' S0 E" y7 D2 z9 A
  550. kbd_wrt_loop1:2 A0 ^/ j4 L* V3 {* `9 o' A
  551.         in      al,64h$ \! \  d; H) @: ~
  552.         jmp     $+2
    # k( v0 v7 Y1 V' [
  553.         jmp     $+2+ K2 z' z' M0 B6 J* \7 [) q
  554.         test    al,20h
    - X' `4 ^6 F. \
  555.         jz      kbd_wrt_ok1
    6 l" W, t* I; t9 n1 h
  556. - I' X) I5 u: d9 y0 J  |
  557.         loop    kbd_wrt_loop1
    ( h4 w7 R2 U/ J

  558. " `  C; j( P  B/ H/ j2 o9 G
  559.         mov     ah,1
    & I* ?5 n# Q3 Y3 \0 _
  560.         jmp     kbd_wrt_exit" ~: Z$ _7 ~# W" S* J" }# A& ?

  561. - W! k- g2 L& F. e  a- j
  562. kbd_wrt_ok1:0 J3 O: @6 P3 M  }1 k! o% S, O
  563.         in      al,60h
    . o0 ?+ A! G  C. r2 d

  564. ! b* s& G0 y% u( V" J9 R; I6 P/ g  T- }
  565.         xor     cx,cx
    9 [! G2 u. J- W* h1 x
  566. kbd_wrt_loop:
    4 [) P& v# u- O3 K4 R' {& R5 G
  567.         in      al,64h
    " K. O, R' V8 \; f* ^
  568.         jmp     $+2" z4 \' E1 V* q# B
  569.         jmp     $+2" _7 _: W. u- C& ]$ v! W
  570.         test    al,2( _# s$ t! a: k' d( x) \
  571.         jz      kbd_wrt_ok" q7 o- X$ m) x% f  [# A: }  ?2 L6 I3 [+ n
  572. . D' T, H7 {9 Y" c/ |9 `
  573.         loop    kbd_wrt_loop
    ' ?5 h: m& j4 f! B! s( D( g1 P% a5 x
  574. 9 d! e  p5 r, E2 o
  575.         mov     ah,1, G6 L/ e# m' u' C" ]" {  ?  n
  576.         jmp     kbd_wrt_exit
    4 w( A% m* a8 E! s9 `" o

  577. & q/ y' [5 D; x3 N" q
  578. kbd_wrt_ok:
    9 {4 w: }) u0 C8 w1 T3 P3 f
  579.         mov     al,dl
    7 g. h) g- w1 t7 b
  580.         out     60h,al8 Z, Y9 A+ d1 ]5 t% w
  581.         jmp     $+2: W% P. _- T* I9 h7 f
  582.         jmp     $+2
    ( x- ~/ c: Q1 k' W

  583. ( m. i, q+ r; p7 G& M8 e
  584.         xor     cx,cx2 G* A: E( O# p7 k9 {3 E; h
  585. kbd_wrt_loop3:
    : Y! u4 E# e, a- X) `/ N' t5 \
  586.         in      al,64h/ M3 y5 V' q$ I/ Q' q* o7 g* K' Z
  587.         jmp     $+2
    1 B* j: c) j) w9 }( G5 l
  588.         jmp     $+2
    3 o* u. \( |+ ^% R7 r2 {8 d' Y
  589.         test    al,2
    $ K  N! G# W2 G0 {, a' l
  590.         jz      kbd_wrt_ok3
    ! }& ?6 [7 `% t, z" Z. A) Z% y$ e
  591. ) c! b% d. ~7 @
  592.         loop    kbd_wrt_loop32 z  K, [- t" }; y; Y! Y
  593. " G  N" G: R0 z2 ?$ Z
  594.         mov     ah,19 Y/ Q, u1 U9 R4 J
  595.         jmp     kbd_wrt_exit7 q6 m* Q8 y% \
  596. 1 v9 V4 i- ?) [
  597. kbd_wrt_ok3:
    ( q  K+ v" }5 K
  598.         mov     ah,8
    + w/ P3 o" ~0 b( z
  599. kbd_wrt_loop4:
    - ?& ^& P  a+ n6 |- ~- J# F+ o
  600.         xor     cx,cx7 p5 ?/ t  H6 I4 R
  601. kbd_wrt_loop5:( [) k: j3 W2 v, i
  602.         in      al,64h9 Y- \1 y$ f( T& {
  603.         jmp     $+2
    ( a* j  U$ m/ ?* k$ T  z
  604.         jmp     $+2- j. |+ O7 H8 \
  605.         test    al,1
    " T2 K2 q3 G+ F* Z; j4 u  b
  606.         jnz     kbd_wrt_ok4
    . x. O2 U0 e, c9 q) Z
  607. & g  _3 j$ W7 m/ V0 ]
  608.         loop    kbd_wrt_loop5
    + l1 B; T9 w. Q

  609. & ?  g( D/ i* S
  610.         dec     ah6 _1 b% L" z/ H
  611.         jnz     kbd_wrt_loop4: Q; h, a$ J1 x, Q) ]+ t
  612. ' m2 I' Z" T; M6 [* j
  613. kbd_wrt_ok4:/ u8 A, ]: [: z# [! N1 I
  614.         xor     ah,ah# r3 y7 W2 W# n! n; ^* W+ T7 R% K
  615. kbd_wrt_exit:
    , h! j0 S9 A4 D3 Z
  616.         pop     dx1 T1 c/ S* \' o: K% d: E
  617.         pop     cx! y6 ^! O/ r2 T
  618.         ret
    ; @8 X' P4 X. M0 `" f: l7 e
  619.         ; r) |! T$ y% ~9 P
  620. keyboard_cmd:' x% ]/ k& U& l$ c1 w
  621.         xor     cx,cx
    # S. C. F( z) e+ h
  622. cmd_wait:
    & E5 ?: w# l4 n$ e) v' F
  623.         in      al,64h1 d( |+ {' }- l0 Q. R' ]
  624.         jmp     $+2! p" [$ U0 d& B1 L1 ]8 _6 ~
  625.         jmp     $+2
    , [4 N, [1 e3 d0 U: t4 n
  626.         test    al,27 m, Q' q- y% `1 f" _6 X
  627.         jz      cmd_send5 ]1 _3 {: L! u+ k, ?$ v9 C* {
  628.         loop    cmd_wait
    ( t1 |: Z  A* i8 e

  629. 2 r; S8 r% h6 |: _, E' z3 v* I
  630.         jmp     cmd_error
    3 }, p0 q# J. t! L! w  g+ B
  631. 9 r# ?- o8 L* z* g4 h
  632. cmd_send:& h1 J3 A5 N6 G( D
  633.         mov     al,bl
    ! Z0 R! b2 K& U4 D7 W; s
  634.         out     64h,al% r$ C. U& U  g/ n
  635.         jmp     $+2) u2 E) S/ r1 W
  636.         jmp     $+2) h4 u* ^" ~9 Z, \  R5 ^/ {

  637. / i* J/ W  A6 m& k2 Y  v' _# N) f
  638.         xor     cx,cx8 q! v3 |6 e# @2 t
  639. cmd_accept:0 P" ^6 S1 O, o
  640.         in      al,64h
    6 a3 v# b6 A8 g9 Z, m; s$ D/ w
  641.         jmp     $+29 Q4 R$ ?  {) k$ l
  642.         jmp     $+2# R5 ?4 Q7 y" J: Y
  643.         test    al,2
    / z  W* a9 u/ N" d  ^" _  B- v
  644.         jz      cmd_ok
    ) }: B( V. U- c1 d
  645.         loop    cmd_accept
    , H6 D' \8 m( b' N4 U6 V4 x, f
  646. . K! l# e5 ^, d$ s2 {0 O
  647. cmd_error:
    - `5 C0 Q. C4 P0 B) m  w" J
  648.         mov     ah,1
    & U' {/ c! h. Q) Q, M7 Q, C
  649.         jmp     cmd_exit
    : b2 _- O) ^" P
  650. cmd_ok:
    9 ^3 y8 u( M0 }
  651.         xor     ah,ah
    * s3 L3 m; J& I
  652. cmd_exit:
    $ x$ w/ {5 ]" r
  653.         ret
    $ [8 o0 S/ {/ d- K! _0 ~0 _4 ?

  654. 0 y4 G- L& Z* D3 H$ ~. @
  655. new_33:
    " ]; K* G2 w: m! r4 i: v
  656.         cli) K$ D' p2 J* C" D/ k
  657.         cmp     al,0
      C& z% \5 y7 u. |3 I. O; B: H
  658.         je      reset_mouse/ q2 _( R3 c" B! ]) u7 T5 g
  659.         cmp     al,1
    5 X# i( ]# J# C' n! q1 n
  660.         je      show_mouse; f* N7 C' A: O4 `5 z! O$ o* H
  661.         cmp     al,2
    $ ?* L4 t# e$ j# P  I
  662.         je      hide_mouse  o- Q1 |  C% P1 e
  663.         cmp     al,3
      w  K, k- _- c# _9 \
  664.         je      get_pos
    , E% L% W" A# a' s' V! H1 ^0 ]6 _! R
  665.         cmp     al,4
      w" e% f7 I8 b0 O& D" y; C  A
  666.         je      set_pos& m* {) {* o( Y. y1 j, v* @: Z
  667.         cmp     al,7( s1 F; z0 `5 V$ @. d* d
  668.         je      set_hor_pos' C: [$ x( v& Y2 U& y: o2 {
  669.         cmp     al,8
    7 D8 D: s8 G" @, w
  670.         je      set_ver_pos" ]( Y8 T/ m9 N% Z: o
  671.         cmp     al,0bh! y  X  i3 z$ |9 W7 r# _9 p' N
  672.         je      get_mouse_movement
    ( M. `$ R( `7 i$ r
  673.         cmp     al,0ch
    / K3 d4 \7 E! p
  674.         je      set_subroutines6 ]' m- {# u3 x
  675.         cmp     al,14h  g! ~1 o" \, `0 B7 D
  676.         je      swap_subroutines
    8 [; }% F5 p/ E' l' B
  677.         iret1 L9 Z4 G. w5 q; q4 _+ ]8 t
  678. ' ]* R  _' a7 L) x1 k
  679. reset_mouse:
    ) |; |% w% `  P+ k
  680.         jmp     _reset_mouse
    6 t8 I  g1 ~2 ~  U' u' Y
  681. show_mouse:6 F* H/ x, {+ U4 ^* B4 r; H0 z
  682.         jmp     _show_mouse+ V3 n/ \$ a7 D1 z: A
  683. hide_mouse:
    & B2 ~. I( H9 q1 r
  684.         jmp     _hide_mouse
    6 |2 E; K' z/ C- N8 _
  685. get_pos:
    + }- q8 H; r5 b+ n  f" m
  686.         jmp     _get_pos, l1 }5 D. s, D0 C' Q. R
  687. set_pos:7 d' }% p: n# R2 [
  688.         jmp     _set_pos, \/ L9 L6 x# p) a- _
  689. set_hor_pos:8 \, t+ o1 `/ s" k$ p
  690.         jmp     _set_hor_pos3 o, i3 ~' {# {
  691. set_ver_pos:
    % {. q- p4 S! v( {4 \! o
  692.         jmp     _set_ver_pos' i- F0 o0 T4 v; ~3 e1 x  \
  693. get_mouse_movement:
    9 b/ B' W% C& Q$ c
  694.         jmp     _get_mouse_movement  ~& `1 z4 n* X. ]
  695. set_subroutines:, f' _" U- g' i+ q. @* T4 ?! x
  696.         jmp     _set_subroutines$ r& g+ x7 g7 ]: H' A8 \
  697. swap_subroutines:3 X2 g1 y9 A$ L$ _, P9 X
  698.         jmp     _swap_subroutines! r+ x7 d6 q9 P7 m5 H& s6 o; U
  699. * Q0 j- n# n* {
  700. _reset_mouse:) m: l4 ?) I1 T( ^
  701.         mov     byte ptr cs:[buttons],04 s8 a: S9 w, \/ `/ y6 P$ {
  702.         mov     word ptr cs:[pos_x],0
    * \, e$ D5 Q8 P) ^7 j  s
  703.         mov     word ptr cs:[pos_y],00 m$ R' j8 E1 K
  704.         mov     word ptr cs:[x_move],0
    2 n6 O5 Z2 o& \/ M
  705.         mov     word ptr cs:[y_move],00 H1 \. n3 L/ u5 x7 n- j8 e
  706.         mov     word ptr cs:[x_max],639+ D# U5 @7 W1 j- b3 D
  707.         mov     word ptr cs:[x_min],09 d% I  \9 A: _4 @
  708.         mov     word ptr cs:[y_max],199
    5 J$ Z% @% \8 `( ]4 f
  709.         mov     word ptr cs:[y_min],0
      L* U7 V* z! L1 w( V- V/ Y% R
  710.         mov     word ptr cs:[user_mask],0! Z7 [. b4 r. P. i. @0 \
  711.         mov     word ptr cs:[user_subroutine],0
    ! P1 |0 }$ o% {' I
  712.         mov     word ptr cs:[user_subroutine+2],0
    4 S! {; \) {! A8 ]2 r
  713.         mov     ax,0ffffh; S6 ^' j6 L4 e  Q& [/ {
  714.         mov     bx,3
    0 @, d) G# m/ g6 Y6 t. E
  715.         iret
    ; l* W, V& F1 ^

  716. 4 L4 A  v% f+ u7 q( q
  717. _get_pos:8 t, }5 d5 P( A8 P( y# B
  718.         mov     cx,cs:[pos_x]5 S8 h1 Z2 A4 x/ w: ~
  719.         mov     dx,cs:[pos_y]5 V7 e1 V8 n- O" O: x8 g
  720.         mov     bx,word ptr cs:[buttons]( S& H% @% N4 G6 {# H
  721.         xor     bh,bh
    ; q4 N% j2 B- d; L" a
  722.         iret6 L8 ?: P: u$ D# K5 a4 U7 t' P! _

  723. " a: }0 A  X& j8 y3 g. H4 n
  724. _get_mouse_movement:% E8 {, ^, |4 M& Y
  725.         mov     cx,cs:[x_move]
    ) F) v+ a, ], g5 z
  726.         mov     dx,cs:[y_move]& b+ V! N; _* b& G5 g8 ^
  727.         mov     word ptr cs:[x_move],0
    # \4 e4 u1 ?, @! m% \7 d
  728.         mov     word ptr cs:[y_move],0+ c1 o7 ~3 V% ?, d8 L1 ?. O" B
  729.         iret" q7 P: j# L" C' C9 {/ c

  730. # v4 F3 E1 ^0 Z8 e
  731. _show_mouse:
    % }- R1 Z& @/ m' E8 j3 }
  732.         push    ax& i6 C/ P+ a+ I/ v6 @- X
  733.         push    bx# Z5 C. A2 _* I5 N
  734.         push    di
    + B( u! P4 v. @- O5 Y
  735.         push    es
    & |" [9 e3 Z& z  e
  736.         mov     byte ptr cs:[sm_flag],14 h2 N* t+ z$ e; g2 I
  737.         mov     ax,cs:[pos_y]
    : r  m1 }! [3 q# e$ t/ ^3 F7 D- C
  738.         shr     ax,3
    * I; i" |$ y; L6 D+ P
  739.         mov     bl,80. k8 I) m8 I- ^0 D4 A6 u" L
  740.         mul     bl
    ; L# V  ^$ h' `" R6 L8 \$ R/ S
  741.         mov     bx,[pos_x]5 o0 s. d( N" b' O. n% B  n
  742.         shr     bx,30 w5 ]* V# G& Y, B  R4 C, n
  743.         add     ax,bx; N& Q( p& d+ R& K) X& H
  744.         shl     ax,1
    / j& g: j' E7 k; o6 Y: j& B
  745.         mov     di,ax
    - ]: J" C8 ]. T0 m" R, k
  746.         mov     ax,0b800h. V% B0 K+ T; }) P5 \; h# X
  747.         mov     es,ax- S" |$ Y( ], U, B0 T
  748.         mov     ax,es:[di]) H0 \* C5 A2 t, _1 ]
  749.         mov     cs:[save_char],ax
    1 c0 J. A5 r' i
  750.         not     ah
    8 p) @) E$ |3 m7 ]8 J4 @' Q5 J' g
  751.         and     ah,7fh2 I" F4 v% H2 G! K0 W/ N
  752.         mov     es:[di],ax
    ' A/ i( \5 o% v9 s% ?$ ^( V
  753.         pop     es8 Q3 r) L! ]. ~0 n0 {0 o7 l; R8 j9 z
  754.         pop     di+ h3 V8 L  H- l
  755.         pop     bx9 T0 V- ]7 e+ @3 f+ `' x
  756.         pop     ax
    6 K$ k0 v! h+ t; U* }4 s& A2 a
  757.         iret4 J% ~& A  E& F0 R9 t% b

  758. 0 R' _) H1 a" u5 N! y
  759. _hide_mouse:
    8 L/ P$ p, ?4 D/ N( ]
  760.         push    ax4 x; Z: n7 @' G2 V% D6 r6 A8 P
  761.         push    bx* R% A* J0 T8 b4 c! k% d
  762.         push    di
    * B2 A  q) ?( ?/ Q+ f
  763.         push    es: q  [8 D, D1 R- X
  764.         mov     byte ptr cs:[sm_flag],0
    . |4 G: U+ @) k2 @8 W: D
  765.         mov     ax,cs:[pos_y]  X$ D. z, f1 G0 k% l6 @
  766.         shr     ax,3
    0 q  I3 b: ?' w
  767.         mov     bl,809 p0 G4 `- i' ~# M3 A
  768.         mul     bl- d& C3 B; U& H
  769.         mov     bx,[pos_x]
    + g. B% c1 L! X* M9 K) Z0 F+ \
  770.         shr     bx,3
    1 i2 }* K# f) B" Z$ G1 p1 q8 a
  771.         add     ax,bx
    1 k; c  u8 D+ {
  772.         shl     ax,1: e  |; l+ a; F  c4 r2 f7 B3 j; d
  773.         mov     di,ax
    ) a5 N- |# V: e# P, g
  774.         mov     ax,0b800h. K2 v* y5 x2 C; X
  775.         mov     es,ax& |! W6 z; d. W! ~" _
  776.         mov     ax,cs:[save_char]
    % F/ i6 D/ v, \2 t+ g4 ~
  777.         mov     es:[di],ax1 @6 N7 Q$ }* ?+ Y$ ^
  778.         pop     es
    ' b0 V- e* y+ A" R  w1 o9 H! i/ Y
  779.         pop     di" V, M, f2 {* H1 t# z0 [# d
  780.         pop     bx; G3 S) R6 ^/ P
  781.         pop     ax
    . @5 f4 X9 u5 R0 J
  782.         iret
    ) }! v! t  }- H2 u
  783. - @/ D8 N5 D/ G5 B) Z5 n8 k8 G% D0 n
  784. _set_pos:& Q/ d7 G6 r7 E; f9 k; }! B
  785.         mov     cx,cs:[pos_x], a( e" w; T3 j) l9 C9 }
  786.         mov     dx,cs:[pos_y]8 n5 R$ [8 l- Y4 S1 Q
  787.         mov     word ptr cs:[x_move],0- Q; h, t, \2 Z) Q) G
  788.         mov     word ptr cs:[y_move],0  M8 q( H2 u8 C% c  t4 B
  789.         iret
    , t! ?+ H2 b8 W% }
  790. / e+ h$ m7 l% q* T0 u
  791. _set_hor_pos:( C9 N, E3 g4 d, u
  792.         call    max_min
    4 E' O0 j" A) u/ J" t! M$ f7 U
  793.         mov     cs:[x_min],cx
    ' @6 v6 ]. r& c# r* g1 Y% `1 b
  794.         mov     cs:[x_max],dx
    % ?! G1 g( i7 U7 c& x
  795.         cmp     cs:[pos_x],cx
    6 |6 y* c2 ]' n  I7 R. c9 z. O1 p
  796.         jge     good_hor_min, K8 O: D& K( q/ t. P
  797.         mov     cs:[pos_x],cx* b: Y7 Q: C: f" Z$ W
  798. good_hor_min:
    3 o: F& C0 a2 E" V
  799.         cmp     cs:[pos_x],dx
    7 X0 w" \& y" l7 r9 r1 W
  800.         jle     good_hor_max! G' f( \7 C6 U# H( u0 Q
  801.         mov     cs:[pos_x],dx
    . `0 l7 D; q4 I, e& ^' D) N
  802. good_hor_max:: X$ P2 R5 U$ N" ~. \6 c3 T- L7 A! b
  803.        iret
    # C4 P. m8 J) c0 h% r

  804. 1 q9 P0 Q3 c$ h  {# Q! r
  805. _set_ver_pos:  ~* S" Q* p8 r! b; G
  806.         call    max_min7 o  Z1 A+ z; @  F6 I: J, N
  807.         mov     cs:[y_min],cx
    ) {% D- n$ @8 B: a4 A
  808.         mov     cs:[y_max],dx
    1 t  L7 L' W! \2 S0 {
  809.         cmp     cs:[pos_y],cx3 V4 Y- W8 ^: u$ A
  810.         jge     good_ver_min7 ?& l/ q& o9 C
  811.         mov     cs:[pos_y],cx
    ! Z2 G1 s8 i0 m7 L, t  \8 t+ P
  812. good_ver_min:
    # w8 j3 f) P& g& [: G$ A
  813.         cmp     cs:[pos_y],dx; F. a1 X/ |5 }' a8 d, Q  W
  814.         jle     good_ver_max
    . F: E; ]9 E+ v4 Y' V
  815.         mov     cs:[pos_y],dx
    3 A6 {: L+ x' Y0 J
  816. good_ver_max:4 Y' F; t) c  V( F7 ^( n
  817.         iret. R1 i* H  K" }
  818. 3 ?1 E3 ]- A7 o8 A! ~4 ]" \
  819. max_min:9 a6 q+ s- C: {7 Z% f
  820.         cmp     cx,dx
    * ]$ I+ E& y" L
  821.         jle     no_swap7 ]9 d1 D) Y8 r: y3 z) q
  822.         xchg    cx,dx
    $ D2 I, g& Y6 Y: O" o( A
  823. no_swap:- l  y$ m! L8 d" B
  824.         ret, o0 W4 M# ^2 p, J! P" m# P- N4 A

  825. : a& Y( A! e3 C: C2 o3 p
  826. _set_subroutines:
    7 y$ o' q: F9 y2 b: \6 O* V) o! U6 E# z
  827.         mov     cs:[user_subroutine],dx
    4 l" M' \! i7 E; r
  828.         mov     cs:[user_subroutine+2],es; C* F  t/ k5 R
  829.         mov     cs:[user_mask],cx
    2 v* s" Y5 K( A
  830.         iret; I3 y; F7 C/ d: v' x' Z9 U/ _

  831. ' k4 C9 L" Z$ F: }
  832. _swap_subroutines:
    : X+ J/ ~2 u! N  P
  833.         push    word ptr cs:[user_mask]
    1 f% I1 {, W* h0 H1 y' L
  834.         push    word ptr cs:[user_subroutine+2]2 O5 N3 F4 u( X& O! E; J- w
  835.         push    word ptr cs:[user_subroutine]/ w1 _8 u& T4 H: d9 o
  836.         mov     cs:[user_subroutine],dx& }# J* j2 T: y; d+ Q& N( a
  837.         mov     cs:[user_subroutine+2],es
    $ R6 y/ u: l8 B# ^  K8 F
  838.         mov     cs:[user_mask],cx
    5 W( o1 S2 P' V* m) L" c6 k
  839.         pop     dx
    * y, h9 d* r& F$ J9 s* ^; a) k
  840.         pop     es
    7 x6 P3 {$ t# ]6 i) p' v$ z
  841.         pop     cx
    / o  Z- O: o$ D) m
  842.         iret" ]' e% w% _; k3 l; b
  843. 6 z" F. r) M6 o/ N3 b' o
  844. memmouse        endp, R/ p. A  a" J! L+ \: R

  845. " I) L  |0 l' c: k) r, Y, K
  846. endof_start:  {/ ]2 l. Y  h
  847. 9 r  U, |0 }. P4 G! a: b
  848. emsg db 'No mouse driver install error!$'8 }* m" R; ^6 `* e
  849. old331 dw 0
    4 M0 P7 Z+ Z" [- ]# ?  L
  850. old332 dw 01 q! K% s  z& `8 E7 t/ A, ]& o
  851. old741 dw 0' c+ R: q* `% n) m6 {
  852. old742 dw 0
    5 ~6 Y1 S, w( D( b! [$ @4 S, i
  853. memcopy db 0. c' t! v8 B' B8 W1 R/ e7 w
  854. okcheck db 01 c& `1 i  @$ C4 c
  855. pass db 0) e, k! Y( ~+ |1 `% H7 z
  856. chkl db 0
    ( L: z( b3 b) H! Y4 L# Z8 t
  857. lk db 0
    0 A1 G- R: \* N" p# X2 h1 A
  858. chkr db 0
    ! k! d$ h% j7 c2 S- @
  859. rk db 09 }# Q7 h2 T4 q# x
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ( U3 X7 R  e% S& p1 p* j
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    # M( t- ^+ j) R0 O4 [1 k# n
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ! k9 `4 k. v6 U
  863. db '                                                                                '
    " X. @% i% q  h" F! D
  864. db '                                赏屯屯簧屯屯突                                  '0 M3 w6 o+ {; L& T: J  M) F
  865.         db      '                                ?OFF汉OFF?                                 '; i# k  B% X0 ~+ r: `
  866. db      '                                韧屯屯既屯屯图                                  '
    / b- L3 n  b  q$ N' v- z. B; U
  867. db '                                                                                '
    2 I7 s8 R8 o6 O! k; y, [  `
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '& |+ q9 w; g7 n; ^* l! {
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' + b4 b3 m3 P/ B3 K
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '- x8 N, m0 }, e! ]& M' k; }9 s
  871. 3 v) H2 d1 ^% d: }4 o% u# _! G
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
( {% y0 y2 S3 a# q$ L; w5 o; n: {哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... : q0 d) u& C9 K* a4 B$ X1 Q4 H

) m7 a/ g- R* ?; M! h6 ]谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-27 08:00 , Processed in 0.547446 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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