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

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

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

3 l' s& E( S0 i* `1 X0 I; _) N代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;! x7 b* w7 B2 z
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9, Y  z7 q, |- W- `  e: z6 W
  3. ;                                         By Bini.Yi 易祝兵. T8 s+ j9 r( w7 R
  4. ;                                         http://www.ufoit.com 计匠网2 o0 E5 M+ A( T4 r  E3 l/ g# k
  5. ;                                         2002/04/06 YYYY/MM/DD  a& I  g; v$ C$ J  M, _0 Z, d
  6. ;5 ]7 @$ w6 X) L- |$ E
  7. ;          : V, L) ^. ?) ^+ p
  8. ;          This program  test the mouse button  click and move.
    9 o* S7 R% l3 E
  9. ;
    ( \2 C) X1 `/ x2 A6 X
  10. . \% r0 X" A9 {" b
  11. .model tiny; j) r/ q2 t( @' B8 {. ~
  12. .586
    ) r' z6 j! Y" o
  13. .code
    % \0 }  j+ \! H& W) a" l. y6 t
  14. .stack  100h
    % l6 s7 O) w$ U( Z% ~5 D
  15. .startup
    5 E& L4 c# s  x# `. N
  16. pusha" e  m) `) H$ H+ W
  17. mov ax, 3533h
    0 _5 |1 f& ~- t% b
  18. int 21h- d- K; u3 E7 `8 `4 U
  19. mov word ptr cs:[old331],es- s+ w$ @4 t. ]6 O5 r' v
  20. mov word ptr cs:[old332],bx
    8 M5 B; X. s  e1 Z
  21. mov ax, 3574h; z3 o2 z4 J) ]9 w6 n- t
  22. int 21h9 G$ d& C8 _( j1 f2 n
  23. mov word ptr cs:[old741],es- v) I9 q" f+ W2 B& `# t" R
  24. mov word ptr cs:[old742],bx% f7 @5 L0 ?# M! u# d: B# H
  25. popa9 x, a) R, I$ r0 R( j% N3 ?
  26.         call    memmouse6 r6 r5 R" S: c+ O4 T5 N
  27.         mov ah, 00
    3 h" p& ]( ^& }# E( b
  28. mov al, 03
    6 s' O1 v8 e' `1 v
  29. int 10h/ M1 `* h  o0 g7 {: [$ t
  30. mov ah, 066 S6 l3 m* i5 {5 i
  31. mov al, 07 m; X* A8 i: n2 J
  32. mov cx, 0
    4 x2 |  b3 N' g& `
  33. mov dh, 24) \" G& O$ s' Z4 x- b
  34. mov dl, 790 Q% w, t7 E2 ~  |  T- P' ?
  35. mov bh, 07h
      G, Y0 w0 h7 |# }% N: Y
  36. int 10h
    / `2 B5 P& ?1 n! x' }
  37. mov ax, 0000
    9 \. ^' c* Z4 @/ o, S" J9 X
  38. mov bx, 0002
    & `7 e! T; O) s% _2 R
  39. int 33h( N' R6 _. @8 K( j% t
  40.         cmp     ax, 0000           ;if no mouse drive install2 N% a- ~  k: z% \/ U
  41.         je      errormsg           ;show error MSG
    $ q! l# Y& C; [5 _' Q% k
  42. mov ah, 02% r9 v1 p' O3 x' Q% v5 r3 N8 I
  43. mov bh, 00
    : _7 m0 N( ~, q% [2 Y, w7 ^! }& q
  44.         mov     dh, 25             ;Move point out screen
    : r/ {  [  i" w* A3 P2 K9 R
  45. mov dl, 79
    . `& K3 \+ k& U* s% p7 a
  46. int 10h$ Z7 T  W) w* E9 W) _4 ?
  47.         call    showmsg            ;Show info3 {& W7 Y4 N  N7 I. a6 G
  48. mov ax, 0001
    ) I# I# y: z& L/ U% A: u
  49. int 33h7 D$ i' X2 B( a7 f( W! {: `
  50. ; mov ax, 000ah! L! A1 c8 ~$ Z2 C7 N1 [2 K
  51. ; mov bx, 0000
    1 e6 L! L4 Q0 `, O4 I2 T
  52. ; mov cl, 0h( v* S$ Z: l2 p$ Y, ?
  53. ; mov ch, 0F0h
    ( z* I0 V& t" U- i7 L) |
  54. ; mov dl, 0h
    * q, L# D- f& d, H' \4 h1 }
  55. ; mov dh, 0F0h
    6 F1 S1 Z, {- Y, L& @3 n
  56. ; int 33h
    1 I! l# ?& o' w0 D2 t1 l+ x$ H
  57. mov ax, 0004h
    % W9 b, X. j3 A) u. Y" C/ G
  58. mov cx, 0319
    % @- y; s: {  r% k6 }
  59. mov dx, 0103
      k+ G0 I4 O2 D. [7 l1 V
  60. int 33h( S/ ?8 N+ o5 q7 H
  61. casemo:                           ;Case button click and point move : ~& \+ `& |8 w9 v1 [8 `
  62.         mov     ax, 000bh         ;and keyboard press
    2 }% S+ X8 Q. M
  63. int 33h
    . W# u0 f4 i" r6 @( K
  64.         cmp     cx, 00h           ;if point move....X
    $ t, [6 x! |# f* V; g
  65. jne xmov
    2 C2 F4 R$ I9 V  O
  66.         cmp     dx, 00h           ;if point move....Y
    7 h% P! P% S+ O6 r9 H. G0 X& a& A$ Z
  67. jne ymov1 I5 [' ?+ M5 Q9 p0 x2 M
  68. xymovend:                         ;X.Y move end/ r. S1 f! r/ @' z
  69.         mov     ax, 0003         
    4 r  q# x) ~4 T
  70. int 33h6 a# Y' @. T: C0 V/ Z& ]& p
  71.         cmp     bx, 0001          ;if left button click  show ON. Z0 k& l; `" t* W: P5 `
  72. mov si, 1828
    3 N4 t2 g' ^+ E; x# r# c; D5 B  a) F
  73. je listl
    ) T  ^. l2 j, X7 X
  74. mov si, 18285 Y7 |9 c5 i- a0 ^" V) n) O
  75.         jne     nlistl            ;if left no click show OFF. j0 r  r) {& d
  76. testr:
    ; f) y/ K- E# t; |7 ^- V; T% o
  77.         cmp     bx, 0002          ;if right button click show ON3 a% p2 j) R. E$ \& L7 ?9 s# J
  78. mov si,1842
    . l$ W8 L: C! Q, S6 `2 T
  79. je listr
    % o- d# i$ ?* V3 t. e( R
  80.         mov     si,1842           ;if right no click show OFF
    + Z% A# H0 d; x- S
  81. jne nlistl' E* W; r, _9 u$ Y- H4 j% Y* t. l
  82. casekey:
    " L* }* A* h* ~9 K
  83.         mov     ah, 01            ;if any key press jump check
    & F) D) o( O: d& c- d, w
  84. int 16h
    ) C: O, c9 k: D1 O
  85. jne kpress: q, {, w) c+ o; \% P) F
  86.         mov     al, [chkl]        ;check x flag" q( Y7 s: s8 r# f5 t
  87. cmp al, 02h; ~. r/ _/ l2 }. z9 L
  88. jnb chkok
    : f; i4 Z3 }+ k+ L& x& \  _
  89. jmp casemo9 \% K+ F; M1 f3 a0 m
  90. xmov:                             ;if X moved, get the X flag+1) u0 B8 V: t) \4 T5 M
  91. mov al, [chkl]
    * S2 F5 a# @5 N* t# U. w- q5 |8 c
  92. inc al
    % t: Z) C2 G5 ]0 b  L1 b, t5 P
  93. mov [chkl], al
    1 Y' F2 e; R6 F6 s  e  U6 n+ b; _: [
  94. call passok
    7 q" b2 M' s) @5 ]4 V
  95. jmp xymovend( B, A. h$ B# w- t0 h' i7 \0 }
  96. ymov:                             ;if Y moved, get the X flag+1
    + [) L: G" G" a* h
  97. mov al, [chkr]! f5 m( X( H( Y/ ?' o
  98. inc al& a/ G8 t8 m% S7 k% A, I
  99. mov [chkr], al
    6 C  y4 M4 y' Z/ ~
  100. call passok2 W  ~  E+ Q6 f; w
  101. jmp xymovend; n% O0 P. H3 M: M  P3 n6 z

  102. ) C6 [( a# h1 j. a- q6 Z) q* d  X0 |
  103. passok proc near( o, ?3 Y( s- ~. {
  104. mov al, [okcheck]5 B0 A8 `  I% ^& a! Q6 w
  105. cmp al, 1% ~, i% U" }% J+ L' {2 a* O
  106. je let0' s0 J9 n$ m1 O* \, ~
  107. jmp passret
    8 ?7 P% \. J- ]# J
  108. let0:
    ! \1 t3 O6 O3 s$ [) k
  109. mov [pass], 1
    4 m* e$ J9 R3 C5 J1 Q7 \
  110. passret:- _# l) g$ g& U0 R" }/ l* P
  111. ret- m, H# _* J$ W# }
  112. passok endp 8 u- k" A2 p% ~! y7 V4 G- h/ p

  113. / j# l, a0 o" ?7 R8 B  O
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS! {4 r* S+ P8 }8 }0 }. ^# @6 `
  115. mov al, [chkr]) w7 w8 N3 k: g* c
  116. cmp al, 02h
      F9 U) [2 _0 e( l
  117. jb casemo
    ; D5 I4 J* _/ A
  118. mov al, [lk]) ]  y' v( ?9 D# R4 O+ [# N; v
  119. cmp al, 1
    7 E0 s& F7 f* ?  e$ p6 T
  120. jne casemo
    $ M0 _7 R, \& x0 K% f
  121. mov al, [rk]3 B( v+ w# T5 S8 i% U; T, N
  122. cmp al, 16 C4 i, u* U* }- \5 U( o! H
  123. jne  casemo
    & r& A7 Y0 K0 N: ^! {
  124. mov [okcheck], 1
    ) X, p9 \  c. y( k( |+ J" i
  125. mov al, [pass]
    3 `" U, v0 n3 L7 l  z# l! V7 E
  126. cmp al, 11 n- x4 F9 u8 E% d2 G& O% F
  127. jne  casemo# \/ \, X( h0 k
  128. mov ax,0002h: x7 y) N! J  g4 b
  129. int 33h
    ; p# o& p# w# j6 Q& T
  130. call cleascr" m3 s3 ^3 |% ^! g# W# N
  131. % D$ x' k* ?7 C) d
  132. call oldint- [" ~9 C  {1 ~3 r- d/ a
  133. mov ax, 04c00h
    5 |) z- X; Z  l( S# H  r
  134. int 21h$ y7 }' g& l/ ?; W' S
  135. # M, r4 d! c, @: O
  136. okexit:, ^) D! ?0 D5 l" a
  137. mov ah, 4ch- _; M! ~# f/ t* I9 n5 N
  138. mov al, 0+ Q: B2 r3 q( ?" e: g
  139. int 21h
    * E" M& ~- A* g. \9 d5 G3 _6 a) E
  140. listl:                                 ;Show ON: @5 G4 |0 R) {7 d4 T/ E# ?
  141. pusha& D7 c% i" L) y, i8 y' `5 c
  142. mov ax, 0b800h; i( H2 K1 Z$ z  ~
  143. mov  es, ax
    0 ^3 B1 e0 J" ]/ @1 Y+ p% G. N
  144. mov ah, 47h* M% p7 G; d/ _: v/ G, _9 r! J3 E
  145. mov al, 20h- g# s9 }3 r8 n4 b" }6 m/ C$ Z& k
  146. mov es:[si], ax# T/ c% n& l) ?* h3 p; C" v
  147. add si, 02
    ( {" k0 Q: Z! T; Y2 V
  148. mov  al, 4fh. {1 A5 E; P+ y5 q' F
  149. mov es:[si], ax
    ) H# l9 o  b) L4 Q
  150. mov al, 4eh
    " ]7 |, q, h/ g- s4 @9 j
  151. add si, 02  u9 H7 }" U4 _5 T: U2 S  }
  152. mov es:[si], ax- h. Q) g5 `( f. v
  153. mov [lk], 1- E$ n, M% ?% z* L+ o
  154. popa4 a1 s  f3 |& ^8 p: J
  155. jmp testr) M$ S0 D5 D! b% f& w; n
  156. listr:                                 ;Show ON" t$ T- A8 i- z- B
  157. pusha
    : K" y) [( c) ?" O
  158. mov ax, 0b800h
    ( e: f3 ~% V$ l: Z
  159. mov  es, ax/ S' E# {, y& G" W/ l1 R4 Q% q: Z
  160. mov ah, 47h. b* Y. _$ [' |
  161. mov al, 20h
    2 F. ~& c9 Y0 e3 D8 y) S
  162. mov es:[si], ax
    ! W' X8 ?4 A- v. c
  163. add si, 02/ q5 D$ S7 s0 T" e. ^
  164. mov  al, 4fh3 y5 s2 t; @  u0 j
  165. mov es:[si], ax% H( a  f# K, @' H, {8 N
  166. mov al, 4eh& @/ y/ H3 K+ a1 O7 f
  167. add si, 02
    ; |3 w+ O' a' R( e/ V9 J& [
  168. mov es:[si], ax
    $ o/ }' j: k/ S3 J7 Z! l% m( j- ^
  169. mov [rk], 1" Y6 [% B( F% O- A. Y
  170. popa0 c* a3 W8 w& ?+ o6 `9 I3 N
  171. jmp  casekey
    3 O6 u& }# m: v/ F( @; c7 F  v
  172. & D' Q- l2 O" f" y
  173. nlistl:                              ;Show OFF* r0 i6 y% K: w- v) K
  174. pusha   # `/ {! t; ?" Z0 Z& S  X! z) j
  175. mov ax, 0b800h. b; X0 V- n! @3 M0 {
  176. mov  es, ax! H! g7 h3 [% O0 Y. }# v* J: Q6 g& E' G
  177. mov ah, 17h! d4 u( I  F0 F) X1 R
  178. mov al, 4fh
    4 E" L4 P. H( [1 z5 l: {/ W, b$ {
  179. mov es:[si], ax! Q1 B+ d' I! v6 H. O' ^
  180. add si, 02
    ! l( y: M. e2 }) H, [
  181. mov  al, 46h
    # d* A4 A+ d: s( w/ @* C
  182. mov es:[si], ax# T1 C5 v+ A  A4 ~$ B' ]( g! g
  183. mov al, 46h
    ; Y( `! d9 e( X  h9 W
  184. add si, 02
    ! m% j# E# r# d9 y
  185. mov es:[si], ax
    9 S$ o5 \# H& N  c2 m& c; P
  186. popa' }$ [# ^0 G$ L$ v. \" m8 K
  187. cmp si, 1840
    , k% _, E- J7 \" w9 [2 X
  188. jae casekey
    2 E8 Y. T. P2 s3 g! ]) _
  189. jmp testr# W0 c! n6 z) P, D1 t% t+ _

  190. 6 |& e* E3 N5 G& Y5 ^
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    ! g$ I6 H; P( |3 A9 ~
  192.         cmp     ah, 01h             ;and return a error
    % S: ]  q) |+ T: W
  193. je exit1
    6 j: X% ?9 {. e4 `
  194.         mov     ah, 0ch             ;if press other key then clear8 U: S- D0 g- w2 l2 j
  195.         mov     al, 00              ;keyboard buffer
    & {% A( T* [9 x; w0 a; E2 y
  196. int 21h
      L2 q+ `/ H6 u* n" n& \3 n+ R
  197. jmp casemo
    9 _* H5 }. y. B5 T3 B

  198. 3 a/ |" q/ j, ?) ^* G0 k
  199. errormsg:                           ;if mouse driver no install
    2 j. E2 R+ C7 y' A& K  ?# m+ |7 X
  200. call oldint
    3 I# a$ B' y( [' s' u$ Z7 ~- Z
  201. lea dx, offset emsg+ p3 ]! k! v  l2 O2 m# U5 f
  202. mov ah, 09h
    8 n/ h+ O# B% ?2 R& B$ k6 N4 }
  203. int 21h' f; G! z; L- P" S
  204. mov ah, 4ch) V1 S0 y, g& L. D
  205. mov al, 2  A4 C& e; v/ X3 y. h8 J
  206. int  21h- T7 O# j" F: J3 b0 s/ S
  207. . p/ J7 _& v1 s3 i9 ~8 j, j1 j. J
  208. exit1:                              ;error exit
    & f: u+ p: Q: |2 Z
  209. mov ax, 0002h4 o1 B. M8 G7 R4 [8 u# L
  210. int 33h
    8 ?8 ^2 E; ]2 Z' W4 |
  211. call  cleascr+ ~3 E2 C  v/ R3 X" d- a5 O
  212. call  oldint
    " \5 Q) s! O: _( g- ^; p7 u# N
  213. mov ah, 4ch. p5 f7 V3 V6 v$ L, v0 }' x5 Y
  214. mov al, 016 u& o" ?5 k  q
  215. int 21h) J- L6 M* S7 T2 n/ n" a( f+ }7 p) T
  216. ! e, X- |6 W+ Y7 g' V$ I( n
  217. cleascr proc    near                ;clear screen. j/ H! \, F8 B6 L
  218. pusha
    , O3 f$ ^: ^; a! v, c( D, j5 K
  219. mov ah, 066 r' V; o- ?; @! b
  220. mov al, 0$ e; O: I8 o- N
  221. mov cx, 0
    3 T4 r0 Y  Y+ H, ~, S. |% B
  222. mov dh, 24
    # }# i0 u/ P0 i, u- k& G
  223. mov dl, 79
    ! n' P9 ?: Z- G5 G$ y
  224. mov bh, 07h
    3 q0 x- H2 D" T% D& @, c! T( {, l8 V
  225. int 10h
    ( O+ O6 }9 t/ k6 ?  z  l
  226. mov ah, 02
    6 G8 o5 U8 N' H8 T% z
  227. mov bh, 007 R& x, F9 O) S! r$ }9 z
  228. mov dh, 0
    ' b( e. a! D- u' X- R$ ~" J
  229. mov dl, 0/ l; U* o( `1 i0 v8 R) k* D& o
  230. int 10h( S0 k5 M3 W7 F; ~: q. Q
  231. popa
    & w1 K( S" |- {
  232. ret' o) m7 O9 C" R- K! r3 w2 k( E7 Y
  233. cleascr endp8 S- [/ A" w; B( `

  234. 4 [& B: ]( ]& h: ^+ \
  235. showmsg proc    near               ;Show info
    . P8 u' {. }4 P& [; Q& N
  236. pusha$ x9 w1 Q/ J0 g' r; p
  237. lea di, offset showms# `8 I9 G" }# U# s: b  K3 H
  238. mov ax, 0b800h
    5 l+ \# L( T( i5 T! t) n
  239. mov es, ax8 X1 K+ |- e3 g
  240. mov si, 02 _# m& I; `7 ?  J
  241. mov cx, 480
    $ n  L: J' s% \  R  ~) S' V
  242. mov ah, 07h, J0 P- o* D7 Y7 p7 x) X8 s
  243. @@:0 b; `; s6 G& G# C( R
  244. mov al, 20h
    # [6 h" v' |, {8 ]
  245. mov es:[si], ax
    + q# i) u# V" }# e6 |# _* S1 [
  246. add si, 2
    3 b: y2 D7 z: P$ v
  247. loop @b/ M2 y1 `! W& g- m" p. a
  248. mov cx,880$ y3 T! p7 l' b  R4 U
  249. @@:* D: j; c( q  l0 N2 Y
  250. mov al, [di]
    1 B/ C8 i% F$ N& G
  251. inc di
    6 @4 Y* ^9 F3 ^; J# c3 a
  252. cmp al,20h
    : _% S6 x" b$ s" v, T! Z
  253. je showch14 p  n: a$ v8 K  z' M
  254. mov ah, 17h
    - b; Y% F8 r! l* D
  255. jmp showch3
    * e2 X  d9 z9 a. l) ~  }
  256. showch1:
    1 {8 X" w0 A# n8 R1 E0 t  b4 o+ o- D
  257. mov ah, 07h 6 x3 a+ {# \& i/ g$ Z7 \) b; M
  258. showch3:2 B8 j! y% Y$ a( Y7 @4 u
  259. mov es:[si], ax* C4 u. y' }% p
  260. add si, 2: N, U; k- W/ _
  261. loop @b
    ' c& z! y: s+ c: |. m7 `
  262. popa
    ! R$ ?/ U( q5 y2 l& q! G" o
  263. ret
    . y6 k0 `6 f1 }3 C4 D7 }, C3 I
  264. showmsg endp- |( v$ u4 p* y7 J8 U

  265. 1 r. `4 L* D8 D* \
  266. oldint proc
    ( ^9 \; p" z2 K5 f9 a7 ^. b% r
  267. pusha
    ( n6 P5 t# T+ y/ X& R0 m+ `) v8 ]
  268. mov ds, word ptr cs:[old331]  T( Z& _7 t2 ^  r$ }$ L4 k7 {
  269. mov   dx, word ptr cs:[old332]- n+ `2 P8 t3 ^1 z' V) y
  270. mov ax, 2533h. ~' r2 Z) O, [
  271. int 21h
    4 F- Z  A6 U3 B' e
  272. mov ds, word ptr cs:[old741]3 A7 S3 c( h; y0 s2 G; n/ t0 `7 D+ G" n
  273. mov dx, word ptr cs:[old742]# G. g+ [* ^  r6 w  E
  274. mov ax, 2574h
    1 Q  T7 }* \$ W8 n6 H
  275. int 21h0 F0 P) x" b3 v
  276. popa
    ; A9 ?" I  k% A% u$ U4 r7 V: Q6 y
  277. ret! c* O0 @1 g! m7 N6 q" s% z7 @
  278. oldint endp
    2 X% W4 ]6 Z3 Q& t& I

  279. 7 j7 m/ Q. j" V" R
  280. memmouse        proc( Z# h: C1 r; J+ {
  281.         xor     ax,ax
    ; F# K( C; E: j
  282. int 33h* i: {6 Y, y( q
  283. cmp ax,0ffffh
    8 R) [$ R3 h1 V/ R  L
  284.         jne     not_loaded5 z4 d8 `! n; f9 M  m- ?
  285. mov [memcopy], 12 M( f8 u0 G* O1 h& o
  286. ret
    9 f* n5 F# p2 B% n
  287. - @' [/ l  n7 y( V
  288. not_loaded:1 i% R! n' E( a9 I7 ^

  289. / c. m  u7 {, U2 k7 N' R
  290.         mov ax,2574h) t; D' N' g" Q9 f
  291.         mov dx,offset new_isr
    $ j* Q; ~2 U5 a: j6 m
  292.         int 21h* J% r4 ^$ b* W

  293. ' [1 ?5 _3 j9 C6 q
  294.         mov ax,2533h
    5 G0 {" J; X4 P% g* e& g
  295.         mov dx,offset new_33
    $ a9 I$ }+ x. J7 ~- C
  296.         int 21h
    ' \0 q: N( ^- A1 r
  297. + m  l+ R- K5 F: B
  298.         cli, J9 n3 n, o" e& M1 O5 |
  299. 6 ^. X+ i4 y/ ?2 X' ^) ~
  300.         mov bl,0a8h
    , P1 |1 {6 C* F* V9 ^: S
  301.         call keyboard_cmd
    & L# R& W- d9 @8 X% t

  302. ! U% P& {& N$ q7 z8 @
  303.         mov bl,20h6 v/ S2 ?3 [' o3 F% G+ J9 v. U- Z
  304.         call    keyboard_cmd
    7 W" G7 x4 n! J
  305.         call    keyboard_read" i4 p9 ?7 W4 x! P: ?3 N
  306.         or      al,2; a; g8 Q) D6 p; J6 U
  307.         mov     bl,60h5 g" z: Y* S5 x! b+ {8 N( P
  308.         push    ax
    * I# Q5 K$ R: D! Z
  309.         call    keyboard_cmd& C0 ~" z1 \2 Z, f" o3 c
  310.         pop     ax( D5 ?0 v& p, G! s: y/ }
  311.         call    keyboard_write0 l/ R$ f. i: v3 F% R

  312. 1 L$ s& f- b6 [) M- I. a
  313.         mov     bl,0d4h' f& J8 e  P/ l
  314.         call    keyboard_cmd% R% ~# u* L7 a; J4 N) l
  315.         mov     al,0f4h
    " p- R" N+ i" H* T* s
  316.         call    keyboard_write
    : m: {# S* [! s1 z

  317. 9 @. ^; a& E( O0 [
  318.         sti
    + m) D& k8 o$ v* g
  319.         ret" K  O. S# N. @' C
  320. call_user_isr:
    ) u3 J% [9 R; D5 G! n( B
  321. db      60h
    ! P; Y) L! Z: y( ?
  322.         mov     cx,cs:[pos_x]
    + [0 K6 V  R4 U& O3 ?; W8 z  P, a
  323.         mov     dx,cs:[pos_y]
    % ^! f& |, s2 x2 m" A0 S
  324.         mov     di,0 ;cs:[x_move]9 J+ Z& w7 g/ a5 P
  325.         mov     si,0 ;cs:[y_move]
    6 [2 a% y) n& @; J& A7 \  L) k
  326.         mov     word ptr cs:[x_move],0
    2 Y$ S# h9 M! D+ s
  327.         mov     word ptr cs:[y_move],05 ]* H! v. ], Q1 ]1 D) @5 C
  328.         mov     bl,byte ptr cs:[buttons]1 x8 L& Z/ W$ l* a" i
  329.         xor     bh,bh" h7 V+ P- Q" l4 ]% p6 }- B
  330.         call    dword ptr cs:[user_subroutine]
    ' o* q- |) }5 e+ \0 q
  331.         db      61h
    5 c7 K6 H, \$ }
  332. ret: ~& Z: E, u+ A) N. q
  333. new_isr:
    ' a* r. I7 D+ F7 Y3 ^& v
  334.         pushf- B' i8 Q; z! O" f  e, t
  335.         cli& B. o+ o/ e  M7 c+ T4 H
  336.         push    ax
    ' Y2 q  f8 l: s2 h/ y
  337.         push    bx
    " e; N. l: w; }2 O# }+ l2 g
  338.         push    cx
    " b8 v' x; U( g
  339.         push    dx
    # V4 i% v0 D$ q( E/ U/ `
  340.         push    di" V- m' ~% W) o+ \) O2 O3 e7 b7 d
  341.         push    si
    & i) `8 v+ H( F8 o, ]  w9 T
  342.         push    es
    1 M" M/ f. ~& @# E" \8 k
  343.         push    ds8 Z' E, q: ^* c0 f- W" s& j% s
  344. # B7 \& v* F0 }/ Y4 I" ]# r
  345.         push    cs" K1 y. e# \& ~5 e
  346.         pop     ds
    1 p3 x9 N. E6 v2 ]

  347. 9 y# }- b  p, c' K
  348.         mov     bl,0adh
    1 r3 R' D( ?  p
  349.         call    keyboard_cmd7 v. w& {6 U9 d

  350. - M! D0 O: M3 c  z! b: J6 n
  351.         cmp     byte ptr [first_time],01 X3 @" G! O( B* b' k; c
  352.         je      not_first_time
      G, G5 w2 h6 n, g( \; y, B1 E

  353. . s: I% W& l' F/ h$ L- S; T
  354.         mov     byte ptr [first_time],0
    : w# p9 t+ W) K" A, B% |: j
  355.         call    keyboard_read5 H3 `3 ?5 q3 `2 l2 T2 D5 s
  356.         call    keyboard_read, g5 p4 ~; Q; ^# |  W( Z
  357.         call    keyboard_read1 ?0 y+ B0 M0 A  |% v
  358.         jmp     no_show3 Y# l! A2 w6 ^% N" b$ M

  359. : Y; _2 ~, H* |& l' B$ w1 z  C* ~7 c0 n
  360. not_first_time:) G1 n4 _, k/ T( v! E% y
  361.         mov     word ptr [temp_mask],0
    " N" M) F/ s8 T. Y8 q+ G

  362. - T: G8 V& t/ k* R" [7 t
  363.         mov     cx,[pos_x]1 l) m! w, p* t. j
  364.         mov     dx,[pos_y]$ O! _4 T4 h; S* w6 `

  365. 9 y- m- E! S' v4 X0 s
  366.         call    keyboard_read5 o$ h* C4 J+ T2 R5 q/ z" O
  367.         and     al,7 ;3$ J' ?  G* [8 k) i9 G6 K$ X
  368.         mov     ah,[buttons]$ K8 {1 N: D6 s; o8 X
  369.         mov     [buttons],al
    ' I( r$ F" q0 z
  370.         cmp     al,ah
    3 m$ [' l6 {. s  ^( Q
  371.         je      no_button_change
    - b& y. S0 D( w
  372.         and     al,3
    3 X1 E2 v5 w5 D- w
  373.         and     ah,3- ?# C% u# T" t1 C" }4 N; k; N
  374.         xor     al,ah
    ; A/ [: _8 S9 U2 o2 ]) \' F
  375.         xor     bx,bx
    ' o& p! s! x  G4 H" r

  376. ) M! P7 [# S, \( x  Z( x
  377.         push    ax7 p, o, {8 e/ A$ `4 K2 y
  378.         test    al,2
    # L# ^6 ?/ B7 q" V7 x
  379.         jz      no_right_button_change7 @% d+ U0 R2 E4 J# M& Z* D
  380.         and     ah,2! a- ^3 }( o! p& ^/ h& h
  381.         jz      right_button_pressed
    , y- ]8 d1 ]% ]0 D3 R
  382.         or      bx,16& \, M/ n( i+ a9 J* t2 D' Q" g
  383.         jmp     no_right_button_change
    . e+ e0 n/ F) _7 Q  j
  384. right_button_pressed:
    3 L' U! J, v- a; e3 a% M
  385.         or      bx,8. f' \2 [& i8 w. R* u" a- s$ h5 b
  386. no_right_button_change:
    % j5 S- `  k) A; B* c7 m" r
  387. , p8 Z1 z6 Q9 v+ m! Y; R  s/ R; P
  388.         pop     ax8 }0 M5 N5 w* ^  \; y
  389. / e; h$ U1 m( T9 s& o
  390.         test    al,1
      J" Z+ o+ T: X* x8 i& \) S3 Y
  391.         jz      no_left_button_change
    4 g. {# k( A! K  m/ T& R
  392.         and     ah,1
    # R: D* Y* n! f0 u
  393.         jz      left_button_pressed, a' G3 _% G) s" d
  394.         or      bx,4
    ( s# M" a5 G/ w/ e+ J9 [" R
  395.         jmp     no_left_button_change7 b$ n1 Y7 j( w+ k$ q
  396. left_button_pressed:
    " M. W3 c9 k6 o6 N! k
  397.         or      bx,2
    , O, V( \& T* z6 J" b
  398. no_left_button_change:/ w) _9 w/ D7 ]8 D+ x  W

  399. 1 K# ?0 c7 [- k$ }1 f; o+ G
  400.         mov     [temp_mask],bx
    ) g/ x3 O3 x1 \  [% A1 d
  401. - F/ Q, [. W9 E- U4 \% f  L
  402. no_button_change:5 f" s* s# ~* S4 ^2 R% t; Y# e
  403.         call    keyboard_read% Y" B3 b, W$ v3 b8 h8 v  Q
  404.         cbw$ Z8 ]7 k; h: P' A% y/ p6 M
  405.         add     [pos_x],ax
    ; K) `$ h$ l4 R
  406.         add     [x_move],ax. x$ g! d" |' Y- |1 }9 r, |
  407.         mov     ax,[x_min], {9 }4 m1 J0 a% ]+ j" q$ ^3 ~
  408.         cmp     [pos_x],ax
    0 y3 ~) U& t4 E- q7 u8 Y
  409.         jg      good_hor1
    ! s3 \% F+ `  a  o# \+ c  Q; E: a
  410.         mov     [pos_x],ax
    & q: b% ^9 V2 u- H: Q; F# ]
  411. good_hor1:3 F2 ?3 H. l' r" y6 L# _5 A
  412.         mov     ax,[x_max]. ^( |7 @. N) ^: A
  413.         cmp     [pos_x],ax5 S' q2 `/ |+ v
  414.         jle     good_hor2
    2 u5 |( i9 ~" O! u. `
  415.         mov     [pos_x],ax
    ( H- {! O6 h2 W0 v" _( P7 e/ w& p
  416. good_hor2:
    8 b) m6 x( F. @

  417. / [, d: L3 }5 _: A9 x8 l3 D
  418.         call    keyboard_read
    5 h. |1 V  ^" u) F9 U+ ^! h7 ~& W+ H
  419.         neg     al
    ) n# I* Q3 ?6 Q! k
  420.         cbw4 Z4 E% ^& E0 b, y3 q# j5 `0 c
  421.         add     [pos_y],ax
    : c7 X$ Y3 x6 {2 x& e4 ~  ?
  422.         add     [y_move],ax. e3 O) P# m3 ~; H, w: ]
  423.         mov     ax,[y_min]* w7 h, {. {, k7 [" w/ c  ]
  424.         cmp     [pos_y],ax* u$ R+ ]% @  a( I5 w8 I
  425.         jg      good_ver1' o6 \) [% D/ \& c. s6 O: f1 m
  426.         mov     [pos_y],ax( Q/ T  e/ r4 N' o- T) _, I
  427. good_ver1:
    2 C" r, o7 I; z/ l$ C' p, Q: L
  428.         mov     ax,[y_max]
    / v* i. R% S' h# r: I
  429.         cmp     [pos_y],ax9 y- i6 S, M& N: ^
  430.         jle     good_ver25 K7 d) g% L- E
  431.         mov     [pos_y],ax' W' N3 Z; C* W( r. j" S8 ?
  432. good_ver2:
    ; {* @8 w* }/ i( X( M, G# {
  433. ) L3 \+ c. L% T4 t9 ]0 y( K
  434.         mov     ax,[x_move]% Q' w6 b. X! i
  435.         or      ax,[y_move]6 @0 d# e+ }" X3 @* [% c' Z- y- ^
  436.         or      ax,ax
    # R1 {# ?# l& t2 g
  437.         jz      no_change_position& x1 h$ @! @, l" k8 }9 q' A
  438.         or      word ptr [temp_mask],1& V  ~7 ^4 i, X( \) I! R, [0 D/ B; I
  439. no_change_position:
    $ j" K( ~/ I9 t; n: a

  440. / M6 |* d# K" l3 I, _
  441.         mov     ax,[temp_mask]
    0 N- }1 o8 e8 ^# K; G
  442.         and     ax,[user_mask]+ X& S. J6 C. s, R& d8 C
  443.         jz      no_call_user3 A( r/ g  T/ K6 G1 `0 z6 P
  444.         call    call_user_isr; e0 n' }, K' I  E
  445. no_call_user:
    ) _" a- T/ y# a- b

  446. , b9 i/ y3 T  U/ K
  447.         cmp     byte ptr [sm_flag],1
    / ]. T' j! b% U8 q1 v: Z/ H- `' N4 b0 M
  448.         jne     no_show
    1 B* U3 `+ j! ]: |5 R2 X0 r2 o
  449. 8 i- I! z0 c$ e( Y7 H+ M, G
  450.         shr     cx,3
    1 @% ~8 h9 K% n/ `: g
  451.         shr     dx,3* S1 j, g& ?! |9 Q7 o0 ]5 J9 u
  452.         mov     ax,80
    * x- Z& _  l) K* H
  453.         mul     dl1 O6 d! _5 Y2 o5 \
  454.         add     ax,cx# `# t. W' f, l  C
  455.         shl     ax,12 s2 Q5 K. ^9 I1 u9 B2 ^2 K
  456.         mov     di,ax8 b$ Y$ m2 S5 I# E+ R
  457.         mov     ax,0b800h  T8 ^  f, r) y2 B; N
  458.         mov     es,ax# b: n; X2 I( D( L  O2 V# g
  459.         mov     ax,[save_char]+ X/ s  Z) }  D
  460.         stosw
    3 L$ j! f" V" p/ Y
  461. * \. S% E: W5 u; C
  462.         mov     cx,[pos_x]6 u) R! h0 q& X8 I5 S1 P
  463.         mov     dx,[pos_y]
    1 c! s: w6 p# q5 m7 Q. u
  464.         shr     cx,36 b# v6 G# K- I7 P4 S9 I7 l
  465.         shr     dx,34 a% }6 t: C* t( ]- V. U! `& q1 H
  466.         mov     ax,80
    ' x7 I% u4 I  h$ B' m) |/ M& }+ g
  467.         mul     dl
    7 x9 V/ {8 R: r2 M
  468.         add     ax,cx
    3 G7 N" Q( H6 C/ @
  469.         shl     ax,1
    ! f4 W4 I$ O. U( i& @/ l0 w
  470.         mov     di,ax
    % G# D, V) o+ [1 w! o9 H
  471.         mov     ax,0b800h- C  B& q3 ~- m5 o0 t
  472.         mov     es,ax
    - ^. J2 v$ m9 @9 G7 p+ v
  473.         mov     ax,es:[di]2 E, ]+ f8 M# {! j
  474.         mov     [save_char],ax/ t3 O* v2 F6 H  @, A" r1 k) U2 k, m/ g
  475.         not     ah/ z9 V* R0 r1 a8 V
  476.         and     ah,7fh% ~  z# i* ]+ n/ f7 i8 `: l, e
  477.         stosw
    8 A, j# t7 {: o
  478. no_show:8 E) k- Y/ N5 b! H
  479.         mov     bl,0aeh" v4 Q3 _3 G( a% h! |
  480.         call    keyboard_cmd
    3 A3 b, R  r. w5 |
  481. 0 C, H& k, J3 R' `; I+ T4 p" l4 b
  482.         mov     al,20h% _9 ?. F' Q5 n$ d3 P
  483.         out     0a0h,al- j9 x1 R6 ?' ~0 u6 |5 U7 R' @
  484.         out     20h,al
    / C8 {" e8 T9 O, v

  485. & |' G* ~! [$ D/ u% ?- }( E: {; G
  486.         pop     ds
    4 h% W" A1 y- P
  487.         pop     es6 R# U5 d$ M3 ^8 O9 i
  488.         pop     si
    4 P0 p/ y, _, X) I* ]$ S
  489.         pop     di
    " z/ l  N+ _1 T: \
  490.         pop     dx
    " p' n* t3 A4 f! z; S" R) Z8 L0 Y" s
  491.         pop     cx+ B+ ?7 P4 O. g# ~  d% o
  492.         pop     bx  ^. @" J. [3 Z9 H9 w1 E  h
  493.         pop     ax% E9 Q1 z: s( U. J; V3 s9 X
  494.         popf
    : W9 n" h, k8 d' H' s
  495.         iret
    , _" H. @6 L1 D

  496. 8 Z0 Y, P0 m+ U/ |2 s: q
  497. first_time      db      1- l1 F. ?  g1 M, L: J
  498. buttons         db      0
    3 x3 W' E6 n/ G) W( `6 p. Z8 w
  499. pos_x           dw      0; f0 `* W# p4 f" I" a/ Q/ b2 e
  500. pos_y           dw      0
    " h9 X1 A1 b3 Y' ?8 D+ |
  501. sm_flag         dw      03 @% T/ V/ ?1 ?/ E3 S+ M0 F: w7 @
  502. save_char       dw      0
    : p1 p3 M" g" j8 B, o8 Z
  503. x_move          dw      01 [0 ^7 p' R5 W3 v) b. G
  504. y_move          dw      0; w1 s+ x& d( Y: S+ K/ P  o' ~) G" b
  505. x_max           dw      639
    # M" v$ L9 L  v7 R, f' N
  506. x_min           dw      0  {: m6 W; E# i, B- X
  507. y_max           dw      199
    0 ?1 {, Y+ o0 e' B4 S
  508. y_min           dw      0
    " K/ u+ q% _: [: i7 g! x1 E; ]7 w
  509. user_subroutine dw      0,0
    * o  p% H! D, Q; @7 X- @" B
  510. user_mask       dw      0
    1 K* B; ~. `" o/ E
  511. temp_mask       dw      0
    7 g8 h. @, a, c5 K+ E" ]
  512. - B9 s+ Y( ~6 _! X9 f  U
  513. keyboard_read:
    $ z5 B% m7 Q& v1 P+ u$ G
  514.         push    cx
    - W0 n- P" I: H3 P8 z& l
  515.         push    dx
    % S/ v1 v: m8 E! F  r6 n
  516.         xor     cx,cx; P5 ]5 w1 z5 f
  517. key_read_loop:
    1 J2 Y: Q  p4 H7 S
  518.         in      al,64h; b$ L% G* L' ~8 @. }/ e
  519.         jmp     $+2
    6 q' j1 D) r) w; f  _
  520.         jmp     $+2; L* I( f; P# d
  521.         test    al,1- n! q; u6 E& l5 J
  522.         jnz     key_read_ready
    " B" }8 D+ a& V$ g
  523.         loop    key_read_loop4 i' _( y( k, x/ g2 F0 L$ Z
  524.         mov     ah,1: e. |# C6 Y( ^# q
  525.         jmp     key_read_exit6 s" b9 @8 i# f4 x/ f
  526. key_read_ready:3 y% v& q8 U7 Z3 t+ z% U3 g
  527.         push    cx2 o; `9 y" I! d% Z$ G9 ?9 d
  528.         mov     cx,32
    ) g1 E' r1 L( N
  529. key_read_delay:; e9 B5 i+ G$ c; z
  530.         jmp     $+20 k6 t% u  K5 k: F
  531.         jmp     $+2
    3 x: z, n! K8 D
  532.         loop    key_read_delay
    8 ~/ _  j& U3 Z% A% s

  533. 7 }7 ^" v5 ^  W) M$ f; Q
  534.         pop     cx9 i* ]: T1 I+ t/ D. v! I

  535. 9 A/ |1 S( i+ M
  536.         in      al,60h
    0 B7 ?! H2 h' i( e3 A5 A4 {
  537.         jmp     $+21 e/ `) N" S* l/ s5 u) C  R+ `
  538.         jmp     $+27 t2 e2 Z7 h3 f
  539.         xor     ah,ah
      m2 R6 A) N/ O8 O& x
  540. key_read_exit:: f5 o( V5 }& |' X/ h8 ~
  541.         pop     dx
    $ g* Z) l# ^5 i$ K* @* I: v  S2 |6 S
  542.         pop     cx1 X) ^9 @" e/ S9 \' x( v6 p
  543.         ret
    6 ~- e  y2 S8 V5 @& a

  544. / Q% m% j# i6 {& W, r& q* v
  545. keyboard_write:
    ( _! |4 |* r4 u( N8 }' G
  546.         push    cx! C! N1 w$ H) D# ?: y2 Z
  547.         push    dx
    - @" Q: T1 g! M# P
  548.         mov     dl,al
    9 X" K- H8 E% a
  549.         xor     cx,cx3 c" q: k6 }6 T5 C
  550. kbd_wrt_loop1:- k4 ]6 V) V, a5 p( @' v% q9 S% L
  551.         in      al,64h' h% P" B1 w, V8 ^- ^: @  ^
  552.         jmp     $+2
    ) g0 U5 [0 J, c1 V# W  b
  553.         jmp     $+2
    / S9 i2 S, O8 C9 Q( ^
  554.         test    al,20h) i: {3 i  C8 ~0 b& o8 G
  555.         jz      kbd_wrt_ok1
    ! `2 l% x! m- e' p# y

  556. * W5 v' N1 ?" H% g& Z! L1 B
  557.         loop    kbd_wrt_loop1
    & h8 R# }* N6 ]! |
  558. 5 `" s0 e) A1 i: }5 R9 u
  559.         mov     ah,12 \% y: Q, r% n$ @( }/ [: m9 e
  560.         jmp     kbd_wrt_exit
    ( a5 I' p3 ^2 C

  561. 9 m! D5 u6 c. h
  562. kbd_wrt_ok1:( L2 x+ ~: p& u9 [- A
  563.         in      al,60h
    7 t7 u2 J3 ^: f

  564. 2 q; z) k4 a5 f9 S9 q& Y
  565.         xor     cx,cx8 n% \6 x) f7 H
  566. kbd_wrt_loop:
    6 G9 T/ l% u( }$ ~+ l4 a& {8 G6 R
  567.         in      al,64h
    9 }% q4 H9 \" B, d- ], A. `; B- i
  568.         jmp     $+2
    7 Z. r$ e3 B. w' j
  569.         jmp     $+2+ e- n3 m/ m1 K) [9 h
  570.         test    al,2
    * w# ^0 I6 k7 m4 O
  571.         jz      kbd_wrt_ok" @4 x2 a% `. ]" G, e5 ~
  572. , Q* {3 e4 ~* s. q
  573.         loop    kbd_wrt_loop7 b2 }  C0 [1 g- `2 `+ ?- d
  574. 1 K; z1 W8 B7 B1 x7 K
  575.         mov     ah,1
    + _: n! a+ r+ B4 D
  576.         jmp     kbd_wrt_exit* e# A+ s  t7 a/ H
  577. ( o! g8 x( l6 M
  578. kbd_wrt_ok:" \1 S% z7 T9 X
  579.         mov     al,dl
    * H; j7 X% j* ?5 {& [% k/ v
  580.         out     60h,al7 U; M7 N9 C2 y9 }/ c
  581.         jmp     $+2
    6 l0 j% m5 K& K8 Y0 Z
  582.         jmp     $+2) f# Y: t) p3 W! a. ]/ x. j- G
  583. + H. O5 h' Z6 ~  j( G" j
  584.         xor     cx,cx; F1 {# z: H3 Z* A  r$ O; r
  585. kbd_wrt_loop3:9 w+ u. W" ?) B+ ]" B  h
  586.         in      al,64h
    3 v" V; L; `1 f# \  S
  587.         jmp     $+22 S9 J2 k0 X, X( \
  588.         jmp     $+2
      F0 Q$ v3 f! g
  589.         test    al,2* \% v  C. S" _; }0 s. f0 R
  590.         jz      kbd_wrt_ok36 X$ f$ H. x) E) q! L+ N# _

  591.   U( \& t  U$ N) c4 J
  592.         loop    kbd_wrt_loop3
    9 f  c1 D* ^! ]; M
  593. 2 h  w6 y# |0 E+ `1 K( `
  594.         mov     ah,1
    " n. U5 X/ h1 S  o* T
  595.         jmp     kbd_wrt_exit8 O: ?; W0 P+ Z0 f/ Y" W1 w6 n5 c8 ~
  596. + _6 X0 b' O" @) x! W
  597. kbd_wrt_ok3:7 e9 J2 I5 b2 [+ b1 `8 g
  598.         mov     ah,8! s( n3 q6 F. b3 w/ y# R, f
  599. kbd_wrt_loop4:
    8 r0 e0 \$ W# O6 C: n
  600.         xor     cx,cx
    ( B1 Q9 o) z' A6 v% _: W$ ]
  601. kbd_wrt_loop5:" u5 J2 w: {  P7 P1 ?0 h
  602.         in      al,64h$ j" J) x/ i6 _% w% O
  603.         jmp     $+2) @" t+ H! ~$ T* @, [8 F' P
  604.         jmp     $+2+ f$ F% u+ C; y6 c
  605.         test    al,1+ u" M- B2 T. T# [! ?
  606.         jnz     kbd_wrt_ok4
      Q2 w* C- n) ~
  607. 5 x3 }* c1 `+ r# m2 N" V; ]2 [, P4 U- }
  608.         loop    kbd_wrt_loop5, G; q* e! S; |/ t; N  t5 d

  609. : }4 U+ T6 n0 T) T  ], x! @
  610.         dec     ah
    : j6 S/ ]- s6 Y/ E8 c- h
  611.         jnz     kbd_wrt_loop4
    1 U) y0 k  m6 t2 ~# }
  612. 4 u, H8 h% F6 S/ c- _: m( i
  613. kbd_wrt_ok4:
      d* b5 {8 Y3 q  H: e
  614.         xor     ah,ah
    1 {! I6 O3 }; d$ b4 ~3 z
  615. kbd_wrt_exit:
    2 ?3 O! D9 W( I0 r" e( V
  616.         pop     dx. u2 ~% @* S# g9 B, a, r
  617.         pop     cx' ]; J- I, Z$ d8 E+ S
  618.         ret
    ; F$ F# r9 E2 K8 F7 F# A7 v
  619.         , C- W! g* r: m: r+ b9 v" \
  620. keyboard_cmd:- J: ?3 ^. Y$ T) |
  621.         xor     cx,cx) M' I& A7 y; N" `' M/ \- c
  622. cmd_wait:
    % T( Q* M% I6 ?% Y
  623.         in      al,64h
    4 ]0 h% ]1 h- j% j8 Q& F3 O% R$ ]) ^0 t
  624.         jmp     $+2
    + G; a% e& g/ |; J' D5 {
  625.         jmp     $+2
    $ ^. `. r0 |! O6 A/ B
  626.         test    al,2
    1 l5 a) o; {( M+ ]' S4 n
  627.         jz      cmd_send
    8 F$ l# ?, t3 l3 M. W
  628.         loop    cmd_wait( l& S0 h5 H1 ]; {  C7 [( M
  629. & f6 v8 a& o0 V8 ^+ z2 h; `# b- j; \
  630.         jmp     cmd_error3 F. t- t4 J/ U. @# u

  631. + f" \" M# ]# o: L& z" T; {8 q8 x
  632. cmd_send:: f6 F" m$ h  e* |  X" m% X& {
  633.         mov     al,bl
    % j, ~! n6 ~. T0 Q. [. O# q( s9 C
  634.         out     64h,al% f; [8 ]! k0 R( R$ m, d6 J
  635.         jmp     $+2. k& ]( `9 V( a& Y# Z* p% c& T" u
  636.         jmp     $+22 }* H4 G5 S' K, W, |, y  g
  637. 4 w4 B/ t: y$ ]) }/ z1 V& Z, Q& K
  638.         xor     cx,cx( f* N- k. o( Z1 I$ c
  639. cmd_accept:* G4 t7 y& n1 ~. s' L1 |
  640.         in      al,64h
    ) n5 e- W: z3 k' Q' f, m( P+ |6 r
  641.         jmp     $+2
    , c5 t9 o/ p. t, D& h8 ~. e
  642.         jmp     $+2; C; G4 D) w7 b1 Y, r& j
  643.         test    al,24 j' {! A7 W" j+ Q  {2 o/ N
  644.         jz      cmd_ok7 W9 N8 G; v- C. W
  645.         loop    cmd_accept
    # I  r/ D# H( U2 e$ t2 `) ?

  646. ; A) n+ }2 a5 t# T% ?" J
  647. cmd_error:
    8 A5 d& }% \2 _/ i( @! g2 m
  648.         mov     ah,1- o+ O% i. [8 d
  649.         jmp     cmd_exit
    % q, y1 N8 y! c
  650. cmd_ok:
    8 [" @( W# h+ S
  651.         xor     ah,ah) B6 @& @2 j! e
  652. cmd_exit:
    ; a. z+ I6 O8 w" V1 n
  653.         ret( A9 h$ S- H' h; R1 j) O7 V

  654. : O2 _) \! j8 U; ^# M5 [
  655. new_33:
    8 b0 S8 `. {: O* J. u$ ?; I# ]; `: f
  656.         cli
    0 p: V% S4 s0 L9 [7 y6 ?: M8 d, s# [
  657.         cmp     al,0
    9 D5 T/ Z, T. B8 p3 g! O7 y9 ]8 ^
  658.         je      reset_mouse
    0 ~4 W/ B$ F. a/ Q4 c7 k& T
  659.         cmp     al,1
    / w! v5 L  {9 _: |
  660.         je      show_mouse
    & s+ q& Q( ~* K3 q1 y
  661.         cmp     al,2
    7 i. b7 ]8 ^, ~# T/ H
  662.         je      hide_mouse
    9 Z% G. E6 _8 I, H- B, r/ Z" E
  663.         cmp     al,3' I2 z4 z1 E0 q' r5 J8 h4 J. h
  664.         je      get_pos
    6 [6 j8 M& b0 |$ F. |5 o" `
  665.         cmp     al,4& g2 T6 }: h+ U
  666.         je      set_pos
    . i& X( A+ p- @8 J  U1 v
  667.         cmp     al,7
    $ m8 B+ ^5 v( e, L: |3 d8 l1 y
  668.         je      set_hor_pos
    ) w. R. T  x2 |1 Q1 T
  669.         cmp     al,8
    3 _# ^7 o, c" T! Q
  670.         je      set_ver_pos, _  B0 h5 W+ A
  671.         cmp     al,0bh
    1 I8 `9 p' Z2 Q6 }* P9 P, f% U1 R
  672.         je      get_mouse_movement
    4 B. [+ s9 A4 f+ B* r6 y  L% T2 Q
  673.         cmp     al,0ch1 X- B& r; @1 {& y1 ~
  674.         je      set_subroutines
    . k$ J2 y) }* i1 N4 b+ e
  675.         cmp     al,14h/ L+ i5 D, G+ }+ X
  676.         je      swap_subroutines
    5 ?: |6 Z- ?9 j7 E- e7 P  n
  677.         iret. o& q$ ^  y. w4 f
  678. ! @. @; q$ z7 ~# @4 ?
  679. reset_mouse:
    0 `1 z6 l7 E1 I
  680.         jmp     _reset_mouse
    + X3 f6 w0 x+ H6 Y# ~3 g8 L
  681. show_mouse:
    ! P7 C' B) u* Z1 n8 ]
  682.         jmp     _show_mouse3 _% `( i# {# n+ L  U/ @! H
  683. hide_mouse:
    4 h: R  e6 C5 u$ }$ \+ F* ~; h
  684.         jmp     _hide_mouse. i: T5 u3 W( H1 m3 c& c' U( r" I
  685. get_pos:
    - _; O! t, B1 }: X6 p! K
  686.         jmp     _get_pos- G* A. t9 l  H$ D9 N8 E; ?; Z: w
  687. set_pos:! p; p2 l- a" a" n0 m
  688.         jmp     _set_pos- S8 \# y" L% Y" o1 H+ [- e6 K
  689. set_hor_pos:6 \& E  a% L. m
  690.         jmp     _set_hor_pos0 H& L; S* H( Y% d, p, a8 E
  691. set_ver_pos:" L& f! z7 t- s  U( ]3 ?) \5 R
  692.         jmp     _set_ver_pos# C3 w4 d; Y  m. ?; f9 g4 m3 I
  693. get_mouse_movement:
    : t& G0 @- b: a* D  S& K0 D
  694.         jmp     _get_mouse_movement6 Y# N8 A5 }$ L! h+ Q
  695. set_subroutines:
    ! R! O8 X- M5 A; _% @; G2 W
  696.         jmp     _set_subroutines
    * Z) ^0 y/ ]( k( n1 I$ p% e
  697. swap_subroutines:, p/ C* s) E* V7 V
  698.         jmp     _swap_subroutines
    & Q) [  L' D( R! X2 s; @9 w

  699. / i' T; }; A/ W" K( E
  700. _reset_mouse:( i6 m  |: N9 h, F+ s% a9 ^  c
  701.         mov     byte ptr cs:[buttons],0* c" V0 `# A& @, z
  702.         mov     word ptr cs:[pos_x],06 U; I% ]; B2 W& ?7 R
  703.         mov     word ptr cs:[pos_y],0: D: b$ n3 M& e" w9 G
  704.         mov     word ptr cs:[x_move],0* M6 w9 R" o8 p: r
  705.         mov     word ptr cs:[y_move],0+ C* ^. Y; p3 x3 j' @
  706.         mov     word ptr cs:[x_max],639
    $ K; L  `, c2 J8 {9 K
  707.         mov     word ptr cs:[x_min],0, ^- i" I. P4 R9 G* v* t
  708.         mov     word ptr cs:[y_max],199# G0 p1 H# \) A: B- U3 T
  709.         mov     word ptr cs:[y_min],0, n7 d" u6 _- H7 K/ n
  710.         mov     word ptr cs:[user_mask],0
    % ]! ~  N0 x* l2 b
  711.         mov     word ptr cs:[user_subroutine],0' G5 y: t0 [- l
  712.         mov     word ptr cs:[user_subroutine+2],02 L4 _1 L1 P9 _3 Y* X
  713.         mov     ax,0ffffh) U/ a' y8 n& S
  714.         mov     bx,3
    ! w0 O+ K/ d+ \0 e$ ?
  715.         iret6 ]) q" s" r; \/ ], M" d

  716. 7 Y! Z. Y# n- \4 {1 b7 i
  717. _get_pos:9 @  g. n6 b$ z8 n1 r
  718.         mov     cx,cs:[pos_x]0 B$ D; K+ F* t/ O* a1 L( x
  719.         mov     dx,cs:[pos_y]
    $ _) b) }) Z2 O- D4 f2 ^% B
  720.         mov     bx,word ptr cs:[buttons]: T4 ]' [( `1 p) T3 _
  721.         xor     bh,bh7 ]& g% u* q9 f* t- |/ S7 S) A
  722.         iret
    9 {- z$ o$ ?$ j
  723. * }3 h  O  l& D; h# U) x, A2 k& J
  724. _get_mouse_movement:$ Q( u* i' I4 Y, N7 y
  725.         mov     cx,cs:[x_move]
    / X  O! v7 u( K. U# G9 k
  726.         mov     dx,cs:[y_move]
    3 o7 n7 ]0 b" F! y9 {4 J0 x) P% ^
  727.         mov     word ptr cs:[x_move],0" C( d8 g4 i( o: |3 H
  728.         mov     word ptr cs:[y_move],0
    ( C% a; E; c4 t( w
  729.         iret
    9 J* R$ p9 M7 o) {- R; n( t/ E

  730. 4 k% o1 q7 j4 n" X# M" T
  731. _show_mouse:
    # q* r' P) S  V( m1 D: Q% F; U
  732.         push    ax$ Y, c9 l; S! y# Y' H' r( n
  733.         push    bx2 @' K' p3 i% M# I
  734.         push    di7 B6 u% @  k! x# W# K/ ]+ p; n
  735.         push    es
    ' y! }* p. R% k) C/ W
  736.         mov     byte ptr cs:[sm_flag],15 K, N7 R# w. ]5 w5 H4 r- n) [' K' r
  737.         mov     ax,cs:[pos_y]
    ) o# S4 L& F  `) y8 e- e/ ~
  738.         shr     ax,3) c" U0 v+ J4 B& P' \' L2 N) j0 O
  739.         mov     bl,80
    # x5 w( K, C" W) {& c. C2 V
  740.         mul     bl. B+ m- |% O; d5 p# a# O
  741.         mov     bx,[pos_x]
    6 W: o. B3 Q# v5 B/ l' K
  742.         shr     bx,3
    ' l# }# S# u4 X% w4 G& x( ?& l
  743.         add     ax,bx+ `% {& P8 D/ n" X% I; x
  744.         shl     ax,12 ~& e8 T+ n# r0 f& j
  745.         mov     di,ax
    + l, L) v8 |2 [* ^' V8 c
  746.         mov     ax,0b800h
    5 J. S- G- S: S, w* o2 E" s. E- K( c, w
  747.         mov     es,ax
    - }# i: s2 s% `+ k# e6 ]) N5 A$ b
  748.         mov     ax,es:[di]
    6 r) l. v$ U7 U! e$ E4 m& S7 y
  749.         mov     cs:[save_char],ax+ c/ U0 h1 P8 `2 z! _5 i. a
  750.         not     ah' T+ y% c9 C* {) E9 M
  751.         and     ah,7fh+ ^. W* W( k/ ]) p
  752.         mov     es:[di],ax& u6 w1 |9 x- s" C
  753.         pop     es. P3 h5 L0 T; ~, j, u& ~% q+ N& Y
  754.         pop     di
    - X2 A# v, r; N8 N; R
  755.         pop     bx! `$ ^* D3 k6 E+ S' J
  756.         pop     ax
    : @/ t" r2 S- T' b9 \/ J, m* {; F8 x
  757.         iret: j! v& e5 j# ]2 O# `

  758. 7 q' {& C4 g9 H3 `/ Q+ I' U% w
  759. _hide_mouse:( L5 `: K0 I1 k8 S& s4 P
  760.         push    ax
    " Q. Q4 e) x& Q& ]" {6 W; r
  761.         push    bx
    5 j6 P# Z* M% n
  762.         push    di/ O9 I4 h: D# v% z3 W
  763.         push    es; c, A9 Z. a% c" z1 j* p7 t
  764.         mov     byte ptr cs:[sm_flag],0- `( c" U. R7 S
  765.         mov     ax,cs:[pos_y]- P1 E6 q# K6 {
  766.         shr     ax,3$ J$ ]; x- n1 h3 F5 N0 v
  767.         mov     bl,80. c6 s9 W& Y: @1 J" f3 {
  768.         mul     bl. R- i6 A$ p0 @+ [
  769.         mov     bx,[pos_x]
    2 z& Z. K$ E- r! l
  770.         shr     bx,31 u$ H( t6 K5 D( S  J: X7 B
  771.         add     ax,bx
    5 r; d! H4 n2 v/ @, }( b' m# ^
  772.         shl     ax,1- \% t" p  o8 }- a- i0 |2 l
  773.         mov     di,ax
    1 Z2 X* g# @6 z# ?. F
  774.         mov     ax,0b800h" ]& o/ j3 i- Q) y& Z
  775.         mov     es,ax
    - Z3 ?+ i2 ~& p6 \/ g8 ]
  776.         mov     ax,cs:[save_char]' {( N: T% l3 r( M/ G
  777.         mov     es:[di],ax
    + Y, f* x: Q& s
  778.         pop     es
    ! d( q. O8 `0 P# ^( u
  779.         pop     di# i5 Q0 i" T4 H: k7 z6 a% Z/ u9 j
  780.         pop     bx6 X6 ]- V3 R) b2 B; l3 Z
  781.         pop     ax
    & f6 {: d8 Q0 V' [
  782.         iret8 G1 ^. G, M- b9 @7 x7 `) \
  783. * h3 o4 J# a) I7 H' y! k3 [- q# d& L
  784. _set_pos:
    : c. O+ L  {1 H- H5 K& L/ q/ [
  785.         mov     cx,cs:[pos_x]
    9 D5 U) u( x& B
  786.         mov     dx,cs:[pos_y]8 s1 C9 Q5 B  ^
  787.         mov     word ptr cs:[x_move],0
    5 c4 V" ~6 `; D+ s5 |
  788.         mov     word ptr cs:[y_move],0
    " z) n/ I" o' S
  789.         iret
    ! w3 `& m. x. {) u' b

  790. * X% ~8 F& s7 X1 C+ ?. J. R
  791. _set_hor_pos:- A$ w9 B" L3 |  i) G
  792.         call    max_min2 v) O# z% _' [% w
  793.         mov     cs:[x_min],cx
    . l. r" @6 ^$ t% A
  794.         mov     cs:[x_max],dx
    8 W* m6 Y. _  C: Y: Y. K7 G- r
  795.         cmp     cs:[pos_x],cx3 X; V8 }9 v' X, @  Q- m
  796.         jge     good_hor_min
    8 h( j7 G1 m1 n8 c" F" A/ o: {
  797.         mov     cs:[pos_x],cx
    * M& |: e/ r& F$ c( s
  798. good_hor_min:
    # X. P9 D& N: ]3 u; b
  799.         cmp     cs:[pos_x],dx  i% U' O& h  K# [* z7 _
  800.         jle     good_hor_max
    2 [9 o" y1 ?- c; @3 E
  801.         mov     cs:[pos_x],dx
    + w9 B4 Y, A& x4 G4 b
  802. good_hor_max:
    & H$ O1 i& k5 j7 U% ^
  803.        iret
    7 S2 r4 T! t5 Y" Q
  804. 1 S, O+ U& D" x- e% ^& h/ U4 U  e
  805. _set_ver_pos:1 \( b- N. H' U- Q1 X
  806.         call    max_min
    9 C6 @& e9 c% v: C
  807.         mov     cs:[y_min],cx
    $ ]5 T2 y/ A) _4 w, g2 Q& _6 ]& b
  808.         mov     cs:[y_max],dx* x% a. V$ R* I+ u6 ]
  809.         cmp     cs:[pos_y],cx( N6 l: `0 z; [
  810.         jge     good_ver_min
    8 \4 g- ^/ v5 b, e+ |
  811.         mov     cs:[pos_y],cx
    ) @. p& G2 u$ D6 ^  s7 ^
  812. good_ver_min:
    ( [; l& |* s  S" P
  813.         cmp     cs:[pos_y],dx
    3 E3 h- S) I3 o/ Q
  814.         jle     good_ver_max# V2 P: ^( B3 D1 |  e
  815.         mov     cs:[pos_y],dx
    3 `6 s6 U# B0 Z- H
  816. good_ver_max:! G% ^, D# S/ p" j; Y
  817.         iret2 N( C- F7 ~4 Z0 M& ?& V1 ~. T

  818. ; R5 Z: j8 x2 o: G, S% k! `
  819. max_min:
    ! E* m5 q+ `. D% k; p
  820.         cmp     cx,dx
    1 B2 q+ i/ ?7 D  v
  821.         jle     no_swap
    4 @9 P8 ~3 [% a6 K* D* v" W* S
  822.         xchg    cx,dx
    " e# Q' K1 o  h3 V4 V
  823. no_swap:
    & M! T. {5 D. _
  824.         ret
    ' P" u6 U& u6 C/ A* ^; |9 A7 \! A

  825. 6 J$ L, T8 y5 z5 k6 G7 e, M. K
  826. _set_subroutines:
    $ z2 @! m7 D$ v4 R9 l
  827.         mov     cs:[user_subroutine],dx* `/ Z& X/ v$ V
  828.         mov     cs:[user_subroutine+2],es
    " L2 {- ]6 A) X7 r
  829.         mov     cs:[user_mask],cx0 l$ F% j% \  U8 _8 Z
  830.         iret
    3 ^. C: C& r5 E3 @; H" e% j

  831. % s! i, _; Q/ Y( `7 f
  832. _swap_subroutines:
    ( ~1 r  p! t" \
  833.         push    word ptr cs:[user_mask]
    - q+ }  c7 h4 L
  834.         push    word ptr cs:[user_subroutine+2]
    # s% i2 F2 E" I% T, a3 g: p
  835.         push    word ptr cs:[user_subroutine]
    ; B3 J5 C+ a( V5 b0 l
  836.         mov     cs:[user_subroutine],dx
    2 z0 i; b9 @9 `$ J) ^; d
  837.         mov     cs:[user_subroutine+2],es
    ( n3 h( S( o0 k
  838.         mov     cs:[user_mask],cx% o/ j; K! {. g6 C9 e
  839.         pop     dx/ C2 y7 _5 a7 m: i' |  k
  840.         pop     es2 g, d# d- U" c
  841.         pop     cx
    0 l5 G+ V2 {( _2 X7 N1 i
  842.         iret' x; b$ @: m3 z* q
  843. & d: y* i$ m) A! B
  844. memmouse        endp# j( s) C$ j6 U: P; I

  845. ) [. j/ v2 I: A) O6 m6 v
  846. endof_start:/ c2 i$ @: E5 Z+ V- t+ T  E

  847. " K" ?8 ]: Q2 Z5 N8 a
  848. emsg db 'No mouse driver install error!$'! r' f* \6 I- p. Y  Z" w, l$ R5 M
  849. old331 dw 0  r" T, e6 |7 H3 F- ?  n
  850. old332 dw 0
    ; H/ I) z$ q5 w$ \% t
  851. old741 dw 0' m( ^0 E1 ^, {8 B+ W$ p+ v
  852. old742 dw 0
    , G! B: ]) ^& X# j$ z, t$ B( e& `
  853. memcopy db 0
    . Y3 N. S2 S, H. ]
  854. okcheck db 0
    * }8 E2 U% R6 V. Y
  855. pass db 0
    7 K+ W- L/ e. b6 Q
  856. chkl db 06 _: G. F; _* F# m2 }- }
  857. lk db 0
    ) O/ m9 m! J- k( k% W
  858. chkr db 0
    $ }& L1 g" a" I" F3 P) |$ f
  859. rk db 0
    9 A3 B) @0 {0 n: [4 q: }: _! W3 D1 H3 a
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    3 B% X* |' i" O7 C0 Z8 Y3 \: v- ^
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '- b% Y3 s( c. P1 m7 Q
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '0 ]9 f5 O5 L1 _7 _9 a
  863. db '                                                                                '+ n: Z; y# p& |, N% Q% o2 W
  864. db '                                赏屯屯簧屯屯突                                  '
    # G( _2 s4 V- E
  865.         db      '                                ?OFF汉OFF?                                 '
    , B" T# \4 L" x$ \; n/ R
  866. db      '                                韧屯屯既屯屯图                                  '
    ; ~% G0 K2 o9 a) {# s# v0 o$ d3 x
  867. db '                                                                                '% S, ^/ C& L/ i' q4 {' q
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    . L9 b# T5 `# m- P4 ?) |5 G
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
      Q* P, z1 U+ x. {2 d* a- F
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    " |/ s; u9 Y, G' F% a/ a
  871. 7 f# a, V" o7 D7 H9 ~. g' }' @
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!4 Z4 E" Y( t$ F
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
6 I% l+ G0 R' ^9 p' P  V" x  }
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 19:11 , Processed in 0.064815 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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