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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
' v* U- a. x9 ~
7 ~& ?& ^4 [1 E( i代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    3 M  ^' D5 O, s
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9, w/ t, E. z$ H; j/ F
  3. ;                                         By Bini.Yi 易祝兵# B9 }: N1 Y) s& N1 H: g5 }0 n8 J
  4. ;                                         http://www.ufoit.com 计匠网
    : b' R! m) `0 \+ w* p: w
  5. ;                                         2002/04/06 YYYY/MM/DD
    6 \; [7 R) y& A& t. [4 l+ S
  6. ;
    : O" w4 ^: @- F4 T3 O
  7. ;          2 h3 ?2 R! @- {
  8. ;          This program  test the mouse button  click and move.: Q+ m3 M- Q$ U+ R% }" B
  9. ;1 `8 f- V9 t5 P  N2 b  {) g& @. n( T

  10. ( h0 Y# z8 M; |" f4 [% X% _
  11. .model tiny* c* U( }6 F( a* M2 R, z1 o# F
  12. .586
    $ g5 }& e( l& G7 C" n
  13. .code9 g% c( E+ L. u
  14. .stack  100h
    3 b4 A2 d; q5 V0 y; U  a& m
  15. .startup/ }! R" _3 O2 S9 J- P$ O
  16. pusha
    7 Q! ~+ m7 s! _% U1 {6 ~3 Q
  17. mov ax, 3533h
    7 a  O. j% N% U* \4 D. L6 b/ r
  18. int 21h4 h7 @7 {! Y, ]; ^: g
  19. mov word ptr cs:[old331],es) r1 B% g+ }' I4 G/ D) q1 W
  20. mov word ptr cs:[old332],bx
    + x# i1 K# H/ n' n
  21. mov ax, 3574h
    8 G( m( a! G5 w: A
  22. int 21h# R1 H: _! W4 @( n+ F
  23. mov word ptr cs:[old741],es
    % k6 H3 ]: P' c/ L& J
  24. mov word ptr cs:[old742],bx' M6 l0 Z0 j( o" k9 \
  25. popa/ y+ X4 Q; i0 b' q
  26.         call    memmouse
    0 n: f/ R  P& N4 h' K- L
  27.         mov ah, 00
    9 P4 q/ h/ @- ?3 Y  J) ^
  28. mov al, 03
    # ~1 o4 a% i  y6 W
  29. int 10h
    ! A+ j- n! d- ~" u6 X2 z8 F
  30. mov ah, 06) g, M  F7 \9 k5 Q
  31. mov al, 0
    % X" s# ?) [2 s* j8 V, i
  32. mov cx, 0
    ( V! v- J: a5 ~( E- |4 i
  33. mov dh, 249 a3 E( a+ p# T+ J: E9 q+ H1 {
  34. mov dl, 79! p# c" M3 b* w- l
  35. mov bh, 07h
    3 {: Z! o! ]+ A
  36. int 10h
    : S2 K( B( P1 g' W. Y! l
  37. mov ax, 00000 t( Z9 b4 N% R: d/ K* \/ \$ M  U
  38. mov bx, 0002
    ; O2 x& {1 L5 H; c9 C  A4 E" N
  39. int 33h
    2 \; |4 r  `2 J/ W! w. I/ j
  40.         cmp     ax, 0000           ;if no mouse drive install9 k, b: J+ f5 q( [) {
  41.         je      errormsg           ;show error MSG' Y5 \: A; A- n, V
  42. mov ah, 02
    % X$ Q& ^) Q& n) ^7 |
  43. mov bh, 00; G* C# @- U# c8 r& [! u
  44.         mov     dh, 25             ;Move point out screen
    6 B' q+ u$ S! H5 n; A: v
  45. mov dl, 79
      `6 K% p) w& j4 `  J
  46. int 10h
    ; U( z0 W+ ^8 t8 M/ f, V4 s
  47.         call    showmsg            ;Show info
    ; q0 M% D4 {8 Q2 O7 X0 J9 _
  48. mov ax, 0001
    ' u2 H9 l0 g7 e  u& `* h: j' A
  49. int 33h
    ; Q. h, h) N( a" I' p
  50. ; mov ax, 000ah
    " s; J' I: M0 N- F* B
  51. ; mov bx, 0000
    8 w. g" Z  Y; g
  52. ; mov cl, 0h; `! |, C4 C( k/ ?" U6 A6 J2 `
  53. ; mov ch, 0F0h: t6 I; x: `0 p+ O
  54. ; mov dl, 0h
    4 `+ E! m7 I5 D) n* d- Z% o# _
  55. ; mov dh, 0F0h- U) U( \9 _( W9 g% y2 n, E
  56. ; int 33h9 B$ r% n' [: V, g- c3 A
  57. mov ax, 0004h1 S6 u( R3 g/ l+ f8 ?$ h
  58. mov cx, 0319/ u" w' w# @* g! ]  d
  59. mov dx, 0103
    8 K, ~# ^  {9 I
  60. int 33h
    7 q/ z# x: S! O' ^0 [' i  z0 W" [
  61. casemo:                           ;Case button click and point move % s3 `- ]- H, r; d4 a' i
  62.         mov     ax, 000bh         ;and keyboard press
    7 E# i1 x; F* M
  63. int 33h; x9 y0 a3 ]" p; F, J) S
  64.         cmp     cx, 00h           ;if point move....X9 r7 G) K$ U7 C$ y9 y
  65. jne xmov
    " F: u1 }( s( h4 T
  66.         cmp     dx, 00h           ;if point move....Y2 k8 N6 N) I# `; n, N4 g# R
  67. jne ymov
    0 ~  O& [) f5 P$ B5 T* R; S3 \$ x$ _
  68. xymovend:                         ;X.Y move end
    8 V* q7 g; d& a5 P: j6 b. @
  69.         mov     ax, 0003         
    6 D: M8 a; A( @$ F) M5 ?
  70. int 33h) r. Z( O! t4 o3 ]& D- y4 y
  71.         cmp     bx, 0001          ;if left button click  show ON9 H" k3 e5 y5 ]5 a* @: t
  72. mov si, 1828. r9 p& ^& H1 h1 F* J8 G6 a9 K
  73. je listl
    : G4 h0 d; L8 b5 v8 e* O! x7 N
  74. mov si, 1828
    + u! A7 |3 N8 _( `  _& V  ^+ J) p
  75.         jne     nlistl            ;if left no click show OFF
    6 S# p6 O" s! @0 t3 B+ u$ W2 b: u
  76. testr:5 |1 @$ q/ b9 \1 u/ k
  77.         cmp     bx, 0002          ;if right button click show ON6 V, I+ _+ Q4 r8 f
  78. mov si,1842& t# h0 b5 |" u% J! C- b$ b; B
  79. je listr
    . \7 r  w& \! t9 I
  80.         mov     si,1842           ;if right no click show OFF: K) a! z: h" o8 o! ~% f8 R
  81. jne nlistl
    $ C8 Z6 X5 A8 G. x6 T
  82. casekey:7 f  N4 h) L8 f1 F5 ^
  83.         mov     ah, 01            ;if any key press jump check. J  [9 T% w: J3 N1 V+ Q: |% t
  84. int 16h  c# W+ t3 o. s2 |2 v
  85. jne kpress
    6 o: z4 r0 w1 j! {& @# R0 R
  86.         mov     al, [chkl]        ;check x flag, X- o6 X: R* B8 G
  87. cmp al, 02h: u; [: \  ^" X) J0 Z' l/ l% ~2 n
  88. jnb chkok
    $ N& d8 @' b  s' z. H
  89. jmp casemo8 ^( [+ _0 {1 F% `4 \
  90. xmov:                             ;if X moved, get the X flag+1
    ; ?* v( t7 a# C* i
  91. mov al, [chkl]
    7 x- i: _% R% h. ?3 o
  92. inc al* {- l5 A3 i  r! x( ~
  93. mov [chkl], al
    . c  Y5 D  M8 p; C4 @0 S2 q5 G5 ~
  94. call passok
    # Z% x5 U7 }, N% E& v- v
  95. jmp xymovend; `5 ]6 ?+ v( p0 X' @' q8 l( g
  96. ymov:                             ;if Y moved, get the X flag+1
    2 B+ {) K. E8 w7 X; B& R! W" p
  97. mov al, [chkr]5 d5 E4 X$ E7 N6 X
  98. inc al' T/ |: W9 E1 v
  99. mov [chkr], al
    ; I  [% S) t6 R
  100. call passok
    : m7 F: n, D& i% ~5 l! [* g  [  V; N# a
  101. jmp xymovend. q% X1 R5 n) R' `5 K) |) M# T
  102. 2 ~- x$ F( Y; w/ B* f, R- ?
  103. passok proc near# @, ~5 m, V) ]7 i6 e, g5 h
  104. mov al, [okcheck]
    4 k# g' I% ]9 T) d" F2 N8 P- R4 Q
  105. cmp al, 17 |" q( f  ]4 \4 J  _
  106. je let0/ {1 X6 \+ O5 l/ Q7 {. j, p
  107. jmp passret
    ' [4 Y: M* a* N  {6 [1 e
  108. let0: ( k/ @! S- r# l  C
  109. mov [pass], 1$ }# r) x7 D  r; P
  110. passret:, [$ j( D* U8 W
  111. ret
    : ?+ ^1 I" t6 [
  112. passok endp # }  _1 c. R1 j  E
  113. 5 C$ d: s  [% z  C) k1 j: j
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    ! U* n+ K( d- a/ E0 y
  115. mov al, [chkr]
    : I3 y- f) M1 u% n; u- l
  116. cmp al, 02h2 R/ S) D! D1 w
  117. jb casemo& F% V5 T' m. y1 O
  118. mov al, [lk]
    1 |- R) r0 W$ |  a8 h
  119. cmp al, 15 T6 G/ ~# K7 b! }
  120. jne casemo* F; q; u" Q4 i& ?2 p7 b; H
  121. mov al, [rk], c. t( J0 T/ T8 @# P0 A; V
  122. cmp al, 1  c) G( N2 W4 N
  123. jne  casemo
    ; G8 O) w- U* o+ L" p5 p
  124. mov [okcheck], 10 n2 e: O; X% `! R' m8 O9 z; E
  125. mov al, [pass]! [3 k/ \' _2 A  {
  126. cmp al, 1
    . I3 d; ?, h/ L% [( K$ v: `4 {
  127. jne  casemo
    1 P$ L/ k8 @4 z5 Q) U9 u
  128. mov ax,0002h, n/ F; t) M! _
  129. int 33h2 h5 g1 P( b0 l, {, T: [6 M/ W
  130. call cleascr
    6 u6 u" W/ i- [: H  e
  131. 7 P0 J& O$ W3 l3 e8 o
  132. call oldint
    4 L) s0 `3 {0 Y2 ~' U2 Q- j1 s! D
  133. mov ax, 04c00h& O) W3 V9 v3 Y6 P: B
  134. int 21h
    ' k( L4 z2 W: r  H: o
  135. ' A. y+ I! G* e8 H  {) q0 ]6 o
  136. okexit:
    . e, K8 M! x! c/ d. j
  137. mov ah, 4ch5 L% k- j) v- [* S! v' h
  138. mov al, 0: N. R4 {- t8 Q7 e8 D! n
  139. int 21h( p8 ?- \2 \/ R2 G
  140. listl:                                 ;Show ON
    7 u$ c! X) l" [- {0 U
  141. pusha
    1 N+ H' a5 D9 A: \% p& H7 U# C
  142. mov ax, 0b800h
    ! x3 j. Z/ C& ?( V3 C
  143. mov  es, ax
    % f- j% L! w# \2 n' p5 V! V* R! _
  144. mov ah, 47h
    & s1 m! _6 v) E1 L3 F
  145. mov al, 20h
    & h% G- ~; q! ^/ v! a
  146. mov es:[si], ax& T- [+ e: n+ p4 J' _+ q, B
  147. add si, 02) ~. ^# V" K4 {' B- i' W
  148. mov  al, 4fh/ P! ~5 T  v6 _7 f5 @! ^, b
  149. mov es:[si], ax. S) d( o  n$ n0 \# k1 `
  150. mov al, 4eh8 Q. @) V4 S8 C2 E; T
  151. add si, 022 T7 q3 K% N% |( U9 \" q" D
  152. mov es:[si], ax
    # h! G2 f% a- f+ l- X
  153. mov [lk], 1
    ) e# o( S. i- n0 v+ t
  154. popa
    / |  N; Q9 `$ z' p2 |) w. z
  155. jmp testr
    1 @0 m4 B. \5 i1 R( z5 \
  156. listr:                                 ;Show ON
    3 n8 n  m$ ~  o. j
  157. pusha4 {" O; f4 [5 K. I- G0 d4 f: C
  158. mov ax, 0b800h- o! U$ y( I5 b1 H
  159. mov  es, ax
    : \$ Y* d! D6 Q$ |% l& c# [# e
  160. mov ah, 47h1 a( Q  y5 ?; I' I
  161. mov al, 20h
    # I9 o: m4 L$ }( G4 z
  162. mov es:[si], ax0 W9 l/ `; U+ T6 v6 M8 K" ^) L& g
  163. add si, 02
    ; n  c& H( U1 [6 |
  164. mov  al, 4fh
    ! Q0 c$ w6 [8 v; n  U9 i. J
  165. mov es:[si], ax: x. E& [* |5 q/ |1 `2 S
  166. mov al, 4eh
    4 {4 z+ L3 [2 i
  167. add si, 02: D- z/ T4 D; W5 @7 f% W) y7 e: n
  168. mov es:[si], ax
    + k' ]8 `! J( n& ]- L
  169. mov [rk], 1
    * t/ W$ m+ P' c
  170. popa
    6 U% K" V5 |' t' O4 }  o
  171. jmp  casekey5 W. J' d. ^$ }$ U2 [

  172. + t  }* n+ Z8 L" `5 c. w( R- i# w
  173. nlistl:                              ;Show OFF) [7 c* s3 y# D- N4 L9 I& `& O# c( S
  174. pusha   
    . t- C; F/ w$ A, H+ X( S# A
  175. mov ax, 0b800h, t3 Q) D7 U; D6 O" Z% l
  176. mov  es, ax- C1 \' R4 p& K! U# ?5 Y; `# x
  177. mov ah, 17h9 W8 |2 o- C7 x2 p! u0 L
  178. mov al, 4fh
    5 \  @1 a5 Z6 Y
  179. mov es:[si], ax
    0 L0 t3 P8 y: N) I7 K: ]
  180. add si, 02
    , @2 h6 O1 F7 L2 n2 ^
  181. mov  al, 46h  i8 Q- y/ P7 x8 w2 U
  182. mov es:[si], ax3 T3 O6 M7 L& _# J% s& w
  183. mov al, 46h
    / J" z3 I7 Q7 Q
  184. add si, 02
    2 r: ?0 u, G: u8 N
  185. mov es:[si], ax
      b7 e( ~) H$ _  S" k% \
  186. popa8 u; l" Y  F+ W
  187. cmp si, 1840# z+ p5 Y0 R, W+ ?/ T
  188. jae casekey7 J. N+ q* y, S4 ?4 u) ]+ _! b! R$ F
  189. jmp testr
    + [8 q; ~* e' E2 H% \3 o

  190. ! [; B5 b7 V; Y( g
  191. kpress:                             ;Check key press if press<ESC> then EXIT2 L; g) M6 |6 w. {  a1 E
  192.         cmp     ah, 01h             ;and return a error2 L' |# D+ O2 h0 g" [
  193. je exit1$ s1 I) ]& b% H
  194.         mov     ah, 0ch             ;if press other key then clear
    - _5 l  b' b; j* `1 R3 q& a2 B
  195.         mov     al, 00              ;keyboard buffer
    ; G: d% D7 a" a1 |+ u% j
  196. int 21h/ I, C! |7 L2 j/ a& o, G
  197. jmp casemo 2 X0 o# U! s9 K7 Q! V( P
  198. ! W& G4 T: p6 T4 V
  199. errormsg:                           ;if mouse driver no install8 ~2 i3 ^* E' H3 d
  200. call oldint: g) V! Y9 i; U* ^1 x4 W6 `
  201. lea dx, offset emsg
    + t; l. @3 O( Z8 z, [% d
  202. mov ah, 09h- r$ K% h0 Q4 r  b4 a" l; Y: I5 @
  203. int 21h3 [# R7 B) \0 \6 o
  204. mov ah, 4ch& T4 [; j- z! \; S4 }6 e
  205. mov al, 20 @0 \( @. q6 u5 j' F) T$ Y8 t7 [# Q
  206. int  21h
    6 q7 v! }6 H: }
  207. : t/ y" y3 h8 N2 V% Y
  208. exit1:                              ;error exit, h; C  f. H* y# O
  209. mov ax, 0002h& l0 }4 N# P7 k( H
  210. int 33h9 l  ?2 c6 |' ~; V0 N
  211. call  cleascr
    3 l, W+ I7 d( ]) q8 {
  212. call  oldint
    6 N8 k# ^2 K2 q8 |1 V/ e6 Z
  213. mov ah, 4ch- e2 _- |1 h$ I9 X
  214. mov al, 015 |1 t6 L; E. F! t3 W/ y
  215. int 21h- H9 U. l0 X6 `, ~3 W, k
  216. . Y  @8 L2 a& A1 M6 [9 s: s/ K
  217. cleascr proc    near                ;clear screen$ h! J7 S5 K/ W8 z" X; i+ M
  218. pusha& ]+ i# N: H' O8 I: G# S" d6 p
  219. mov ah, 06& `3 Z( f4 m0 `3 E6 K8 Z* k( e
  220. mov al, 0, j' w  g8 \* q+ k* K4 X+ Z
  221. mov cx, 0
    6 @4 |7 L. L' ^& K2 D$ g% n5 V; }
  222. mov dh, 24( O- k9 [% \7 o2 K6 R
  223. mov dl, 79. \$ A, _4 C1 G& G- _. X
  224. mov bh, 07h
    * O7 X1 O2 s4 c  ]2 {: \5 J' O
  225. int 10h
    7 p9 r* z* ?9 ]$ M# b
  226. mov ah, 02
    3 C3 K3 F& S, d# T/ c8 ^* f
  227. mov bh, 00
    $ t4 x/ T* |6 F/ |; m9 ^1 ?0 J
  228. mov dh, 0+ t0 f$ ^  n1 F; z% ^& O4 x
  229. mov dl, 0$ e- U) d5 v1 K  z7 t
  230. int 10h7 J4 |& l* u: {7 z% O
  231. popa3 A1 s& ^  {+ N" S5 ?% e
  232. ret
    , _9 q8 y& ~2 o5 H$ `9 d: k
  233. cleascr endp
    ' W5 w% W5 }! k2 g3 _
  234. ; i$ d$ a7 t& ~# V2 a
  235. showmsg proc    near               ;Show info- l) {$ q7 _5 T" c8 ?3 Y$ @; Q, _
  236. pusha
    ) V3 p6 y* G6 f1 [( Y
  237. lea di, offset showms
    # h7 d8 l( {4 |) _6 S
  238. mov ax, 0b800h: H7 m* D4 X" u5 F
  239. mov es, ax
    % |) n. W  Y$ @3 ]2 @
  240. mov si, 0$ f/ L1 z5 B! ^' ^+ @
  241. mov cx, 480
    ( I' q; l2 M; J" B% z. i4 {6 u
  242. mov ah, 07h* ^/ l" k# I/ A  A( [3 Z3 C
  243. @@:7 O/ X$ u& C% W2 L
  244. mov al, 20h) u) U: m9 K6 ^6 G+ v
  245. mov es:[si], ax
    / B' \( z& w. t. V" r1 Q
  246. add si, 2$ L- m* G9 x! H( J1 |
  247. loop @b
    ' X8 B, ~$ `7 ~8 T6 c3 r$ C
  248. mov cx,880" r& C$ |% c' l/ F9 s
  249. @@:, e7 P4 f1 H5 R6 ?6 e! A
  250. mov al, [di]
    ( c& c9 C3 L9 s8 F4 c4 g
  251. inc di" A$ E; W( X* {
  252. cmp al,20h2 m% e  Z# b& s8 E4 p; p
  253. je showch1
    , b5 ]0 x  [' c7 @# T6 u
  254. mov ah, 17h
    7 o6 V: y+ @2 k* e; d
  255. jmp showch3
    7 g, I# N1 D1 ]: |1 a
  256. showch1:
    2 @8 B/ D! X8 U( c% }) c% U
  257. mov ah, 07h . r# D9 X: O7 t' i
  258. showch3:: b6 X$ K$ }7 h0 m
  259. mov es:[si], ax/ t. R: A" H5 w3 c" @; _
  260. add si, 28 r7 B% R; }" o" r( ^0 L! g
  261. loop @b0 I6 Q9 D3 m* s7 B9 W
  262. popa9 o; b2 g" H+ a( M* A2 P
  263. ret/ }* m+ d. |+ K9 }
  264. showmsg endp" r9 i9 `1 X9 k. Y, z0 i3 c
  265.   N3 p$ g" G1 U# e0 [+ y
  266. oldint proc+ `3 R8 Q2 y9 @% |* P
  267. pusha1 o! ?9 F) ]! x. x$ Q
  268. mov ds, word ptr cs:[old331]9 U: n  a& y2 p$ I7 @8 D
  269. mov   dx, word ptr cs:[old332]
    6 r. ]8 g2 F& x: y1 U$ Q
  270. mov ax, 2533h$ b5 J9 L7 L& z9 B& I! s
  271. int 21h
    % z% K* Q( s. d$ k, T! m5 ]
  272. mov ds, word ptr cs:[old741]- Y9 M; T) D  u% b2 K
  273. mov dx, word ptr cs:[old742]
    1 ~4 f/ b( U+ c) N7 d
  274. mov ax, 2574h
    9 X4 U' N) s6 w& O+ ~
  275. int 21h
    ! K) [$ c2 W" @. j
  276. popa
    2 k8 R9 k  ?8 g% m& n- ^' T/ i
  277. ret/ a8 Y* P* G- T5 ?' O! c8 S% Y
  278. oldint endp
    ) Q* G5 i$ d) r" R2 R8 W

  279. 2 m3 z* G& I! H, t0 p
  280. memmouse        proc
    1 F- x! P* Y+ L0 Q
  281.         xor     ax,ax( j* [! d9 U2 q( T, A' z
  282. int 33h
    8 K( k+ ~8 J+ h5 O$ o  u9 o8 ?
  283. cmp ax,0ffffh. e% v4 ~, p& U7 J
  284.         jne     not_loaded
    : h) [0 A  J  \7 _  X' c
  285. mov [memcopy], 1
    7 t1 P2 V/ D. ?0 X4 ^
  286. ret
    0 @% s: R$ Z1 |: {
  287. 5 F* u9 I" t5 @$ ?
  288. not_loaded:! i3 Y7 K% h; t  v
  289. / v7 w/ ?" i3 ?+ [* ^; f
  290.         mov ax,2574h  k; e! n6 R( X8 l) n! h4 J
  291.         mov dx,offset new_isr5 `( L8 J' y" m- [
  292.         int 21h
    + J: J( ?- g6 r: A, q. _5 l6 N
  293. + p2 ?: u/ M1 S+ l2 `" G9 o0 F
  294.         mov ax,2533h% B5 _" {. ^; a
  295.         mov dx,offset new_331 C# r# e1 S$ L
  296.         int 21h
    4 e+ Z) A2 X' Q7 U* n; g, }% N% _: J
  297. % m7 f6 Q" h9 P8 N; {# v9 R; X
  298.         cli
    - I, W  @. L4 S8 k6 x* Z
  299. & B1 [4 x1 x$ i, L# l& K8 G/ \
  300.         mov bl,0a8h
    % ]  [# z+ G6 a) ]- l
  301.         call keyboard_cmd
    5 U* B8 [  B. G/ `' H0 x8 O- M' D

  302. 6 z& R0 T1 V$ I2 D# x. v
  303.         mov bl,20h0 H% m; y( Z- R6 e: o/ x% N- T
  304.         call    keyboard_cmd" T' }# {- r7 ?' G9 z
  305.         call    keyboard_read6 g: {  v, F- l4 L
  306.         or      al,2
    + ~0 f! v9 k$ l1 b
  307.         mov     bl,60h; z" B7 Z# @7 Y6 s) a
  308.         push    ax
    9 @" ~& i- n$ S9 J2 l
  309.         call    keyboard_cmd/ |+ F* Y5 {: L" K( e
  310.         pop     ax$ u5 M9 q( S7 O7 R/ l1 M; B7 n& Z
  311.         call    keyboard_write
    2 N4 d: e5 ~; \# J

  312. 3 J5 R) v" i3 h# s
  313.         mov     bl,0d4h( w& y/ A" G8 T
  314.         call    keyboard_cmd
    + F3 B( h4 y$ O3 [% \+ L
  315.         mov     al,0f4h) F; F2 h) z5 r5 b
  316.         call    keyboard_write
    9 T2 u/ e9 X8 x" }5 p

  317. ! p7 Z) G0 F6 z) X
  318.         sti8 H0 {  W2 r) B" \# o# t8 [
  319.         ret
    ) l2 z, V: _9 Y  N, F
  320. call_user_isr:* u. E! ]9 }- \0 y
  321. db      60h& o  R1 b5 R" G/ K
  322.         mov     cx,cs:[pos_x]
    9 D  A+ v- z. m) K; q3 G* e0 s: t
  323.         mov     dx,cs:[pos_y]
    ( D1 O2 T, U7 I. v/ g' |
  324.         mov     di,0 ;cs:[x_move]
    & t+ r3 I7 ^$ {! m( O2 f
  325.         mov     si,0 ;cs:[y_move]3 f$ m  q5 H$ s* A+ g& u4 }* Q& l6 O
  326.         mov     word ptr cs:[x_move],04 N& h. G: Z3 b
  327.         mov     word ptr cs:[y_move],0
      J. Y' y6 A+ \) C+ O
  328.         mov     bl,byte ptr cs:[buttons]1 q5 ?: T% Q4 o2 X& @5 t
  329.         xor     bh,bh
    / h6 T# i" d: j' H) Z8 `& a
  330.         call    dword ptr cs:[user_subroutine]
    , p2 _: u' W$ f8 b5 a8 q, a0 m* Z3 Y
  331.         db      61h
    8 r3 X6 s- v  ]8 ?! Y7 T# d
  332. ret& A1 W* G% I7 k$ a" k
  333. new_isr:
    " y- s! Q/ D- R4 t
  334.         pushf
    4 P% o6 m, ?7 c9 ~- y3 ^7 S7 z
  335.         cli( i, P7 q. }$ ^7 m3 C# h
  336.         push    ax
    / j" I/ i2 y2 e3 U
  337.         push    bx5 W1 v# _# J4 c: Y+ {! O  z
  338.         push    cx, H. r" \4 x; _. {, }  e
  339.         push    dx
    2 ?8 Q! s( u: r$ m7 m
  340.         push    di
    ( s9 B  @8 h/ w: r
  341.         push    si# n$ V/ p1 [3 G: t
  342.         push    es) v, ^0 h) N) C" c& ]  I
  343.         push    ds* z1 D3 q! U& u3 l" }) V( e

  344. 6 q/ `' @1 F, a" X$ P! U0 n
  345.         push    cs) w  r) @0 F0 y/ a
  346.         pop     ds  D6 n- W* Q, d+ C
  347. * F  Z% s# f* S: L  Y" q" h) ?* L+ b
  348.         mov     bl,0adh
    ) ]3 R* p: O" i4 v7 ^! V; Z' i
  349.         call    keyboard_cmd' i5 |2 H0 \' ]: X- S
  350. - z- H9 O0 p8 I  Q
  351.         cmp     byte ptr [first_time],03 s  X6 x# n& ~2 D% u
  352.         je      not_first_time
    ' O8 s+ F1 a6 i) Z# l

  353. 4 z! ^* Y5 J+ z$ B9 C1 @
  354.         mov     byte ptr [first_time],0
    # [% B6 c& \/ ?% q* d. a6 l7 q( L8 D. o
  355.         call    keyboard_read
    " g9 L6 ~$ ^* j$ a6 ?
  356.         call    keyboard_read
    1 q$ j& s+ _( c( |! }
  357.         call    keyboard_read- H$ ?/ v# W) }1 _
  358.         jmp     no_show
    * ?+ V  ?7 F% u4 `  }, e1 w; s

  359. 3 ~9 U2 P1 X1 n2 [+ |$ \
  360. not_first_time:
      V5 Q' ]2 f/ A# U
  361.         mov     word ptr [temp_mask],0
    * k+ ?; [& ]7 n1 n
  362. 5 c, o: I+ `' [$ W! ~! y. N
  363.         mov     cx,[pos_x]
    ( I6 V0 H1 P. y4 M* I: R% `
  364.         mov     dx,[pos_y]
    0 j' ^" ^2 J$ F+ ?  m1 }

  365. $ M/ H" v: B& H
  366.         call    keyboard_read. Y8 W6 _& w5 N2 z% N6 Q; O  N
  367.         and     al,7 ;32 }7 s* M$ S+ ~3 _, t% n
  368.         mov     ah,[buttons]3 }) H6 I9 J# g* \' N+ y8 T
  369.         mov     [buttons],al& y  J! E, b0 v: K9 |" L0 b4 M
  370.         cmp     al,ah% B7 e  d2 W" Y" e' y
  371.         je      no_button_change
    ; X0 f. w: O6 G* r$ k
  372.         and     al,3% y1 c  M8 c" U+ D( {
  373.         and     ah,3) T8 C# O3 W9 z
  374.         xor     al,ah2 V* s9 Q* X( |- I4 P( a2 C, y% P
  375.         xor     bx,bx( g5 r0 i+ h0 {. a4 g" O

  376. 5 F- [/ k0 Z* X0 Z) \) Z/ b5 k& I
  377.         push    ax
      [3 ?5 S5 e- F. J
  378.         test    al,2/ K6 @# a; s) z, q, g
  379.         jz      no_right_button_change! J( R8 M# f9 }( z  z
  380.         and     ah,29 Q* b9 t+ V' r; W  X1 [3 c
  381.         jz      right_button_pressed( u) ]& h4 i# ]( s- x! N8 o8 P
  382.         or      bx,16
    # X& v3 X, u5 g7 ], H4 b
  383.         jmp     no_right_button_change  T' @3 v0 V' {6 z3 l! W/ U1 c
  384. right_button_pressed:! y# V1 d! H7 I6 R) \& Q2 b/ Y
  385.         or      bx,8
    8 c6 e3 I( ?" x, I+ m
  386. no_right_button_change:
    , N( r! k  h0 l  j' w- v' V5 h
  387. 8 q/ g1 {1 [0 N" m3 z' K
  388.         pop     ax
    . z  j9 Z. W' c4 K
  389. + X% o" \7 s1 Y0 l2 x* V
  390.         test    al,1
    6 L, Z6 S1 w2 {' |' p5 d
  391.         jz      no_left_button_change
    ' M9 a, u$ S9 M. m: ^2 U
  392.         and     ah,1
    0 @4 I+ {1 i/ g- c
  393.         jz      left_button_pressed
    / {5 @- V9 R# t' ]- A! o7 U
  394.         or      bx,4$ d/ q( o' g! c, h+ Y: j
  395.         jmp     no_left_button_change
    " c" z2 H) |) ~. s$ Z. o* O
  396. left_button_pressed:; ?7 o" I/ ]) e
  397.         or      bx,2
    9 |0 I  g- w/ F5 a
  398. no_left_button_change:+ n  X- \- [' k- d! \7 L7 S* g
  399. 2 |' V- O$ U, r  B
  400.         mov     [temp_mask],bx3 D( {+ F) `2 J. z# t; I
  401. 3 c0 b" }$ L0 Y2 b
  402. no_button_change:9 M3 _- `& M9 s; y5 y% ]
  403.         call    keyboard_read/ v0 R0 j' x4 S4 {/ W7 v# D9 V" d2 G
  404.         cbw
    ! M& ~4 m2 I* _) p
  405.         add     [pos_x],ax8 O6 c: Z6 h8 q
  406.         add     [x_move],ax/ `- y/ p) G/ d
  407.         mov     ax,[x_min]
    % k7 F7 |  L& e0 y0 r( u4 r
  408.         cmp     [pos_x],ax3 i. X6 D3 A1 X+ H3 d  m& N- z' h
  409.         jg      good_hor16 b( ~( ^) J: v# K- V, X1 G4 }
  410.         mov     [pos_x],ax( Q, H3 I& ]  ^5 U% d
  411. good_hor1:7 {* Z* Y; ^, a" w
  412.         mov     ax,[x_max]7 m2 _  O7 ?% S
  413.         cmp     [pos_x],ax
    : |( x- P& _0 b, y) E2 n
  414.         jle     good_hor2' X/ f) b3 b' Y3 Y2 s6 v( D" e' f" X
  415.         mov     [pos_x],ax) B# c+ H' g" x, s# _. W
  416. good_hor2:
    : q5 E  u4 s0 R" S5 O6 I* v- A
  417. 6 z8 j# q# w% l' r' O/ V; Y! r
  418.         call    keyboard_read
    & Z( E% u9 r; a$ T) _8 \% I
  419.         neg     al
    1 u) ?! V3 \0 V9 e& L$ g3 |
  420.         cbw
    4 s- q7 Y- q( H2 j7 ?
  421.         add     [pos_y],ax
    * ^8 o9 w( \6 O4 ~$ o
  422.         add     [y_move],ax
    : c0 F" J/ I% r& c/ t% c8 m& Z
  423.         mov     ax,[y_min]5 W. `" ^) K: B& ?# ?+ ^
  424.         cmp     [pos_y],ax
    / R6 u  T) b5 z# J3 Y- X
  425.         jg      good_ver1
    3 k9 d1 l/ H$ o% R: i
  426.         mov     [pos_y],ax
    3 K& Q. y- @& [/ W: R) C
  427. good_ver1:* u2 Q7 w& ^$ r* G
  428.         mov     ax,[y_max]. i+ m* Z3 Q: |& `: g0 c# _' K
  429.         cmp     [pos_y],ax' [/ a; t' Z* s. C
  430.         jle     good_ver22 t, E) q" A( F5 ^/ Z
  431.         mov     [pos_y],ax
    , g3 x& W7 X; ?. _
  432. good_ver2:# N5 [- D* v% d2 P6 Z
  433. 3 T* e  ?; ]% l" j2 j
  434.         mov     ax,[x_move]9 y& H" ^- c: F, O* ?( R+ z0 S
  435.         or      ax,[y_move]. m8 j! @9 g) w" o& _% s2 c: q
  436.         or      ax,ax
    ) |" b5 s1 c7 T/ D- i/ Y2 W
  437.         jz      no_change_position
    ! U: e4 d9 \7 b+ _: d# K% L( v# n
  438.         or      word ptr [temp_mask],10 s$ ?# w5 H8 R! M6 |
  439. no_change_position:
    6 R% `( c5 W5 w1 i: J
  440. + l) A/ q6 {& Y: x: j
  441.         mov     ax,[temp_mask]
    ; |: a2 h4 S& ^
  442.         and     ax,[user_mask]
    " o! Y) l* p+ t6 A( f
  443.         jz      no_call_user
    ; R" J$ h6 D" ]
  444.         call    call_user_isr
    % s1 h. j4 w# B  Q( u$ L
  445. no_call_user:
    2 o) t8 R; U8 I  g* T' e  g

  446. * q% V4 D% {3 y$ ^. ]- c
  447.         cmp     byte ptr [sm_flag],1
      g9 c. h4 K/ o; k1 c
  448.         jne     no_show* P4 Z+ F7 |4 x0 Z4 Y  @9 Y% n5 Z

  449. 4 Z9 G- B( K; \# F
  450.         shr     cx,35 I+ X. j% Q9 m; v' K7 s* G
  451.         shr     dx,3
    . i3 ]+ m. X3 a& J
  452.         mov     ax,80
    , j( H5 h; g; G
  453.         mul     dl
      ^& W# x3 V/ y# P4 ~
  454.         add     ax,cx
    ; L& l) H! g( g5 r+ s/ U# F
  455.         shl     ax,1
    0 ]% |# G8 a6 e5 Z: G* K! u5 \
  456.         mov     di,ax
    & z+ ]0 f7 M5 _: o
  457.         mov     ax,0b800h. ~' z% W' I% f' Y8 |
  458.         mov     es,ax
    # l: h: @5 \% R/ T
  459.         mov     ax,[save_char]
    : d& y/ S% g* o1 m, _% D. H+ T' e* X
  460.         stosw6 h" x& {. V& g8 W, ^- j% v4 n
  461. 8 E2 ~$ t+ p+ c- W0 t% [& h
  462.         mov     cx,[pos_x]; i# {, z; G4 n6 ?4 j
  463.         mov     dx,[pos_y]/ N6 p  E1 N6 V  s
  464.         shr     cx,36 y; [( N* h0 [$ D. O% j( ]
  465.         shr     dx,35 S% w3 w% g( `/ S( e5 D3 `' K) A
  466.         mov     ax,80: C: l1 p) b8 N
  467.         mul     dl
    4 @( y9 D2 F8 z: D* m2 Y
  468.         add     ax,cx& ^) s0 m% [* n5 u, H5 K4 G3 u
  469.         shl     ax,1
    ( R9 a9 e( z. d0 A. T& g
  470.         mov     di,ax% p% ^. h! N9 e5 Z
  471.         mov     ax,0b800h) k/ |1 _4 F5 ~# U- P+ J
  472.         mov     es,ax  ^* a+ u% f5 K
  473.         mov     ax,es:[di]
    7 p+ J% V  x* f
  474.         mov     [save_char],ax
    6 w  r! n/ J$ [! X0 B
  475.         not     ah) N) @! c2 a& v) T; n1 L: p$ D
  476.         and     ah,7fh
    ( f7 c7 T/ ]4 f& b& y) l+ Y$ q) {
  477.         stosw
    : \+ |. _& V2 X5 o. w1 t5 x0 V
  478. no_show:
    + K4 V3 b; [( k" [: p. N3 a0 S
  479.         mov     bl,0aeh0 o6 J5 {( `' M  ~% ?9 o% N
  480.         call    keyboard_cmd4 B, Y0 ?: Q+ y( m# Q8 ~
  481. . N$ v$ R( s) g
  482.         mov     al,20h4 y* F6 M; {! `0 X
  483.         out     0a0h,al
    " B, |( R7 D( k) `* h5 m+ c+ z
  484.         out     20h,al
    7 b6 W, r' U9 q3 a! I2 g- w* `
  485. # p2 g' {, S- g% \7 R/ J4 l
  486.         pop     ds
    ; ^3 I$ X$ H1 Z! `. v3 J* j9 b& o
  487.         pop     es6 `/ K8 n+ ^7 V
  488.         pop     si
    , P: d" Y% u$ \# N
  489.         pop     di3 j, k" U, `0 e+ ?; a
  490.         pop     dx
    6 {, D8 p( l8 h- n' |, S
  491.         pop     cx- Y! d. G% O, x
  492.         pop     bx, y+ X) a* y/ e% {% Q% F" c: H
  493.         pop     ax
    8 Y$ R! D' V- T0 N  o
  494.         popf
    $ ?# _! r8 P  t" X
  495.         iret6 W( x- f3 h% Z  H$ B) W% e

  496.   r' n2 B8 a6 H" O) U. z
  497. first_time      db      1
    . P+ Y1 ~+ K, T6 o9 `+ F9 U
  498. buttons         db      0
    . b% o) Y! a' a9 Q6 Q  _
  499. pos_x           dw      07 P; y/ ^! l/ q, ?
  500. pos_y           dw      0" f# z7 t  H& R" K7 h4 p' r2 Q
  501. sm_flag         dw      0
    $ s  t% I" z, k
  502. save_char       dw      0% O' A# h) L$ @7 j
  503. x_move          dw      0
    ) ~5 T) Z0 p2 ?8 @+ e
  504. y_move          dw      01 `7 `: J# ]# ~. N4 e
  505. x_max           dw      639
    . d0 i5 q9 ?& f1 n8 J
  506. x_min           dw      0
    3 _/ Z3 l8 N- f% q
  507. y_max           dw      199
    + E$ M9 E7 s1 V  V
  508. y_min           dw      0
    0 e2 s9 q: o1 j* E0 m/ z* Z
  509. user_subroutine dw      0,0, k1 r$ h) E$ |) p% l$ l, _
  510. user_mask       dw      00 ^9 E, ?/ T& k6 U  X
  511. temp_mask       dw      08 b# T- |- ?( X# `4 d
  512. 7 I2 N$ x5 f  r  R+ V4 h4 Y
  513. keyboard_read:
    1 z. `) v2 J1 ]2 S. |) b
  514.         push    cx5 J3 u/ X; Q0 f: w+ w+ f
  515.         push    dx
    ( U# c5 ~  C$ @5 B
  516.         xor     cx,cx, D" U1 [0 H2 O  w# w8 j: F
  517. key_read_loop:2 k2 ~/ X0 v! d* H( W1 {/ C
  518.         in      al,64h2 @5 f# j, P/ R! y* c6 |
  519.         jmp     $+2
    4 x# ^+ j4 o8 r2 X
  520.         jmp     $+2" R; j) {; {) U9 l; u
  521.         test    al,1) K) Q* M& z4 V( \! N. S
  522.         jnz     key_read_ready
    . _9 F: Z1 J1 I2 S3 s' r
  523.         loop    key_read_loop8 f6 ~9 h2 Y0 s: k. g
  524.         mov     ah,13 q; N( G5 H& T" a9 B' q5 u
  525.         jmp     key_read_exit
    2 u+ ^( h' O$ s
  526. key_read_ready:
    2 A, `& L- }' h1 j* v
  527.         push    cx
    ) T" P& M% {  U8 N+ E# u
  528.         mov     cx,326 l0 y& w1 |: I& A+ ?
  529. key_read_delay:
    ' m" _8 k2 ^$ ^& c7 @
  530.         jmp     $+2! }* @7 Z/ j3 d
  531.         jmp     $+2
    2 a# y' ?1 k+ L' r! o
  532.         loop    key_read_delay# d4 c: M2 e/ K) I, T5 x
  533. 1 o# O" O5 a7 K7 e2 r' }7 `, H- e
  534.         pop     cx
    ( \7 V& {* R& A; v% P- A

  535.   \2 x  |2 s; v7 F" G+ |
  536.         in      al,60h
    1 Q9 h# @( [% p
  537.         jmp     $+2
    - m/ v" p. H; ?
  538.         jmp     $+2
    / j* r  b" d& z4 L7 g$ U
  539.         xor     ah,ah
    . [) M9 P' o$ [& v# ~, v% {" Y
  540. key_read_exit:
    & g1 o/ E# y: h
  541.         pop     dx# L! M# e* e9 a; G% M; }& n, \/ Z
  542.         pop     cx
    $ a) f: z* ~% i. ^) _5 v8 O, E
  543.         ret/ |. w: J8 V) G

  544. ' a. V  K% g, N/ H- y
  545. keyboard_write:' `2 S: @7 j* {2 R
  546.         push    cx6 ?: |4 q. h; W8 }- M
  547.         push    dx) {( J* f* F" |# D9 d* K
  548.         mov     dl,al4 k  {& N( V4 x1 F
  549.         xor     cx,cx  O$ U; U' h$ H3 B& ~% o
  550. kbd_wrt_loop1:
    % q  z; \2 d' D0 z. c$ _6 w
  551.         in      al,64h
    1 Z0 @0 K' h& F& I- m
  552.         jmp     $+2
    - `. Z! G. W7 h3 B$ U
  553.         jmp     $+24 j/ Y  R9 Z( S; C( F9 `* [. Q+ L( l
  554.         test    al,20h
    - O! f3 f, q/ t* o( j5 `
  555.         jz      kbd_wrt_ok14 y' l+ n9 t0 {% U8 \5 W7 k
  556. 3 v4 Z' W6 R$ G# J7 E: [% A* n
  557.         loop    kbd_wrt_loop1" C9 y2 Y* i% O  T

  558. 0 K( A8 P' G+ t& G' Z
  559.         mov     ah,1" U5 G- r: U, v; u3 f% v7 o
  560.         jmp     kbd_wrt_exit' M1 X; r3 F* ]# i$ W. V, X) u

  561. & p2 p4 \8 a4 K+ T- Z
  562. kbd_wrt_ok1:9 l: o3 T) g! @
  563.         in      al,60h
    - P3 \; }3 E5 }. }) b0 K
  564. # a# [) J9 F9 \
  565.         xor     cx,cx
    6 V3 u9 L/ V6 v: M% |% ?# w
  566. kbd_wrt_loop:
    / s6 z- q. e: ~. E  g
  567.         in      al,64h/ R' ~2 ]  [- T, W9 c& _
  568.         jmp     $+2
    ) ?4 ?# G# a. T( v' V7 Y
  569.         jmp     $+2& [1 y+ R/ N6 V0 f
  570.         test    al,26 i/ j/ H! |6 p# Q
  571.         jz      kbd_wrt_ok
    $ X0 T5 Y, M$ h1 F: C) j9 b" [

  572. + `/ a7 u, t* u9 r, W8 Q; N
  573.         loop    kbd_wrt_loop, D! L& Q% ~. K! K( U$ ]8 n
  574. : l8 b. o5 U) y7 L' y( D7 I- v! m
  575.         mov     ah,1
    : j/ X! f8 m* E" g, M5 _; f
  576.         jmp     kbd_wrt_exit
    5 U. t7 ?! e( m* _, f3 x* _
  577. , Y/ o6 e+ C8 y  x$ u( s
  578. kbd_wrt_ok:
    ! g: g- l$ l: P1 a2 |8 C
  579.         mov     al,dl
    7 B$ f: `0 ^2 H, f( z
  580.         out     60h,al
    9 D% N4 t1 n: H7 f/ O/ c: C' s
  581.         jmp     $+28 F6 z& w  v; Z$ M
  582.         jmp     $+2  n% Y) b/ v2 ]& O# L6 ?4 ~
  583. % c. n: }! H' P
  584.         xor     cx,cx. K  W8 T8 ?- q; S, e7 {! s
  585. kbd_wrt_loop3:3 G$ K" ?/ S5 r7 {( x/ j& s/ o% @) f
  586.         in      al,64h+ ]! i! e5 O6 K. Y
  587.         jmp     $+2
    5 e" s: p- V8 V. n# {# m: i
  588.         jmp     $+2
    / \* v# g$ ?" C. f4 K; e6 r
  589.         test    al,28 X# U, Z, v% P( ^
  590.         jz      kbd_wrt_ok3% [8 B5 z% o+ ^! b4 i
  591. : q8 R, f5 S* `2 ?: V
  592.         loop    kbd_wrt_loop3& n! K$ H$ b. u4 w1 B' S0 j' J

  593. ( u! x3 J( p8 ?6 Q% i! S4 u0 Y
  594.         mov     ah,1
    ) k0 Z" M  X6 {% h- g5 l: s2 T
  595.         jmp     kbd_wrt_exit( l! H  e5 F. e' ]

  596. ' E3 T% ~2 N2 J
  597. kbd_wrt_ok3:
    2 u3 b* R! a% n: q2 t9 N
  598.         mov     ah,8
    / |. F* k* q6 B& ]! C2 M- e9 q
  599. kbd_wrt_loop4:! R2 W( k2 y$ `. N! _
  600.         xor     cx,cx
    1 R; l8 M7 M4 T. [: x: g; H2 {( W
  601. kbd_wrt_loop5:; u7 u6 v  Q4 |' ^/ O
  602.         in      al,64h5 o1 G; |8 A7 `8 s% i
  603.         jmp     $+2  z& b  ?) |/ K3 n* [
  604.         jmp     $+2  m8 U+ D9 U# V' O! F
  605.         test    al,1
    ! E$ _' I$ \2 H8 b8 `3 I: g
  606.         jnz     kbd_wrt_ok4  G; [9 g4 A# S
  607. # n& M0 L& r. Y8 B& q# D- ?) f# k
  608.         loop    kbd_wrt_loop5
    ) B) E, ]$ j! ?6 K" m& a( {

  609. " ^% d& L( y+ A! E2 k! i, N% i2 L# r
  610.         dec     ah
    % H0 q, ?" V( K& l( n$ p8 w* G+ ^2 h
  611.         jnz     kbd_wrt_loop4
    6 F* c1 O- V/ b" N4 Z0 n
  612. + c- J! p" ~# [' ?1 X, g( t
  613. kbd_wrt_ok4:9 [' J: D% m$ _
  614.         xor     ah,ah
    8 a2 ?# M, [- ]! e
  615. kbd_wrt_exit:" {! b/ C5 k. l- j& Q) ~4 e4 g
  616.         pop     dx6 E& t" q9 m& g9 H9 s9 r9 W4 x; `- `
  617.         pop     cx) A: L. ^4 _+ F) m: a6 g1 E
  618.         ret5 x5 s; W, ]# ]+ q0 V9 T( D3 X
  619.         
    2 n" o. ^% B" a  Z/ f( o$ E" I! ?
  620. keyboard_cmd:$ s9 z$ n4 t/ g1 s0 c0 P' X
  621.         xor     cx,cx
    $ M: b" c) w- |: W4 I. E% i0 j5 h
  622. cmd_wait:
    7 w6 ]3 u' B1 ?: g" T6 b
  623.         in      al,64h
    " d/ f. N$ Z3 R' B
  624.         jmp     $+2
    ! ?6 J1 o, l4 |2 p( |* o
  625.         jmp     $+2+ ~( Q0 B$ B/ X) ^! M: ^5 Q; s
  626.         test    al,2+ H6 Q' |* E8 j6 f4 d
  627.         jz      cmd_send! o+ c! @) c- N3 l/ n0 o- W
  628.         loop    cmd_wait
    " R2 [, {+ ^& C9 y# J
  629. 0 J9 d+ x1 d! b3 W2 d9 R4 Y
  630.         jmp     cmd_error( @$ A* ~! h' e& L9 K3 s( G/ J  m
  631. # Q6 F  j, W+ g) H7 x% ~
  632. cmd_send:
    7 O& Z9 J& ~8 R5 u; A3 u5 I; {
  633.         mov     al,bl
    4 A0 s+ q8 _0 P0 @
  634.         out     64h,al
    9 L2 e1 ?& f8 Q* p
  635.         jmp     $+2
    ; a2 h% Q: x) i  u' h& F
  636.         jmp     $+2' h8 S: O1 W5 p% Q1 v

  637. 6 g" G: Y7 M5 p  v8 U% e% [4 o7 J
  638.         xor     cx,cx
    ; b/ h# v+ X1 y9 }8 _( X
  639. cmd_accept:
    " O7 g; j7 I; t
  640.         in      al,64h, b% J/ v& L' O5 n1 B- T( x
  641.         jmp     $+2
    # g% K/ c7 x0 J
  642.         jmp     $+2% Q2 W  j3 o/ M4 q
  643.         test    al,2
    - J* h* h# b) V/ w
  644.         jz      cmd_ok
    % x& G7 o# s4 F- ^' x/ @* F4 q
  645.         loop    cmd_accept+ a+ N! ?. e- K2 V5 v
  646. ; T* \0 U* W. }! O1 u9 b% m
  647. cmd_error:
      Z! i$ T' U$ Z" d# m
  648.         mov     ah,1
    $ y7 B1 h* w8 }$ o5 I) S
  649.         jmp     cmd_exit; }' V2 e) Y. s4 Y. f
  650. cmd_ok:& ~9 u# {: L; f6 z: A
  651.         xor     ah,ah
    $ P) y+ ?! n7 g" I
  652. cmd_exit:( s7 A! W# \! N( j( i
  653.         ret: Y1 v& }& {  a4 |; S3 O$ `& J

  654. 0 a. N3 g4 @) ~% Y) ^$ D
  655. new_33:' t0 L# m& ?, `" T
  656.         cli
    * r! Q3 ?4 e( \
  657.         cmp     al,0
    & Y5 C+ W+ d+ M( L. A
  658.         je      reset_mouse
    8 q% U& c/ {4 A3 [! b
  659.         cmp     al,11 y& ?( ^+ S: n
  660.         je      show_mouse
    ; h, Y3 ]/ P4 X- _7 @+ K$ s
  661.         cmp     al,2% h5 y; G0 y( e. ^3 A" {
  662.         je      hide_mouse
    # x8 Y1 \* }2 v& U" E  s) V
  663.         cmp     al,3, K+ ]: i/ M+ ]6 h
  664.         je      get_pos
    5 R1 r- }" s5 F  f8 _4 a' [
  665.         cmp     al,42 q, _, r7 K- ?! ?. ]4 [- X6 R) c
  666.         je      set_pos
    ( X+ B% ^2 O. c% ?. |
  667.         cmp     al,79 _8 N4 v1 n1 _2 s! M0 i
  668.         je      set_hor_pos- l0 D' j; o- z! `) o- j+ H
  669.         cmp     al,8
    , T) M) R0 D$ |! J/ ?: c( P) q
  670.         je      set_ver_pos+ G" q2 k  Q; \- |+ q# q/ ]! L, }
  671.         cmp     al,0bh4 o0 l3 S  A: z' `% g
  672.         je      get_mouse_movement! I6 f. i& l4 V: N. o! h
  673.         cmp     al,0ch) ?/ _5 V* e/ |8 ~6 C9 n- f& m1 |
  674.         je      set_subroutines, _& _0 @4 `& f- e1 h2 y5 k# {
  675.         cmp     al,14h7 S& N% r! Z# Y. X* a. S2 q( F2 R
  676.         je      swap_subroutines
    ! J+ a+ e5 r% K3 v; |: \5 {
  677.         iret) \) V5 @( N6 o- `  }
  678. 4 m; E; \2 N& ~9 p; j. O: t6 Q
  679. reset_mouse:
    ) l$ G2 d. A7 h7 v3 j4 g9 O* l
  680.         jmp     _reset_mouse
    + g! _! R* L$ f" w* |
  681. show_mouse:
      g/ V- i0 ^% a! g/ a8 |9 w" ]! h
  682.         jmp     _show_mouse% S/ n! g' g! ^+ y
  683. hide_mouse:
      [3 n8 U# |" o# Q4 U3 J
  684.         jmp     _hide_mouse
    6 ~8 s' k4 ~+ h( i7 V- ?4 V
  685. get_pos:
    + a) L9 @& ^+ U, u& d/ d
  686.         jmp     _get_pos
    3 J8 n6 Q  o+ h- T
  687. set_pos:& x3 I$ N2 q3 J6 H: p; `: X: W
  688.         jmp     _set_pos
    / s7 v8 Y$ f. @) S3 Q
  689. set_hor_pos:
    / ?  v* n; ~7 i  x" V1 u3 F! l
  690.         jmp     _set_hor_pos, e2 b4 d4 I0 O" C  F5 v9 t& O
  691. set_ver_pos:
    8 f$ w) M+ t4 d: _" c  Q
  692.         jmp     _set_ver_pos. c0 h  O& y0 T& ^  C# E! d
  693. get_mouse_movement:% V- Y$ V2 M& f, R2 o' L
  694.         jmp     _get_mouse_movement. V6 C! b8 E. U& ~$ O, C
  695. set_subroutines:7 Y8 m, B! ^  r& V9 M8 s2 C
  696.         jmp     _set_subroutines
    # u  m3 r' C# I/ E* U: H
  697. swap_subroutines:8 }7 s8 O8 B6 Y- Y! m" E( O7 Y
  698.         jmp     _swap_subroutines
    9 q% E6 Q/ h2 a& g* K: I
  699. , z1 B4 B8 d9 \* ]8 o: k
  700. _reset_mouse:6 H/ z9 @: m$ ?( w. D; e: Q
  701.         mov     byte ptr cs:[buttons],0, b0 N  ~  N! P0 U' z1 g( l
  702.         mov     word ptr cs:[pos_x],06 U$ e( {" _/ z" @
  703.         mov     word ptr cs:[pos_y],05 N# L" C3 V' j, D* a" H
  704.         mov     word ptr cs:[x_move],08 C6 v$ t' O$ K1 j5 w
  705.         mov     word ptr cs:[y_move],0
    4 w" J3 C( M& Y2 {/ @
  706.         mov     word ptr cs:[x_max],639
    0 Z, U# \3 z8 F& R7 f
  707.         mov     word ptr cs:[x_min],0
    8 p$ W, I+ {& ]$ V% n* \) ~! Z* r
  708.         mov     word ptr cs:[y_max],1996 N9 s( C' L- V5 R) R4 s/ n
  709.         mov     word ptr cs:[y_min],0$ _* i, E$ C5 k. M: x+ u" S- U
  710.         mov     word ptr cs:[user_mask],00 d# L& i, i/ Y4 R3 q- o+ `
  711.         mov     word ptr cs:[user_subroutine],0: ?9 a8 t* H8 {
  712.         mov     word ptr cs:[user_subroutine+2],09 W) _- M2 f7 y  m
  713.         mov     ax,0ffffh1 \1 U- V8 f# Y( r7 v7 d6 ^6 r
  714.         mov     bx,33 h9 o. Q" o9 S5 F$ X' P
  715.         iret0 W9 j/ |  N4 C  M( v, s
  716. 5 P# M0 ~* J; M1 v1 M
  717. _get_pos:
    - e9 `; v  V- s
  718.         mov     cx,cs:[pos_x]3 ^7 o& g3 d: a9 }
  719.         mov     dx,cs:[pos_y]: Z( v  l: B' U7 s/ s) x
  720.         mov     bx,word ptr cs:[buttons]
    $ j& a. C6 L. @$ S5 m- h
  721.         xor     bh,bh
    " o: R4 O9 ?! p. C- B( T; f
  722.         iret% X3 {: `3 E7 w/ ^( q4 I. l5 |
  723. 7 V' k5 V. r) z7 E( N: P
  724. _get_mouse_movement:
    + Q7 z& l, n8 t
  725.         mov     cx,cs:[x_move]
    4 e: C5 Z, d* k9 |% x6 K' S; ]
  726.         mov     dx,cs:[y_move]3 ~$ v  ?7 e6 N6 k7 i: ^9 V
  727.         mov     word ptr cs:[x_move],00 B. L* L" X  A' R, h. c3 v! y
  728.         mov     word ptr cs:[y_move],0
      [4 o/ u3 Y( s: f9 k5 c" U1 s5 W
  729.         iret
    6 J8 w* F3 x2 n7 g2 i; X- N

  730. ! H- V$ p+ _$ i8 ^
  731. _show_mouse:: F$ ]$ {6 u- z% A# ^
  732.         push    ax0 z6 k! D0 f! i3 v, ]- r3 ^
  733.         push    bx* R0 i+ o% t/ M8 M: o% o
  734.         push    di9 [5 y4 {+ V9 b7 P) c* y
  735.         push    es
    ' [! a0 ~( m. |# p9 J, A# n( `& _2 S
  736.         mov     byte ptr cs:[sm_flag],1
    ' }$ ~- I. m0 n2 ^! N
  737.         mov     ax,cs:[pos_y]3 n' p. J- j# {$ a- _
  738.         shr     ax,3
    + s" J- m) q$ T0 d9 V3 Y0 K( z% R% w" G
  739.         mov     bl,80
    # n1 B, p0 ~% u9 H
  740.         mul     bl5 M% o! R+ G' U( j6 `# b, j- d
  741.         mov     bx,[pos_x]
    0 n6 c$ s; e# `7 ~- Y/ a, s/ F- w' ^( i! H
  742.         shr     bx,3" ^0 b' y2 k9 H' P' U
  743.         add     ax,bx- ?. v7 k+ Q: n5 S- q
  744.         shl     ax,1. P# i1 X  l1 u
  745.         mov     di,ax+ E* P2 |# D$ _5 u
  746.         mov     ax,0b800h5 \0 \+ a, d, v6 S" F
  747.         mov     es,ax
    7 @& S; W$ C: {  T
  748.         mov     ax,es:[di]2 y$ M) ^$ [1 V& }5 B) g" u0 J
  749.         mov     cs:[save_char],ax  y/ K7 Y, w) y8 F( k
  750.         not     ah2 `' n; f  X, |7 H( C5 i
  751.         and     ah,7fh- s& Q2 ?- k; t0 r; e( u. g
  752.         mov     es:[di],ax9 K) |& z7 s+ N2 w) x5 B
  753.         pop     es2 b2 l1 m9 C& G! k6 y6 a" m1 e: |4 Z
  754.         pop     di( y6 f+ b# |3 d) x7 _, @4 X# X
  755.         pop     bx
    & G1 r) f/ o: J* ]7 {+ v
  756.         pop     ax3 W, @5 C9 K8 s
  757.         iret: A6 o7 H; V  B7 L- V3 e: L* }

  758. , R) Z6 `) A$ J! g! k
  759. _hide_mouse:
    9 A, b% L  x! @% Z) l
  760.         push    ax
    $ O+ I6 R/ w; N4 @, G# k" V* v7 _
  761.         push    bx
    * `' J' z3 l# \3 R
  762.         push    di
    / R: S( K5 q* H$ g( n6 B$ [
  763.         push    es
    " h9 w/ A& s8 E& I  s8 w
  764.         mov     byte ptr cs:[sm_flag],0
    . a( M6 Y0 Y! Z; o1 r* N
  765.         mov     ax,cs:[pos_y]( F& e$ R: t4 ?$ N# o
  766.         shr     ax,3
    8 s7 X$ }' k5 Q  Y) ~6 S$ h) R
  767.         mov     bl,80
    + N3 B( O, T# {) F8 o3 P8 ^
  768.         mul     bl
    0 {1 F' O7 Q; D  U/ [) t2 F7 G3 q
  769.         mov     bx,[pos_x]
    . B2 ]+ G7 ~1 B* W1 t3 b( y! ^! x
  770.         shr     bx,3! @, I. h: H4 B0 E: g
  771.         add     ax,bx% {- g3 B/ I8 s5 M
  772.         shl     ax,18 |, F3 E- }  t* W& P8 N
  773.         mov     di,ax. j; x  S. z5 r" X1 a
  774.         mov     ax,0b800h
    ! \, g6 D9 I, a' C/ u% h
  775.         mov     es,ax9 M+ \$ p. O$ r1 o, y: ]
  776.         mov     ax,cs:[save_char]
    . X+ \1 V3 g) h0 |8 L3 A, S3 i
  777.         mov     es:[di],ax5 o; |( b7 g) ]* c! x6 @: w
  778.         pop     es
    ! Z& j" Q, P) `$ {1 x* X' x3 t& i4 N1 q) ?
  779.         pop     di' [( O6 `) [2 d4 y+ [0 B$ _. G8 I
  780.         pop     bx5 ?% N& t: h9 `0 m0 b3 k
  781.         pop     ax
    5 K7 x+ W: ^: ?8 e. o0 R8 c  m
  782.         iret
    % Y; X' }4 y) M1 O3 M

  783. % S1 |( d' O8 H2 V8 ^! Q* I) t
  784. _set_pos:
    " Z: Y% _. f5 O1 [7 z: E* f
  785.         mov     cx,cs:[pos_x]
    & }" t" o, ~, q8 k( ?% b) P
  786.         mov     dx,cs:[pos_y]
    - w5 i7 x  c+ D+ @# a$ W! o
  787.         mov     word ptr cs:[x_move],0( K% a1 E  t) {  a
  788.         mov     word ptr cs:[y_move],0& O: Z  F/ r% ]' e
  789.         iret* M8 C) v4 r+ t9 h$ }  X

  790. / @" F3 \- r" z' d; t
  791. _set_hor_pos:
    2 q8 e7 E/ E/ d3 d$ f
  792.         call    max_min
    ( Q" c/ n& I; V( [, c0 H% h7 `; ^
  793.         mov     cs:[x_min],cx3 B! x! i: j, n1 c6 \4 c2 `
  794.         mov     cs:[x_max],dx" I6 ^4 E: l2 W# r) n6 n; h
  795.         cmp     cs:[pos_x],cx) N: u9 h& z1 }% `7 R" |
  796.         jge     good_hor_min( Y" e. q5 U' u% \
  797.         mov     cs:[pos_x],cx3 O) P3 V0 i4 @8 n6 k. r1 x( l; f
  798. good_hor_min:4 ?# O' P" ]* P+ Y% M3 k- {% |
  799.         cmp     cs:[pos_x],dx
    ; [4 o9 I" }) x6 z$ J
  800.         jle     good_hor_max
    9 _" u5 A4 E* w& \# {3 i
  801.         mov     cs:[pos_x],dx
    1 l" \% i* x$ r. J: q( G0 U
  802. good_hor_max:, P$ m' k9 z. m  C" Y) }- @! v0 ?
  803.        iret3 o# S2 E2 d  C5 D; e
  804. * k& @+ d2 H2 q8 M9 {# _% R3 j' M
  805. _set_ver_pos:
    / A* Z0 Z. c6 d2 {( f) d
  806.         call    max_min; |7 E" n  W$ @" T# p1 }
  807.         mov     cs:[y_min],cx
    # O, `1 ?: I  W4 h+ Y) l
  808.         mov     cs:[y_max],dx6 _9 d! n0 Y! G( K5 G3 k5 S
  809.         cmp     cs:[pos_y],cx
      i' F, f2 h  C
  810.         jge     good_ver_min
    0 M1 r# H* {6 F' c& P  C
  811.         mov     cs:[pos_y],cx
    8 z3 P+ c3 E" b2 z* O. n# s
  812. good_ver_min:% J$ Y6 u; o( V2 j$ Z
  813.         cmp     cs:[pos_y],dx& h% o$ r/ v) i# y% q% Q3 M
  814.         jle     good_ver_max" X' e$ f# P1 _2 M! F: U" L
  815.         mov     cs:[pos_y],dx# V8 B/ n3 K4 _, \
  816. good_ver_max:( `' A* @6 J' h
  817.         iret
    % u: S* Q: ^( J( G' U* m% ?

  818. : o& i( E+ k- {$ a
  819. max_min:
    ) w- k3 \: c0 p0 Y$ X& @
  820.         cmp     cx,dx
    ; G6 _& c" {* u2 N0 c
  821.         jle     no_swap9 b+ t6 N3 y" `; h
  822.         xchg    cx,dx
    " d! H0 E% K+ \
  823. no_swap:8 [/ k* e7 ?' Y) X, {! w' \
  824.         ret
    6 ]3 d5 S& p* l8 p
  825. " T7 y, x5 S4 O5 v% K1 [
  826. _set_subroutines:
    ! E: e' Q8 A$ U. f& T& g& ~
  827.         mov     cs:[user_subroutine],dx
    5 V- @( l4 e$ c# R1 R
  828.         mov     cs:[user_subroutine+2],es
    ) [) T6 g" x$ v0 P
  829.         mov     cs:[user_mask],cx
      d* I; }! }) z8 _
  830.         iret
    % i& B3 i: O" g6 `, G( |4 M/ O. ?

  831. 9 X" J; l  U# b) B- u+ D5 T
  832. _swap_subroutines:: V7 w: ^0 d2 {, e* @
  833.         push    word ptr cs:[user_mask]6 J- Y1 a2 I+ M- w" {
  834.         push    word ptr cs:[user_subroutine+2]' w; p: X$ k/ z8 U: e: [5 D& x
  835.         push    word ptr cs:[user_subroutine]# J( F4 }; }. F7 w; f7 x
  836.         mov     cs:[user_subroutine],dx- P; f/ v4 N3 J" u+ o
  837.         mov     cs:[user_subroutine+2],es% \$ `+ L4 ~( Z) m, i
  838.         mov     cs:[user_mask],cx
    & {% [$ P* v  Y  t) d8 {5 o! r
  839.         pop     dx8 s2 m- J; F' J' k$ {
  840.         pop     es
    1 \2 L& c* N$ D3 R* C, h0 m8 B# b& N
  841.         pop     cx1 ~. a: u$ ]0 B" I# l, h# R1 x3 i
  842.         iret
    ! r3 W& v( N; _( e
  843. - n% _2 ^9 n. p
  844. memmouse        endp
    ' [2 h, X$ [) f# G
  845. 4 k$ @& p& [0 y1 k" V
  846. endof_start:
    , U2 y+ D( L# g6 s

  847. 2 {3 |, I$ o0 `1 ~
  848. emsg db 'No mouse driver install error!$'# C0 u4 }+ [/ n" ]
  849. old331 dw 0
    # K; A; j$ @% {: z/ D  E
  850. old332 dw 0. U/ h4 s) F) @* x
  851. old741 dw 0
    6 G1 ?. G, `3 M- H! @/ M5 [
  852. old742 dw 0
    & e% y/ |& D- w( y
  853. memcopy db 0# G# Z" K6 Z# @0 A# [
  854. okcheck db 03 L& B/ T3 P; G- @
  855. pass db 07 s3 _8 K2 P0 k" @; Z1 [! u
  856. chkl db 0
    6 Z% X1 r9 e, ?) U7 o; {) T) l
  857. lk db 0
    + g% W* g& ]2 |6 |
  858. chkr db 0
    , H- y* i$ }# J8 g- S
  859. rk db 0" t6 V& O, y' |" d. S; z$ I. F
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    6 R/ N0 }* f7 o# p5 K4 W" T
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    3 z' m$ m+ s8 P6 w
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    2 H  ~% p; q3 g2 ~, ]! @
  863. db '                                                                                '
    * `! D: A; s4 W+ E( D
  864. db '                                赏屯屯簧屯屯突                                  '/ A+ D7 W3 z$ s: b7 o# Z: y7 e7 X
  865.         db      '                                ?OFF汉OFF?                                 '
    2 i0 v& a  v1 i& _3 ~  T
  866. db      '                                韧屯屯既屯屯图                                  '; r5 g$ B- [- G! |) O
  867. db '                                                                                '8 V0 u! h( |/ c- Q5 Q$ y9 j
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ': P, M% \2 W5 U% g0 b& q
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 7 [$ D# P! T9 f/ i: ]/ c9 |
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '3 P; D) ~' e, b; x1 @! C

  871. , j. @/ ]2 G) d+ u3 c: n7 |& b
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!$ b& F2 Q1 M4 I
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
/ g2 u8 e, U+ q2 g- u2 i+ k- `5 e4 Q! m+ r) `) Y) c0 n9 {
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:12 , Processed in 0.291245 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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