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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。6 j5 {8 A2 s. M# D6 B$ J6 d
9 j; B9 `4 j. P5 F0 M7 A
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    + o1 Q1 Y/ _7 T6 p
  2. ;          Ufoit PS2 Mouse test program   Ver 0.99 V+ k0 d1 D* N+ F8 O7 M! R
  3. ;                                         By Bini.Yi 易祝兵
    " ^! e% w$ T+ \, S2 }
  4. ;                                         http://www.ufoit.com 计匠网
    % \6 _5 f* c$ `2 H1 u
  5. ;                                         2002/04/06 YYYY/MM/DD) T" E7 I+ Z2 `& P% b; j  w8 \! A/ V
  6. ;
    # j! s$ r" t. }3 Z$ ~
  7. ;          8 J, {& O  [1 x$ N! Z4 P
  8. ;          This program  test the mouse button  click and move.
    6 e/ k  S- Y3 |# w
  9. ;) ?; v6 y6 o) p. B8 ?4 U

  10. ' Q" Y# I* o; r' ~4 q
  11. .model tiny
    & s: K* c8 A- T
  12. .586
    " o* S6 ]' Z% m9 Z$ Y+ M
  13. .code! U* u0 a; |/ h3 D9 `# C6 M5 h: ?& v
  14. .stack  100h2 S, z% X* @. t! @+ Y5 t  r
  15. .startup$ g8 M" h/ A' i
  16. pusha
      a0 z9 P) G- q. ]5 V' o+ q8 a. s
  17. mov ax, 3533h
    6 V% R8 s- s( M+ m
  18. int 21h" A# i; t$ Q/ B" ?& v
  19. mov word ptr cs:[old331],es- }: Q# f; }  h  S
  20. mov word ptr cs:[old332],bx
    6 b6 d9 N3 d8 w. I+ @4 I4 K
  21. mov ax, 3574h
    / S: k+ ~( t$ N* F; O  o
  22. int 21h& I4 k, _2 d- J5 h; M
  23. mov word ptr cs:[old741],es1 j* y% z: w: f; l4 Y8 E6 g
  24. mov word ptr cs:[old742],bx
    $ C. p  t$ L/ V0 t
  25. popa9 F7 S7 T- @& B+ e- Y! L
  26.         call    memmouse; `2 Y2 z5 ~6 q* h! B5 B  m$ `
  27.         mov ah, 005 u4 g  N8 u; h/ o5 }7 D
  28. mov al, 03( t4 g: j7 n* `. |6 F* J
  29. int 10h
    4 |$ R! o" m% S. V5 x
  30. mov ah, 06/ z% U6 P! K# Y! ~& o6 V0 Z
  31. mov al, 01 @3 _, [+ Q; D
  32. mov cx, 08 ^- U% V" k: p, R: j) v
  33. mov dh, 247 P& x8 W* n- }5 n& e9 f: Q
  34. mov dl, 79, i: |1 }/ b/ N, i5 H
  35. mov bh, 07h1 {" X6 E/ A: n* K
  36. int 10h
    % _3 D) k5 \9 k/ r
  37. mov ax, 0000% {: ]" z/ z5 e  @1 _" m
  38. mov bx, 00022 T9 U' o+ d2 T8 F! ^* a
  39. int 33h
    0 S- C$ l7 A4 ^1 }
  40.         cmp     ax, 0000           ;if no mouse drive install
    5 L7 k! s4 }+ Q* f7 B1 \' c# S7 ^
  41.         je      errormsg           ;show error MSG
    / M2 m- f+ h! C' g
  42. mov ah, 02
    + i) N% v) M: Y) m) t
  43. mov bh, 00' z# S& W2 t3 @8 F6 F# V" n
  44.         mov     dh, 25             ;Move point out screen
    9 z3 Q; c7 i. n8 U4 H6 |
  45. mov dl, 79
    1 V8 l8 B* s$ q$ a
  46. int 10h
    7 N: G' a- R$ ^2 }, H; r) r
  47.         call    showmsg            ;Show info5 }  [% X2 V" H: q9 Q
  48. mov ax, 0001
    4 s* r7 F' o3 T5 l7 [% T# x/ n
  49. int 33h
    2 v  X7 E: e: M( c/ @
  50. ; mov ax, 000ah
    ( |6 f, X+ s" r1 J
  51. ; mov bx, 0000
    # V6 z9 C) h. d5 u) l2 J  D
  52. ; mov cl, 0h
    4 z$ A1 x) t; F& M3 i6 o$ b
  53. ; mov ch, 0F0h
    ; T8 a+ P8 _; ]
  54. ; mov dl, 0h6 Z& T/ p( O- W( ^' N0 P7 _
  55. ; mov dh, 0F0h9 O0 O( W' a+ ^
  56. ; int 33h
    ; Q) P! t4 Z* C3 v4 P
  57. mov ax, 0004h0 {- z" x8 n# G, p' S7 w" y5 U( r
  58. mov cx, 0319" l$ T4 l! e2 s9 {) _6 t5 \9 g
  59. mov dx, 0103
    7 e2 w, m8 U, n( w$ L
  60. int 33h
    9 ^0 O7 G# F' j" R
  61. casemo:                           ;Case button click and point move 9 \7 \+ h' g. j" s# X; K4 v
  62.         mov     ax, 000bh         ;and keyboard press
    . g( e+ V: L/ \, q: e
  63. int 33h# ?+ I9 f1 R. L, `% o
  64.         cmp     cx, 00h           ;if point move....X
    1 G# h* q& a8 x
  65. jne xmov
    ) k+ a* T0 L. E" a% S
  66.         cmp     dx, 00h           ;if point move....Y( Q( ]% I4 ]  s1 v, }& t
  67. jne ymov
    & R$ S4 U  |% N! A/ a
  68. xymovend:                         ;X.Y move end7 C( [' C' Y* w! S0 F
  69.         mov     ax, 0003         
    - _3 Y, r5 w1 c! q8 Y3 g
  70. int 33h& T5 ]0 g" |8 ^( E' {
  71.         cmp     bx, 0001          ;if left button click  show ON
    3 s* X  \, k% X; Q  Y
  72. mov si, 1828
    2 L! @" x0 x3 a9 @) \7 Y' b
  73. je listl2 Q* Q% H& g* V7 Y& b
  74. mov si, 1828
    6 Q9 ], e- v3 q2 P3 y6 ]0 u! W
  75.         jne     nlistl            ;if left no click show OFF$ f/ l- ]  ^% l( N
  76. testr:
    0 c+ s, K$ s/ m# h8 o) k* f
  77.         cmp     bx, 0002          ;if right button click show ON
    ( ?* m9 a) u# c: w8 {$ s
  78. mov si,1842
    ' u. d  s* v2 u
  79. je listr& e1 ~2 [$ }+ `8 g' T/ J) Z* j
  80.         mov     si,1842           ;if right no click show OFF
    ; e- B7 a0 p, J, q0 d
  81. jne nlistl
    8 @! K/ \# Z: _2 E: s, s1 ~( w
  82. casekey:
    1 }. @+ t9 ~: Q% I
  83.         mov     ah, 01            ;if any key press jump check
    ) f2 W" A8 ~4 P4 F! D
  84. int 16h3 P( w3 e3 M' m/ C( O5 Q  X
  85. jne kpress1 ?( F1 f" R( o9 h, D# Q
  86.         mov     al, [chkl]        ;check x flag
    / k# k. V; r: v+ L
  87. cmp al, 02h0 b# x6 b. d8 c  @7 M5 x
  88. jnb chkok0 q: j& F, \6 M$ w( s# W
  89. jmp casemo. t% D: u" z% I! P9 g
  90. xmov:                             ;if X moved, get the X flag+19 G& Y8 }1 x$ r2 q$ B5 A
  91. mov al, [chkl]! ~, Z8 I/ q& H
  92. inc al- C4 e! _! S, B1 b8 \+ B9 G4 ]- Z
  93. mov [chkl], al
    % C6 G( n/ U$ M& K6 z% R6 f  I
  94. call passok7 ]" H! v* \' {, A2 k
  95. jmp xymovend. P& t6 X& q. p2 L  |4 j4 ]/ I
  96. ymov:                             ;if Y moved, get the X flag+15 k2 O/ `% B, ?( `$ v+ ~8 S: T
  97. mov al, [chkr]
    : v* s; p: H2 z- W5 `+ n
  98. inc al6 K4 z9 r# P9 f
  99. mov [chkr], al
    0 H0 T- i1 D- e2 O
  100. call passok
    ' r/ \& W5 t# Q* T% a
  101. jmp xymovend+ B/ o! `, m" T- L" ^0 p* w1 Q# ~
  102. ( N7 ~. k9 u# V. I& c
  103. passok proc near
    3 G8 j9 |0 i' F' K# M* W
  104. mov al, [okcheck]
    4 n. n4 Z4 b3 e. X$ o& v
  105. cmp al, 18 ~2 H; ^6 D8 q- O/ }$ z7 f) f
  106. je let0
    8 z# G! c6 C. Z+ s1 f
  107. jmp passret9 c. E/ h0 ~8 N. S6 q+ y. ^
  108. let0:
    2 f/ K4 E7 B+ l' V( R$ t+ Z9 g
  109. mov [pass], 1; @  z3 i$ f  D  h5 h% V3 |
  110. passret:. }- ~: y+ l: B, ^+ [, P
  111. ret2 h# A8 u0 u  p6 m* m* E5 `
  112. passok endp ' j& d2 G' b2 M0 L. w1 p

  113. 9 |/ P( t$ N: b# C. ~- }1 s
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    # h  g  Z9 o* G: c
  115. mov al, [chkr]+ b5 S6 ]1 D5 s# ?6 ?) m
  116. cmp al, 02h, J, H2 @. d) \' v
  117. jb casemo
    9 @1 S2 v$ W9 m
  118. mov al, [lk]
    ! j% ~8 ]1 {4 R% y- B. c
  119. cmp al, 1
    6 @* R+ L  ?! L) \. b
  120. jne casemo" c2 o2 o& T  o) D& _. j+ a0 N
  121. mov al, [rk]
    $ `7 A, F) H4 ?
  122. cmp al, 1
    : _1 a) v+ s8 l2 |3 ?9 m+ A
  123. jne  casemo; R+ ?# y( ~  U  X# I
  124. mov [okcheck], 1& L- `1 Q& N+ s9 A" A; S, A
  125. mov al, [pass]
    : Q3 h) V# C4 c- o
  126. cmp al, 19 S4 B7 w5 D) J& H/ i$ v
  127. jne  casemo
    ( C# t- [- X, N& I* ~/ x( i
  128. mov ax,0002h4 q' v: |9 L! |  p
  129. int 33h
    5 T$ H0 [3 L5 F- G
  130. call cleascr
    4 D: T7 t' U3 e- e+ P* J

  131. 1 z, M* \' v% a, ~8 q
  132. call oldint6 L" l' b3 ?1 ]0 g. m
  133. mov ax, 04c00h8 o$ U/ {, c- `* N8 ?
  134. int 21h. C$ P" L- k8 [% N* h8 A

  135. # h- c- e+ e; r
  136. okexit:& Q4 U+ Y9 n1 i" @! o
  137. mov ah, 4ch
    " X8 O4 u& c4 r! k% B8 b
  138. mov al, 08 X$ j% j$ O% v( q8 X& A& |
  139. int 21h
    2 ]3 k! d0 ?. c
  140. listl:                                 ;Show ON
    $ ?3 q" `% o  C9 `: z, y
  141. pusha
    - ^2 }8 z# p. B" N* \) [
  142. mov ax, 0b800h5 _2 \8 f" K2 |% Q+ c
  143. mov  es, ax1 ~% _2 X; W, m, [, T9 U
  144. mov ah, 47h& E, B0 V3 F% ?) j
  145. mov al, 20h
    6 Q3 g6 ^  R$ E( [  j3 g# M) u
  146. mov es:[si], ax2 [9 q, J! p$ k  f
  147. add si, 02) g& B  V) L* x. ~' r5 x
  148. mov  al, 4fh
    ' ?9 r' ~7 W% Q+ ]3 P
  149. mov es:[si], ax
    8 Z+ p) g, \$ x2 J
  150. mov al, 4eh
    ( B2 F( C/ E) O* i" o
  151. add si, 02
      x1 m% I. @. v* k+ B: {
  152. mov es:[si], ax
    0 F5 c+ V+ u/ y. m4 p! s7 v. ~4 Q
  153. mov [lk], 1
    1 l* z" w0 R7 X; F
  154. popa7 v& L/ C$ M1 r% z! n$ Z
  155. jmp testr( a3 d- i% ?  K+ I- x
  156. listr:                                 ;Show ON4 V* L. G3 A7 J; X( O
  157. pusha
    3 X% I& R; t1 h# u# U
  158. mov ax, 0b800h( @; g' {7 |9 N' f0 s% W8 ?
  159. mov  es, ax
    - z6 V" x: ]2 ?* Z6 {" z, z5 v
  160. mov ah, 47h
    7 [0 l9 B; a6 C, H' P" b$ K" Y
  161. mov al, 20h
    + Z! V. @& |" h6 i
  162. mov es:[si], ax
    6 H. P% T+ ]: ], I0 G9 Q1 z6 v6 z
  163. add si, 02+ A4 W  r' b9 I1 M0 T( K
  164. mov  al, 4fh
      G, w: @6 I/ L. x
  165. mov es:[si], ax
    + X' s! `+ _/ C
  166. mov al, 4eh( b% v1 h+ k. t4 O7 v7 i+ U
  167. add si, 02
    ! B, U& a) x; z0 Z
  168. mov es:[si], ax
    3 @' c7 j! n" I2 \: J2 P: _
  169. mov [rk], 1
    / l5 M8 E) S2 {+ [
  170. popa
    ' t7 n7 o3 y( p
  171. jmp  casekey2 [# p4 n/ `. Z
  172. 2 s; X8 G9 v7 c
  173. nlistl:                              ;Show OFF
    5 e0 a- s1 P4 u) \
  174. pusha   
    % l) u* d' y+ k( G
  175. mov ax, 0b800h+ M1 `+ }2 \, p8 Q4 M
  176. mov  es, ax* w* F' }& I& \9 l* e
  177. mov ah, 17h
    2 ^3 k7 K' l8 a7 o& \  L
  178. mov al, 4fh
    : {; @) t! l0 N) Z3 `
  179. mov es:[si], ax
    $ ~7 h+ H6 a3 b
  180. add si, 02
    2 r9 R- a) U! _
  181. mov  al, 46h& _; h& \2 j& ^$ O1 I& f  P5 K( X* v3 I
  182. mov es:[si], ax
    ( v; _0 I  z# G$ K" }4 p4 y
  183. mov al, 46h
    5 U7 X* W; T6 Q, K: S6 R
  184. add si, 02  u) V; S0 J5 S! }
  185. mov es:[si], ax
    # X3 @, w+ Q7 M# g8 f; Z1 D& G
  186. popa
    3 f  i( w1 t& x9 B
  187. cmp si, 1840
    4 I: a: N) v# n
  188. jae casekey) c# }* N: k& V4 m+ s5 }
  189. jmp testr
    + A) n# Z$ w7 ^! _9 ?# u  m* D
  190. 8 @* g) Z7 j2 x& @/ @' f, `
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    2 V; H' R( T4 F3 T
  192.         cmp     ah, 01h             ;and return a error
    ) |- g# r9 u9 z2 R
  193. je exit11 A7 A: Q; v5 ~
  194.         mov     ah, 0ch             ;if press other key then clear* _  l2 K2 n' b% c- n/ n8 R' v
  195.         mov     al, 00              ;keyboard buffer
    % {  z8 L7 p. u: D2 c
  196. int 21h
    6 s: F1 N$ b; L# ^- J3 C' }
  197. jmp casemo ( g7 U$ R4 o6 S5 j

  198. . n% l& |* `' z% T: f0 N* u2 e4 `. R
  199. errormsg:                           ;if mouse driver no install
    4 q" }& t5 N8 t  Z& S) o+ i' W# T9 g
  200. call oldint
    / P8 y6 N6 f7 s4 P; V3 f
  201. lea dx, offset emsg
    1 T& ?8 a; }& i5 C) e( M+ W. w
  202. mov ah, 09h% p( S6 X- [# ~- A3 F) F
  203. int 21h
    # r# j% l- y/ m2 i( m0 ^. Q
  204. mov ah, 4ch
    ! L" T/ c: B5 t1 o' M
  205. mov al, 2% z+ I! K" c& k
  206. int  21h4 q! ?2 I3 S" C0 m9 d

  207. : `7 f3 w6 B4 u. \) w
  208. exit1:                              ;error exit
    ' d7 k+ w: D3 z* ^
  209. mov ax, 0002h% q- N8 G; W, y/ s# Q
  210. int 33h
    0 V! G# \8 }) {: ^7 e
  211. call  cleascr' \) q' {  {2 M% ~/ ]
  212. call  oldint! @5 b7 J$ P  _! G+ P0 q7 t7 G1 H
  213. mov ah, 4ch
    2 s: {2 f9 i  F+ t  Y
  214. mov al, 01
    / ]' K% ]6 m5 X' i! u$ s4 k4 T5 m/ q  Z
  215. int 21h! H% g  ~3 h* a/ L% N7 B; m# u) ?

  216. $ i" N1 s6 P  S  O" L; ^4 G
  217. cleascr proc    near                ;clear screen7 T% u' `. v5 n0 W9 s5 Q
  218. pusha$ v# E0 ]. B8 j+ o$ \: r
  219. mov ah, 067 y! ?' E0 p4 h7 S, E) j
  220. mov al, 0# {: N( z8 }3 h- D
  221. mov cx, 0
    * U+ E5 I* ?8 }6 A& w+ x
  222. mov dh, 24
    5 l6 w0 A9 x; T
  223. mov dl, 793 {) `+ x) X, y( y
  224. mov bh, 07h
    & v  c% v3 A1 G3 O
  225. int 10h3 @+ X) K# D: s, k
  226. mov ah, 02
    " [5 {; v5 T  |9 F6 e8 O% [9 h6 b
  227. mov bh, 00: p7 \3 K9 W. P9 M6 w
  228. mov dh, 0
    " d% [" k* w* A- d0 z7 ~' n
  229. mov dl, 01 m- G2 j2 H4 q3 ?
  230. int 10h
      H6 E  [4 o0 \6 v. P
  231. popa: l- D6 h3 N( @3 y; C( b2 D
  232. ret
    ' m( t8 d% ?! I, Q) T7 T
  233. cleascr endp" y0 V2 d' b* ?: D4 T9 r  w
  234. 5 g. T0 P( i$ v8 C1 y+ @0 Y4 I
  235. showmsg proc    near               ;Show info. z" j6 E& {* y. `& I! @
  236. pusha% I  A. U3 F3 ]
  237. lea di, offset showms/ a7 a5 K6 \: B) F) h7 |( ?
  238. mov ax, 0b800h
    , K; p5 R* W! D3 A( R# M, j* n/ L
  239. mov es, ax0 l, ]- W* O' W7 P0 Y( m
  240. mov si, 0/ m8 ^# R) n5 y4 s. `& r* m( |& Y
  241. mov cx, 480
    3 w4 L$ s5 r/ j0 t8 s6 ?: Y
  242. mov ah, 07h, I: A+ Z* X8 u6 t0 T) S0 r
  243. @@:/ x- s% w% y& V8 M
  244. mov al, 20h4 r1 U) E0 ~* y9 w
  245. mov es:[si], ax" a5 ^3 e2 _- ]% a# J
  246. add si, 2) W: S9 ~  N4 i- H% l4 v# n
  247. loop @b+ ^2 j. X" u9 n$ ^, d+ U
  248. mov cx,880& r: s( d" K4 m; b
  249. @@:
    5 u; D4 z; ^6 }6 P, g- y6 U4 H& t+ W% S
  250. mov al, [di]. p( R. Z/ }4 l+ J% `
  251. inc di7 @4 ^* D, Q+ h! x& p6 f- ?. C  |
  252. cmp al,20h
    - d: w; w( U7 t2 f
  253. je showch1
    ! x. s$ t8 \2 {; a. [8 x0 O! x( w
  254. mov ah, 17h
    5 X+ D* x, o7 q% p; d8 Y
  255. jmp showch3 + z- p$ ~9 _6 T3 {8 S
  256. showch1:  ]* ~( C& z" e  _' a
  257. mov ah, 07h 9 I0 E  j% u3 }- T! D
  258. showch3:: n  ~! _4 {( P+ p8 q
  259. mov es:[si], ax+ u: [. [1 `  G$ E5 ]
  260. add si, 2
    , C6 q# i" R- b6 H8 T( @% `
  261. loop @b
    - K/ Z. d' F% @5 h
  262. popa$ E2 q$ Z+ c$ }/ C( K. m  d$ E
  263. ret3 h& h- P: {' q1 ^
  264. showmsg endp! K! ~" [4 h2 `" |$ x3 p. Z4 \4 n
  265. * X! d( _& `5 t  S
  266. oldint proc
    : P, ?& W0 M% ^& ?8 Z& b. ^
  267. pusha% P* T+ L; F2 z5 s: U9 W# P
  268. mov ds, word ptr cs:[old331]
    / b! D- g( I- U
  269. mov   dx, word ptr cs:[old332]' l3 k8 K5 ~* S4 j9 R/ [
  270. mov ax, 2533h, g4 I0 n/ ~# c5 o- [* }
  271. int 21h
    # b& x  T$ C2 h& u7 q
  272. mov ds, word ptr cs:[old741]
    2 o9 n3 I" q. x
  273. mov dx, word ptr cs:[old742]
    $ v8 i) k3 X& F# W
  274. mov ax, 2574h6 T8 I! N& y- e' `
  275. int 21h
    ( q1 U' b2 S& V: Q4 q
  276. popa
    $ P9 z5 ^4 |: y+ g' P; Y
  277. ret
    2 f; x; {: d! W3 ?% U) h$ E
  278. oldint endp
    ) h4 s5 \" c9 b4 @1 O/ [

  279. ' j4 P& p* `; s6 o3 T0 w( b; j
  280. memmouse        proc8 Y( Q" }4 r& `0 Z9 d
  281.         xor     ax,ax
    , ^& j  X& ^" O' \. q
  282. int 33h
    7 B; F( m* z+ b# R9 }! U. A
  283. cmp ax,0ffffh$ F9 x# v, g( R2 L% j
  284.         jne     not_loaded
    : T$ m; S$ Q- E& s+ T
  285. mov [memcopy], 1
    5 ~5 s- `6 {$ o/ y
  286. ret
    $ c9 t: A5 C7 F7 [* K

  287. , b+ t8 f; m  X. y; b( ?
  288. not_loaded:
    8 Q: H& ]3 d, b5 O1 |) v4 x5 h; _& T
  289. ! W, k2 y; b# K. h( c
  290.         mov ax,2574h
    3 O: e! C) R% \$ k; N5 @
  291.         mov dx,offset new_isr
      z0 e/ f. W- a# {7 v
  292.         int 21h: h% q/ X4 T1 B. A9 d

  293. & `5 z" T8 v# z9 @: F7 }! _6 N5 u
  294.         mov ax,2533h
    : B* [2 ~; c9 L$ s2 J! {. g
  295.         mov dx,offset new_33
    0 X8 e1 B1 U. s8 b
  296.         int 21h
    : M$ ^% p  n8 Q; \8 C% [1 u
  297. , v( F; O" s' F- B6 B; D: o; w
  298.         cli* K( O( S- }8 B6 z1 }! b! J+ z

  299. 5 D6 H- f: F3 x  w+ J
  300.         mov bl,0a8h
    ' Q2 x8 O/ U9 Q) w/ I1 Z% O
  301.         call keyboard_cmd
    : ?6 K( S) j6 u$ ^/ O

  302. 5 S# a7 }! x2 `* C) ]5 J3 Z. V
  303.         mov bl,20h+ V0 J$ e! T2 x3 B: `
  304.         call    keyboard_cmd
    9 M- _% b/ d  j* G" C6 b% `
  305.         call    keyboard_read- D* l- ^0 R3 R# n* f2 y; W( R7 \
  306.         or      al,2
    * Z: d/ W: }( z# ~
  307.         mov     bl,60h
    ) J* `) }+ f. c5 p* W  R( H
  308.         push    ax
    % G9 r5 _; ~- j0 r& g+ ^& d
  309.         call    keyboard_cmd
    6 M0 t# U/ i6 x5 e
  310.         pop     ax' q3 B4 s3 W: }2 n3 r4 r
  311.         call    keyboard_write/ q( R  I5 z" e/ |+ Q* P1 L

  312. ! P! O6 E# p5 U5 G8 Z; W
  313.         mov     bl,0d4h
    & f' |1 e3 s9 n; g( ?. e4 Q: j( Y7 m
  314.         call    keyboard_cmd/ I' v. Q: M* b3 I- I) r: |! [1 `
  315.         mov     al,0f4h  D$ C% W$ v4 ^1 A# W
  316.         call    keyboard_write
    % m" J( x# i# K' G" f0 ]

  317. / j# s6 t7 m9 r) c0 `
  318.         sti
    ' ^0 _' x4 x6 s
  319.         ret1 r2 C- ~1 @, J  P! y  h2 n  M
  320. call_user_isr:
    / N* H# ~. g1 {' N. `
  321. db      60h# S* f: h+ {9 ~% n' j
  322.         mov     cx,cs:[pos_x]5 D; g+ u0 V& e3 y$ U/ V5 u4 ?8 ]
  323.         mov     dx,cs:[pos_y]
    # x) s+ O/ c7 D
  324.         mov     di,0 ;cs:[x_move]$ Y5 w% b7 p' C1 u0 Z
  325.         mov     si,0 ;cs:[y_move]% {, @9 E' I" M9 U7 z
  326.         mov     word ptr cs:[x_move],0
    / W. ^7 b" Q; O" r4 W
  327.         mov     word ptr cs:[y_move],0' S( K& d) a6 i6 |1 A$ ~, \
  328.         mov     bl,byte ptr cs:[buttons]
    5 w) H: g) l5 U7 Y# C  o/ `3 |# S
  329.         xor     bh,bh1 r8 j0 o8 ~) M; B
  330.         call    dword ptr cs:[user_subroutine]
    1 Q' |7 I# D5 L, V: b
  331.         db      61h7 ~" Y$ Q' j' a' z* ^& V. E
  332. ret
    3 M% y4 H+ ^5 `2 _! Z
  333. new_isr:
    8 h$ U. S9 B! i& A; j: N% d, d
  334.         pushf
    * v/ X6 p/ Y0 W! t/ y+ C
  335.         cli+ M2 W: U" d6 |5 w
  336.         push    ax
    6 H& e) f8 m0 B! u
  337.         push    bx. p+ ^6 g- \1 W; E4 z5 X# R
  338.         push    cx
    + ?) o6 `, h, F2 v
  339.         push    dx! U( b1 B7 Q  d; P, h; G% Y6 R
  340.         push    di
    8 U. r* L! _5 z6 e, Q
  341.         push    si
    & a0 t2 i: u- W( d/ d& w
  342.         push    es" M" G9 v& e% U% L9 @0 I
  343.         push    ds
    / g1 ]5 N2 [  t" O
  344. 6 [& O0 b5 F% t5 N' Y
  345.         push    cs
    ! ~# ~# _$ ~/ {% y/ `
  346.         pop     ds
    0 Z1 j* }2 u3 K3 z, z

  347. , w6 _+ w( B4 ]7 l$ C, Y
  348.         mov     bl,0adh
    9 G! E$ ~; \$ ^) Y& \( o
  349.         call    keyboard_cmd. x$ s4 G* O" s
  350. . E2 u1 f0 D5 D6 f1 ]& i; ?
  351.         cmp     byte ptr [first_time],0
    + C' p- V6 k! i# E9 F& q) {! \
  352.         je      not_first_time) b$ T) v& N# ^$ ]9 g

  353. : P, O4 o6 k5 J: @
  354.         mov     byte ptr [first_time],0+ m2 [3 h% X$ W
  355.         call    keyboard_read
    ! W, [+ ~: u" t$ `2 F8 w
  356.         call    keyboard_read9 H4 F( a" Y* Y, m! O6 x
  357.         call    keyboard_read/ a, N/ t: U- |! I# d7 W8 g( g, Z
  358.         jmp     no_show
    * z; ~3 h' D5 F8 K, T/ l
  359. ; P, q  \8 ^  v3 L3 r& p9 O* j
  360. not_first_time:) ]) I7 W, W" J4 ]  ~3 p% h
  361.         mov     word ptr [temp_mask],0
    8 I# A/ h8 x# @5 F& L+ q
  362. ' Z, j: M6 R5 l/ ]3 ^  Y. T
  363.         mov     cx,[pos_x]3 _3 [" [% {$ \$ Y
  364.         mov     dx,[pos_y]  F7 y7 r/ B/ t7 U, h( L  |( `6 L

  365. - `4 v1 u5 w2 x4 [, Z9 t
  366.         call    keyboard_read
    - X* f2 L+ S7 N, V* o
  367.         and     al,7 ;3: E8 P6 m, a+ V1 e& S$ O0 x" ^
  368.         mov     ah,[buttons]
    4 G" B4 D! p% N. U
  369.         mov     [buttons],al8 b3 ^6 `. o$ |3 S7 r: x$ ^  x
  370.         cmp     al,ah
    & c/ n: }% l# e8 X, V0 U  T+ |
  371.         je      no_button_change
    3 @( m: U! m! C/ ^
  372.         and     al,3
      W$ O$ w5 V: `! V% m( C
  373.         and     ah,3+ C# K1 F1 j+ j- n) Q+ r
  374.         xor     al,ah
    9 H5 h1 b/ o- [/ z' n: `
  375.         xor     bx,bx
    ' N% m  V% |% q; u+ f

  376. 7 F/ K( C8 [& L" X/ o" h  g
  377.         push    ax: p$ Q: j$ T9 v' g1 Z
  378.         test    al,2
    ( l/ _9 Y, {5 d: [5 K8 b0 |
  379.         jz      no_right_button_change
    3 u  w5 L9 b( h/ ?
  380.         and     ah,2" ^0 j$ L6 S, G( A
  381.         jz      right_button_pressed, Z+ N3 ^* v  \) @# `- k- b
  382.         or      bx,16: ~- p: e* n# U  c3 @
  383.         jmp     no_right_button_change
    $ n8 z0 N) k! B1 \& h9 d
  384. right_button_pressed:1 d* x6 `; l7 J% M$ @7 l! t
  385.         or      bx,8
    0 G1 ^  E6 \3 A0 N) ?: v  r
  386. no_right_button_change:
    : O8 x* ^, X1 B2 N  g

  387. 0 s3 U- i5 [5 y% T- H! X
  388.         pop     ax6 l% r4 o; s6 ^

  389. 6 o: J# y) X+ ~* _$ J
  390.         test    al,1
    ) k" K' }$ V, \: Z
  391.         jz      no_left_button_change9 c$ @' e: H3 k  I$ u% H
  392.         and     ah,1
    $ D6 _0 E# X: H
  393.         jz      left_button_pressed
    2 E. X/ `) N% D: |* T# N
  394.         or      bx,4
    ; A  B8 I7 i1 `
  395.         jmp     no_left_button_change- F: h: [9 l! S7 I
  396. left_button_pressed:: B& ]0 u6 J3 O3 n: F5 O( m5 p
  397.         or      bx,2
    " a" L- q4 T2 H3 Z: |
  398. no_left_button_change:0 \. U" Z1 y* w6 K4 }
  399. ; T9 @& j. N$ {+ c; l
  400.         mov     [temp_mask],bx
    " Q% J- ]1 E, y3 a4 [) F$ B9 C
  401. 0 I) e& v: M4 z8 M
  402. no_button_change:8 u4 E; f* v( ^1 _1 q4 ~
  403.         call    keyboard_read
    2 V3 V1 S3 |- T8 T0 {7 y
  404.         cbw& m5 ]! ^+ O. S8 l3 C" J
  405.         add     [pos_x],ax
    % X9 N8 N: R9 ]/ @# o
  406.         add     [x_move],ax
    / y4 n! S. U% q8 M; b! i, z
  407.         mov     ax,[x_min]
    ' _$ J8 S' B+ S
  408.         cmp     [pos_x],ax) G" ^$ ]! |& @) x1 z) b  M% }3 L
  409.         jg      good_hor1
    ' k- m) L8 c/ R2 x; t1 Q6 P
  410.         mov     [pos_x],ax
    " y. L( p! H- X6 O, P' I
  411. good_hor1:
    6 K3 O  x3 [6 k
  412.         mov     ax,[x_max]
    + A0 q0 I# r8 S* B& V
  413.         cmp     [pos_x],ax
    ; f1 ]& k  _  t5 w/ q3 n7 r+ D/ b; _% f
  414.         jle     good_hor2: G9 I6 G0 [# R1 q1 o6 G
  415.         mov     [pos_x],ax
    1 Y4 W# }; a5 X3 {: c4 s/ O
  416. good_hor2:$ e, \) Y* u. O2 v, Y, h; E4 Q) L

  417. 0 D" N" i6 t% F4 W
  418.         call    keyboard_read
    : q  M5 v. m- a  J3 `2 W5 v8 w
  419.         neg     al
    1 J0 q7 E: @0 K- Z. j- G; M6 m8 U& H; e
  420.         cbw
    0 F$ v' m; U% N$ z; `% s, o
  421.         add     [pos_y],ax
    " s) \* N. m' `0 v9 j- I) A4 H$ x
  422.         add     [y_move],ax8 L3 P! q' b$ ]; H: D+ A4 T
  423.         mov     ax,[y_min]# s. i5 F& L0 Q+ X3 a
  424.         cmp     [pos_y],ax& u/ k9 k: [" S) _
  425.         jg      good_ver1
    7 a  M- O$ ^2 q; r' a. N0 o
  426.         mov     [pos_y],ax& L; J. ^% K4 E2 K  U7 |; U
  427. good_ver1:
    8 a1 `7 U1 I( J& p. T, I
  428.         mov     ax,[y_max]
    + p2 k4 S' l$ ?! C+ T
  429.         cmp     [pos_y],ax
    & T  a# b. y, t3 N6 X) ^* s* j9 b+ L
  430.         jle     good_ver2: ?9 s" L, Z/ x% E+ l) s
  431.         mov     [pos_y],ax
    9 h' R' C6 T1 U" e# M/ x, t$ p
  432. good_ver2:
    ) |: k; D9 N$ e" x) l
  433. : E: E8 U5 ^" f" h! U
  434.         mov     ax,[x_move]5 @+ j$ E8 S. V/ O7 e0 v5 e; a3 b1 {6 q
  435.         or      ax,[y_move]
    . v$ [: U. P3 j% ?( ^" }& h' Z
  436.         or      ax,ax
    1 l+ I- U* C5 J' l$ s) z
  437.         jz      no_change_position; d( i* \( u8 a7 J$ f
  438.         or      word ptr [temp_mask],1
    0 M7 L! }7 W+ T% A; G. g& |: J
  439. no_change_position:
    6 C9 X- o& T* @0 p  v" I

  440. % y  E2 u' ~" T9 ~6 M* s% y2 C
  441.         mov     ax,[temp_mask]
    . M( Z$ t, l" d4 k  P6 ?$ D
  442.         and     ax,[user_mask]
    , G0 D9 w, X9 p' @/ S# H/ ?
  443.         jz      no_call_user
    : h. a  B; B9 N# O( a( i
  444.         call    call_user_isr
    2 ~: P9 W0 S# G
  445. no_call_user:' F3 g" t: m8 O

  446. * R& I2 l7 F- P8 P. a
  447.         cmp     byte ptr [sm_flag],19 F' a6 R# g& R1 p; T" i
  448.         jne     no_show
    8 i+ C3 q3 K$ @' R, T# {

  449. / f$ @2 c, _% _7 P% p* k, p& d* P
  450.         shr     cx,3
    ' `' Y$ I3 @. {5 m# N0 M" p
  451.         shr     dx,3) b& ~- t3 U$ W1 i. F. L- G
  452.         mov     ax,80
    9 H% j* ?6 z  O, i
  453.         mul     dl
    8 ~2 |; b' [' G4 _) X0 ^
  454.         add     ax,cx
    ' t2 |( L4 A. q0 d
  455.         shl     ax,1
    4 v; E: N5 ?$ K6 f5 @1 A
  456.         mov     di,ax
    % [# |( o9 b7 _2 t
  457.         mov     ax,0b800h+ L; Z- k6 F2 t: s% y+ ]* x( q2 v
  458.         mov     es,ax0 ]& Y9 }- M0 H: ^
  459.         mov     ax,[save_char]% {" J$ ^/ z( ], ~1 \2 `8 q
  460.         stosw% X6 g$ r* F& g8 ^2 F
  461. ; {" Q0 C& J1 _: K
  462.         mov     cx,[pos_x]8 c7 Y/ H! C% g/ y1 {* y
  463.         mov     dx,[pos_y], t7 a, R1 U8 t' A
  464.         shr     cx,3
    0 P, K1 D- C: `! [! d3 v: _  B8 v
  465.         shr     dx,3
    $ Z; ?: f7 f" G$ `( t$ Y
  466.         mov     ax,80
    3 O7 P# G" E+ R- S3 s( i' y
  467.         mul     dl
    ( W. I/ O9 T; _9 w- l
  468.         add     ax,cx
    0 u! x" R$ n. `
  469.         shl     ax,1& Z& o! g# D5 s6 @, ?! f7 j
  470.         mov     di,ax/ Z2 O' r4 V/ z2 R) A  m) j5 \
  471.         mov     ax,0b800h2 I( X' d( k9 m& T7 @
  472.         mov     es,ax
    ' D& r/ N* P$ H" K
  473.         mov     ax,es:[di]
      m8 N' X' O2 \+ k# N  T3 j
  474.         mov     [save_char],ax
    " X5 f  o; o- O" Y$ n
  475.         not     ah
    5 [5 q3 \1 O; ^
  476.         and     ah,7fh
    8 O/ X) N; `: E) [2 O$ s* R& q% `
  477.         stosw  J$ y. g3 \( l1 {4 [
  478. no_show:
    ( L  H8 H4 s: S1 r4 W
  479.         mov     bl,0aeh/ S+ P. U0 a! h
  480.         call    keyboard_cmd3 J; ]! j: r, u, s2 i" a

  481. * w8 k( R  m* O2 {( B
  482.         mov     al,20h* K6 p" w$ E: E# O
  483.         out     0a0h,al
    ; @$ `% P* }' {) @* h* s
  484.         out     20h,al
    % M  Z0 t4 T' A
  485. 9 X: v8 M, C* X$ L
  486.         pop     ds1 ^9 O% \4 ?1 T! e# ~
  487.         pop     es
    0 n7 C2 x8 k7 S/ |; c
  488.         pop     si
    : {9 _& K) G# J# T! a( C: R9 g
  489.         pop     di
    0 Y0 a) Q4 k  C3 A4 [
  490.         pop     dx
    6 r% ^1 T1 o/ E& S) N; w6 I
  491.         pop     cx: _! z0 N1 v0 Z/ z; ]2 g
  492.         pop     bx& I8 v6 O/ K, }7 F8 C7 N9 R
  493.         pop     ax
      R1 K  x; ^" ^. ^+ |- i8 E
  494.         popf
    : v. z; H- ]7 [' Z+ h
  495.         iret8 a  F7 {. `' R' s$ u
  496. + z5 M2 E, ?. K0 E' d$ T
  497. first_time      db      1( k" r7 a0 ]4 _, F  I
  498. buttons         db      0
      I, x. t& I9 W3 Z0 r
  499. pos_x           dw      0
    & s; ]9 K& C2 G+ S9 T1 C, i: M
  500. pos_y           dw      0: @5 a5 ^6 N, k0 M, d0 k) V
  501. sm_flag         dw      03 c7 b' R1 C1 e) ?
  502. save_char       dw      0
    ) v- k8 h% c( v+ N( U6 }; Q/ V5 [0 k
  503. x_move          dw      02 k! H+ e/ g/ N& g% q: r5 f# }" U
  504. y_move          dw      0( j5 e7 V; {% R: d
  505. x_max           dw      639
    ! w) y. U, O* |  H. D' h% S
  506. x_min           dw      0
    ( V3 @9 [; I8 W& B* d
  507. y_max           dw      199
    . P' _4 h3 p+ i+ Y' y$ b- k0 |; R" u
  508. y_min           dw      0
    6 }6 S: Q, c. P+ m3 A
  509. user_subroutine dw      0,0* ], A9 ^. {/ C' G+ Z
  510. user_mask       dw      0
    , \1 i$ J- `4 Z$ `) f; S
  511. temp_mask       dw      0
    ! Q6 s2 S9 x" \6 c* C

  512. 8 d. d6 `6 z' d, p2 P- d, Y) r5 x
  513. keyboard_read:
    ! {! W' Q2 p/ d. F8 ~& G. w
  514.         push    cx! w3 T7 g8 V9 `$ y. k5 D, S+ W
  515.         push    dx  m* |# O9 d. ]
  516.         xor     cx,cx: E( f) L3 ^8 `! J0 ?" |
  517. key_read_loop:
    6 E7 a# i9 x" Y' H: ?
  518.         in      al,64h+ a( T1 @! O& f2 Q) v
  519.         jmp     $+2
    2 l. V: W) c9 O: ]
  520.         jmp     $+2
    1 p5 o% c6 B% K4 l% g* F
  521.         test    al,1
    ) X  j, @2 l$ V* O2 C* a6 c- w* U
  522.         jnz     key_read_ready
    % W) T+ s' b* _2 p
  523.         loop    key_read_loop( U4 C% e  s& d* _0 f2 o" H9 b3 c
  524.         mov     ah,1
    8 e+ Z1 Z; Q1 f6 w
  525.         jmp     key_read_exit7 W6 `& m4 ?. M. {, H: u" k9 O
  526. key_read_ready:8 @5 \' Q! y# H0 I0 E1 ]
  527.         push    cx' D: v2 c3 X. k2 n
  528.         mov     cx,32& T# d4 C  J0 m
  529. key_read_delay:( j+ H6 l* F. f
  530.         jmp     $+2) z0 t8 V+ Y" e" R9 R1 T0 R
  531.         jmp     $+2
    - Y$ v; c' c" D/ j2 I: M' v! z
  532.         loop    key_read_delay; {9 m1 i; j9 s& ]
  533. , I- W: c8 g5 f$ @' y
  534.         pop     cx
    9 m! V* X, d* T' ^2 y( v6 q* _
  535. 3 f2 d5 `1 c/ |
  536.         in      al,60h
    & l9 b& V, O5 S( k1 [# P
  537.         jmp     $+2
    4 y6 f9 W: [3 M, a1 G4 {
  538.         jmp     $+2
    7 w* @( t5 n& X$ H3 n# O
  539.         xor     ah,ah
    ; y% b$ K! ^. }; M! i
  540. key_read_exit:4 a% [$ p8 P+ p- q! A* I3 v
  541.         pop     dx
    - Z! C9 _2 g) o- ]/ e0 ?
  542.         pop     cx
    4 i$ c; v+ ^5 F2 J! s6 K% H
  543.         ret
    3 e% S* x% ]& Q

  544. ' I1 r) j9 C+ E1 B2 \+ A
  545. keyboard_write:- s# w$ U* ]7 Z+ J: V: S
  546.         push    cx
    % m& |8 t' k0 [9 b7 e% a2 v
  547.         push    dx
    6 ]; a. Z* i% U- I
  548.         mov     dl,al9 s! \& Q; Z2 ]0 t
  549.         xor     cx,cx5 v' o) }- k2 m
  550. kbd_wrt_loop1:% c: [0 F6 n1 l$ s$ |. q
  551.         in      al,64h
    2 x- ]" q( {" J" D5 R  O5 R; ?
  552.         jmp     $+2
    9 ]# B% }3 L! x+ u$ G1 E' m
  553.         jmp     $+23 G; j& q! H$ g0 l5 T, n" a
  554.         test    al,20h
    3 q/ }$ f0 b: J/ a. ~
  555.         jz      kbd_wrt_ok15 K/ K" ?% n( o

  556. # @4 r) H' a+ d7 T
  557.         loop    kbd_wrt_loop19 i2 X" s( e; w# k' G! v! U
  558. * L9 g, S# c' P8 n/ B
  559.         mov     ah,1$ i5 P! j  ]; v0 }# ?
  560.         jmp     kbd_wrt_exit4 k: Y2 d% ?% `. Y& Y+ w% D2 l
  561. / Q, c- h3 H3 \8 r/ d
  562. kbd_wrt_ok1:
    1 U# e4 w8 [' P- V8 v
  563.         in      al,60h$ J, i" h6 B4 d3 y& X
  564. / H# ]' ?4 p. B. c8 r$ T' _
  565.         xor     cx,cx8 c$ b8 u$ D, ?+ ?2 o
  566. kbd_wrt_loop:/ y" i/ Q/ |+ M& ^
  567.         in      al,64h6 y$ p/ t! [( B9 u/ O" K
  568.         jmp     $+2
    + C. D) s! m" r' @
  569.         jmp     $+2" s4 O- D( c2 @, P) e
  570.         test    al,2; b% D/ C- ]* y, x+ d
  571.         jz      kbd_wrt_ok
    : k3 `/ s( j8 A% j# x' K6 ?. }) ~4 h

  572. 7 Y  S) {' V, f8 C$ H$ @4 K1 I
  573.         loop    kbd_wrt_loop' q" k8 y" h3 i

  574. + E! {& E4 E  y7 V+ b" w
  575.         mov     ah,1
    & h( \1 o) }8 X) Z
  576.         jmp     kbd_wrt_exit
    $ t+ z+ y+ O7 k/ j: X4 P- ?$ Y% g

  577. # D) ^  R' V7 s8 t0 M+ x
  578. kbd_wrt_ok:! C$ g2 j) N+ t1 O8 D: C
  579.         mov     al,dl
    ! R8 i! P' k! B
  580.         out     60h,al
    4 l2 B! b) B8 u8 B! ^: S
  581.         jmp     $+2
      S, T' Y' J6 Z' P" Z& B9 R
  582.         jmp     $+2
    $ B) W; E/ l* D9 d* w% a4 u) b

  583. 3 J) W) v" e3 A5 I' p: ]. j
  584.         xor     cx,cx8 y( i8 r; \) h6 O& M- M
  585. kbd_wrt_loop3:
      s! D3 ~  @% M1 |' f3 l) a
  586.         in      al,64h
    $ Q5 N. l  @, ~! m6 e4 d
  587.         jmp     $+2& \; F$ {# _* H/ g* M) b: r+ T$ ?
  588.         jmp     $+2
    ( @5 w3 A+ @) H2 K# C/ Z! K0 y) k; i% Z
  589.         test    al,2
    & l. n( y  O3 `( B( N! @; f8 Y
  590.         jz      kbd_wrt_ok3
    7 x* @, `  R5 ^# q% e

  591. 7 o. S: V8 X5 m  H1 b
  592.         loop    kbd_wrt_loop3
    8 v* z. `2 S1 z; w# G

  593. 2 Z! M, v5 e* H  W- x5 k9 t$ g( F
  594.         mov     ah,11 }6 y" j+ {6 `; f  e
  595.         jmp     kbd_wrt_exit4 D1 `2 |# p  y2 B; a

  596. * L; {- i/ C* {' b, r
  597. kbd_wrt_ok3:" i1 v4 ]3 E6 F1 P
  598.         mov     ah,8) \1 }/ ~- Q2 T6 X7 m0 t
  599. kbd_wrt_loop4:6 L0 P7 S1 z) h: q
  600.         xor     cx,cx
    . ?7 q3 v( L4 ?$ \# v& p
  601. kbd_wrt_loop5:
    1 _# A+ p, M- P* [1 }
  602.         in      al,64h
    9 `  A. k9 d# }: M7 f$ _/ M
  603.         jmp     $+2! T# S3 I; z9 i9 J8 P8 R. N+ m
  604.         jmp     $+2
    + @$ L4 ?* `  A; {- ]
  605.         test    al,1+ d% k( U' }7 R; H: r
  606.         jnz     kbd_wrt_ok48 L- V$ B: [4 F

  607. 3 \) x  E2 s) y8 r
  608.         loop    kbd_wrt_loop5
    ' M+ X# L0 ~( r, R0 v9 \" N
  609. / W2 h- e4 B( K) E
  610.         dec     ah- T2 ?% G0 [3 O% i
  611.         jnz     kbd_wrt_loop47 A, N6 F4 N- R! \6 h0 E

  612. ' _' G* f% ?2 i5 w7 p+ w( E" p' {0 }
  613. kbd_wrt_ok4:
    7 d  {$ b3 |# b3 ?5 V6 p
  614.         xor     ah,ah
    6 h( g! e9 S: N; s( R1 u  a! o
  615. kbd_wrt_exit:' ^! {2 ]: p* `! ?- y
  616.         pop     dx% {. v3 k7 y+ e  \: a8 P0 i# D
  617.         pop     cx9 c. ?% Z# i1 {& C% S% P% S: A0 K' U
  618.         ret
    * a5 M5 ?* E1 J7 X, i' Y
  619.         6 r0 [7 T( Y$ Z6 s; d; `
  620. keyboard_cmd:3 O& h; V7 |0 C- B, A5 C
  621.         xor     cx,cx- S2 N; r- C$ b
  622. cmd_wait:
    ) Q6 B/ e  K! _# c' `( V. f! [
  623.         in      al,64h
    # q  {3 Y- K- {% O2 Y: I( C
  624.         jmp     $+2! A# o2 a! c1 x( T
  625.         jmp     $+2
    2 D4 @7 m4 |9 o$ F, \
  626.         test    al,2
    ! ^& k, R: `" R3 [7 ^
  627.         jz      cmd_send, P% q2 o2 F. m( n
  628.         loop    cmd_wait# E* P) L/ V& P2 N

  629. 4 J( E" ], q5 G1 p
  630.         jmp     cmd_error! q! o5 M" q7 O& |
  631. - A+ D. ~% `, Y! O: s
  632. cmd_send:$ n$ @6 y) j' M& V& q8 s, p1 s4 \
  633.         mov     al,bl
    $ a, z( y4 }( f
  634.         out     64h,al5 J1 S) i9 {: v) d: ?
  635.         jmp     $+2
      ?1 y7 z1 ~+ D; I3 \/ F3 r
  636.         jmp     $+2
    - I9 p; ~( L  P, {; A  q- H: f
  637.   S" c% }  ?5 \* Z
  638.         xor     cx,cx
    ! y2 k% b4 G, a9 r. R
  639. cmd_accept:2 Z1 Y1 Y5 p+ w  D8 O/ y
  640.         in      al,64h
    4 B# I. t; K4 W' b$ g! W% q
  641.         jmp     $+21 `; R& q, r. \0 f; I0 S
  642.         jmp     $+2
    9 M& k; E5 c! C2 O7 J7 |, v" ~
  643.         test    al,2
    & ^2 b6 U6 k5 }, J7 Z
  644.         jz      cmd_ok/ s7 J4 q& @: ?5 F9 ?
  645.         loop    cmd_accept
    ! p$ }1 ^% y+ V' r) Y

  646. . I- g( v* D  f4 W7 Y
  647. cmd_error:
    - s. [. c: ]4 }. @' @2 P2 e
  648.         mov     ah,1. R6 }# K  }1 F/ O) T8 W4 w9 z
  649.         jmp     cmd_exit. ~8 x. T* j1 v3 J0 y  V
  650. cmd_ok:
    % u& e7 M( n3 N
  651.         xor     ah,ah
    0 G9 `3 Y8 q* x# Y  A/ A4 [
  652. cmd_exit:4 u4 [, d& `6 U/ q# M
  653.         ret
    5 _1 e. Z" ?) ?5 W

  654. ) u8 Y. b& g. D2 x9 p8 p
  655. new_33:
    0 i5 @  @2 r- v! Y) j4 s7 l
  656.         cli. p  B/ Z" Q/ `1 c3 p/ P. r
  657.         cmp     al,0" M# S$ w1 ^: P9 h2 l* v( y' X4 y
  658.         je      reset_mouse- r* W5 Y0 {) ?9 |4 \! j. w
  659.         cmp     al,1
    $ U) ]% l) }" c) r% W0 B" o8 O
  660.         je      show_mouse
    , F5 W! w7 [; \" n) [& c# W- ?2 Q
  661.         cmp     al,29 c' a' q( J; j8 |9 Y$ O: `
  662.         je      hide_mouse
    ) q( h3 ^# E  J, [0 t$ Z9 Y
  663.         cmp     al,3
    2 Z5 c6 i0 w& i5 l! `; y; ]
  664.         je      get_pos
    + |: w" i9 H2 h# v
  665.         cmp     al,46 V6 U; s+ O. e. H* `! c& c
  666.         je      set_pos0 A/ o+ }% F( u# N& L
  667.         cmp     al,72 B8 }7 S* Q; q. ?( C- ^$ u7 w9 B
  668.         je      set_hor_pos
    ) K2 c3 j- }9 j4 s
  669.         cmp     al,8/ }1 ]* e3 j/ J& W& [( U& K6 |
  670.         je      set_ver_pos5 z, x' |4 y0 j9 c8 n
  671.         cmp     al,0bh
    8 _0 g( [6 Q) G3 V, I2 X
  672.         je      get_mouse_movement
    % c' B0 p" r* F. P9 H- Q* q
  673.         cmp     al,0ch
    6 n/ H# @+ {% v; D2 o$ p2 T( H; ~
  674.         je      set_subroutines" m* y: {1 {+ D  D/ K; o
  675.         cmp     al,14h/ t2 v4 H- y( {4 ?
  676.         je      swap_subroutines% y( L8 U) V, e' X3 u& p, _  p( ]
  677.         iret9 L+ g) T5 w  \# P8 i9 T

  678. 5 @. u5 F2 W' k
  679. reset_mouse:
    1 S: E% X! y7 @% R/ B) x
  680.         jmp     _reset_mouse% ?8 z4 [/ O- v$ F5 E$ z
  681. show_mouse:
    9 i1 c. E3 T: e" k* q
  682.         jmp     _show_mouse
    5 d: G& F( D& G, o2 o
  683. hide_mouse:
    , K9 F% A0 c0 x! l
  684.         jmp     _hide_mouse
    $ L( t! n# y. j/ y' j% C8 R$ m
  685. get_pos:
    ! M' F; H. ^/ n+ ^7 Q- V7 j
  686.         jmp     _get_pos0 l8 `2 Z1 c/ [! X
  687. set_pos:
    : u$ C) `. z/ E9 k" s0 O/ F
  688.         jmp     _set_pos9 u- R: W/ o" t- A. S
  689. set_hor_pos:/ y% {) G( l8 `; Q. B. j3 a
  690.         jmp     _set_hor_pos
    2 i% W: x( m3 o( L" v
  691. set_ver_pos:  V. y/ C5 j9 {/ C/ d. }# O
  692.         jmp     _set_ver_pos8 {! _& Q4 s: O) {- h2 H2 L& c; j% {* p
  693. get_mouse_movement:. I1 b1 x& F) k! l! ~7 s7 `
  694.         jmp     _get_mouse_movement; [8 A  a  p  s6 S, |
  695. set_subroutines:3 p) R: C8 @" s; W  T
  696.         jmp     _set_subroutines; p) j, e" P/ C
  697. swap_subroutines:/ E1 |- l0 w$ d% D: d5 A% ^
  698.         jmp     _swap_subroutines
    ' }" x- p# v% g0 ^7 b
  699. 3 j* \+ ]$ f6 e: S$ u/ \7 b/ n5 c
  700. _reset_mouse:- ~! P. y# b( r! r& l& o4 v
  701.         mov     byte ptr cs:[buttons],06 i8 Q+ r3 z9 {0 G7 M
  702.         mov     word ptr cs:[pos_x],0: |8 s! `& ]6 P+ Z
  703.         mov     word ptr cs:[pos_y],0
    . k: B4 B, H) e' O
  704.         mov     word ptr cs:[x_move],0" ^/ N6 o8 w4 }/ r# J1 G1 F
  705.         mov     word ptr cs:[y_move],0
    8 f' Y" `; H0 [( Y
  706.         mov     word ptr cs:[x_max],639! l( r( |. |$ C2 ^& O$ j8 }7 C: n
  707.         mov     word ptr cs:[x_min],06 q8 g7 m1 D1 f1 F
  708.         mov     word ptr cs:[y_max],199
    : Q  P) D' D2 o# O4 J9 P
  709.         mov     word ptr cs:[y_min],0# _, R5 M/ u: x' n1 _7 F, p7 u" C: |
  710.         mov     word ptr cs:[user_mask],0
    3 m) M' w) Z# w$ [" J0 ^
  711.         mov     word ptr cs:[user_subroutine],0; L" K9 z  E8 J! q9 S
  712.         mov     word ptr cs:[user_subroutine+2],0
    / T4 }3 c( J5 }% e
  713.         mov     ax,0ffffh
    - A+ v! @4 W2 v. M& u
  714.         mov     bx,3
    - j( Q$ `1 _  P0 O. h+ e$ x8 v
  715.         iret
    4 E# _; L6 `4 L8 e
  716. ) S5 k2 c1 L/ r" i$ o
  717. _get_pos:
    / Z/ n4 T3 X2 @  M! }6 X
  718.         mov     cx,cs:[pos_x]
    $ A, e  @7 w/ j, p
  719.         mov     dx,cs:[pos_y]
    : z! ^! j3 E/ H( P7 C
  720.         mov     bx,word ptr cs:[buttons]
    % j' F1 Z7 O$ |8 m1 J- @$ Z
  721.         xor     bh,bh
    1 e5 M, E. b) g: Y9 n" q" F
  722.         iret( O; X7 m' O# [' f( {4 F; \; X3 P

  723. 0 F4 u1 Z, w1 i* T: ~8 C) ?
  724. _get_mouse_movement:4 {0 _% [; K, p- i
  725.         mov     cx,cs:[x_move]
    ' P8 X7 W" O* ?
  726.         mov     dx,cs:[y_move]3 i/ O" C# o; h
  727.         mov     word ptr cs:[x_move],03 G( X% D4 G$ |. L: h
  728.         mov     word ptr cs:[y_move],0
    $ }) ?% U% A! Q: y
  729.         iret) _# G6 A3 K; j; [9 k* @2 b" h

  730. . z9 ~  V; w: m% S- |$ t3 x( C, |, }% Y
  731. _show_mouse:
    * I6 Y' y( |5 g) e2 o, a2 W/ b* p6 f% s
  732.         push    ax
    6 M; d. [# j7 \  g4 E& G
  733.         push    bx* L4 C- v4 a# v9 E! R( `
  734.         push    di
    ) w' ~3 F& z" a# c. C3 b: _
  735.         push    es) y; r0 P7 J+ Y) w, I/ }' o. K! j& O
  736.         mov     byte ptr cs:[sm_flag],1
    8 F+ P$ R/ k" M, G3 Y/ ]
  737.         mov     ax,cs:[pos_y]
    + @# o; D7 h- ]) ^7 z, r! l
  738.         shr     ax,34 t0 ?# J) o: T8 i) s
  739.         mov     bl,80
    ) l0 P( P: H  U) j. E2 v5 a
  740.         mul     bl
    8 z; ~# v8 h  g6 o; A' c/ V* C
  741.         mov     bx,[pos_x]6 P* B2 W( J9 p/ j1 D3 v0 o( j% I6 E
  742.         shr     bx,3+ |7 h: J/ z- J  c- P
  743.         add     ax,bx
    - d7 W. G* ]4 ]4 n; o
  744.         shl     ax,1- v3 s. {! m0 y: I2 t( t! g1 G
  745.         mov     di,ax6 t( Q" [5 a2 \, z  ?
  746.         mov     ax,0b800h
    , O; X( w! H/ o
  747.         mov     es,ax
      A0 g( p; B5 U' _
  748.         mov     ax,es:[di]- H+ k  D/ I( Y! a
  749.         mov     cs:[save_char],ax5 _+ f% f* _& c
  750.         not     ah# ~% c0 v! }; `- Q9 j
  751.         and     ah,7fh. r) k) v) C7 t' Q( S$ L# w
  752.         mov     es:[di],ax
    . x  F. W5 e& u
  753.         pop     es
    ! M) T2 U/ M9 Q+ z* u" j+ U3 X
  754.         pop     di
    6 X! i$ E# q+ q2 F5 q: s' ?8 f" ]
  755.         pop     bx  U9 `; E" l$ T/ [
  756.         pop     ax8 x4 T5 N; c. V) w$ _
  757.         iret
    . \4 c5 r  c, A& S
  758. 1 Q" {/ i' P4 K( }! S; ?  t9 i
  759. _hide_mouse:4 ~; V5 L# F) z* U4 P% d
  760.         push    ax
    : A" G  D5 x7 M4 J) @. ~# @" @1 A
  761.         push    bx
    % f4 o- u; Z; l0 I2 }$ r! O1 P
  762.         push    di
    6 k/ L9 }: g& N0 Y
  763.         push    es
    7 Y$ _5 O' A, R3 J6 q0 f
  764.         mov     byte ptr cs:[sm_flag],0+ u# g) H1 M2 {' n* Z
  765.         mov     ax,cs:[pos_y]
    ! _0 J& E1 Q9 D- \1 r- F
  766.         shr     ax,3
    2 x4 j$ }5 M' D  u/ o5 T
  767.         mov     bl,80
    - ?7 F2 L) }( J) E
  768.         mul     bl$ Y: U2 X% m3 ]7 v9 }* n
  769.         mov     bx,[pos_x]
    / ^! Q( j# {* [6 O% t( y
  770.         shr     bx,3
    5 T- o0 U$ ?8 h! d) W9 i
  771.         add     ax,bx
    + _; y3 K) U9 @2 K( k
  772.         shl     ax,1
    . k) e  H) ^9 P. T( v
  773.         mov     di,ax6 w% v/ O5 l! g+ o
  774.         mov     ax,0b800h% c. W" G7 w: O0 D/ @
  775.         mov     es,ax
    & ~  F3 x9 ?( L7 |  D6 h* N  H
  776.         mov     ax,cs:[save_char]
    % G. |: E8 O8 d& y  x
  777.         mov     es:[di],ax8 N6 \& {( U7 N& V; u1 ~  v6 l
  778.         pop     es
    $ {8 ]0 d2 ]6 p8 H! X) [/ p
  779.         pop     di
    / L2 d- {- Q' J. Q
  780.         pop     bx
    . [: m1 y4 Q3 J& ]0 ~6 Z+ [+ c
  781.         pop     ax
    6 f) z& i1 V, Z3 G/ ?. ?
  782.         iret
    ) @* {& m7 a* X( t% C! T' ^" o
  783. ; \/ D* \& m4 ]5 D. ]7 X
  784. _set_pos:* E. A" d0 j9 X# x
  785.         mov     cx,cs:[pos_x]; F- I' f& z* K: I
  786.         mov     dx,cs:[pos_y]) P% J/ ?  w/ E% q, Z. ]
  787.         mov     word ptr cs:[x_move],0- i; {9 g6 M7 r7 b; O
  788.         mov     word ptr cs:[y_move],0
      t. y& H$ ~* u) v; c8 O0 [
  789.         iret7 l) X- @$ d. r

  790. - \: p1 T2 \3 l: k, K
  791. _set_hor_pos:! Z% w6 W) ~7 O* l* M
  792.         call    max_min
    ' x5 ~4 k  L" n* O
  793.         mov     cs:[x_min],cx: C0 o  }- ]  {4 f* Q, M
  794.         mov     cs:[x_max],dx
    # b* _! e4 u1 h  _2 a# \/ a
  795.         cmp     cs:[pos_x],cx2 e' n8 ]- [9 J1 x# X& o$ P6 p5 {$ J
  796.         jge     good_hor_min- P* ]0 g( ^( h( O/ G
  797.         mov     cs:[pos_x],cx
    3 p, c7 m. f' f+ V0 L* [  W
  798. good_hor_min:: d/ ~' I, |/ |5 s
  799.         cmp     cs:[pos_x],dx
    ( x7 j8 w4 [, a% X& n
  800.         jle     good_hor_max
    6 U6 u3 _3 F: H, ?3 ~
  801.         mov     cs:[pos_x],dx1 `: k( v& R" a7 V
  802. good_hor_max:" \: i! q% `7 p' ?
  803.        iret6 }& J% o+ W3 U: \6 \- B

  804. 9 D, y2 }+ }1 W/ v+ Q2 ^
  805. _set_ver_pos:
    / i6 j: ?6 q. b0 g# r' R
  806.         call    max_min4 p& i0 O  w& h
  807.         mov     cs:[y_min],cx
    $ L5 d0 }) j# G1 U& m
  808.         mov     cs:[y_max],dx* q0 p- o: t" J5 x$ g" Y! a# g
  809.         cmp     cs:[pos_y],cx
    " @' ?. q* e7 K$ L! j
  810.         jge     good_ver_min; K- `. k0 m* k8 N7 S* s: q
  811.         mov     cs:[pos_y],cx( U+ I6 t% [7 p) i& s0 p# X
  812. good_ver_min:
    . p4 W' K2 f- m0 w) Z2 `  x
  813.         cmp     cs:[pos_y],dx/ I, U# U# Z- A6 x8 [# g! ?
  814.         jle     good_ver_max
    . |" F! _8 P, Q
  815.         mov     cs:[pos_y],dx9 b7 |$ a3 O9 m9 w( e
  816. good_ver_max:
    # w! A: A6 C7 |3 `9 I2 I
  817.         iret
      Y: O+ ?5 J7 f; o" x# P4 i
  818. : P  O  Q! {# x; `3 w/ T! s
  819. max_min:
    ' P& f0 n4 v* @9 L! J$ _$ B9 I# O
  820.         cmp     cx,dx
    + ?1 b9 }6 ~. I! N# o
  821.         jle     no_swap) O5 P- Y* |4 T
  822.         xchg    cx,dx
    ( M& d- X5 [3 q7 `) O
  823. no_swap:$ D! I8 l/ C1 @
  824.         ret9 U1 B2 G5 H) T! W

  825. 4 _. ]( X0 P# {; t8 m# r0 H6 z
  826. _set_subroutines:6 V4 J7 r: i' a
  827.         mov     cs:[user_subroutine],dx) C( w! f' K" J! K; [
  828.         mov     cs:[user_subroutine+2],es
    ( N! J% i# y$ O9 g; F
  829.         mov     cs:[user_mask],cx
    + u+ C/ f4 {) X* k" \6 `  f. b9 e
  830.         iret9 I4 N5 Q# Q4 D8 H1 g! m

  831. 5 g3 W1 Y) M# ?7 o  b
  832. _swap_subroutines:
    6 G. T, \8 v0 _5 z# M7 X3 y
  833.         push    word ptr cs:[user_mask]) ^* j8 p7 g! G) P5 w1 K8 R5 ^, i, j
  834.         push    word ptr cs:[user_subroutine+2]# k9 T. z& A5 L4 P% ^+ W6 Z6 J
  835.         push    word ptr cs:[user_subroutine]4 G! {& q3 ^6 b9 o: w
  836.         mov     cs:[user_subroutine],dx
    2 v7 i% {4 J* j9 v% ?5 z& [8 W& Z
  837.         mov     cs:[user_subroutine+2],es
    & i8 s: k7 W9 L( ?- ]9 s3 Z* A
  838.         mov     cs:[user_mask],cx. X! M- K; ~  |$ K' ~9 ]% O8 a8 ^
  839.         pop     dx  o0 M- w& c  T% M. p9 ~
  840.         pop     es
    9 Z5 u# e) a' N( W! L) O
  841.         pop     cx2 S; A* E6 [& ~( E/ U# Y
  842.         iret0 o, q4 u% m% O/ y" n6 l7 i; p

  843. 3 |- l/ T) [, w% U
  844. memmouse        endp$ g$ N& d" @- T0 N+ a1 e" D. A9 [
  845. 7 o' k: `4 ~( g: W
  846. endof_start:
    , J% L) J4 A  Z( x$ o

  847. 8 G+ c" a- T4 W0 Y2 X
  848. emsg db 'No mouse driver install error!$'
    # I, X+ D0 _2 R  L
  849. old331 dw 0
    1 o7 Q/ k) ^4 C; c1 E; \
  850. old332 dw 03 ]9 B+ u  k% X) Q7 E
  851. old741 dw 0
    # }. M$ }) B, j8 _
  852. old742 dw 0
    4 \9 }6 P3 ^* a' e1 d
  853. memcopy db 0% h' c( ]2 W% X) v2 E4 w
  854. okcheck db 0
    % [$ [. U7 j# Y5 @  t$ n
  855. pass db 0
    ! g0 L" g; ?8 f( D. H3 E
  856. chkl db 01 I3 _$ `0 W. L6 u# O5 m; }8 ]! I
  857. lk db 0( x9 O  E$ [% v' K, M: b- K: m! G1 R5 T
  858. chkr db 0
    0 u. H5 \& ]3 Y  _7 C
  859. rk db 0: b' S3 C  e2 ?  h( p8 e5 s
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    & M0 `8 q  f! Q0 ]
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '( H/ F, U4 I1 `0 }3 w8 F
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '+ R1 k. W- x8 p+ d( v" }( m0 A8 Q
  863. db '                                                                                '- ]4 g$ k$ O$ h
  864. db '                                赏屯屯簧屯屯突                                  '
    $ D0 g7 N6 X' x  k) h0 C& t
  865.         db      '                                ?OFF汉OFF?                                 '
    ' L" d; A, e0 e' A, H
  866. db      '                                韧屯屯既屯屯图                                  '- c6 Q6 k$ N) j7 D, m: i
  867. db '                                                                                '
      L) ?% [9 m8 n1 }* E/ J
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '; G- b% D. z! A' U
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 6 I2 d5 U) L# @* L2 j
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    + h$ I, n) A$ ]

  871. 8 ]$ p3 V) ?: A& z
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!2 O, x( L% H( {
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... $ n, G# u: e8 J) b1 h
* q+ w- Q* n7 ^: N9 E5 B
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:34 , Processed in 0.036213 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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