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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
2 G# [* o0 D8 M( G8 k; H; L& Y. z) _5 O. \; J) U
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    0 S" N% U3 L% |# A4 D4 ?" x
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    $ r# q' @6 E% f; r, s5 P8 W, V5 U
  3. ;                                         By Bini.Yi 易祝兵
    $ ^" r7 f: V1 o) E4 a9 ~
  4. ;                                         http://www.ufoit.com 计匠网
    * |: t! n8 j$ f4 f6 V
  5. ;                                         2002/04/06 YYYY/MM/DD
    8 ]0 Z9 l1 v7 k7 c' {8 ?2 F& S
  6. ;
    ( h* |* U8 ^# Q# a( u2 ^* |
  7. ;         
    + T0 _; ^" a' r2 }  r. O% Q
  8. ;          This program  test the mouse button  click and move.
    0 q* A: ~% M- U1 ?- D9 _' ^
  9. ;
    5 j, ~* L# V0 U& l& G5 K, y

  10. 8 L7 @& ?: ^7 a9 h' A
  11. .model tiny
    " j9 X5 F! A( }4 Q9 P
  12. .586" v0 O! x& v+ d) l: `- T6 y5 e: I! j8 r
  13. .code+ ]1 h3 O0 w0 ^0 v+ i
  14. .stack  100h
    * _. j) |; f  C4 l5 ~8 b
  15. .startup) r  R& y9 }" b+ S# }" t: y
  16. pusha! P7 o1 g  T9 k# D! @
  17. mov ax, 3533h
    - O' y/ X2 P5 [; |& i
  18. int 21h
    / i  R' b' z" j$ D+ n% C: C- S& J
  19. mov word ptr cs:[old331],es& u  Z8 X0 _0 y- `$ j; N' B3 a
  20. mov word ptr cs:[old332],bx
    5 `* U& W, n7 I4 E% x
  21. mov ax, 3574h
    8 _4 W+ a9 i* J1 x
  22. int 21h
    2 \9 F: z+ q! V( D$ [# e$ _
  23. mov word ptr cs:[old741],es
    3 B# e0 N3 o( }
  24. mov word ptr cs:[old742],bx
    2 U6 z+ s# }6 g  n8 q' d
  25. popa
    0 G) Z$ m, n' k; {. s0 v
  26.         call    memmouse$ \( _" {6 s$ K+ U# a' g' p; S
  27.         mov ah, 00  `4 E  d. E, d  U6 h+ s7 i
  28. mov al, 03
    . |6 M& G) b( p4 ?. b
  29. int 10h
    7 J4 @8 n9 l2 S6 I, ~
  30. mov ah, 06
    9 `: C4 ~/ ^) x
  31. mov al, 0
    6 M3 Y2 C1 x) }, ~% u4 [  ?
  32. mov cx, 0
    % C5 C% k0 H6 l* _# M
  33. mov dh, 24
    * ?; P' i0 z- q! P% X/ m
  34. mov dl, 79
    . n7 n5 j9 _- H* {- k
  35. mov bh, 07h" s' [- f# D6 o$ m" G0 A( M3 d4 p. z
  36. int 10h! l- ^2 ~+ h3 I' D6 z
  37. mov ax, 0000
    - d' h  N) M5 z/ o6 b0 x# A( v
  38. mov bx, 0002! [6 k5 w: o8 n- V7 R0 N! J( c1 h
  39. int 33h
    8 l; j, H& q( n3 Q' r5 a
  40.         cmp     ax, 0000           ;if no mouse drive install
    % j9 b  s2 r, ~) M/ y. [
  41.         je      errormsg           ;show error MSG0 K( S! F- t' S( @
  42. mov ah, 02
    - H. i  q7 U5 [$ T
  43. mov bh, 00
    4 }4 A! L( u0 i4 c
  44.         mov     dh, 25             ;Move point out screen1 D& z# c# D& }; g
  45. mov dl, 79/ x. ]; l$ d. R1 E8 R
  46. int 10h' D( c3 ^- t; ~" A* K: n4 ^
  47.         call    showmsg            ;Show info7 g- t; u5 g4 i5 S! Z" R
  48. mov ax, 00017 H2 S' R4 F% A0 m
  49. int 33h
    : O- W5 X  N4 x* T, A1 ]+ G
  50. ; mov ax, 000ah$ a8 M# `9 o  p6 w, V! a
  51. ; mov bx, 0000
    & t2 x/ r8 l+ ~9 M3 h/ A! ]. F
  52. ; mov cl, 0h, E8 j% ^0 g, k# B( u
  53. ; mov ch, 0F0h, t7 L/ O9 D7 o/ Z" U
  54. ; mov dl, 0h
    : g) W7 X* Q; B4 p- v, c: y6 Z
  55. ; mov dh, 0F0h
    ! r' C8 N1 q0 D
  56. ; int 33h0 x0 s2 Y) Z" a( \2 z7 c# E8 Q6 U
  57. mov ax, 0004h+ g, i* I! v: v' Q5 ^: t, S! D2 M
  58. mov cx, 0319
    / \' i& w" g  N8 t
  59. mov dx, 0103
    , @  g6 T8 G9 w: e
  60. int 33h
    + M1 B$ M* {; a$ v
  61. casemo:                           ;Case button click and point move
    8 ^! E2 z. {0 _
  62.         mov     ax, 000bh         ;and keyboard press- j  D4 k( |. r7 m- l7 B  V
  63. int 33h6 {! Z, Q" n2 d
  64.         cmp     cx, 00h           ;if point move....X
    + _4 ^5 J9 _! I
  65. jne xmov
    + u7 @( A8 B/ g' F* V
  66.         cmp     dx, 00h           ;if point move....Y
    , \7 }$ ~) Z& `2 y9 z4 C
  67. jne ymov
    $ F! |% D1 L4 |) `8 d
  68. xymovend:                         ;X.Y move end
    ! R( o6 e. x5 `% S7 |0 @+ }- V
  69.         mov     ax, 0003          : }- Y- r) w$ y6 G7 ~) Y
  70. int 33h: M# [5 t) Y& i9 M
  71.         cmp     bx, 0001          ;if left button click  show ON
    4 S- A' h! h  U% _7 Z
  72. mov si, 1828
    1 S7 i% I$ t$ L  ]* x. b$ B
  73. je listl
    2 b! p* y3 r3 ^2 B% y7 b1 `) f
  74. mov si, 18286 v8 e: c8 y9 l, l
  75.         jne     nlistl            ;if left no click show OFF
    4 I* B) F2 E4 P8 c! ]  G$ y$ D
  76. testr:9 ~: f1 h, t" @
  77.         cmp     bx, 0002          ;if right button click show ON
      a2 k1 b# J4 o* a$ s6 D& z
  78. mov si,1842
    5 m5 x( r: w+ s9 P# w8 }( y
  79. je listr9 w  M. W( M: B6 h+ F" F6 F, H- U
  80.         mov     si,1842           ;if right no click show OFF: T) d8 l; D: W
  81. jne nlistl' M  k, p4 e/ f& A; @2 l! @  Z0 J
  82. casekey:+ X2 g0 D( A/ m2 c
  83.         mov     ah, 01            ;if any key press jump check
    9 N$ J% X% X, R* B0 E
  84. int 16h
    6 a5 b( t' z. [
  85. jne kpress
    % C" L; ]* f6 L
  86.         mov     al, [chkl]        ;check x flag: R, j# w% T) f; Q' o
  87. cmp al, 02h
    - |: Q* ~! w& x
  88. jnb chkok
    : L  ]2 q+ {& s0 @" l( Q' d5 N
  89. jmp casemo
      b% y+ V2 ]) u+ u# ]
  90. xmov:                             ;if X moved, get the X flag+1: o( t/ ~; v2 D' X0 E1 y2 K
  91. mov al, [chkl]
      x4 \) F8 Q2 V9 }- W" L+ u
  92. inc al
    * O# }1 y$ y. \; j/ ^1 G
  93. mov [chkl], al
    . |# M. F( [. y. c/ [' M
  94. call passok9 d( d* k* c3 B* R- _& M' k
  95. jmp xymovend
    $ X6 A2 @: T# p) P3 t! \1 a$ [) d" f
  96. ymov:                             ;if Y moved, get the X flag+1' J9 l6 F# l- P, N2 C: B! g' W% V. V
  97. mov al, [chkr]+ g3 _3 R7 u4 L& j* T3 x
  98. inc al
    8 K1 S2 n3 @" F. J4 ]; u( A
  99. mov [chkr], al/ D3 v, b' w! }# [: o4 A
  100. call passok! T! U. Q9 g: ]- ?! m1 j$ ^
  101. jmp xymovend
    $ Z# h' Z2 |" X

  102. 7 q4 m) g+ M8 R/ j; {# h& t$ D% O5 i
  103. passok proc near
    , z/ o" x: E7 Z1 _
  104. mov al, [okcheck]: K+ [( @+ [; t) o
  105. cmp al, 1
    - f& m6 i. B8 S: H, l; S3 b, d3 L/ h/ Z$ m
  106. je let0
    ) h5 J, Y, U9 e! G' H0 ]2 m5 U! [& Z5 C
  107. jmp passret
    3 }: i: M) f9 z1 N' z$ a
  108. let0:
    ( p' C6 c  g  t7 X; N$ V# N, T4 g
  109. mov [pass], 19 S1 }8 `6 k8 t7 v) [* W$ I
  110. passret:' D6 k0 w; E8 F& \6 d$ i
  111. ret
    6 i8 f! ^0 l- `* F
  112. passok endp 4 u8 |8 m# [3 V0 m! z7 T2 ~
  113. , e; G( L2 Y' z9 p0 P7 y
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS' a; u8 s  [: Q' m" J2 h+ p
  115. mov al, [chkr]
    , w& P8 E4 L/ J% h' u
  116. cmp al, 02h
    7 e0 K' }6 G6 @" U& G6 e
  117. jb casemo
    5 K$ L4 \" T. l# f
  118. mov al, [lk]
    8 ^0 o  R0 T9 p! E4 e( }% ?/ z* [- a
  119. cmp al, 1
    9 f* [4 }; P7 ?' W( G
  120. jne casemo* Q3 J# Z+ D* V* G$ u* s7 D
  121. mov al, [rk]
    # B# S- S8 R3 e  a: i1 ]
  122. cmp al, 1+ i0 o3 E4 c  F  C$ p
  123. jne  casemo' H4 a0 z/ K$ v
  124. mov [okcheck], 1
    & S& D) d* @% ?- |
  125. mov al, [pass]
    ' D. t1 ?  }5 t( }4 Q
  126. cmp al, 13 l" Y- L5 ]2 }2 C
  127. jne  casemo4 X2 y5 {& M4 t% i" m
  128. mov ax,0002h& O: K) k. E$ f7 u& s* T
  129. int 33h$ A. C- f* Z% E1 Q
  130. call cleascr
    . N, V: D4 {+ }* J4 c
  131. , y: }. t! [3 F! L. E' |- |
  132. call oldint. q0 E& U+ V3 }" Z' H
  133. mov ax, 04c00h* z8 Y6 c6 M; w( M. s
  134. int 21h5 P# a9 h5 d: A! |+ y+ O

  135. ) _6 o# T. l3 k
  136. okexit:
    / S, Q3 |& b! _$ k" {; o6 p5 n
  137. mov ah, 4ch1 i: B. s1 U2 ~' v
  138. mov al, 03 ^+ R; q- [$ Y, v/ G
  139. int 21h7 A/ n7 H5 I( p; ^4 Z2 R/ |1 x
  140. listl:                                 ;Show ON
    0 j- r- J0 p3 u
  141. pusha+ q8 y! P# u; d
  142. mov ax, 0b800h
    1 z  b8 O4 V% g& m6 h
  143. mov  es, ax2 j2 \- |3 z7 C
  144. mov ah, 47h
    - E, J: ]& w1 D7 R, b3 y
  145. mov al, 20h
    0 B! g4 b( \1 I! `& y- r; u
  146. mov es:[si], ax
    7 l5 j/ E  \% M/ n
  147. add si, 02" v5 s3 o) D* y( K$ m, t% O
  148. mov  al, 4fh
    6 c5 O5 i- Y7 y: A
  149. mov es:[si], ax
    3 ]( z# N5 V' \/ e5 _) d( E$ s) l  w
  150. mov al, 4eh- I) ]9 i! ^1 P! O; M
  151. add si, 02/ y1 y1 h' _; I6 ?: s0 z
  152. mov es:[si], ax
      x* N. B# @4 H' D1 e. t* d
  153. mov [lk], 1
    ) s: G$ w6 K$ h; ^9 p) C
  154. popa
    / R1 I: f$ S5 l
  155. jmp testr- |  R% w- i+ u; f! V% s
  156. listr:                                 ;Show ON
    , e& U! w; y( V. i9 V% [. R; m
  157. pusha
      t$ Q8 h: u" o
  158. mov ax, 0b800h
    2 {3 ^  a; p* v% }  |6 C/ n
  159. mov  es, ax8 W4 q0 m! Q0 R7 p
  160. mov ah, 47h, m6 H& r! y/ p: u5 z
  161. mov al, 20h
    % i9 v- @6 \. {+ ?2 a: t9 S
  162. mov es:[si], ax6 X6 a6 E# {) c, Y, e4 ]0 ?; U7 }9 |
  163. add si, 02* Y  p* h+ n  }- ~# Z/ C# x* N
  164. mov  al, 4fh
    ( j2 C7 ]# J! q4 P: T  ?
  165. mov es:[si], ax
    " z! U9 f, f& H7 K
  166. mov al, 4eh9 K3 e. [9 F( |8 p( w
  167. add si, 02
    % ~/ L. Z6 \  v/ r9 U2 N
  168. mov es:[si], ax9 z) K# ?# c( W& k0 M
  169. mov [rk], 1
    $ A5 I; {# N+ g# h3 P- x( a
  170. popa
    5 [+ d5 N/ b) {$ \# o' l+ _- T
  171. jmp  casekey" z: R; w% _# D3 d( J

  172. ) t' ~4 {3 v: u7 F6 b" Z
  173. nlistl:                              ;Show OFF
    & Z! Y5 \& g$ `5 \
  174. pusha   
    / Y" l; x6 o5 {4 f
  175. mov ax, 0b800h9 [7 C7 d. a. v) {9 Y
  176. mov  es, ax
    % R' i& v: [! u5 u1 b
  177. mov ah, 17h
    , i/ N8 F2 g. Q  X
  178. mov al, 4fh
      J" ?: u7 I5 q
  179. mov es:[si], ax
    ) W3 g) n2 T8 ?! I8 W
  180. add si, 02! T1 G. [* N) J
  181. mov  al, 46h6 O" e& c2 ^- g
  182. mov es:[si], ax
    . l& \# b$ f4 g3 m# m- `
  183. mov al, 46h
    / @+ }, @' d! S) q5 _  V. e4 a( v
  184. add si, 02
    : C% ^2 }' @" r- O2 R
  185. mov es:[si], ax
    % ~" f& O9 g8 ^9 V
  186. popa
    4 d! E/ i9 p/ ^; p% @* \/ ?' Q
  187. cmp si, 1840# j4 z; l- ]  L( |
  188. jae casekey# l  X4 e" B) P" V
  189. jmp testr6 w. z9 d; s1 v
  190. 3 U! F& [1 ?1 K& k5 n$ \
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    6 N; C. p0 M5 ^  F7 Z4 _5 V
  192.         cmp     ah, 01h             ;and return a error
    1 @( a) Y, l) B0 O$ f
  193. je exit1
    , u" d' W$ \1 `6 g. X  i1 ~
  194.         mov     ah, 0ch             ;if press other key then clear
    ( d- o- p- p; _5 [, n
  195.         mov     al, 00              ;keyboard buffer
    7 @1 M  w; Y4 p! m! P7 S4 @- y
  196. int 21h6 m% R. Z4 Z) b& P& z0 p
  197. jmp casemo
    , u: U# w- j, t1 g
  198. 8 L( a/ C6 _  d
  199. errormsg:                           ;if mouse driver no install9 R/ P1 Y1 r2 e6 @6 J$ j2 ?
  200. call oldint5 W7 s9 @% j3 `* O  n
  201. lea dx, offset emsg
    ' {( p, f6 d; `8 s
  202. mov ah, 09h  N# t4 t1 ?& J# R! _
  203. int 21h
    9 A4 H8 \  P& M! w' Z  r
  204. mov ah, 4ch
    0 \, n# _* h( E
  205. mov al, 2
    6 @7 z1 v' \' b2 ^/ c6 j
  206. int  21h
    , M" y+ Q+ I+ i1 W. r% B
  207. * \" V6 a4 N% d! ~% P# N
  208. exit1:                              ;error exit
    ) G" G+ N% H, N2 T+ L* W! d4 ]9 o
  209. mov ax, 0002h
    - E- z- [4 o; m( K" H( V& M; M
  210. int 33h
    - _0 g( y* W- o1 E' u* q& _! b3 J
  211. call  cleascr
    & u! m8 f2 d/ a7 }% z; P
  212. call  oldint4 }0 X. c+ V  @3 P; ]
  213. mov ah, 4ch4 t8 v3 }, w, s# |
  214. mov al, 01
    5 ]8 }$ ~5 B7 q
  215. int 21h
    0 q4 `+ x( y' L
  216. 1 r9 ~! N9 d& ]) x) o$ O$ g; `$ W
  217. cleascr proc    near                ;clear screen
    - ^$ ^4 l& g2 Z; G0 B& z
  218. pusha. T3 }7 x. u  d. k5 z5 [- Y. X
  219. mov ah, 065 Y8 K, R0 _% T
  220. mov al, 0
    , Y; y3 W# B. U; w  K1 t) h. E5 ^$ U
  221. mov cx, 0$ r& b* a% R2 M2 ]# R7 \* {
  222. mov dh, 24
    3 j& R  {+ \  l$ `
  223. mov dl, 79! h. p3 ^/ L. j  l0 L: G
  224. mov bh, 07h
    # F7 E3 X6 \# W$ P& L# t
  225. int 10h
    ; [4 q" R% H) d) w3 [1 q, X/ Q
  226. mov ah, 02. t- O1 z3 X: Y% h: m
  227. mov bh, 005 m' a0 h) o& o2 ?0 b9 A( m# ~
  228. mov dh, 06 h1 |$ R6 i% R. |4 f6 p
  229. mov dl, 0
    % P5 z7 g/ o/ b" F# W
  230. int 10h% L8 q6 Q5 e; t( m" Z
  231. popa4 h& [) z% i) ]# A
  232. ret) B4 j7 {9 E' [+ S0 j0 a
  233. cleascr endp
    5 l( G& Z, Q+ g, E2 A" [, G. C, i

  234. / i) g. S5 y9 d/ o
  235. showmsg proc    near               ;Show info% E# q! x* |  D% G
  236. pusha
    : d# f( h0 k# m6 O4 R% y
  237. lea di, offset showms
    1 j$ @( u& Z2 e. {
  238. mov ax, 0b800h0 V1 r2 Q& h5 O: V2 \
  239. mov es, ax8 M, n4 W2 ]# Q2 F
  240. mov si, 0
    9 I; I8 L3 U( `
  241. mov cx, 4808 O8 C+ x/ i0 Q/ A( f: u
  242. mov ah, 07h0 T# Y2 D' w( e- T) s
  243. @@:
    : h* j" P: ~1 L! o1 z
  244. mov al, 20h& o: `$ O: ^2 j; F) A" k) m
  245. mov es:[si], ax* M5 X- o  ]2 k& G
  246. add si, 24 O8 J& X0 d" V- x
  247. loop @b1 m0 M( A& @  U% }: |. f
  248. mov cx,880
    3 l( Q" |; w8 t) Y3 S" [8 [
  249. @@:. i3 t7 Q7 Q) s7 t
  250. mov al, [di]- x; l4 m! \+ @3 \! k
  251. inc di# P! @4 i+ j- h  b% i
  252. cmp al,20h) x! |4 O; v* ~. m! L
  253. je showch1
    ' S6 k. q- \$ T, b1 d
  254. mov ah, 17h! f& r2 O) N1 y, Y
  255. jmp showch3 2 O1 v/ L9 T' O0 |* Q- y7 ?
  256. showch1:6 g* _. A7 a$ d
  257. mov ah, 07h * j, g; v9 p8 u
  258. showch3:: f$ ~+ {  w$ z* o. }
  259. mov es:[si], ax
    7 A/ d3 `5 g3 M8 D) A& X1 I
  260. add si, 2
    6 F1 m5 Z' {8 _% B
  261. loop @b
    ( G2 y0 h% w0 w5 a8 l6 j
  262. popa2 [, E' k, s2 a$ k
  263. ret
    " X4 z$ T% E2 Y, {. H
  264. showmsg endp
    ! B% N7 D9 G! l, i7 s3 ^
  265. " Q& Q# c+ p  J1 J6 _3 T, ?" |
  266. oldint proc7 ~& @: ]3 @9 F" C" p: R
  267. pusha/ @  F+ E: L  ?+ H# g. ~
  268. mov ds, word ptr cs:[old331]
    ; o# r8 n( i, G/ S4 `5 e/ k4 f, d0 X
  269. mov   dx, word ptr cs:[old332]5 L% y7 Q* v4 m: [; Y" ^7 {
  270. mov ax, 2533h
    9 H0 q8 a) {+ L2 B8 ~' r1 e, d
  271. int 21h
    8 ^3 K3 z- |0 ?: b, h7 v+ q
  272. mov ds, word ptr cs:[old741]
      }4 f7 Y9 c- ]8 B3 T
  273. mov dx, word ptr cs:[old742]
    0 ~: w) e- M# u8 J- b! g* s# D
  274. mov ax, 2574h/ A% o, _9 ^6 l6 v& g9 a
  275. int 21h* [6 p+ p# D0 ~2 }$ G2 g
  276. popa! N& D- ]. r, ^' h/ G+ `) v9 B0 ?
  277. ret
    8 s' Q7 o! O& N, d; D; \- G
  278. oldint endp
    4 c8 \5 b+ r. u& v" q6 O/ O
  279. 0 p- P! u6 O: O% }7 q& q* \1 [7 ^+ \
  280. memmouse        proc
    1 O9 z$ P( N4 M, z  i
  281.         xor     ax,ax. Q) @! A/ }. }& `, w
  282. int 33h
    % K2 S6 M/ B, ?7 ^4 U
  283. cmp ax,0ffffh
    ) l  ^& t- R7 S/ s) R9 I* s) w
  284.         jne     not_loaded
    ; u: I. C% W; D2 A2 P3 E0 P- a0 O
  285. mov [memcopy], 1& |* M6 x$ `6 b6 ~2 p- L7 @
  286. ret1 G2 \0 I# d. X2 D
  287. 2 T8 `4 S. `1 L0 P2 O2 J- _; S% x+ u7 O
  288. not_loaded:
    . r5 l9 Q  y9 q4 a
  289.   N7 i. c/ g. ]6 b
  290.         mov ax,2574h
    5 s2 p2 D5 M+ I2 m
  291.         mov dx,offset new_isr
    + P  ~5 u5 n9 J
  292.         int 21h
    % v: l. p& h; E1 Y3 m/ z9 A% g
  293. + A0 C9 E) w* C# E
  294.         mov ax,2533h0 Y2 c' l  h# @" M4 L
  295.         mov dx,offset new_332 H! I+ B4 S  H$ y$ F! W
  296.         int 21h
    4 w4 Z0 H* `: b; r; U5 {

  297. 4 {* w+ R$ E( _7 `; L9 G7 \
  298.         cli5 D# h; t% l' Z  a. y' b

  299. 1 z/ c* a. _+ R0 O
  300.         mov bl,0a8h
    3 F# x6 ^: \8 Z6 M+ H6 |
  301.         call keyboard_cmd( d# Y# V/ H& q, C: e' @

  302. ; P6 K9 }4 e  G  B+ `. u, J
  303.         mov bl,20h" Z! _5 h  `4 o/ \, r# u
  304.         call    keyboard_cmd3 h1 Q! W- f% l( P* x+ K/ a3 N
  305.         call    keyboard_read% h4 W- ~+ b7 v- M3 z7 q1 R1 s- d
  306.         or      al,2
    5 |/ e( V  ?) L5 A& i! Z3 Z
  307.         mov     bl,60h
    % k+ \# I+ L5 W5 c: q4 }; C6 _5 K
  308.         push    ax! @  _" m3 ~# M0 n% v
  309.         call    keyboard_cmd$ s/ B* @) T! K* d; ~5 u5 f+ ^0 @
  310.         pop     ax: n8 B' `+ r, v6 q
  311.         call    keyboard_write& o0 l3 s& m( V
  312. ( m2 C  T: E& O4 w) Q$ k: q: e
  313.         mov     bl,0d4h
    $ s2 C8 n: p/ f; _# M2 s( q/ d0 r
  314.         call    keyboard_cmd
    : q; j0 _8 Y  W) ]' q( R; M8 a
  315.         mov     al,0f4h" A( h2 c2 H/ K/ A5 l. x
  316.         call    keyboard_write
    " ~) x1 a5 [$ D3 o$ ~
  317. ! ~! G. W2 R, |6 K
  318.         sti
    * i9 W4 `) s. @& _: h6 H1 N1 f8 ^+ @
  319.         ret  R) J; e2 e. F0 {( E$ W6 q
  320. call_user_isr:, n. g3 h/ j6 F% d, D* p
  321. db      60h
    & P. Z  n) y+ A3 M- [  z& n2 j2 ^2 |
  322.         mov     cx,cs:[pos_x]
    ! a" k+ [' r% S1 a
  323.         mov     dx,cs:[pos_y]) O5 x. ?" o8 D1 `0 N
  324.         mov     di,0 ;cs:[x_move]
    ) o* A& ~' c/ \: \6 J0 }
  325.         mov     si,0 ;cs:[y_move]
    , w1 s8 ]& n( S8 G
  326.         mov     word ptr cs:[x_move],0
    " C* I4 }! Z# B5 [
  327.         mov     word ptr cs:[y_move],0
    5 ]7 E5 w0 Y7 a
  328.         mov     bl,byte ptr cs:[buttons]
    8 E6 v  b$ j1 \4 M7 K0 {+ R
  329.         xor     bh,bh
    & C, u7 z5 D! \/ Q
  330.         call    dword ptr cs:[user_subroutine]
    5 s! }6 E, h$ S( B
  331.         db      61h  V( R# E* q+ ^7 }& M! N3 B
  332. ret
    : ]2 n; r- h4 I1 d
  333. new_isr:
    # A2 e1 D6 v% l9 F! D" y
  334.         pushf- A4 h9 X( U% V: X
  335.         cli
    6 D3 |* E1 ?! r/ y5 |5 {+ |
  336.         push    ax: _/ P& n7 \& k* v" l- V' G
  337.         push    bx: T# p( _7 q" R2 R
  338.         push    cx
    6 @( j3 T9 C0 N. n
  339.         push    dx/ y3 L$ E5 i1 N4 ]5 j
  340.         push    di, S! O2 m* ?- H* H& w9 D. m3 U
  341.         push    si# g2 z: B- [7 _$ n6 }, D8 r2 z
  342.         push    es: v7 j" h) K* y; }4 y! C, p3 b
  343.         push    ds
    5 T8 j. d+ G0 d0 c* _9 G5 f' I' r

  344. , Q2 \9 K% i  r* z( }( A& x- ~
  345.         push    cs+ y9 s8 H  d% Z, m7 t& D* x  H% Q- G9 O
  346.         pop     ds
    ( ^2 {: M5 e) i* O% B5 C4 T6 _
  347. ) a, d% o# x. V5 t" ]
  348.         mov     bl,0adh
    7 C- S  ?; N* q2 ^( S. i* @
  349.         call    keyboard_cmd, f  }2 f; ^# K6 n
  350. 8 q( F6 z* D# y4 {! l" x4 r+ T
  351.         cmp     byte ptr [first_time],0
    % D+ s3 @9 j% m6 X3 x
  352.         je      not_first_time
    + o& T# I2 s' P! B* B6 q

  353. ! M7 x7 c2 S! Y9 S
  354.         mov     byte ptr [first_time],0
    1 v3 ?# [' K5 X. l
  355.         call    keyboard_read8 e5 l1 `% l2 R; V3 Q
  356.         call    keyboard_read" i1 H" c2 `7 X/ \/ H
  357.         call    keyboard_read) x+ X# b4 \2 m! w# F
  358.         jmp     no_show: q) N# p6 x* O8 c# Y9 g
  359. % W& R5 d( s- H; q# B$ N
  360. not_first_time:
    . e3 S% N& A" z- [# a. R4 h- ^. |
  361.         mov     word ptr [temp_mask],0
    / k5 T: a2 a6 i" U
  362. / }5 N4 `9 J( r3 M3 e
  363.         mov     cx,[pos_x]
    3 L" a7 M# j! p, m& T! s, `
  364.         mov     dx,[pos_y]5 r3 [5 e( b0 ~7 o; O( R
  365. ' f) `1 R' G- u) @
  366.         call    keyboard_read, I* j: h$ C5 _( ]( O2 G
  367.         and     al,7 ;3
    9 i; A) x% M; X
  368.         mov     ah,[buttons]
      \# l, S8 w9 [9 a" R, a. r3 |
  369.         mov     [buttons],al
    , b( g8 D9 {) M( A7 U! p
  370.         cmp     al,ah
    ! m: B/ P7 b3 L8 U
  371.         je      no_button_change) K) n; J! P0 T  ^, o. t
  372.         and     al,3
    : U+ J7 g) m9 d# ]4 s! k
  373.         and     ah,3
    & `; o8 {0 M" m; Q1 E0 t
  374.         xor     al,ah8 m( P5 U9 S( }, h9 b
  375.         xor     bx,bx
    : Q& Q) P% e7 G# G1 r- _; Z$ J
  376. " e! I7 I  |) J7 e
  377.         push    ax
    ( _2 }: l2 d9 {1 ~4 ?) ^" j" x, J' Q
  378.         test    al,2+ y* A5 N6 w% v
  379.         jz      no_right_button_change
    ( Y9 {7 r  M- z7 Q5 [/ ^
  380.         and     ah,2
    8 ?3 I0 S9 L2 R
  381.         jz      right_button_pressed
    , ^( K; l8 s! _0 w4 p: r: }
  382.         or      bx,16+ f- }" d/ _$ f- U2 ]4 B& J
  383.         jmp     no_right_button_change
    2 T8 W8 N1 e7 c0 j0 T: g" R5 U
  384. right_button_pressed:
    9 c8 _1 Z# a1 l
  385.         or      bx,8
    5 B( D* F9 J$ a' j& [" Z
  386. no_right_button_change:
    : a' Y1 A9 f, m. U0 D# n

  387. 9 a: w2 Z# X1 M
  388.         pop     ax! \* \6 ]7 g, }% }5 g1 Y/ a

  389. 5 f& U6 _* E% b6 i2 i! [
  390.         test    al,1
    : Y) T4 N7 c8 D9 g0 y
  391.         jz      no_left_button_change! T+ b6 `$ u+ E$ }
  392.         and     ah,1
    ) }* N! l9 p! G
  393.         jz      left_button_pressed( W" H, m0 }3 K9 u
  394.         or      bx,46 q( K4 C5 _: \) C7 I! Q# l/ O  s$ t
  395.         jmp     no_left_button_change' z+ n; G6 x6 h: J* x
  396. left_button_pressed:4 W. P6 i4 O4 D. Y0 X0 M* K* T+ a- F
  397.         or      bx,2
    1 x. v6 l4 E# `  d* f+ E( Z4 N8 C
  398. no_left_button_change:
    0 B1 C: t; `8 l9 n. R6 W- u" |
  399. 6 N$ H  r% M9 ^! s. y+ B+ ~8 j
  400.         mov     [temp_mask],bx
    * x" Z7 V$ E$ W. u
  401. 4 [& `( q7 v& i2 \# f% E  ?
  402. no_button_change:
    , B$ ^& v3 \- o* \5 o3 q4 w* ?
  403.         call    keyboard_read. M& V5 @3 ^# @, s+ U  F
  404.         cbw$ o6 D# ?* D) r+ B  ^
  405.         add     [pos_x],ax5 F! z! V- l, K- ?! F+ Z# b- u
  406.         add     [x_move],ax
    " f& A, X% _1 K9 I  W' @
  407.         mov     ax,[x_min]  Y" X/ c) D, s: x$ m
  408.         cmp     [pos_x],ax
    & s1 n, ?; L! {
  409.         jg      good_hor14 C6 G$ R( `+ T: V. E
  410.         mov     [pos_x],ax
    6 l2 h% m4 z0 {# t. s1 `0 b
  411. good_hor1:
    & H9 l( J( m/ ?, Q. J
  412.         mov     ax,[x_max]' v0 l" d! {0 g4 X& _5 U  c' g
  413.         cmp     [pos_x],ax- X8 ^5 O2 C" G
  414.         jle     good_hor2
    9 b& |! k: i  p7 ]  t8 Z
  415.         mov     [pos_x],ax
    8 F3 k, m8 k. q8 t2 m
  416. good_hor2:% g5 h7 o4 Q; o/ o
  417. : O! |6 v$ T+ ~; @" A6 j2 b$ m
  418.         call    keyboard_read* y9 J1 v% o- w6 H1 L" l
  419.         neg     al. L) W* w' A" C2 f4 ?0 \  n$ `
  420.         cbw
    ) w( S; D8 U. M* H' W6 ?; ^
  421.         add     [pos_y],ax
    ) o3 l" E& v. v% e6 m
  422.         add     [y_move],ax  o3 f* ^1 n* A8 k% Y% S( W
  423.         mov     ax,[y_min]
    ( G- L. {6 W+ a! j, E5 [
  424.         cmp     [pos_y],ax1 ?% N4 Y1 {* ]# f
  425.         jg      good_ver1
    0 \% n6 J) A+ ]! ~9 u+ C
  426.         mov     [pos_y],ax! I1 [. D0 u, L5 ]- v# `: T
  427. good_ver1:
    & T$ F+ G& [& |
  428.         mov     ax,[y_max]& V3 Q7 s' S8 b% e% @5 r
  429.         cmp     [pos_y],ax
    ' W% W7 o) ^0 A( B6 h
  430.         jle     good_ver2
    ; W! w. B8 \7 J! s
  431.         mov     [pos_y],ax6 h7 @' \, c$ X  q6 S" \6 ^+ [
  432. good_ver2:
    ; Y: a& r. }, I$ U  W

  433. 0 x( Y: Q. l) h$ q/ [7 \
  434.         mov     ax,[x_move], A2 _( B; x2 E& Z- i" C
  435.         or      ax,[y_move]5 E! X7 U% q1 z0 k% V2 G8 c5 O0 U9 w
  436.         or      ax,ax
    ( [5 g+ L3 C8 \/ `
  437.         jz      no_change_position
    ) a. }1 h* f# u$ G0 }9 @! J
  438.         or      word ptr [temp_mask],1
    ( b6 ^% y9 A1 j2 H' u
  439. no_change_position:
    9 T- K3 g* O; W$ p- ?# L3 [

  440. 7 U  F1 ^& [) b
  441.         mov     ax,[temp_mask]
    ; ]* I; F+ j& \  q6 A
  442.         and     ax,[user_mask]+ R2 X6 t9 E3 g  Y. T. v
  443.         jz      no_call_user
    5 V' s. B5 U9 u; M0 b  B" k
  444.         call    call_user_isr8 R1 I; u& p1 T, Y! M7 e
  445. no_call_user:8 E1 o# o  ]1 n3 a- }# Z9 A

  446. 4 |! v2 U( v& j# y1 Z* K6 c% C* A6 X
  447.         cmp     byte ptr [sm_flag],1
    5 s0 z; q$ L0 E7 U( N7 [
  448.         jne     no_show- Q& m! b8 o7 r6 G8 h
  449. . K# n8 u# r+ T, D+ S5 A
  450.         shr     cx,3
    $ g* J) _: v0 O5 {" [
  451.         shr     dx,3
    4 C% ~5 ^3 D, ]9 w4 H8 R+ c
  452.         mov     ax,80
    : c4 e3 @9 U* F$ s6 }0 N
  453.         mul     dl
    : Q8 S. s8 P6 I2 u, C' y. S5 ?! Z
  454.         add     ax,cx2 P- I2 x" t6 t: A
  455.         shl     ax,1; l  S  S+ y  _1 K' o3 b
  456.         mov     di,ax
    / L( q* ^8 q) S+ Y8 E
  457.         mov     ax,0b800h- X8 T$ A9 K/ b
  458.         mov     es,ax
    ! P& q9 j: v0 B9 O  }( T
  459.         mov     ax,[save_char]3 d$ o; s0 }* n
  460.         stosw
    & p: `3 z5 A! a7 Y, T$ @5 j

  461. ; ]* a, r' g0 C0 U0 P. _
  462.         mov     cx,[pos_x]
    + f0 q( M& `/ n% I  a( H
  463.         mov     dx,[pos_y]! S5 L% x4 I/ q+ c2 ~( B
  464.         shr     cx,3
    & e& r8 k8 |5 `
  465.         shr     dx,3( e- x$ j6 s+ `8 n. R) L
  466.         mov     ax,80
    1 _, W  e. B: i
  467.         mul     dl
    8 `$ k9 U4 a5 H! [; }6 v
  468.         add     ax,cx, l; a: |0 u" c/ U( V* k
  469.         shl     ax,1
    4 Z/ |+ h0 F$ B8 X; k
  470.         mov     di,ax( @+ s/ K, v5 B; `5 g
  471.         mov     ax,0b800h
    # i1 C4 |5 ]  r/ p
  472.         mov     es,ax
    7 ^) |$ R4 G9 G6 F/ x2 r
  473.         mov     ax,es:[di]$ i- G; p) f+ O, D5 c6 i4 N
  474.         mov     [save_char],ax: |) ?. q! u: I7 A& i+ v
  475.         not     ah
    ( Z4 @, G% X/ ]4 `
  476.         and     ah,7fh2 X' Y, m' m) ^+ U% H2 X; u
  477.         stosw
      M2 m/ T% k& i4 K- j
  478. no_show:1 B2 L( ^4 q8 |* G5 z! x
  479.         mov     bl,0aeh
    9 M/ n1 [; t, h* P
  480.         call    keyboard_cmd
    / m9 _% _+ q7 k7 N* \5 [9 x2 U

  481. + E& E$ P% w- B7 |: S, Y
  482.         mov     al,20h
    $ a" w% @  K3 L: \- A5 \" E1 v
  483.         out     0a0h,al
    0 J# B2 l3 ]2 a1 e+ H
  484.         out     20h,al
    6 E0 g- S; v! l, d8 S' e. m

  485. 4 i  j$ z9 j1 m2 _9 s# m
  486.         pop     ds
    & @, j. F4 O' Q0 l) U
  487.         pop     es7 C# n, i- j& X" h7 [
  488.         pop     si) e8 }& ]7 O8 H5 [2 D  s' N
  489.         pop     di
    8 H6 W. u. v# ~* Q3 W% U8 a
  490.         pop     dx
    7 w& }+ Q  I0 w2 v, q. B9 }, P
  491.         pop     cx
    6 O3 i8 A- {0 {
  492.         pop     bx
    ) ^/ F; V! r, m% K5 G9 m0 d7 U# i
  493.         pop     ax1 l% L3 ?3 P7 [# V( P
  494.         popf$ w6 Q+ [5 l2 e) A5 r/ o- F, P" G
  495.         iret8 m2 y# x6 c7 C8 o* Q$ L8 _+ P
  496. ! }+ i" O5 d) U* l- p2 b
  497. first_time      db      1
    ; `3 t/ Y# {' l5 h: ?; r/ Q
  498. buttons         db      0( d! B5 N  \5 o' }
  499. pos_x           dw      0
    , B6 o& A$ ]$ U2 q5 i0 {1 r
  500. pos_y           dw      0
      @8 G) ~4 j3 R
  501. sm_flag         dw      0. s6 R! H% r0 D2 P+ p0 f
  502. save_char       dw      0. z5 _, L6 F; V/ s2 p
  503. x_move          dw      0
    ! \! L' W0 z6 l2 S% U7 [0 }: S$ ~
  504. y_move          dw      0( f! r4 H* ?; v+ s
  505. x_max           dw      6393 j3 m2 Z" @4 J6 ]  g
  506. x_min           dw      0
    3 V  \0 s" i1 h' d
  507. y_max           dw      1997 Q* C; B0 F6 T" _2 [: H2 U/ M
  508. y_min           dw      0
    6 u" m# z" u$ o  P2 @0 b6 ^
  509. user_subroutine dw      0,08 w( q& Z' z- F0 G) k4 I0 w6 n
  510. user_mask       dw      0
    ! i! W4 B- q% ^, F
  511. temp_mask       dw      0' K% J- i' J% ~' }$ s

  512. 4 P- H5 D4 `$ K2 w  K
  513. keyboard_read:
    1 f0 F1 E( p$ Q7 E- j
  514.         push    cx. b  ?( @2 e: T! H" l
  515.         push    dx
    6 ]" O0 U' e* t7 J% Y6 I
  516.         xor     cx,cx5 Y; O: ?; G2 ^
  517. key_read_loop:
    & w8 o; E0 i+ F2 ]# T
  518.         in      al,64h
    " ~5 f- a4 I8 |; l2 R
  519.         jmp     $+2
    % t% A2 x' W# P& i8 A1 e" V  @
  520.         jmp     $+2
    1 |  b/ F  `" k( J% x
  521.         test    al,1  B6 O8 {4 x; c7 m" h' ]
  522.         jnz     key_read_ready7 S4 z( v6 L/ ^3 e- X" q
  523.         loop    key_read_loop
    % F# x* |3 N3 [
  524.         mov     ah,1
    ( u. j5 ~1 Z* j; \/ d7 u5 m- Y
  525.         jmp     key_read_exit
    5 X: s  v. b% V  ]
  526. key_read_ready:
    0 A# j5 [) E& \& r
  527.         push    cx! n& \5 Q( e( `; V
  528.         mov     cx,32
    2 W! }7 _5 }+ v  N8 Z- [3 r8 m" a
  529. key_read_delay:
    5 |+ d" p/ u0 `+ D  ?
  530.         jmp     $+2
    ( L% p. k% ^3 l+ Z3 ^
  531.         jmp     $+2" e- f8 f# e3 v4 g
  532.         loop    key_read_delay' D. K+ O& w) w! u! Z5 F

  533. $ O' N: h- E$ h# @/ n( v( Q6 i3 B
  534.         pop     cx
    " F1 x, ?$ [9 t& c: ~7 Z8 Z8 L
  535. 9 M8 p2 B! {# ]7 W9 ^5 k: ^
  536.         in      al,60h
    . [- o# N5 t  N
  537.         jmp     $+2
    ' w: s% s1 ~: Z
  538.         jmp     $+2
    . b9 {6 d) j6 R+ T
  539.         xor     ah,ah
    + K" @- w, T( Q/ o* \# O) p
  540. key_read_exit:# T: k5 S4 T1 q+ B. v
  541.         pop     dx
    + h! C+ j/ {6 ?/ k/ D" B7 u
  542.         pop     cx
    $ j0 Z& O2 s: ^* c6 y8 F9 v
  543.         ret: ~% z. l. v9 J; _& }% B" q
  544. 7 H6 K  h0 l0 t) [
  545. keyboard_write:8 \4 h4 B. C: d) A# m7 i
  546.         push    cx
    ( X1 Z4 A3 a& m2 m( X
  547.         push    dx
    8 y  A. M& g2 V! W1 I+ Q5 ?* o  k
  548.         mov     dl,al
    . s& r  a% s. ~) D/ L/ s
  549.         xor     cx,cx3 f5 d/ ?1 b8 j3 p3 P9 ^
  550. kbd_wrt_loop1:
    0 w1 z, Q# g7 D$ a# w
  551.         in      al,64h
    + E+ m( f8 K! `7 s! ?, s
  552.         jmp     $+2, k0 H* U$ d) f- ?% V9 N
  553.         jmp     $+29 v: m! O6 k6 I; R- q: V" _) ~# L
  554.         test    al,20h1 i9 P8 @& M1 R4 p( ?; ?
  555.         jz      kbd_wrt_ok1
    # v3 O/ i! c( h

  556. + |1 c" i2 |! i9 g
  557.         loop    kbd_wrt_loop18 }9 z5 z1 Z# |1 H' q/ s* r4 w
  558. # }) d7 C4 q) }6 C+ Z
  559.         mov     ah,11 b& `6 ~3 s# k8 D: \8 _6 z6 ~' G- x
  560.         jmp     kbd_wrt_exit. ~7 L' u# p" l8 k) L
  561. 7 e5 j4 A5 k% l- Y, V7 h) ]
  562. kbd_wrt_ok1:; x. V+ ^0 B6 F$ b' t0 }
  563.         in      al,60h
    : N" z6 F4 t# [0 n6 o. D% N0 v; N

  564.   i. i$ O/ t- }6 r
  565.         xor     cx,cx* E" _( u. u$ S+ H5 J: k
  566. kbd_wrt_loop:
    ; M7 \, o$ K" A! f( v
  567.         in      al,64h
    6 I' t/ t* T. g# z! w" L5 e
  568.         jmp     $+2
    ) o( W' s4 X7 X, B
  569.         jmp     $+2
    # S9 R% H* ^- Q
  570.         test    al,2' j5 V* k3 x+ X' {0 ^3 b# i& k
  571.         jz      kbd_wrt_ok
    - T6 M( d: W1 B* W, [

  572. 5 g; J/ n, N; F
  573.         loop    kbd_wrt_loop
    8 j+ V: Z8 i5 x% T% P
  574. ' p6 s" v- {2 u* V9 U# h  G( f
  575.         mov     ah,1
    . I3 |! N. X5 B. ^* I5 p/ j2 L; K
  576.         jmp     kbd_wrt_exit
    7 _7 R( @6 h1 K/ H7 V" Q
  577. 8 i- M) {1 F1 o: ~/ S7 p
  578. kbd_wrt_ok:& A8 U' W3 @5 f- H8 p$ g  A. [
  579.         mov     al,dl
    8 c; H, \1 |7 M: }1 _
  580.         out     60h,al7 U) F: l8 L4 F: h: M  y- ^
  581.         jmp     $+2
    8 b0 B3 O* }( r: f
  582.         jmp     $+2: \' ~" E: ]% V- _0 Y: R

  583.   ]2 r6 b; L$ ^& g9 T: g& v1 R% F- t
  584.         xor     cx,cx
    & z+ ]% e2 {! q# R6 F& ?  V3 f
  585. kbd_wrt_loop3:- T/ k' _7 I  |2 Z4 A
  586.         in      al,64h7 f+ C0 u; r# b5 b; F  I8 b' s
  587.         jmp     $+2
    : H" k$ b" [; q# V  Y2 \
  588.         jmp     $+2
    2 U+ X( J& ?. m% E8 y; u! K( b/ t# R
  589.         test    al,2
    ) @3 \$ I1 ~! S! B
  590.         jz      kbd_wrt_ok3# W, g% Y7 W& x) u- D. |
  591. ( N! f( b/ ?) j/ E  J! N( x
  592.         loop    kbd_wrt_loop3
    7 _" [* m8 {6 z9 \" C

  593. + l& u) U9 |- P" y5 r0 N! C. x/ w
  594.         mov     ah,1
    4 ?4 j. x2 s1 P7 }# @
  595.         jmp     kbd_wrt_exit
    3 R0 v  q" V1 u9 r  G* L

  596. 0 [2 w, c  N; \5 _3 D
  597. kbd_wrt_ok3:2 q4 K5 a( @" k7 u/ t+ k& f
  598.         mov     ah,8
    * Z) w' D- R8 Q9 X2 c/ x
  599. kbd_wrt_loop4:# d8 F& T. E# j6 i8 v+ P
  600.         xor     cx,cx
    2 A* i( e5 d+ c$ R, n/ M
  601. kbd_wrt_loop5:9 a0 |6 d, x; x( d4 u6 J7 ?" M
  602.         in      al,64h2 k9 [1 Y4 u; J
  603.         jmp     $+2
    ! V9 W# F; `3 a' d; ]
  604.         jmp     $+2
    $ n) V) L& w! k; A
  605.         test    al,1
    " G4 D; N' t' a* O' B9 e5 c
  606.         jnz     kbd_wrt_ok4
    . N& |' I4 y8 z5 G& f8 f/ M
  607. 7 q3 s2 F+ g" U- A8 x
  608.         loop    kbd_wrt_loop5
    & z! X, r. t4 L; [2 S+ F
  609. ; B6 X7 V) b3 n, S3 O2 o) \. N
  610.         dec     ah1 h8 f: f5 B( i# \
  611.         jnz     kbd_wrt_loop4, _( u; }" P4 Z8 S8 u! }

  612. / G7 e) k9 d3 N& ^
  613. kbd_wrt_ok4:# `5 ]% c% V  A
  614.         xor     ah,ah
    6 Y' |8 f% E( H6 a9 d
  615. kbd_wrt_exit:
    9 r) r. o: S0 k1 o0 _5 A! g
  616.         pop     dx
    ' d7 r8 H; i* g' a* i/ P( S/ O. E2 h
  617.         pop     cx  }  Z2 H3 B9 |; E) R. H' c
  618.         ret" q1 z1 Q3 r( m0 ~6 X
  619.         & Q! x( z! z  x5 \9 `- m. A) ~' ^0 ]
  620. keyboard_cmd:
    ) e, l2 g8 I. ^& h
  621.         xor     cx,cx
    & b& X' U$ u% D( y; q3 n( @
  622. cmd_wait:; b& m0 ^- H/ H  y0 j, i4 r  w
  623.         in      al,64h( x: B0 ?; q$ V0 B9 q7 ~7 S+ u
  624.         jmp     $+2% B+ j) m0 a5 \" h5 }0 s7 u
  625.         jmp     $+2
    % w: |( @- b! |6 T2 y. o% @
  626.         test    al,2
    4 k$ x, v# l, `  b2 k( q
  627.         jz      cmd_send$ i/ H; x% W0 w5 @; {8 @( t7 H
  628.         loop    cmd_wait
    - P* `! t5 Q2 d- Z
  629. 4 j  p# h; W  A2 L5 c/ Q
  630.         jmp     cmd_error3 O3 _" u# I) x4 u7 Q
  631. 5 K5 x: M6 w, a. `1 f
  632. cmd_send:- X) F4 E. [" q" p' S# q
  633.         mov     al,bl/ B7 ^1 x$ w' V& h2 X3 |$ b
  634.         out     64h,al6 Q6 |5 \+ q; d% ^$ F/ v" E& e  c
  635.         jmp     $+2
    8 |$ V# z( X! F+ L
  636.         jmp     $+2
    1 a# U" v+ Q& P3 v

  637. & E* x; W; p% c% J( X$ R) u3 O
  638.         xor     cx,cx
    . u8 P- ~8 R$ h: N" H" }
  639. cmd_accept:: m) {2 t7 i$ P5 ~" h3 ?" v: ]
  640.         in      al,64h
    ) P6 g4 }0 `7 @; w
  641.         jmp     $+2
    * \. V3 L+ r  v$ d  i
  642.         jmp     $+2, u8 \( i, L) g( R* c
  643.         test    al,2
    7 U/ C! E8 r% ~6 N3 ]
  644.         jz      cmd_ok
    7 c( w; v( m( z# c- H
  645.         loop    cmd_accept$ i' v8 K3 Y) Z4 R0 A. y* {* V

  646. % ~5 h- j1 n- |
  647. cmd_error:$ |' N2 W- n$ @: x. ]# L
  648.         mov     ah,1
    + N$ I7 d* E$ G
  649.         jmp     cmd_exit8 c2 B# ~/ i. t" v$ b$ U
  650. cmd_ok:
    : r) A* I) s' y% E% e7 y
  651.         xor     ah,ah6 @# f) l1 s3 b; V8 W. r- B
  652. cmd_exit:7 e  d, A' ?7 s/ i
  653.         ret: g/ w& J7 Y3 R& ~0 m
  654. / v4 s% f8 U) j  _, h0 N. f
  655. new_33:: V: `" P; G7 R& t  ]
  656.         cli
    , J* S4 J4 V) s" V
  657.         cmp     al,0
    & A& w( P6 M9 ~' |+ n% s
  658.         je      reset_mouse0 x- M( Y6 Z  W+ Q
  659.         cmp     al,1
    ) i" t- s) ~- P# c! k3 w3 R# R( @6 L
  660.         je      show_mouse
    % t; H' R# F( F, z9 Q: n
  661.         cmp     al,2
    # n9 g$ B8 j% A: \1 C. R
  662.         je      hide_mouse
    4 K$ t& Z1 K2 s. Y4 V. e
  663.         cmp     al,37 i  H. B* v% Y. \  s
  664.         je      get_pos3 \! U5 K' f- I2 Z5 a* A* x
  665.         cmp     al,4
    2 J3 W& J2 M/ v! J
  666.         je      set_pos
    8 q! M7 z6 j+ `. {- A! N5 O
  667.         cmp     al,7
    : [8 k& q3 E% o0 q0 O7 K" H
  668.         je      set_hor_pos
    , E+ M% M% x) c5 m; U' M
  669.         cmp     al,8( I- ^; R" Z" ^
  670.         je      set_ver_pos; ?; W7 Z1 t9 B! \. ]
  671.         cmp     al,0bh" `5 _8 V$ t: W% _# ^6 {  r
  672.         je      get_mouse_movement
    2 B! g0 Y( W$ J* u; @: ~
  673.         cmp     al,0ch  |& C1 d2 b2 J) d
  674.         je      set_subroutines
    * V8 y( O. L/ X8 ~1 W
  675.         cmp     al,14h
    # l( g2 M- E. ~6 `  m2 s# z
  676.         je      swap_subroutines
    % w2 Q! s, s/ C5 |
  677.         iret0 P2 i; y; G  A! _& M* ^
  678. ! S# R# o5 Q) q! P7 C* T
  679. reset_mouse:8 h7 ^8 H; F5 Z: o2 P
  680.         jmp     _reset_mouse
    + u7 ~. k+ W& E: S/ Q
  681. show_mouse:; e' @9 K$ T& ?, e: {4 _- u
  682.         jmp     _show_mouse
    : M. j- b& n/ I; S( o( ~2 F& S
  683. hide_mouse:# N: ^, e0 E; O1 U, l
  684.         jmp     _hide_mouse. a$ W% B1 _. j" `: g! D) d
  685. get_pos:4 W- _( n  M7 i! w6 t# l
  686.         jmp     _get_pos
    % O1 d4 j% h8 ]' X: v! F% `
  687. set_pos:
    . p0 d9 Y+ a$ u
  688.         jmp     _set_pos
    ( n0 d  o5 ~8 r6 y* B1 B* \& O
  689. set_hor_pos:
    3 c" x/ X/ N' {# H" k. ]' I
  690.         jmp     _set_hor_pos
    , V5 b" b  Z( @* b- q9 c
  691. set_ver_pos:6 J( U' ]2 I4 i+ U4 i8 `. b* r
  692.         jmp     _set_ver_pos
    0 M. |  F' b2 X5 k+ E
  693. get_mouse_movement:
    8 J4 I+ I7 x9 m; b3 Z
  694.         jmp     _get_mouse_movement
    8 r' V9 Y, Q5 R* I, u
  695. set_subroutines:
    7 ^" n- x& b& s6 h: `$ E
  696.         jmp     _set_subroutines1 ?  ]+ }9 R0 c
  697. swap_subroutines:3 I- r/ d' I5 ?' K9 ]& \
  698.         jmp     _swap_subroutines9 i8 b4 _; t- `/ f9 t- A

  699. ' B4 B9 n: G$ m; u$ V' J; T+ P
  700. _reset_mouse:3 m, z; Q, i( D" ]+ q( ?' N7 |+ U  z& M5 g
  701.         mov     byte ptr cs:[buttons],0
    $ T% X- j+ i/ ^4 K; u1 O" w8 C
  702.         mov     word ptr cs:[pos_x],0; `- |( v: h. P" ?* L
  703.         mov     word ptr cs:[pos_y],06 S) t9 x2 B2 O
  704.         mov     word ptr cs:[x_move],0
    - W' H& Y* Q9 ~8 S5 M
  705.         mov     word ptr cs:[y_move],0/ b% r4 w1 S* e* Q7 s6 @: P: P; }
  706.         mov     word ptr cs:[x_max],639: }9 {. d$ w. v
  707.         mov     word ptr cs:[x_min],09 B) K6 f2 {: }  Q
  708.         mov     word ptr cs:[y_max],199
    : I! w: L6 c& L2 Z
  709.         mov     word ptr cs:[y_min],0
    6 l2 `& r6 }/ D6 p# g! R3 j$ d
  710.         mov     word ptr cs:[user_mask],0
    2 u; I' r0 L6 }7 [# C" K( k3 z
  711.         mov     word ptr cs:[user_subroutine],0+ `" S  Y( ^: ], P! v
  712.         mov     word ptr cs:[user_subroutine+2],0
    2 ]8 [) f, t. e1 t& T' U# A
  713.         mov     ax,0ffffh
      ~& d% t9 b7 E
  714.         mov     bx,3' R4 M: F2 J9 A  ~5 \% [
  715.         iret
    - i$ l" L& J& p' t

  716. % Z. s! _1 u! ^) s) B* X# j* y
  717. _get_pos:1 q  M. Y$ U/ p* t
  718.         mov     cx,cs:[pos_x]
    8 f7 Y7 V; D* L* @& D& x  X" _
  719.         mov     dx,cs:[pos_y]
    + u( B. r, `7 D7 |+ ]8 y8 E0 L- {
  720.         mov     bx,word ptr cs:[buttons]  d& t! H+ V% a
  721.         xor     bh,bh
    1 x0 H  g; W; w. X8 h% S& J5 e
  722.         iret
    7 C2 M0 z4 z4 C
  723. ( ]1 q* t. ^: ^9 |
  724. _get_mouse_movement:
    6 F7 W! [& E' Q- B
  725.         mov     cx,cs:[x_move], ?3 w' q) y( e6 D2 X: v! \
  726.         mov     dx,cs:[y_move]
    8 X4 j0 B" N, Z- ?% t
  727.         mov     word ptr cs:[x_move],0
    & |' M. l) Z+ h% n* V& k' C
  728.         mov     word ptr cs:[y_move],0+ x% S& |+ ^: H/ U  @7 Q
  729.         iret
    & r" \$ P- x- m$ c% [, \

  730. 9 ~, @- O1 N4 s9 C2 Z. t1 k$ f
  731. _show_mouse:+ K" K* n! a$ w! G
  732.         push    ax
    3 O! @) Q. I9 u( B% s2 r; w. X: I
  733.         push    bx4 i8 u( G# c; |
  734.         push    di) }# B7 r' l2 s2 M* w
  735.         push    es, f: b- C4 V, \4 ~4 ?5 w0 b
  736.         mov     byte ptr cs:[sm_flag],13 ]6 V$ p( w# B0 i3 p4 Z$ R2 k: a
  737.         mov     ax,cs:[pos_y]
    + _5 d9 s- ?# }; z# E
  738.         shr     ax,37 J: k4 r9 [! y5 |" ~. _3 m1 ?
  739.         mov     bl,80
    . F5 S- ?6 \6 ~/ o0 G2 d% o5 ~/ _& k
  740.         mul     bl
    ' `! f5 R: O8 p  G" |0 d
  741.         mov     bx,[pos_x]7 K$ {" a% k4 H) U1 F; N
  742.         shr     bx,3& [! V$ Y" l6 y( T: P. E  @! b0 t; ^
  743.         add     ax,bx
    ' H3 B( i3 i& ^; i
  744.         shl     ax,1
    # r4 d/ T7 q: J6 f& K
  745.         mov     di,ax
    # e# }  W* R+ }. O6 ]
  746.         mov     ax,0b800h0 |4 c7 ~+ ?0 a% G5 l
  747.         mov     es,ax* k' \( _; L; B1 m, p
  748.         mov     ax,es:[di]
    $ d5 L0 R  f, q. g9 T
  749.         mov     cs:[save_char],ax9 [' g6 g, `2 n9 t# z
  750.         not     ah
    7 @+ `) ~. I: B4 q
  751.         and     ah,7fh  l8 ?0 o8 T+ i5 P
  752.         mov     es:[di],ax0 p) u0 c2 t! {
  753.         pop     es9 x% V  m. m' f. B. D" z
  754.         pop     di
    4 U) w2 I8 }2 U
  755.         pop     bx" U6 n  r0 {- x
  756.         pop     ax
    ( t2 w* ^* O  v0 ]. e" _' D
  757.         iret
    0 U6 |' }1 ^7 ]  \$ E' o  ]
  758. $ N1 a, l! m9 @* D7 ~; U: w
  759. _hide_mouse:/ R) w0 u' r' L# M
  760.         push    ax
    ! |" ~, l: k+ ?/ v& d
  761.         push    bx* r$ T. H" q" Y6 k5 Z& J) y+ m
  762.         push    di
    ; g: c. }3 e! A7 h1 k; b
  763.         push    es7 m0 O: D- e# }9 f$ a
  764.         mov     byte ptr cs:[sm_flag],0
    , o8 S- H' Z" h$ V1 p
  765.         mov     ax,cs:[pos_y]$ E4 B2 [: n! v# K
  766.         shr     ax,3
    & H0 Z2 s2 Z0 @/ X" C  `
  767.         mov     bl,809 `2 p9 @3 P; ?$ B% q% x- `
  768.         mul     bl
    5 T. w% `% P1 P* K2 T8 |9 _
  769.         mov     bx,[pos_x]
    - P- j! [% u; A9 b
  770.         shr     bx,3+ j" k. Z' `- i; p+ Q3 D) @
  771.         add     ax,bx
    ! R. v/ L$ ~6 T& E+ Z, f8 ]
  772.         shl     ax,1$ o& I: E1 F& i4 s6 W
  773.         mov     di,ax8 H6 G5 v# L0 z2 C/ Z1 u
  774.         mov     ax,0b800h8 |) A9 W5 U6 }) V4 w3 s5 r
  775.         mov     es,ax7 ?3 E& |: @! k
  776.         mov     ax,cs:[save_char]  X. D- K/ B3 f
  777.         mov     es:[di],ax
    8 k/ N  {4 l3 T# R! ?+ Y# ]4 e
  778.         pop     es* C' Q$ ]+ Y) V( p- W' P
  779.         pop     di
    + \8 W. [; {, `& t! N
  780.         pop     bx- q8 W$ R2 w" v. q7 b6 O
  781.         pop     ax
    ; I5 v" P+ H9 @% x* e2 L/ o
  782.         iret2 ~5 ?( |( L& s- ?
  783. ( D2 {( L* K3 n8 Y. O" B
  784. _set_pos:8 N8 S- d3 q! u9 d  k5 x
  785.         mov     cx,cs:[pos_x]/ N) c* j2 _  }
  786.         mov     dx,cs:[pos_y]
    ; b( p9 W$ r2 r6 i, }4 d& U
  787.         mov     word ptr cs:[x_move],01 ~6 i$ c. m7 u, P( |
  788.         mov     word ptr cs:[y_move],0
    ) y4 a  d' Y, o9 W. }$ z. X) _  x7 s
  789.         iret" [8 R7 G7 p$ ]1 p% ^* h  F
  790. # V# O' J1 ^) t2 H5 M
  791. _set_hor_pos:
    : W- C# X0 J5 g% s0 |
  792.         call    max_min
    3 w7 q( x; n8 s
  793.         mov     cs:[x_min],cx& V$ E! n. @& j' I& E' Z, v8 m
  794.         mov     cs:[x_max],dx
    8 n( r6 W& _8 J" `2 `) f
  795.         cmp     cs:[pos_x],cx$ k% ^+ n* p. R" E) G
  796.         jge     good_hor_min
    & B6 x+ t! l0 Y; E0 `4 K4 v/ Z
  797.         mov     cs:[pos_x],cx
    7 r/ I- ]6 H, Z9 \) M
  798. good_hor_min:) X3 `% j& ~" `5 d5 k
  799.         cmp     cs:[pos_x],dx# }4 @/ ~* p  ?" [& h: @
  800.         jle     good_hor_max
    2 q. v5 X8 a" N
  801.         mov     cs:[pos_x],dx
    " Y" L2 U) U8 Z! @
  802. good_hor_max:
    9 U9 R5 R, A, b7 z- Y. q$ G
  803.        iret; K% C! t6 ~# K: i
  804. 0 y3 V+ Y: T$ D$ T+ L& h% I
  805. _set_ver_pos:5 Y+ `2 [( y& e1 k/ t  ?/ N
  806.         call    max_min2 p1 B: ~, I1 {3 [. @
  807.         mov     cs:[y_min],cx. a, X1 {# F( [6 E7 G' r' a
  808.         mov     cs:[y_max],dx. j3 _/ a  [, B: K0 x8 u: b
  809.         cmp     cs:[pos_y],cx
    $ L3 a! Q& h( g9 C. b, L7 o
  810.         jge     good_ver_min7 S/ c# B+ S3 X5 ^2 s* x) [
  811.         mov     cs:[pos_y],cx% _6 |& |) k* s. p$ d+ U  {) Q
  812. good_ver_min:
    ' \& l" J/ H+ U; Z
  813.         cmp     cs:[pos_y],dx, t' {/ ]' E$ N
  814.         jle     good_ver_max% q" J5 F1 b% x
  815.         mov     cs:[pos_y],dx
    & ~) |' g7 C# I2 i
  816. good_ver_max:
    1 F; [# k0 c5 N% U& w
  817.         iret
    2 M1 b; R: ]) j; N; b( B$ d
  818. : }4 q- N% w9 E8 k) b" k' w' \1 y
  819. max_min:4 t- P  \1 y2 r
  820.         cmp     cx,dx6 G) p8 h) c3 U+ c6 r3 z) x' C/ w& q
  821.         jle     no_swap  {' N6 E7 `, ]2 |- u
  822.         xchg    cx,dx
    6 F, I6 q4 W, f: x
  823. no_swap:$ ]3 J) J3 \" B( M3 c6 s6 [
  824.         ret* _8 z7 f. I0 E% ?# n
  825. " |& X- y3 H2 n% C; g7 d
  826. _set_subroutines:4 B) j9 q' ~3 T& @. A9 t
  827.         mov     cs:[user_subroutine],dx
    6 q4 x- s+ k" {7 z) d5 N/ z" M
  828.         mov     cs:[user_subroutine+2],es
    , E6 Z0 {9 j; a# e% Z7 H3 S. t" j
  829.         mov     cs:[user_mask],cx
    9 A3 N0 `& E2 s" @  }+ \" k5 a' A
  830.         iret
    ' D! u, w8 L+ M5 `1 _1 x. L
  831. + h- B* Z6 B7 N! v( ~' I
  832. _swap_subroutines:8 T+ u9 |& t! {% q
  833.         push    word ptr cs:[user_mask]
    : [, G8 c1 J& W9 o  |
  834.         push    word ptr cs:[user_subroutine+2]% T+ W: Y2 s  Y$ G  s" L
  835.         push    word ptr cs:[user_subroutine]
    1 y" ^4 q$ ^2 l. t$ z
  836.         mov     cs:[user_subroutine],dx# U4 a/ k* K0 v7 i
  837.         mov     cs:[user_subroutine+2],es
    ( D1 l; j0 j3 \* v. Y, q/ A
  838.         mov     cs:[user_mask],cx/ e- I4 ?6 [- w3 d' d- {0 E/ N& M: E
  839.         pop     dx. e1 U* Y3 w/ x' V
  840.         pop     es
    ; @' J, W- I% z) c; l( a; l
  841.         pop     cx7 i! }' G1 |5 ^; c" ?- f
  842.         iret
      J! A9 b9 R. |$ e, H
  843. " M  `% s' k8 g: U! D: O& b( d1 \
  844. memmouse        endp
    . ]9 P' u0 z  _4 w/ p
  845. " I3 F6 T2 K, r1 \, D! a+ M
  846. endof_start:; V) P2 ^" b& W# H
  847. 9 k* a2 Z2 q) e. y* t# B( ~7 X
  848. emsg db 'No mouse driver install error!$'
    : p: @3 j8 l2 x8 M7 ^4 a
  849. old331 dw 04 E" d2 x* ]9 Z$ W
  850. old332 dw 08 X# q7 l: D' o4 S5 i
  851. old741 dw 0. s1 Q5 q$ }, `' _! X8 x
  852. old742 dw 0: z9 _: Z8 @7 r( w: c1 p0 Y" f
  853. memcopy db 0
    ! h1 N1 |9 B- z+ W+ _
  854. okcheck db 00 A' y, M4 j; Z4 S" q1 v) z. i
  855. pass db 0/ ]( [& C( H/ T; D9 h" v
  856. chkl db 0
    : m+ y8 e1 `: W" i
  857. lk db 0  p4 {# H7 E$ q7 u4 A0 J: [# ^
  858. chkr db 0: c4 j# S4 `% g9 o+ c
  859. rk db 0
    - K1 q% A$ @/ b  ^" ?0 X/ L
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '* n9 N! p1 \6 R8 N( V
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '7 z9 x( M8 ^8 Z9 v2 O0 P" [
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '  p7 C( t2 H: Y; Y! [' D
  863. db '                                                                                ': p' U! l6 ?( N8 H& F7 D, Q
  864. db '                                赏屯屯簧屯屯突                                  '# R; y5 h5 J% W$ _2 W
  865.         db      '                                ?OFF汉OFF?                                 '" d! J- b1 H4 P: n7 }( O
  866. db      '                                韧屯屯既屯屯图                                  '
    7 o5 D# z& u# N7 B- c1 V
  867. db '                                                                                '
    6 j4 B* w1 W: }
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ') ]# W. q) ?" Y: W; e% r. Z1 t
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 4 ?7 L% @; Z4 n5 a+ G
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '. z; e) o+ b9 m; F. A
  871. , u* i% K2 G; B3 K9 j. Q
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
6 p  d% Y" u# D- k* F, i( k哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
0 T! B; o6 u' U+ [  h3 [' V; x/ w$ C: [
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:06 , Processed in 0.632660 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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