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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
1 o+ t& j( A4 n; O- @% G. a# S/ `
) _* j9 B, z1 k1 P9 c代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    0 S# S! y& `) u. ?# ]4 ~
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    : H- g! d# e, Z/ ?
  3. ;                                         By Bini.Yi 易祝兵3 N# k! D/ X$ _9 H5 c: A
  4. ;                                         http://www.ufoit.com 计匠网- v1 |! ?% e" a- @/ L' s* C
  5. ;                                         2002/04/06 YYYY/MM/DD9 F+ S1 }% D+ `: W& d3 x+ A
  6. ;8 K7 |1 a, v/ _
  7. ;         
    3 p5 ~  E/ P' o
  8. ;          This program  test the mouse button  click and move.
    0 x. v# ?: m6 k" s8 I+ g
  9. ;1 \' h, l, O# e; _2 _3 |! e
  10. . h/ u  |6 O7 I: c+ ]' ]+ a
  11. .model tiny
    0 M' x; w( D' F. _' X/ ^
  12. .586
    : |$ z( E- s2 h& R0 J2 A
  13. .code: v$ U8 K: z$ |- Y/ X: B4 L
  14. .stack  100h
    / }" B0 z1 F4 X0 t7 _
  15. .startup
    6 `# o5 R  ?) ^$ m
  16. pusha
    ; j, c4 j' X8 K' w2 l
  17. mov ax, 3533h  [# O) j+ N; F/ b# i4 s
  18. int 21h
    1 v- s* J+ L, [- `& c7 [
  19. mov word ptr cs:[old331],es; \, h( G% g0 f0 f4 {  G2 K0 r
  20. mov word ptr cs:[old332],bx. o5 R' S! `; X7 c/ A* H
  21. mov ax, 3574h4 I7 {. ?/ @5 {  o3 o% f! u
  22. int 21h- H' N& s  [$ L; W- j" h; S
  23. mov word ptr cs:[old741],es
    # z8 E5 o  R, Y0 J+ o8 b" z* q+ y
  24. mov word ptr cs:[old742],bx
    * R8 `" r# i- w' U: i8 Z
  25. popa; D6 E6 I7 Z3 j* [2 H
  26.         call    memmouse
    9 P9 ~, t1 v$ J& c5 }5 K/ I) }
  27.         mov ah, 003 q9 u! \+ v0 u( J
  28. mov al, 030 ^# e, L9 F$ `  U: E6 G: a' [9 G4 }
  29. int 10h
    ; r& A6 ]) V% M- h2 z+ [
  30. mov ah, 06
    ; |) i. m& R! Z- A: c/ d9 \
  31. mov al, 0
    4 P4 ^# K% E7 F
  32. mov cx, 0
    ( E# g  Z! P) @- i* L3 \3 W" \
  33. mov dh, 24/ w8 m, z  |% X4 s$ I& z7 N" G
  34. mov dl, 79
    1 h4 x+ o4 g2 p, {) O0 Y5 p. H
  35. mov bh, 07h5 @4 W& c' f# O8 e
  36. int 10h3 E) O! i3 m3 h; C( e" n
  37. mov ax, 0000- x9 x) B0 o8 S1 m2 _) M
  38. mov bx, 0002. L: |' Z! `$ u/ y7 o( S
  39. int 33h
    ) j0 T' `$ e- \& ?/ l3 f
  40.         cmp     ax, 0000           ;if no mouse drive install0 W% K* ~; |3 ?1 m, H0 `
  41.         je      errormsg           ;show error MSG* f' Y' ~7 I1 K* r' C
  42. mov ah, 02
    : p" J/ }* J/ }# o: n
  43. mov bh, 00
    - u5 e$ J7 d& q. A) \) t2 H, i
  44.         mov     dh, 25             ;Move point out screen, e3 W( w& `. V% T, k$ d
  45. mov dl, 79, P7 P6 t( |8 ^3 u) Y
  46. int 10h6 G0 c4 M- C, F; w; \/ e
  47.         call    showmsg            ;Show info
    7 v" L8 t* j9 v9 U
  48. mov ax, 0001
    4 Z5 R0 |* _$ b5 I
  49. int 33h4 T) K! V9 K* e4 G+ A; u8 g3 \( B9 F
  50. ; mov ax, 000ah
    9 s* r, [: z) v. i) m
  51. ; mov bx, 0000
    3 P) n3 \) L  N( Z8 \: c) b
  52. ; mov cl, 0h
    ( D1 ?2 w9 L9 S; L4 m
  53. ; mov ch, 0F0h
    " z6 k9 U1 p$ u$ B  n' \# ~0 L
  54. ; mov dl, 0h
    ! l( n. M* B$ r
  55. ; mov dh, 0F0h
    & x) O5 X% @( ^7 b' }, s
  56. ; int 33h. `1 A! W$ t& n- c6 F% p
  57. mov ax, 0004h
    - a) Y  M$ Y( }' Y+ A2 D' E3 l
  58. mov cx, 0319
    " g! C1 C8 T9 l, q
  59. mov dx, 0103
    : _/ `+ D) p: Y7 S) D2 g
  60. int 33h
    - H' h4 X& B" D! `
  61. casemo:                           ;Case button click and point move , \' V8 F2 W3 r; k, t5 h
  62.         mov     ax, 000bh         ;and keyboard press
    ; U9 g, Z3 ^6 J4 `
  63. int 33h/ V- ]! d( M0 X  d$ N5 I  \
  64.         cmp     cx, 00h           ;if point move....X
    9 l7 H& ?7 E- E: q/ G9 m3 I4 V
  65. jne xmov, \- m. f2 I) q( c- e+ x
  66.         cmp     dx, 00h           ;if point move....Y+ n- ^: s; J8 G0 b
  67. jne ymov
    2 E: g1 W+ d* R, W0 I: e# c
  68. xymovend:                         ;X.Y move end
    : a9 G! r( E& \' U3 Z
  69.         mov     ax, 0003          ) \! c$ r- Q5 J9 o% L
  70. int 33h: w) ]' V# ]" l4 J
  71.         cmp     bx, 0001          ;if left button click  show ON& d$ Y- w+ q0 x! T( o( U1 d
  72. mov si, 18284 |6 R$ {! q& |9 x' J' k/ |
  73. je listl
    + b" T+ N* ?/ a
  74. mov si, 1828
      I: u" T) n2 Y0 B
  75.         jne     nlistl            ;if left no click show OFF" b) J1 X% Q( e4 T1 Y
  76. testr:5 F; G; H. J5 r
  77.         cmp     bx, 0002          ;if right button click show ON" i6 `' b( A' s# P; ?
  78. mov si,1842
    . v" v8 a, }4 ?/ N0 X
  79. je listr4 G* {- Z8 O! k% Y2 H
  80.         mov     si,1842           ;if right no click show OFF; B+ E, v. l* V
  81. jne nlistl( Z0 E/ {& m5 S" {
  82. casekey:
    & n# z- H/ J5 u* G: |9 e9 |, O
  83.         mov     ah, 01            ;if any key press jump check8 ^$ \0 Q& C8 U' E9 J9 ]
  84. int 16h
    " ]0 M( d* Z( J0 P+ ~8 f
  85. jne kpress
    , i, D' U5 y: s" H" A
  86.         mov     al, [chkl]        ;check x flag  o3 L- \$ L( P  k8 r
  87. cmp al, 02h+ n6 ^, ?( S: P
  88. jnb chkok# J7 p& J; S+ M4 ]5 R
  89. jmp casemo
    ) D; h: b( i; o5 o5 e9 {
  90. xmov:                             ;if X moved, get the X flag+1$ P2 E0 c* L8 Z0 C0 `4 Z( [
  91. mov al, [chkl]+ J$ A3 j  ^/ f$ `: @9 p0 l, F( E
  92. inc al
    3 x1 |' B8 o, E( N7 M
  93. mov [chkl], al
    . h% k* q: H& G: X8 s
  94. call passok9 |$ C) j2 u, l3 T7 ^! s
  95. jmp xymovend7 h  G  |! }# W5 Q1 `$ i# I
  96. ymov:                             ;if Y moved, get the X flag+1
    . d* E+ O" \8 s; W: D" _& A
  97. mov al, [chkr]
    " a" o" f  p" }- E) n' F# K. Y: _
  98. inc al) J- ]' Q: i6 q' K0 u; C4 Y
  99. mov [chkr], al1 [; |$ M/ g' t+ g5 {) @
  100. call passok# J3 f, U5 A$ J0 b# i) Z7 z, Y% M
  101. jmp xymovend( ~2 {  S# s& J
  102. 8 l9 W: Z. G! s" t5 U5 g5 a! ?& Q
  103. passok proc near. P7 S. r4 ?4 K' F* f+ a
  104. mov al, [okcheck]; M+ {: a( \: s
  105. cmp al, 1
    4 }% d1 e* |, R! @% y, V( P, c1 j1 x
  106. je let0
    $ x) s# F* o, F, E* `# ]8 T+ a
  107. jmp passret
    $ u+ n" d: N! {; P/ G. Y$ F7 [6 ~$ g4 Y
  108. let0:
    ' J5 E' @$ u5 h. h, f
  109. mov [pass], 1
    ( o* [0 [* |0 \7 D  P3 g! e% u
  110. passret:/ q' Z! ~6 \# B! c0 K/ i& y
  111. ret
    ' [- e. ~6 E; ?4 R3 y% r; ?
  112. passok endp + C( p1 k* I# `3 _9 r+ T4 l, P
  113. ) c5 s/ r3 f0 d
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS- f6 f' P/ k1 N
  115. mov al, [chkr]
    ; [: `# J$ y3 J
  116. cmp al, 02h
    ) b1 H" f$ q7 I% v, f
  117. jb casemo
    3 T' C( n6 v3 O# @$ O& I" K
  118. mov al, [lk]% A6 `& m8 a7 V
  119. cmp al, 1+ u, z" j- ?* T  Q6 S' s! v+ E
  120. jne casemo# r4 v) q# }! l6 u( r2 Q% j
  121. mov al, [rk]
    # L3 B8 j' b+ k1 r
  122. cmp al, 1, q' I/ o+ w  \) R
  123. jne  casemo
    . Q9 N, [( V! K3 d$ B
  124. mov [okcheck], 1
    4 j% A9 m4 Y* Y5 p# d9 ^+ H
  125. mov al, [pass]
    3 v8 S/ P; A: x
  126. cmp al, 12 T4 C" @% B3 y( F$ `" v6 N
  127. jne  casemo7 t- k8 z6 Q6 l# r) G
  128. mov ax,0002h
    9 t- V* D3 c2 ^& i7 {- S) [2 S# j
  129. int 33h0 v+ Y2 o5 D  y1 a% Y) f* c
  130. call cleascr" K, P, a* o" M
  131. 2 L/ V6 v9 _9 u2 @: t
  132. call oldint
    , P1 S6 U$ |) r. @/ L
  133. mov ax, 04c00h# L) u0 G# a9 x4 y% L
  134. int 21h# u% E% H) ?6 `
  135. . T5 I( Q: N; l. u: E
  136. okexit:5 z( s0 W+ Q7 p1 {! m/ k
  137. mov ah, 4ch
    4 G: e/ Q# |  F/ w0 x. v4 U
  138. mov al, 0# x. K4 m: C5 Q6 O4 z+ p
  139. int 21h/ c2 x1 f  L& e: ~% N
  140. listl:                                 ;Show ON/ \  D. s; W8 a& }- z' E5 ?
  141. pusha7 \3 W  h/ n; S1 R
  142. mov ax, 0b800h# ~' G* b9 ^0 T* p. F
  143. mov  es, ax, n' f: J/ B7 Y! z( H
  144. mov ah, 47h
    ( g" c$ a+ |- p& Z) S. F
  145. mov al, 20h% D" q, Y$ s' v' F2 g, f9 F
  146. mov es:[si], ax
    , z8 \" e9 [4 S8 ?5 `
  147. add si, 02
    9 t8 M  V0 S6 S% y* g
  148. mov  al, 4fh; l  H9 R, Z! h) G! H% H
  149. mov es:[si], ax% O' h. B& ~+ T  h
  150. mov al, 4eh
    . c; G! b2 @! x4 Z' a# C% G4 e9 {
  151. add si, 02
    $ s' J, x, t; G# O2 M
  152. mov es:[si], ax3 k1 b' @' f8 `7 o
  153. mov [lk], 1
    ' U' E* C: e) B
  154. popa2 u8 r1 j2 T( ^* ~8 o: V; i
  155. jmp testr" _9 \* B( S" k. E
  156. listr:                                 ;Show ON/ _( R+ |7 ~* W% D5 m; k
  157. pusha
    $ p* N7 k  C% l
  158. mov ax, 0b800h
    , k! t& \& H; h: Y: `9 u0 U! g
  159. mov  es, ax
    " V4 y- `" s$ j% [8 s: V
  160. mov ah, 47h
    4 ^% t" \- [( J9 S
  161. mov al, 20h
    9 p1 p# r! d/ v3 g+ L9 V, x7 [* ^
  162. mov es:[si], ax& F: g) e7 i! ]& I" z$ S
  163. add si, 02
    4 ?( t4 v5 K& j  r# x
  164. mov  al, 4fh! J' O2 b, v% K0 _% ?
  165. mov es:[si], ax5 F6 I5 X5 T+ Z2 X# B# ?3 X0 J
  166. mov al, 4eh
    $ j8 X; [& q5 C/ b
  167. add si, 02
    5 N$ j1 o5 Q5 M# L  x$ {6 K  e
  168. mov es:[si], ax' ]4 D$ }, t  b8 {
  169. mov [rk], 1
    2 b/ f9 c- R4 L' [
  170. popa6 i: t$ O$ V" E
  171. jmp  casekey2 L8 a6 Y, c  B! d

  172. ! d$ u2 k$ C( B' x& ?  m# T
  173. nlistl:                              ;Show OFF0 m* Q7 x" \8 W/ n9 ?; ?% h) ~
  174. pusha   
    - W! X: M2 B+ `+ Z
  175. mov ax, 0b800h+ C! e/ X3 W0 c2 C
  176. mov  es, ax
    : |5 W8 u4 d" `/ m. ~+ A' W, K) U
  177. mov ah, 17h5 x9 m  j- p8 _1 t& C7 @9 [
  178. mov al, 4fh
    8 }* z1 ]/ c" t6 [: p0 g# I+ g
  179. mov es:[si], ax; [  I. e7 o9 G/ x7 t/ N
  180. add si, 025 G( J) C* z& Q
  181. mov  al, 46h9 a, u; {  a; Q+ S% L# s
  182. mov es:[si], ax
    8 `6 {3 c. W" ]0 e, K" d  D/ t
  183. mov al, 46h
    - \  J; I3 U' |8 l3 r
  184. add si, 02
    ; I; S  ~; |0 {" B
  185. mov es:[si], ax) ?* R3 t4 s( l, Q0 c# }
  186. popa
    6 ?: U2 w0 c$ k+ C: z
  187. cmp si, 1840
    . R+ M& C$ s1 L6 v- G
  188. jae casekey
    " D6 c, k! l: ~$ v+ L' R+ y5 V6 J) r. J
  189. jmp testr. n* ?3 |, X8 W; C: d4 X) A

  190. 2 I" I/ q! l2 o- E8 @  `: X
  191. kpress:                             ;Check key press if press<ESC> then EXIT, l* C8 v9 D& L: S
  192.         cmp     ah, 01h             ;and return a error+ `! T  N, f( {" Z3 |, p
  193. je exit1& ]" B$ `) `3 u. }
  194.         mov     ah, 0ch             ;if press other key then clear6 U6 Q/ H' J. Y( L' D3 E% ]
  195.         mov     al, 00              ;keyboard buffer* R8 f3 z9 h! m6 K) b1 B
  196. int 21h
    9 z9 f7 ]  j! f' k! O5 g
  197. jmp casemo 3 U, S. H0 f& U) \8 q
  198. ( F# ^& t1 H# B; {! e
  199. errormsg:                           ;if mouse driver no install
    ; q7 S( \& D" w/ j% ]
  200. call oldint
    % @0 p+ ]' D1 c8 ~$ ?+ ?, s' w
  201. lea dx, offset emsg
    ! U  S+ W7 s% T  I+ I, i
  202. mov ah, 09h! Q% _# f6 T7 I5 T1 d0 U
  203. int 21h
    5 X% L) y. o: A. @9 N  V" g
  204. mov ah, 4ch8 z& m% e. i' l# R4 V0 p- ]6 C
  205. mov al, 2
    0 l9 p6 p9 S! @3 s5 {; r$ i- c( u
  206. int  21h
      d- F1 k; @+ @+ _5 O' P3 o, K
  207. ! @* o7 g- {6 I( Y1 A/ P
  208. exit1:                              ;error exit
    3 D' o) V% _- n/ u5 b$ G
  209. mov ax, 0002h
    ! _  }0 f" h* Z2 ~: @- x
  210. int 33h3 W+ x( L* f2 d  e$ Q+ L
  211. call  cleascr5 V, r" c! y2 y. J
  212. call  oldint
    + K' z, k) p* x/ H1 {" L2 P
  213. mov ah, 4ch
    & |/ _6 X: S: [1 d9 `
  214. mov al, 01
    * N' @, k4 J3 A, N$ Q
  215. int 21h
    ( I  W% G4 M4 `, n( y3 j% h- V% P

  216. $ j" U& C  N" U+ n9 z5 F
  217. cleascr proc    near                ;clear screen
    . C# j& d3 `/ t# I( Z0 c3 k
  218. pusha9 D1 r( D+ }0 k
  219. mov ah, 06
    3 C5 Y  m9 \  p8 N- P% ]6 S+ o
  220. mov al, 0
    : a, e6 |4 i6 p7 L. }$ v3 w
  221. mov cx, 0% }% c. Z7 L8 Z! j2 Z. @
  222. mov dh, 24
    / t) e, L! x. j( R  y" r
  223. mov dl, 79! R! J, M5 w  ?' g* J
  224. mov bh, 07h2 T4 `% i4 a- ?. g- f# e% T8 l
  225. int 10h9 }* ]& ]. F' o+ ?4 q/ g, ~# N
  226. mov ah, 02; n, P# L5 z% I" ?: f. ^
  227. mov bh, 00
    8 p2 h3 o% h4 V, ]3 v
  228. mov dh, 0
    3 w8 B* m! @8 x5 d, a! ]
  229. mov dl, 0
    * V5 D. s+ l+ B6 A+ y
  230. int 10h6 U2 A1 O. ?. q/ M( q
  231. popa  s8 ?1 C7 L. U* r' r1 I
  232. ret8 `* s. v- H' o; h
  233. cleascr endp7 I! ]* G/ k: _) n* x9 q5 K
  234. , o+ W1 N: z) Z$ \( Z: y0 k
  235. showmsg proc    near               ;Show info
    5 ]9 E' Z1 q5 D' U5 [4 n7 w
  236. pusha
    ; e" R& N) W' W; V  r
  237. lea di, offset showms
    * H3 Z# J6 q6 U6 }+ E$ V6 X0 U) s
  238. mov ax, 0b800h. A2 F+ |4 W$ ~9 X
  239. mov es, ax
    1 k5 ^6 t, a7 n9 j7 J
  240. mov si, 0  O& [2 \6 O3 O  u* L- c; Y6 `( f
  241. mov cx, 480
    " Z* G3 j. u* n/ H  b; o8 Y
  242. mov ah, 07h+ \. ]+ t# @! x# o- P# D7 T2 a) O
  243. @@:
    ( ~1 r. p8 g  ^1 C
  244. mov al, 20h5 S* V; e  M: F8 y
  245. mov es:[si], ax7 A% R. G* a/ \3 V: g4 W
  246. add si, 29 y. c& a6 i+ I. h' n: Y+ T
  247. loop @b" m, t4 K) p% M( ^8 n' ?6 _
  248. mov cx,880
    : [$ ?8 R" {; I, [% Q6 I6 U. V
  249. @@:
    + e  Q+ k7 F; Z3 ^- U' v
  250. mov al, [di]3 o4 @$ [. a: @! n0 ^
  251. inc di0 f  @& @* \, J" F4 E! s
  252. cmp al,20h
    . N5 g! G/ o) f6 I
  253. je showch1
    # m8 O! x6 P# \* R
  254. mov ah, 17h
    ' ^5 J  K9 e  x9 m: n3 o% H
  255. jmp showch3
    5 H" D: Z; C' T6 M8 {7 S
  256. showch1:
    ) r3 V! `* r' Q0 g2 d0 r
  257. mov ah, 07h
    8 i/ i6 D% F. @5 d1 y; g3 h5 Y
  258. showch3:
    6 W) R9 |* S# ]) g
  259. mov es:[si], ax0 `! z- }) G) C
  260. add si, 20 Z: u: \; _$ t# P" s3 ~
  261. loop @b
    2 M6 E$ N9 z6 T' R7 h% z0 a
  262. popa$ `" B) C. B9 }6 M( n. y; p
  263. ret' p8 d( l) k; z2 Y  e$ I, }' ^, _
  264. showmsg endp
    ; n. {8 X+ u' d! A! v

  265. & F; E* y5 M: n1 a) \
  266. oldint proc4 r4 L: L; i" ~4 t
  267. pusha" _" O2 o# w: U/ b
  268. mov ds, word ptr cs:[old331]
    & X0 z* J* r# q- _  }, a
  269. mov   dx, word ptr cs:[old332]  i# O! a  O+ n. q+ C
  270. mov ax, 2533h4 ?7 W5 W- G0 M2 S8 u& |
  271. int 21h
    8 d) A: E" m1 r1 K. {( v
  272. mov ds, word ptr cs:[old741]: S. X) n* e1 |
  273. mov dx, word ptr cs:[old742]' Z# B. D/ ]5 w0 m; |
  274. mov ax, 2574h
    1 y# a6 b, M7 N: i0 N6 g: m
  275. int 21h
    + U, q$ X0 C: k4 z' Y+ f/ D
  276. popa
    3 {4 M! \2 z+ v1 T: b0 m
  277. ret: @4 y9 D! h8 X
  278. oldint endp
    9 y* Z1 `- a/ K  G% H6 @; M

  279. 6 L8 F  O! c- X6 c$ G
  280. memmouse        proc
    0 }4 a( C1 N7 B* k/ b8 {
  281.         xor     ax,ax; m( V4 H, y( U, |1 K; b
  282. int 33h" R! ^7 t, y" j) [. Z: I
  283. cmp ax,0ffffh
    ( a9 V! }. `4 o2 K  ^! {$ X
  284.         jne     not_loaded
    5 m8 c/ Z, c* n- k
  285. mov [memcopy], 1
    0 D2 E( o* G0 }5 c" R2 @! C
  286. ret8 I, @4 B2 h( Q& Y
  287. 7 B# M0 V1 c5 x  H) m- C0 B
  288. not_loaded:* M7 e$ t* x1 d4 k  ?6 ]+ z: H
  289. - m* r" N4 ^( Y
  290.         mov ax,2574h
    5 V) e2 @, a% I$ L. Y, t
  291.         mov dx,offset new_isr
      g" {- `% p, R6 g! B7 f3 v/ y
  292.         int 21h
    . G1 V% Z- {" R/ z/ K. O0 M0 l
  293. ! J* r; p4 v# p& h
  294.         mov ax,2533h
    . L+ o  t; m# z9 v. p
  295.         mov dx,offset new_33" H% e# T7 T5 t, j9 W+ `, ]3 o
  296.         int 21h7 y$ k! r8 e# W- F

  297. ( V% a6 m) V; G; t  l- r$ j$ {
  298.         cli  |0 }, A* A$ Y4 P9 @% M
  299. 8 o8 ~7 U# z7 H1 r
  300.         mov bl,0a8h& O$ i$ [' k7 w* i3 p% m% o
  301.         call keyboard_cmd* N6 Y4 Z$ b  H, D6 Y! g6 Z

  302. 2 I- T. K! L" e3 m5 t1 {
  303.         mov bl,20h
    * v9 K# T& m8 h- n7 D: t# i
  304.         call    keyboard_cmd
    6 I) \" [9 S. o7 @9 p
  305.         call    keyboard_read
    1 o# D6 O6 W  H" S, U3 f3 A* [
  306.         or      al,2, q9 r$ ^; \% F8 |
  307.         mov     bl,60h- }. N7 I4 n$ H; W. z- A% w' r
  308.         push    ax) Z# U- ^, R3 T4 y/ [0 Q
  309.         call    keyboard_cmd
    ! B2 V2 N: X8 |+ v7 b2 D
  310.         pop     ax- [, e' v0 {& y( d9 A
  311.         call    keyboard_write
    ; Y: B/ K4 q/ k
  312. ) A  V$ h6 Z* v+ u3 F+ o
  313.         mov     bl,0d4h% L6 j# z& ~6 Z( C' ^; n! f
  314.         call    keyboard_cmd7 r5 a+ |) p3 U  ~9 C
  315.         mov     al,0f4h
    " x8 I( D6 Y7 i: V1 x! k! L$ z
  316.         call    keyboard_write" z. \' W4 S. V/ _; {
  317. ( O. C! v* C! ?* o
  318.         sti! y" M# U) U. O* A9 C
  319.         ret$ _: A2 f3 S/ U& ~+ x, K' |) `
  320. call_user_isr:( [, n( @3 ?, Y) {
  321. db      60h4 d. }* m  x$ V  B7 |2 i
  322.         mov     cx,cs:[pos_x]
    1 O( `* r1 z& n' }- s7 b
  323.         mov     dx,cs:[pos_y]# v1 z+ k/ G) u) m* I7 k% F
  324.         mov     di,0 ;cs:[x_move]& g. y1 j+ `" j& B/ U1 ]; O: X
  325.         mov     si,0 ;cs:[y_move]
    5 O9 I" A% A3 V- F+ R
  326.         mov     word ptr cs:[x_move],0
    + f- I; ?# h1 t  e
  327.         mov     word ptr cs:[y_move],0, f( ?' p5 S! f8 @; U
  328.         mov     bl,byte ptr cs:[buttons]  |% G% s! t3 t$ }6 m9 S# e1 Z, P
  329.         xor     bh,bh
    $ X% e- l- e3 a' S; t
  330.         call    dword ptr cs:[user_subroutine]
    ) F' V9 `. C/ y: g8 w
  331.         db      61h  u2 f& K% b8 q9 \& X4 v* y
  332. ret
    2 T6 p4 [, m6 i9 |# W8 X4 v) L
  333. new_isr:+ i$ X8 o4 F9 V! d: x4 C; Y- d6 G
  334.         pushf! C% G7 G5 s7 E. t/ ^8 o
  335.         cli
    7 c9 P7 _& a; M4 a
  336.         push    ax6 Q8 Y: i# X* u- B! G" ~) ~
  337.         push    bx: Y6 k" L9 B. J$ ^
  338.         push    cx; j! Y3 L- t& b; b$ z- ?1 L
  339.         push    dx, X! |: P* M& [' E  L
  340.         push    di2 D0 }( R. N- g/ ~
  341.         push    si
    7 K# K  O7 ]8 `
  342.         push    es
    $ G7 `1 Q0 a/ k5 i  j; O# X
  343.         push    ds, {  W% P5 s; g1 U5 A& y
  344. 3 ]( H  j7 S. k
  345.         push    cs' v6 X) E( G; [8 l) b8 j
  346.         pop     ds1 M3 s# {0 M3 F! J) E' p. E9 N

  347. 5 K# }4 e8 a4 m! S5 f) y
  348.         mov     bl,0adh
    5 d' i; E* f& Y  |2 }# X
  349.         call    keyboard_cmd
    , c6 ^- F- A; t9 b
  350. ' i6 R2 u* M9 @) c
  351.         cmp     byte ptr [first_time],0
    0 F$ H( A  s) i
  352.         je      not_first_time
    + l( z  C2 o1 }/ k% j) Z
  353. 4 Q6 o6 h! Y% r, M6 X
  354.         mov     byte ptr [first_time],0- n& ^6 y6 G  Y( M
  355.         call    keyboard_read3 [, r6 @' ]5 Q4 C( d
  356.         call    keyboard_read
    ( j6 r6 z5 v2 \9 o- D' [) `
  357.         call    keyboard_read6 J: W5 o) N! Q: v
  358.         jmp     no_show
    ' K4 ~; R2 I& R9 e; o6 m

  359. 9 W7 p+ }) c) z2 x4 I
  360. not_first_time:# c0 k% e7 q) e. W: X6 H" N$ v8 H
  361.         mov     word ptr [temp_mask],03 j; Q6 D: ]3 N2 k

  362. 2 i) {! s& A. C$ U  C5 A
  363.         mov     cx,[pos_x]
    & J5 l7 k- B" g2 I2 p3 t: }# G
  364.         mov     dx,[pos_y]' P  }1 m" ]$ p+ w

  365. 8 B$ Q; b( K, m+ n& L2 M" B" q
  366.         call    keyboard_read
    ( _+ u7 z! F$ E: _! B& n# Q9 H, r
  367.         and     al,7 ;3  z( d6 T. G" ]- U
  368.         mov     ah,[buttons]
    + n- |2 M5 U7 D) d. f8 m
  369.         mov     [buttons],al
    2 G- E  E( _# U* o3 Z8 L2 u
  370.         cmp     al,ah
    5 \0 Z9 P6 b! J, z- v6 b
  371.         je      no_button_change
    / }  y, Z- J' ]+ L$ j
  372.         and     al,3% }2 r  _9 f7 W
  373.         and     ah,30 T3 f) m$ ?; p+ j0 M1 F, X
  374.         xor     al,ah
    - `8 l% j( e- W# r2 M6 ~
  375.         xor     bx,bx: q" h3 t% D% V$ v

  376. " `# g/ x% e4 X& U2 r) m- ^
  377.         push    ax
    3 H2 C+ f) t9 ]: z' X' Z
  378.         test    al,20 o) \* ~# b. l( @# A: G, s
  379.         jz      no_right_button_change
    ' H8 v/ x" C, r6 J* f
  380.         and     ah,2+ ^2 ]1 `- D' [" {' g! O" v' T/ `
  381.         jz      right_button_pressed
    ; D/ Q  s! N  b2 q) n/ C& J
  382.         or      bx,16
    . o( Z; ]/ u4 h5 I
  383.         jmp     no_right_button_change
    # E& N3 g3 f  j3 O
  384. right_button_pressed:
    7 d6 `; F& j) D' {* u- w) p* c
  385.         or      bx,8- Z! j% N- W7 }  g% F+ ~  x
  386. no_right_button_change:
    3 l6 Y& j; P% I, ]+ J/ \9 L: M

  387. : {* g3 Q7 q: }# S- m7 z2 f
  388.         pop     ax
    ! {1 z0 s2 r* M$ S. _
  389. ) g1 l9 E1 M+ F. C
  390.         test    al,1
    & _( ^: v9 p) j# c' h
  391.         jz      no_left_button_change) ?) G: r  t1 C2 [$ @- p: Q
  392.         and     ah,1- H# w  a3 B3 O2 ]
  393.         jz      left_button_pressed% A( \+ X) b, W9 \) ~
  394.         or      bx,46 r& ^. q1 H& G# y6 M, |- Y
  395.         jmp     no_left_button_change
    1 D  b7 O! h# A6 A3 O1 |, b; p
  396. left_button_pressed:
    7 ~) T1 g  m1 z" L0 G
  397.         or      bx,2: P: a% z1 a7 V% }5 t; u+ n9 p
  398. no_left_button_change:
    * B' T1 V, C8 w, ?1 J

  399. ' i6 U0 Q- [% j% i7 b, l
  400.         mov     [temp_mask],bx
    : C0 O' |& z3 G# y  D) ~
  401. : y- T# N) y! k2 b0 w/ x3 Y
  402. no_button_change:- s) y7 e) _3 B4 M' }
  403.         call    keyboard_read) K/ I: B) Q# M7 ~0 A
  404.         cbw
    , B8 y0 U" l) g' ^1 [8 g
  405.         add     [pos_x],ax$ u# \% O+ Q8 i% j9 M
  406.         add     [x_move],ax
    ) M+ k- M: Z7 L, Q# G
  407.         mov     ax,[x_min]
    % q& W6 c% e! Y+ ~3 ^4 _. }2 R
  408.         cmp     [pos_x],ax. s7 @' o; _% u0 [
  409.         jg      good_hor1
    6 o3 Z2 C2 Q; a% T5 |1 U- |3 Z; }7 h
  410.         mov     [pos_x],ax
    3 t: X: L; \% b5 F; r' a
  411. good_hor1:( y  x. k7 s/ ^: n: P/ c6 L( r
  412.         mov     ax,[x_max]
    % P0 Z0 P* v/ l2 k7 S" C
  413.         cmp     [pos_x],ax8 Y/ ^& t# U6 A- V& z
  414.         jle     good_hor2' c2 J* k: Z( b* j8 p
  415.         mov     [pos_x],ax. d' C1 `2 H$ G! h; @: B
  416. good_hor2:
    3 X. G, J& e+ M' T

  417.   ^" F6 ]: J0 h  w
  418.         call    keyboard_read
    : s- K+ n- [+ m9 }: \
  419.         neg     al
    % @# C! {2 o7 ^4 A4 U( }: ]  k# j2 T
  420.         cbw8 y, X" D0 ~" [$ B: ?( m! c2 I
  421.         add     [pos_y],ax9 v! y% @# ~# b$ k4 g
  422.         add     [y_move],ax8 R$ K6 U5 P" k# z, k6 \! F- L% g
  423.         mov     ax,[y_min]
    7 l) z3 L% F4 l) [2 ?# @" K
  424.         cmp     [pos_y],ax: E" n% j8 |( |, H3 c7 F
  425.         jg      good_ver15 g  l. r" O6 v3 G. a
  426.         mov     [pos_y],ax0 e& a* }9 ]8 U: G! N# b4 L# {
  427. good_ver1:
    8 L! C) E% C5 _6 \1 v
  428.         mov     ax,[y_max]
    5 R9 Y* o+ j* a) A5 E
  429.         cmp     [pos_y],ax) O4 g, j, V1 o, ?% x4 @3 J
  430.         jle     good_ver2
    % v5 W8 l  l3 X6 G. j; ]
  431.         mov     [pos_y],ax& |* w/ d, @# W. U1 X4 X0 R
  432. good_ver2:: O% I4 A% u7 ?6 r2 p

  433. 7 e5 ?1 E! p8 x- J8 \6 `
  434.         mov     ax,[x_move]. |$ {" A) C6 u
  435.         or      ax,[y_move]  G7 d4 c+ U, r+ t
  436.         or      ax,ax5 _. t, k0 a3 Q* y+ |
  437.         jz      no_change_position
    / B( y, e! d& m% \) H* |) f# B
  438.         or      word ptr [temp_mask],13 a: u8 ?8 K' }+ i/ Z- j
  439. no_change_position:
    / e6 p# B, K9 t" C$ _5 X! F$ \

  440. ! }) n: F. \' d8 q+ Y5 y
  441.         mov     ax,[temp_mask]- o$ H5 o1 `+ h% n1 }2 f7 l7 C
  442.         and     ax,[user_mask]
    , ^1 d! E9 k# D' H0 e: G8 E
  443.         jz      no_call_user% N4 v7 S* d( E1 u- t! N/ R
  444.         call    call_user_isr
    4 F1 D) M9 o- N0 I* W6 x+ H
  445. no_call_user:* G  @. U" [6 o9 ^9 W& ]9 @9 A
  446. * H  X2 a. n2 W2 N
  447.         cmp     byte ptr [sm_flag],1  e5 U" T+ O& ~$ u
  448.         jne     no_show1 P' X! V- C! n0 |1 |* j! P
  449. 8 u1 `; S  ?' Q% e- K' ~% Z+ n
  450.         shr     cx,3
    8 K+ e6 E' S! n
  451.         shr     dx,36 B! @+ g: I- i4 b7 w5 N
  452.         mov     ax,80: I3 x" ?) F7 d  {* n- Q9 e0 m- b: I
  453.         mul     dl
    / M1 f" z5 p( o! @$ L) D
  454.         add     ax,cx
    / N# t; ]& O# X$ x. Q2 k4 ~; u
  455.         shl     ax,1# I5 \- [8 c; y. z2 A2 s& C5 @; X6 j
  456.         mov     di,ax( n& S0 g" }, I2 g
  457.         mov     ax,0b800h1 D/ I" x& p' H$ a+ P$ ]' M2 ^
  458.         mov     es,ax: b/ s; |- v5 ?3 U" u' |  S
  459.         mov     ax,[save_char]' s4 x$ @$ o5 s" D3 n
  460.         stosw
    / D0 G$ U- t, `0 m! S; `( w3 U

  461. + I% I* V+ g  |* n& E- X
  462.         mov     cx,[pos_x]
    2 j! u0 O! q  [# z9 Q1 O
  463.         mov     dx,[pos_y]
    ( Z$ h* H4 a' r5 K; B0 I0 A+ |
  464.         shr     cx,3
    / f9 x/ P$ T3 _
  465.         shr     dx,30 n# r6 O* N* f+ p, [
  466.         mov     ax,80
    # A+ G& U# `% b8 S% x
  467.         mul     dl3 f& b" B& l0 N9 H" @7 e& Z3 B
  468.         add     ax,cx
    ) v! i2 e: e7 d5 e3 ?
  469.         shl     ax,1# M: R* j4 C' B+ f( `% e: m
  470.         mov     di,ax9 X' r+ J1 F. @. c9 q
  471.         mov     ax,0b800h
    % Z9 H4 @+ F2 l9 }, ?
  472.         mov     es,ax3 I( s: t/ B- i+ y$ Q9 T' X
  473.         mov     ax,es:[di]
    7 z) a% O* T+ O& m
  474.         mov     [save_char],ax7 m: h$ K2 L5 t/ _
  475.         not     ah- Z! {7 Q8 f* e  c; X" G( r6 O1 n
  476.         and     ah,7fh) B* N0 e% @% a& p( l. {4 Y
  477.         stosw
    $ T' _5 g, t, `% V2 k
  478. no_show:
    ! |* D4 |  A3 U1 q6 T' o1 E
  479.         mov     bl,0aeh
    : O3 f8 p9 H. @! @; C) l& A0 ^+ c
  480.         call    keyboard_cmd
    ' F: a9 |) j- \7 _
  481. 7 ]; {0 Q" E& U4 \7 M2 Y0 \
  482.         mov     al,20h
    2 ^+ e- j$ d- z5 i1 e$ {
  483.         out     0a0h,al
    6 c/ E1 Q8 d' Q
  484.         out     20h,al; u6 _3 q4 ]- j6 ^- p

  485. : Y* ?; }9 Y, l- \1 W
  486.         pop     ds! K. ^: I. X1 F1 E- x/ ^& b
  487.         pop     es: I( R+ C: V, B4 ]; o2 O
  488.         pop     si
    1 z! t& X6 k1 e" j' M* Y7 f- y$ X
  489.         pop     di/ M6 ?" a: K6 ?6 O
  490.         pop     dx/ f% C$ X# \. C% d0 M& t/ s+ _( |
  491.         pop     cx$ x) [; t# c0 ~
  492.         pop     bx
    8 W# i2 w  D# u
  493.         pop     ax
    : H- z: }4 c# ~) E, i+ C7 y! ?$ g
  494.         popf
    - H# v8 f2 L0 j% j- T
  495.         iret
    2 x' N9 ^& b, n: }# E2 l
  496.   o# S2 V! [. u  B
  497. first_time      db      1
    2 V' |5 q6 p& m; F
  498. buttons         db      0
    . n9 L6 Q) U5 v/ b, u8 ?# r
  499. pos_x           dw      0
    ) ]# F# {! J8 S# M
  500. pos_y           dw      0
    / M0 \+ I, C' h
  501. sm_flag         dw      0
    ! G" \, n( @3 X, t. g
  502. save_char       dw      0% H* K$ o3 X# s4 c4 p3 @
  503. x_move          dw      07 B' R6 W) m1 X; q0 N
  504. y_move          dw      0% h+ J/ D& H- x/ C
  505. x_max           dw      639; L2 i) @" V$ v6 K
  506. x_min           dw      0
    7 w  U: b# I* x6 O) T% m# W7 k
  507. y_max           dw      199% H' Y5 d. j% d4 C" G
  508. y_min           dw      0! j* S0 Q5 {/ @& b2 _
  509. user_subroutine dw      0,0/ M  |& G! Z/ L: B" I8 v
  510. user_mask       dw      0
    9 P; u$ r6 z0 L' k) N
  511. temp_mask       dw      0
    , b$ b6 u* e: d2 a1 u  I

  512. $ W. `" x2 H. c
  513. keyboard_read:
    ' {2 V( [, F: R2 A2 r$ q
  514.         push    cx
    ) ?& \# i( L- {6 q. M
  515.         push    dx8 Q6 b% V* L8 X5 _; {. y8 q
  516.         xor     cx,cx- e% ?( k/ \- v
  517. key_read_loop:
    / f3 Y. K/ x- Q
  518.         in      al,64h
      }. h. X( S" a4 T0 I% y; @
  519.         jmp     $+2
    7 I4 t5 r0 @5 E0 A$ |
  520.         jmp     $+2' x- ~: l6 u% i. `& L  J# a& b1 c
  521.         test    al,11 i/ X/ {! Y  H+ \, m8 |9 o+ X
  522.         jnz     key_read_ready
    * n! Z5 G: I& b2 r& E2 g% Z2 x" U
  523.         loop    key_read_loop
    & ]% K& r  p5 Y- e
  524.         mov     ah,1
    ; [+ [: \, N3 H: c7 ^( k
  525.         jmp     key_read_exit
    0 A, l: I4 H- I
  526. key_read_ready:
    / D2 ~) c9 N: E: \+ }. u
  527.         push    cx9 a* X. _7 D0 ?+ K$ Q
  528.         mov     cx,32
    % E. G% Y3 H6 Q+ q' l
  529. key_read_delay:: @. d/ a( P0 T4 e
  530.         jmp     $+2- z) _) @7 T% F7 m6 z$ J
  531.         jmp     $+2
    ; Q/ |6 c. T$ Y" k$ J
  532.         loop    key_read_delay$ f  c# @7 r( U9 h  l
  533. . o% O4 B( X; J1 t$ [$ k# M
  534.         pop     cx
    5 m4 \& s8 V: Y5 a; W/ G' Z( K5 u1 f
  535. 1 H! r$ z/ A! |2 Z- g& g/ C- k. S9 ^
  536.         in      al,60h1 ]% @3 t0 J8 u) u* \7 x/ ^1 X
  537.         jmp     $+2
    6 d9 M+ t' R, z5 _! _# i
  538.         jmp     $+2
    " i, E! b7 P, k$ s- \: m8 @9 {
  539.         xor     ah,ah9 g  _2 F* ]# @2 {  r
  540. key_read_exit:
    7 C$ C. s2 T: J* O$ H& a, U
  541.         pop     dx4 L+ c! |: k! I: i' T* R. Y
  542.         pop     cx
    1 O- [* c. P. V3 r1 S" |; d
  543.         ret/ S. S; A  k- G; q
  544. ( h* w( P$ Z7 }6 s
  545. keyboard_write:; @: ^4 }0 J. x6 M
  546.         push    cx
    7 V1 E: R7 a' ]/ j3 n: T
  547.         push    dx& o) s  _* u( J. x' g$ T' C0 V# E# o
  548.         mov     dl,al; Y: }5 k& P+ l7 W
  549.         xor     cx,cx. U7 @/ y4 r! s6 w
  550. kbd_wrt_loop1:- b" J6 [* B2 ?" q+ q0 B0 X& e1 o, r# g
  551.         in      al,64h
    , L; ]5 l) k5 Q# C
  552.         jmp     $+20 T3 `# K- ]5 E, r( J5 x
  553.         jmp     $+2
    5 I% M: c& b# R1 w5 p
  554.         test    al,20h
    ' A, U4 _/ k! K- Y
  555.         jz      kbd_wrt_ok1
    5 T4 R; H. D6 }9 [

  556. 5 e3 P* k) _: |+ m
  557.         loop    kbd_wrt_loop1
    6 q8 i* \$ N8 Y9 P! x. N
  558. 8 `3 Q, }; b& h( t
  559.         mov     ah,15 Y& E& d3 V0 m, Q2 Z) X( N# H# m
  560.         jmp     kbd_wrt_exit
    5 x5 v  x* ?5 V3 z4 T: N) Q% C+ M* N9 }
  561. & A! i# i% S( F
  562. kbd_wrt_ok1:
    * N$ }3 h2 @. ?+ E' H8 Z5 E5 I$ b
  563.         in      al,60h
    * S. }% @- D6 Q0 _0 k0 G$ W
  564. 7 y: e. }( _# r
  565.         xor     cx,cx  Q8 l4 o0 b& X" _8 [
  566. kbd_wrt_loop:* J* _  h) j6 E* u& d  M. s+ O) ^
  567.         in      al,64h
    ! L/ N& I9 p1 x& T
  568.         jmp     $+2( T" D6 \3 t5 g
  569.         jmp     $+2
    # B- r9 q5 n5 h- R
  570.         test    al,2
    # b( i! z# j  K9 x; B7 _
  571.         jz      kbd_wrt_ok
    ! B: E0 G0 b3 [8 p4 T

  572. 4 H8 |0 o/ ~3 X- k# c, e3 V3 X9 J
  573.         loop    kbd_wrt_loop
    # G, I. P0 @8 R+ L. q# B- M/ N
  574. & ?9 A4 b; R8 E4 S3 n* _
  575.         mov     ah,1
    0 H; e# r3 r0 C, N7 r( D! T
  576.         jmp     kbd_wrt_exit7 n* Z1 r5 ?8 U$ P# b7 W
  577. * ]! t9 V* i6 C+ O
  578. kbd_wrt_ok:0 H3 ^; y4 R, h4 ?" g0 R! V
  579.         mov     al,dl2 v) T! o! }2 M% H& c" P# P" s: ~- C+ J
  580.         out     60h,al- {% p/ D9 x% {3 P$ m
  581.         jmp     $+2
    . u' y0 d+ V7 Y2 y9 H( I
  582.         jmp     $+2, g  [- f  B" y7 j! X% B' Q& n

  583. : k1 @8 \& b4 o% A0 P, P  [
  584.         xor     cx,cx
    3 \# ]" a5 Q+ A4 f7 B5 [9 ~
  585. kbd_wrt_loop3:9 P4 |& B; E# ^  g
  586.         in      al,64h
    1 t, j4 D* |0 T; T: o/ V
  587.         jmp     $+2- s- w% {: o5 s6 p
  588.         jmp     $+2
    1 z. t- o( E% i
  589.         test    al,2$ E2 P: c* j. A" B  L; [0 m" C
  590.         jz      kbd_wrt_ok3
    3 ~% J" O1 p" o7 e

  591. ' Y# J1 D8 m/ K# Z2 f8 X' f2 w  M0 V
  592.         loop    kbd_wrt_loop3+ u% z7 J: U# d0 L
  593. 1 ~" H5 A/ O' T2 z3 K! Y% u
  594.         mov     ah,1
    + G! W2 e' X8 t/ a
  595.         jmp     kbd_wrt_exit; i; \, N# f. K- D) T) }4 `

  596. ( B- A- a( w, d4 r* P7 D
  597. kbd_wrt_ok3:( Y3 R2 o7 _* D
  598.         mov     ah,8- e; c9 m6 G3 @( _" |
  599. kbd_wrt_loop4:
    . E7 M/ q$ v1 B
  600.         xor     cx,cx
    4 A. \7 \2 `. R; }
  601. kbd_wrt_loop5:
    , W! d2 ^3 Q! X6 z
  602.         in      al,64h
    ' @0 Q5 B! {; O. U1 M- j. a% a' Y9 L
  603.         jmp     $+2% B/ J, z' e7 o& h2 w$ V
  604.         jmp     $+2: u9 A4 v  S" A7 T6 I9 _
  605.         test    al,1
    ; T9 G0 T* L1 b8 o' P/ P* n: l
  606.         jnz     kbd_wrt_ok4
    6 Z0 c4 @0 I( `' o( @- ~
  607. . S8 i0 ]7 w# X% O
  608.         loop    kbd_wrt_loop5& ], E3 ?( D( p( \/ {+ _  W8 a6 m

  609. 6 V, B3 B  R4 q) c3 h6 K, U
  610.         dec     ah; t1 K; [! \7 a$ h
  611.         jnz     kbd_wrt_loop4
    0 C- Y  Z; ]8 ]4 t+ ?

  612. + V+ w5 k9 k) R2 n& d% k
  613. kbd_wrt_ok4:
    , c. U4 |1 _# x6 j6 Q# }1 l' h& v; t
  614.         xor     ah,ah
    5 U0 q  l( g8 t' U
  615. kbd_wrt_exit:  o. O1 x  a* f
  616.         pop     dx0 o7 d9 n: |" ]
  617.         pop     cx
    0 c: m4 M8 J0 A$ X
  618.         ret: ^' F3 S+ {5 W+ ^, s9 r! h2 d6 T
  619.         & t! t6 ^5 F+ x) X6 W
  620. keyboard_cmd:
    1 f7 |" Y! q: G( E8 M7 A6 n8 r
  621.         xor     cx,cx
    . A8 f% {8 M* V) c# p* C
  622. cmd_wait:
    1 M4 f& T! t8 Z) ^
  623.         in      al,64h, A5 A: O8 g* p) Q
  624.         jmp     $+2
    2 H: v( ]. z2 {/ J4 |
  625.         jmp     $+2) R( [. u) H1 Y$ C  \
  626.         test    al,2
    % x1 d  V7 U& r9 c8 o9 f
  627.         jz      cmd_send
    9 u' I% J: E- f+ l! S/ e- a
  628.         loop    cmd_wait
    * p, i5 L% G6 M6 A6 `, O+ L

  629. ( a& J8 j9 o- [: x. G
  630.         jmp     cmd_error3 _$ O5 g. M( ]% |2 x8 P

  631. " y' S% Q- _$ B, N; F' l
  632. cmd_send:$ F0 W5 T" i0 P9 W. h  B( C5 }
  633.         mov     al,bl
    + Q  k9 R. |4 {, S3 f
  634.         out     64h,al% b, b1 G+ ~; Z) z
  635.         jmp     $+2
    , F2 r; N4 `+ M, h% D
  636.         jmp     $+2
    6 u8 U3 O6 x$ B9 `
  637. ! I6 _, ?; |; Z' N3 S
  638.         xor     cx,cx
    : ~( A9 |# W! ~0 J/ N
  639. cmd_accept:' `. r$ H/ |& |) }. E. Q, _- F
  640.         in      al,64h6 h3 Y9 b0 |; V9 }( I
  641.         jmp     $+23 K7 k! Z1 g" r8 u: D, t! \- I2 m
  642.         jmp     $+27 {) G" E( C2 x9 H3 I2 U0 X
  643.         test    al,2$ n6 B& @6 _8 T, ^+ P1 ]6 J
  644.         jz      cmd_ok
    % c$ y! r) T/ v* I$ w/ \/ ]
  645.         loop    cmd_accept9 i, v. y# _0 t) F! ]

  646. / y0 `/ n& S9 g( y
  647. cmd_error:
    5 d$ |+ H: X2 m" D) }- R7 ~& E* N& Z
  648.         mov     ah,15 {! k' j0 N  K! t* ?- I
  649.         jmp     cmd_exit
    / Y  I$ t9 h/ t. C* {: v& S) x
  650. cmd_ok:
    7 a( S  L9 o7 O$ b/ Y
  651.         xor     ah,ah8 Z4 e% u2 c3 r
  652. cmd_exit:
    # A8 t; Y2 j. y3 `( m' N8 O$ u
  653.         ret5 P: m7 b7 ~8 H; ^0 I6 z- o

  654. & c+ y9 W. j9 x/ O3 t0 e
  655. new_33:/ P7 c( \& x/ h+ b1 j
  656.         cli
    ) }! A6 ]- \" B1 t
  657.         cmp     al,0) T, c/ h4 I4 {6 A' |5 z
  658.         je      reset_mouse
    & `! ?( J  J2 b- y4 A. |
  659.         cmp     al,1
    4 r/ ~0 e! R* C* D1 w- Y
  660.         je      show_mouse9 }+ r' ?5 \6 ^8 x
  661.         cmp     al,2
    5 i3 M+ {, b! ^( Q* U5 p# Z( ?
  662.         je      hide_mouse/ j, f0 L( u- T9 V: m; z
  663.         cmp     al,3
    ! ]+ l# D. Z# g% J# @
  664.         je      get_pos5 x( T4 G$ A  H
  665.         cmp     al,4
    $ I  Q7 e5 ~9 d3 g+ o
  666.         je      set_pos
    ) h; l  p( O2 d: }; Z
  667.         cmp     al,76 i' u4 ?  ?6 Z) t5 w$ Q1 n# O% A/ V
  668.         je      set_hor_pos3 Y5 i$ j; K! v& N* t) c6 H
  669.         cmp     al,8: g8 t4 H" J2 a# Z( w& N
  670.         je      set_ver_pos: D; F. p# _/ K0 h% a+ v% a" E% `
  671.         cmp     al,0bh
    6 B0 P# l1 z$ k6 [+ {
  672.         je      get_mouse_movement
    : T6 B* t$ S9 d2 `8 C
  673.         cmp     al,0ch
    ( J) D! H4 e3 i$ P) y- z4 R# [4 A
  674.         je      set_subroutines9 }# Q5 o$ J; G+ T2 }: D8 k
  675.         cmp     al,14h
    ! I7 `, y5 I( e- }& P( l, k0 J
  676.         je      swap_subroutines" h- v% N- P1 ]  E  ?
  677.         iret8 Z/ N- Q4 J3 J$ u" \

  678. , T; w; q' w$ f/ s* v) k
  679. reset_mouse:
    / i6 l: r8 x8 f+ C$ N; N" m
  680.         jmp     _reset_mouse$ }" ^8 Q5 m+ R/ @" z8 A
  681. show_mouse:
    $ v/ y, k- N% C+ Z- J6 _) \% y
  682.         jmp     _show_mouse5 X7 z' R. M8 T( r
  683. hide_mouse:
    % X: A' f! l8 c7 J
  684.         jmp     _hide_mouse- ]( d0 g1 [9 e0 n( a
  685. get_pos:
    5 Z4 E/ G; }! a
  686.         jmp     _get_pos
    ! H' W8 |0 Z/ X$ t) @" d
  687. set_pos:
    9 p- J; l2 f4 ~3 A9 ?8 C+ }2 u1 G
  688.         jmp     _set_pos: g" p. a/ R1 W
  689. set_hor_pos:# W: S8 {* E: s( [
  690.         jmp     _set_hor_pos, H/ j; I4 I) n7 j
  691. set_ver_pos:" a. ~/ l& S) Q: `; V
  692.         jmp     _set_ver_pos
    8 x. S: [' @6 o" N' s( l, j+ S
  693. get_mouse_movement:4 N$ e9 x# h, z; {
  694.         jmp     _get_mouse_movement
    " d# A+ r& K9 b2 j
  695. set_subroutines:
    ( R8 v2 [. k& q2 r- E
  696.         jmp     _set_subroutines
    & _. {  k7 R9 q$ o% d- h
  697. swap_subroutines:
    - U! H+ z  a8 v& ]  o& t
  698.         jmp     _swap_subroutines' ]- @! B  w2 h% j' Z8 n; e5 t

  699. ! {" K6 H8 N) I/ J
  700. _reset_mouse:. O: C3 \1 I! o* r0 D. Z
  701.         mov     byte ptr cs:[buttons],0% Q# j& Q+ C9 m: p1 {; B$ p7 y
  702.         mov     word ptr cs:[pos_x],02 \" C, X; `1 j. G; n3 [1 r% [
  703.         mov     word ptr cs:[pos_y],0
    0 E3 E3 f. R4 [8 R2 {5 g; D5 Y
  704.         mov     word ptr cs:[x_move],0- k& j$ `  E4 P4 ?! t
  705.         mov     word ptr cs:[y_move],0
    ( l4 r* y. i7 \% L, c0 }. W! t
  706.         mov     word ptr cs:[x_max],639
    ! K- h- w% ?3 C0 T" x7 `; R
  707.         mov     word ptr cs:[x_min],0
    9 f5 t' R/ V* m8 p
  708.         mov     word ptr cs:[y_max],1999 l3 k& c% j- {0 X5 W
  709.         mov     word ptr cs:[y_min],0
    $ w4 w8 @1 ^0 ?5 ]+ e
  710.         mov     word ptr cs:[user_mask],0
    . N. C6 K6 D$ J5 Z
  711.         mov     word ptr cs:[user_subroutine],0
    7 L8 {4 Q8 z3 p" o( b# j% Q
  712.         mov     word ptr cs:[user_subroutine+2],0
    7 w& a. _7 |' @  G0 y3 E. Y
  713.         mov     ax,0ffffh
    & e$ n, l0 U0 c6 M0 {8 O
  714.         mov     bx,3/ Q. K( k, j" m% T! S
  715.         iret: H' G! {  f# g% |, S

  716. % o6 l" c- k* ]) E1 v* O
  717. _get_pos:
    7 N4 T# F5 N6 l7 h. H0 r' `6 O% K
  718.         mov     cx,cs:[pos_x]' G5 N8 @/ t+ z
  719.         mov     dx,cs:[pos_y]- A* n5 S8 z( Y" u* p# u, C
  720.         mov     bx,word ptr cs:[buttons]3 O0 X( f9 [) ?% A8 W) y& H/ ^& }
  721.         xor     bh,bh
    * y$ k* M/ P! @! x( c
  722.         iret
    * ^% c  [# \8 p8 V/ U4 x  C& K

  723. : W: H* ]' L5 Z0 k  e  }
  724. _get_mouse_movement:2 W5 w) W) F! k' M. l  T# _
  725.         mov     cx,cs:[x_move]
    - D$ N$ u! q5 i
  726.         mov     dx,cs:[y_move]# n( v* W* @/ w5 l' q
  727.         mov     word ptr cs:[x_move],0
    - w* a  e" [% h  C
  728.         mov     word ptr cs:[y_move],0% o* I( n7 Q, [
  729.         iret! Z. [+ P& I& V
  730. , q2 P3 Q" D& J4 ]/ e% H
  731. _show_mouse:2 l1 u7 [8 z+ T' E0 [* [, u
  732.         push    ax6 R7 Z/ ~, i* t# |7 \- r* {
  733.         push    bx0 i* F6 i1 ?; P1 L7 S2 }
  734.         push    di# W; e3 W+ u2 ~9 ~9 a# I! P
  735.         push    es5 ~: ]5 N- D, s1 a
  736.         mov     byte ptr cs:[sm_flag],1
      x* x  q* ~0 x( |
  737.         mov     ax,cs:[pos_y]7 X" C8 U1 U! [
  738.         shr     ax,33 d4 @7 q8 W' j8 i; E9 U- ~9 C+ {& w7 Y
  739.         mov     bl,80
    5 o: {& B, b1 z' w( U2 b6 ~2 E
  740.         mul     bl
    + @/ Z. F1 s# ^) e# b( d" K4 G/ {
  741.         mov     bx,[pos_x], d) r, S' K7 I
  742.         shr     bx,3& @+ [" T" R. n5 U3 B' v
  743.         add     ax,bx" B4 x7 p2 ]6 |6 y
  744.         shl     ax,1
    % D: \5 F7 p: C7 e. O
  745.         mov     di,ax
    . S, F, X: v/ S, l; ~
  746.         mov     ax,0b800h
    # k" Y: V% V( r4 L
  747.         mov     es,ax
    ) y  V: q) t, b% Z' b
  748.         mov     ax,es:[di]
      g; w5 ]( r* \6 s. r
  749.         mov     cs:[save_char],ax
    ( h; S8 T. t3 \1 r9 r
  750.         not     ah
    7 \% Q+ p' h2 ?# y8 f1 k
  751.         and     ah,7fh# I0 k7 k9 L  Y3 ]1 d& Q- V) l
  752.         mov     es:[di],ax8 g1 @( w% J0 L* M# y& R% ]6 `  _
  753.         pop     es* j( |& }9 o# u3 @7 c! k
  754.         pop     di
    & G/ i0 [& U3 J# K8 H$ S, i
  755.         pop     bx* D, S  ]1 g- e! ]' U/ u
  756.         pop     ax
    6 Y1 l5 E# T6 }% t, k' g7 j% ?% e
  757.         iret
    ! d" X, ?0 S+ d0 q1 U% A) o

  758. 7 ~* Z7 C5 p$ p% x. @( }, e
  759. _hide_mouse:: U4 v( v, |1 H0 m
  760.         push    ax
    - H6 `7 j" ]2 |7 D" ?' T' U
  761.         push    bx: n* b; \' r% T
  762.         push    di
    / ]- Z' ~; b1 ~: `
  763.         push    es
    7 N# G4 R0 C& F, ?( V  e+ I: r
  764.         mov     byte ptr cs:[sm_flag],0
    0 I) T: T; {; b6 f8 U: j
  765.         mov     ax,cs:[pos_y]
    % x$ T& L3 V2 g6 G) h. Q1 z  m
  766.         shr     ax,3
    3 }& U" O. A0 p8 B
  767.         mov     bl,80' n( R$ f( Y, J) \7 D7 x6 Z9 F
  768.         mul     bl
    ! @2 R; _1 a' L
  769.         mov     bx,[pos_x]" ^* D8 v5 C! i1 m+ I
  770.         shr     bx,3" J+ }1 J2 j8 D; u* b- M
  771.         add     ax,bx
    4 L) q$ M& W# K
  772.         shl     ax,12 l% v3 _3 R6 l1 \( s2 y4 i4 [" [' e
  773.         mov     di,ax5 t* P. B/ T( ], q  U
  774.         mov     ax,0b800h5 H  C0 }; p# h' J, I: [3 x
  775.         mov     es,ax1 }! B, I; {- [* P% j  y4 Y
  776.         mov     ax,cs:[save_char]
    : G  p3 q6 S* p# n- Q  u9 N
  777.         mov     es:[di],ax
    * [, q- R8 g6 Z4 q
  778.         pop     es
    6 t; ^! S) a$ B( h1 v
  779.         pop     di1 q4 ]3 L$ i* s# Y$ D4 `& t% J
  780.         pop     bx
    % i* M6 y2 j) h( R7 F
  781.         pop     ax
    7 Q' `+ Q0 Q+ O, O
  782.         iret
    , m4 `5 L2 ~$ Z2 G- e

  783. " T5 V/ v. C* x
  784. _set_pos:
    : y. k' K+ Z0 w' n. F5 n- V1 y
  785.         mov     cx,cs:[pos_x]
    ; {5 H4 E9 u; Q. U7 f& l
  786.         mov     dx,cs:[pos_y]
    2 M# [4 Z% n) K8 p3 {; e+ n
  787.         mov     word ptr cs:[x_move],0
    . V) i4 E, E" A9 @7 ^
  788.         mov     word ptr cs:[y_move],0  _5 x+ W% |, K
  789.         iret6 S7 s; k" m7 y' k, v

  790. 0 q! C" i" M: W$ N
  791. _set_hor_pos:" ~0 c* Q5 O/ B1 y9 V; B; _7 Y
  792.         call    max_min5 o0 T  j% I% F0 E5 l" a* }
  793.         mov     cs:[x_min],cx
    6 `* T8 w& t3 K/ W; ~' {
  794.         mov     cs:[x_max],dx" K' C; e+ r6 S2 ^% R) b
  795.         cmp     cs:[pos_x],cx
    8 k" d9 @4 ]! A" k
  796.         jge     good_hor_min
    # d7 ~" l: b% _" t+ Q8 J7 ^! C
  797.         mov     cs:[pos_x],cx
    ) h8 v5 r8 I: U9 |
  798. good_hor_min:7 U) k5 c2 F9 @: h
  799.         cmp     cs:[pos_x],dx( ]; q$ V* d5 a; G( {1 H
  800.         jle     good_hor_max
    / D7 l  {6 |0 b! C& ?7 a
  801.         mov     cs:[pos_x],dx: a- h/ p. J; ]- D
  802. good_hor_max:' @6 Q& @% W7 W  t7 ?( o' h7 I
  803.        iret
    1 `6 h! ^0 D5 z4 @

  804. : }* t5 G; L% N- G  X+ T0 F
  805. _set_ver_pos:
    ; v& m, X* {& W
  806.         call    max_min0 ?/ |# p% K: t" \  J
  807.         mov     cs:[y_min],cx# i" h3 n+ u3 U
  808.         mov     cs:[y_max],dx2 ?7 T" r; O0 _+ f* x
  809.         cmp     cs:[pos_y],cx  m3 n' g! S# P4 f0 O
  810.         jge     good_ver_min
    5 I' L; N5 F$ |/ A
  811.         mov     cs:[pos_y],cx9 L7 a( I# z" I4 V5 ^4 r+ J
  812. good_ver_min:5 ~) s# y# Z# ^0 @
  813.         cmp     cs:[pos_y],dx& _' O% o/ ~: D& ^, ]2 \
  814.         jle     good_ver_max
    * T$ c0 e2 w- I: {
  815.         mov     cs:[pos_y],dx, t. d  d6 G- d: V8 n. c
  816. good_ver_max:  x8 ?3 W+ j5 g; s6 V9 u$ z
  817.         iret. i! w% b6 K0 E2 y2 e
  818.   b8 t# w' l3 x
  819. max_min:2 z* H  k  k* w( N7 V, Q
  820.         cmp     cx,dx
    , y9 V$ z2 P1 r8 u$ e, i2 q
  821.         jle     no_swap4 z4 @# E) D* y+ S$ ^6 |' d
  822.         xchg    cx,dx
    1 T: A* Y- }3 Y1 Z. T9 m5 D
  823. no_swap:
    7 |4 F7 }1 x' ^  H& V
  824.         ret
    1 ]$ z; S; l- H) n9 w

  825. 1 W- U/ j$ i: b) {! k
  826. _set_subroutines:3 r# g  \' h' G  z6 M
  827.         mov     cs:[user_subroutine],dx
    $ P4 o. U/ F3 B2 ^0 O
  828.         mov     cs:[user_subroutine+2],es
    ; {% r/ K0 |: R: _4 z3 G; _7 t1 x# v4 Z, C
  829.         mov     cs:[user_mask],cx
    ) c  U. ^) Y! K0 N. }; b4 H4 V
  830.         iret6 j( Y1 A$ D* g- t4 `' X! ]
  831. ( I9 Y$ @8 J# n/ Y# c
  832. _swap_subroutines:
    % B- v9 c: ?, H( N! f
  833.         push    word ptr cs:[user_mask]$ ~3 n% A$ s2 [1 h: D) A" N
  834.         push    word ptr cs:[user_subroutine+2]  C: }. F7 W4 i6 y/ V) {7 B
  835.         push    word ptr cs:[user_subroutine]
    2 J1 c+ ]+ J7 T& R' m
  836.         mov     cs:[user_subroutine],dx
    3 C6 B! C7 m9 Z+ x" A
  837.         mov     cs:[user_subroutine+2],es
    / @+ q) A  M' ?- b0 }' U1 ^) @
  838.         mov     cs:[user_mask],cx, J2 o. q5 F9 b6 V$ H3 h) U7 q2 T2 D
  839.         pop     dx
    ' l' _( R9 @9 Z+ \. d
  840.         pop     es
    # n# N0 C0 l; z
  841.         pop     cx
    4 F8 B. y' f1 C& h5 n" R
  842.         iret- C6 a9 t; {! `6 V
  843. " v( `! _! V2 O9 K( i
  844. memmouse        endp, F: N5 l7 w: }6 z0 }) ?
  845. ; ~" R, k9 F7 `' _4 i. j' d# t( Y0 y
  846. endof_start:
    4 z1 q. j% {% U) ^0 S
  847. / m! i4 z3 N9 K6 o+ K
  848. emsg db 'No mouse driver install error!$'" L% ^. N9 A0 B! o7 s! e2 Q4 `! V
  849. old331 dw 04 C* z' p9 A6 e6 b$ @6 n" n
  850. old332 dw 0, n6 p+ Y( K' n/ b9 k3 P0 e
  851. old741 dw 0% U7 M0 {: M; o; s
  852. old742 dw 0. Z7 C5 c8 |8 r3 N" }  l( M
  853. memcopy db 0
    ! a! b* D3 P4 i) p" N$ j3 J
  854. okcheck db 0
    + w/ W" m* R* I( X' m
  855. pass db 0
    $ g' p" ^* R& N; e& U0 [' B* F
  856. chkl db 0
    # a8 w4 M6 U6 P* [2 Y
  857. lk db 0
    , A# }% k0 k- V- Y6 p9 ~4 X
  858. chkr db 0# I1 F7 n7 k  o! O( a7 t* T
  859. rk db 06 \. @7 J0 e' Y: r' K) I
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ' |4 f* i& j0 y' Y$ L; ~
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    2 ~* u' M7 o9 d6 a
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    5 }6 P/ ~$ e5 C- J, ^9 S
  863. db '                                                                                '
    $ w/ Z- a1 i. X$ g+ p
  864. db '                                赏屯屯簧屯屯突                                  '6 [8 w* L" s8 V# ~; c/ r* I
  865.         db      '                                ?OFF汉OFF?                                 '
    : t4 ]# }5 K- D$ Q/ b' P
  866. db      '                                韧屯屯既屯屯图                                  '
    6 ^5 |% W. M2 I) a' f4 i  J" r
  867. db '                                                                                '* w3 r4 k4 y6 R/ d
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ', i6 X; r" T/ C( [  x4 D3 Z
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    ) N# Q- {8 r. A! L
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    . J9 G" s9 T1 T
  871. 3 A; A7 T* i# n4 D& [
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!$ x" i' k9 j* J& s! H) e% r
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
) E: o. y$ `) [. p& a$ H$ `* o2 a) s' K
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 13:43 , Processed in 0.059264 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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