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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
+ d! a$ f/ q# v' |# T/ D& B+ w
8 ]5 t9 C/ U. x代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    2 c' o7 J. `6 X
  2. ;          Ufoit PS2 Mouse test program   Ver 0.98 ^9 f+ [" [- \0 j; d
  3. ;                                         By Bini.Yi 易祝兵  |. a8 P. R5 h8 R1 E0 r+ m8 |
  4. ;                                         http://www.ufoit.com 计匠网1 q. x: m& [% K; r8 ^8 h! J
  5. ;                                         2002/04/06 YYYY/MM/DD5 U0 P7 L7 @9 p7 h& ^% U4 K- P% p
  6. ;8 g( @6 [$ w/ a% n6 ~3 v$ T* p
  7. ;         
    3 Q$ P( k- [+ n! i( c3 X% j/ W. x
  8. ;          This program  test the mouse button  click and move.
    : [& R5 j8 v+ G; @
  9. ;7 E; n- p6 A3 \. {4 _
  10. 5 ^3 R$ N( ]) \* b) V- T
  11. .model tiny
    * G& U- p9 h3 A+ L* w0 ~$ s
  12. .586
    ( [3 q/ X1 E2 L" l
  13. .code# D3 G5 W  L. j& y  n* Z
  14. .stack  100h1 M1 c1 V) i$ z
  15. .startup$ O8 z' E4 U9 c( n4 g9 J, q
  16. pusha/ \* |( `4 d) ^; h8 d# X3 p5 G
  17. mov ax, 3533h$ ]; N% l& B! L
  18. int 21h
    1 ^* ?! J0 [) s0 w
  19. mov word ptr cs:[old331],es
    6 d) \1 ]3 }* e, F5 I8 }
  20. mov word ptr cs:[old332],bx- n% M2 v0 j8 r. [3 \6 G' K
  21. mov ax, 3574h4 l/ `5 x! P$ _: w% H& Q$ c2 c
  22. int 21h
    0 n/ G1 g1 a1 \" k) Z/ Z
  23. mov word ptr cs:[old741],es
    3 Y& n& ?! M+ @4 G; w9 V0 s
  24. mov word ptr cs:[old742],bx: y! `$ ^: \1 d& T
  25. popa
    / }6 B3 j& G2 {' |( @- I
  26.         call    memmouse
    7 R1 q+ S$ f6 J8 F/ G/ z
  27.         mov ah, 00
      f  p" n9 n) v) p- ~
  28. mov al, 03, I$ J7 R$ X* _
  29. int 10h+ b4 N0 z# Z- o/ a: U7 G/ v% @
  30. mov ah, 06
    2 ?5 X, {7 w2 i0 h) c5 j2 l
  31. mov al, 0' V2 @3 S* ^. a# q5 M3 m! ]
  32. mov cx, 0+ L, p7 k6 [- V
  33. mov dh, 24, C4 g: o/ p% N7 b
  34. mov dl, 79
    - a7 c/ W7 h, ^8 ]
  35. mov bh, 07h- h/ h* l% F6 h# k8 N
  36. int 10h8 O2 F% C3 }. W6 B& g) A
  37. mov ax, 0000
    4 o  g/ t$ ?+ ?
  38. mov bx, 00028 Z2 s8 O8 `$ ?) b) O3 ^$ W
  39. int 33h
    1 s, j% _# w4 t
  40.         cmp     ax, 0000           ;if no mouse drive install8 o/ h5 K5 G8 x, H8 z; @
  41.         je      errormsg           ;show error MSG
    * p% U) i$ i, B* y& O/ `; g9 b
  42. mov ah, 02* P6 Y  V/ e" p" T3 ?8 [! [2 R
  43. mov bh, 00) ]% o7 c% q; w5 s/ o0 i
  44.         mov     dh, 25             ;Move point out screen, R8 @- [, G5 u3 @9 {) O6 M0 {2 |( |$ C# W
  45. mov dl, 795 ?, x# q5 P( C& ]* Y) E. e. D
  46. int 10h
    7 |+ I( X6 p6 d0 H1 k, U
  47.         call    showmsg            ;Show info
    2 ^5 |* O+ q. ?/ H2 i% |
  48. mov ax, 00017 K% e% T( Z5 p2 H5 c3 i$ a
  49. int 33h9 V, x* L1 A0 c: Y
  50. ; mov ax, 000ah, W$ o  f% d, S. E: D: \
  51. ; mov bx, 0000" n) d; J) J8 Y7 C8 z
  52. ; mov cl, 0h
    * [0 \( d7 y" S  w, W
  53. ; mov ch, 0F0h$ _+ d% @! x- b7 L% `6 R) d6 T3 H
  54. ; mov dl, 0h; Q" o0 ^: ~5 l2 D
  55. ; mov dh, 0F0h+ T2 z; R- ?- B. K+ @
  56. ; int 33h
    % w7 I1 B. U- o" L; E2 U' H/ p
  57. mov ax, 0004h
    / F# A; ?( p6 J% M
  58. mov cx, 0319
    - {) A' ]/ @! w$ y
  59. mov dx, 0103
    " M; m# s/ f' U4 A
  60. int 33h
    5 b6 W! I4 y6 o' M+ z$ h
  61. casemo:                           ;Case button click and point move
    & T! Q. }; w/ i  ]9 W0 M7 [% n
  62.         mov     ax, 000bh         ;and keyboard press
    ( @4 |4 G7 ~3 Y0 T0 Q8 x( C
  63. int 33h5 R1 X; q/ e& x0 f0 w, \, s* a
  64.         cmp     cx, 00h           ;if point move....X3 ^# f6 H! p2 d+ {7 ~
  65. jne xmov
    , O5 l* O, v2 z: {) Q" r  V
  66.         cmp     dx, 00h           ;if point move....Y
    4 k1 \! A& \/ S2 U
  67. jne ymov% I! B' U& i( c$ g
  68. xymovend:                         ;X.Y move end
    , b5 u# }. }- ]6 D
  69.         mov     ax, 0003         
    , L6 m( `8 l& F3 T" y
  70. int 33h
    9 Y% i/ i" r, ^$ w, M- d7 z( t
  71.         cmp     bx, 0001          ;if left button click  show ON0 I% i/ u7 r( S  e- o
  72. mov si, 18287 Q# }8 G$ f0 x; u# ^" J! `
  73. je listl
    ! H, R+ O% w9 V  i2 [/ ], ^
  74. mov si, 1828
    ; [) ]) {$ `% b" f  D7 Y9 ^" V
  75.         jne     nlistl            ;if left no click show OFF8 P6 v2 X. o, v) A8 u9 u0 H
  76. testr:
    $ F/ f" q5 L: _8 S6 @2 U6 B
  77.         cmp     bx, 0002          ;if right button click show ON- r6 `2 k0 L( o4 ?( v! o: Z+ i. k
  78. mov si,1842
    ! u3 l, Q; Q' Y8 I4 ^
  79. je listr- [2 @: ~( o- {& w: P) C. K2 j; F
  80.         mov     si,1842           ;if right no click show OFF
    , S6 X( [% \/ h+ x7 m
  81. jne nlistl6 V/ P6 S4 S6 X8 Q& A
  82. casekey:
    # r, f+ u. T! l. X' d. L1 c  n
  83.         mov     ah, 01            ;if any key press jump check
    / j$ F+ b4 U5 |6 \4 C
  84. int 16h" Z0 o, B* t' w$ y9 ~2 f
  85. jne kpress
    : Z! ]" a- d# G. p
  86.         mov     al, [chkl]        ;check x flag- Q0 ^5 j4 T. c7 b" L3 S
  87. cmp al, 02h
    & V) }: |) S7 z  s' [
  88. jnb chkok
    - |1 S& K- d& q9 L/ d
  89. jmp casemo
    ; [3 }+ A- h' x0 K1 C; a- M
  90. xmov:                             ;if X moved, get the X flag+1
    % o: W' N3 |9 f# Y
  91. mov al, [chkl]0 r9 [8 y2 x9 R0 u1 Y0 n
  92. inc al
    " Q: `- s7 ~" F$ l3 c6 A
  93. mov [chkl], al0 R" l+ z1 J2 f* R! q5 {( ?
  94. call passok
    9 [8 [% Q4 @. I$ _/ y- @
  95. jmp xymovend
    ) |6 A9 y6 [6 u2 I
  96. ymov:                             ;if Y moved, get the X flag+1( |* {: U. T8 {/ D" z. j! o
  97. mov al, [chkr]
    & i7 w6 @1 m/ \4 s& {+ m) S) ]- v9 K
  98. inc al
    ) [) g! p0 F  V. k; V
  99. mov [chkr], al7 s8 b4 K( \( y: w  T9 I0 D2 D
  100. call passok  A  u, `# T$ G3 T9 R5 y- b
  101. jmp xymovend9 M( V6 }5 X. }# H! W' ]* v# q8 P% u
  102. " ?3 O) V) p. k. h
  103. passok proc near! Q# L: U$ i, \7 w) \3 Z
  104. mov al, [okcheck]& L' @2 U) Q8 c; @$ q
  105. cmp al, 1' [$ W: p1 e/ B$ J
  106. je let0% d; r( {5 I+ T9 H7 h' f
  107. jmp passret
    9 J6 T6 {5 J( z- _' j
  108. let0: . m  n2 @, `/ a- V; b  D
  109. mov [pass], 10 I5 v) C8 \% x, G
  110. passret:1 n, W3 U, W' p7 ]8 D! `. O
  111. ret
    7 Q# d$ B7 p5 u% ?. E! U
  112. passok endp
    1 s6 o( r1 `. Y9 ~. V: j8 ^
  113.   U5 @  d! ~& B' \$ p* u: l
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    7 L/ k( }0 ~* d3 M7 \" ^. V: _
  115. mov al, [chkr]
    * d6 J+ t% ~: Z5 v0 `/ d: S
  116. cmp al, 02h1 r, |) ~* Y. o1 Y5 G7 j+ H
  117. jb casemo' H0 K/ B, G& d9 @1 M/ q
  118. mov al, [lk]
    ; R# b. G) J# Q* G& X6 k
  119. cmp al, 1/ f# K4 F) Z. M  ^
  120. jne casemo
    1 t4 l7 a: Q1 d* O* n
  121. mov al, [rk]" ]! A' \! \; W" j
  122. cmp al, 1
    5 F4 C5 S3 W! h- k: z/ V5 v0 n
  123. jne  casemo
    & d, r1 T) t/ g% L3 l( O* B
  124. mov [okcheck], 19 ]" ]2 u! h) c* [
  125. mov al, [pass]
    # C* C5 t. W9 r; A8 ~' C
  126. cmp al, 1, L) s4 [/ o5 D' e
  127. jne  casemo
    5 K0 d" g/ g8 x+ T' j
  128. mov ax,0002h5 p3 b- R/ N9 W' W3 _
  129. int 33h
      B& r+ o  y9 D# R6 E9 ^* z# n! M. k
  130. call cleascr7 }6 u4 {$ j  K6 s8 K

  131. 0 b, f* U0 i  n
  132. call oldint2 d" Q  v# ]. d
  133. mov ax, 04c00h% T& k8 R- V$ Z, T# u
  134. int 21h
    $ J7 H* Y) F) v1 j

  135. , p: i$ ^) n( z- u/ h! {
  136. okexit:
    5 A* v$ X  D( [. z3 D1 D: C
  137. mov ah, 4ch
    ; I; D' {% w: @& ^) f/ N8 b
  138. mov al, 0
    5 W& o5 R* }, g! J7 Y4 M: q5 q0 Z4 {( |
  139. int 21h5 f& b9 t( Y# T3 Q
  140. listl:                                 ;Show ON6 O& r% }2 I8 p- b8 u
  141. pusha
    7 E7 `3 v- {7 s6 b( Y0 a
  142. mov ax, 0b800h8 N2 s6 W& C  @" e: N3 p: i
  143. mov  es, ax
    ) I. j8 B, P  y- j' i+ f7 T8 _
  144. mov ah, 47h$ _! z4 @- A. i# A, k( I( H1 P0 K# E
  145. mov al, 20h1 G, F: Z; {4 O- K" O! G1 O
  146. mov es:[si], ax1 W/ T, ^$ f+ L5 R9 e/ r
  147. add si, 02' n: N8 J$ P9 o
  148. mov  al, 4fh
      Q# }( i% H. P6 Q0 y% }$ q$ p' Z
  149. mov es:[si], ax
    4 e! C" y# u& T- P3 N
  150. mov al, 4eh
    , m% E4 ]' ?3 l
  151. add si, 02
    9 I5 M- m4 n8 A5 T. X, b
  152. mov es:[si], ax+ p  X& \8 {% @) ?( E2 L
  153. mov [lk], 1
    , q6 r& c7 Y! I4 q7 s. x8 F, M( x
  154. popa
    3 R- t0 y. R2 B
  155. jmp testr
    5 U9 k  c  a, j" \! q3 o( ?: D
  156. listr:                                 ;Show ON. \4 C; R  ]- k9 E% @
  157. pusha1 Y. W' \0 P7 u  x5 a
  158. mov ax, 0b800h( ^- M6 B! N2 `" H; E( O  h
  159. mov  es, ax  R  F4 _, Q% Q% X- \. F" B
  160. mov ah, 47h
    * i5 p1 k$ L" t3 ]! ~0 v! I
  161. mov al, 20h/ I# X2 F6 C5 |' Y) q$ `
  162. mov es:[si], ax
    % m4 L9 V$ g8 M; M
  163. add si, 02& Z  R7 t* S% K6 p+ k/ E* w* v
  164. mov  al, 4fh4 v6 ~3 q; r' r7 u; P! I7 r
  165. mov es:[si], ax
    0 q" _- [  z, U- V+ Y& H3 L
  166. mov al, 4eh. V: Y& Y$ G0 C1 q, \9 {) P
  167. add si, 02( p+ T, Q) F$ [, D" p3 u
  168. mov es:[si], ax
    ( l/ P8 J) L0 K. p- S
  169. mov [rk], 1  {- G. ]. t( ^+ x
  170. popa
    . p! f; L" `# S7 q- |1 e+ K
  171. jmp  casekey5 ~8 t7 P2 g  j* S3 s: k3 J

  172. 8 h, @- |. p9 c% X9 n$ F
  173. nlistl:                              ;Show OFF
    ( i3 ~3 S7 X: N( Q. F; T
  174. pusha   
    & ?- J7 j! B8 F1 p
  175. mov ax, 0b800h, U8 {; F& H- _, F6 a
  176. mov  es, ax
    ; ^, Q) {2 F1 l" ~* ?
  177. mov ah, 17h! v( n; h. f! O' I
  178. mov al, 4fh$ H0 e- [8 W' _1 A+ s
  179. mov es:[si], ax3 x2 z  b2 E0 U5 ~* \9 V  C2 r
  180. add si, 02' _/ S9 S# U3 }9 I4 ^: R9 \/ f6 A
  181. mov  al, 46h& {( r- r/ t2 l0 I! |
  182. mov es:[si], ax
    ; y+ s1 K9 Q5 {  C) i
  183. mov al, 46h8 ], O4 Z+ G. ?6 Q( P- S' T! O/ ~
  184. add si, 02& m6 m  l4 Y0 E& f( @; H5 U& Y( C
  185. mov es:[si], ax3 ], Z6 @! L& Y2 B" m* ?  Z* p0 E* k
  186. popa
    . l8 |# c2 D  t5 r0 D5 ~9 z
  187. cmp si, 1840# L! k7 e1 C5 z: {* c+ B  d
  188. jae casekey
    7 T! O0 p- D, F: i) ~
  189. jmp testr$ J/ j2 V: {- Z( A8 o. l
  190. 5 B3 I- @* c  V& c
  191. kpress:                             ;Check key press if press<ESC> then EXIT6 f3 Q: U5 C% Y
  192.         cmp     ah, 01h             ;and return a error9 A) L, @2 r4 P1 K4 V
  193. je exit10 |/ e" b, [; ]# p: E3 K" h
  194.         mov     ah, 0ch             ;if press other key then clear
    ' P( `" E  @' K- w' ?2 b1 ?
  195.         mov     al, 00              ;keyboard buffer1 G$ K# W$ X) a. b* j/ W
  196. int 21h$ P/ H1 u; {3 r4 i
  197. jmp casemo ) z, f) k. a6 G. @# W# S' [
  198. ) E4 m) y' |9 X( a. d
  199. errormsg:                           ;if mouse driver no install
    ; o1 x5 P' u! C0 G  X
  200. call oldint& b+ B1 I- h3 Z4 |$ v
  201. lea dx, offset emsg
    4 L$ L* r* \5 j6 v
  202. mov ah, 09h2 w5 ~4 f4 t& u' w# p  l5 \
  203. int 21h
    7 }( r" F2 y  D# A& \+ H  N
  204. mov ah, 4ch" V9 O7 z; w/ I" }- i$ |* V' J
  205. mov al, 2
    # r) W( ^- q. n: o4 q
  206. int  21h/ d/ z: q. s0 p" A& s; N6 I
  207. ( ~5 s2 G, X5 j: f# V% n2 ^0 M% K
  208. exit1:                              ;error exit
    9 j. m: G2 m3 t! u0 |9 k
  209. mov ax, 0002h! R# s+ J% w1 y/ A" {8 l! ~- f8 @
  210. int 33h" H1 a+ |" u  ?( Q0 ^
  211. call  cleascr
    0 w" q" M8 {1 v8 C
  212. call  oldint: f7 V: v; n' t9 b3 e3 a& l
  213. mov ah, 4ch: C0 J9 W0 P' @
  214. mov al, 01
    % e8 y! e0 F, N) X  n- q
  215. int 21h& W: [( y0 d! Z
  216. 8 v4 s1 f2 [; v  k: }5 J& F
  217. cleascr proc    near                ;clear screen
    & c* y& }: W6 p: y# y
  218. pusha
    8 |- o! G/ a1 h  l& ^- V
  219. mov ah, 06& R. k5 c- w0 u" A- v
  220. mov al, 0* h' Z% E9 g( Z  P- w
  221. mov cx, 0/ T. h' ]( C/ [" i, B9 c8 W
  222. mov dh, 24
    + a$ k  q& ?$ ?( H$ `5 C
  223. mov dl, 79- T9 Z( v& {  Y/ P/ P' ]
  224. mov bh, 07h( ~% `# C, _# S0 c- E
  225. int 10h' ]6 f6 y1 O2 s' j' R/ P1 f8 r
  226. mov ah, 02
    : K8 I! C- p$ v  j+ m
  227. mov bh, 006 U* \- T2 G2 p0 `& }/ T
  228. mov dh, 0
    6 c# p9 q: k) Y3 J5 g5 W2 X) d
  229. mov dl, 0
    - Z0 Z7 H/ e3 y9 y2 L
  230. int 10h
    7 j" E" i; V1 f' Y" I
  231. popa
    " G, g+ j3 l& M; m; w# [# _
  232. ret
    6 z+ I% d2 g: Q) e( V+ k1 L" D, b
  233. cleascr endp
    & I3 n) k) v+ g4 b
  234. 6 S( `0 m# F7 r, _4 I7 h
  235. showmsg proc    near               ;Show info! H. e/ _! Z/ H+ v8 n; y6 O3 K; Z  w
  236. pusha; _4 k0 Z- z* v4 W; t& j1 q
  237. lea di, offset showms
    ) Y. Q5 ^" m; [% l
  238. mov ax, 0b800h' l% i* }- |; L! b& D8 C3 x
  239. mov es, ax
    ; V0 a4 G7 j. I" _1 J8 E
  240. mov si, 0: ^8 B: ]' I0 N9 |& N4 y
  241. mov cx, 480
    $ `0 l! S) A) t) k2 }
  242. mov ah, 07h5 h" M7 ]3 x& k, V7 I# G; ]4 c/ J
  243. @@:
    2 V) |8 k. D7 |1 T9 L* [: G! a; b/ b3 I
  244. mov al, 20h  B- U: k+ M  v( d0 K3 w& [) `
  245. mov es:[si], ax5 l8 w1 Z. j9 c3 K4 k# u6 T  ?% A$ h
  246. add si, 2
    ' ?3 z6 b0 G0 a+ }$ S
  247. loop @b
    1 P& |7 m' C  d1 ^8 U  A7 T
  248. mov cx,880
    1 }1 i, _7 Q; F* _
  249. @@:
    % }' {, V. x- D, ]; k
  250. mov al, [di], J$ }; f9 |! r. ~/ u
  251. inc di) N: i" T2 h+ G+ F8 ?
  252. cmp al,20h: a" T$ l2 i( P5 P
  253. je showch1
    3 [9 u* s% l% D
  254. mov ah, 17h  Z" S) \3 u5 F& _6 \+ n8 a
  255. jmp showch3 6 S9 n& |, v- V  _2 L
  256. showch1:# H  }' _2 N% V5 ?4 k) H# |
  257. mov ah, 07h . A9 v9 k$ C. ]5 ]! w; f/ Q+ v$ I  L7 H
  258. showch3:5 l& l5 h9 _7 T0 b2 D0 p
  259. mov es:[si], ax
    ! J9 u" _3 e9 S+ [, \& @
  260. add si, 21 {/ W0 q0 ?, y- y
  261. loop @b- Q8 ~% {* Q( ^
  262. popa
    0 r( R1 q' F" z7 ~: h
  263. ret% X& q- I+ v" p( c& f3 c0 _( Y
  264. showmsg endp
    1 t$ j, B% ~0 M9 Q& D% Q

  265.   u/ ?& K' |; E' i) t0 k% L- m
  266. oldint proc9 x: w, j9 w  g( C) n6 r7 X: P
  267. pusha: T4 M4 a6 v9 g8 @
  268. mov ds, word ptr cs:[old331]  K; k, ^2 z- y3 Y) f* F) f# f
  269. mov   dx, word ptr cs:[old332]
    " }9 ]9 i% \# ]  c7 r: I
  270. mov ax, 2533h4 q* K; O, ~2 @4 g0 N
  271. int 21h: K$ ]0 |$ q+ y  K/ i% L3 W
  272. mov ds, word ptr cs:[old741]
    - }, |' s6 \# U
  273. mov dx, word ptr cs:[old742]: Q7 {5 I. u: ?, _
  274. mov ax, 2574h
    ! |* b0 q- V1 f( S' E7 x
  275. int 21h/ r( v+ _2 w, ~* `9 t" c
  276. popa
    3 q  {$ C/ f% E  c
  277. ret! |- e. z+ e' ~# y8 e: f2 d( P
  278. oldint endp9 v7 X) s% {. {

  279. $ H1 }+ p. i5 n0 i* W6 p- X% R$ v
  280. memmouse        proc( f- N" v+ R7 s# N! d: R6 W
  281.         xor     ax,ax
    ! z2 @7 Y9 F) E, b+ Z9 Q
  282. int 33h2 l8 e4 L& j) w8 v8 g. E
  283. cmp ax,0ffffh/ t2 s' c  g* \/ _
  284.         jne     not_loaded& Z! [; w- K/ p
  285. mov [memcopy], 10 h! k% B! d( E/ j
  286. ret
    % _, }6 A% Q: i! X
  287. # ^. ^% P0 f+ n- X7 U* ]0 b
  288. not_loaded:0 A3 p" m' M8 x  @

  289. 7 y8 p4 U5 m2 I3 K$ g
  290.         mov ax,2574h- v# V7 z* }; m
  291.         mov dx,offset new_isr
    - m" m5 }3 J3 @9 |$ G! s
  292.         int 21h1 |" u- x$ A2 S: S( {$ m( p
  293. % S6 }/ _3 i) p' Q6 m
  294.         mov ax,2533h
    . f4 N' q/ M2 I9 @, V
  295.         mov dx,offset new_33
    0 m8 w+ n5 Y; d/ [2 H! r2 }3 x
  296.         int 21h9 z% P4 \0 }6 S7 q
  297. $ ^$ [& D& O7 \8 l' h
  298.         cli
    + g9 }, s1 m6 ]
  299. - ~2 [/ D3 O8 v! N6 a( M2 Q
  300.         mov bl,0a8h" Z: l5 p' L9 ?1 I% r
  301.         call keyboard_cmd: P! S% @! d. E9 ~$ C

  302. ; u' O2 g4 f$ v2 b, t6 N
  303.         mov bl,20h
    9 T! Q' }3 d; K9 B
  304.         call    keyboard_cmd# g& |& d3 ~% U2 o' v4 A# y1 _
  305.         call    keyboard_read5 ~" V, U; m# {- r% P# Y
  306.         or      al,2% p) v' g/ i0 a! O' l; e/ M* u
  307.         mov     bl,60h
    . [* C9 L# X" Z  R- p+ R5 A1 x
  308.         push    ax' G. Y" b" C" @- k0 _4 H8 b
  309.         call    keyboard_cmd1 H6 Z, J8 I$ v6 F9 n
  310.         pop     ax, ^# h- u" x2 t1 c/ Y+ k% O
  311.         call    keyboard_write
    ' D6 f! ?3 _5 L/ [6 u/ e; {; v
  312.   y8 X' G% k: g% S9 l. M$ u6 t
  313.         mov     bl,0d4h; T4 J7 a. Z, K6 F; N2 H- S  ?$ m
  314.         call    keyboard_cmd
    ! A& D5 Q) L- S
  315.         mov     al,0f4h9 m/ U4 e, |! o; Z6 o8 T+ }
  316.         call    keyboard_write# [% x2 ^  W, c6 u/ \$ C% s; J+ V$ f

  317. ( E! H4 g5 K8 \: L: V1 a8 b
  318.         sti; y  M% y: r1 `
  319.         ret
    . P7 P% G7 r& W, q& _; R5 W
  320. call_user_isr:: W0 B9 p4 N1 h8 J
  321. db      60h/ F4 b/ |/ r/ S6 ?3 i7 B# z
  322.         mov     cx,cs:[pos_x]( `$ @6 ]$ p1 V3 n+ f) ~
  323.         mov     dx,cs:[pos_y]: n4 M  K$ y# }' t5 [0 w+ s7 J; u
  324.         mov     di,0 ;cs:[x_move]
    % t* D. s8 p5 }5 P* Q
  325.         mov     si,0 ;cs:[y_move]# F; P$ I6 U; l) y- E* p1 Q6 j
  326.         mov     word ptr cs:[x_move],0
    % T* Y0 N7 J+ z9 ~) m
  327.         mov     word ptr cs:[y_move],01 V1 c+ ?3 J' N; _/ n
  328.         mov     bl,byte ptr cs:[buttons]$ O7 r# g, A' H8 }: H5 D
  329.         xor     bh,bh2 H3 o. a7 ?/ t; h  G
  330.         call    dword ptr cs:[user_subroutine]/ w, Q( C. ~+ J% T: U
  331.         db      61h  D0 j- L4 B$ T9 [& Y6 A
  332. ret7 z" \  f! A* f/ Z
  333. new_isr:- B( z5 k" j! H( y; t
  334.         pushf
    5 L$ V3 h9 e1 U* a) F+ a: S
  335.         cli
    5 a, K/ h8 ]. b0 V4 U& P4 D/ U2 U
  336.         push    ax
    9 z0 I0 y# E! K/ B
  337.         push    bx
    . ?. {5 d& G9 {7 P+ e
  338.         push    cx3 o: c) Y* a8 ]9 I+ ?% z5 [( ~
  339.         push    dx  N* H' @" T! u7 U* j8 I% f+ Q$ B
  340.         push    di. k* a, j) ?" j# {5 Y' X
  341.         push    si
    ) Y: i3 I8 l& ~6 i" j6 I6 `! ^
  342.         push    es
    ( _/ k* C/ ^9 G2 j
  343.         push    ds
    ) t8 e9 |9 I* Y( X
  344. , P: S2 }- F+ x, S, C
  345.         push    cs+ s: F4 K0 a) W( Q7 M% n
  346.         pop     ds
    ( q1 e! Q; F; i; f$ A- E

  347. 0 {/ i# G4 r1 M0 N0 x3 G, d$ @
  348.         mov     bl,0adh
    8 l, W5 C8 Z- ?5 k) ~2 ]3 h
  349.         call    keyboard_cmd
    0 C/ }3 X" Y- c* v8 t+ y2 }

  350. ) L1 T2 A& X" r! ~% O& R/ t6 [3 b+ R, Z
  351.         cmp     byte ptr [first_time],0' c* C* n6 B/ i+ o- t
  352.         je      not_first_time7 |" ^) u& v( ]. k# M, U

  353. # `5 f& z  f* y- J& E
  354.         mov     byte ptr [first_time],04 s8 }6 P/ E3 i; ~# ]
  355.         call    keyboard_read
    / F9 h- w8 F) g' O% Z
  356.         call    keyboard_read
    ' R% T4 A5 [: ]5 n8 t
  357.         call    keyboard_read7 C! ]/ X. ~# o9 i# |
  358.         jmp     no_show/ I: ~  `$ X/ {# ]& w

  359. 6 f/ f9 v+ t- R9 C6 T
  360. not_first_time:
    + j2 R; K8 R3 d- K- Y5 ]! W; e, Y: g
  361.         mov     word ptr [temp_mask],0
    5 ]& R$ T, ?0 p- ^% {! q5 \

  362. " ]8 c- x" Y, _4 X1 H
  363.         mov     cx,[pos_x]
    * @# X/ ~2 R  D" q7 h. M6 {3 H
  364.         mov     dx,[pos_y]
    . B. |) x$ s8 L! O5 X
  365. 1 ]! U) l& v8 J" R# G
  366.         call    keyboard_read
    9 y2 Y/ v  V  ?: M  N. l7 a; q
  367.         and     al,7 ;3
    8 M5 x2 C, Z; y$ `
  368.         mov     ah,[buttons]
    & b) U7 ^7 \2 q
  369.         mov     [buttons],al
    # i) e; X$ g- M+ N$ M2 f% e
  370.         cmp     al,ah$ R; `( G* w& A+ ?( u
  371.         je      no_button_change& M1 u& T& {8 V
  372.         and     al,3
      q, G" K' j/ q( ]' A
  373.         and     ah,3' o" `# H$ [6 C
  374.         xor     al,ah% U: H. c5 }- ^
  375.         xor     bx,bx3 X7 {' Q- m5 _; i# B" n, J
  376. 2 G6 l* j4 `: N& M. u# l/ q
  377.         push    ax
    ' U% y' P* C6 M$ C! k
  378.         test    al,2
    9 D; f. `" ^+ _5 Z# i' K
  379.         jz      no_right_button_change
    + ^/ I) a% @5 I' N  m5 c" `1 s- Q
  380.         and     ah,20 h' t! }6 [3 H+ K6 h2 l
  381.         jz      right_button_pressed* X- ^9 s& @, |8 a, }9 e; k
  382.         or      bx,16( ~5 f. m+ H! s4 `" A
  383.         jmp     no_right_button_change
    ! F' y; q( D( S( i; m
  384. right_button_pressed:, J" B/ ~! W! o% S+ r
  385.         or      bx,8; K; |5 Y6 N, [! u# V1 X
  386. no_right_button_change:5 v. b0 T8 f- P" B0 }) t- A

  387. & ~* J6 G2 O5 ~! \6 a: g/ Q
  388.         pop     ax3 x, t6 f2 f$ R
  389.   W+ b* E, Z/ b. K5 ^% u
  390.         test    al,1
    / ^  D5 J# l, P, `- h7 E* b
  391.         jz      no_left_button_change
    6 E  c) ^# D( M8 U0 b; M' u6 V
  392.         and     ah,1
    , C% s0 m# F: J. n# V7 }
  393.         jz      left_button_pressed
    : \$ b1 V7 w& J# b
  394.         or      bx,4
    6 i7 s6 a; E6 _
  395.         jmp     no_left_button_change
    5 b$ Q! O  Z3 @1 @' n& a0 ]6 P
  396. left_button_pressed:
    1 F& W1 k* q* o2 {* [) V& s) N! X
  397.         or      bx,2
    ) E8 B+ `& [  Z8 i0 l
  398. no_left_button_change:# u1 j3 n1 x. d; }3 `. R

  399. : ^" s) ]; [5 `4 w) ~
  400.         mov     [temp_mask],bx
    3 Q9 s5 q8 x. ^8 {) g1 e* p5 w

  401. 5 V  E& C" O" X# w- f) K
  402. no_button_change:3 r3 x2 V9 ?% ]4 q' q1 T
  403.         call    keyboard_read+ P$ Q" S/ l# h# g. [, o
  404.         cbw
    * p) D2 P& q6 G( U
  405.         add     [pos_x],ax( K9 k# l4 e2 `. B* Z6 [$ Y- ?/ a
  406.         add     [x_move],ax
    1 H8 l5 _7 l, d, `* J4 @
  407.         mov     ax,[x_min]( n' h( ~; R3 L
  408.         cmp     [pos_x],ax
    5 M2 V$ j1 @( `9 c+ S
  409.         jg      good_hor1& \1 J4 G6 j. q1 F! q
  410.         mov     [pos_x],ax6 P1 H# I1 S/ k( i8 t, {
  411. good_hor1:& X/ X: q% m' I& i
  412.         mov     ax,[x_max]# A) T# B, S. H( J% i& @
  413.         cmp     [pos_x],ax
    " u0 J/ @* Y- w/ p+ I' m4 I
  414.         jle     good_hor29 C% Q- K4 N3 B* R; w  Y
  415.         mov     [pos_x],ax) a, Z4 Z* k* w
  416. good_hor2:
    % e$ Q  e6 I5 o) b' F. M

  417. . F  g* z) g. q! U* u
  418.         call    keyboard_read
    # M' E: ]) p* T. ^% d
  419.         neg     al" g9 [: p' F5 l
  420.         cbw, `; `% n5 l/ I6 l' ?' Y* F% l, J
  421.         add     [pos_y],ax
    0 V2 n9 e) A5 T; c
  422.         add     [y_move],ax
    7 J8 {4 O$ B2 a, o0 a9 G
  423.         mov     ax,[y_min]: x/ E) o" v: K8 [! w% W
  424.         cmp     [pos_y],ax
    9 e" b0 z, ^4 a
  425.         jg      good_ver1% o( D. C+ x1 `4 x  q* O
  426.         mov     [pos_y],ax
    : ]: b; z7 v% Y3 N! g) T' L; d; D
  427. good_ver1:
    3 L" t  F3 j, m! \5 u/ _! t
  428.         mov     ax,[y_max]
    : Q  Z8 s4 S, w2 m
  429.         cmp     [pos_y],ax
    + J; t2 s  p- e; h# S* Q
  430.         jle     good_ver2& E. M! Q( o4 f5 o9 G8 }
  431.         mov     [pos_y],ax. f, u4 y. ~8 c9 D- J& a
  432. good_ver2:! G% K7 d, R0 C7 l$ b9 H

  433. 0 y- w/ [1 r6 o( K4 x
  434.         mov     ax,[x_move]' g# `8 b  x/ r" d) y% V# m
  435.         or      ax,[y_move]
    3 c  z- V- ^  ^: [1 \
  436.         or      ax,ax# Q. O+ _4 z# l- c
  437.         jz      no_change_position
    , B) b7 F0 f2 D6 I- O/ {0 O
  438.         or      word ptr [temp_mask],1; G+ ~3 [6 S1 y
  439. no_change_position:# ~3 f4 _" v' e, K" a

  440. 2 H" i2 w" i0 S6 ~" Q+ |& R
  441.         mov     ax,[temp_mask]
    * e- k2 S, I8 F. E2 U2 f% d" c3 T
  442.         and     ax,[user_mask]! T' }0 C1 |" K5 D) m8 g
  443.         jz      no_call_user6 I+ k/ {! Y' u7 b# S
  444.         call    call_user_isr
      w; L6 Y8 p; V4 U: R
  445. no_call_user:& ?7 [$ W# a- O2 ^
  446. ! e9 l  Y/ y" O. L9 j
  447.         cmp     byte ptr [sm_flag],1/ s2 O8 i" B* @2 e  h
  448.         jne     no_show
    # B5 m1 q. B6 L" x9 J2 a" ^. z

  449. , W/ A& k% E+ ^3 j& O+ \+ c
  450.         shr     cx,37 Y! e! X4 J6 _; }1 G+ w
  451.         shr     dx,3
    7 _- ^5 Z4 {$ o; J8 `  o% \, F& y
  452.         mov     ax,80
    : V. [+ g) H* ?/ H
  453.         mul     dl
    1 i  ?3 K9 d2 @/ I7 G9 a
  454.         add     ax,cx
    9 B" U% o# k* K# S: }, B
  455.         shl     ax,15 _0 _( H# i: ?( c* x8 y9 `+ M
  456.         mov     di,ax( p7 D9 k; B* q3 y/ V; z
  457.         mov     ax,0b800h
    6 V9 X# O& M  k" z  Q9 ]
  458.         mov     es,ax
    ( N1 ?. E$ d2 b- a) Y  _' ^
  459.         mov     ax,[save_char]
    ' ]) p: e/ m5 F
  460.         stosw
    / H$ l' M* F1 H7 \7 o7 J1 M# J

  461. & F* {, z% C$ e4 E+ P2 b( s
  462.         mov     cx,[pos_x]8 U+ i6 ^1 e8 A* i( F
  463.         mov     dx,[pos_y]
    + t. \. G! p; g1 M: \; x7 f0 B
  464.         shr     cx,3, d2 O& T4 [0 ^3 u4 S( d
  465.         shr     dx,35 I* |1 u$ b5 A1 W6 T" S
  466.         mov     ax,80
    * {) P+ N1 ~! a" t
  467.         mul     dl7 D, A/ ~, h- X
  468.         add     ax,cx
    5 u, x6 P* q% R1 |
  469.         shl     ax,1
    - R8 N  E) e& P7 W" H8 ~
  470.         mov     di,ax
    1 r$ v, N2 U6 X7 n1 D
  471.         mov     ax,0b800h
    : u- e2 m; t) p
  472.         mov     es,ax4 @6 i2 i+ N% o+ j: c
  473.         mov     ax,es:[di]
    1 u+ A' q# s+ X" U5 |
  474.         mov     [save_char],ax
    ) n; e2 g+ \" f) r
  475.         not     ah
    ! U8 F# ?+ w& ~; B5 Y3 ~
  476.         and     ah,7fh0 I9 g. ~3 W8 o- R
  477.         stosw5 h8 I. v% Z' n/ l" p
  478. no_show:
    6 n" S% u6 x1 j( }
  479.         mov     bl,0aeh, |: N2 N: W: E+ H- K8 ?: m, g
  480.         call    keyboard_cmd
    & h& O2 ]/ T( }) N5 `& o
  481. - p' P2 N' Z) X) y( [
  482.         mov     al,20h
    9 @0 c+ Y+ c. }9 y$ F; L
  483.         out     0a0h,al
    ! M9 ^7 {7 T( e$ J0 ~4 [
  484.         out     20h,al: Y* |; |! q. C
  485. 9 q: ?6 q& h, L2 |9 W* a+ h
  486.         pop     ds0 S' k2 Y- H& u: S% _3 V* H; J9 D/ s6 {
  487.         pop     es
    0 E" M: F0 E3 o$ Q/ o
  488.         pop     si
    ' c! e' D) j  y" z
  489.         pop     di( \2 x1 _1 m' x3 T/ T
  490.         pop     dx
    1 g, m! O$ [/ z* X5 O
  491.         pop     cx' B4 t8 \1 A: t9 R1 ]
  492.         pop     bx
    - t( C/ T/ y0 T' O3 z: _' Y
  493.         pop     ax
    5 i. e8 G; T/ L
  494.         popf
    - [( w8 S" \1 O8 B# K/ x3 I1 P
  495.         iret. q# E' a6 {6 J3 K$ z" [
  496. 0 P4 x6 r5 G9 u
  497. first_time      db      1
    9 w0 D. {( u0 s
  498. buttons         db      00 f" m. s8 Z: D$ i, l( L+ r  p
  499. pos_x           dw      0
    , D* u+ `2 S+ @! O2 d" l* s9 B
  500. pos_y           dw      07 G! B( F4 Q, s
  501. sm_flag         dw      0. T0 D% n6 [* p, ~1 C
  502. save_char       dw      0  K0 B- s* x2 ^3 n* h3 ^' f- r1 u
  503. x_move          dw      0
    6 W9 h% U+ l# |/ t' E
  504. y_move          dw      0
    & P. u$ f% l! D9 P, ?1 w
  505. x_max           dw      6398 |( o7 H( }% l% Y8 g- m2 {3 d
  506. x_min           dw      08 S, i2 l& b& \' z: N6 d
  507. y_max           dw      199, ?* {. A+ X7 t8 x/ A$ i! |) t3 r
  508. y_min           dw      0
    ) ?/ P" U3 V: u
  509. user_subroutine dw      0,0
    + M& m0 D( x, O# O8 J8 E
  510. user_mask       dw      0
    # v: k& n& K. j0 r
  511. temp_mask       dw      0
    . }1 p5 |- E( X" F
  512. 3 x: @2 ^( Q3 w% V5 Y6 q! L6 q
  513. keyboard_read:+ Z' U" ~1 l4 H
  514.         push    cx- B. L$ i% {1 O% a' h
  515.         push    dx
    5 ^, L+ \4 ?" _; s2 s4 Z
  516.         xor     cx,cx# l& [- `7 l; h. H% \+ S& d
  517. key_read_loop:- l* O3 c- Q# R5 @
  518.         in      al,64h( F$ u: |: G' S! o% u
  519.         jmp     $+2( z$ \6 r& ~' j4 ?8 h
  520.         jmp     $+2, N; {. R; ]# a
  521.         test    al,1
    # R; i1 e! G; V, u
  522.         jnz     key_read_ready5 j( r6 L+ ]+ p5 M
  523.         loop    key_read_loop
      A, _/ n+ H% p; g* B  j! P  N7 s
  524.         mov     ah,1
    2 o) ~# u6 x5 B/ O( k% O
  525.         jmp     key_read_exit
    $ O: D( f, b( s
  526. key_read_ready:
    * p/ c2 C  Q" N2 K
  527.         push    cx4 {' O3 {0 F$ w7 [+ W; F5 S0 |, w
  528.         mov     cx,32
    ' J7 c+ E* d) r' R) K6 T( m: y9 F
  529. key_read_delay:) Y% u  }' C! C$ j- @
  530.         jmp     $+2
    7 u4 ]6 A- n, b1 K6 t0 P* K- b
  531.         jmp     $+2
    6 H% f5 h) B. U# Y
  532.         loop    key_read_delay
    * X( C0 `5 `# e; A3 Z
  533. . e# m6 a, [9 x% [- I0 X
  534.         pop     cx
    1 h8 ]2 E* d: n

  535. . R9 u& }" y- w, a$ N
  536.         in      al,60h
    ) A5 a/ ~' O; L+ d2 g; j4 Q  E
  537.         jmp     $+2
    / @( }0 ~% X  j9 t2 n
  538.         jmp     $+24 p4 U! A( R$ Q7 Y' i8 B  C
  539.         xor     ah,ah$ [' f* V4 @* \1 v
  540. key_read_exit:, x! q  ~9 ^3 E  R& n, y  n0 B
  541.         pop     dx
    ; [" D/ P6 N4 g' `! S  F
  542.         pop     cx
    ' p2 J& D+ s* c1 X
  543.         ret
    # ^. _$ t6 [' e& c$ {
  544. ' ^& L5 o" n* o5 ?, {% x3 _6 b
  545. keyboard_write:, X# N! }+ N9 r4 }- B3 R
  546.         push    cx, T& B) P# z; C% V" B
  547.         push    dx
    " B' a" _' V  s% F& X
  548.         mov     dl,al
    ( G8 `8 g% H. m8 j. [  C: Q
  549.         xor     cx,cx
    2 ?. d/ _& ]0 [0 \" ^: M) V
  550. kbd_wrt_loop1:, P9 N4 D0 T- `( z8 e
  551.         in      al,64h5 d" @- P( h# p2 y
  552.         jmp     $+2
    & S. A! ^3 b) k" [
  553.         jmp     $+26 O8 J) k$ Y6 ?; L; g- V
  554.         test    al,20h. S5 l( X# r3 O; X( E( x9 m. x( m
  555.         jz      kbd_wrt_ok1
    , k6 e0 U$ c# F
  556. 5 t" f5 l4 S/ z/ e: ^) {  |& H+ K
  557.         loop    kbd_wrt_loop1
    2 A- s' J+ D% t3 N# ?/ |) u( I
  558. 5 Y* ~+ d6 d% D3 j5 d/ ~' h3 W
  559.         mov     ah,1
    7 y5 k: W& z) F0 D, H' N8 B7 h
  560.         jmp     kbd_wrt_exit
    6 `. u& J# a, {! z
  561. 3 [5 }9 }7 O. H2 P3 Y% S
  562. kbd_wrt_ok1:7 A0 ~4 j$ B- R1 k/ l5 _+ D* q1 u% L
  563.         in      al,60h' N4 v* \9 \' X: A) b

  564. " H! L0 d: ?' }% E$ c5 B
  565.         xor     cx,cx1 ^6 O* D8 h: P
  566. kbd_wrt_loop:
    ; j: ~5 K& O" m% d. @) \
  567.         in      al,64h
    * ~' O: I  H0 ?; I% z" m- v
  568.         jmp     $+2
    + n- R+ `5 L! L$ d# W" I
  569.         jmp     $+2
    . i! |3 ^4 b4 i
  570.         test    al,2
      w4 w# q; R& ^; R9 D# n6 c5 n
  571.         jz      kbd_wrt_ok
    8 m2 Z5 y! K- C% y5 z$ m2 r

  572. 9 U$ E0 ]' t0 N" f8 d. a
  573.         loop    kbd_wrt_loop2 l4 x: p1 T4 {4 Q# i, A
  574. + l1 q" ~2 o/ J, X4 W6 U  I
  575.         mov     ah,1
    " H# d- w" [1 w. b) j
  576.         jmp     kbd_wrt_exit# ?+ E3 W$ W6 k; h* F9 G) ]3 H' z

  577. * a: t8 M' m" X
  578. kbd_wrt_ok:
    5 D- u  P% {: E5 a
  579.         mov     al,dl) i( p  ?" N' I
  580.         out     60h,al
    2 r$ ^9 L' `) V$ B- D" L# c
  581.         jmp     $+2
    " p$ X9 h. X7 w) G
  582.         jmp     $+2  u' Q' N6 z8 z; ]  c

  583. 9 m$ _9 }) T. ]# O# R$ W# q8 B+ ~
  584.         xor     cx,cx
    1 o2 A; N( U4 Z8 `
  585. kbd_wrt_loop3:: x0 f* z4 a, q+ o
  586.         in      al,64h
    4 t: Y& w. Q' {8 J9 E, v0 h
  587.         jmp     $+2' L5 ^* U1 u! \# ?$ y
  588.         jmp     $+2
    : A1 g( y" ~1 D% M/ K6 F
  589.         test    al,2
    * q4 b$ j) Q$ N9 x
  590.         jz      kbd_wrt_ok33 h: {% B+ m9 g# A# M4 w8 z3 D

  591. 3 m+ E) ?) N. f8 d$ K
  592.         loop    kbd_wrt_loop3
    3 B/ c/ ]( J& L% Z, {  Q
  593. ; Y; ?# w# V% t9 K3 i) z" s- H
  594.         mov     ah,16 ]8 [0 A9 j1 W' c+ Q9 K, S5 R
  595.         jmp     kbd_wrt_exit
    3 x6 m- U' Z4 y; R1 ?9 X) h3 ]

  596. " h6 M1 @: z8 o! b/ ^
  597. kbd_wrt_ok3:$ U1 O5 E4 x8 W) ?' V& s9 q
  598.         mov     ah,8
    + Y' ^! F  Q% S/ z. V
  599. kbd_wrt_loop4:! K- Q" _$ |+ D1 M' K2 k
  600.         xor     cx,cx5 W  j1 o* \( O, W
  601. kbd_wrt_loop5:
    , @8 W5 D8 Z, V& G! a6 X, h1 C
  602.         in      al,64h
    7 u7 R" [( b, C3 h! m1 M) p3 A
  603.         jmp     $+2# L. z2 f7 ?( Q5 c8 ]7 s0 R5 N
  604.         jmp     $+28 g! C- [7 r4 e  P2 G
  605.         test    al,1
    ! N6 s- {- M0 Z+ P, s# r; V0 a
  606.         jnz     kbd_wrt_ok4
    & }( I) u+ l# s* f' m% }

  607. : T: u" q# @" C* {2 C# @
  608.         loop    kbd_wrt_loop5
      G: `8 @; O8 f
  609. : c2 `+ F  h5 n1 f' R5 o2 B
  610.         dec     ah5 u. E5 ^& p: X$ _2 `: Y, K, O
  611.         jnz     kbd_wrt_loop4
    4 s0 [$ @5 p( @: G$ h$ O
  612. 7 i6 l. K! r9 y& H6 y" @8 B  |+ K
  613. kbd_wrt_ok4:
    2 n. D% P" D2 a, \
  614.         xor     ah,ah
    2 B  A: c* M% t5 J! d# x$ [
  615. kbd_wrt_exit:/ N  F" T  w& G
  616.         pop     dx" E- m  ?( W  O  X9 b
  617.         pop     cx# k$ n8 l# z( h+ y0 g3 ]* S) g/ _
  618.         ret
      k% f( q% e2 \6 R8 b
  619.         
    ' M8 ^: V& q) F: J# P) D
  620. keyboard_cmd:/ h" Z) X& i  N5 D
  621.         xor     cx,cx! h; K/ |1 N: \) q& x* O. m( {
  622. cmd_wait:
    4 W" y' R5 X1 ^0 r6 h4 P6 }* S
  623.         in      al,64h
    5 N) t/ P, v9 i7 f8 d$ j( d
  624.         jmp     $+2+ V$ X, n  ~  J7 t! Q
  625.         jmp     $+2
    ) K1 X& z- G* ]$ ]3 H4 h3 o
  626.         test    al,2
    ; ~+ g; e) P$ X
  627.         jz      cmd_send5 j+ P& ]* Z. O. _6 U6 q
  628.         loop    cmd_wait% o) O7 B9 |9 F" X' M: t( Q  l! X
  629. , p: ~/ y3 Q" Z0 {
  630.         jmp     cmd_error
    ) C- e5 V' S9 j

  631. - k2 G; x+ L3 f0 z) g+ L2 C! z
  632. cmd_send:
    2 H3 s) H% E, ^- ?( I! u
  633.         mov     al,bl
    % J6 A6 y/ p9 h
  634.         out     64h,al; ~- o" ?" f! ]+ Z% }& _
  635.         jmp     $+21 f! t3 z: @* }8 X
  636.         jmp     $+2
    , i/ h5 t& r- E. u  q, W* Q% e
  637. " v4 R  d9 o: }
  638.         xor     cx,cx
    8 A( Q! k2 S; w% `8 A
  639. cmd_accept:6 B3 v9 W6 v  W1 t+ Z, o
  640.         in      al,64h1 R; R3 ]( F, x3 {6 ?
  641.         jmp     $+2/ ]  _' @' R* |  z6 L' \
  642.         jmp     $+2# I- F% ?' n! }4 t
  643.         test    al,2
    & v9 v) D6 }, L7 ?/ a* Z
  644.         jz      cmd_ok
    ) s! E: y7 r2 U
  645.         loop    cmd_accept* [6 p, ^/ [9 B* V7 N8 X

  646. ; z! _% Y0 Q% r; T1 H* i/ |: i
  647. cmd_error:
    + ^5 b* X9 }5 a  I% ?  _
  648.         mov     ah,1+ b  X3 f) ]/ K) q; L
  649.         jmp     cmd_exit1 i2 F) @# c# M& Q2 x
  650. cmd_ok:
    4 h( P/ g  |8 q, T# F
  651.         xor     ah,ah
    5 u0 p. v0 e  v- Y0 n. K6 B: f
  652. cmd_exit:9 p0 E# [: }$ S3 \8 N9 C
  653.         ret9 g0 ^; P4 a3 l! K& O5 [

  654. 3 U( Z; R$ S4 v' u7 o
  655. new_33:
    ! G: B! J$ k/ b6 q) r* z% L
  656.         cli1 ]/ f9 C2 a7 c% `1 L7 I: C, {
  657.         cmp     al,0
    ) \7 E" h" N$ I) w9 H, o* }) X
  658.         je      reset_mouse5 C1 V! ]: {' z; w# s
  659.         cmp     al,1
    2 m, {) O4 q* e$ m, t/ s
  660.         je      show_mouse5 m) s, X: k+ f: a# O# t8 P8 _
  661.         cmp     al,2
    & J: ?) H  z" u9 z2 F* m, Z2 Q
  662.         je      hide_mouse/ L& M; {' ]/ `6 j$ Y9 E
  663.         cmp     al,33 E3 ?5 Q5 n/ I6 w1 b" k$ j8 W
  664.         je      get_pos
    9 ]3 u/ d% v5 l8 ]; ^' \
  665.         cmp     al,47 r5 M6 I' f& R* @4 \
  666.         je      set_pos
    6 d5 w+ R  b/ w, r& r/ |
  667.         cmp     al,7, ]. m, C7 j1 y! x0 h
  668.         je      set_hor_pos
    ; l! ?  S: Y+ R: |3 u
  669.         cmp     al,8, c; F+ \! m  w
  670.         je      set_ver_pos4 r3 ]' o: [/ x
  671.         cmp     al,0bh
    6 j7 D/ [$ |6 t  L/ h
  672.         je      get_mouse_movement
    8 ^8 p, {) s+ V
  673.         cmp     al,0ch# I5 C- s! s5 U/ s4 G) l; N- E
  674.         je      set_subroutines
    8 K! U. {; z/ {- _, C3 u3 G
  675.         cmp     al,14h
    : @; B) U6 j0 |  u( j' d1 M/ z
  676.         je      swap_subroutines
    ( y! w3 z" ]/ i+ C* j
  677.         iret5 B' `6 ^6 ^, E, x  q

  678. , k6 V) l3 l- a  s3 G
  679. reset_mouse:
    / ]+ X; ^) s$ `
  680.         jmp     _reset_mouse9 _9 o: j, d+ F6 c
  681. show_mouse:9 }: ^2 B; `! _4 z6 Y4 O, x9 R
  682.         jmp     _show_mouse) H+ ^$ E6 `9 p& D
  683. hide_mouse:8 u$ L6 C$ q; b: ]7 |% ]7 n
  684.         jmp     _hide_mouse
      u) n4 ?3 `+ ?* v6 L+ T+ u
  685. get_pos:
    % w% f# I9 G/ a6 i2 a! Q0 J
  686.         jmp     _get_pos' E8 v2 b# t1 t1 g9 \
  687. set_pos:! Y& b1 L) p. D: A, D9 L! h
  688.         jmp     _set_pos
    1 C# g, o" o* e- f$ C! D) F4 b
  689. set_hor_pos:, Z# w6 A  Y" @9 I* b
  690.         jmp     _set_hor_pos  k; [- D( ^( a- |1 h6 H; ^$ p
  691. set_ver_pos:9 _. i! ~$ A: @
  692.         jmp     _set_ver_pos
    , k, f' B$ |, y5 g
  693. get_mouse_movement:
    $ d! g7 B0 B! W3 w$ d: z$ j$ ~
  694.         jmp     _get_mouse_movement* b. o+ O" U6 C% V
  695. set_subroutines:
    - n6 \3 \" b" n: _: j, R# y7 f5 g6 @! l
  696.         jmp     _set_subroutines
    " m) _* R1 {! C  ^' l
  697. swap_subroutines:, s9 S2 z  c2 F( f# N6 a; b
  698.         jmp     _swap_subroutines( p% M3 l$ g4 L

  699. 6 i7 N: m. M5 K3 k
  700. _reset_mouse:2 t9 Z1 ?4 G7 J7 ^/ M$ b8 V
  701.         mov     byte ptr cs:[buttons],0
    9 V( O: i) h8 {6 B. H- D* V( T2 y
  702.         mov     word ptr cs:[pos_x],0
    1 n( N$ s& J* I+ E5 X" l' K
  703.         mov     word ptr cs:[pos_y],0- P7 M: u* H" m! A# W& z
  704.         mov     word ptr cs:[x_move],0
    ! F& e# v( `8 |& K  q
  705.         mov     word ptr cs:[y_move],0# J8 |7 ?2 \9 ^9 \! \
  706.         mov     word ptr cs:[x_max],639
    8 n8 `7 P" R/ D2 w; [4 V2 e
  707.         mov     word ptr cs:[x_min],0; g& h7 d9 m7 S  g& A
  708.         mov     word ptr cs:[y_max],199; w. _/ ?9 r! ~+ F8 I2 i( e
  709.         mov     word ptr cs:[y_min],0" N0 Z& R: E* b+ N
  710.         mov     word ptr cs:[user_mask],0
    4 y6 ^% g" ?, ?* t+ F: N% |
  711.         mov     word ptr cs:[user_subroutine],0$ a; G) p& l& r+ q* ?% _9 }/ e3 ^
  712.         mov     word ptr cs:[user_subroutine+2],0
    0 ?8 X% i2 M1 G3 z$ m3 O
  713.         mov     ax,0ffffh
    $ c& {6 R9 e7 y) D  n7 C
  714.         mov     bx,34 L, `+ U& w4 C2 g7 l
  715.         iret
    ! m0 o% b- {; X/ x
  716. 2 f$ c5 f+ N# B2 ?
  717. _get_pos:
    , q  g: _, H5 o0 r% z8 P- r- N
  718.         mov     cx,cs:[pos_x]  U: |4 \1 m7 h* u% z1 O
  719.         mov     dx,cs:[pos_y]
    ) y; j1 S5 U3 ^8 q( M' Q
  720.         mov     bx,word ptr cs:[buttons]
    " D- B- g7 D4 S: Q. W2 o% R+ ?
  721.         xor     bh,bh
    $ e$ T! @# T: ^3 i! H( S/ t% J9 n- i
  722.         iret/ S  v$ B: t3 E; F$ j0 `5 }

  723. 6 J0 y" D, Z$ Z
  724. _get_mouse_movement:
    * V" }0 c: X4 Y: x0 \
  725.         mov     cx,cs:[x_move]
    7 G' x9 V6 L, @% e
  726.         mov     dx,cs:[y_move]
    ) w7 i+ ?% D" r# A: j
  727.         mov     word ptr cs:[x_move],0% ~  l) N) `, E3 ]: C$ l4 ^
  728.         mov     word ptr cs:[y_move],0$ J2 n0 [8 X8 E* {7 @3 p/ @
  729.         iret
    8 C0 {5 W/ u% E7 b* N) H% e: A0 R1 Y

  730. " T- k/ v$ H8 u# Q
  731. _show_mouse:
    * m( R1 X3 Y: I) T" {/ C  y
  732.         push    ax% b' _) u+ ~7 D% s2 y; _2 U
  733.         push    bx9 Y! Z7 r6 t5 W" g
  734.         push    di& o4 c+ x+ ~1 U  d9 d. W5 b# A4 e+ m
  735.         push    es7 S. e+ M" x( D. W1 G% p% e, W: T
  736.         mov     byte ptr cs:[sm_flag],1% u, f5 p3 C1 j$ l4 ]; u% c
  737.         mov     ax,cs:[pos_y]
    ) A0 P! w+ e4 t* L( y1 u
  738.         shr     ax,3. z8 i  X( |( e4 q& T1 h0 P
  739.         mov     bl,80+ l1 Y' W' ]7 i% |( j  Z
  740.         mul     bl
    1 ^7 @  ?& h: x
  741.         mov     bx,[pos_x]
    : C6 |$ ^( G3 p, Z4 G% X' y
  742.         shr     bx,3
    6 u3 K- B3 H* o' X+ x& R
  743.         add     ax,bx. b6 Z: ~/ S9 B
  744.         shl     ax,11 O8 b2 T4 o; f7 M: T" l' i
  745.         mov     di,ax
    ( Y; w6 F( x$ S+ }! R: E7 A
  746.         mov     ax,0b800h& A+ p: D9 D* k0 g
  747.         mov     es,ax/ x7 V% I) ~- q9 x0 _) e
  748.         mov     ax,es:[di]
      \( g4 i1 s) L4 q& [8 P$ v& A
  749.         mov     cs:[save_char],ax7 H8 o) R* y% A( ^4 F# A9 t/ L  q
  750.         not     ah
    - }" i) T. Z$ }. d: I3 S1 k
  751.         and     ah,7fh
    + i+ e% J3 I; D9 ]6 V
  752.         mov     es:[di],ax# W! \0 t# U3 z- w1 H6 Q7 @( L
  753.         pop     es/ A+ L, t& u' z6 }
  754.         pop     di9 r1 a7 U- \  L: H& X. H* X- P, N
  755.         pop     bx
    ' r, j1 U" S( X9 h
  756.         pop     ax6 X+ t6 U$ S; r+ n3 Z* M
  757.         iret" T: e& |0 V% u2 O$ c3 S' J8 i: V& B

  758. 8 x$ B8 L( q; X, j, U, a8 X7 b& T
  759. _hide_mouse:  A' |1 L6 ]7 A2 w5 v3 h
  760.         push    ax
    " u* L  ~+ [! h- }( z  p+ e6 t
  761.         push    bx
    8 j2 [( ]' d  W# U0 N
  762.         push    di5 \3 O! B: {9 o5 G; r4 S, Y
  763.         push    es3 A2 U! i2 [1 q( j
  764.         mov     byte ptr cs:[sm_flag],0# ]7 |+ s5 B3 y: y
  765.         mov     ax,cs:[pos_y]
    % v2 S; ?0 N# @8 L; d, Y
  766.         shr     ax,3
    + o; e6 c! Q9 h; ?; ?3 U$ ]/ Y
  767.         mov     bl,80
    / S5 `( T4 c+ @: X- |' p: e# H" c
  768.         mul     bl+ d9 d! G7 n' @4 s( ^' P. V
  769.         mov     bx,[pos_x]
    2 W8 ?  B6 I+ \5 }& I. w
  770.         shr     bx,3) N/ M; M2 B4 E4 n+ B
  771.         add     ax,bx# n: b8 r% }6 b1 x
  772.         shl     ax,1
    / P" Z. K, e$ A% A
  773.         mov     di,ax
    1 f* k' ~: O5 ^8 Q) b
  774.         mov     ax,0b800h
    0 s) A  i* U* c& j' T6 f
  775.         mov     es,ax- H+ i6 V# t" X" {" Y+ [9 J
  776.         mov     ax,cs:[save_char]
    + b, W" A! Y9 t, A: a
  777.         mov     es:[di],ax
    ; i6 n7 t6 W8 V' K
  778.         pop     es
    * u4 q$ r3 B6 Z& p( w+ ~: k9 A
  779.         pop     di- c" Z8 f5 K# X  M. S" h2 ?4 r, d
  780.         pop     bx
    + }9 q- W3 ?- l  u
  781.         pop     ax
    2 x% v# w/ f" a7 {- z: o/ i
  782.         iret
    4 j$ D# ~4 s0 V

  783. # A" e7 x+ t/ W8 p" {
  784. _set_pos:1 U5 K5 R: W4 k
  785.         mov     cx,cs:[pos_x]/ G$ v2 J; I$ d0 {* N2 w% T" _0 d
  786.         mov     dx,cs:[pos_y]& W4 E  n% g8 Q6 i. x- q
  787.         mov     word ptr cs:[x_move],0# c3 ?+ ?. g) K# `' t
  788.         mov     word ptr cs:[y_move],0( x7 }/ K2 o4 f# G! {9 v
  789.         iret
    3 M8 a& o  S, c4 z( w3 O  ~7 h- T  ]
  790. & M9 _6 O3 N1 }4 J  S2 y
  791. _set_hor_pos:7 \: ~; C. T: K
  792.         call    max_min
    7 W5 j) q/ q4 ^3 U3 X" S
  793.         mov     cs:[x_min],cx
    5 T( b! T: }/ t$ C. s' ^
  794.         mov     cs:[x_max],dx; X& y2 U  O+ ?5 P- ]
  795.         cmp     cs:[pos_x],cx
    ( q+ Q9 v( S. T. J2 u8 h1 ?6 }
  796.         jge     good_hor_min9 }1 o+ v' _3 h, a, a/ Z
  797.         mov     cs:[pos_x],cx
    - Q( N$ l+ R* R2 H- K1 M- O7 W
  798. good_hor_min:1 z5 t+ N8 C0 W8 F  d1 }
  799.         cmp     cs:[pos_x],dx- d  x- e( m, u
  800.         jle     good_hor_max: p. l4 Y3 v% @8 @+ f" d9 e/ I
  801.         mov     cs:[pos_x],dx
    ) R  I4 l$ p! `: M
  802. good_hor_max:0 l# i# Q" a# y2 K  ^8 @
  803.        iret6 r. ?" u" h3 V5 J3 j( A6 h

  804.   Z, P# M" {1 n1 S4 M
  805. _set_ver_pos:
    # S" a5 D) E2 Q: j
  806.         call    max_min6 Z* c& a/ n* o% T6 L
  807.         mov     cs:[y_min],cx; |+ y7 D3 s8 {2 E+ O) ^
  808.         mov     cs:[y_max],dx
    7 n( ?1 e: C2 e
  809.         cmp     cs:[pos_y],cx8 ]/ i: Y2 J9 U3 D5 w7 ^3 L
  810.         jge     good_ver_min( V* }; B; A- k5 y" [
  811.         mov     cs:[pos_y],cx- Z/ b$ i! c3 _% V. k
  812. good_ver_min:
    8 Q6 |% Q) C+ Q! X7 C
  813.         cmp     cs:[pos_y],dx( x/ T4 o0 r) ]' ^
  814.         jle     good_ver_max
      P( x) D7 C' ^
  815.         mov     cs:[pos_y],dx
      ]& q) p- j& \7 c: u7 h6 g/ s
  816. good_ver_max:
    $ z- y# V  @- j7 \* n7 S
  817.         iret
    ' _+ J, E) w: u# S
  818. : u, a/ _, s4 R  u6 a
  819. max_min:8 @' I/ c* e( |, R% |
  820.         cmp     cx,dx# p) B- W& \) B+ B/ p9 X- I1 a
  821.         jle     no_swap
    , \1 u( P( n3 b4 M; z
  822.         xchg    cx,dx
    5 C; f" E' Y0 O! y
  823. no_swap:5 c! ~3 f, B& L/ B: j: G* ?" |
  824.         ret
    9 h% y. q$ I+ q, r5 p

  825. 7 q/ x- n! U! j0 C* B1 c9 C- C, B
  826. _set_subroutines:8 x4 w8 T- h! p; }' N- ]
  827.         mov     cs:[user_subroutine],dx
    1 M6 U5 ^5 X" \
  828.         mov     cs:[user_subroutine+2],es6 g& R+ ^% {: G6 X8 q
  829.         mov     cs:[user_mask],cx9 ~* |. g" j& H2 z4 b
  830.         iret
    , ^3 d9 H- u* q8 Y" _% z' t# H* b
  831. % X0 \" a* d* @& [4 Q6 M( _
  832. _swap_subroutines:
      E9 _8 S! k& t" v0 G' ]1 m- h. f
  833.         push    word ptr cs:[user_mask]3 ^0 \5 A5 h3 ~. A8 H& r0 m7 Y) b
  834.         push    word ptr cs:[user_subroutine+2]
    + r+ A8 e/ ]( g6 o
  835.         push    word ptr cs:[user_subroutine]
    2 E6 Y2 \; G1 N, M0 f
  836.         mov     cs:[user_subroutine],dx7 Y# q4 X+ ]9 _1 X  n( n
  837.         mov     cs:[user_subroutine+2],es. d; L; w9 ^2 g
  838.         mov     cs:[user_mask],cx# r  {1 _6 e6 A% g% ]) |7 a
  839.         pop     dx0 J/ `6 ?. _' s! `
  840.         pop     es
    ! n2 v: l+ ?9 [* \
  841.         pop     cx
    5 F/ {: b6 _) D
  842.         iret( [1 f9 S5 V4 P- R; I
  843. + g' b* A) P, g
  844. memmouse        endp; R* c, S' a2 h5 I. I5 J. ~# d* k; b
  845. : N% e' n, a( F, [8 C. A
  846. endof_start:' g, y8 C. {+ g8 C0 N6 A
  847. % a- l6 Z# d; [! [  P+ g7 [& Y
  848. emsg db 'No mouse driver install error!$'& `$ q5 n+ U* f" L" `3 j$ h0 H
  849. old331 dw 0
    4 T9 D/ q/ z5 {* s1 q( @: F0 U
  850. old332 dw 0
    ! V6 o$ w2 S" S
  851. old741 dw 0" j- Q4 x  G0 F: R/ L  c
  852. old742 dw 0, K  Y' H+ @# H! q1 X; L; d5 l
  853. memcopy db 0% D& c, g/ p* t6 g( d; |( w2 ]  `' V
  854. okcheck db 0' z, i3 o* X+ Z; l1 q; Z
  855. pass db 0
    5 s! n" u- B6 W( W" b$ y+ `
  856. chkl db 05 A- V/ \" a  J# D) t7 R8 ^" X
  857. lk db 01 [8 A* t2 K3 \+ K' }
  858. chkr db 0
    7 c9 G. j) V! ^2 H  s
  859. rk db 0( N( C7 ]' d# C3 J7 S" ?
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '3 u7 q% ^' l+ T7 ~1 U
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    " H* F& b" G, H3 c
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '9 o3 i) Q- [$ z! Z8 _
  863. db '                                                                                '
    3 J! M) H, y( H: K$ V! U6 }4 U$ V
  864. db '                                赏屯屯簧屯屯突                                  '
    8 C2 W, q. F' o9 `  l4 p
  865.         db      '                                ?OFF汉OFF?                                 '9 B  |: i) y* j/ I; k* S( H# ^
  866. db      '                                韧屯屯既屯屯图                                  '# u' `+ O& n+ O% ^) t& r5 B
  867. db '                                                                                '
    7 G6 e% v) W/ k$ f2 n7 a
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '  R, J1 J4 e1 Z3 P8 l) E) o' q
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' / D4 v% O4 f7 T8 R3 o
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    2 r$ a( C5 D5 W6 l
  871. # H( E6 w0 J- V
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!0 [1 B% \* t* o* Z( x1 g
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
2 l& P; t5 S' r1 i& t" t9 Z+ C& ?6 q
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 05:35 , Processed in 0.061029 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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