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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。' V7 J* t& X; H4 d5 h3 }( l

* j1 v- u9 q* T4 W5 _! F代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;7 U- |5 H8 p1 [  ~, e8 i
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    % _- Q' e: N( ]9 F5 C) [0 F
  3. ;                                         By Bini.Yi 易祝兵% o/ {! x* A  a, f; b" ?9 H
  4. ;                                         http://www.ufoit.com 计匠网
    6 l7 {- q1 O' {3 t# b" g, e
  5. ;                                         2002/04/06 YYYY/MM/DD
    ' e2 Z9 e- |( a7 Q& d2 f
  6. ;
    - Y; g- r$ a3 \' w2 M( p( K
  7. ;         
    7 n6 P" L! ]# E# m
  8. ;          This program  test the mouse button  click and move.
    % s5 {" p" V% r, W' o0 w/ u/ f
  9. ;
    ! I  E1 M: O5 j
  10. 0 k, _5 x4 U$ S- C0 a" K
  11. .model tiny* o/ b: P. G4 q( ~5 H! {
  12. .586
    * e3 }' c* B$ `$ S- E
  13. .code& n, F+ X5 L+ p
  14. .stack  100h
    & c! `8 {2 Y2 V3 T
  15. .startup
    " W! v1 _7 Y  m: G% @! H# y- I
  16. pusha: r" k1 B, t: z. |3 i
  17. mov ax, 3533h
    - [) r& d, P( S5 O- c# E
  18. int 21h9 b0 l+ s  O; A  d
  19. mov word ptr cs:[old331],es
    # s4 w. z" w5 D: E. F; m8 s& q! K
  20. mov word ptr cs:[old332],bx
    + X8 K3 a! J% o
  21. mov ax, 3574h
    2 y5 M/ ^9 B# T7 q
  22. int 21h
      [; T5 Y" _- q
  23. mov word ptr cs:[old741],es
    + i. k  U; n* i' s+ H% j
  24. mov word ptr cs:[old742],bx
    2 y4 x# n& o- u; G+ l' R$ w
  25. popa
    " `6 ~# N# n" H' p) ?
  26.         call    memmouse
    0 z' F* p4 d! j  E7 N1 c
  27.         mov ah, 00$ \8 Y  A2 {+ |) a, c" L: W
  28. mov al, 034 ~5 J$ `/ g2 e' @1 Y
  29. int 10h1 K; X# L  w2 w" h  ^" o6 W
  30. mov ah, 06: u- F8 o* a, r/ R- f8 U
  31. mov al, 0
    3 K8 ^; O0 [2 Q+ O& D( \% {, b, m
  32. mov cx, 0
    1 V& c# c9 w- @- X
  33. mov dh, 24
    : c+ |0 d# V( Y; S/ z& ]
  34. mov dl, 79
    ! ]1 F" n4 d) [9 V- e: g0 {1 q
  35. mov bh, 07h- [3 A% [0 V' t/ l  F2 C# S, l0 r
  36. int 10h
    ! @9 {3 d7 X/ h) C
  37. mov ax, 00004 C4 Z  J( |4 I0 s8 J
  38. mov bx, 0002
    # N5 n3 ]7 k- L& R
  39. int 33h) P6 @1 j) q8 N
  40.         cmp     ax, 0000           ;if no mouse drive install
    5 s/ h+ D: l5 K
  41.         je      errormsg           ;show error MSG
    $ P" `6 p! l: |8 I3 e8 |8 a. v. v+ p
  42. mov ah, 02; _5 r. S& t) T! U
  43. mov bh, 008 g! T: K0 Q% {: a
  44.         mov     dh, 25             ;Move point out screen
    0 o; Y, Y4 \" W0 V
  45. mov dl, 79
    . J* L; [& t8 B; U
  46. int 10h
    ! }4 `; D, r9 x: r- \) C' |
  47.         call    showmsg            ;Show info% c0 b5 o* m8 o4 m0 l
  48. mov ax, 0001
    ( H6 H6 f7 W5 H$ r$ ^- X* Y' I
  49. int 33h
    * u4 Z) ?8 Y4 U& s
  50. ; mov ax, 000ah# ~' M1 P; m! v) E: }0 k
  51. ; mov bx, 0000
    8 K  J7 k0 g  Y! Q9 m( q
  52. ; mov cl, 0h
    - s/ i0 M; @' s; }' b4 N( T) c
  53. ; mov ch, 0F0h6 c, _& P7 `: S0 K$ i: `
  54. ; mov dl, 0h9 Q" }1 ^) Y/ G4 v0 ?+ @
  55. ; mov dh, 0F0h
    + W- V* q5 Y$ ^5 L: ^8 \
  56. ; int 33h
    . q* Y. i& ]# h: n' Y* H
  57. mov ax, 0004h
    0 g: J  M3 N) L7 R; @
  58. mov cx, 0319/ E1 E6 S  Y7 w
  59. mov dx, 0103
    - z# t8 v% r7 x6 v) H& ?* v+ z8 R: @
  60. int 33h
    / Q: m4 \; X& V* k! f/ z9 E
  61. casemo:                           ;Case button click and point move
    % S/ _* w; V! q: @4 W
  62.         mov     ax, 000bh         ;and keyboard press7 b" H" R8 ]( m) _5 ^5 d6 J( X
  63. int 33h
    9 E0 k, a) s6 N5 t4 f
  64.         cmp     cx, 00h           ;if point move....X2 G( r& I- M+ E( {4 e* C
  65. jne xmov
    9 d% ]8 y/ |( S+ ]( ^2 h$ X
  66.         cmp     dx, 00h           ;if point move....Y8 h. P5 R, c4 w* `& ?
  67. jne ymov
    0 _, @5 x6 J4 f7 X4 Y6 s
  68. xymovend:                         ;X.Y move end. C3 g6 o, j3 |' H/ ?2 {- L
  69.         mov     ax, 0003          ) V) v4 o8 k9 q% {
  70. int 33h1 `4 F1 }/ d* m) n
  71.         cmp     bx, 0001          ;if left button click  show ON' ?) _4 B( @' A" n- |& N
  72. mov si, 1828
    , ?; u  K) v( Y7 m" V
  73. je listl
    ; b6 U' c* r0 @( f9 x
  74. mov si, 18286 T5 D# d+ }5 k/ j8 O# U, K$ s
  75.         jne     nlistl            ;if left no click show OFF
    & ^7 h3 Z  p$ d( W" \
  76. testr:* b: R" x# ~% t. C0 J
  77.         cmp     bx, 0002          ;if right button click show ON" r* a& g1 P7 @: O  x0 J
  78. mov si,1842+ S; P- ?5 F0 f& z
  79. je listr
    0 a- ^0 x# o/ {1 m  F& q
  80.         mov     si,1842           ;if right no click show OFF6 m* E/ M$ D9 ^' @' t4 t4 c9 ^
  81. jne nlistl
    5 P* J7 J' \" m
  82. casekey:& b( X  L. l' b- p
  83.         mov     ah, 01            ;if any key press jump check: T: d3 I% M* {$ O% f
  84. int 16h
    / h, u# O! p, }1 v# h
  85. jne kpress. c* L3 r% j) V
  86.         mov     al, [chkl]        ;check x flag
    ) ]  a# |$ _3 u) d/ C3 r; a7 u9 D
  87. cmp al, 02h
    3 d6 U: O: k* E$ G
  88. jnb chkok1 B5 `8 Q% t& n! j7 T6 Z
  89. jmp casemo+ E4 R$ P- e* J0 v% M( q
  90. xmov:                             ;if X moved, get the X flag+1% i; X) K. d) j3 j
  91. mov al, [chkl]. W8 ]' T! G+ _" ^
  92. inc al
    " o) b1 q$ n3 I7 H
  93. mov [chkl], al2 M: }( v, }- r$ W1 ~, [! y
  94. call passok
    7 T, U! T% G& n. j
  95. jmp xymovend
    . W* N7 F! O3 h! g+ I  y4 L
  96. ymov:                             ;if Y moved, get the X flag+1; _3 a1 i2 Y1 G5 m$ A/ h
  97. mov al, [chkr]0 j* E  G, d8 i6 r8 u
  98. inc al) A* @( T6 P/ G$ b
  99. mov [chkr], al7 C7 H- v8 A9 W
  100. call passok4 r: n- @, m0 a/ y1 b4 f
  101. jmp xymovend
    7 F1 x/ T5 e$ Z! j8 h7 ~+ s
  102. % c8 T9 F. `" e1 `# ]. ?
  103. passok proc near
    # g! P  _7 i5 W4 X3 N2 b3 _
  104. mov al, [okcheck]
    " g/ q! `( h- o2 j# b: s& @
  105. cmp al, 1/ r3 t5 P4 A: S. W
  106. je let0
    9 I( b# v; o6 J9 E$ y
  107. jmp passret' b5 M* i- }, D( I7 R: ]
  108. let0: ) w- A+ y6 l! B- t, K
  109. mov [pass], 1! p, [9 K6 Q1 A- C7 l$ V
  110. passret:1 h; T! ~( J4 [7 d
  111. ret
    3 Q, m; P" }! B
  112. passok endp 1 a8 F& U& ^: M' D' t$ E

  113.   F! {  A$ q, G' H% Y
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS) f1 U$ N; J+ m$ {. W
  115. mov al, [chkr]* A. c$ r# Q) ]5 s4 P: K
  116. cmp al, 02h
    5 E8 ~, Z' J9 o9 _1 ^- v
  117. jb casemo( u, v8 P' a& X* J
  118. mov al, [lk]
    - ?) e( _. f& }: _: ~8 ^
  119. cmp al, 1! e4 Q0 ^7 R3 G& m: r; J( ?
  120. jne casemo- }$ @- [7 I& I. P2 I0 s, L
  121. mov al, [rk]
    ' o' @7 z, V8 _3 T# R- D
  122. cmp al, 19 k" ]# C9 b" R
  123. jne  casemo
    % h! g' J" ^. ]* h2 f, u/ I
  124. mov [okcheck], 1! w4 c3 p$ s1 h, p  d
  125. mov al, [pass]
    6 D2 D1 }) g8 s- R3 f1 Z
  126. cmp al, 18 b' t( @4 z: X3 B# x+ V, U# u3 H5 c
  127. jne  casemo
    2 \+ i( K1 q* E3 T# I1 X( M
  128. mov ax,0002h
    ' b; [4 z  ~9 }$ }) B+ ^1 ?
  129. int 33h5 h% ~3 l8 y8 \" f1 v" J" V* P
  130. call cleascr
    8 z2 |3 ~1 D  \  m' P

  131. 2 r" z/ ?9 I' r8 e  d
  132. call oldint
    6 ?" K) W1 _" ^( R. I& \
  133. mov ax, 04c00h
    ' |' X' @6 V. K3 B9 W' i  ^' V# f
  134. int 21h( D# z  n& B8 R* {3 e

  135. 9 o7 H) n5 |) I% q3 y. Q3 W
  136. okexit:7 B7 b9 F* ?. N. P
  137. mov ah, 4ch; |9 E; l, a/ H6 q0 m' R. Y: v: U
  138. mov al, 0- N1 y0 z" U  i% H
  139. int 21h# d( m3 v7 P7 k! t) E. v
  140. listl:                                 ;Show ON/ g5 E9 ]7 `1 u. \% t
  141. pusha7 }! q; |3 z5 p* Y2 x
  142. mov ax, 0b800h
    3 Z. M" E% M+ ~
  143. mov  es, ax( h6 t2 u; ^9 Z  p
  144. mov ah, 47h
    7 P* C: I% E5 Q! z
  145. mov al, 20h
    6 m5 `2 g, k  z1 v/ T1 z% J
  146. mov es:[si], ax
    - g* g) H; z" n" \' G8 v, a* o
  147. add si, 02
      ^5 P8 X' q  ?0 W0 O7 U
  148. mov  al, 4fh
    $ M8 {- z5 H: y# O( x; N- P" \
  149. mov es:[si], ax
    $ J* A& ^/ I3 s2 X0 F. C, d& L) E, E
  150. mov al, 4eh( Z6 V$ [$ H/ j- k; V8 v: o
  151. add si, 02
    : L6 F* S5 I, b( ]  U( I
  152. mov es:[si], ax( R5 O% a/ l6 l* C+ U! E7 j2 o1 N
  153. mov [lk], 1
    # E% H% o% T1 y$ C1 A
  154. popa
    1 W5 e* ?7 o. |: b+ R
  155. jmp testr* y6 t) j' F* a2 K0 M
  156. listr:                                 ;Show ON
    9 ~( @3 b- E9 D& h5 u( m
  157. pusha
      Q# P" K. p8 X) Q' W% a) O
  158. mov ax, 0b800h
    ; ^$ d  N8 v, a5 E+ j$ c# m
  159. mov  es, ax
    + v6 Y: t* W3 G+ ~$ i
  160. mov ah, 47h" D$ P8 m+ i2 Y' }! W
  161. mov al, 20h# E" |3 x& \# f( v
  162. mov es:[si], ax- U! |1 w2 s3 }: T: w6 M
  163. add si, 02/ h* h1 O. ?  ]) |: m3 x' ~* \
  164. mov  al, 4fh
    1 y) d% E$ j1 s$ r  Q0 A" \
  165. mov es:[si], ax. g! ?: e" t1 F/ i
  166. mov al, 4eh: ^1 I3 J  u# j+ t4 F: w
  167. add si, 02% G- G$ E* M3 V: ]
  168. mov es:[si], ax7 R+ M- C8 _: l/ }5 B& l
  169. mov [rk], 1/ R2 V+ Z) |( f" \# p) P5 E2 ]
  170. popa
    ) g6 c% I# S) q- H7 n. v; u
  171. jmp  casekey) ^4 r  J6 v0 K+ H! m; Q# K# U

  172. 5 i  j" m2 _5 ]2 J5 z
  173. nlistl:                              ;Show OFF
    2 @/ S' N7 v6 {7 n+ V
  174. pusha   ! t# Y- r# o+ Z7 k6 j, G
  175. mov ax, 0b800h+ I8 C7 ~; d1 T5 r) @
  176. mov  es, ax5 @, Z/ J+ b1 B& p" V
  177. mov ah, 17h$ W3 L9 e- g% I9 O0 a$ d, y
  178. mov al, 4fh/ S4 h4 s" l: V7 s, q% F
  179. mov es:[si], ax! I: |$ b' n- s# i( z
  180. add si, 02
    ! _( K' G& `  x# n) t: J
  181. mov  al, 46h- n2 {  Y! @  C$ [5 t
  182. mov es:[si], ax0 k, L9 J. Y8 w4 n2 g
  183. mov al, 46h
    ; z0 h% l) g! N& U0 `
  184. add si, 025 D+ z4 f6 I' I6 P& b; D! V
  185. mov es:[si], ax
    , Y- n; W& x% N+ m% p
  186. popa$ w+ g/ f" [8 E3 {5 [$ u
  187. cmp si, 1840
    : M% J. g0 B8 h9 c" E
  188. jae casekey
    ) g& b4 p8 n$ ]  C. Q! Z
  189. jmp testr
    ) a. T+ v+ }4 a) G2 E
  190. 3 k/ }! s( A, A& y- L. f
  191. kpress:                             ;Check key press if press<ESC> then EXIT, v0 l9 f2 N. n5 n9 B
  192.         cmp     ah, 01h             ;and return a error
    + A: T1 N/ Y+ a
  193. je exit1$ l& f) [( X$ F/ h: c3 |# d
  194.         mov     ah, 0ch             ;if press other key then clear
    7 N4 H8 u0 u$ ^1 {# I
  195.         mov     al, 00              ;keyboard buffer& x# k% g5 ~; X: P% {) ]6 P  a
  196. int 21h) {: F8 a- X8 {5 U1 m
  197. jmp casemo 6 ]' ]8 S; G. ?
  198. # H$ F. O) X& J- X" J. v
  199. errormsg:                           ;if mouse driver no install& A# N+ A& {4 x! P+ s
  200. call oldint/ m7 q7 L" y- k/ T$ r; b2 a  b4 @
  201. lea dx, offset emsg& `3 k" `6 U& k$ Y5 T
  202. mov ah, 09h' c* u! D9 q1 Q. e+ c$ R  e
  203. int 21h
    - R9 b7 k$ B4 O, Z4 T
  204. mov ah, 4ch
    - Y6 C% b- [6 N
  205. mov al, 2+ m0 [+ v! l3 \! Y4 [. w
  206. int  21h% N! k8 F. j4 k, w
  207. 2 W, M% D; v, }+ k* l
  208. exit1:                              ;error exit! K+ P& l$ D: H8 U5 o( b
  209. mov ax, 0002h
    . v* h2 T/ C% G
  210. int 33h
      S/ l* [7 m9 N% a. I
  211. call  cleascr
    6 z: e% r* y6 Z1 Q) h0 h, z" d; `
  212. call  oldint
    # C5 o; i! l: t/ R0 E( r
  213. mov ah, 4ch# k! N' N) F4 E# M. Q8 H! U
  214. mov al, 01
    5 i$ d0 b# H! d' F% O6 w1 c' I
  215. int 21h- H& w1 ^/ ]: Z! ], l9 L

  216. 4 q6 V3 n: s" r$ S3 B
  217. cleascr proc    near                ;clear screen! V4 |# k2 V7 s$ h: a
  218. pusha: J1 w' v( O" ~0 |7 b
  219. mov ah, 06
    ' R0 \$ P! ^% Q+ v
  220. mov al, 0
    8 ?. C. d' P/ }( R( p+ F
  221. mov cx, 0
      U$ \) [, t4 V  b2 S7 a7 Q) h
  222. mov dh, 24: v1 b! j" Q( p+ n6 F. z6 X) ~/ b
  223. mov dl, 79
    " F1 O$ H' q+ ]' {$ Y
  224. mov bh, 07h# y! M# ~% T4 F% D
  225. int 10h6 x9 O. d8 l  I/ d
  226. mov ah, 02' W6 @* D5 B% p& ]" W3 A4 Y' n# d6 T
  227. mov bh, 00
    5 K: [6 I4 K0 d
  228. mov dh, 0" k) K) {: J" u3 P3 E
  229. mov dl, 0! d0 P* [! a* s) M. O8 J6 a
  230. int 10h4 Q- }8 M& n* X! H7 k; h
  231. popa4 n- O" ]  P1 `1 ]
  232. ret
    ' {. h9 m# V" w+ i: c9 e
  233. cleascr endp
    # }8 E' l& _- e5 e1 z- W
  234. ! [8 a' t& O; t) e5 m
  235. showmsg proc    near               ;Show info- e0 w$ d  d9 q+ c
  236. pusha0 J  u0 W* P$ [2 e% H$ M4 g
  237. lea di, offset showms1 k/ w+ j' _; F" |. a% G0 D
  238. mov ax, 0b800h
    2 }3 ]! k1 u3 _% {7 U9 |; R# A
  239. mov es, ax
    ' X! N2 H- v) m: j: C9 p
  240. mov si, 0+ ^$ f- q; l0 d/ K$ |: d
  241. mov cx, 480/ v) g* A% T" ]8 d( a; @
  242. mov ah, 07h6 \- X; ~8 d9 G5 r2 q( l# y9 N
  243. @@:
    ! G: j  d* l$ I8 H0 Z
  244. mov al, 20h
    , q8 B$ }& |4 ^' n( ?, l
  245. mov es:[si], ax% N0 p, N1 K, l2 D; c8 j0 G* |1 p
  246. add si, 2
    7 B9 Q/ }3 o7 g/ T% f
  247. loop @b$ j  g; B% f/ [$ {- X! Y8 X
  248. mov cx,880; q: X5 z' {- y
  249. @@:
    8 c1 x* c; L( M5 |9 z; h
  250. mov al, [di]
    : A2 ]  \* S8 Q) j# P$ B4 v3 y
  251. inc di5 G2 z4 i1 v: l% V' w* W) |$ l
  252. cmp al,20h
    ; x7 b. X" X$ X1 N! ^0 u
  253. je showch1
    / _; Q: v2 b2 b$ y! s, s) {6 j
  254. mov ah, 17h
    2 [: j" {* n( R* m. Q5 G4 @
  255. jmp showch3
    " L4 p4 E& I3 K& t- M. i
  256. showch1:
    . B: F. u% k* b0 O! i7 N% [9 }( O6 [
  257. mov ah, 07h 1 |) M5 o' E  Z$ e' s  ^' Z6 S6 w
  258. showch3:
    0 S4 b$ A' O; F- q
  259. mov es:[si], ax. p" p- U$ _8 P" z& f+ B) h
  260. add si, 23 l0 N- S5 u+ J
  261. loop @b& g' G- g3 q& z# F
  262. popa6 Y5 k+ }' R- @# U
  263. ret
    8 t$ M. p1 u1 N
  264. showmsg endp6 G% q; J* s  E- J8 S
  265. 1 Y" ]( M) o- e! M) ^
  266. oldint proc- V5 a. C' g5 [; e: U
  267. pusha
    0 _# o; W3 t/ i! y2 V
  268. mov ds, word ptr cs:[old331]
    ' ]  I7 X1 L% K7 [5 j8 h% \2 L
  269. mov   dx, word ptr cs:[old332]+ R# }3 `! s3 O/ Y5 t! g
  270. mov ax, 2533h
    - O' y2 T# c$ ?9 c; H5 M6 H4 f
  271. int 21h
    ' W  E9 @% a' n* z1 Y- k( w: N
  272. mov ds, word ptr cs:[old741]
    ; N6 l" h2 z0 z* }6 H
  273. mov dx, word ptr cs:[old742]
    8 c4 l% g4 w2 g1 l, C
  274. mov ax, 2574h8 j- y7 v6 J% x: P0 _, x/ w1 N
  275. int 21h
    4 |, X1 n4 v2 h7 ~$ D- r8 K/ i
  276. popa
    0 M9 F/ Y  ~: D" s
  277. ret8 C. C$ c& ]9 N) t4 D  }0 s6 v
  278. oldint endp
    - X5 i  S; \, P. @: m! R
  279. ; `1 }7 E; A, w0 b
  280. memmouse        proc
    + ^( |0 z9 ]5 d. h- E, L8 A
  281.         xor     ax,ax) H8 M; Q7 n# H
  282. int 33h4 r6 k4 O4 i/ g# j
  283. cmp ax,0ffffh
    & V9 \- a6 Q) c5 `* ~, k  s
  284.         jne     not_loaded& R& q$ u! q9 l6 m% E0 S, y1 Z# w
  285. mov [memcopy], 1
    # C" U* @+ U5 r* T: J
  286. ret/ O# W# `7 o4 y4 R3 p2 P

  287. : W7 z8 q# H% G! u5 E+ b; W0 {
  288. not_loaded:' W. K  `  U7 s/ O
  289. 5 o4 r# B0 H+ V
  290.         mov ax,2574h" g5 @9 F* s! J" K, s* I
  291.         mov dx,offset new_isr
    / M$ ?$ B$ c! `) y  q
  292.         int 21h
    3 I' g7 S# s0 F- b; a1 \
  293. 3 S2 ?4 u! d. K" `' j  f* @9 K9 z1 m
  294.         mov ax,2533h
    7 }8 D, a0 i5 ^+ d
  295.         mov dx,offset new_33
    2 p- q' J6 A# S% T7 y, y8 z
  296.         int 21h" ]5 L4 p9 T- @& i' h
  297. 5 ^! b8 n; M0 Z) g
  298.         cli+ u# b! K( U# b* ]/ R

  299. - a; i$ R7 K. N$ k
  300.         mov bl,0a8h
    & S; B! ^) M+ i
  301.         call keyboard_cmd
    * y6 Z0 m4 ]4 B8 }. o+ |) ~+ i
  302. 3 z' j; ~8 A2 j9 B" n% i, w! @
  303.         mov bl,20h5 [, r9 P" \2 A, Z7 O# d$ X  G
  304.         call    keyboard_cmd, ^4 N( _( I4 F5 f6 K5 i
  305.         call    keyboard_read
    0 y. f% ?6 g! g  h$ g
  306.         or      al,2
    9 o$ _$ y% X" D
  307.         mov     bl,60h, e2 H6 Q! }0 ?! ?' B
  308.         push    ax8 g: H' k7 g+ }/ p- A
  309.         call    keyboard_cmd
    5 j+ L4 S$ z6 X" s" Q
  310.         pop     ax
    / S& s( j4 R" r; p  ~+ H) w
  311.         call    keyboard_write
    6 E- T9 g' j& G
  312. ' D7 [8 F; s- ~2 I4 n, M% |9 X$ p
  313.         mov     bl,0d4h+ C) m& C) @( ^  y4 x; g) U& W
  314.         call    keyboard_cmd
    4 T! F  @* T9 f0 d1 b& r2 z. D. k6 _) M4 x
  315.         mov     al,0f4h9 T" d# f; E( o: _. l  ~$ {
  316.         call    keyboard_write2 W, P0 J- I/ w( Z" J; e6 o

  317. % |* v) v. r  H- Q2 H: m6 q+ u
  318.         sti
    ( F( F3 U: r0 d8 L$ h" \
  319.         ret
    2 V0 P; h) N0 |2 `6 c5 ~! X5 C
  320. call_user_isr:
    5 K( z2 t% S+ F* J3 ?0 q
  321. db      60h
    ) l3 |0 n+ B9 T8 n) @3 z, S
  322.         mov     cx,cs:[pos_x]! S' X5 ]$ ?. l* V
  323.         mov     dx,cs:[pos_y]+ ?% _& r8 Q/ S' l
  324.         mov     di,0 ;cs:[x_move]$ E9 _4 e% Z7 b
  325.         mov     si,0 ;cs:[y_move]
    ) F& Y) d# G7 ~# j
  326.         mov     word ptr cs:[x_move],0
    0 j# B6 u  q2 C' y% [( G# r+ ^
  327.         mov     word ptr cs:[y_move],08 j' |6 o+ Y2 [: F
  328.         mov     bl,byte ptr cs:[buttons]
    * K! s& O- h; J% }8 Y* @5 x' z
  329.         xor     bh,bh
    5 X0 ]8 \! A! V. n6 I
  330.         call    dword ptr cs:[user_subroutine]
    , \1 Q( y0 o+ ^' K# I1 h1 ~
  331.         db      61h! P  I5 T+ e. @$ y* W
  332. ret3 s2 O% i, a1 I5 }. ~5 f- e1 e% U
  333. new_isr:
    3 T1 q/ b0 c: b; P
  334.         pushf1 X! \7 q6 P9 o7 r; H! y! t5 C
  335.         cli$ m( B1 B1 y: `! D* `
  336.         push    ax$ v6 ^6 L! S$ D$ \# T0 _/ N
  337.         push    bx
    " ]9 o$ `+ T8 ]9 j, j# ^9 g2 s
  338.         push    cx
    1 z7 ~: G, u4 [- O- a6 F7 s
  339.         push    dx: y: R+ K, s7 T9 C5 d
  340.         push    di2 W& P0 b% y6 W0 v; Q* S
  341.         push    si
    * t" ?# l4 e3 w9 q) J; f
  342.         push    es
    3 X1 }2 h  a5 j/ |1 V
  343.         push    ds9 a  b1 \* I6 |$ F" k" O3 S& f+ X
  344. : |# X  b% B5 n  q( j4 v
  345.         push    cs
    8 p" ~+ r( a( r" i
  346.         pop     ds* ~7 b8 P5 o$ V5 Y9 e5 e. Q" A

  347. 0 L% `" d2 x, \# Q! F  }
  348.         mov     bl,0adh! ]) j% \8 M: z! z7 N7 b6 @
  349.         call    keyboard_cmd' e  f2 E+ ^0 |# h4 [$ G

  350. . q1 J/ w% [/ D7 L* s
  351.         cmp     byte ptr [first_time],0+ [! e4 }. I( ^4 `
  352.         je      not_first_time0 L" a- a8 p) ~/ R

  353. 0 H& |+ g, \# |! k& W2 _
  354.         mov     byte ptr [first_time],0
    1 f7 S  o! G, D
  355.         call    keyboard_read
    6 r# T: i" b! H8 B7 p! N3 W
  356.         call    keyboard_read
    ( Y3 t! i6 a0 Z" n8 n
  357.         call    keyboard_read/ `) f# h: J  Q, I5 D% D! S
  358.         jmp     no_show
    7 P- M, y; S, Y  @  A" a' z4 h) x' J
  359. 3 M, Q5 K' ]; ]. S
  360. not_first_time:
    6 ~( s( |+ d2 {; b
  361.         mov     word ptr [temp_mask],02 Q( I% w4 _; x" z  P
  362. % x* I, ~& l. _4 h( c3 I& I
  363.         mov     cx,[pos_x]
    2 s$ o9 O7 t& y) G9 j/ H1 h) f& f
  364.         mov     dx,[pos_y]# |+ p& b% p$ i) ]( U$ G

  365. ' }/ D# R% s$ z5 p
  366.         call    keyboard_read
    # F4 C- W1 i/ S# B, T
  367.         and     al,7 ;3
      ~  e2 Q( \! E7 m7 Z
  368.         mov     ah,[buttons]
    8 t- B4 h! a) Z. g
  369.         mov     [buttons],al
    1 D' F/ v4 u7 y+ S& ]0 b
  370.         cmp     al,ah4 Z7 T' ?$ D7 \; e7 m4 A
  371.         je      no_button_change
    3 k; _. }) a" T1 k! p+ g
  372.         and     al,30 w: F0 X3 `2 C
  373.         and     ah,3/ h2 T" l* f8 i" z' g
  374.         xor     al,ah2 w; |4 z# t3 A" x. h- [/ ~" [8 R
  375.         xor     bx,bx
    - Y# j1 W2 o  o6 I

  376. 0 K& t: R- {( B# x8 |
  377.         push    ax
    - {5 y: C+ [+ H/ T( r
  378.         test    al,2/ K6 y. b  I" T) p0 I( Q* ?/ O
  379.         jz      no_right_button_change! o- y+ X" C" k0 b" U- u  n
  380.         and     ah,2
    " h, G7 @: U: O" v
  381.         jz      right_button_pressed5 U% b. ?, Y2 I/ m/ x
  382.         or      bx,16
    ) D* _: d9 z! @9 N. Z0 n0 Y6 c- o1 Y
  383.         jmp     no_right_button_change
    8 A& T" K8 J3 n- ]  D
  384. right_button_pressed:
    5 p& t; X; O( L; C. Q( M9 W
  385.         or      bx,8
    % @% g3 _9 ^; X! b/ h- C' M3 t
  386. no_right_button_change:
    + W3 v" Q' \* }; ]5 x5 Q

  387. * F( N9 ^* d2 S  G' v/ f9 l
  388.         pop     ax
    $ a% U- M- n# j  a# N
  389. / S; q- f2 }) G; R! S4 W9 w
  390.         test    al,1
    1 t8 O3 e9 M8 {5 [0 [
  391.         jz      no_left_button_change
    ' c: U8 `4 N8 ^- A  `( F4 p0 F
  392.         and     ah,1! ?1 x5 ]% t; J5 a4 g* S8 U+ K/ l4 X
  393.         jz      left_button_pressed
    : }7 u' Q% v* a$ M5 G  p- J) u  B
  394.         or      bx,4
    " O1 {9 A! R  K: l8 s
  395.         jmp     no_left_button_change, I2 }2 T, P/ L/ c. y: v' }, Q
  396. left_button_pressed:4 M0 x; e( M- D) C; \8 J
  397.         or      bx,2! t4 f" x) L: }* D
  398. no_left_button_change:
    0 y& c+ _" ~* \$ S$ |* t

  399. $ B" V  O  c) @7 i" t* c4 g
  400.         mov     [temp_mask],bx
    4 l/ c4 e/ ?) g
  401. & \4 i! l( ~4 i) Q2 k
  402. no_button_change:
    " E$ Z  ?4 p& U, }4 B7 r& I9 Y" z9 b
  403.         call    keyboard_read
    : _% [: g3 M1 R
  404.         cbw5 j" v. U" t4 }8 _9 T' R
  405.         add     [pos_x],ax2 {" z8 j, c7 \
  406.         add     [x_move],ax# q% z: o* O. b: k% ]
  407.         mov     ax,[x_min]- a% \  d! E2 f4 ?6 l
  408.         cmp     [pos_x],ax! A5 g4 W; \/ D, [
  409.         jg      good_hor1
    3 b! {- ~* t, X6 }" y
  410.         mov     [pos_x],ax
    $ v4 W9 P) L, E) ~' F& Y
  411. good_hor1:. K4 ~, k6 x, D1 j; e% w0 ?* s
  412.         mov     ax,[x_max]2 P1 P) p& r% s3 A0 h& D
  413.         cmp     [pos_x],ax
    - Q& d0 l3 C4 P7 N. k$ x
  414.         jle     good_hor2
    " X% _! a# @4 Q% k
  415.         mov     [pos_x],ax3 {! @/ C1 f' C. u+ u6 b
  416. good_hor2:$ }" w& g8 V/ _0 t9 K2 Y# P! H4 Y

  417. - M3 b6 P$ H( h% k5 i
  418.         call    keyboard_read
    3 t8 p. y8 L1 G8 V
  419.         neg     al+ ?7 S( Q, ?* W( H
  420.         cbw. t6 W) W+ d8 s' L
  421.         add     [pos_y],ax6 k8 s* s' O; n" W: _
  422.         add     [y_move],ax% p8 ~2 }* A2 ^9 Q) A; y
  423.         mov     ax,[y_min]- ^0 r3 v* F+ a2 n/ k; u
  424.         cmp     [pos_y],ax
    & t/ F* O1 R+ r( R
  425.         jg      good_ver1
    ' x" K" |& P5 {
  426.         mov     [pos_y],ax+ |, ^6 L9 |( ]- l& P
  427. good_ver1:
    , w6 j% m$ e! w) A5 t" N
  428.         mov     ax,[y_max]* E- b1 u7 d; T' n" x  {
  429.         cmp     [pos_y],ax( h; r5 S( a3 `4 @" r$ c
  430.         jle     good_ver2% y0 U9 C- b' n/ Q! p
  431.         mov     [pos_y],ax+ {2 m' r' p* g" n+ I! v
  432. good_ver2:7 w/ I: R: C9 C, ]

  433. % ~5 S: F( [6 l' H8 \# u' s3 B
  434.         mov     ax,[x_move]3 n1 |2 m- z2 @( A3 l1 m
  435.         or      ax,[y_move]9 R4 O7 Y6 I/ q" n7 j" [
  436.         or      ax,ax3 N8 r: T9 `% C4 m2 p
  437.         jz      no_change_position
    , k2 \% k% \, y0 ^( G; f2 D4 f5 x
  438.         or      word ptr [temp_mask],1  m, Y0 M4 U" r# h" w; D( H0 s# x
  439. no_change_position:
    3 l# I2 |7 w6 W3 j8 u$ o
  440. # q" E6 ]1 _5 p  l: \, b
  441.         mov     ax,[temp_mask]
    3 x8 M" {/ q9 @% {
  442.         and     ax,[user_mask]
    % t0 x9 l% N0 k. ]1 n3 b
  443.         jz      no_call_user  G% Y& x  s" H  {$ U
  444.         call    call_user_isr
    % f. f" f# a1 u& y+ r+ ^- [
  445. no_call_user:, x* k4 j  R# D* H; e
  446. * [; F) Y. `7 v& @" V- X( S0 Q
  447.         cmp     byte ptr [sm_flag],1
    , o. m2 J; d- M7 O) c# _$ ]! i
  448.         jne     no_show  n* @4 k& m: T) w& ~

  449. . z1 f3 F" z, j8 A& ^. R
  450.         shr     cx,3
    6 O! x; {# K6 E( ?; S; U$ _$ @/ N7 I
  451.         shr     dx,3
    # ~/ }, l- }0 ?8 P' C" ~" C
  452.         mov     ax,80- G( n/ B% z( q" {
  453.         mul     dl0 Y4 M. @3 }- G2 z
  454.         add     ax,cx0 V9 o; u' V1 G* n
  455.         shl     ax,1
    7 h0 c$ ]$ n- F8 z& v5 P# z; L, s
  456.         mov     di,ax4 r6 T& `7 r% n4 D  b$ F
  457.         mov     ax,0b800h" j4 C) }# A$ W/ R* ?/ h
  458.         mov     es,ax  o/ Y4 {3 t9 P3 o# M) E; `3 W. g
  459.         mov     ax,[save_char]
    0 i+ c2 s! }/ ?+ J( P& u) D; O
  460.         stosw
    , R' h8 o# R" E

  461. % c7 Q1 ?3 f8 W: ~
  462.         mov     cx,[pos_x]
    3 z4 O. p/ H3 C7 e! y
  463.         mov     dx,[pos_y]0 P. Q# v) W$ i+ N6 X5 S
  464.         shr     cx,3: B3 X/ F4 t7 U& \: ^
  465.         shr     dx,3
    / z/ ^& x8 ?9 c- b
  466.         mov     ax,80
    $ Z& U! X9 c& d$ ]
  467.         mul     dl
      u9 P+ h) X. L6 s; i9 t3 }& w- s
  468.         add     ax,cx
    + s+ {) g3 g: p  D. U
  469.         shl     ax,1
    - S' Y5 `9 ?" H( \0 U* S3 |
  470.         mov     di,ax
    - W$ ]+ C$ a- T% [3 n
  471.         mov     ax,0b800h
    . C( }7 E# M: U; P; c9 @) d* I
  472.         mov     es,ax
    ! `  I: D* q! }6 e0 u7 o: @
  473.         mov     ax,es:[di]6 p% x% O5 v# r! B
  474.         mov     [save_char],ax
    1 j' D- Q3 a  k# C5 I+ b, p
  475.         not     ah0 n% Q/ t8 K: ?4 M7 o! u! }
  476.         and     ah,7fh( r; f8 Y9 w$ m$ N. x" x
  477.         stosw# X9 P8 q" V+ V0 J( r3 _$ n
  478. no_show:3 ~6 T% X) ]/ y
  479.         mov     bl,0aeh
    ; W8 j+ B5 n) J4 T+ S
  480.         call    keyboard_cmd$ m  q( }  c0 D7 z

  481. $ }+ p7 t( Y& H' w
  482.         mov     al,20h
    8 o; c( ^, k1 l
  483.         out     0a0h,al
    + J5 y8 L4 U- q$ N
  484.         out     20h,al) E2 d: E' m) s. o8 g# w0 ^* G4 E
  485. ' p7 j" i* N8 m
  486.         pop     ds
    % K! F7 t7 J  P# c8 m8 O( t& V3 k
  487.         pop     es) i- U2 [- y9 p/ k- D5 Q& c
  488.         pop     si0 S# M- F3 Z8 G8 `# E
  489.         pop     di
      ~0 t! G4 q2 c5 d" r4 x" s
  490.         pop     dx
    - s, f0 T6 h* _! @
  491.         pop     cx
    ! A7 [+ u. ], Y
  492.         pop     bx' I; d7 ~% T6 p6 U2 O8 |9 [
  493.         pop     ax
    6 P5 D6 J2 c( {, E4 t. H
  494.         popf
    , I9 y1 S7 `( X% R" H
  495.         iret
    0 w5 k& f) N/ G' i4 N0 ~" p5 O
  496. ; Y* o3 K: Y# P) M8 s
  497. first_time      db      1
    8 u" O! e0 Q% }; q/ ^" N$ V) U& d/ @
  498. buttons         db      0
    0 ^6 |" Y! P: q8 ?' c) n
  499. pos_x           dw      0
    + a4 U2 X, e" ?# C
  500. pos_y           dw      00 U$ k/ P8 Q6 ?, F
  501. sm_flag         dw      05 c  g% t; l" a* L& c& |% V
  502. save_char       dw      0
    6 a2 a( A/ I: o' ~+ I: s0 P: q6 o9 L
  503. x_move          dw      09 k0 f3 D/ \" x7 s
  504. y_move          dw      0% j. d2 c5 {9 x3 x
  505. x_max           dw      639! N; ^6 u+ y1 z. d' ?( n
  506. x_min           dw      0
    + S8 p) ~: [. K8 E2 `
  507. y_max           dw      199
    , n- q( I) d2 \* [) J5 v
  508. y_min           dw      0
    4 A- C3 w1 a8 U, z
  509. user_subroutine dw      0,01 ^5 M, W9 ]) s4 F
  510. user_mask       dw      0( @8 K  a$ r: y7 |
  511. temp_mask       dw      0
    : h) p$ {% s% Y" m& j$ z( T& |

  512. 4 x2 f! @2 x$ P5 ?
  513. keyboard_read:
    4 t# x& O2 o! b2 U9 l  u7 F6 d
  514.         push    cx
    ! y1 p( G! L4 Y: J, P
  515.         push    dx
    ) U8 A7 Z& p0 F9 g: p7 f+ S( q
  516.         xor     cx,cx% i8 }, H) C* y0 {
  517. key_read_loop:
    7 p5 r/ n' @; o2 j. e. n
  518.         in      al,64h
    4 K' h& I  C3 w5 a# f. E
  519.         jmp     $+2
    - E% V. L: ~" B% E% [2 }
  520.         jmp     $+2
    6 B7 j5 W4 W, G  D, r
  521.         test    al,1$ c$ O  M; I, X+ R5 L) G- G
  522.         jnz     key_read_ready
    . a( P6 |2 _6 u* b
  523.         loop    key_read_loop* Q1 \# d0 X& O( `3 i0 Q. F! B
  524.         mov     ah,17 q4 m; `& U: q( B# E/ L
  525.         jmp     key_read_exit1 @1 t# W, a: ~; S! j$ d
  526. key_read_ready:
    / G# m/ `/ Y3 f2 C
  527.         push    cx
    8 Y, K+ j- U5 c& {" K$ w0 g
  528.         mov     cx,32' N4 `8 R7 C2 [6 J( P
  529. key_read_delay:
    ' x  k" s2 E0 z  J7 D
  530.         jmp     $+2
    9 F6 t- h. F2 h3 P! J" m4 U
  531.         jmp     $+2: N9 p1 }5 X0 _6 d
  532.         loop    key_read_delay
    $ b, _1 A" U. f; r
  533. , o& U0 m6 H) k+ e2 h0 W
  534.         pop     cx" W- n4 _% ~* W+ o  [/ E
  535. 0 k6 U# F+ t8 I
  536.         in      al,60h
    ( B& N  Q3 U2 a) ?* H  H6 ], Y  O
  537.         jmp     $+2. v; D; E5 e- {0 Y
  538.         jmp     $+2# J( [9 w- e7 u3 H1 A5 N4 e+ r
  539.         xor     ah,ah
    3 D3 N& T  t! L5 L+ N! R
  540. key_read_exit:5 |" E2 D" L* v1 Y) n; E& Q
  541.         pop     dx8 B3 N' _3 [" a) R/ E7 c
  542.         pop     cx
    ' O' ~$ `# V. {
  543.         ret1 |6 P; g; G$ ?9 ]

  544. ) u* w, G6 B: x7 s! s. S
  545. keyboard_write:
    6 w3 B; l3 c- U9 S  h/ Y! J( t
  546.         push    cx  J$ Z  v9 f7 x
  547.         push    dx
    5 L. |  v; V+ m
  548.         mov     dl,al
    ; a3 w0 a  @1 o" I/ h; K. v$ F. ^7 W2 @0 M
  549.         xor     cx,cx
    $ u: v: M" @4 \! J
  550. kbd_wrt_loop1:7 H9 H+ z2 c) s9 z8 p- B
  551.         in      al,64h
    7 L. }1 l. {' y( l! }* L
  552.         jmp     $+26 K+ o- Y5 \- ?% {9 j  @
  553.         jmp     $+27 g; L: Z* i5 b1 N) K0 a$ P
  554.         test    al,20h
    ! @5 n* a  f! D! R0 {& k7 f6 w
  555.         jz      kbd_wrt_ok15 }& h0 n; V% R. y
  556. 1 z. X$ Y( L# N9 g$ F6 X
  557.         loop    kbd_wrt_loop1
    & s4 u& z3 N2 m( V

  558. 2 n8 Z3 \3 Q! C: z$ i; O/ K
  559.         mov     ah,1  R* u! e5 t' P! T9 Q- ^+ }) B9 Q
  560.         jmp     kbd_wrt_exit
    9 v; i$ y) b8 G& x. n: ]$ n3 B
  561. + T' k4 Q/ H6 V1 @( I8 @/ B: @
  562. kbd_wrt_ok1:+ I2 X- J" \0 m/ ^% U6 a* F
  563.         in      al,60h
    + G; a/ h& Z7 ?5 {

  564. 8 ]4 C/ o: Q7 @3 x
  565.         xor     cx,cx
    9 T3 l. O+ D% i3 B- `, X2 K# w
  566. kbd_wrt_loop:
      [- F5 W! H$ R4 ^4 J
  567.         in      al,64h/ p( [# {, ^. ^5 I: n) Q
  568.         jmp     $+2+ X, A: \1 l; X
  569.         jmp     $+27 ^# _! F9 B: @) G4 g/ I
  570.         test    al,2; C. ?  V& u' j; s
  571.         jz      kbd_wrt_ok8 t9 F1 l# F; g- _# y
  572. & f9 d6 ^, R7 T( ~3 H2 h- ~/ P' i, _
  573.         loop    kbd_wrt_loop
    ) f2 F5 Y! @" L* J& b5 S9 u0 X# P
  574. ' B: r! Z8 C$ w8 Y8 l# ?
  575.         mov     ah,1
    & _5 E+ g9 R, S9 l* G* L8 k
  576.         jmp     kbd_wrt_exit4 |( O. O# P0 ^' l) u( e6 o

  577. * Z5 O9 I8 B! r$ z5 {) j
  578. kbd_wrt_ok:! H) t, u1 n6 Q# |2 L$ U* x
  579.         mov     al,dl
    ' x8 I+ S) j- J* m/ N
  580.         out     60h,al
    / t4 H# f- i; E7 B% v
  581.         jmp     $+2
    + q6 h  h9 C6 x$ m
  582.         jmp     $+28 Q* u# Y* d) G5 |" X. m( t

  583. ( m8 q% t2 k) N$ ]2 U* Y
  584.         xor     cx,cx
    . ~: E. l3 b) A2 F( N, ~0 H
  585. kbd_wrt_loop3:
    4 Y8 r# O2 M4 Z' {( ~0 E
  586.         in      al,64h
    " ]: K8 N- z' P
  587.         jmp     $+25 H8 S0 G- i$ d/ `) D
  588.         jmp     $+21 G2 e6 _. |. \; T0 s" N
  589.         test    al,2
    3 K; W" o& e4 V" g- z9 O
  590.         jz      kbd_wrt_ok37 h$ c+ `3 d7 l2 B

  591. ( D' [2 Y4 i9 `7 b. F
  592.         loop    kbd_wrt_loop3
    ' p. i; x8 A- a. X1 }1 k+ P
  593. 7 {) b- O. q4 t$ d  o: T+ p
  594.         mov     ah,17 y7 ]1 U9 P0 Y( W4 o  F
  595.         jmp     kbd_wrt_exit4 M  O3 u3 Q; T8 S4 Y2 j
  596. 7 F2 _0 @/ V% G( l
  597. kbd_wrt_ok3:, V1 P; X! P* _9 H$ e8 P) h
  598.         mov     ah,8# e; s0 B- s6 O" J" F
  599. kbd_wrt_loop4:
    " w- r$ |) j! m9 _
  600.         xor     cx,cx
    # |$ |4 t0 z5 Q$ y+ I
  601. kbd_wrt_loop5:# C1 D( S6 G: N
  602.         in      al,64h& F* J, q: h* w
  603.         jmp     $+22 k1 b+ e' x$ W+ G2 R) n; T9 ^9 I# }  `
  604.         jmp     $+2- `4 J# W0 c! h. N0 j$ A
  605.         test    al,1) [0 s$ l" e, S; X) ?4 A7 E; p
  606.         jnz     kbd_wrt_ok47 s/ i6 I3 L. U/ k! _
  607. 9 c( t4 O& n7 d  p5 d
  608.         loop    kbd_wrt_loop5/ L$ s  h0 N4 a' t% c9 t9 G

  609. # K: ]) S- p) M9 T3 _
  610.         dec     ah4 C* n8 `$ a4 T' Y8 K) w* V; v- _+ X
  611.         jnz     kbd_wrt_loop4) o, \* d: H9 I' q

  612. 9 Y" e) D/ u* A5 |( d7 u2 A5 e
  613. kbd_wrt_ok4:
    ! j& {( y0 f1 I' ?1 E, N3 g
  614.         xor     ah,ah
    : x/ F# Y# ], e! t# y
  615. kbd_wrt_exit:$ {: Z! ~, F  n' @) e
  616.         pop     dx9 e( p0 z+ I+ Y# I" Y  y- Q
  617.         pop     cx
    8 M) S) ^' x$ N% J
  618.         ret
    2 z( g$ Z. f! Q" c8 l- g: y" B
  619.         
    ! N6 S) o9 e6 ]  ~: R, F. n
  620. keyboard_cmd:( ]0 ^  G$ O6 M+ h. w6 x; \/ |
  621.         xor     cx,cx
    # t2 m. I3 g) y3 i
  622. cmd_wait:
      ?, |% q, y/ b# ^
  623.         in      al,64h
    ; a! N$ Y9 z2 O8 s" m+ `
  624.         jmp     $+2$ s/ J+ A$ j. S: w8 P
  625.         jmp     $+2
    6 B" X7 ?; ?, ^  Z% ~8 b: w
  626.         test    al,2
    & ~9 D0 }. C: b+ `
  627.         jz      cmd_send
    $ k2 c& \: W% e3 U* p  u
  628.         loop    cmd_wait! w7 ^# O/ ^7 }# A

  629. 2 _9 U" Z1 H$ w- J
  630.         jmp     cmd_error6 B0 H. I1 U: z, m* X% Y
  631. - ]! {- C$ o) l
  632. cmd_send:
    7 z+ B6 ^1 _) |" ?
  633.         mov     al,bl
    & D0 v0 B( N9 P5 W) _% z
  634.         out     64h,al
    4 O% U3 m4 E  {2 U/ ^9 _4 {
  635.         jmp     $+2
    , a# _5 v1 T2 s# A2 C$ L
  636.         jmp     $+2
    " @* }: Z5 I) Y" a: @  S: x+ ?
  637. ( A# @/ C3 O4 h! _) c
  638.         xor     cx,cx" ?/ a3 p4 {3 `% A4 J7 S5 P5 P
  639. cmd_accept:
    9 b+ M* j( W1 J3 \7 |2 G( U) e
  640.         in      al,64h
    ; ?& C6 N3 ?1 a+ a- U( P
  641.         jmp     $+2
    0 S9 ?$ W, e6 \
  642.         jmp     $+2
    & w1 L/ i$ u" b* u, e# |
  643.         test    al,2# p* P0 J) e; I# S
  644.         jz      cmd_ok* O8 U  I$ n9 s& z+ O0 c
  645.         loop    cmd_accept  X# y9 k% E9 B. y
  646. , f1 c% Q& ?  s+ K" i
  647. cmd_error:
    ( ^8 ?$ b2 H" i# O) ~8 N
  648.         mov     ah,1
    9 R& w( w6 ?% Z, ^
  649.         jmp     cmd_exit: J4 j  _1 Q. ~. ?) s) [* I, H
  650. cmd_ok:2 V( O0 w1 L! W9 D- D8 p
  651.         xor     ah,ah
    1 X1 x/ D/ T5 x' s) B/ s! ^
  652. cmd_exit:( Z$ n' ?" R: \& s" r3 |9 h( _  k
  653.         ret
    7 z  A6 i- ^( B( `+ H/ F$ i

  654. ; P: |* W/ l6 p# ~
  655. new_33:
    ; y# \6 |. [3 B7 v
  656.         cli
    ) u  b6 O7 R, g: P3 B
  657.         cmp     al,04 {5 a! J6 E0 i& U
  658.         je      reset_mouse) V2 T* M; t" E7 N( I
  659.         cmp     al,1  \3 w! {% v( _5 J; ?) w) z/ u  ?0 p
  660.         je      show_mouse
    4 p! M. K* j  n* L6 E$ B
  661.         cmp     al,26 X& v' [% j; M0 [
  662.         je      hide_mouse2 l! J( [1 f7 a  C7 t& o2 {$ B
  663.         cmp     al,3
    ) C  w. u( t  ]: ^8 n* q
  664.         je      get_pos/ c; _5 v; `' L6 e* J( }
  665.         cmp     al,4
    ; ~! P, ^3 f5 u1 g
  666.         je      set_pos% z; |* ?+ ?) @$ ?
  667.         cmp     al,7
    7 l7 S+ K9 d6 O
  668.         je      set_hor_pos
    + i8 S6 D! t% O1 W& w/ p+ J+ [
  669.         cmp     al,8
    ! ?. c4 Y& {1 x2 r1 `
  670.         je      set_ver_pos
      f. o1 d( K8 `4 p/ }
  671.         cmp     al,0bh
    6 Z1 e1 {  G4 z8 a* Q
  672.         je      get_mouse_movement
    ; H' a3 Y8 I8 G0 d
  673.         cmp     al,0ch7 s8 Q/ ]/ {# y$ V5 Y
  674.         je      set_subroutines5 S  Y- B3 ~. p3 R; d8 K: S
  675.         cmp     al,14h" N3 t. q" @, X* M
  676.         je      swap_subroutines  r+ K+ s% ^6 W! J
  677.         iret3 R5 x' L! x4 a; z( \

  678. 4 z& t* ^8 N% J: A4 t8 f: s( w; |
  679. reset_mouse:
    ' M% v/ n  a0 A! R" W. l
  680.         jmp     _reset_mouse; S1 O6 i" A: x! w  \& U
  681. show_mouse:% W- H0 x" s0 K- D4 s
  682.         jmp     _show_mouse
    . n$ n) x, P% f8 b( ~
  683. hide_mouse:
    : n$ t; G/ z/ r& ]2 X8 `9 m* E1 M
  684.         jmp     _hide_mouse
    / J# U' u! ?7 q: T2 p5 ^
  685. get_pos:$ Q0 |4 u7 L- E8 R0 _! e
  686.         jmp     _get_pos
    8 i& I. s7 O/ K2 L3 p
  687. set_pos:. N/ @$ n( \; r! }6 V6 j. f% ~
  688.         jmp     _set_pos
    + n8 q+ Q8 D. }9 c$ J. F
  689. set_hor_pos:* s5 L" Q0 `+ x3 J6 l, w( V
  690.         jmp     _set_hor_pos9 i/ F3 r4 P4 g( s$ b; z) T
  691. set_ver_pos:
    , L& k) P4 W. }, V& `8 N
  692.         jmp     _set_ver_pos
    6 Q6 Z2 G6 v* C( u- O. L1 e* v
  693. get_mouse_movement:5 }& `" C# z# j; }. |1 H1 d" q: M
  694.         jmp     _get_mouse_movement
    / X/ F" T% B# T% H3 q
  695. set_subroutines:
    ( O1 F; o# `; K$ M, r# O) h1 w' a
  696.         jmp     _set_subroutines& j% W% t2 q, @, @+ z
  697. swap_subroutines:- J7 A" }4 l0 ?
  698.         jmp     _swap_subroutines
    2 d1 [5 t( H$ {8 k5 }; ]; i$ I" p

  699. % O, v1 A( }& N& b" J$ i+ e" \* A
  700. _reset_mouse:
    + v9 O, }/ r6 K
  701.         mov     byte ptr cs:[buttons],0
    8 I5 z: |) z* P* ^; U6 S: a
  702.         mov     word ptr cs:[pos_x],0
    9 i, I2 Y7 C2 C4 u+ q2 G9 p/ D* L8 z
  703.         mov     word ptr cs:[pos_y],0" Y% T, W9 |4 W5 o" |& d! v" G4 n/ ?
  704.         mov     word ptr cs:[x_move],05 l1 c& g! g/ J* d2 B
  705.         mov     word ptr cs:[y_move],0
    # `3 O0 q" E+ v, H
  706.         mov     word ptr cs:[x_max],639; d9 J' ]) G' Z, z
  707.         mov     word ptr cs:[x_min],0
    ; U/ n* q  [  H% ~1 Y$ ]- Z
  708.         mov     word ptr cs:[y_max],199
    # v  q! h( z  Q' ]2 q) J
  709.         mov     word ptr cs:[y_min],0
    * ?9 a& N/ S$ w* |! _6 {- k
  710.         mov     word ptr cs:[user_mask],0' Z. u) L# X+ n2 Q+ q
  711.         mov     word ptr cs:[user_subroutine],0
    / [2 }' |- N. o; @
  712.         mov     word ptr cs:[user_subroutine+2],0
    % R( a5 J) x8 u* f5 p/ U5 X, T
  713.         mov     ax,0ffffh" k3 f! z. n# f3 Q- m" d
  714.         mov     bx,3# b! [4 f5 A; [2 e
  715.         iret9 O* }8 W0 w$ }. p# D: o, c& o, ~
  716. . C" F! G  r1 c
  717. _get_pos:- W) o# I3 N. m, S* C* k& `- H4 h
  718.         mov     cx,cs:[pos_x]3 }( F: m* s0 U" L7 w% _5 M& c% J
  719.         mov     dx,cs:[pos_y]2 b5 R+ l2 S5 N. Y! l
  720.         mov     bx,word ptr cs:[buttons]
    5 r: G9 J0 n$ Q
  721.         xor     bh,bh5 |8 v) P( I) [8 O7 G' _
  722.         iret( B1 ^9 [9 q0 c- l
  723. ! M- ?. ~5 \1 h; J6 E
  724. _get_mouse_movement:5 l2 t' h+ ~& R
  725.         mov     cx,cs:[x_move]* f' O+ v# b) V$ ^6 [8 Z6 d! O
  726.         mov     dx,cs:[y_move]
    ; g' R3 c4 k1 A- W) c5 \8 E
  727.         mov     word ptr cs:[x_move],07 O: \6 P2 T! }0 b- p
  728.         mov     word ptr cs:[y_move],05 v7 w  {9 P; S
  729.         iret* m+ p' l! V: J. b' ~8 ?: h1 m

  730. % K" u* {" ~+ r; z
  731. _show_mouse:
    1 C. f  Q$ M/ {8 e3 B% m. m
  732.         push    ax& N! P5 }+ M# u" `% c
  733.         push    bx
    / b0 ~9 y* y- I) F% M) T
  734.         push    di, e9 O8 {& ~4 [5 K' I
  735.         push    es. l& O; y& t/ L0 w6 }3 g8 Z$ c
  736.         mov     byte ptr cs:[sm_flag],1
    , H/ h+ C& `- ^9 k8 v: y
  737.         mov     ax,cs:[pos_y]0 B& w8 c# o! _2 S
  738.         shr     ax,3
    3 b4 A( V8 P, _1 i5 z! s' }
  739.         mov     bl,80
    : G' |! T5 S; h5 i- K
  740.         mul     bl# e& m7 W. X0 K. Q9 z1 s( r# e
  741.         mov     bx,[pos_x]
    2 ?0 O1 a' ^( L8 Z: G
  742.         shr     bx,3
    + J5 u2 F( r! ?5 k' F
  743.         add     ax,bx
    + x6 F7 b0 _- q2 d6 f3 A
  744.         shl     ax,1- b' P' R8 E0 o# Z
  745.         mov     di,ax  z/ o3 E# x' B! u+ h  w1 M6 c- |
  746.         mov     ax,0b800h
    ) ?7 j& Y* d$ H$ a3 G' m+ V
  747.         mov     es,ax5 o, {- a4 y- H
  748.         mov     ax,es:[di]
    + {- A6 n" ?: A- }5 u, |1 r
  749.         mov     cs:[save_char],ax! f( R8 _" t$ h! Q
  750.         not     ah
    9 W$ n! D$ E& c( b! H) B
  751.         and     ah,7fh
    * R+ ?- ~4 t+ T+ c8 Y
  752.         mov     es:[di],ax% F" n7 Q; m) U: W1 Y' _. y2 d
  753.         pop     es
    9 D$ ~0 W$ P4 e+ c& J& f2 h9 D
  754.         pop     di
    8 i# S) X$ G4 Z6 ~
  755.         pop     bx/ `. q0 l) ]6 i" Q2 ?# A+ h
  756.         pop     ax
    ; q7 J$ X, j) Z
  757.         iret9 ^. `# F  s. U

  758. 8 s, N) T, y6 F: v) ?& o3 u! |
  759. _hide_mouse:
    0 N2 q" L( _. g1 e4 W) w1 |
  760.         push    ax
    / Z8 a2 p" r- F1 E
  761.         push    bx
    # Q" W- Q8 n& M, n
  762.         push    di3 a3 c  b5 `$ ^& d
  763.         push    es+ K" }$ h' ~$ O8 y
  764.         mov     byte ptr cs:[sm_flag],0% G& z8 [( ~1 b. P' \
  765.         mov     ax,cs:[pos_y]
    , u, T) z$ d2 C- V/ ?. h1 `3 Z
  766.         shr     ax,3: r! A+ [$ n! s3 ?% v# x+ m3 z
  767.         mov     bl,80
    - u" |: @+ D' s& o& J, T( K
  768.         mul     bl  N* h' p+ @( m% H  i
  769.         mov     bx,[pos_x]4 i' g( z& t0 T, A* D5 U3 l
  770.         shr     bx,3
    . n8 i; J- E* t4 f9 J$ @% V
  771.         add     ax,bx
    ( G8 J7 v$ e& O- r! ^: u
  772.         shl     ax,1. S. a* O0 y4 l! q3 S; Y6 A
  773.         mov     di,ax/ ]9 j* K, |# f1 e) j
  774.         mov     ax,0b800h3 r1 [: T; u; x" ~: a  {, n
  775.         mov     es,ax/ j' c+ P+ I$ f
  776.         mov     ax,cs:[save_char]8 u% `! R$ N7 v
  777.         mov     es:[di],ax
    - i+ b1 ^0 d+ X' c- K
  778.         pop     es; r2 v# W' O5 z% Q$ ?" U
  779.         pop     di
    ! L5 z: l5 L) h1 l! l. n! x4 c& s% @
  780.         pop     bx
    . ?* j: ~& I! O! T7 n# t  W
  781.         pop     ax( p1 ]3 }! i- }+ @2 h
  782.         iret
    . B6 F& C3 D& z! Q

  783. 2 L; I' A4 u' ]" i) A
  784. _set_pos:
    ; M- {, H/ X' h8 Y
  785.         mov     cx,cs:[pos_x]
    ! k4 o% v# C7 R
  786.         mov     dx,cs:[pos_y]9 B- T/ A# {: D, O1 V
  787.         mov     word ptr cs:[x_move],0
      z7 b+ x( c  k- ^& U4 f: M8 g0 a
  788.         mov     word ptr cs:[y_move],08 y6 k2 K* }  S4 b
  789.         iret
    % v) }* z6 m' N0 H

  790. ! f1 L2 x0 j1 y$ l3 q
  791. _set_hor_pos:
    # z7 i0 Q  O1 c1 C0 |( G
  792.         call    max_min
    3 x1 l. q6 w) O/ O' _$ k( j$ r
  793.         mov     cs:[x_min],cx
    ) Q' N* `4 S0 L3 Q& v( p+ G9 K
  794.         mov     cs:[x_max],dx" S+ O3 }5 v+ H1 f
  795.         cmp     cs:[pos_x],cx& z9 F9 H3 g  }$ Q- _' v1 E
  796.         jge     good_hor_min8 a% F+ Q; O( ^% s0 H
  797.         mov     cs:[pos_x],cx/ F/ J  d$ O& }
  798. good_hor_min:
    6 p2 V& {7 M) M& Z0 X1 j
  799.         cmp     cs:[pos_x],dx6 b% u1 s: {6 R& L
  800.         jle     good_hor_max
    2 U+ q( v  I- ~( G, B
  801.         mov     cs:[pos_x],dx! A; I9 [: n) M; U3 j
  802. good_hor_max:. w: h7 r6 h, _
  803.        iret1 S; A. Y* B! X& q5 O
  804. * j5 Q8 G6 ~* R4 N/ q
  805. _set_ver_pos:
    6 e/ O: \0 x: f' W! i; v
  806.         call    max_min; Y/ [! G0 e; v+ ^2 f' a+ D
  807.         mov     cs:[y_min],cx
    ( o: k5 i+ }1 Z+ h
  808.         mov     cs:[y_max],dx) C' r# F7 r7 f2 c
  809.         cmp     cs:[pos_y],cx
    ' n) ?2 S& T/ C2 b1 T
  810.         jge     good_ver_min
    3 O; I. Q: y% ]# y% ^: H8 {
  811.         mov     cs:[pos_y],cx6 n! }8 u; f. d3 l; N
  812. good_ver_min:* n7 c1 }" a1 z6 `$ Z
  813.         cmp     cs:[pos_y],dx' \+ N3 w9 e) e; r0 x( j
  814.         jle     good_ver_max
    - [' M, Q3 Z; D
  815.         mov     cs:[pos_y],dx
    # T" Y% |! U9 |, ]0 s5 |! U
  816. good_ver_max:
    / Q2 V1 n! J# N4 B
  817.         iret
    & R% U) ^4 [- a$ }

  818. 1 c( J& m6 K* ~. Y4 v! V
  819. max_min:
    ) ~& x6 H5 L* a3 r
  820.         cmp     cx,dx0 G) _  f4 u% H; n0 U  R" w! G
  821.         jle     no_swap; H  X0 s9 J# a; Z9 j& j
  822.         xchg    cx,dx9 t8 M) C! O. q/ \" A; {
  823. no_swap:7 s2 z9 r9 W# E, n' N
  824.         ret4 ?( H- Z+ X- {4 H$ q

  825. ; f' h. i2 b# M" h2 G
  826. _set_subroutines:
    * c- w% h5 o- \# S' ^$ b7 z
  827.         mov     cs:[user_subroutine],dx3 l3 F6 H; U4 R% e4 B0 _+ z
  828.         mov     cs:[user_subroutine+2],es6 {$ k! U. Q# _! b2 f+ t9 x
  829.         mov     cs:[user_mask],cx3 s" x6 P# b) n  g
  830.         iret- k6 L3 l0 Z2 P# f6 F

  831. ! p7 n& q' w" J+ b! \2 k6 i/ h4 ?4 E- p
  832. _swap_subroutines:
    # H( B! F5 ?# n2 o1 ~( f% d
  833.         push    word ptr cs:[user_mask]
    : f5 V2 i$ |# _
  834.         push    word ptr cs:[user_subroutine+2]
    , P& T5 s9 S* R$ H2 y5 g  [
  835.         push    word ptr cs:[user_subroutine]: R( H" @( {- w/ |6 ]0 x. X
  836.         mov     cs:[user_subroutine],dx
    6 X) z' ^: [: F- a0 x* M
  837.         mov     cs:[user_subroutine+2],es9 ]' o: v. f8 ]7 z
  838.         mov     cs:[user_mask],cx% ?$ ?8 u+ _* T6 T& B$ d# {3 a
  839.         pop     dx0 b  J) _! n) {# F, t0 R
  840.         pop     es
    # T5 Q- n/ `' }7 |
  841.         pop     cx
      s! x5 ]+ h! A0 A  Z7 e7 x/ P
  842.         iret
    ) Y1 z1 \7 J# o6 E1 j: o. q& s
  843.   o2 Z" p$ d! ^7 E& u
  844. memmouse        endp: _8 v3 k$ z8 `2 J* S, ^1 J

  845. : J- L5 l2 r1 i% g
  846. endof_start:0 X1 V( m$ W' [  V4 X
  847. + B/ Y% x1 ~1 }; q' _
  848. emsg db 'No mouse driver install error!$'
    3 C! D7 _7 P  Y) [! O
  849. old331 dw 0% U: i6 d. y: \' f* g) o- \8 {8 M
  850. old332 dw 0$ [! V8 N, r, `3 [# B) u* r; H) S
  851. old741 dw 0- G$ ]5 N3 o7 n" o- ~
  852. old742 dw 0! S' ~# ~( ?$ x7 ]6 N
  853. memcopy db 0
    4 Y; s* Z1 B8 p9 k8 O# |* O5 Q7 i
  854. okcheck db 09 C; F. j) d" @
  855. pass db 0
    : x# p  t4 C8 u  c3 K
  856. chkl db 0
    . T8 Y5 r6 y( ?! D' A- j
  857. lk db 0
    0 K9 }$ r3 b# K$ k2 Y  k- s3 H9 d
  858. chkr db 0
    * X! ^! D( \- v+ ]4 u7 H
  859. rk db 04 B* x& ?' C8 H6 M- B
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '- L. O" T" p2 Q: \
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    ' o3 L. ~4 c' C6 E$ E/ J2 r
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    7 i# e2 C/ {' b/ s6 G& z
  863. db '                                                                                '
    " }, U5 Q# r0 }& Z( |
  864. db '                                赏屯屯簧屯屯突                                  '( J2 b% ~/ X! j7 i0 x2 T' Y! U  X  m: r
  865.         db      '                                ?OFF汉OFF?                                 '8 X; D5 J* }) C9 H, G+ [
  866. db      '                                韧屯屯既屯屯图                                  '" G9 t- G" u. l
  867. db '                                                                                '
    + g2 J. {7 \# I/ L. m5 s0 h
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '7 s8 M1 n0 d; T$ Y4 f
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' : G% j9 n, l* D& V
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    3 ^4 ~4 R- d8 P* \
  871. 0 S, T5 @- Y$ J9 n2 l
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!$ u# `% Z' E, e9 l  a
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
4 y- m7 n" g/ M- ^/ e  C3 S2 P" ^+ k1 F( i/ e5 s
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 04:53 , Processed in 0.040890 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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