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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
& u1 k4 r! Y+ \( W0 A1 {/ Z* D  V% I; M, U. i- p
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    % C2 K2 W6 [  B! g8 Z: C
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9: h1 M4 B9 N  M3 V
  3. ;                                         By Bini.Yi 易祝兵
    , x* F+ b- p  x; |
  4. ;                                         http://www.ufoit.com 计匠网
    $ t# U6 A& \& h- d  W) a- |
  5. ;                                         2002/04/06 YYYY/MM/DD# f7 }2 x; r' h: g* Y( U8 S- X- b
  6. ;& f' k0 o' u0 r% p, z7 I
  7. ;         
    : ~6 N" S+ s+ c# R1 W
  8. ;          This program  test the mouse button  click and move.6 H2 i1 Q) M( X) c
  9. ;
    $ X7 k% m# Y7 U( D4 ~" e# ~4 H

  10. " Z9 e4 p' w. y* v
  11. .model tiny
    ) u: ^; t, O; `
  12. .586
    ' a1 Z) G6 ~7 r: w+ C- z
  13. .code
    + G" z! I/ G7 d3 U0 t- d9 D" H
  14. .stack  100h, m; q$ ~- b' F% P  I2 ?0 ?
  15. .startup; B4 t5 \. x2 q9 d$ T
  16. pusha) E" D( ?! @- k
  17. mov ax, 3533h
    " o2 z. B' I" }- f
  18. int 21h
    # G7 v7 z. ]- c* t" }
  19. mov word ptr cs:[old331],es3 R5 R) F9 w: g3 T+ m3 t
  20. mov word ptr cs:[old332],bx
    . r* E# m1 E, m- M
  21. mov ax, 3574h8 g) a- y* U& j% G" S
  22. int 21h! Z/ m( ]5 E1 U. k7 V+ L4 x1 E2 U% j# L
  23. mov word ptr cs:[old741],es( ~& i- \5 E& ~5 W) r
  24. mov word ptr cs:[old742],bx
    . D; W3 t: N! X/ D6 W0 J# Z. `
  25. popa
    7 p$ ?8 g/ ^1 }
  26.         call    memmouse
    $ D$ |4 p  H. b
  27.         mov ah, 00% L8 N+ P+ ]$ Q8 m/ z
  28. mov al, 03/ {+ X  y7 B4 V# y+ D) p2 u- G
  29. int 10h: k8 d' v, y. N3 x1 u9 \, [
  30. mov ah, 06! b- ~2 l" O1 E
  31. mov al, 03 @/ f1 T/ R; @, @& k
  32. mov cx, 0
    8 r! c- S) L( v# V- u4 X& B" z2 f
  33. mov dh, 24
      k/ K: v! [: L( P7 Q' W+ t
  34. mov dl, 79; e" d- k6 P* V
  35. mov bh, 07h. d; \0 |# X+ |8 Z3 L: m
  36. int 10h
    - P% N% Q! b0 w  p8 t
  37. mov ax, 0000
    6 O. Y3 o  w5 _  r
  38. mov bx, 0002
    4 V% F% W- _! T5 V3 D. o0 v) S) g
  39. int 33h
    ' [7 H" ~- }' Y& V6 }8 `- t8 W: ]
  40.         cmp     ax, 0000           ;if no mouse drive install+ t! r8 c2 v3 v+ D! f5 e  t
  41.         je      errormsg           ;show error MSG
    & Z% v! p7 Q8 k3 f8 c5 d
  42. mov ah, 02* q; S+ x, ^6 N8 q, ~
  43. mov bh, 00
      A% G+ C# G$ F5 l& L$ Z7 A
  44.         mov     dh, 25             ;Move point out screen$ f" L& b2 R5 D* O7 t
  45. mov dl, 79
    * k. I% t5 T! {- l- F
  46. int 10h
    : h# M$ e& W- z* }) H
  47.         call    showmsg            ;Show info' a& M$ H6 _7 a) u1 j
  48. mov ax, 0001' S$ {  q; e7 E, D8 V4 M; d
  49. int 33h1 n" A1 N, |/ T8 N
  50. ; mov ax, 000ah
    7 D, F' `' e& p* x
  51. ; mov bx, 0000  M- X, h- H: w- v
  52. ; mov cl, 0h
    8 Q' v) E2 u" f: j* A
  53. ; mov ch, 0F0h; L& J0 q2 }. I( A& D6 s  N/ m
  54. ; mov dl, 0h- k$ s  k6 [$ G; S& P! i
  55. ; mov dh, 0F0h) J& u5 \" U9 p6 w% Q0 V
  56. ; int 33h
    ' i8 Q) D: o# Q
  57. mov ax, 0004h
    ! D$ J2 q$ U/ `6 j
  58. mov cx, 0319
    $ \+ ]5 D7 R; j* C! B
  59. mov dx, 0103% R4 T: W. Z# Z" y# I) O
  60. int 33h/ N. p" r/ a; k2 v# ^
  61. casemo:                           ;Case button click and point move
    9 M( R3 M+ X4 n
  62.         mov     ax, 000bh         ;and keyboard press
    ( |; h- I* ?- _0 S/ k# U. |, K3 I
  63. int 33h2 y& ?* B- j0 P& n( _5 w+ I) }& `
  64.         cmp     cx, 00h           ;if point move....X: d. Z0 {4 n) P. c
  65. jne xmov, A6 n0 P/ }: I) x% d) Z
  66.         cmp     dx, 00h           ;if point move....Y. y5 Y4 m3 Z* S' i
  67. jne ymov
    " l: Z% ]2 W4 h
  68. xymovend:                         ;X.Y move end1 S$ A8 n& ^* p& q
  69.         mov     ax, 0003            [4 N1 A- B8 f9 l8 W
  70. int 33h
    5 G3 z$ T2 \$ ]- k, r
  71.         cmp     bx, 0001          ;if left button click  show ON. C$ a# s2 Z' d
  72. mov si, 1828# t. q+ b2 Q6 \+ T0 \
  73. je listl
    . f1 L# ]5 i& R1 [$ v/ m( D) K
  74. mov si, 1828
    8 h: H  `( p6 r1 {+ S! u0 V
  75.         jne     nlistl            ;if left no click show OFF
    3 G2 n% t$ K# o+ w8 z- }
  76. testr:
    ! ^& [4 v# p( @3 X: _
  77.         cmp     bx, 0002          ;if right button click show ON
    . G8 K2 ~0 M9 h( F* I
  78. mov si,1842) X, ]4 e/ H/ k5 U! M
  79. je listr
    6 n* C4 e) B6 w0 `; j, J( B3 j
  80.         mov     si,1842           ;if right no click show OFF1 z/ \0 A/ T8 a6 k5 u+ O
  81. jne nlistl; n* \; u6 Q4 |
  82. casekey:
      N% n1 a8 r% g. P7 o
  83.         mov     ah, 01            ;if any key press jump check
      J1 e, t0 W% j* u8 n
  84. int 16h
    / Z8 @) a) }& @
  85. jne kpress% K) I2 [+ ~$ m- \  ^1 _
  86.         mov     al, [chkl]        ;check x flag
    6 P0 Y/ Z- x7 s. @) L
  87. cmp al, 02h
    1 Z7 b+ L) Q+ w% {/ l' b* ~$ [. w% w: e2 R
  88. jnb chkok
    8 ?, K: n! j* Q
  89. jmp casemo
    7 g6 M: R8 d. J
  90. xmov:                             ;if X moved, get the X flag+1: u6 B9 k+ o/ o2 i3 ]
  91. mov al, [chkl]1 j" u. r. N: o; b0 y
  92. inc al
    ! G* B0 J) f6 |. ]8 |4 _: e6 {
  93. mov [chkl], al
    % o) H- A& R" P5 B7 A/ f0 ^
  94. call passok3 U: T6 e3 w1 V6 f6 \, T, C
  95. jmp xymovend
    * b2 m# t8 a$ o7 H" G+ ^, W5 Q5 f
  96. ymov:                             ;if Y moved, get the X flag+10 g' A: K1 B$ f2 n3 \2 S3 U
  97. mov al, [chkr]
    , |5 m2 y. B* h
  98. inc al
    + J6 c$ {  M, L( d
  99. mov [chkr], al
    6 _# W3 O7 }( ?* x3 ^! Z$ p
  100. call passok# m/ C% M2 }" M. R) z+ S
  101. jmp xymovend
    ; C: ^" S2 ~$ F* `/ J

  102. . s5 g% Q$ o* B" Z; F( R/ r+ ?
  103. passok proc near) O( s; F% Y$ \( z8 M
  104. mov al, [okcheck]/ M" b$ g* K: ?* N; [
  105. cmp al, 1
      S8 y9 i+ ?5 ^" w* H1 W9 ?. L
  106. je let0
    ' U+ L7 C6 r( O+ |) l
  107. jmp passret
    7 L' A7 {9 N( a, p
  108. let0: 5 U" E6 ?; h- |5 I! I
  109. mov [pass], 1, [/ P% c5 q, h( ~
  110. passret:# K- o* _# ~! h' z. o* F
  111. ret' s5 Y: g$ i' M
  112. passok endp ( }( ?& j* z! A0 `
  113. % @6 u1 e/ h) J  S; [* Z& ]7 [
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS' v1 a9 V1 [0 D& Y' X& r
  115. mov al, [chkr]& x( N+ h! |% F4 ^0 d2 G4 V% n7 s
  116. cmp al, 02h
    3 a0 k0 m. J0 m- {6 `
  117. jb casemo
    & e: w6 H3 K6 H/ F) Q( z* ^" }' j- y
  118. mov al, [lk]
    0 R) C$ C1 x- M3 S3 F, a1 q' p
  119. cmp al, 17 G: y" s+ v* D9 i, V- z4 H* e
  120. jne casemo
    + j7 k" `. {' h, q; m# n7 a' h+ {
  121. mov al, [rk]
    ! W" d/ o, c$ X8 {& m# O
  122. cmp al, 1* ^+ h+ [- y6 h* R2 \5 y& h
  123. jne  casemo5 |$ m+ D, ?2 A1 b: R
  124. mov [okcheck], 1& a0 k9 t: K8 q/ A5 [
  125. mov al, [pass]
    8 ?5 l6 Z8 V+ D6 N9 j( Z
  126. cmp al, 1
    6 s. m; I8 d2 _7 z' e
  127. jne  casemo
    0 B) w, w0 E8 g2 ~. G" @4 B; k  Z
  128. mov ax,0002h
    - j: R8 @/ l  ^6 A; k# r
  129. int 33h
    7 Q  X& |" M3 w- z) Z
  130. call cleascr
      G+ E* b) e4 E
  131. , f  {' _0 v5 i/ X$ j$ c9 g( f# M8 j
  132. call oldint. q4 Y0 S# w1 y* g
  133. mov ax, 04c00h2 Y% j1 j2 ]5 v1 }
  134. int 21h. R8 |5 v8 L! C* b) l1 A! i2 n
  135. : |2 o6 d6 [/ L( W$ N. k7 Y
  136. okexit:' \6 g7 X; X/ v# }) _
  137. mov ah, 4ch. F/ d6 f! x5 k5 s# v4 j2 W( w
  138. mov al, 00 ?8 I2 y2 t8 i% P" j% W. M5 e
  139. int 21h$ ?9 y, _" ?; q6 e0 n% R
  140. listl:                                 ;Show ON9 p( i& o5 z0 M% t) [( T. E
  141. pusha
    ( @- b1 a( W1 l. N
  142. mov ax, 0b800h/ g% ^& A+ J9 L0 U
  143. mov  es, ax
    0 g2 f( E7 b) n4 d- S; H
  144. mov ah, 47h
    ( n4 ^4 m4 L9 o
  145. mov al, 20h+ E4 C1 ]- `% ?
  146. mov es:[si], ax* Q( K5 r5 ]1 v5 A
  147. add si, 02
    6 M5 o- ]; a' b. i1 `7 R) c  j& L& Q
  148. mov  al, 4fh
    ! o1 [# R- {; e" o
  149. mov es:[si], ax0 v" C( d/ [+ W$ @
  150. mov al, 4eh
    ; r# {3 X6 s0 ]: P+ E& y0 M+ h1 A
  151. add si, 025 G) I' }5 y& Z7 M6 m
  152. mov es:[si], ax! v' A: B* M7 C7 W/ T! [
  153. mov [lk], 19 Y, f; U1 _4 q
  154. popa/ c) ?) T( y+ \5 u- ^% a! H
  155. jmp testr: h1 H# X% O  j5 ]
  156. listr:                                 ;Show ON4 ]) f9 T" g. A: r! x/ |
  157. pusha
    3 x" r+ O9 O1 l5 ]4 H  X7 q
  158. mov ax, 0b800h
    % Y4 I" W) H/ S3 i, ]
  159. mov  es, ax0 P5 X# \0 g/ n. q' k. s" {) C
  160. mov ah, 47h# Z  c! T4 b: Y
  161. mov al, 20h, N, N7 G. o0 d3 O: C# r
  162. mov es:[si], ax$ h: u* h: }' D
  163. add si, 02' V% p+ h+ ]2 {& z4 W! u8 A
  164. mov  al, 4fh
    8 B3 J0 ]/ ~7 I7 i8 }4 P# j1 \
  165. mov es:[si], ax" r; U6 L$ P( I" Q7 H* w( G* l3 p
  166. mov al, 4eh
    " w' t0 J* P+ K$ Z5 \4 G$ v
  167. add si, 02
    $ h$ t* |% x1 t
  168. mov es:[si], ax# f! V/ {% m6 z) P2 x6 ~, Z/ F
  169. mov [rk], 1
      I! e. j3 Y, P8 |
  170. popa$ R3 z3 e: t: t. W
  171. jmp  casekey* c/ s4 l3 g  |; o, ]6 V
  172. - ~5 C1 d% }3 O% }* c
  173. nlistl:                              ;Show OFF
    7 t  |9 ~& n+ n; X
  174. pusha   
    $ d/ B' s; L$ o+ W
  175. mov ax, 0b800h
    + u0 w$ Z+ H, ]4 R5 u
  176. mov  es, ax) T8 R$ C- U. @! s
  177. mov ah, 17h, _$ M, ~7 M) y' W
  178. mov al, 4fh
    0 g$ y1 C0 v  E4 n$ X) Q/ Z
  179. mov es:[si], ax# c: @' m% C4 e: `
  180. add si, 02: W: I- e1 J0 V  L7 \8 C: D$ Q
  181. mov  al, 46h
    # y  M+ e  }  Q/ ^3 N1 k2 r
  182. mov es:[si], ax
    8 ]- B6 g' A. B
  183. mov al, 46h$ q6 q9 c7 Y3 I. E. M( P
  184. add si, 02  N4 t" G7 f( a1 C
  185. mov es:[si], ax8 y9 l4 }2 v9 `1 n+ L
  186. popa4 g7 K) U& u0 ^' f& v' ^
  187. cmp si, 1840& ]# {1 Q+ s( `0 G
  188. jae casekey
    * I( c( U, ^& i; N* v* d
  189. jmp testr
    ! U% V: B5 Y( j" s* Y& {4 u8 d
  190. ) A6 I* J2 s1 ^
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    9 a" @( E5 \+ x8 E
  192.         cmp     ah, 01h             ;and return a error
    8 K8 {8 d5 W& I; ]
  193. je exit1
    : n* j7 ^# F$ [9 `8 N  I
  194.         mov     ah, 0ch             ;if press other key then clear0 t0 D3 M0 Q. j( F" ~2 i
  195.         mov     al, 00              ;keyboard buffer
    . c" S& @* r! \, s, O( G
  196. int 21h
    * D  }% `  [7 n
  197. jmp casemo 8 V9 ?( H  ]: d7 p
  198. 4 ^2 s7 q7 z& y1 y3 F" v
  199. errormsg:                           ;if mouse driver no install) C% a7 {1 ^' E$ Q0 N3 m
  200. call oldint; j8 @: }% d1 c+ x) f6 F- {* u; E
  201. lea dx, offset emsg
    " i$ v/ C# Z0 [5 U& E
  202. mov ah, 09h2 B5 ?  G+ Z3 V; Q3 f( V! k
  203. int 21h, h3 O$ h: u9 l
  204. mov ah, 4ch; `/ z' M5 l" P9 ?6 I3 z% J3 }
  205. mov al, 20 _  v- f9 B$ v& ?) d
  206. int  21h
    - W0 c: ^0 L: q% f  r

  207. 0 ^. h1 z$ ]: T
  208. exit1:                              ;error exit
    & [! J  K: P# A& d/ }
  209. mov ax, 0002h
    0 h! _  {, f1 k% H8 V4 g# O
  210. int 33h3 q  D+ ?4 R0 x6 |
  211. call  cleascr
    1 _6 p; R4 I! f7 V
  212. call  oldint
    5 }8 z# o6 N, L) q/ Y) ^5 C. t2 \
  213. mov ah, 4ch" [5 x# Y$ }  k8 F: H
  214. mov al, 01
    1 o  c. k# W: v0 @
  215. int 21h
    8 T5 n- [7 s+ A

  216. : k6 |# e+ g. A3 O
  217. cleascr proc    near                ;clear screen
      I/ J' U, N' O/ k7 W
  218. pusha' a- [5 z% N2 \( `9 V8 r: [
  219. mov ah, 06  g( A1 l# I; v% g
  220. mov al, 0- h7 |# g, }, v: E  Q8 s2 B% _
  221. mov cx, 0
    / j5 s- E4 {( o  D' d( V
  222. mov dh, 24* J; C4 L8 B; r: j
  223. mov dl, 79
    9 F! x/ x4 Y9 B* n. ~% B
  224. mov bh, 07h$ A& W6 \9 a* n
  225. int 10h
    ' |) ?5 p  R8 Z* F3 K% Q
  226. mov ah, 02' ?+ w2 h  d2 W4 i* ]! R$ |/ Z
  227. mov bh, 00; N+ `6 J. S; s/ N
  228. mov dh, 08 z# T! H+ b' l* X
  229. mov dl, 0
    0 j5 l8 H; P7 ]* `3 d/ e9 V' d7 s5 q
  230. int 10h
    + k* m6 N8 T4 t" b- z, K
  231. popa8 m/ Z, i0 C6 X; A( k
  232. ret( d% O( A6 V( t5 D& @% q/ `6 ]
  233. cleascr endp
    ( m. v, s3 z5 E* Z
  234. 4 U# D4 ?! }% \" ?4 t* c# C
  235. showmsg proc    near               ;Show info# b9 ]$ U) y. H
  236. pusha, N2 i* m8 R' y
  237. lea di, offset showms
    4 n# Y; n# W4 u; m+ ]+ R" R
  238. mov ax, 0b800h3 U+ V) @/ y: C' i
  239. mov es, ax
    # G: `6 H' t5 J" O5 Z* X6 j) m
  240. mov si, 0
    ; l5 ~: n9 D% D, ^) g, Q' Q; J
  241. mov cx, 4805 m  `4 \% l( Z& J% Z  k. i7 z
  242. mov ah, 07h: i4 ^2 K9 R5 Y* N' T  @$ j
  243. @@:
    % `9 S8 q; `0 y0 y# {9 h! v
  244. mov al, 20h( S; p% ^: w+ c$ w9 a
  245. mov es:[si], ax
    " P; V' A  O; P+ P: y
  246. add si, 2$ e5 d: [. u) h
  247. loop @b) t5 e( A/ z0 N) f* E+ I
  248. mov cx,880
    ( D/ ^; S; x1 U3 J6 |7 @
  249. @@:
    # |; c* j* ]* G' A0 n! W8 K
  250. mov al, [di]- }: h* U# @  N, C6 M
  251. inc di
    * g2 V$ g& J+ w: _
  252. cmp al,20h
    1 S* w  r) u2 W; P3 O- Y* K- T
  253. je showch1
    7 u, t: A& A1 U# B9 p) T$ @3 N5 X
  254. mov ah, 17h
    : B  U2 v4 u8 M) \8 V
  255. jmp showch3
    - ?$ r) s; s" f. k) D2 ]
  256. showch1:
    ; f/ j7 q) z- Y/ m
  257. mov ah, 07h
    6 J% w; G0 m$ F3 M- y8 I
  258. showch3:
    3 Y' b3 j. U6 V3 a3 U$ I9 y7 ^) q
  259. mov es:[si], ax- m- k1 e! U. w$ S, j5 c6 n
  260. add si, 24 z) g, @$ l4 |% ~: T* u: g+ x/ K$ R
  261. loop @b+ a5 l. w- l2 w) r- i: n4 B
  262. popa
    3 X/ i' A6 Q9 T- \6 \
  263. ret
    / @' ^6 ^* a; H0 _, H: l" s/ U) H
  264. showmsg endp
    * ~# ^2 {7 m6 M2 e) v0 Z* L; B3 b' P
  265. 0 d$ V$ l9 Y) B, h( D$ V
  266. oldint proc( h$ `# N8 V% M1 ~
  267. pusha
    0 ?  j# V1 o: F3 N# D
  268. mov ds, word ptr cs:[old331]
    % N# P, ^7 E* |' H7 {  t1 ~7 ~
  269. mov   dx, word ptr cs:[old332]6 |5 S5 R4 I& m: B6 `- B* }
  270. mov ax, 2533h
    " k. P* Z$ S! Z1 K7 h* I
  271. int 21h; H' D! C7 {  }
  272. mov ds, word ptr cs:[old741]
    ) r; j  s: w! p# {& F
  273. mov dx, word ptr cs:[old742]$ p. _; P8 Q) e: g; ]
  274. mov ax, 2574h
    2 {2 s4 F3 ~# L
  275. int 21h
    ! g2 e/ A7 d7 w9 O
  276. popa8 q) r# K- Y: |' c
  277. ret
    : @. o% W; }! T( f& S( }
  278. oldint endp5 @4 z& I; s5 E7 T8 r; o: d' r

  279. : z- d- O! c9 K) u9 b, T. {) |
  280. memmouse        proc7 q2 X3 u. i9 W
  281.         xor     ax,ax  t# C$ _8 V9 {3 U( s
  282. int 33h0 O# z9 b4 R; C9 }: _/ a! L  v& |) S2 d
  283. cmp ax,0ffffh; L1 {1 C5 v  b3 u
  284.         jne     not_loaded) w3 S) z; Y  X* z
  285. mov [memcopy], 1
    ! a. d5 {- T" ^* M6 Q  a0 A
  286. ret
    / C% |3 J0 B5 d, R+ f- T
  287. 0 p% t% d* @0 X8 E  D: h% Y7 @
  288. not_loaded:
    ; \1 u/ o1 D2 ?" O
  289. : |- w" M7 A2 A% X) }- A% \3 ^* o; A
  290.         mov ax,2574h
    1 x. g0 w# O9 c  W# V, v9 f
  291.         mov dx,offset new_isr
    ! F  I) h) @+ J" I4 |
  292.         int 21h( t$ z( k: k+ w' W4 M  g

  293. 4 v: D7 Q. Y- ]: d6 }5 u5 S* J) I7 f
  294.         mov ax,2533h
    * |8 V, S  p& }) b7 l, r% r
  295.         mov dx,offset new_33% f6 h1 i# l! q
  296.         int 21h! J+ m6 ], w3 C5 \3 P6 S/ u6 j4 P

  297. & E! g, M/ a' K# [! t! p0 P: v
  298.         cli! I4 x) L* M; ~0 p0 J! Q% Z$ z3 a

  299.   ^9 ]& {' j" R% l, @
  300.         mov bl,0a8h
    5 ?( O! e- u1 ~  Q1 ^
  301.         call keyboard_cmd
    / K$ Y1 w" n. C3 b- y

  302. ! ?2 ]7 U0 j* d; ]( a; }
  303.         mov bl,20h, m$ l& C3 d1 K; Q/ T; C0 a
  304.         call    keyboard_cmd
    / ^; y6 S* ]: o5 F
  305.         call    keyboard_read; d. L. x: d6 q$ m6 ]
  306.         or      al,2
    / Z  H( @9 y* p$ f" n. H/ x
  307.         mov     bl,60h
    " k1 ^  Z! L8 N3 m7 P! B' @4 W
  308.         push    ax
    $ P+ j; T2 m# u, F
  309.         call    keyboard_cmd. X) W- I* J2 h% @2 C7 o
  310.         pop     ax
    : n# `$ @3 J8 ~- \% i
  311.         call    keyboard_write
    . E* L! f; q; o- a0 M2 X+ S, D# q% c
  312. 1 U5 |" g( _/ m9 M7 C
  313.         mov     bl,0d4h. {7 F$ k+ t" ?2 y
  314.         call    keyboard_cmd
    2 s, F$ i- M% _* w7 ]5 D
  315.         mov     al,0f4h" A& [5 D4 t8 V' ^0 h& _
  316.         call    keyboard_write
    : N% K# k9 _5 G6 {% A1 X
  317. 6 |8 J4 T4 U3 Z8 T
  318.         sti
    6 j% S2 \9 _+ m8 a$ I3 d5 N
  319.         ret$ M: Z9 L+ t6 b0 v1 Z( z1 h1 g
  320. call_user_isr:- S' Q8 ^7 h: H: I; B
  321. db      60h# c* e( J" T% n- K
  322.         mov     cx,cs:[pos_x]
    ! E9 n8 B1 a' v
  323.         mov     dx,cs:[pos_y]
    / G6 d2 n4 p1 J/ b) O
  324.         mov     di,0 ;cs:[x_move]
    $ U/ c' {5 k3 f! P6 }
  325.         mov     si,0 ;cs:[y_move]$ s2 P5 F9 l- t  G3 Y
  326.         mov     word ptr cs:[x_move],0
    ) D3 h. d. i* }% s
  327.         mov     word ptr cs:[y_move],0
    8 ?% F- k! a2 ?: U) v7 I6 W
  328.         mov     bl,byte ptr cs:[buttons]
      j7 l  U6 c* Y" B; F% W
  329.         xor     bh,bh
    / j* e: u/ F3 A1 ?
  330.         call    dword ptr cs:[user_subroutine]4 e% ~% z7 X. y+ n. s3 C
  331.         db      61h
    / G$ w. q4 K; [, s# b3 G8 b
  332. ret
    ; M+ @! y# G9 \3 n
  333. new_isr:# u1 t4 l0 r$ V3 u3 W
  334.         pushf, \9 }. H" @$ G. O
  335.         cli
      ~% O) q  ~6 N# h. Y
  336.         push    ax& |! \/ D" [6 Q" I
  337.         push    bx
    * S# F: x/ v7 J# N( E: l/ s
  338.         push    cx
    + {0 l' V3 Q' o  h
  339.         push    dx
    ' t9 p9 M, V( r# z0 u
  340.         push    di
    ( F$ h! g! X9 W  h  \/ a* ~7 T5 P
  341.         push    si
    3 u/ ?3 L0 }$ V& J4 S5 q/ v4 r
  342.         push    es
    * ]: J- t7 D' E9 L  M
  343.         push    ds+ z3 ^; k0 Q7 n1 b% e4 p1 r
  344. , S4 W: H3 z2 U$ g3 v
  345.         push    cs# n  l( k) n& J* V9 z. g
  346.         pop     ds
    5 B/ \; ]# @  v: x$ H, }0 K/ ?2 M

  347. - A2 S6 y. |+ ]' q" n$ {4 U$ `! k
  348.         mov     bl,0adh
    # t' V8 _9 A7 w9 [; S5 q
  349.         call    keyboard_cmd
    & K% H3 f, @8 B& V; b' L8 E; b
  350. 1 v0 J' ~. {! D: h& R' x
  351.         cmp     byte ptr [first_time],05 s+ p0 A0 J: m* ^- ^& o" e# k/ V
  352.         je      not_first_time
    ' }/ G# Q) S1 [. e. i! D
  353. 1 t' }. m( r8 ]: n" u) M
  354.         mov     byte ptr [first_time],0
    ( d* \! }+ m+ _
  355.         call    keyboard_read/ u, U2 s( C, U* F
  356.         call    keyboard_read
    ; i7 w3 Y9 o# K: L# T+ f% {. Y7 F
  357.         call    keyboard_read! O8 U8 c6 e6 X2 o8 N( P
  358.         jmp     no_show9 K1 u) c% T- b; }2 u  S
  359. ' q% O! ^- a) n& m4 w3 F
  360. not_first_time:
    $ I4 D' q/ O+ K% }, }( U
  361.         mov     word ptr [temp_mask],0& @  h, Q6 g0 g
  362. / Z% u# }7 d6 \, b& ~
  363.         mov     cx,[pos_x]
    5 d! Z- j( R$ `+ z
  364.         mov     dx,[pos_y]$ A( s5 z/ u( N. {: z& J
  365. ' K2 B  d" X  O* i$ ]; L2 Q; W
  366.         call    keyboard_read
    5 L0 p6 n6 L2 W% k" c
  367.         and     al,7 ;36 [& f9 F: Q2 _5 J: H& F
  368.         mov     ah,[buttons]! c2 T0 `9 S( Z0 n2 K
  369.         mov     [buttons],al0 N/ P5 m$ M, e) j
  370.         cmp     al,ah& a  Y# ^( x& T: e! n& D7 m5 a
  371.         je      no_button_change
    4 w# [# _( w: n+ ]7 V! e
  372.         and     al,38 n+ S  }0 `6 g9 L7 ~2 J, A
  373.         and     ah,3$ B' P! N. v; k5 S' `. O
  374.         xor     al,ah
    & h+ ^2 U" Q6 x, V+ z) G8 U: M
  375.         xor     bx,bx# G2 H/ e: ]4 Y' R
  376. * _& t/ Q; V, x; J9 W+ }+ e8 d
  377.         push    ax
      k  [/ i. Q  a3 x; L% [6 \
  378.         test    al,2* C% W# ]8 d) H% _* V. M6 j
  379.         jz      no_right_button_change
    # S- r' Z/ |& L6 O' a3 D- R
  380.         and     ah,2) _5 N4 |! w6 G  I) p. X' [
  381.         jz      right_button_pressed; C5 N, |* ]1 [
  382.         or      bx,16/ P6 h$ B: k! ^/ _5 }
  383.         jmp     no_right_button_change
    # e: k% ]6 `, `' a2 h$ r1 X+ ^
  384. right_button_pressed:
    . m$ l: p! K* ?7 W3 a
  385.         or      bx,8
    5 }. X% N8 X( V
  386. no_right_button_change:0 t! [' i' a& d3 e, Z9 B% q, R
  387. 7 H7 B% ]' R$ L9 r
  388.         pop     ax; W! a' J+ D0 ~! r8 l8 T
  389. 8 L1 w& o+ C% }8 N, [* R% B
  390.         test    al,1
    ; Y2 V6 E" h# Y  W8 L! o6 O4 b
  391.         jz      no_left_button_change
    4 ~$ l4 x4 e. J2 I. m" f/ `: N
  392.         and     ah,1
      z) f( W$ m7 J
  393.         jz      left_button_pressed
    $ G% D# ?' I; E
  394.         or      bx,4
    5 J/ Q7 T1 d7 h6 S5 H
  395.         jmp     no_left_button_change
    & l$ x' q! m8 b& X2 |# D  m; n: T1 C2 B
  396. left_button_pressed:
    : ~, s" X) p8 M6 a3 I9 y/ Z6 T
  397.         or      bx,28 R! g* }" i, B9 t  V
  398. no_left_button_change:
    4 D5 t% d" ?* P2 a! L2 t
  399. 4 D) a* W, c' Q* ~$ w) Z" i
  400.         mov     [temp_mask],bx
    ' z/ W5 p; B$ K' z2 j
  401. ; `' v; M; [+ X: m
  402. no_button_change:
    ; J5 o6 A/ h6 t  \2 ]
  403.         call    keyboard_read% R( }6 D$ s3 P7 {) V
  404.         cbw
    , o* K! B# t$ q+ T# f9 g
  405.         add     [pos_x],ax
    2 G& I" s, ?" q) x  O
  406.         add     [x_move],ax* X3 a7 F2 y! r( P2 z% m
  407.         mov     ax,[x_min]) E7 b7 a; M5 V" g2 {* `3 z+ B
  408.         cmp     [pos_x],ax) U' b2 g. a7 B4 e  U! D0 B2 q
  409.         jg      good_hor1
    ! M9 O- x, a' b' H. H/ p
  410.         mov     [pos_x],ax
    9 r  M' O! K2 Y0 t; F
  411. good_hor1:
    ( s, H8 h0 F+ P$ D9 i9 r3 ^+ W
  412.         mov     ax,[x_max]
    & X* a0 L; w( I: [7 V
  413.         cmp     [pos_x],ax, Z  u& D4 ?3 ?# T, @* n. r
  414.         jle     good_hor2- |+ ]5 N' U* [0 W
  415.         mov     [pos_x],ax
    " z- ]8 r( V: g/ r9 {+ O
  416. good_hor2:$ E0 O; a5 \" ]+ [3 Y+ j6 I$ `/ P
  417. 9 y* I1 l% C9 b
  418.         call    keyboard_read# D' b; N5 f+ q/ H3 Y
  419.         neg     al
    & S8 L. m- \9 J
  420.         cbw
    + {/ y9 X3 R7 k" O/ _& S  T
  421.         add     [pos_y],ax
    " Y& O) _, h4 A, g
  422.         add     [y_move],ax
    : b  o: e2 y" R9 k1 K7 L! {
  423.         mov     ax,[y_min]. B( c% r* t/ O% i8 v* h7 A
  424.         cmp     [pos_y],ax
    2 _! m- }: {4 m. k7 M
  425.         jg      good_ver1
    ; j* q# r) W  V1 m5 v
  426.         mov     [pos_y],ax
    ! U: ?4 |4 t) d/ M8 i% b  }- o: G
  427. good_ver1:* j6 V7 P. x; i8 w, [
  428.         mov     ax,[y_max]5 f$ b; k" c* T' t+ q: |
  429.         cmp     [pos_y],ax
      M9 g2 U2 y& i! E
  430.         jle     good_ver2
    - P3 y6 Z" F& k: W
  431.         mov     [pos_y],ax( M' l" b' R) m! f
  432. good_ver2:
    3 f  i5 F* |# n: K- J
  433. 9 q2 f1 x/ ]( I2 _
  434.         mov     ax,[x_move]: H6 R1 B0 i3 W: M* b  F
  435.         or      ax,[y_move]$ G" K' J8 B* v" f5 v
  436.         or      ax,ax8 C0 n8 w" l  a
  437.         jz      no_change_position
    5 J/ B3 r+ p) J8 b
  438.         or      word ptr [temp_mask],1
    1 @( c" k" N4 m) y0 P" j
  439. no_change_position:3 K- O% O) N% `$ Y$ X% L; r  o
  440. % p7 F1 z# ~" P. ?( G3 E/ f5 P
  441.         mov     ax,[temp_mask]
    4 j- ~  `: t0 L1 o7 k
  442.         and     ax,[user_mask]
    6 H) r2 k: l- Z) _
  443.         jz      no_call_user
    ' F/ x. A$ d) R/ r, {. s9 |
  444.         call    call_user_isr
    # r, G2 H/ B; N. t4 O$ e. r
  445. no_call_user:
      L) V8 x! l% O  f

  446. 0 T9 Z9 ?. T8 C# x$ [
  447.         cmp     byte ptr [sm_flag],1( |, p% y0 A- Y' R  ]
  448.         jne     no_show
    # f$ K) s3 V1 F+ v
  449. - Y6 T/ C+ K  M! L
  450.         shr     cx,3
      {# g) o' q6 f" u+ e- a, G
  451.         shr     dx,3: L/ v7 ^. k0 F
  452.         mov     ax,80: I! @" E/ @% f9 L
  453.         mul     dl
    0 B0 z* M9 N2 M3 `+ M
  454.         add     ax,cx
    " }8 @/ l1 \- C4 s8 M2 x2 ]; `6 D2 I( W
  455.         shl     ax,1
    * S/ t0 M  z: B  p2 W2 p6 h
  456.         mov     di,ax
    # j5 g( q7 q) ?6 o$ Z7 f* P4 H- }
  457.         mov     ax,0b800h
    0 k) [% i- q* S) ^# J8 t2 B
  458.         mov     es,ax
    + P# n! }! U! I7 h. n
  459.         mov     ax,[save_char]0 N, n% q. [, n) I+ O" u
  460.         stosw9 w$ T- y, I# B: j- l

  461. & m. p& t% e; v! s
  462.         mov     cx,[pos_x]
    # o0 G9 W9 ]2 x# m
  463.         mov     dx,[pos_y]
    9 b! U( g4 N4 V9 I5 u9 h
  464.         shr     cx,3% X- R2 t( u+ y
  465.         shr     dx,37 ~! \* {3 K- P% i6 j" E: l* ^
  466.         mov     ax,80# m% b4 b7 {/ M: w7 b+ E
  467.         mul     dl' J7 ~8 n' ~. i9 B) t2 X
  468.         add     ax,cx
    6 s9 O! X4 {* V! f
  469.         shl     ax,12 v. l$ |- }0 {6 c2 B& V  Y5 L
  470.         mov     di,ax
    % ^% w" C9 c: l& S  a) D5 c
  471.         mov     ax,0b800h
    7 H# |$ e4 m) u) i6 a
  472.         mov     es,ax
    ) h8 v5 h7 {7 [1 l/ y9 d9 J. e
  473.         mov     ax,es:[di]
    + A/ [5 s7 U8 _; T
  474.         mov     [save_char],ax
    6 O$ q2 Y' Y6 F
  475.         not     ah# f$ R# Q) e$ I! Z
  476.         and     ah,7fh& f! G' H  K; K$ q# H
  477.         stosw
    $ d& {/ ?$ q. K) ?3 [7 O- r
  478. no_show:
      p% _8 q$ A3 H; ^) a% C! ^7 H8 Z. o
  479.         mov     bl,0aeh
    : z( J) e  G3 a, V
  480.         call    keyboard_cmd
    $ Y: n9 B! \2 \
  481. # O0 s9 @  p; f$ f/ V0 ?' W0 z3 M
  482.         mov     al,20h
    * ~' V# ?) j3 w/ E
  483.         out     0a0h,al8 w% G, E  e9 h& ~6 W' ^: p) U
  484.         out     20h,al
    ( _1 h) Y$ ?/ B! B8 [5 ?+ L
  485. ( F! Z" t0 S2 J6 w1 ?1 Z$ R3 y
  486.         pop     ds
    7 C( r5 S+ H5 G* e* t* w) V
  487.         pop     es
    % f2 T& o: j% {
  488.         pop     si
    # S; y5 _% i& {7 V
  489.         pop     di% W7 n" P4 F# L
  490.         pop     dx
      ^$ V$ e# o8 o
  491.         pop     cx9 {( q' a  t4 }7 G$ H2 d5 p
  492.         pop     bx
    2 Q8 I( _$ f1 z) W. v6 ^: L, f
  493.         pop     ax3 ?, a" x3 ^' f( [2 V- \0 Z( W
  494.         popf
    + I  X# i% i+ D) u+ K5 a/ Y+ U( v
  495.         iret
    $ m9 u$ M5 ~8 \3 Z+ @

  496. $ Y0 S& y/ t% p! D0 f
  497. first_time      db      1
    # z' z% T9 t" B& F0 a$ ?$ a7 @
  498. buttons         db      0
    / D3 S9 e7 |1 b; d) C6 A  V; s
  499. pos_x           dw      0$ w' I7 [; t0 k, B8 x/ j% m8 J/ Y
  500. pos_y           dw      0$ [- H# q1 b7 ], Z- X& T
  501. sm_flag         dw      0
    # W. @! r  M4 h
  502. save_char       dw      0
    % l( d( U1 X7 e  T0 }
  503. x_move          dw      0
    $ p! z# O; K. o# N# _& i' ^
  504. y_move          dw      09 k% O, V4 h" o, Q6 G5 E) e: N
  505. x_max           dw      6397 R! y' c1 ?( u" u
  506. x_min           dw      0
    ) u9 A8 l0 V  N9 C/ l1 y! L7 q
  507. y_max           dw      199
    ( Z4 f8 s- C- I5 _
  508. y_min           dw      0
    % R, \+ E. g& S. D' W  B
  509. user_subroutine dw      0,0
    ' Q( Y8 [' |1 Y1 o
  510. user_mask       dw      00 q3 j7 S2 ?% u: a5 {/ Q
  511. temp_mask       dw      0
    ) P. h, C9 F5 p  l) g8 W

  512. + {0 g: J' C3 o" v+ e" T# R6 r
  513. keyboard_read:8 L6 v/ w1 O; n$ I! C7 F
  514.         push    cx
    " c- V1 S1 d7 ?: ~
  515.         push    dx
    3 f! F- I) n0 U& a
  516.         xor     cx,cx9 k9 p- o6 @  H" V4 k7 T
  517. key_read_loop:" K. J+ s0 S7 J% N7 n1 l
  518.         in      al,64h
    ! l0 h0 h; S' I" v- X7 b& D- a' G
  519.         jmp     $+22 Q9 C) C  d0 q1 i8 I
  520.         jmp     $+2
    6 ~% _# B7 ^' ^, _8 C- \7 D2 I' j
  521.         test    al,1
    4 U- j; |& o7 d9 G) P# {
  522.         jnz     key_read_ready+ R8 ^- x7 Z, G' `
  523.         loop    key_read_loop& {7 l( c# n3 m1 U' v5 v
  524.         mov     ah,1
    * k; W+ h; o- m; P' z+ T
  525.         jmp     key_read_exit
    3 i) e; b# U, v* Z2 e, {" T
  526. key_read_ready:
    % F7 A. ]; A) O& I7 u
  527.         push    cx
    ! t7 Z' S- j* p7 S$ g6 Z
  528.         mov     cx,32
    - I- @" q: B+ G9 |; `
  529. key_read_delay:
    , M  L3 |4 L2 P  |' Z- R# H
  530.         jmp     $+2) E/ J% N% o* K  W; a3 u5 d: t- j
  531.         jmp     $+2! a* w! `. T& {. ]7 P. R3 p
  532.         loop    key_read_delay' z& L& F0 J4 u, P4 g

  533. 7 X% m( U- O( ~
  534.         pop     cx
    2 Q2 Q" o. O8 F3 Y) n6 f$ Y! t

  535. 9 i8 o" u" y) C
  536.         in      al,60h
    2 i% w2 `# ?2 z/ U, U, ]
  537.         jmp     $+2
    0 z) M2 e/ {) G6 i" P, ^
  538.         jmp     $+2  v$ u6 S6 f8 {# v
  539.         xor     ah,ah& w8 L0 b8 h- X/ E7 d. l
  540. key_read_exit:
    & p$ o! {3 \# K7 P. k2 A
  541.         pop     dx0 y/ Z* |# L  B: z: }: F  ?% t
  542.         pop     cx0 S& z9 Q" d( N% m. e4 H+ A
  543.         ret
    - S# ]0 j' c+ b) V- t, ]) c$ w

  544. 0 e( }* l1 T, Y/ A# ~0 G+ U8 I
  545. keyboard_write:+ O6 p! H4 k% i. B
  546.         push    cx
    5 Z: A& c4 h( f9 b3 t8 ?  f
  547.         push    dx! U! J. N. a' t& l4 e6 F, Z
  548.         mov     dl,al. e  [/ p9 [6 A2 T, h9 e6 |# {
  549.         xor     cx,cx, m) k6 E. T! t; k+ V
  550. kbd_wrt_loop1:0 N! B9 T; M7 r* _3 x
  551.         in      al,64h
    0 v8 ]3 S& ]% r" @/ E2 D9 b5 X
  552.         jmp     $+2
    ; n* Q( K+ j  @1 E  }3 o
  553.         jmp     $+2
    3 Q0 F8 g& d6 Z8 h" k5 H0 `) e2 e
  554.         test    al,20h
    8 z: E! K& m7 y5 h) o, f4 F
  555.         jz      kbd_wrt_ok13 H+ z4 {/ v5 K. I, Y

  556. : T$ r6 O/ ^% r9 S# Q* k" d9 w8 T
  557.         loop    kbd_wrt_loop1
    " u& y: W* }; F3 d
  558. , I4 ?7 p  ?" T; x+ \
  559.         mov     ah,13 _! p0 r. r3 I/ @
  560.         jmp     kbd_wrt_exit( n% x' r2 h0 m7 N* I3 A$ ]

  561. $ ]+ z6 c" \/ V6 M2 C
  562. kbd_wrt_ok1:
    0 d) i, K: I- w% i( I
  563.         in      al,60h
      \5 A* Y8 n$ m5 B7 C

  564. 4 W* `9 X8 I( k0 c$ S% T# M' m
  565.         xor     cx,cx$ L9 D( ~7 S* w# U- P% a- D
  566. kbd_wrt_loop:+ I7 A( Z$ A5 z# r) W
  567.         in      al,64h
    * x; \' X( n6 G  M9 ^
  568.         jmp     $+21 g3 N0 B" U+ ^
  569.         jmp     $+2$ K# P) I. K6 \* c5 o" A
  570.         test    al,2
    + r- N3 S9 u0 T. R/ M: U# L! ?# T8 n
  571.         jz      kbd_wrt_ok
    0 A/ G! v7 }1 h! T
  572.   L6 F' a! k, O9 b% a
  573.         loop    kbd_wrt_loop
    8 G+ p3 v, B8 [) e1 x

  574. 3 H8 c. [1 w, F0 Q
  575.         mov     ah,1
    6 C: ^$ ?: Y2 Y* }( ?
  576.         jmp     kbd_wrt_exit* i' S7 G0 f0 N" ^  b

  577. # z1 P  h/ I. t7 ]; p1 j/ S
  578. kbd_wrt_ok:" u! _7 j; \. w8 n
  579.         mov     al,dl" _! S9 N) j; m. i
  580.         out     60h,al3 g/ P, T6 O0 Z1 Q6 z
  581.         jmp     $+2
    / \: D& }! W+ @1 @1 p$ l9 L
  582.         jmp     $+2! K$ Z6 z0 G; f9 r$ D. Q! k

  583. ! B% S1 t. l9 V9 r% B& V: \
  584.         xor     cx,cx
    ( c6 ~. d9 S4 }* Z0 `8 p6 ~9 i
  585. kbd_wrt_loop3:3 }, P6 p: E( f- [; C
  586.         in      al,64h1 [8 ?7 \: N+ G4 x8 D0 l
  587.         jmp     $+2
    8 R$ u  y8 ]/ d+ c
  588.         jmp     $+2
    6 O+ J1 K; C2 _" b; z
  589.         test    al,2/ V' h. N  K- z% c7 w0 g7 g
  590.         jz      kbd_wrt_ok3/ ]5 D- |9 y5 k( M2 `# V/ q" w5 x% {# T

  591. , s4 o2 S: ^+ V) u2 N6 O
  592.         loop    kbd_wrt_loop3
    ' \1 U* Q) T6 K5 N; w6 |* y
  593. ; V5 X$ k8 ^" b" ?# ?3 s
  594.         mov     ah,10 X6 m' C- v! Y! P
  595.         jmp     kbd_wrt_exit
    6 `9 }+ P+ Z, f$ W6 E- J" n) S  p; D
  596. 5 t7 i# h5 M* y
  597. kbd_wrt_ok3:
    ! p2 W4 N  H. C* E. v
  598.         mov     ah,8- N+ \$ w$ [* v% M* [. B
  599. kbd_wrt_loop4:
    $ D( [$ R& f8 g/ o
  600.         xor     cx,cx
    6 e7 n/ u9 ?2 U% y
  601. kbd_wrt_loop5:
    $ m$ v: `. Z6 `% {4 g3 G  v" I6 W( p
  602.         in      al,64h
    : A- ~' H" O( w2 j; i0 j' t
  603.         jmp     $+2% a+ M1 w: R  V# u" X& r
  604.         jmp     $+2
    # Z, s6 L% M) T- e
  605.         test    al,10 w) N. G9 K+ j: T' q6 N$ c
  606.         jnz     kbd_wrt_ok4
    4 F. \1 G6 Q3 O2 Q( _4 L& b

  607. " s: p+ x( p3 w2 J1 t
  608.         loop    kbd_wrt_loop5
    , C) N% \# T: T3 A5 l3 S* N  E
  609. * O$ e- u" j4 @. B1 t6 g: r
  610.         dec     ah
    # g: ?! G7 |0 H( y! V# @8 a$ U
  611.         jnz     kbd_wrt_loop4
    ' }* T/ o: L/ b' u2 ^. w

  612. . R0 }( H: E  c' B
  613. kbd_wrt_ok4:
    . }2 c* c! _% |1 _; I$ T
  614.         xor     ah,ah
    / L1 ?+ P+ R) M) l+ q3 F6 U# i; {
  615. kbd_wrt_exit:
    7 Q. r# \; O+ Z( l- }: s
  616.         pop     dx
    , I. U4 }# r, R' Q
  617.         pop     cx
    & l: b" Y: q( z$ ]
  618.         ret
    ) v6 A& {0 T* Y1 N; @/ |+ ^; ?- N
  619.         
    ) s( a. I) \# h8 J, h
  620. keyboard_cmd:
    * Y$ w3 M1 m5 s7 m8 L5 Z- E
  621.         xor     cx,cx1 O' O8 K4 p3 s9 s( P0 y
  622. cmd_wait:
    # G. D6 d9 C. p  E6 e7 U
  623.         in      al,64h. P2 k4 E. _$ Y" E& W6 \* P+ q* J, R
  624.         jmp     $+2
    5 J+ r. \! Z  W2 n: {6 o& f0 [1 b
  625.         jmp     $+2) D" A& D/ J* t* k9 F/ v: b
  626.         test    al,2
    6 O, k: W# k# E! R7 e
  627.         jz      cmd_send6 T* w) B9 Y6 y$ L, G! m* {$ b
  628.         loop    cmd_wait# f/ v7 J. W) P: R. f% x3 I' @, |* }

  629. * y( R1 K8 e" e- Q0 r
  630.         jmp     cmd_error1 N6 z! T6 u3 J5 W

  631. ! Y+ Z$ K2 E% e
  632. cmd_send:& O! M) |1 p& S4 s4 Z+ u/ _' T
  633.         mov     al,bl- [" s+ U" `; k* `0 [
  634.         out     64h,al7 s- g( a- E. x5 }
  635.         jmp     $+2
    1 _" W  [# Y! x+ B9 U
  636.         jmp     $+2
    : I( H& e  L1 Y* J# `

  637. $ v7 T$ N  R& f* p2 l
  638.         xor     cx,cx
    : T( m* }/ m! e
  639. cmd_accept:) y2 r( _+ {$ y' W1 q: |1 b
  640.         in      al,64h
    ) I" h: B: J) Q2 y
  641.         jmp     $+23 W5 Z: A0 q# r: u
  642.         jmp     $+2" R5 G4 |6 }$ j$ e# {+ I. v
  643.         test    al,2
    3 k' }/ X, B! S9 D+ Q' r
  644.         jz      cmd_ok" ^# @, ?% u6 l0 M4 Z* W, ~' U
  645.         loop    cmd_accept  J& b1 S% ~9 ~. A  h
  646. : X6 q6 ]. R  v9 f: v4 n
  647. cmd_error:" W3 b6 A  w0 H- E) U! d
  648.         mov     ah,1& y. q2 ?0 N1 v8 C7 M' L
  649.         jmp     cmd_exit: N0 H' S0 g2 U/ P0 ^) R9 Z' e3 l
  650. cmd_ok:
    + C$ h5 X2 M, t; a+ f
  651.         xor     ah,ah7 H0 g" t& w" U0 Z! V  N
  652. cmd_exit:
    $ w/ p% N/ g% F
  653.         ret! E/ S  t2 @% J2 g
  654. 8 u& y: V; a! Q5 z" ^7 b
  655. new_33:
    $ e) v+ K. f" Q! [8 r5 ~% j
  656.         cli3 S+ `3 f5 V' w: W2 g3 d+ I+ M
  657.         cmp     al,0( z) @# {' n, S, N$ U, Z$ r1 R
  658.         je      reset_mouse$ W; W1 g8 r5 {% y" O( l
  659.         cmp     al,1$ \/ e# Q) B4 t1 y4 o- Q
  660.         je      show_mouse7 P- R! k' K2 S2 R7 S+ v* P% c! H
  661.         cmp     al,23 I& S) b% Z5 a7 k- y) @, |
  662.         je      hide_mouse& [2 C, z4 O( M% x( l6 ?
  663.         cmp     al,3
    . P% O8 d0 Y& d" b' Q; p
  664.         je      get_pos
    1 ~3 [0 f5 |8 F7 w' }( n5 R
  665.         cmp     al,4
    ; V1 p6 `! P/ \7 L! m' ?
  666.         je      set_pos( R3 i- k5 ?3 F- t# L' {! `
  667.         cmp     al,7
    * H- s7 J- k# L$ }) i' o
  668.         je      set_hor_pos
    , b/ c/ ^3 K5 H
  669.         cmp     al,8
    ) O% D  M) A) Z0 w1 V) U
  670.         je      set_ver_pos5 C: D$ h; H: J. E, H5 v
  671.         cmp     al,0bh
    4 ~0 J/ o- Q' p% H
  672.         je      get_mouse_movement
    5 O. H7 n5 Z/ f& @: j6 m; c/ ~% h
  673.         cmp     al,0ch
    . ]; ~3 \$ F4 j  T% K3 V
  674.         je      set_subroutines% {4 P0 O/ ^& Q+ D0 N/ ]
  675.         cmp     al,14h5 M8 J  o: W, t: j
  676.         je      swap_subroutines* A' }, Y( g2 d4 i0 J
  677.         iret
      V; @( B: ~! v( v" N
  678. . a+ A5 v' W1 k0 J% r
  679. reset_mouse:% Q2 \( v6 h( V
  680.         jmp     _reset_mouse
    8 r% J! w7 e& O. z# D  p
  681. show_mouse:1 g9 Z* i6 d; `  a9 j& h$ L9 z
  682.         jmp     _show_mouse$ t! W/ \3 t# g( E
  683. hide_mouse:
    6 P( p& G9 U5 S  ^& k  Q
  684.         jmp     _hide_mouse
      j' V; ~! x; B1 H- Z$ L
  685. get_pos:
    4 r+ f4 S3 D, d! X
  686.         jmp     _get_pos
      ]' I+ ?% y# `" O9 E1 J4 T
  687. set_pos:% y# _$ H! }! S. l
  688.         jmp     _set_pos
    " ]$ i0 \  m2 s* e4 O* ~
  689. set_hor_pos:
    ; x. X" g) U+ t
  690.         jmp     _set_hor_pos
    # ]1 t  o# k& ~* n+ I/ d5 B2 Y* h
  691. set_ver_pos:
    * d2 V/ K; ?, t* a5 U& J
  692.         jmp     _set_ver_pos+ D* n' Y* `1 q9 K. S; d3 w3 L
  693. get_mouse_movement:! C$ ]& E! m6 h' b
  694.         jmp     _get_mouse_movement& ~2 [5 M$ d" H  p1 W
  695. set_subroutines:
    6 }% e  t/ ~) _5 F/ d, a
  696.         jmp     _set_subroutines2 B& f" Q( w: i* t0 E
  697. swap_subroutines:
    - Y; D( ^2 W/ D0 O/ B6 Q
  698.         jmp     _swap_subroutines
    ! a8 {4 v8 {5 I4 H
  699. & `) Z3 A6 x0 E* E# f
  700. _reset_mouse:
    / d& e: X) L8 Q% l4 f
  701.         mov     byte ptr cs:[buttons],0
    ) G+ s5 M, b  w7 M8 D0 k7 o
  702.         mov     word ptr cs:[pos_x],0
    : v& B& o' ]& b. P" n
  703.         mov     word ptr cs:[pos_y],0
    ) [0 B) Q  y( V
  704.         mov     word ptr cs:[x_move],0" B" L2 [  }+ r! ^( f: s
  705.         mov     word ptr cs:[y_move],0
    9 C# d' O( y7 z6 K' n
  706.         mov     word ptr cs:[x_max],639/ p) S! I# W6 y' ^
  707.         mov     word ptr cs:[x_min],0: s9 c+ Z. T& b  [# ?7 {# `9 f
  708.         mov     word ptr cs:[y_max],1993 w8 T7 b: v7 C& _5 D$ z
  709.         mov     word ptr cs:[y_min],0
    * p7 ?( z# L. t
  710.         mov     word ptr cs:[user_mask],0
    ; ~: n3 k# M8 e- \. e
  711.         mov     word ptr cs:[user_subroutine],0
    . K4 d6 k- P) S( u- N4 N8 _: y
  712.         mov     word ptr cs:[user_subroutine+2],06 M& X3 [# ?1 E) [6 }* S& M
  713.         mov     ax,0ffffh
    ' c! g3 G! V6 u1 n
  714.         mov     bx,3' ^  X7 D6 W" I; U
  715.         iret
    0 `& z$ n( H* K1 H

  716. $ @" l( H+ g, t( e% R7 W' F, [
  717. _get_pos:: e+ @! |. ?6 P
  718.         mov     cx,cs:[pos_x]
    % [3 F: S! e5 M
  719.         mov     dx,cs:[pos_y]
    / n4 b1 m  o( o1 W
  720.         mov     bx,word ptr cs:[buttons]1 R+ C* U  z* B+ k; y# S1 a/ \
  721.         xor     bh,bh/ f7 T- m; r* @: `7 v
  722.         iret3 @8 d2 R* f8 \; X- q& y) S: i8 ]

  723. % I# v+ c0 r8 d3 a
  724. _get_mouse_movement:
    7 n8 G) \# T+ i- ^' c7 H- q* O0 y
  725.         mov     cx,cs:[x_move]7 @. t: Q. A$ L. s: P  n
  726.         mov     dx,cs:[y_move]9 b( H$ j' r* s( L
  727.         mov     word ptr cs:[x_move],0! i- C, j  c1 I" }  b( e
  728.         mov     word ptr cs:[y_move],0: B. N8 W% _6 Y: T3 H
  729.         iret" Y: W3 A, @7 J0 {$ x$ G1 A) E

  730. 7 X" }$ ]. t  l% s
  731. _show_mouse:
    % _  N+ r2 `3 [
  732.         push    ax
    5 I& `% M/ D) G9 Q6 {  v2 i; m1 A+ j
  733.         push    bx5 c, N' n( ?7 O2 q
  734.         push    di
      Z) D5 g/ n1 |- f% r
  735.         push    es9 f6 Y! j* u& e/ N0 |4 h8 L0 \
  736.         mov     byte ptr cs:[sm_flag],1- i( `* N8 {$ z$ u
  737.         mov     ax,cs:[pos_y]( u2 H: u% N, T( u
  738.         shr     ax,36 A* E) A) V0 q8 C5 b5 `2 p
  739.         mov     bl,80
    6 }# N0 y% n/ }, v1 `8 Q; J+ N
  740.         mul     bl
    * Z7 u  T3 [  \
  741.         mov     bx,[pos_x], Q# ]' p  f1 F6 J+ y
  742.         shr     bx,3  N2 w; P3 X2 W' I; h% g: j6 g
  743.         add     ax,bx0 t& U& q' W/ M7 _
  744.         shl     ax,1
    & o( `8 v" G8 a+ I9 C; ~) X
  745.         mov     di,ax
    0 m5 Y/ n, p* ^/ i' M
  746.         mov     ax,0b800h
    ! A* h0 [' N0 m2 a# E6 S+ ?% T6 k
  747.         mov     es,ax
    7 a: t  y9 z8 q
  748.         mov     ax,es:[di]4 t! q0 t1 ]  U& X; K2 M- Y
  749.         mov     cs:[save_char],ax
    8 h1 s& E7 l+ S6 W( n8 }
  750.         not     ah
    - T# A5 p# m9 f3 T
  751.         and     ah,7fh  n/ |! }# u  F1 A8 h% u
  752.         mov     es:[di],ax+ v, T9 A: a! {
  753.         pop     es4 l& g3 x8 ?" i
  754.         pop     di
    % L, h) T( l2 a* f; H7 G
  755.         pop     bx
    # H# I2 Y8 p; o. R# ~# C3 L9 \4 A# u( R
  756.         pop     ax1 c  F8 v" ?. d' p
  757.         iret
    2 n5 t& P8 y- Z8 o$ R
  758. * m+ V' \2 i) E, ?/ N5 w
  759. _hide_mouse:5 l. @1 L9 F3 s' I) S2 W; ~8 }  u7 y
  760.         push    ax
      d+ P  r4 O. j
  761.         push    bx
    ! T; C8 w, g0 r( A, T1 {$ D
  762.         push    di
    3 a% D: Z2 T3 s! C
  763.         push    es% ]& Y! n8 t8 f) l' h8 ]: N; o
  764.         mov     byte ptr cs:[sm_flag],0
    / H. Z+ ~7 E' `5 l2 c
  765.         mov     ax,cs:[pos_y]
    , _# D4 i6 e3 h+ d( _& b% h
  766.         shr     ax,3# {0 Q4 r" W/ {
  767.         mov     bl,80
    ; ^7 d/ `, }  F/ O% ]# v
  768.         mul     bl% D+ \8 @7 V; W6 ^
  769.         mov     bx,[pos_x]
    , b  |! z- Y, I5 F& g8 v& b0 G1 W9 k
  770.         shr     bx,3
    3 ^  k* {: W; R$ K' C
  771.         add     ax,bx
    . J7 s8 c- t8 }. Z' p2 ?5 r1 f
  772.         shl     ax,1
    . c* Z. i# d: d6 Q, Z* A
  773.         mov     di,ax
    3 q, T" h# G( H0 K2 D/ d6 e) ?
  774.         mov     ax,0b800h" c1 d# c+ e) F0 J2 P- \6 j
  775.         mov     es,ax( H+ B. \9 e; @8 B' }
  776.         mov     ax,cs:[save_char]
    2 b8 F+ G4 Q) \/ r4 _; b
  777.         mov     es:[di],ax2 ]4 _, T- |1 _
  778.         pop     es
    " s6 s1 s' e, T8 I' q3 E* w4 T
  779.         pop     di
    ) x: K# H. N  J1 W2 V9 A
  780.         pop     bx
    & O* `1 v, y- H
  781.         pop     ax; H! c; T! T& N5 n- b0 Y6 f
  782.         iret6 z5 \* {  d5 m" _) F; _
  783. 3 N. ]. q# J+ l" }% L. g9 E
  784. _set_pos:( e3 d) g0 B; B8 Y9 }1 g
  785.         mov     cx,cs:[pos_x]
    . H8 n( d( M0 g; P# I) p( a% n
  786.         mov     dx,cs:[pos_y]
    ) r" L; K4 }% t
  787.         mov     word ptr cs:[x_move],0" R3 [# @: j1 ]: A2 x# |
  788.         mov     word ptr cs:[y_move],01 C+ H* S- p0 N$ m! N9 b
  789.         iret
    8 o; {% I" Q* n$ I

  790. 1 D2 L& m! P! `" P; X) x: S# |+ K0 E
  791. _set_hor_pos:
    6 h( I; X! m" u( F# S$ e& X4 q8 m
  792.         call    max_min# I/ B) C' E, w: m
  793.         mov     cs:[x_min],cx
    . ~* V$ V7 q5 [4 h
  794.         mov     cs:[x_max],dx  ^0 n  o" r9 a
  795.         cmp     cs:[pos_x],cx
    0 {. L8 \( R% H
  796.         jge     good_hor_min' ^- H& K1 V0 k  A- p
  797.         mov     cs:[pos_x],cx6 h! p' q& `* f$ p. ?, h) B
  798. good_hor_min:
    + X) C4 F% I  l8 R* r" _
  799.         cmp     cs:[pos_x],dx
    $ ]9 X; B: Y, g
  800.         jle     good_hor_max- B$ j6 J* N2 }1 f) i" L
  801.         mov     cs:[pos_x],dx
    & t+ O4 H3 n# i9 n( [
  802. good_hor_max:) S* N! f+ [# i4 O4 M3 u- b& N
  803.        iret
    3 d$ j: ?8 P" D1 Q

  804. 3 P8 B$ }" m7 p! M3 w2 o7 s4 x7 h, Q" v
  805. _set_ver_pos:" H9 @$ I2 z4 u" l; x* E
  806.         call    max_min
    # D; L& k+ R& Z5 P# j' u; W+ s
  807.         mov     cs:[y_min],cx
    9 _. x. ~2 A: d0 X+ k
  808.         mov     cs:[y_max],dx
    + |. ^, z+ \: T2 N0 I) h
  809.         cmp     cs:[pos_y],cx
    4 C+ J* V( ]' J- }2 P  ~, B/ h
  810.         jge     good_ver_min
    + l% b1 L* g# H% U  e' w! h6 p5 W
  811.         mov     cs:[pos_y],cx; e/ ^& Z0 E# O6 d, z
  812. good_ver_min:
    % Q3 g% u2 v+ V1 e1 J
  813.         cmp     cs:[pos_y],dx
    ( z- n( g* d6 Y' Q
  814.         jle     good_ver_max* E' l2 d( R: B6 J) V4 ~
  815.         mov     cs:[pos_y],dx
    1 {8 r3 L$ S2 \' T
  816. good_ver_max:
    # ?" ^  L3 J9 h* w- m8 G
  817.         iret. Q- X; g% ?- T0 W" w

  818. ( Q8 x, \, k! V: ^' b4 I
  819. max_min:( M, @! Y3 w$ B/ w' a; o
  820.         cmp     cx,dx+ [. {: @+ }9 o/ q! |: X
  821.         jle     no_swap
    , {, j2 s# ^8 F& V+ f( ?. {. ^
  822.         xchg    cx,dx5 E, F+ E9 ]8 n: v- {' q8 V; g" c
  823. no_swap:" N& @; A6 l* {6 i6 _" E
  824.         ret, c% V; c* S& ]- |% r, T
  825. ' g* p) W8 u( _, s# M# h/ c
  826. _set_subroutines:
    3 l. e6 l* l+ W4 I1 s; x
  827.         mov     cs:[user_subroutine],dx+ H1 S# R' m: M, c
  828.         mov     cs:[user_subroutine+2],es
    $ M# E1 {2 K) d( N' f) K
  829.         mov     cs:[user_mask],cx
    ; c/ w7 N; O3 {0 U; b- N6 j- J
  830.         iret
    ' |& s+ `$ i+ b7 ]- {; O
  831. - f( u% e; m" S2 |& U
  832. _swap_subroutines:
    , p" a6 n. ?0 D( G0 d+ p9 ?( X
  833.         push    word ptr cs:[user_mask]2 T1 e. [4 D; S4 [+ j
  834.         push    word ptr cs:[user_subroutine+2]
      S' p" i- }' Q: w5 E9 D
  835.         push    word ptr cs:[user_subroutine]
    ( g3 w% y# e5 F" S$ K
  836.         mov     cs:[user_subroutine],dx
    ' m% D% d( v) G
  837.         mov     cs:[user_subroutine+2],es
    6 T0 h. Z% F- Q/ y9 z8 E
  838.         mov     cs:[user_mask],cx$ ]% h5 R+ Y* i+ r% p! e
  839.         pop     dx
    3 h# E( c% u9 Y' ^2 y( e- {2 m2 [
  840.         pop     es# p$ \  f$ ~. X" O9 g( d+ {6 y1 z
  841.         pop     cx
    ; F9 H" T* P7 Q: @. j
  842.         iret
      G- F1 W$ A! y2 R

  843. * u# T2 x3 E/ n# l
  844. memmouse        endp
    8 i: `* B* G8 \1 c- F

  845. 0 I$ |7 G: k. \+ D8 W
  846. endof_start:
    8 ]1 j! E5 b+ h( c

  847. # S, ?" }9 G( d: |3 ?4 `$ M) \
  848. emsg db 'No mouse driver install error!$'
    ) H' x  C* R' C
  849. old331 dw 0
    + t0 }% O5 Y: [5 I3 B
  850. old332 dw 0
    / F1 ^, }$ C- b2 U. m! U
  851. old741 dw 08 Z. @& X6 h( B7 g5 F- D0 m
  852. old742 dw 0
    : A2 j. Z2 V$ ~0 L& [
  853. memcopy db 0( Y& @3 [9 M* T1 ^% c
  854. okcheck db 0
    , s% h1 g) r# ?2 n1 F7 W& C
  855. pass db 04 S4 K. x/ W7 S
  856. chkl db 0
    2 y0 l; w. g! R# S
  857. lk db 0
    3 O" J3 n/ j" i
  858. chkr db 0! f5 a3 I  g( Z2 f5 A' o& }3 n
  859. rk db 06 v# ]" e* _5 l% x! e
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    7 \. X7 l" Q2 W  F" L* m/ V
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    3 o# p" f: x% R" h
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ') {8 E/ M7 Q9 I, A/ I( ^
  863. db '                                                                                '
    ; }$ i6 Q) ?: O+ c
  864. db '                                赏屯屯簧屯屯突                                  '
    2 f. i% V7 c. Y3 e" P
  865.         db      '                                ?OFF汉OFF?                                 '& S( g$ m6 Z6 I
  866. db      '                                韧屯屯既屯屯图                                  '
    , E/ b& K: q# {( a' T) r# v! ]' j
  867. db '                                                                                '
    2 n8 M3 w# Q/ K8 c2 u
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '" E6 ?. n: }7 J2 X
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    # |% p9 e* y+ c
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    " m; P# ^4 r0 o; B/ D6 H8 Q" z
  871. ) n; F3 t7 K7 l
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
( J  t( d, V  o/ j9 X( w哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 2 k7 e" w3 s% i1 a

, e! l" e$ o8 k' K9 m' y谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:38 , Processed in 0.121248 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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