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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。7 a+ P+ H# M5 B' [! [' U+ r- s
/ K) P: F$ V9 z8 Y9 ]; S  Z3 Z
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    4 X1 N1 f- A7 c5 [2 n3 y9 m8 U- e0 n
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    / W1 e2 a( G; }( g- b/ t! P8 l
  3. ;                                         By Bini.Yi 易祝兵
    2 q, J4 D  ]. }& o3 \
  4. ;                                         http://www.ufoit.com 计匠网1 }8 E. w% k% W4 Y* z; x: U
  5. ;                                         2002/04/06 YYYY/MM/DD+ M% m  y, N. @
  6. ;6 P8 b6 c; c, \
  7. ;         
    5 a2 J3 X$ c# L( o* ?
  8. ;          This program  test the mouse button  click and move.
    / X: ]8 _/ C9 ~( z1 Y
  9. ;9 j" \9 q* `# Q$ V7 R" {0 d
  10. 9 Q: ]2 [& j) ?/ J' o
  11. .model tiny9 b( Z4 u& t' A1 W- B
  12. .586
    7 N$ Y+ B/ k3 n. o3 K$ _
  13. .code0 D9 u2 F0 b$ A7 f
  14. .stack  100h. x# y- I+ G% m4 A/ G
  15. .startup! w6 |$ K4 x2 \0 e3 w# u0 }: F7 w
  16. pusha
    7 E5 d4 _4 X0 Y! ^8 j( v# R
  17. mov ax, 3533h
    1 _1 m# `( P: ]
  18. int 21h
    & j. Z  u( d) z0 m
  19. mov word ptr cs:[old331],es+ D- |7 L# K5 L  V) @, Z
  20. mov word ptr cs:[old332],bx5 a# ?4 d9 i0 G6 d
  21. mov ax, 3574h
    1 v; F+ |8 b2 Y" j
  22. int 21h
    / m- F- V; p% [. g. w$ p( `
  23. mov word ptr cs:[old741],es
    " S8 Q) Z' ^  ~7 D0 W! @5 ]
  24. mov word ptr cs:[old742],bx
    / d( }/ |; c2 o" ?' W
  25. popa# T2 s3 D: w- d4 F. L
  26.         call    memmouse
    : @  e9 Z" c( ?8 j! M! p0 Z
  27.         mov ah, 00
    ( A% [/ x. V9 S- I: A
  28. mov al, 03
    0 p$ z" J( J$ M: a0 U6 b, N
  29. int 10h7 z  x0 C6 Y8 N, M
  30. mov ah, 064 x5 m9 C/ ?) E% X3 V( a, u; b
  31. mov al, 0- z! m2 A: n+ Q& ?( W' w
  32. mov cx, 0
    / E; ]: B4 q" Z: n9 }" d/ _
  33. mov dh, 24" W* M) H' {; `! r; |7 D
  34. mov dl, 79) h+ N0 q/ U9 n, u& o/ O+ G
  35. mov bh, 07h
    ) q% a% G' ?2 r! T  O
  36. int 10h
    4 |3 Y* X( N; L5 l3 V6 d: D
  37. mov ax, 0000
    ! J( i9 r+ _+ q/ K4 M4 X2 Z4 m
  38. mov bx, 0002
    1 y  b- p! N: w( t/ I- Q( R
  39. int 33h
    + H  ?3 ?+ S2 `7 R5 i. ]
  40.         cmp     ax, 0000           ;if no mouse drive install
    # F0 X9 O, d: s5 k+ Z
  41.         je      errormsg           ;show error MSG  C+ k+ p7 s2 P8 {6 V, Y
  42. mov ah, 021 T& b4 \9 c3 K3 @( T) C; Z. W
  43. mov bh, 00
    - R1 a5 F& ~' A% Y  X, {
  44.         mov     dh, 25             ;Move point out screen* C. s: I! n9 D2 `
  45. mov dl, 798 P/ o$ t/ @+ u. h# @' M
  46. int 10h9 d4 L. l8 N7 V& m& K
  47.         call    showmsg            ;Show info
      ^3 j1 j! s7 w, V( R/ }
  48. mov ax, 0001; ]1 n( G) z: R8 H( c
  49. int 33h
    ( n$ m; V/ E( p' U) ^
  50. ; mov ax, 000ah
    / O0 L( k3 o. E; D
  51. ; mov bx, 0000; N6 C" \, }0 u" ~6 h  m
  52. ; mov cl, 0h" L8 S/ A, V9 x# M. g1 i
  53. ; mov ch, 0F0h+ V) l3 a9 F6 C, U# T$ b
  54. ; mov dl, 0h1 |3 E9 B4 h6 f" w. ~
  55. ; mov dh, 0F0h
    " f$ N- ]' m- V
  56. ; int 33h
    3 N4 A7 m) U6 g/ m
  57. mov ax, 0004h- T  G9 [3 {! j8 P
  58. mov cx, 0319/ x6 H: g: v; r" s% H1 G  a
  59. mov dx, 01033 S6 u4 h" w4 P* I
  60. int 33h. H) \0 y& y# e4 U5 B; q
  61. casemo:                           ;Case button click and point move
    + e% o# R% Y4 a. {5 A- u1 v
  62.         mov     ax, 000bh         ;and keyboard press
    , W, i( @4 P# y
  63. int 33h
    5 M, W5 r! T& i! N- c9 Y4 `/ o
  64.         cmp     cx, 00h           ;if point move....X) a, Y- Y( g+ K6 O
  65. jne xmov7 F: p$ O# r# ]# k5 k5 t' L
  66.         cmp     dx, 00h           ;if point move....Y& m$ V* i: \  b; R) D5 f& F" U& |
  67. jne ymov
    # N3 F% [% a' `. h3 G0 H  z
  68. xymovend:                         ;X.Y move end+ ?0 h3 L( Y, {" N; h6 g5 \
  69.         mov     ax, 0003          % T4 y  f) x5 M6 T# |6 j
  70. int 33h) |  |0 q! Z, U) d1 o
  71.         cmp     bx, 0001          ;if left button click  show ON4 x. l* R9 e/ G2 x  u
  72. mov si, 1828
    0 K; G3 \9 H% E4 j) @" T
  73. je listl- ?* g( H' A0 w
  74. mov si, 1828
    1 {& g. O0 |" o$ C4 f" Q
  75.         jne     nlistl            ;if left no click show OFF. g8 Q$ X! c  B7 f, F9 C9 i
  76. testr:* R% z7 H, `( s5 K. q; z7 }
  77.         cmp     bx, 0002          ;if right button click show ON- \4 q3 _5 o2 R. U$ D5 h
  78. mov si,1842; A# g0 ]5 Y% T% o. }
  79. je listr4 b- l. Q9 v1 O( Y! K
  80.         mov     si,1842           ;if right no click show OFF2 Q" x9 w- Q! y( h" _  q% \
  81. jne nlistl
    2 Y% y1 }' v4 ^0 V* r. l1 B$ e6 D  P
  82. casekey:
    * _' {% \( {7 ^, E* q2 F6 ]# A
  83.         mov     ah, 01            ;if any key press jump check
    " O' e$ N5 r0 x# Q
  84. int 16h
    0 M$ _5 Q( c. k
  85. jne kpress' f! g- ]6 T2 X& G- k. ?
  86.         mov     al, [chkl]        ;check x flag/ L7 g7 ]) E: d: v- X3 |& Z
  87. cmp al, 02h
    7 C( c! c! Y& N; g  p
  88. jnb chkok7 Z8 I: Z6 v- J7 a
  89. jmp casemo
    7 z$ ^* H% ]3 V, C4 L  D& r
  90. xmov:                             ;if X moved, get the X flag+18 M0 `' T/ J7 c0 v* m# ?
  91. mov al, [chkl]
    7 J! M3 \% l3 x0 Q: f
  92. inc al
    * b6 H' [3 B6 K) S
  93. mov [chkl], al$ i4 ]; [% @) [* B# m2 C, ?6 m$ v& x7 q
  94. call passok
    2 v9 \3 Q3 Q1 U+ s+ R
  95. jmp xymovend
    ; W8 s9 d8 e1 m: h3 f: k- p
  96. ymov:                             ;if Y moved, get the X flag+1% [. q" X7 @8 V- Z8 k# o( i" p4 ^
  97. mov al, [chkr]
    3 b$ y- G' [: }) O' {0 S. [8 y
  98. inc al& ~7 Z1 W: ^, j( V! S6 x  N
  99. mov [chkr], al
    * L! C2 R1 U9 n6 Q. i! T* \
  100. call passok5 ~  n2 A+ c. p/ _
  101. jmp xymovend/ U+ f2 X7 `7 \" D" G4 m
  102. " F3 z: Q8 k* h! R2 B
  103. passok proc near
    ' N* Y+ R. K! e) ?/ x* @
  104. mov al, [okcheck]
    # d+ J& ~. F( e/ B, g* j" T
  105. cmp al, 1& F$ G% g# o* \! W, k
  106. je let0
    2 i0 R! r6 P; A2 K' X
  107. jmp passret5 i% ?  }$ W% p- p* Q
  108. let0:
    1 y/ O$ z  d& ?8 f$ r# D
  109. mov [pass], 1
    3 ]4 S) H' {2 v; X; S
  110. passret:
    7 g$ ~3 h6 Q5 @: b! \! X
  111. ret
    6 C. M4 d: P( Y! ?
  112. passok endp ; C0 C+ @. ]% k, P, C+ f3 R  u9 k
  113. 7 ^3 [* r% S) q7 x/ X( ~
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    $ s0 f+ R" z1 B7 U- ^
  115. mov al, [chkr]
    ' M5 J  Y$ {* ^$ p5 {. E7 Z6 |" D
  116. cmp al, 02h
    ( v5 i$ F: ?9 X
  117. jb casemo
    6 u7 R8 f- i2 ?7 S# t+ ~
  118. mov al, [lk]
    # n1 f  C, {1 a* o% y
  119. cmp al, 1
    $ D3 e, t% r) T2 y9 y6 W- k% G
  120. jne casemo# F6 T# D( C6 o3 l: ]
  121. mov al, [rk]# F% Q0 i! O2 o+ t% g) ]8 M
  122. cmp al, 1" v# U+ _$ R) }% n0 e) v
  123. jne  casemo
    + r# M9 }6 s" h& V' D) O
  124. mov [okcheck], 15 h4 a! b, P) K3 q7 L3 u
  125. mov al, [pass]0 W) ~9 ?6 G4 P- F' Q
  126. cmp al, 1+ {5 q6 Y$ V+ b: t' q/ y/ d5 x9 q
  127. jne  casemo$ i5 J% y9 {; d4 @+ y# V5 G
  128. mov ax,0002h
    ! l/ `* K. C1 o1 u
  129. int 33h# x5 u& J4 ~. A( N( n8 m
  130. call cleascr
    : |- a+ h# x4 z6 a( Y

  131. & i* U1 w( P+ l2 d
  132. call oldint- T+ {9 F( T6 c% G
  133. mov ax, 04c00h: n% F4 V4 p" t$ x- j+ c
  134. int 21h
    ( K/ ]% l( F# v8 A6 O/ K

  135. 3 x/ r( R" y5 m: r2 P4 _
  136. okexit:
    8 m# b+ Q- G3 Q. v' r7 f! e! Q
  137. mov ah, 4ch2 \# ~9 j) u# S- S. G% K" w* O# L
  138. mov al, 0
    " R7 P0 s/ U: t- Q) K
  139. int 21h/ F" P6 ~9 }0 j5 r; E
  140. listl:                                 ;Show ON
    7 n+ d+ d- G+ G4 W0 y# \
  141. pusha8 G. U" p( ]- S1 j& j  ]$ t
  142. mov ax, 0b800h
    + I" ^5 k( |3 w+ c2 |- B% G0 N
  143. mov  es, ax' a" B; d# Q' l2 o7 Y4 a; m- g$ A
  144. mov ah, 47h9 c8 u' ^# w  g4 N2 @, w# D( j
  145. mov al, 20h
    & ^) V) K" Q$ d
  146. mov es:[si], ax8 f' `7 @8 X: @$ a% K; C& Q
  147. add si, 02
    4 ?% y" ^0 E2 `# e) U
  148. mov  al, 4fh7 w: F8 l+ S! \( v5 d
  149. mov es:[si], ax
    " a3 Y% j9 ]* y" k; o% G
  150. mov al, 4eh6 w6 R  a: E$ b
  151. add si, 02. p/ f% p( s# t8 K/ h8 [! y
  152. mov es:[si], ax
    ( S# w8 ]- H) S
  153. mov [lk], 1
    ( l; T, j4 s, z+ b9 q! V
  154. popa
    ; Z, z8 d) Z( p
  155. jmp testr
    9 t; q% W6 q3 z! p% K
  156. listr:                                 ;Show ON4 E$ Y1 X$ d- \% ^# B$ e( ^
  157. pusha
    & H( V; p& P3 u6 \
  158. mov ax, 0b800h9 b8 P6 b6 S7 m6 [' G( O0 k: q
  159. mov  es, ax
    $ F5 m# Q9 w! j! g8 B  P0 {" ~  B
  160. mov ah, 47h
    ) L) O0 o# K% r5 N0 c( `
  161. mov al, 20h
    0 W, a$ c  Q& w# I
  162. mov es:[si], ax6 G/ f- Z" @) P5 W" j7 }
  163. add si, 02
    3 E( f2 r' `) g' r% r6 n3 G( V
  164. mov  al, 4fh
    ( T8 P: z+ C" x# l/ P
  165. mov es:[si], ax5 L9 \8 r2 q# q1 M
  166. mov al, 4eh/ g/ n1 r+ Q7 K3 F3 w. J7 @' l
  167. add si, 02
    , h, `: N2 @# L" Q
  168. mov es:[si], ax- I, v; U0 h# ]. h9 E: ]* b
  169. mov [rk], 1
      z8 R( j1 V6 S# h* }1 o
  170. popa: B, U2 K. B6 M* f7 V5 t+ |
  171. jmp  casekey
    8 e9 b7 w& |5 \) `1 _  r# }2 A

  172. 0 W% E. z* I+ a# Y+ G7 D
  173. nlistl:                              ;Show OFF: A0 f1 A2 ^" R9 \. b; l
  174. pusha   3 x. F' s  x3 _  M* N( }
  175. mov ax, 0b800h
    1 `9 E: x" s& _7 Y0 Y, f0 w
  176. mov  es, ax1 p( ]& l. V( ?# j
  177. mov ah, 17h% z7 j3 E+ J1 [, ^/ |; i, y
  178. mov al, 4fh
    4 a' j4 ]& v9 ~& e6 c' u
  179. mov es:[si], ax. N& R0 N1 n9 z- U1 N, t1 B$ g
  180. add si, 02
    " g# L+ a0 C, r& g0 \
  181. mov  al, 46h4 {/ ]: U+ O# o& |$ G2 q0 W3 o
  182. mov es:[si], ax$ e% \$ i; y6 [" `* d" Q* w  A8 \
  183. mov al, 46h
    ( M4 @! D: q* X% M8 `( i& c
  184. add si, 02
    8 r3 T* J  [+ q, ^6 [
  185. mov es:[si], ax
    8 ]2 N$ b3 A- J$ b  j
  186. popa3 N, d7 Q% }! V% u
  187. cmp si, 1840' B2 I  B: f( M. q
  188. jae casekey
    4 a/ v& c' x$ O3 s6 H2 X# S
  189. jmp testr
    - j# o; b! l) y$ B
  190. ; q# C3 Y  i/ X+ T+ `6 z; I
  191. kpress:                             ;Check key press if press<ESC> then EXIT* l% A+ ?$ L3 {. M
  192.         cmp     ah, 01h             ;and return a error
      v2 D5 K  L  W$ L7 u
  193. je exit1& F5 |( _/ v6 D- J! N2 c; A  V
  194.         mov     ah, 0ch             ;if press other key then clear; V5 p) b$ {. I2 ~* P
  195.         mov     al, 00              ;keyboard buffer! @6 X) `: W$ m. L
  196. int 21h( J+ O% S3 d  ?6 d7 ]( b' {% k
  197. jmp casemo
    3 m" F$ a  ?+ @7 w0 G

  198. 4 K  o  Q/ L  t! A0 I
  199. errormsg:                           ;if mouse driver no install, r; Q3 ~' }" a' Q5 z+ M
  200. call oldint8 |" Z) H+ O. N) @8 p1 H! a
  201. lea dx, offset emsg
    0 r3 J% i  j8 K9 G3 l' d
  202. mov ah, 09h) ^5 }- n  a7 v* ?$ H
  203. int 21h
    - B7 ]& m# {- d; W. D
  204. mov ah, 4ch
    , W, P. a# W. ~5 r
  205. mov al, 2: G7 G# H7 j, T. L5 {% ?
  206. int  21h
    $ S! t1 W1 @, d) m# G
  207. 7 W$ G; R# l4 q3 t- O! V
  208. exit1:                              ;error exit
    + B1 `$ U) ]4 _, `
  209. mov ax, 0002h
    0 s& k5 ^8 V6 [8 a8 _: U
  210. int 33h
    4 N& V8 ^- w, t
  211. call  cleascr. f, q& }3 q9 c/ Y
  212. call  oldint
    5 \/ |! d: R& f( N  g- d$ Y; O
  213. mov ah, 4ch
    / F6 ^; o! R+ \; S- Y+ r1 j' n
  214. mov al, 01
    0 O! B2 j9 ?9 i6 e
  215. int 21h
    4 L6 U# A: Q6 J2 {
  216. 5 M2 H) d2 v2 `" ?1 ?3 f
  217. cleascr proc    near                ;clear screen  M( f) U' q4 ~8 k! H6 M$ e9 @
  218. pusha
    : G' S' P2 A( @+ \0 x+ r9 M
  219. mov ah, 06
    ) q; z1 i, a- F1 A' k( B/ P
  220. mov al, 0
    - v6 l# K( j' i  H% K
  221. mov cx, 0- b7 G$ S, L& Y  Z/ Y: c
  222. mov dh, 24- F$ C- a+ ~! m4 h" {
  223. mov dl, 79. z, X2 P6 G& i( _* A  s6 s7 z
  224. mov bh, 07h
    : C8 A4 @8 s! u) Z
  225. int 10h& F$ B: n8 q2 W2 ]2 q1 F7 s
  226. mov ah, 02
    - r6 z- r6 v, [7 A% }% u2 o
  227. mov bh, 005 D& t! N5 g4 o6 S
  228. mov dh, 0
    7 J. @0 S5 ~; U( ~
  229. mov dl, 03 d* J( \% F& k) j+ O
  230. int 10h. X! y+ d& [+ {0 P+ E& s- G
  231. popa+ b  ]2 T) r4 q% C
  232. ret& }+ z: K7 ^4 L4 n% i" h
  233. cleascr endp
    + L& E& N: `, n7 V

  234. ( P3 D: j0 U; \' L. s+ {
  235. showmsg proc    near               ;Show info# V4 U) x4 S) v1 H+ X# r
  236. pusha& s6 @4 a: {5 J, y% |$ X) v: R
  237. lea di, offset showms/ i" v- c3 e% d$ K5 {
  238. mov ax, 0b800h' g( ~5 W3 `! j! I, O1 ~) S3 H
  239. mov es, ax) b' z, ~8 j* z' Q. M" Y; g
  240. mov si, 0/ ~) N; t& e4 l( Z$ Z; u) W
  241. mov cx, 4807 Q; y- P# J# V0 S0 q8 o
  242. mov ah, 07h
    & E$ b$ J  R0 g5 [
  243. @@:
    6 }" I  C* d. g4 r% ]8 ^1 d
  244. mov al, 20h7 g8 X! P2 L6 y. }
  245. mov es:[si], ax+ u9 j" k( x' w2 i& E$ X' U
  246. add si, 2
    8 f+ `1 n- d# a" P. K8 Q5 _) p3 ]
  247. loop @b
    , i% F1 ~" c$ z5 @0 V
  248. mov cx,880: K, o& {0 c4 a# a& e" z# \
  249. @@:+ w" e7 Z- W3 }- H8 E4 s/ _3 S) {
  250. mov al, [di]) L; w) J8 |' t
  251. inc di
    : ?# Q9 V4 R" R6 y4 Y% B" z
  252. cmp al,20h
    7 l, ?4 z' r  Y; H' r5 h' G. v' Q, Z
  253. je showch1
    ; s$ U$ l) {' X) Z, `
  254. mov ah, 17h
    2 w1 u* T" D1 \' _
  255. jmp showch3
    - ^+ D$ i4 Y3 G' M; r
  256. showch1:
    4 s* m3 R5 e% P: w  s& f
  257. mov ah, 07h * y' @7 a! W$ Z" k4 d, I& ]  Q7 G8 s
  258. showch3:
    * h, ?# m" m7 |
  259. mov es:[si], ax
    # u* e0 z, f/ S! S6 o) _
  260. add si, 2& C3 f, Y/ z8 a! v4 q/ p
  261. loop @b6 \" I+ h+ W( z; g4 n. g+ A
  262. popa
    6 _/ q: g( L. o( e, v
  263. ret
    ' d! i6 [2 L+ d8 H; |
  264. showmsg endp6 Q" U7 B' i. L+ W. ?( J' z4 T
  265. # \' G+ A7 _+ s# G
  266. oldint proc
    / P% [) P4 _& T- h
  267. pusha: b- z, c" W9 \% i9 q# R
  268. mov ds, word ptr cs:[old331]
    ! K, E: S4 K  Z
  269. mov   dx, word ptr cs:[old332]
    8 A$ c$ y& {" f* W) C
  270. mov ax, 2533h
    . _# J/ n( [+ N  y2 T6 e! f
  271. int 21h
    6 b; a0 x( c( k/ j9 u: W
  272. mov ds, word ptr cs:[old741]
    * \( \8 n! f) J) D! `
  273. mov dx, word ptr cs:[old742]
    4 |- n$ c9 q7 Y
  274. mov ax, 2574h6 |9 t3 ?& f- @
  275. int 21h
    # l3 M9 o1 R& w: c5 J  I3 I
  276. popa
    9 d. W4 f) P7 [4 M
  277. ret
    ( l( N7 N2 t% }/ M7 H' E% m+ W$ ?# B
  278. oldint endp
    0 W3 @7 I7 G( k' c* o0 ~

  279. 7 F# [2 n, M. m% J
  280. memmouse        proc
    " ?$ ^/ f# t. \) I8 D3 c4 V: [
  281.         xor     ax,ax
    ! p6 A- N7 P* C
  282. int 33h
    1 U1 P3 p6 ^. \: G# ~
  283. cmp ax,0ffffh
    & W% {& o6 @! u7 n0 q9 f) t" a
  284.         jne     not_loaded
    . J4 B7 ^. [+ j2 z
  285. mov [memcopy], 1
    - ?: ~) B! e% x% s+ L' |! D' U# B
  286. ret
    ; d) a3 m- c% {0 ~

  287. 0 R5 V: l7 p8 _, l8 G; U" d
  288. not_loaded:5 g6 U8 a3 c( t; n& c1 S
  289. 0 a" v' R( x* L7 m7 @+ |- e, r$ I
  290.         mov ax,2574h( `* d' E8 e4 {1 q) |  W
  291.         mov dx,offset new_isr
    6 Z# V. j7 d$ ]  l8 V1 k7 o2 _
  292.         int 21h8 p; g4 F3 U! M& \: @: F
  293. 2 ?$ s. F! h2 Q
  294.         mov ax,2533h3 R7 Y4 @" C. F
  295.         mov dx,offset new_33
    " Q$ m' a! S  R% J# f- v9 J
  296.         int 21h* w0 L# K- W. R

  297. 6 x& T2 t: r3 O- t
  298.         cli
      p% \. L1 G1 k( V. K8 W

  299. 1 B! m" m+ N1 j% M6 r/ N" Y
  300.         mov bl,0a8h3 G7 I5 W! J' B8 I" C) ?# G
  301.         call keyboard_cmd$ U8 ?1 r+ A6 ~( e7 Q

  302. 6 x; q6 A# b; O+ T3 z3 u( f1 y
  303.         mov bl,20h
    : l/ F! L! y( N6 {0 P
  304.         call    keyboard_cmd
    3 r( s# p0 o" k5 l$ ^+ ^% i% s
  305.         call    keyboard_read7 L$ s3 I. l1 K* k7 f, L. L* L# L3 o
  306.         or      al,2
    " q: P( `! }! [( Q, r5 y. _( q  Q
  307.         mov     bl,60h
    * f. ]* m! v! x5 }
  308.         push    ax% b1 b0 D2 p2 |  ^# X& f  q8 T
  309.         call    keyboard_cmd, t1 }! W) o( O4 F7 X
  310.         pop     ax# U. J& `# X  y
  311.         call    keyboard_write
    0 M1 e  |0 ?( `8 Q+ L' r
  312. 8 R! m  O$ o+ D# v0 L1 M$ m
  313.         mov     bl,0d4h
    7 `/ L3 L6 b( _
  314.         call    keyboard_cmd
    * S) N# B: m: ~7 E* l# f: z' Y
  315.         mov     al,0f4h0 h5 Y, N7 H+ N9 [1 K1 j- S
  316.         call    keyboard_write
    5 @% w' `& i. ]1 ?# C7 C$ }* ]
  317. 6 R, t5 U  a; c  n8 O2 X9 ^; w
  318.         sti& ]; U" M; g# }
  319.         ret% J4 W7 ]/ b" c  M( }; i& z; ^
  320. call_user_isr:9 k( Z2 h- z; `4 T% u- j$ f% c- H
  321. db      60h
    ! C/ G0 B  A9 B) A* j
  322.         mov     cx,cs:[pos_x]. Q, ^& ]" n' y  ]4 s7 {
  323.         mov     dx,cs:[pos_y]
      q! m+ r1 t; K
  324.         mov     di,0 ;cs:[x_move]
      Y. d4 {, r& `' I+ J- s3 v+ `/ b
  325.         mov     si,0 ;cs:[y_move]- [  A5 ~& n8 W% |; \" O" J
  326.         mov     word ptr cs:[x_move],0
    . S0 `) Z( _9 T8 C+ X2 A( }
  327.         mov     word ptr cs:[y_move],0
    0 s5 D# L+ R: u" B9 M5 B: x
  328.         mov     bl,byte ptr cs:[buttons]
    5 C$ M1 s0 L5 N' u# y
  329.         xor     bh,bh
    , c! Q$ B5 @: o( ?. X
  330.         call    dword ptr cs:[user_subroutine]0 h6 k& a$ W( T, J
  331.         db      61h4 L* @* j$ S) n# a" K: G- I' \! y
  332. ret; H  L2 }0 N4 J9 M" g
  333. new_isr:! G: _" e* E/ F; A5 N
  334.         pushf
    " S" `! g! ^  K1 `) U
  335.         cli( ?; p- m8 M2 P7 q* t, t( ?
  336.         push    ax
    + y: e- J" [; d$ G$ e
  337.         push    bx
    9 M; ^9 ^6 u4 T+ P, N
  338.         push    cx/ Q3 L5 m/ N5 G
  339.         push    dx
    6 U6 c) A7 [" @0 o* I8 I
  340.         push    di5 \9 |6 y: }* m0 L$ `' W4 t% l1 }. a
  341.         push    si& c' d. o/ z0 b" X* {
  342.         push    es
    9 j( g7 X4 r' d; |7 H! v# x
  343.         push    ds3 A  ?. W0 S. K# {4 J0 c
  344. $ t+ ]8 P  J* t
  345.         push    cs" b1 O: v0 B3 Y
  346.         pop     ds
    - H# [7 g7 v% A3 W: d( L

  347. 4 C, i, c1 J5 K9 \' @! c/ e( {
  348.         mov     bl,0adh
    & K' i6 F7 I3 ~' f; I; m2 M& g5 a7 p
  349.         call    keyboard_cmd
    & Z5 \/ ~5 M# l0 r- p3 d# \' v

  350. * Z, Q! \- Z# l% l2 [8 S2 u& S
  351.         cmp     byte ptr [first_time],06 f8 n' E- E" v+ w
  352.         je      not_first_time0 S  Q- v# o. V
  353. . ^1 `. k# x/ ?8 _" C% i5 [% o9 C1 A
  354.         mov     byte ptr [first_time],0
    ; k+ ?3 J4 T* }% ~+ K5 I7 b
  355.         call    keyboard_read. p* C, k8 V0 w% l* C
  356.         call    keyboard_read# @$ W+ t2 R# [
  357.         call    keyboard_read
    : ~) z0 C/ T) @9 F7 c/ }
  358.         jmp     no_show
    ; u6 W  R* Y) r4 t& j" s
  359. " h, R0 j$ n  y2 `  Q
  360. not_first_time:( z2 G/ Y$ k: K" |, x7 G& q
  361.         mov     word ptr [temp_mask],0: H& q7 M/ J( F6 x1 i3 Q
  362. / [/ A! X0 Y: t( V# Y
  363.         mov     cx,[pos_x]
    " R  u8 W9 g2 i4 |2 [+ B
  364.         mov     dx,[pos_y]: f7 j8 h% F; m0 c( i$ M

  365. 3 V4 q. \7 i) i% q7 E
  366.         call    keyboard_read! |% \! X! Y: l' g8 j8 C: B
  367.         and     al,7 ;3" W: ]& u2 ^4 H- T1 T
  368.         mov     ah,[buttons]
    / A' z. _) A$ ]+ O. A
  369.         mov     [buttons],al
    ( A2 B0 p- A4 s
  370.         cmp     al,ah
    / S6 p* f% |7 a" K8 S
  371.         je      no_button_change5 m% r* `! [$ M  {9 }
  372.         and     al,3
    # y( P" z+ P' h0 E" \$ k
  373.         and     ah,3
    # o0 L, V& z9 {! A) P
  374.         xor     al,ah
    . P+ H, u8 r9 K# s4 H1 F
  375.         xor     bx,bx( z$ K! F4 _+ l7 ~) }
  376. 0 ~' E% _. r5 t$ y
  377.         push    ax2 g3 c; d) a6 u/ G. w
  378.         test    al,2, s$ p4 A: a! G6 w7 o. U, K0 }& u1 B: f
  379.         jz      no_right_button_change  E# \! h' q& @. d& c5 r8 J
  380.         and     ah,27 X7 q- C2 E, B1 f
  381.         jz      right_button_pressed6 }" o, I: f; d+ g
  382.         or      bx,16; _% [/ P3 \" I, a' j2 y) P* g' d4 X
  383.         jmp     no_right_button_change% W' B7 B3 Z: x: C) V+ l2 T
  384. right_button_pressed:6 {  y2 v& i: J( G4 R9 Q
  385.         or      bx,81 Z, c2 x$ n, v
  386. no_right_button_change:
    ; R0 |* S. ]# v' m
  387. , u" N. X3 ]# h9 \2 g( G2 c
  388.         pop     ax
    9 ?1 k. w: c  \! \/ k
  389. 8 G, n0 _4 q  i6 T
  390.         test    al,13 R+ c5 i) p# X/ y: I5 N: z
  391.         jz      no_left_button_change
    $ ]& c: O' p. ^& g$ t* V
  392.         and     ah,1
      b6 g/ r6 c- A
  393.         jz      left_button_pressed: o6 j/ l7 J6 {$ i  j' j# Z
  394.         or      bx,4
      }* R8 Y7 ^8 E6 Q. ?- D; p
  395.         jmp     no_left_button_change/ y, F7 T3 V1 W) _$ K" ^
  396. left_button_pressed:$ H  t! S4 F3 J
  397.         or      bx,2+ p3 t9 C7 R$ C) l8 p4 H) e
  398. no_left_button_change:
    * x1 M0 |9 L/ C6 ~5 Z- x
  399. . v  n% {2 s# W3 f: H, p4 \4 E
  400.         mov     [temp_mask],bx2 a1 N) K8 V9 Y" g/ G8 y. m4 l

  401. 9 o/ b6 z: J" a, y# t5 q
  402. no_button_change:
    ; P, U  V: q+ h7 u
  403.         call    keyboard_read5 Q: ?6 x2 r6 e! V" J
  404.         cbw
    5 P8 J' q1 e% S/ ^8 ?
  405.         add     [pos_x],ax
    8 D4 n8 l; f( Z  l" D! d& s  V) h
  406.         add     [x_move],ax* N; T% A& Z  _: b/ V0 S& E$ I% Y
  407.         mov     ax,[x_min]* X6 A" S8 s/ a0 a4 `+ ]
  408.         cmp     [pos_x],ax+ c9 b; L8 U" u& d; Z0 |& e+ W
  409.         jg      good_hor11 ]1 V6 T: t$ h$ z/ j  ~
  410.         mov     [pos_x],ax
    : W1 ^9 J0 ~: J
  411. good_hor1:7 m1 R+ k" q5 ]
  412.         mov     ax,[x_max]
    4 N: n8 e3 _) J$ M- z
  413.         cmp     [pos_x],ax
      u3 x' Y: p, s" O
  414.         jle     good_hor2
    1 h6 I; w$ L4 A
  415.         mov     [pos_x],ax- c2 q  o( ?8 c5 [& _; |( a5 X
  416. good_hor2:! w5 m4 b/ _( L8 k

  417.   f1 U$ S1 x- _7 O% b
  418.         call    keyboard_read6 J) I% n3 r, G: a9 c4 n
  419.         neg     al
    + v: v% t7 O0 b
  420.         cbw
    6 ^* k* d. v/ R" Y
  421.         add     [pos_y],ax
    6 C, ?. u) M6 ^( s0 d
  422.         add     [y_move],ax( S/ r8 ?% S: ?( T
  423.         mov     ax,[y_min]; m+ n  R5 G0 H) |6 m& o
  424.         cmp     [pos_y],ax3 t9 }5 @- T1 b! ], N
  425.         jg      good_ver18 s- _+ e% h) o
  426.         mov     [pos_y],ax
    ( o1 C; R8 @- I4 `4 X
  427. good_ver1:: K7 ^$ S& Z9 b
  428.         mov     ax,[y_max]8 \5 H* P0 C( T5 H$ x$ [* _
  429.         cmp     [pos_y],ax/ W# q. q: c1 y1 P3 z( N6 M
  430.         jle     good_ver2
    & k) h. @0 h# j. ~9 A
  431.         mov     [pos_y],ax
    . C+ C: K! S$ ^- I- H
  432. good_ver2:
    ) ?0 Y" Z" k/ e0 J( M8 F) o
  433. . R" S" j0 O6 t* w- Z# f3 k; J" n; ]6 Q
  434.         mov     ax,[x_move]$ Y( H2 @: p+ @: j& I! Z
  435.         or      ax,[y_move]
    . w; g7 X8 w" D5 p1 k
  436.         or      ax,ax8 Q! z7 e) h. j2 U2 i/ t# _
  437.         jz      no_change_position) `0 Y' {" S2 M% A1 e
  438.         or      word ptr [temp_mask],1
    ! }& \7 ?' i$ z" p* F
  439. no_change_position:; p0 l3 ]0 c" ]2 C
  440. 2 m- `+ m; y& J; d, l3 }
  441.         mov     ax,[temp_mask]
    / B  K& I4 A3 m7 c; \0 o
  442.         and     ax,[user_mask]
    ' I  s3 _  C2 U" A- S; f  p
  443.         jz      no_call_user
    9 F! e( x% ~' J! S( e  E* T
  444.         call    call_user_isr
    8 X, {; s* A' G6 w5 S4 B
  445. no_call_user:
    - a! W- K2 S; t7 a8 B2 B+ C' A

  446. 2 E2 d0 E: `4 D& B. y
  447.         cmp     byte ptr [sm_flag],1; a: L' c. D  B3 W( n
  448.         jne     no_show9 E% r! K% [& ^

  449. 2 T; T6 ~: T; K' J/ Z+ c4 O! p0 z
  450.         shr     cx,3/ {0 b% m' m5 y3 g: u7 D& L
  451.         shr     dx,3( s. F, _4 c0 U3 r. s0 _8 w
  452.         mov     ax,80
    ) @, m' ]) K5 C' J4 y5 a. o
  453.         mul     dl
    $ K4 P% e* Z- |4 y2 i% _! O5 u, ^$ B/ f
  454.         add     ax,cx
    . w  b: q; p3 o# k" U
  455.         shl     ax,1* W/ Y1 h: B& k' W! d
  456.         mov     di,ax
    ' U- \! v) \: m. s$ t5 |" ^9 O
  457.         mov     ax,0b800h
    6 K: I5 K9 N4 s3 k- C( `" S5 F
  458.         mov     es,ax7 x# g& }1 I: H" y
  459.         mov     ax,[save_char]
    4 i! W! z/ c- k8 o: J
  460.         stosw2 p( D5 \1 L5 M$ Y

  461. & j  Z+ b% H5 A6 X/ i
  462.         mov     cx,[pos_x]& Y, Z% ^1 D# e3 R3 `( I# ]
  463.         mov     dx,[pos_y]
    ; `# g; D* M+ |/ g7 R
  464.         shr     cx,3
    . N7 S$ T* r' m  T7 A* G& Y  D
  465.         shr     dx,3! k+ s. V7 O# ~+ w# S. K
  466.         mov     ax,80* j, s- h8 R5 x1 c2 Q
  467.         mul     dl- S2 W) f- f3 b; n4 U
  468.         add     ax,cx
    5 C5 |* f- {$ l/ G4 d
  469.         shl     ax,1  U+ A8 r1 \6 D' V2 X
  470.         mov     di,ax
    # U$ l1 E+ I6 L" w
  471.         mov     ax,0b800h
    : t5 K7 T$ [- v5 q; m$ Z) x
  472.         mov     es,ax
    0 K) r6 R. \! U! b$ `
  473.         mov     ax,es:[di]  x: e& N7 J8 {+ h; T" ?/ }( W
  474.         mov     [save_char],ax1 T9 h( O8 Y% P. Z
  475.         not     ah
    + U6 M1 R7 ^/ h& r! Q8 M
  476.         and     ah,7fh% U5 B) v, M% h- e5 o: w" |+ `
  477.         stosw
    , q, c9 x8 @1 G  A& p
  478. no_show:
    3 l) X- [/ v# j7 f, V/ R5 E
  479.         mov     bl,0aeh- ]& @$ C  l# A+ `; n1 M, @
  480.         call    keyboard_cmd
    3 N; S2 \- y; G' V+ n0 K' P/ ?- G6 X

  481. 5 {& ]$ Z) y* P1 r
  482.         mov     al,20h2 V) S" \2 V7 Q: K/ K( U
  483.         out     0a0h,al
    $ i; `0 K$ A3 v, u
  484.         out     20h,al
    6 @' e. C: a# M3 s

  485. % o% ~# N6 _# h+ d5 J! b, r5 w5 _
  486.         pop     ds
    5 d0 T2 @5 M7 H$ I) O6 m2 d4 ?7 r6 O
  487.         pop     es1 o+ ?. I% G7 M& h
  488.         pop     si; f. w3 H& z$ L( m
  489.         pop     di
    % z: V+ j& p9 A, m
  490.         pop     dx. m- Z3 m4 ]/ ^4 F2 G
  491.         pop     cx
    6 p; O: N+ p! n! D8 `
  492.         pop     bx; O( U, T& C5 @6 ^6 S5 \
  493.         pop     ax
    ! ?; f6 {: a& Y7 T5 ?5 @2 F5 \
  494.         popf
    " U% I6 }( }! N5 V: D" i' L
  495.         iret8 I1 j; Q" }7 \  e
  496. 9 k* y% M# ]5 |+ R; P2 Q) v  n; E3 ?' y
  497. first_time      db      1/ ~1 X' ~+ o( u6 K- i+ g: L
  498. buttons         db      0
    $ R/ U+ A+ [* a' c' |2 a
  499. pos_x           dw      0( p) R8 ?2 P6 v
  500. pos_y           dw      0
    ( b6 C# u/ A% T/ l' ]1 A$ s* W
  501. sm_flag         dw      02 B' I. |4 @: e9 U2 r
  502. save_char       dw      08 L  ?5 |7 K1 c  j" t
  503. x_move          dw      0
    : u5 o8 E: }! d! i
  504. y_move          dw      0/ M' L  [- Q" a
  505. x_max           dw      639
    5 k) E/ z' c7 D1 a# |
  506. x_min           dw      0
    " H7 A. Y: E$ a1 n) d! F
  507. y_max           dw      199
    $ I6 a0 H8 n; ]- Q" u4 K. y! k
  508. y_min           dw      0
    1 i) L! D/ ~/ ]& f% j
  509. user_subroutine dw      0,0
    $ R3 X  @0 W1 k- h6 [# g# k1 E
  510. user_mask       dw      0/ N1 |- Q/ p* q9 m+ w
  511. temp_mask       dw      0
    8 M$ R5 J7 i# q
  512. / F6 Q+ C0 F- U' N3 }0 |1 w
  513. keyboard_read:' ^! X% [  r! |. P6 J3 x9 l
  514.         push    cx* o+ j* \8 Y* O+ j+ s! l
  515.         push    dx( ^9 F! w; }4 N5 c3 t: y
  516.         xor     cx,cx) k+ d3 c# c+ G9 {7 A' R
  517. key_read_loop:
    ' g( f$ ^' c# b* L5 s: Q- g
  518.         in      al,64h3 @- O% D& T; S* {0 J# n' k% B2 c
  519.         jmp     $+2
    " [% o, K1 T* j% ?: ^& g
  520.         jmp     $+2- K4 `+ B) e  |4 A  t
  521.         test    al,1
    % q( r5 w9 S+ h  x! s% L( x
  522.         jnz     key_read_ready
    6 @! v" P1 f5 `! z/ q; {$ b0 B) \9 O
  523.         loop    key_read_loop/ Z* ^- e# j. |! Q( ]3 P# D' k$ e
  524.         mov     ah,1
    ( _4 X4 O+ t& ^1 [) x6 K4 v' n
  525.         jmp     key_read_exit3 x; @* P9 _! I/ V( J8 X
  526. key_read_ready:
    4 \( j- t; n7 i" H* R. V
  527.         push    cx1 Y' H% S' Y4 n7 _: [( o
  528.         mov     cx,32
    - V( y+ \: U# t- Y
  529. key_read_delay:
    0 P2 ~0 m" P; x# _0 r
  530.         jmp     $+2
    4 F/ ^- k6 U5 |. x1 q
  531.         jmp     $+2
    5 O. G& ~5 s; D
  532.         loop    key_read_delay8 }- @5 ]' s$ N4 w1 X* @  \
  533. 9 T4 y( A, m; h6 E! g9 F! [: ~
  534.         pop     cx& p6 l6 z/ D% Y& Y( }
  535. % K. G& L2 @) i6 _( @; A* N0 c
  536.         in      al,60h
    , Y% U5 E( q6 i
  537.         jmp     $+2
    8 P$ N0 ?$ f) `0 @( K2 j2 \
  538.         jmp     $+2
    2 X. u/ v( I7 T* B2 w! S2 j
  539.         xor     ah,ah5 o6 V- ]! ^/ T8 z6 i
  540. key_read_exit:
    8 q  ]/ J) i8 s
  541.         pop     dx
    " O1 S$ ~% C# o0 C# z! V1 l! I
  542.         pop     cx
    4 |( M9 X9 B0 a# m: x! i" ]; o
  543.         ret
    ! K" A4 }  ^2 ]1 Z+ D+ X4 \

  544. 6 @7 r2 `) q" R8 V; _
  545. keyboard_write:
    , Q7 w  e4 d- \* b
  546.         push    cx3 e! [" d. g5 i- b
  547.         push    dx' X- R1 f' V- z9 r- h1 \
  548.         mov     dl,al1 s% Y& T7 W$ G
  549.         xor     cx,cx
    2 P7 Q4 ~# u* \+ Z) T% S
  550. kbd_wrt_loop1:$ a+ s: c! U) k% M
  551.         in      al,64h8 `0 M/ T3 Q" q9 z' {
  552.         jmp     $+28 y' O* @' S& w; H0 s) \) t
  553.         jmp     $+2/ P1 w' t; w4 ?' |4 V
  554.         test    al,20h, t8 h0 e  }& ]- {
  555.         jz      kbd_wrt_ok1
    5 i" j5 |& c" t" _% N

  556. 6 ]0 l! y0 c% a7 G, \) m7 d* w. T6 b
  557.         loop    kbd_wrt_loop1
    ( F, @$ o4 J" y
  558. 9 x0 R8 y0 A9 [- C/ i
  559.         mov     ah,1$ [1 K' {* W* O4 D+ Z& a
  560.         jmp     kbd_wrt_exit4 z# d: ^4 j; y
  561. , t! y- B8 E+ l/ x8 D
  562. kbd_wrt_ok1:
    8 u* t2 K( }' |' M
  563.         in      al,60h" y7 `  _' f  T3 d. h4 b8 C+ _1 E" s
  564. * E) V1 E  z/ ~/ X. ^
  565.         xor     cx,cx2 k  x# g( m: \7 n7 X8 J
  566. kbd_wrt_loop:: i. X! B0 ~2 X& {. z! A# y
  567.         in      al,64h
    9 M6 j1 R* K8 w$ H# w; v3 S
  568.         jmp     $+2
    $ a" r5 ~- n: h0 h. E- ~, C) S
  569.         jmp     $+2' U) A5 Y% h" d' W
  570.         test    al,2# K( J3 w- D$ n. D
  571.         jz      kbd_wrt_ok$ T: O3 N! j) y& p) p- `1 n3 o

  572.   a1 f( o& W( L- t
  573.         loop    kbd_wrt_loop
    6 G+ P* D4 T3 f/ e
  574. : r' q0 Q& G6 f* ~( `0 |
  575.         mov     ah,1, P+ _3 }- X+ {8 K" z
  576.         jmp     kbd_wrt_exit  O* P  ?2 `: e8 i; d" X) b! M) V
  577. 7 R( @1 n. Z9 o: H4 N
  578. kbd_wrt_ok:
    " P8 o4 e- P4 K0 y- E1 z
  579.         mov     al,dl. E& K5 p+ X  D! }9 i3 f$ L/ N
  580.         out     60h,al. }* m4 r* K* q. a* Z
  581.         jmp     $+2- W1 j+ k$ H9 Q: E% \1 Z
  582.         jmp     $+2
    / E/ q$ r: [6 F! z: y
  583. 9 U7 ^  n7 |" K9 c
  584.         xor     cx,cx
    3 |# W! G0 p2 q( G& g
  585. kbd_wrt_loop3:# o9 P% t+ s* U  \3 ~$ S! Q* i3 Y$ t
  586.         in      al,64h
    # ~7 d' P7 z, g3 s7 v! C0 q9 Q
  587.         jmp     $+2
    4 g) J8 Y: Z/ Q* {* y5 z
  588.         jmp     $+2, Q6 n" u0 G: L2 R* n2 {, I
  589.         test    al,2/ D* h) R1 M: \0 {
  590.         jz      kbd_wrt_ok3$ s6 e* u  f8 C/ ^

  591. / E( G$ ~% A. t1 j8 p: A+ H
  592.         loop    kbd_wrt_loop3" Z9 X/ R$ X) e% S( S0 z( Y
  593. / G7 k8 M# p( y
  594.         mov     ah,1
    ; C0 M% F" B) H$ b9 A3 I
  595.         jmp     kbd_wrt_exit1 V, R9 U" n1 K6 N4 D

  596. , n- ~  b( U6 [/ ~, Z  A
  597. kbd_wrt_ok3:
    + ^# x/ F5 Z7 v" l
  598.         mov     ah,8
    $ ]0 G5 `7 Q, A" h* I, I4 k
  599. kbd_wrt_loop4:
    4 R% I$ u! e' Q% Z& J: d) k* g2 p
  600.         xor     cx,cx0 C+ Z* E/ f1 ]7 a* w
  601. kbd_wrt_loop5:& N9 R8 J$ ^- `. ]
  602.         in      al,64h
    - `0 `  C" l, H5 ^5 W& }2 [
  603.         jmp     $+2
    1 @  l6 Z8 Z" Y; Y/ y
  604.         jmp     $+2
    2 `8 d) w* ]$ c
  605.         test    al,1
    " Q% k# B' u  @$ F
  606.         jnz     kbd_wrt_ok4
    ' G5 R5 j* a' O- p& V! {6 `# Y

  607. ; k' Q! c) H5 R& g
  608.         loop    kbd_wrt_loop5
    3 [( z+ P9 p0 [- o% E
  609. 0 Z3 [& {+ Y9 E$ y) e# M2 P6 b; _
  610.         dec     ah$ {/ N/ m) [5 W8 s: t* v4 i: S
  611.         jnz     kbd_wrt_loop4" \+ b) b  R! B1 U4 X7 X! E( E
  612. * }! G+ c7 T, |' e5 L/ [5 W
  613. kbd_wrt_ok4:
    ' |6 V8 ]6 i& |6 D: D. T' w/ l2 m
  614.         xor     ah,ah) ~9 U2 I4 g% s
  615. kbd_wrt_exit:
    0 Q$ x5 u  J: Z' M! v
  616.         pop     dx! c4 y) Q" A/ Q/ H$ O
  617.         pop     cx$ e* {( p3 m8 q3 p& h2 N) R
  618.         ret+ P; q8 O) l4 `, G* i! |
  619.         
    , {0 V- Z/ E5 u& _
  620. keyboard_cmd:
    ; V$ O. _0 A7 A" p$ q8 G1 }& l4 n
  621.         xor     cx,cx
    5 v  B, e! p/ M7 z' ~0 \' @
  622. cmd_wait:# \3 N" J; @3 i& X% z: m+ V
  623.         in      al,64h
    # ~  C$ u& H, X" j
  624.         jmp     $+2' g1 a1 c" V2 e' H) k
  625.         jmp     $+2. o* o5 Q$ l! k9 H5 \& G' E- p4 H
  626.         test    al,2- ~. l' ]1 [7 i$ }
  627.         jz      cmd_send
    / t; K$ H9 U+ S% m
  628.         loop    cmd_wait
    7 Y0 A) p+ ~# e
  629. 4 w1 y& H8 k4 _
  630.         jmp     cmd_error
    * v/ Y0 x) W9 z2 d: W& L2 ?; M( `8 y

  631. * }2 o2 i" D; v
  632. cmd_send:
    ' G. H( a. h7 Q/ R9 A: ?
  633.         mov     al,bl' ]% [) C3 d) D- H# l; I5 g5 e
  634.         out     64h,al
    / E) D& T, h" `
  635.         jmp     $+2& l4 G0 R5 k% K* k' }( o
  636.         jmp     $+2% Y/ o) K1 {: W7 V
  637. $ B  k% F6 a0 k$ V+ y  R6 J5 M1 T( U5 E
  638.         xor     cx,cx& \  E( |! I( e4 ~1 l: W0 m
  639. cmd_accept:
    / W/ u; a- |& D/ K: n
  640.         in      al,64h5 x. q; E$ f, n
  641.         jmp     $+23 s  u: z- ~( E
  642.         jmp     $+24 b  A6 p& r. U3 ]/ O1 k
  643.         test    al,2& |% r% t( ]$ I# X) g
  644.         jz      cmd_ok2 ~$ Q9 I' y/ E
  645.         loop    cmd_accept' @7 N8 x& O  d# V+ ~# g% E
  646. ' b6 R6 Q2 H  v: q( V
  647. cmd_error:
    9 S4 }' {9 ^, w  K/ j2 L8 G
  648.         mov     ah,1
    9 q. a; l8 d5 N9 O4 z+ `" z# d
  649.         jmp     cmd_exit  A0 A1 X$ |5 g8 Y3 N9 [
  650. cmd_ok:6 W! ^: |9 n, _% v, g  R
  651.         xor     ah,ah
    $ r, Z+ T" R3 _: @$ l; {7 o
  652. cmd_exit:# E, {; Q; v' P, S5 l
  653.         ret
    + {- ]3 a' _# m2 ~

  654. . K, y1 M: f1 s# q" a5 A
  655. new_33:/ n% F$ L5 ]4 U, {/ P; q' n
  656.         cli
    # I# c% B8 {2 u& Y1 O
  657.         cmp     al,0; `- ?9 U1 i3 X; X- {5 u' R5 d
  658.         je      reset_mouse
    5 C, j: _! F" Z- R/ {. U  u
  659.         cmp     al,18 B% \' a6 ], @9 k$ w
  660.         je      show_mouse, p0 h9 B4 o! \+ J8 _1 \
  661.         cmp     al,26 W& j" T& K% t; {2 e* ]+ Y
  662.         je      hide_mouse
    5 F1 K, {+ I" n4 Y6 ?/ u
  663.         cmp     al,3
    & p2 L& Z2 i/ v# M+ I
  664.         je      get_pos! u+ K; N8 R" c& c4 B+ B
  665.         cmp     al,4$ s: `4 t% k8 d8 m
  666.         je      set_pos
    0 P8 e5 d  z! J$ D8 H$ [! P
  667.         cmp     al,7
    ; O6 E/ N: [0 ^$ k
  668.         je      set_hor_pos1 l& a& T7 Q6 \8 r- B& s
  669.         cmp     al,85 A, i: ~4 s$ ?# @' C- o
  670.         je      set_ver_pos
    ' e5 m% }) t0 x, U
  671.         cmp     al,0bh7 s. |& _% Q/ w' \
  672.         je      get_mouse_movement6 g. t0 w: k' `  t: t% w
  673.         cmp     al,0ch
      X; `7 ?$ R  d) L/ ~/ R% `, m; U
  674.         je      set_subroutines
    7 H: @1 }* g6 y4 j
  675.         cmp     al,14h
    1 C. C' v9 R' G
  676.         je      swap_subroutines3 i7 b$ Z. N$ q2 ]- m; \, \
  677.         iret
    0 F4 G; z# _, S: s
  678. 1 r8 K7 E1 ?, ]7 o* u  G9 O
  679. reset_mouse:! \* L7 x; q( t
  680.         jmp     _reset_mouse
    $ S" ?- w4 U0 W5 ~
  681. show_mouse:2 }. }1 n* v4 v$ u
  682.         jmp     _show_mouse
    . x! z) E/ u; M$ K9 u
  683. hide_mouse:
    9 t4 l/ r+ X, [$ [) V3 b3 m
  684.         jmp     _hide_mouse
    * |! K7 H1 A$ V- z+ u% l- s
  685. get_pos:
    7 ^6 G( M; W, B6 v4 n# f
  686.         jmp     _get_pos
    / F, [" P7 _- |" e% {
  687. set_pos:
    + `' v/ i' N- u5 Z' m2 k
  688.         jmp     _set_pos
    . T2 T- O; e3 _, |
  689. set_hor_pos:
    3 h; j% \- f. c# @+ w
  690.         jmp     _set_hor_pos
    " E( p& }% `7 t1 X: D% f3 R6 d
  691. set_ver_pos:4 d2 q5 Z$ `3 u  ]
  692.         jmp     _set_ver_pos# t7 K4 |) N9 O
  693. get_mouse_movement:
    7 o; o* u* J" _* S, z
  694.         jmp     _get_mouse_movement& \. J2 n! B; D8 t
  695. set_subroutines:' V0 |) N+ q9 P' S7 N# L0 G' `* i$ B
  696.         jmp     _set_subroutines/ \% b* K3 O) T/ m: k4 ~" n5 G
  697. swap_subroutines:
    9 k8 M) V+ {0 h
  698.         jmp     _swap_subroutines9 B" s' n0 E  e! H

  699. ) N0 A& D3 C/ l
  700. _reset_mouse:
    $ W4 X3 S- q" X" G9 I# k* Y0 B* V
  701.         mov     byte ptr cs:[buttons],0
    # u5 m& s5 Z2 {% }2 ?, F
  702.         mov     word ptr cs:[pos_x],0
    # f. Y5 A9 ?" @  `- P6 T" v+ w
  703.         mov     word ptr cs:[pos_y],0
    * U: @! n  E! \; `% ?; t
  704.         mov     word ptr cs:[x_move],01 y: U% r9 P9 Y" Z# v" x" B4 F
  705.         mov     word ptr cs:[y_move],06 v1 _, a/ S: p& {
  706.         mov     word ptr cs:[x_max],639# A& V2 u; G2 V- t3 t: x: n& R
  707.         mov     word ptr cs:[x_min],0
    7 Q4 k# @1 j" @- n
  708.         mov     word ptr cs:[y_max],199
    ! ^) r9 U0 V% e! d2 r2 K- Q
  709.         mov     word ptr cs:[y_min],0& H0 l+ Q! o: B
  710.         mov     word ptr cs:[user_mask],0
    3 |, K  l6 h3 w. v, H" y
  711.         mov     word ptr cs:[user_subroutine],0
      |+ L' ]( t5 q
  712.         mov     word ptr cs:[user_subroutine+2],0
    * K+ w) L# ?( z  V9 M
  713.         mov     ax,0ffffh
    7 S) p; n) X% ?+ w" W: I) Y
  714.         mov     bx,3
    : F' Y! L) N) |% K4 ?
  715.         iret
    2 k. s% R, w2 S
  716. 4 w* N1 p% c! @
  717. _get_pos:
    3 V: T3 c: v8 e* A; R. V! q
  718.         mov     cx,cs:[pos_x]" L7 K0 [7 U# A5 S, Q
  719.         mov     dx,cs:[pos_y]5 c3 W7 [' B3 \% a* I3 T5 ]
  720.         mov     bx,word ptr cs:[buttons]7 D9 B8 o# c$ P1 f$ b% E
  721.         xor     bh,bh
    % E1 _6 D; ~, [, A( I' V
  722.         iret' q* D. w, j: `  q. J9 j
  723. 2 H9 }% m: p. f7 u& A
  724. _get_mouse_movement:
    + ?% H# g" H$ C, M: g0 C& ~
  725.         mov     cx,cs:[x_move]- j5 j+ E- D/ r% N( I, J
  726.         mov     dx,cs:[y_move]4 M2 e1 T# o/ g* A" Q8 l) y0 {
  727.         mov     word ptr cs:[x_move],0+ \- f: n! Y# A# R  P
  728.         mov     word ptr cs:[y_move],0
    0 @$ J5 S; T$ Q8 y. P
  729.         iret$ _) _4 j2 n. d/ W4 q1 k
  730. 3 v7 O0 \6 C( b6 C' T! D. y2 o
  731. _show_mouse:
    % V* J  T, h+ h
  732.         push    ax
    % `) X3 P$ o1 W$ `" l, Q
  733.         push    bx! {, j3 e) ^2 l6 h# _7 `5 B
  734.         push    di
    4 L4 x2 k2 S. i% t) i4 h
  735.         push    es/ F+ Z3 ?! q* s! D* u2 Y
  736.         mov     byte ptr cs:[sm_flag],1
      X! ~5 z- q) j( O6 K5 o0 D
  737.         mov     ax,cs:[pos_y]" Y) r4 O* l- a, x9 Y9 T) Q
  738.         shr     ax,3# X1 Q+ J: K( x: q( d0 F5 x: M
  739.         mov     bl,80" P( F0 K4 l" X4 D. K. O
  740.         mul     bl1 |0 H. x( V. Y
  741.         mov     bx,[pos_x]% k8 Z% n6 }+ w! a) `3 r
  742.         shr     bx,3
    ' i# s) Q0 j/ m  Z# U8 w" {
  743.         add     ax,bx
    ) E1 N1 w! r, v
  744.         shl     ax,1
    $ C7 A8 H6 a. g/ T- s
  745.         mov     di,ax
    4 B" W) V  C' W1 Z4 H
  746.         mov     ax,0b800h9 @1 V- r3 t4 l0 X* u8 ]
  747.         mov     es,ax
    ! Q1 z: o9 t" ~, U
  748.         mov     ax,es:[di]
    ! |1 o. N) R8 f7 C$ R
  749.         mov     cs:[save_char],ax
    8 U2 [/ I/ ^4 _4 \
  750.         not     ah
    - K+ Z9 i: k  \4 H
  751.         and     ah,7fh
    ' s) Y0 a' E2 ^+ m0 C
  752.         mov     es:[di],ax
    5 ]4 r2 V7 F9 Q
  753.         pop     es! L. s; X2 r# A3 O! D$ O
  754.         pop     di7 j7 a% c# i/ [. m8 L; |# P1 |" p, t3 n
  755.         pop     bx
    2 B  ?: L" Y8 B, y
  756.         pop     ax
      ~5 P- r1 ^6 c3 ]: q2 u. R: Z! x
  757.         iret
    3 q7 u# q0 ~4 P  Y, J

  758. 8 {- y# \( m- j; l
  759. _hide_mouse:$ m, e8 F9 j: w
  760.         push    ax
    8 h1 s6 v0 A& v* L% J. H% }
  761.         push    bx
    + b1 H0 a: s7 e! n
  762.         push    di
    % \0 G4 B- K; c* r* l
  763.         push    es
    9 o* D& Y8 F, `) ]5 _
  764.         mov     byte ptr cs:[sm_flag],0
    5 A7 e8 H- g: e' ?* B( p2 ]- `
  765.         mov     ax,cs:[pos_y]4 f6 |5 @! M5 C  u- b, ]/ h% r- U
  766.         shr     ax,3
    6 S9 E1 `( x# P
  767.         mov     bl,80, }) o; k: x1 r2 ~  r1 t/ G
  768.         mul     bl
    " ]! Y5 l$ i% H4 w! ~$ U
  769.         mov     bx,[pos_x]" Y! M6 ?! _; @1 m4 x5 @- K
  770.         shr     bx,3; C" h" G1 K3 t  a/ H
  771.         add     ax,bx( R9 G, {8 E3 k6 f8 z2 z! y; Z
  772.         shl     ax,1
    2 s4 ?3 w( ~  i
  773.         mov     di,ax, {5 ~8 i7 y8 V4 H# F: |; _
  774.         mov     ax,0b800h
    ) q- P: C% S4 I9 s+ |$ k
  775.         mov     es,ax
    ) i! z3 u% b2 g5 y
  776.         mov     ax,cs:[save_char]
    4 ]5 C- e% S5 B  ~) _! U1 J' h
  777.         mov     es:[di],ax3 r' V4 \% n0 \( v
  778.         pop     es# h" ?! |! d, I
  779.         pop     di- b( I8 `; |5 e+ d. R
  780.         pop     bx; z! ^6 x0 X- D' n- F! ]
  781.         pop     ax& z  u* w2 |3 `
  782.         iret9 \8 C( w( V) X

  783. . |* x( v- M% j) I" r4 K0 Z
  784. _set_pos:; P- P% D% {- }5 _; C# C) ~! A" G4 Y, O
  785.         mov     cx,cs:[pos_x]
    8 d' K" V) i/ O2 E* I. J6 F7 l/ k* ?
  786.         mov     dx,cs:[pos_y]  L& r9 Z0 J, A
  787.         mov     word ptr cs:[x_move],0
    ; g, M4 @$ I+ M" z: I
  788.         mov     word ptr cs:[y_move],0
    2 C$ D7 i( j" Y: b. K4 Z7 p
  789.         iret
    ' x; Y' ~. e& D% J. x3 T
  790. 2 v1 }5 y) [2 {- A5 v
  791. _set_hor_pos:; g! s8 N7 W5 C
  792.         call    max_min' y: i4 M6 g% Y" y; ]
  793.         mov     cs:[x_min],cx
    2 i( v  Y, a' N" X2 Y
  794.         mov     cs:[x_max],dx
    : @7 l0 n& L* z: l" i
  795.         cmp     cs:[pos_x],cx
    7 y0 I5 `  N) ~/ F% D% p
  796.         jge     good_hor_min
    0 @9 i( F4 Q& e) v/ O% f$ R
  797.         mov     cs:[pos_x],cx: U& l/ w, k) W/ K- F- D5 ~
  798. good_hor_min:; U' X  g# k' S, W3 z6 L
  799.         cmp     cs:[pos_x],dx1 U' T; M( }7 ]- I& f3 x% @
  800.         jle     good_hor_max  w, {% \: W4 q
  801.         mov     cs:[pos_x],dx) z. s& v. J& l- y
  802. good_hor_max:
    9 U1 i- d. z( R
  803.        iret9 N7 N( o7 q7 R4 L, x
  804. 7 w7 o+ T" U/ O
  805. _set_ver_pos:
    + H  j& ?+ |+ L; N2 X% m  N( z  k
  806.         call    max_min
    # K. ]9 V5 ~( b* k$ R! I, o% l
  807.         mov     cs:[y_min],cx
    / L# b$ \0 W, f: H+ [6 x
  808.         mov     cs:[y_max],dx' `' \3 h* O1 c1 t
  809.         cmp     cs:[pos_y],cx$ }/ Z- Z* x8 f6 b
  810.         jge     good_ver_min6 F9 N# k, ]2 r* `" Z
  811.         mov     cs:[pos_y],cx
    $ f! T8 n# j8 W+ ]
  812. good_ver_min:* z+ @3 d! n; b
  813.         cmp     cs:[pos_y],dx- M- X' d  z- I! T1 M7 N
  814.         jle     good_ver_max2 [. N$ l& s2 u2 v. m" a$ j
  815.         mov     cs:[pos_y],dx! d5 ]1 Z) W$ ]) @( L/ g; o, U
  816. good_ver_max:. \) O* z* \' f5 G
  817.         iret: e+ [  a- g& B4 k( M: t

  818. ) @0 ^2 r% q. v. g3 K
  819. max_min:
    + h7 y1 p4 @5 d. O
  820.         cmp     cx,dx
    + w4 X/ p) C9 z
  821.         jle     no_swap
    7 a& x1 i+ B2 P4 @/ X9 H
  822.         xchg    cx,dx
    1 c- b4 K' `* G: d9 P
  823. no_swap:7 y: w- R6 t1 P$ ]2 r6 |  z
  824.         ret
    5 ~8 d9 Z' E9 g2 X

  825. ; G" e% x5 i( Q! P* R& ?8 l
  826. _set_subroutines:! m% r0 {9 w  [( y
  827.         mov     cs:[user_subroutine],dx
    6 e( j3 s5 s; f
  828.         mov     cs:[user_subroutine+2],es9 b" H8 q7 d, s/ O) h
  829.         mov     cs:[user_mask],cx
    3 u, `# ?9 ^! V
  830.         iret
    % ?. K8 @! X+ o$ u

  831. * \  w- d/ P$ z+ [; @( E
  832. _swap_subroutines:
    ; T8 `; Q9 x/ `* t; j1 Z; {
  833.         push    word ptr cs:[user_mask]5 t! k- y8 Y1 W$ g
  834.         push    word ptr cs:[user_subroutine+2]
    / T! }0 ~0 U( s( U6 G
  835.         push    word ptr cs:[user_subroutine]- H, H+ _* v/ _+ ?" A5 {
  836.         mov     cs:[user_subroutine],dx; W9 o# |  j) S, l. u
  837.         mov     cs:[user_subroutine+2],es
    + K4 f' U$ x3 l6 v
  838.         mov     cs:[user_mask],cx
    ; ?3 ]" {) r" z1 f
  839.         pop     dx
    - d" i: h( o7 ^0 B
  840.         pop     es
    " }% A! @- j$ H& e" |4 b; v
  841.         pop     cx" J; ?% o# o: f. ]' r' K
  842.         iret
    . f9 g2 ]9 u# Z9 L- `/ F& \0 ]9 P
  843. : m1 ^4 G/ ]4 S: z6 j
  844. memmouse        endp
    9 i- u  N% e/ `% Q4 {
  845. , E9 J; g' t* {$ L/ i" w  q/ T
  846. endof_start:0 m: z( L% K/ U' d2 t
  847. , e& W2 b* f+ Q+ E
  848. emsg db 'No mouse driver install error!$'
      @- ]$ r8 u, t. I/ d7 C0 s
  849. old331 dw 0
    1 r+ Y' O& g3 ]4 @  i
  850. old332 dw 0
    3 |+ y1 q7 O+ h# p3 a/ y! E: h
  851. old741 dw 0; e& T$ Z0 h0 {( i5 d* E% y  C, D
  852. old742 dw 09 r( b* ^. {: v
  853. memcopy db 0
    & ~, @! t( N7 e1 r4 w. I7 ~" x
  854. okcheck db 0
    / g# u" H0 P. m& r* W% ~2 O. g6 H
  855. pass db 0
    9 Z" p% t+ D* B: ~0 a0 w
  856. chkl db 0
    + O! O# n5 d3 q. D8 R. w
  857. lk db 0
    5 M% ]/ Y. t- b  G
  858. chkr db 0" T4 g6 v" v* e# _7 S* r/ s
  859. rk db 0
    " A3 ~' m$ _. G7 M0 T% U- Z% H
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    # }  G4 l5 k# g2 k) K/ N
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    - u9 b' n- P6 s, N  f1 m* Q$ n* l, o
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '( \$ i  T3 @- i: g  B3 v
  863. db '                                                                                '
    ; M0 {. S4 _2 E$ n
  864. db '                                赏屯屯簧屯屯突                                  '
    $ A! a& D1 s% W3 t7 q
  865.         db      '                                ?OFF汉OFF?                                 '
    / R; @0 ^3 u% g; i2 p9 r; a$ H
  866. db      '                                韧屯屯既屯屯图                                  '( {8 t" u0 M! y0 I- Z/ ?. U
  867. db '                                                                                ') {, U1 M0 t+ M/ @
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    & s) H; M2 w# d1 P' F! j: W1 E5 R
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    * m$ a  J! |: g( b3 C  @
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '- k- W/ e; N3 z6 e; |5 k

  871. 5 {9 H+ i' H& \& \) @+ Q4 z- g
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!& s0 X: U% b4 g( Y! P
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... / D' M9 i, h# p0 l' D# e: G0 [* Y
- r- q3 t1 B3 b. P
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 05:09 , Processed in 0.034712 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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