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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。1 V, b! W' N% q' l( U
7 e  X+ e# [7 n$ A1 f3 `' [: K# V
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;) s& m, l4 `: [: |+ _* e6 t- ]
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    " f6 e3 e3 V' U
  3. ;                                         By Bini.Yi 易祝兵
    ; L3 z# c' i2 l. t# M/ L- O
  4. ;                                         http://www.ufoit.com 计匠网
    : f7 l9 y, s! K& [% r9 d: f
  5. ;                                         2002/04/06 YYYY/MM/DD& m8 K8 _$ `! V* G5 R+ U# {! z
  6. ;
    ; y8 p+ Z2 P: b0 l
  7. ;         
    9 e* j" G( w' X% F. ~3 F5 `8 a
  8. ;          This program  test the mouse button  click and move., C5 r5 n: f' B" a
  9. ;
    / V% W+ @4 b# P# |7 P
  10. , ]8 C8 \' E. _  s/ d' {
  11. .model tiny3 _+ F8 c, H- R% Y
  12. .586
    5 W! q5 e; ?! T1 F5 D+ V
  13. .code, e3 ^3 s  b9 A" V! X
  14. .stack  100h
    6 O4 r( I" p. R% g! c; _
  15. .startup% T- _$ y% t/ ^1 [: N
  16. pusha
    ) t1 q' v/ F8 i  h$ |
  17. mov ax, 3533h
    - i7 {8 U) w5 h& P7 N+ x" X# J
  18. int 21h5 B$ W7 O0 E2 r# q+ ~
  19. mov word ptr cs:[old331],es" `. w( r3 z$ O: u1 j% p
  20. mov word ptr cs:[old332],bx# e: b% V9 [6 z/ o
  21. mov ax, 3574h* g& A1 d: _7 N' C3 n
  22. int 21h
    1 ]) ^  X- l- `* t
  23. mov word ptr cs:[old741],es
    7 X1 B4 k$ ?& D% R9 Z" S8 O: g% m
  24. mov word ptr cs:[old742],bx
    1 H2 P& E2 V9 ^( c
  25. popa& L  f# h0 \8 }4 K
  26.         call    memmouse
    . h3 o5 \/ X7 Y4 O2 {& T
  27.         mov ah, 00
    - N( Y2 ], n) D# K) V: F, e9 v
  28. mov al, 03
    $ n) @. M6 R- A3 \% ~5 c! T
  29. int 10h6 }: c7 w/ o$ E% X
  30. mov ah, 06
    0 B3 `6 }, h$ ~# N$ q& J
  31. mov al, 0
    0 L% I+ i( d" ^7 A( C( c! p
  32. mov cx, 0) [- ^6 M9 V& E2 v0 W8 d
  33. mov dh, 24
    # e3 |. Y" I5 L  H9 A! V
  34. mov dl, 792 h: W( _8 z; x" A
  35. mov bh, 07h/ A, i  l8 g& @: q* w0 |
  36. int 10h
    4 s  n. `2 v4 f9 G+ P/ {
  37. mov ax, 0000
    : M( g' L! N$ j7 p- L
  38. mov bx, 0002
    / b. a( C: B, C. e$ z4 m; `, J, C
  39. int 33h) y! B2 O, b. O) C  s
  40.         cmp     ax, 0000           ;if no mouse drive install
    5 n, l4 V4 E0 `0 H5 X+ L
  41.         je      errormsg           ;show error MSG) {* x5 y% ~% W; _7 W  k" G( w( u
  42. mov ah, 023 ?! f1 Y) T  g4 ~
  43. mov bh, 00
    " `) y  d* Z3 I" p; y3 T
  44.         mov     dh, 25             ;Move point out screen! w- j; o0 P/ J. P7 q. i
  45. mov dl, 79  k" R- ~9 Q8 S9 X2 A
  46. int 10h2 O: T# t  N+ z2 Z4 w# q
  47.         call    showmsg            ;Show info
    9 R: F/ v$ L3 ^$ k& N3 I# f
  48. mov ax, 0001( u+ j; s5 T9 a9 d; G
  49. int 33h7 X4 @+ d0 @, k6 u/ O! {" [+ ~
  50. ; mov ax, 000ah2 s  J& n! m; Y8 I$ I
  51. ; mov bx, 0000) J2 i( P0 U" M; T
  52. ; mov cl, 0h
      c  @2 w: T1 I5 F2 n4 w* h
  53. ; mov ch, 0F0h  p. Y& f& @6 `2 U' j+ `
  54. ; mov dl, 0h& S, C/ d3 G/ w9 e
  55. ; mov dh, 0F0h: \% W% |2 W# m  w4 K
  56. ; int 33h
    + ^' d9 _* R  ^0 b9 k
  57. mov ax, 0004h
    8 I1 M% d3 k2 b" Y
  58. mov cx, 03192 ^$ J) q1 k9 f: I/ \( R
  59. mov dx, 0103
    & b, _$ A/ o" d1 K# a
  60. int 33h
    7 f! J& m' c" b" ]/ r; u& h
  61. casemo:                           ;Case button click and point move / L1 Z+ N# s" ~7 T( m
  62.         mov     ax, 000bh         ;and keyboard press7 E: f! `# a3 N* _3 ^- C* I4 T5 C
  63. int 33h
    - k9 x. m1 L0 F
  64.         cmp     cx, 00h           ;if point move....X- F/ g9 g! F, u% I# Z8 f2 ?
  65. jne xmov" \, q$ {1 }- d2 y& W4 }
  66.         cmp     dx, 00h           ;if point move....Y1 o- Q+ i. `, |  O' S" i0 i% u" z$ l
  67. jne ymov
    4 {5 T% G+ D/ U5 i
  68. xymovend:                         ;X.Y move end5 ^+ D) H- _$ e& M0 |
  69.         mov     ax, 0003          8 }* U/ B5 R! r4 H
  70. int 33h
    4 d6 D1 \7 h  x) M8 ^8 K
  71.         cmp     bx, 0001          ;if left button click  show ON' ^, a: M6 \/ ?6 n0 j
  72. mov si, 18284 G2 B: d2 m8 J( ?
  73. je listl9 t; `$ z: c! o$ n' }' [5 g5 f" z
  74. mov si, 1828* W+ Q/ T/ W# G! B; T# f
  75.         jne     nlistl            ;if left no click show OFF
    # Y% B  ]* \/ `1 Z, s: l
  76. testr:
    1 M' I0 k6 ?6 v! O
  77.         cmp     bx, 0002          ;if right button click show ON1 f) x0 `9 d4 P/ ]4 I
  78. mov si,1842
    4 [- [3 ]+ [& G
  79. je listr
    + ?4 x8 E( p5 J+ @/ R: o. A5 E
  80.         mov     si,1842           ;if right no click show OFF9 O) U1 Z  F" ]5 e" N
  81. jne nlistl. B) S' L- M9 ?( c* Z
  82. casekey:
    - d! [' c- t& R; ~! o3 O2 [! h
  83.         mov     ah, 01            ;if any key press jump check! g! n. V3 G  ^( H- Z9 ~9 e
  84. int 16h2 F0 b8 q8 E4 B9 N) m
  85. jne kpress
    $ B  I3 s$ b3 a- @, g& g; u: h
  86.         mov     al, [chkl]        ;check x flag; k+ i2 \+ g. _- q8 ^5 b% m
  87. cmp al, 02h) W# k4 m2 n/ Z$ u) a
  88. jnb chkok% T6 T% O  Q) c3 c5 R2 R3 G5 M
  89. jmp casemo! P3 a) G- T0 @/ a
  90. xmov:                             ;if X moved, get the X flag+1) U1 L& [: H: L: F4 }1 x7 ^/ r
  91. mov al, [chkl]
    3 |7 [7 {' s1 D. ~; D3 x6 T
  92. inc al- k1 M: o6 @* @/ b6 S( Y, Q
  93. mov [chkl], al
    , h. v% {  L0 ~/ g0 B" L
  94. call passok
    2 N+ k  O& m  m
  95. jmp xymovend9 c  Y+ N9 N  M, E  G  T
  96. ymov:                             ;if Y moved, get the X flag+1
    $ ]( }) U# c5 [7 J" k! @7 m
  97. mov al, [chkr]
    7 ^7 e3 d6 a4 P8 e
  98. inc al; q9 \  [: U  S
  99. mov [chkr], al3 x) k0 P7 ^4 C9 p' H. r
  100. call passok
    5 L  w: N: B, x1 P- P$ e
  101. jmp xymovend7 B# }" f3 @/ c- c
  102. 5 R# C3 _: H, g4 n1 S% G
  103. passok proc near
    3 A" g5 l: a3 ^% M) F
  104. mov al, [okcheck]
    % m- T# P) n8 V! ^  L1 y7 s1 f
  105. cmp al, 1
    % |1 v1 v2 u/ x; o! O
  106. je let0
    - ~0 H/ [( e1 u
  107. jmp passret, P; h& J/ N6 E. F
  108. let0:
    9 g3 Q& |7 ~/ D1 t' R3 W$ z1 T  B
  109. mov [pass], 1/ u- _; y6 o0 }0 E; I7 O* i$ x
  110. passret:! e( m  W3 V$ z% k
  111. ret6 \+ L8 e3 k- J% H$ @3 ^
  112. passok endp
    , _1 U+ O* V6 B2 V+ O
  113. - J1 V& U' K6 r5 e
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    4 W* o3 j) a/ D* d
  115. mov al, [chkr]; u9 \) B$ }1 J0 Q
  116. cmp al, 02h
    9 Y( e! v- b4 g" n+ W9 k
  117. jb casemo  s5 T& s) V, z
  118. mov al, [lk]* f3 y0 H$ O1 d0 F# Y
  119. cmp al, 1+ e+ l# R3 ]4 V- r4 x: F7 z
  120. jne casemo
    $ h3 m* n8 a9 E/ d& k5 x1 l
  121. mov al, [rk]0 ]' y$ s7 B/ e( y. a. |& F& {. D
  122. cmp al, 13 [& {0 d& T# `9 O
  123. jne  casemo
    / n6 I- s- f3 F$ u5 X* `6 Z9 Q$ f+ q
  124. mov [okcheck], 1
    3 i! J! o* m: \. n3 E7 m' H0 w3 X
  125. mov al, [pass]
    ; I( K- e8 R8 r5 a1 M8 j
  126. cmp al, 1$ A6 M- \' U* \* R
  127. jne  casemo
    5 s/ B- \0 `7 Q* H: |2 t0 A
  128. mov ax,0002h' @" q, p0 b( S% }+ z" x
  129. int 33h
    7 K' K# ^, ~, r* J+ @0 g6 W
  130. call cleascr0 w, O  O: I( |) a+ F1 y; s
  131. & D2 E: ~! u* i& ~) z- H
  132. call oldint' x) O0 R. l  o
  133. mov ax, 04c00h
    : J0 E" R- \, ^( d) }
  134. int 21h
    ( e5 \* B0 [8 I3 x& Z* Q

  135. ' k* M* T/ \1 J8 P) u' i& k5 g" |
  136. okexit:  j) C6 q9 o: E6 X) N; V: o# r
  137. mov ah, 4ch
    / N6 C2 C: b0 ]
  138. mov al, 0
    ' v0 |' V* T. W; g
  139. int 21h
    # U3 z3 ^( }  P! n" S; b
  140. listl:                                 ;Show ON
    9 T: u* X2 x+ T- l7 r" N: d1 I! [7 ^, F
  141. pusha0 A* T, w8 S/ x
  142. mov ax, 0b800h
    # d8 p, t: s8 _0 M! c8 x0 B  t
  143. mov  es, ax
    # u. N& \$ [8 E! c* L0 c
  144. mov ah, 47h
    1 q# a' c; W7 M% I( t. Z
  145. mov al, 20h' G6 j5 M) v$ S9 p2 Y
  146. mov es:[si], ax
    9 N  I) |; j3 j, i
  147. add si, 02
    % R) a( R3 Q' V( C4 O
  148. mov  al, 4fh
      p1 |( T1 c& k  T
  149. mov es:[si], ax
      @* v2 t* X! e+ d
  150. mov al, 4eh6 ]: q: x' I; w  [1 B9 W
  151. add si, 02' m" j( U( V9 D0 b( B, n; E/ B
  152. mov es:[si], ax
    " R% G  A+ \8 j9 m8 i2 B$ p
  153. mov [lk], 1! k) r0 ^& K5 M+ }5 m8 _
  154. popa/ I! B4 Q" L" h/ f4 s$ y1 g, u
  155. jmp testr: v2 a  E. {& l
  156. listr:                                 ;Show ON* B8 z& T9 A+ ]( T1 A# K( L+ B
  157. pusha
    3 h# [7 o: J+ v3 B
  158. mov ax, 0b800h
    6 t. R! s& J8 k$ s, }4 D4 X
  159. mov  es, ax
      s# \# O: p1 i* h  z" X; A
  160. mov ah, 47h5 Z  Q! _, K  R/ l  D' Z. r
  161. mov al, 20h
    0 t& s% |  `- }& w/ C; ^& b% k
  162. mov es:[si], ax$ l5 T2 I+ E: a  [* E$ Z" y
  163. add si, 02
    . X* u* I- {. C* W# `" \
  164. mov  al, 4fh9 m2 M) ?7 M  u
  165. mov es:[si], ax
    $ A7 O$ U& w" c& \# d' a8 V
  166. mov al, 4eh
    - M# N' C8 c% j6 l, i- E$ S5 d# u
  167. add si, 021 ]6 \1 t4 P3 }9 u8 R, {. h
  168. mov es:[si], ax
    ) p2 v0 t, F+ C/ q# S! h8 Y9 D
  169. mov [rk], 1
    ( v8 G* q: h, R) A# y" d) |
  170. popa# k1 V4 c7 V$ F% \& ?+ H
  171. jmp  casekey: q4 W) Q$ ]9 ^( ^/ k& P* o3 q
  172. 2 B2 c5 }: y! v- g" u7 C$ w- p
  173. nlistl:                              ;Show OFF
    ' w8 c: t/ T3 I) I4 V" A
  174. pusha     V( d; O& `& r0 C
  175. mov ax, 0b800h9 V' c& x- W  D4 c$ R) m9 m, s
  176. mov  es, ax8 X! ~. |5 P* Y% d; b2 I
  177. mov ah, 17h7 E. @4 a; D. n) f
  178. mov al, 4fh4 n; G" A: W, h7 j( y8 K
  179. mov es:[si], ax
    & z# I1 K* V3 Q  V% |" f: }
  180. add si, 02
    1 G7 \  `9 l- @. g; A8 d5 h
  181. mov  al, 46h
    0 F+ B: h) j- s" {$ o( d
  182. mov es:[si], ax
    ' ^" F+ E  c# m
  183. mov al, 46h
    : R# ]3 C# N) U  R# [7 L
  184. add si, 02
    ) E( n& o; Y3 f9 E4 k! ]
  185. mov es:[si], ax& d5 w: i4 u/ i3 R
  186. popa
    4 Q2 W6 P7 t8 f1 ?
  187. cmp si, 1840
    # G. b* ^" M. N; |& L
  188. jae casekey
    % c( Q. E# d# y9 s
  189. jmp testr) K* X! Y# x# H/ [4 M# l- A1 U

  190. " R6 e: A0 p5 _$ Q$ D% e
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    2 a# E& i3 V, L  N% @5 h
  192.         cmp     ah, 01h             ;and return a error
    9 Y$ g% g/ D2 {9 e/ j) c: l
  193. je exit1
    ) I  L' o3 Q, V
  194.         mov     ah, 0ch             ;if press other key then clear
    + Z, _8 j# |7 |
  195.         mov     al, 00              ;keyboard buffer
    ' a  P0 R0 e6 ^) Q, U8 @
  196. int 21h% q3 F9 {2 e1 S1 U2 i; C
  197. jmp casemo
    ' l9 G% r1 J8 V' f% o; I
  198. * R0 o: c: J: U- r2 L: o6 {- ~
  199. errormsg:                           ;if mouse driver no install  o: V) ?  i% m2 U3 |. k6 K
  200. call oldint
    2 T  M) s0 t# m9 |/ i
  201. lea dx, offset emsg
    " a' I- }* p8 F7 K5 Z5 ]5 Z
  202. mov ah, 09h
    0 I5 Q8 g2 T, k, v
  203. int 21h* V$ v2 {. F) ?1 v1 Q
  204. mov ah, 4ch
    ; d, Z" i  q) f9 \7 B' E4 r' z
  205. mov al, 2
    8 z$ B  ?: l) x' j
  206. int  21h
    4 ^6 q8 B7 O& l. w. m8 I! R
  207. # p- {" K7 g( b% v
  208. exit1:                              ;error exit6 E6 l  ?0 s7 H3 ]- h  v
  209. mov ax, 0002h$ h3 F$ ~# [8 H+ `- X+ p
  210. int 33h
    + |' D: M7 b9 j$ ~9 D8 D% h
  211. call  cleascr
    - v% q+ S* x( R  L
  212. call  oldint
    ! k" s- ^9 r0 q7 O: g: F
  213. mov ah, 4ch: K1 p# @: {# U3 ]
  214. mov al, 013 Z! i, s. P* _: s% J
  215. int 21h
    ( P# J1 O; t/ I$ a. V4 A( T

  216. / X. S7 K6 A" q# q, y4 h  V
  217. cleascr proc    near                ;clear screen& `1 W) l+ }' J% R. l
  218. pusha0 z" }" Y6 ]0 v' q
  219. mov ah, 06
    " c+ S+ \+ P7 g1 |8 I/ I/ G3 d+ j
  220. mov al, 04 R! T$ Y# b+ o
  221. mov cx, 0" J( _% q5 s/ v
  222. mov dh, 24( }! D7 ]3 X, R: a2 R  o
  223. mov dl, 79  q$ l; Q% O8 ?
  224. mov bh, 07h3 r) C4 U) B+ p, l; ^6 T0 P
  225. int 10h
    4 @& X8 l6 }7 ~4 s- S  R
  226. mov ah, 02
    9 C7 B5 v$ \+ \
  227. mov bh, 00
    5 M- [% _& q$ E8 a7 z' b
  228. mov dh, 0
    & ?& f) y& Z- X+ q! z: o8 _
  229. mov dl, 0
    - R5 i' y4 B) U9 ]5 _
  230. int 10h
    4 F- x) |; c* B! {# m) F, L/ D
  231. popa
    , @4 f4 I/ j4 \! v4 M4 f
  232. ret5 z. J) v2 L% W, z) ^! z" X7 [  `
  233. cleascr endp
    ; p& R- z( b- |+ i" y& `
  234. ! e( c4 C) Z$ x
  235. showmsg proc    near               ;Show info$ W. w. K5 l# |" ~/ P
  236. pusha$ L0 w" A) O8 a( f
  237. lea di, offset showms
    * H* k! C. x. A- `
  238. mov ax, 0b800h7 W& L, Y/ G+ X* s- r- i
  239. mov es, ax
    - W# {/ f; f. X9 i' b& ~
  240. mov si, 0, W& T7 @& K) R1 [/ W
  241. mov cx, 480
    ; d: V  a6 n) ]! G  L* o% K
  242. mov ah, 07h. ]4 `) m4 `; h: B* [7 N- D
  243. @@:
    8 l5 E" a# j5 t$ w& r- a
  244. mov al, 20h
    5 M+ X* R4 m( \& u9 J; n' D9 M! f
  245. mov es:[si], ax) G( m/ L( @3 A9 z+ J
  246. add si, 2, ~4 X+ }( l* d! ]; D: Y$ o1 D" o
  247. loop @b
    + C/ h' j6 o4 {* R: y
  248. mov cx,880$ ?5 Y$ c4 Y2 Q
  249. @@:! q+ _, u! M  D
  250. mov al, [di]* L+ K, @: f" E0 H. D- k  f' q
  251. inc di
    " D" W' ~7 {; [% E2 Y" w) e3 d
  252. cmp al,20h( v  ~: w$ i9 Y6 R
  253. je showch1& @* h) a" g! E4 A7 M! ~
  254. mov ah, 17h, G0 Y& g( \! q% C
  255. jmp showch3 4 Y/ K7 h, y/ D2 L- d# X& }
  256. showch1:
    ( S# b7 g* W# {+ O) y6 D% R% g& U
  257. mov ah, 07h
    * b# T, _4 ?* l! A8 A  c3 q  W
  258. showch3:+ p7 n4 Y& K. b' i
  259. mov es:[si], ax' P8 a5 d  n9 _6 a; s4 f1 ~' d
  260. add si, 2/ D* w/ R6 e. M' D5 z
  261. loop @b
    0 v' \$ ^1 v2 u9 P
  262. popa* h( G2 u- a6 B, `
  263. ret- |/ X* Z4 |+ Q' K6 y
  264. showmsg endp* ]# V& Q2 M. D5 s/ x
  265. * k) }! H- ~4 b+ i! p* Z) ?2 f
  266. oldint proc
    8 T6 X8 j5 B: z
  267. pusha
    & n1 r! O$ B- }: W! G0 A
  268. mov ds, word ptr cs:[old331]$ i% D$ H9 |3 x2 q& l
  269. mov   dx, word ptr cs:[old332]3 ]' D: l: }0 x, S# x& F* x
  270. mov ax, 2533h6 b4 n8 F. e4 i4 x! u$ R
  271. int 21h$ D/ a3 [7 `" U* y  S$ n
  272. mov ds, word ptr cs:[old741], Z) \1 V# @2 u( u% O
  273. mov dx, word ptr cs:[old742]
    ' X' e/ b9 J+ r0 a+ j% \( v2 E8 q) H
  274. mov ax, 2574h/ v+ l) m% a( b' E" e6 K
  275. int 21h/ T( _3 s8 E' g; X: A9 [. Z( t
  276. popa: \2 y6 s  ]: H0 D) z1 L
  277. ret: x# B7 _% b- _- q" i
  278. oldint endp. V6 C: @  r% U, [5 e+ c
  279.   m2 g- P) ^: z' |1 |; W2 i
  280. memmouse        proc
    ) i; j# ?; @* p- P
  281.         xor     ax,ax+ X1 H- S% P; i  M
  282. int 33h
    ( S: g) n$ m* T5 q3 q
  283. cmp ax,0ffffh
    : L/ P5 j) l2 E# M* ^; T( ]
  284.         jne     not_loaded/ B5 I0 {) u, u- B: i9 h3 @
  285. mov [memcopy], 1. j% K1 p0 g1 A* Z2 m
  286. ret
    ; S4 ~0 D' C; M+ D) W4 |
  287. 4 V# m# w6 x9 z7 G. O3 B: Q
  288. not_loaded:* {$ L; H3 M4 T7 s  l" T, Q1 K
  289. 9 e  w7 Q; v! ^. D2 I% H
  290.         mov ax,2574h. b  ^1 C" ?9 {
  291.         mov dx,offset new_isr
    : s; c7 E( T8 h5 Z& D2 j7 y
  292.         int 21h
    , _; ^5 x, {" m# S% g

  293. . n; \0 D5 q2 V: j6 T4 S6 b! V
  294.         mov ax,2533h+ |& \# N& i' w  t2 a
  295.         mov dx,offset new_33- K2 P% i+ ~' }, M3 ~7 B
  296.         int 21h9 l# l  y& E1 A; X0 {
  297. 2 ]7 s$ Y( G9 a7 r4 Y9 q
  298.         cli
    / @# ?( H' }4 O/ b# s: p  o/ ]
  299. # y6 ?( V( V% d& u* ~  K# J
  300.         mov bl,0a8h5 `6 P3 x2 @! ^* R5 D2 H
  301.         call keyboard_cmd
    " G) l$ ~, J( C. o
  302. & x0 f. g. ]" n4 D' f, O- @
  303.         mov bl,20h
    % m" D6 z2 G+ y+ j1 r) {: f+ g
  304.         call    keyboard_cmd$ X1 b/ B$ Q( C% f8 v; V
  305.         call    keyboard_read
    ! {0 m7 ]- _2 r  K
  306.         or      al,2
    0 e' T. L9 P' h3 d# q, c/ `
  307.         mov     bl,60h
    4 g: {2 T' T- X' j9 }& Q
  308.         push    ax
    & e1 x; ^- S0 b
  309.         call    keyboard_cmd* G8 I2 y  |5 M8 R
  310.         pop     ax
    1 i$ C, g; T/ V( z; y6 h7 u! E" K2 Z
  311.         call    keyboard_write
    : R0 h( T% R) @  N- K) ~' u
  312. 2 `* S. P+ ]; n5 [# i6 j' g
  313.         mov     bl,0d4h
    4 v) `& X& F4 J; ~/ |
  314.         call    keyboard_cmd2 p, s' n; ?% f' ]
  315.         mov     al,0f4h
    $ w- Z$ T6 B6 s/ T
  316.         call    keyboard_write
    7 w7 e5 n. t1 D0 F0 M, t& N

  317. 7 K& I8 }) s& `- r
  318.         sti! s9 y; z! l4 W! C+ O4 N
  319.         ret% g  P+ l/ M+ k2 }" }. }0 P, g' y
  320. call_user_isr:
    : K+ X; R( c2 U. h$ M' x5 W+ T
  321. db      60h, h( ?0 h. Y, l3 z! M! J
  322.         mov     cx,cs:[pos_x]
    0 W, l$ U$ b5 \
  323.         mov     dx,cs:[pos_y]+ B& W3 [8 S2 ~4 H3 D
  324.         mov     di,0 ;cs:[x_move]
    , x2 r' c9 C) g* h; P
  325.         mov     si,0 ;cs:[y_move]* g3 L/ d7 x3 d
  326.         mov     word ptr cs:[x_move],0* A9 o1 O& _7 `8 B& q
  327.         mov     word ptr cs:[y_move],0
    5 V( m" J, X$ O  D; \
  328.         mov     bl,byte ptr cs:[buttons]
    ' @1 S6 y# L3 x% y
  329.         xor     bh,bh% c" b9 V% E. Y2 L
  330.         call    dword ptr cs:[user_subroutine]% X% k* Q6 V$ H: W
  331.         db      61h
    5 z& Z5 h( h. g$ i
  332. ret
    ' b. P7 J; a  G9 ]
  333. new_isr:
    % h9 E3 j( e) r$ n5 H
  334.         pushf& |# Z( U7 m' I' A
  335.         cli) ^1 p+ R( T8 P$ K# ?
  336.         push    ax
    6 {( E) h! m% ^" j
  337.         push    bx
    " m( w, a: t. c3 b8 f
  338.         push    cx  S/ H" ~6 p* a! s- z; Z
  339.         push    dx
    , y2 _+ d4 i) z  P1 l( \) Q
  340.         push    di
    , t7 I( @3 j: M
  341.         push    si% C& u) `0 C. J9 [8 O
  342.         push    es
    / d+ a' V- g7 t" X
  343.         push    ds; |4 M1 K2 f, y6 l

  344.   D5 r# A- |$ f# B8 d( T3 z7 d% {
  345.         push    cs* w) |9 t# ]" u% n( P$ @6 K
  346.         pop     ds
    ' c1 v/ s& E$ X9 j' T! i

  347. 9 F  N+ K4 Q% S1 T3 A/ V
  348.         mov     bl,0adh
    $ ^. ?1 x5 N6 g% f
  349.         call    keyboard_cmd% l1 C4 v! K/ E3 T0 q7 H' z

  350. 5 H- k: x0 T6 e* g* v. ]
  351.         cmp     byte ptr [first_time],0" ^5 g; X5 C" h" Q& |7 ~
  352.         je      not_first_time
      n$ R3 K$ D" k

  353. 0 X) Y0 i+ Q' {# a8 m
  354.         mov     byte ptr [first_time],0
    2 s3 m5 o7 }6 T* {8 ~, h) L0 G& d
  355.         call    keyboard_read' ^  I5 y+ B% ~& h' z0 Z
  356.         call    keyboard_read9 C. u& V7 H1 i0 i; k7 ?; v7 V$ v
  357.         call    keyboard_read$ z! }+ X" `( p3 J6 I$ X
  358.         jmp     no_show
    4 @/ A9 b2 s6 M; e1 m" j$ D
  359.   N! o9 Z- X; c5 I# `$ ?" F
  360. not_first_time:
    , s: H- o; m& j( V
  361.         mov     word ptr [temp_mask],06 h$ N! t7 [' h, f  `

  362. ( _0 u7 n3 H/ [# F
  363.         mov     cx,[pos_x]
    * c* s2 T' B# n' ?
  364.         mov     dx,[pos_y]
    + r8 @, a' o  F' b; E) I8 {
  365. % l% o. ~$ s: l3 G' U. ]7 |
  366.         call    keyboard_read
    8 t. }0 T" d$ o5 w( n  ?5 K$ J1 Q
  367.         and     al,7 ;3
    3 R/ m! n* y) K4 U9 c. j, V
  368.         mov     ah,[buttons]3 i! i* O) y1 ^& h: O8 ], M- P
  369.         mov     [buttons],al
    ' `/ _8 Q! @3 ?1 r: W) p
  370.         cmp     al,ah* [+ W/ ?- z: v+ O+ _
  371.         je      no_button_change
    - |+ e. r) e2 Z9 w
  372.         and     al,30 Z9 `( M+ T2 c; v& ~9 z' Q1 {2 w
  373.         and     ah,3% [2 s1 R9 Z' g9 W
  374.         xor     al,ah
    ; ]5 L, M4 {5 x) {2 z, j
  375.         xor     bx,bx
    9 R2 _0 k& |, I  J- y' K8 M+ ]9 i/ z
  376. $ {+ A9 u7 ^. [& q
  377.         push    ax
    - |8 c" ]. j; n# d
  378.         test    al,2
    5 t: y  n. ?5 T/ \$ d& d! ]
  379.         jz      no_right_button_change9 k$ f& f: {3 K! z3 S7 e  D- O' K
  380.         and     ah,2
    , \# A  z6 @2 B6 y$ ~+ z# d! _. o
  381.         jz      right_button_pressed
    8 A) d; l. [  b8 L9 u. X8 b% K( ^
  382.         or      bx,16$ P& b3 D$ _1 g7 Z3 D
  383.         jmp     no_right_button_change8 X: @7 ~( ]1 Y7 \8 G; f& E/ [7 m
  384. right_button_pressed:
    9 w- J3 ^% [- h! B5 U
  385.         or      bx,8
    ; F5 d. {2 Z0 X2 _
  386. no_right_button_change:
    : r' n" e# j0 ^% }& y# K& ^

  387. - t) s2 e5 V/ c+ y) w1 z% u# T
  388.         pop     ax
      Q" X) S% Q' w4 U
  389.   q5 k3 X  E7 ?# v, X$ l, z
  390.         test    al,1
    + t, H) j2 y; U0 @4 e3 c$ U& E
  391.         jz      no_left_button_change
    ( U+ d  N  Y( n1 r3 G! T. f9 g
  392.         and     ah,1
    7 Z9 B! g! Z/ x
  393.         jz      left_button_pressed! E( D0 h- l  t3 U
  394.         or      bx,4# I  Q* W( g" ^! m# P$ V) N
  395.         jmp     no_left_button_change
    6 q- L+ _6 x% a5 V1 n
  396. left_button_pressed:1 J/ y2 G2 F& s0 F) F8 Y- b
  397.         or      bx,23 J, l! g  N5 c8 e
  398. no_left_button_change:% @) ]2 n- k$ v) V2 f( l% m) i
  399. 4 K6 E# v& r% Y# I
  400.         mov     [temp_mask],bx
    2 V2 ]$ ^' ]5 M- X6 ?! J* o+ v" V
  401. 2 [1 g& ~6 A+ @+ d: k+ U
  402. no_button_change:/ v! u: @5 ^6 W/ U7 W; R
  403.         call    keyboard_read
    8 P! n# N' m) o! C
  404.         cbw3 ]& {8 u$ r# b" _" S+ t9 a9 F$ X
  405.         add     [pos_x],ax
    5 r- z) g1 w. ?9 B5 m; {
  406.         add     [x_move],ax  Y$ W, F. ]4 h8 G( Q( W' u
  407.         mov     ax,[x_min]
    + E2 I- l4 X6 M) P! A  H
  408.         cmp     [pos_x],ax- N: f8 G! k3 O& h
  409.         jg      good_hor18 Y# A, M, B5 r
  410.         mov     [pos_x],ax* E4 S% p, y4 ^' @3 b
  411. good_hor1:
    * F' A: s$ U% ~. ~; O
  412.         mov     ax,[x_max]
    # D# ~; \/ Y% |& j
  413.         cmp     [pos_x],ax
    & k: l/ E5 f- `4 U5 m+ X
  414.         jle     good_hor23 x( O# T9 \4 |# n( U
  415.         mov     [pos_x],ax: g3 l1 O6 p* Y1 ?. ?
  416. good_hor2:
    ( k9 A* s5 J6 h# |# y# ?9 m
  417. * K1 c7 K9 F  U7 X% {7 i0 @
  418.         call    keyboard_read
    . N% j; H( o" i! r3 v; d1 x6 x
  419.         neg     al
    % |, l# O  ^$ g/ s& `( I/ R$ }, l
  420.         cbw2 i+ c# Z0 X( b
  421.         add     [pos_y],ax. _( H% G+ ]7 B0 a+ M' _! |
  422.         add     [y_move],ax
    - {* [8 J* b8 d; F8 v
  423.         mov     ax,[y_min]& S. K1 _$ a6 X: S  h
  424.         cmp     [pos_y],ax
    0 T4 U, Q6 @, V8 J6 m# ?# @
  425.         jg      good_ver1
    ! O4 n6 }; v$ _% s: i
  426.         mov     [pos_y],ax9 v: a# e* {- @0 i, O
  427. good_ver1:1 X+ i! X1 v1 C7 Z3 f0 J
  428.         mov     ax,[y_max]
    / p) K$ ]4 r0 E: h
  429.         cmp     [pos_y],ax
    / Y3 ]4 q+ _) C7 \, R
  430.         jle     good_ver2( Y: N- K9 a! ^# K& I1 W4 I
  431.         mov     [pos_y],ax6 v5 u+ v6 n8 _7 m* u
  432. good_ver2:
    ; a5 ~% @9 q+ f5 u0 b6 y
  433. 0 J4 ?- g8 l; Y; e" K
  434.         mov     ax,[x_move]
    * c& C6 E' N' K+ r- l2 A
  435.         or      ax,[y_move]
    2 g- X2 `( _6 b; B4 A) W
  436.         or      ax,ax$ v2 S  K+ q4 W- m8 B
  437.         jz      no_change_position2 r# X) x. o0 y; B$ _9 ]* X
  438.         or      word ptr [temp_mask],1
    % A. A5 V' L! Q- Y  X6 N
  439. no_change_position:
    + P1 {4 Z0 `( O! ?
  440. 8 D9 E4 n% x+ t3 r* a: p6 ?
  441.         mov     ax,[temp_mask]+ f+ m) ]1 m5 `, u  e! |& W) A
  442.         and     ax,[user_mask]5 C, c( Z$ S+ o
  443.         jz      no_call_user7 k- [+ k$ r7 z4 B( t( `% ?
  444.         call    call_user_isr% a2 a$ |* H6 b# B9 b- V
  445. no_call_user:
    0 m- x& o( `9 \; y3 X7 H' i. c

  446. 2 t6 R/ u8 j  ^3 u0 B# n
  447.         cmp     byte ptr [sm_flag],1
    6 Q8 D2 [3 Q# T6 C$ u
  448.         jne     no_show7 Q/ E; ^! k# d) L8 }
  449. 3 O2 ^" r& D2 `! L6 o
  450.         shr     cx,3
    / Z9 o1 U; a7 x; Y3 C( B$ \
  451.         shr     dx,3
    + y: |% v( @) R- O* E+ k- ]! C
  452.         mov     ax,80
    6 X; ?. J( D" v  M; b  l
  453.         mul     dl
    4 {; f, {  h$ A5 H
  454.         add     ax,cx8 |) C2 d- E/ r
  455.         shl     ax,1
    $ D" s  ?% n" _
  456.         mov     di,ax' g, a# n$ P# D* M; X
  457.         mov     ax,0b800h! Q- F1 C7 p8 i4 U: [$ G
  458.         mov     es,ax
    / s: K+ z( E, o
  459.         mov     ax,[save_char]; M  Q0 ?1 l4 |6 J' u
  460.         stosw
    ( q3 n' ~6 k7 E/ @( K! v

  461. 9 W4 r- Q5 Z; r& N$ I# D1 V6 m
  462.         mov     cx,[pos_x]% k4 G7 T+ f6 E9 [$ `# q7 t
  463.         mov     dx,[pos_y], t5 J( {2 P2 r+ t% \% T  N
  464.         shr     cx,3- z4 j5 R3 |+ n6 @, j2 M0 L
  465.         shr     dx,32 A  L1 \: L3 u$ }
  466.         mov     ax,80
    ' h" K6 q8 L! C. ]
  467.         mul     dl
    2 P4 w: g( u! J3 F6 A6 V
  468.         add     ax,cx1 \; K! ^' G) I
  469.         shl     ax,19 }) ^: B8 H% L8 c0 C* F0 D$ S: c
  470.         mov     di,ax; l2 g3 r/ u% P& w
  471.         mov     ax,0b800h
    6 H, Q7 E- V6 T; `5 L$ m# W# w
  472.         mov     es,ax
    0 S4 y: J0 g1 Z& P8 k+ ^/ Q- F
  473.         mov     ax,es:[di]8 Q4 }  o/ R9 `. k
  474.         mov     [save_char],ax7 s0 ^4 V; B0 K) s3 M. A
  475.         not     ah
      x$ K: p8 ?' v5 T
  476.         and     ah,7fh
    . j5 g+ d" `/ |, i0 ]. E6 \
  477.         stosw- a9 n8 p: A) p1 l+ M7 a
  478. no_show:8 x) d6 }$ ~! M
  479.         mov     bl,0aeh
    ( y- t) S) c9 e" y
  480.         call    keyboard_cmd
    7 T+ ~* ]: N% D$ H# Z" {

  481. 8 i5 L+ o4 P- B5 b: b- ^
  482.         mov     al,20h
    * h4 G$ D0 D" n! E$ H
  483.         out     0a0h,al
    & ~% f/ q9 S+ [! T7 Y# w$ d4 t, x
  484.         out     20h,al
    # z6 [  g) m. a% S
  485. % A# J2 O- s9 `% ]1 l- F! u# ~
  486.         pop     ds
    " O+ ~4 R% }, g3 r& K) K  ~
  487.         pop     es
    ! ?, z( e5 w) F1 Y$ E% b% N
  488.         pop     si
    1 z( f& F8 M1 G1 `/ p) x8 J% u
  489.         pop     di" `, U6 }* J% A# Z) ^
  490.         pop     dx/ c9 |: B1 c: |3 j" N& H1 w  l
  491.         pop     cx2 r2 d  u( M4 W( B1 n& x$ E7 _
  492.         pop     bx+ u# O1 `/ d( w/ u8 p5 _( n# p/ I
  493.         pop     ax4 ~, J+ l3 s' H
  494.         popf( o- s+ T: a7 m+ q# }! ^7 s/ G
  495.         iret' F" r8 t' _+ c& ^( F5 n
  496. 4 ~* N5 F" O+ Q' i; ?) E
  497. first_time      db      1
    0 Y3 x! ~6 v/ U1 l6 C
  498. buttons         db      0/ ?! ]6 E* ~4 E( U/ E
  499. pos_x           dw      0
    % r" B% _4 |. O; |. i. g. y4 p* u+ X
  500. pos_y           dw      01 @/ I1 l7 [+ C' _. D, s0 H
  501. sm_flag         dw      0
    - A" Q* i/ m5 k" j
  502. save_char       dw      0
    , p+ p' k$ ]& f1 v$ A+ }+ ]+ x
  503. x_move          dw      0
    ) g8 y; C4 S$ \0 e: K
  504. y_move          dw      0/ L0 e/ s7 P  R& b7 X& c' j' F
  505. x_max           dw      639
    3 x' o: ]- E# Y) s' H
  506. x_min           dw      0$ B# c/ p8 T1 q6 S6 f7 X. a/ C/ F) s
  507. y_max           dw      199
    . C5 l/ s1 Z( g
  508. y_min           dw      0
    $ [1 h% d1 ~; ^- m
  509. user_subroutine dw      0,0
    ; |% M6 L0 L9 ^9 Y! p" N6 O3 L
  510. user_mask       dw      0" |& ^$ b( k  \1 @0 w
  511. temp_mask       dw      0$ u( j, E" e# b5 O' `% W& T

  512. * I8 \8 _0 H& r
  513. keyboard_read:2 I, r: _3 W0 Z9 ^& L
  514.         push    cx0 e* _; e3 K, Z: D5 Y& o- x
  515.         push    dx
    ! \3 J3 z1 w! O: I
  516.         xor     cx,cx5 s: o1 a' \' o1 {' _. S% X8 ~
  517. key_read_loop:5 \$ @. Z7 c  E6 s
  518.         in      al,64h& t1 M% `; U9 s
  519.         jmp     $+2
    % Y& S  J! R' _) j5 j7 f
  520.         jmp     $+25 V. [* f6 e  U
  521.         test    al,1
    4 d  B% Q* R* B; }0 W
  522.         jnz     key_read_ready( b  }1 E+ @8 O7 X9 H
  523.         loop    key_read_loop$ O+ J  Q+ U2 K% d) ]
  524.         mov     ah,1- q; p8 T' E6 }$ o- `1 J
  525.         jmp     key_read_exit; A, w2 o, a5 P$ \+ @. N+ m. F
  526. key_read_ready:
    3 v7 o7 a. T: M: O
  527.         push    cx9 p( e2 N2 K9 {5 w. [0 F- o: E! T
  528.         mov     cx,32
    ( i6 \5 B: N+ O
  529. key_read_delay:3 V; x$ Y* e+ N" V# L
  530.         jmp     $+2
    6 f) V1 H5 O( R$ u+ e; S7 n
  531.         jmp     $+2
    : b, x8 M/ b! A! G9 W/ |
  532.         loop    key_read_delay. v1 @* ~0 ~9 U* R6 F3 d( n: V

  533. / S2 v: V( g8 R1 a
  534.         pop     cx* |& Y# i) @- [0 U
  535. - A; ]0 I) D! M5 Q
  536.         in      al,60h
      m! w5 S) K  r$ S, X+ D- p1 x
  537.         jmp     $+2+ H8 i4 ?, C0 o! S' R
  538.         jmp     $+2
    6 L3 G0 M& Q2 e; d6 v3 b
  539.         xor     ah,ah
    0 @- [) H3 |6 V# y- n
  540. key_read_exit:3 G; [0 R8 y  Y' s
  541.         pop     dx/ Z/ g4 S1 A3 t; M
  542.         pop     cx
    0 h2 ^- q8 T( R; b" m  e
  543.         ret
    + C, S, i# h( z$ C7 E

  544. ) [" b  f/ o4 ], [+ ~
  545. keyboard_write:8 h, `& i1 W% y! |" G$ v
  546.         push    cx" j$ G; j3 y4 h4 w4 L
  547.         push    dx
    , F. c6 X) n) d5 v/ e6 Y8 r4 k8 ?/ w
  548.         mov     dl,al
    # f# |5 x6 y# `# Q4 l
  549.         xor     cx,cx
    2 L5 G+ K  u* q. F& D
  550. kbd_wrt_loop1:& c$ \+ l1 H+ q) g- G8 W! L# s
  551.         in      al,64h( R7 o( A% ^5 Q9 [2 i1 F6 i" S' [
  552.         jmp     $+2
    2 z3 u3 f+ {$ X  D! Z. Z
  553.         jmp     $+2# _( g9 b2 ]% p( d. U
  554.         test    al,20h
    6 b: `: J$ O5 m$ o
  555.         jz      kbd_wrt_ok1
    - [0 f  s& `" x% _- H$ C- A

  556. 4 f' t; ~& y1 K! G2 j) _" O
  557.         loop    kbd_wrt_loop1
    6 n4 @2 J: [1 b: v+ B% {
  558. 4 z5 u$ ]% A9 P8 X0 [/ i% j
  559.         mov     ah,1) S1 i7 \, _* I/ q* t# J) C
  560.         jmp     kbd_wrt_exit5 R7 r( y( P4 S% N* T- p. \

  561. 0 l, L9 k! w8 L+ k! Q0 m
  562. kbd_wrt_ok1:, M+ @( [( b# k
  563.         in      al,60h
    . S* t" i6 f' ?! z

  564. ' s( L! a' Y; o5 s* N7 k1 |
  565.         xor     cx,cx) g! ~: O) x) D% I' @- r: {
  566. kbd_wrt_loop:) L4 j1 J" j# t+ C' S. z
  567.         in      al,64h2 Z9 h$ i+ s; ]$ S( p7 F& N
  568.         jmp     $+2
    1 x9 f/ {( s  a+ C1 S5 u  N6 l7 m$ ?
  569.         jmp     $+2
    3 x- M* p7 M/ k6 ^
  570.         test    al,2* N+ a) Z" }( G$ e/ t2 M+ K
  571.         jz      kbd_wrt_ok  \, \* y. p* J& L$ W5 {5 H' A, U( s

  572. , _7 N2 O5 {' Q/ {; j3 K- c. [
  573.         loop    kbd_wrt_loop
    ! w! W. C, c/ h% X

  574. ) c8 u1 I4 Z5 a9 P
  575.         mov     ah,1) Q4 v- g  g, \9 v
  576.         jmp     kbd_wrt_exit
    . M9 W/ Z( Q; }
  577. 8 _5 Y. h) K( }8 u0 q( ~1 x2 V* {% h
  578. kbd_wrt_ok:0 h2 e) ?3 u3 C9 O: P
  579.         mov     al,dl1 f7 o) M* |, K3 A7 W
  580.         out     60h,al
    4 g. O: e4 S3 N/ t3 X2 Q5 w
  581.         jmp     $+2
      C* A( [- B. x; t% Z1 F
  582.         jmp     $+2
    ' U- h' v& S( O, p& P! W2 j
  583. 3 v  n- l$ w6 |" E3 Z& [5 O
  584.         xor     cx,cx8 v7 W7 r3 i( h4 m7 O2 w6 O1 d
  585. kbd_wrt_loop3:* T/ S% d! \, Z
  586.         in      al,64h
    ! {2 c1 a! c5 t; X4 W
  587.         jmp     $+2
    & `: p) n; F" p4 g  m
  588.         jmp     $+2
    ; Q% A! g1 g0 _: S: Q
  589.         test    al,2
    $ n2 v2 }2 X1 Z, u3 y! J: g) H
  590.         jz      kbd_wrt_ok3
    / q- X! A" P5 Z- C9 a
  591. ; Z/ `( e6 h5 d, r
  592.         loop    kbd_wrt_loop3& e( P3 P2 x) l  {$ k4 v

  593. 7 v! q: q2 ?3 \
  594.         mov     ah,16 _7 W; s; M* j7 x1 E
  595.         jmp     kbd_wrt_exit3 {2 |0 w: C7 ]) _) f; r' ~
  596. & N! l4 P& T8 _" D6 O, l
  597. kbd_wrt_ok3:
    $ ~0 D: N6 F# P3 @& E7 R
  598.         mov     ah,8$ d1 d, K5 M) [, K4 |. v
  599. kbd_wrt_loop4:
    7 d6 K! Z6 }& r$ Z0 U/ q
  600.         xor     cx,cx+ z  z- q  R: m0 K; v, L
  601. kbd_wrt_loop5:
    ! X2 a* A. z" }, {# I6 B+ O2 s
  602.         in      al,64h
    ( G; {' s8 \* x1 v8 c9 }- n4 ]3 y5 E
  603.         jmp     $+2/ Z: |, G5 Y! M
  604.         jmp     $+26 N+ N2 h" ~, m9 Z! }0 h& r
  605.         test    al,1
    ( W, w/ t- u6 g# X% ]
  606.         jnz     kbd_wrt_ok4
    ; H7 _: R/ F* L. R: V9 P2 Y, i
  607. 4 G7 J: U8 S! w: q) ]) h7 K
  608.         loop    kbd_wrt_loop5
    % s9 G5 d2 h8 R, d6 F

  609. 7 K- q- u9 z( k* c2 I' R0 B9 R
  610.         dec     ah3 p& K* y- }; w
  611.         jnz     kbd_wrt_loop4
    5 k" W( v! t* i5 R* z
  612. 0 p- A' K9 W( U; C' [8 `
  613. kbd_wrt_ok4:
    5 G3 s3 O' P* b! E: o
  614.         xor     ah,ah
    / i" a1 f" z# a3 v/ i* S
  615. kbd_wrt_exit:( v! u$ [' R+ }
  616.         pop     dx
    & A" S' u& Q! R0 Q" X
  617.         pop     cx
    / n# ~7 S- }9 R3 d8 I2 v9 X) E
  618.         ret: L0 H7 ~/ P# R+ D; y: r* ^
  619.         # M7 e7 f7 E' i: m
  620. keyboard_cmd:
    0 M0 q* i6 G6 @: E8 H+ Y
  621.         xor     cx,cx. a- V  v. x9 s  p& h
  622. cmd_wait:
    - p9 O+ ~8 W, `. p9 N
  623.         in      al,64h! d  B' G7 {& N0 _
  624.         jmp     $+2# ]8 `/ B5 K- r0 x7 }, G
  625.         jmp     $+2% c2 y* x, d2 _8 I
  626.         test    al,27 G4 [* o5 H1 Y* s
  627.         jz      cmd_send. Q: i3 r& e9 x9 l- ?
  628.         loop    cmd_wait0 p+ L+ o* t. {) ]! v
  629. : x& g* P/ X, M2 {) Q
  630.         jmp     cmd_error
    7 U! g0 L- C4 u: v
  631. % e/ @) j7 H: ^0 E
  632. cmd_send:
    6 K: I* S6 ^6 K, e6 d
  633.         mov     al,bl  R7 @; `6 c5 ], P/ M" p) y- O
  634.         out     64h,al
    & Y5 W. t2 r7 a1 Z* d- f3 `
  635.         jmp     $+2
    & S" S  W: L; l6 ]
  636.         jmp     $+2  T3 @2 a6 `: A$ \3 [  W
  637. ) p1 _- \1 D2 J) ^5 o
  638.         xor     cx,cx
    1 y- A1 q# d& v: Z; ^9 O2 S
  639. cmd_accept:
    6 {+ `7 ?2 \2 A( s/ O6 ~& s3 J, Q
  640.         in      al,64h. ]$ ?2 i0 |5 u" `* |
  641.         jmp     $+2' z7 F/ \1 g: c2 e
  642.         jmp     $+2
    8 ?# e: A& o" w$ V- F/ Q
  643.         test    al,2: V6 \. g! Z; `" n
  644.         jz      cmd_ok5 V" F" Z) S" o6 [" x: @" j5 ?; S
  645.         loop    cmd_accept3 f4 n2 A- a1 I' y
  646. % M; N6 a' f4 [- u5 |( ?+ N
  647. cmd_error:5 |& z7 U9 X+ i6 j
  648.         mov     ah,1
      I' l8 d4 h  d7 R& q6 Y" D
  649.         jmp     cmd_exit
    6 d& T( |: S) s9 h1 a' j- n8 }
  650. cmd_ok:
    " O$ G( c) A  c9 ~) R* c
  651.         xor     ah,ah
    $ |; l+ W' q* \: I: f
  652. cmd_exit:2 \4 R" C! R- r. W
  653.         ret6 c; B, S+ B- D! W+ q7 z* u0 l) A

  654. " d* j# A, u+ G* {
  655. new_33:" D2 t' z. s( t+ y; W
  656.         cli
    * W/ W: n! B- O
  657.         cmp     al,00 s0 f  T. O- |
  658.         je      reset_mouse  V3 {" h" F# S0 s
  659.         cmp     al,1
    * w- T/ F. U% U. _
  660.         je      show_mouse
    3 R4 b. k( M2 g( |3 f
  661.         cmp     al,2
      h  o! w' \2 p. S/ P, F. g# p
  662.         je      hide_mouse
    . k$ i( \  {4 e. ?
  663.         cmp     al,3
      Z4 S2 ~7 M3 b) O7 p
  664.         je      get_pos
    # O' O6 C4 O# Y5 r& e  v4 w
  665.         cmp     al,4, u( c+ s: d' I
  666.         je      set_pos& \5 _: w2 T% b. z$ P
  667.         cmp     al,7
    $ H) x5 G: D' [# S8 K) l* a' u
  668.         je      set_hor_pos8 ?1 @, C' H. s% G- K( p- c. T! e
  669.         cmp     al,8
    . T( h: ^5 Q7 H. J
  670.         je      set_ver_pos
    " y' }8 @  W8 `/ w3 S+ |# G& [
  671.         cmp     al,0bh2 a7 @" }1 B7 I7 J
  672.         je      get_mouse_movement) {( n, B+ y% G+ M# ]2 N. l
  673.         cmp     al,0ch% g* Q# q. L  x; h( |+ e
  674.         je      set_subroutines
    2 T& H1 W5 o( k
  675.         cmp     al,14h
    & `& k# b1 `. N8 ]8 R
  676.         je      swap_subroutines
    / L* w& X5 w) N2 H1 p' x# u, w
  677.         iret, H# U* G2 u$ @- s1 D! [4 F# q2 }

  678. : o$ B3 C0 X1 v$ `3 e
  679. reset_mouse:8 d" o. W  }3 Y$ y5 @* \+ J
  680.         jmp     _reset_mouse" f6 J( l" Q$ q4 i) z, ?; l
  681. show_mouse:
    % C6 }$ s/ @; ~6 F1 K
  682.         jmp     _show_mouse8 C; U3 f8 d! `) ^
  683. hide_mouse:. M$ D! p* i8 d
  684.         jmp     _hide_mouse$ i9 r* m; r* h# X1 Y: @. q
  685. get_pos:
    & [9 y0 R3 G9 c, p7 H
  686.         jmp     _get_pos' i8 e' t6 i* A  S. E% [7 w3 v
  687. set_pos:* u! H$ x  G' F$ A8 a
  688.         jmp     _set_pos# A7 s' R* {" x* `7 F
  689. set_hor_pos:
    % D% b' v4 M: o
  690.         jmp     _set_hor_pos
    & i2 G$ s, M( O* V8 y
  691. set_ver_pos:
    ( R( B( F) r  M
  692.         jmp     _set_ver_pos
    8 n& J, P& M: v. j$ A
  693. get_mouse_movement:
    7 }. i7 i0 y6 B' h
  694.         jmp     _get_mouse_movement- Q8 ~) I3 o, m8 _/ r% i! R
  695. set_subroutines:! D6 r5 c% M0 y1 N' p0 N
  696.         jmp     _set_subroutines
    2 w3 k8 @$ g$ _! a" [6 _
  697. swap_subroutines:4 G- w9 J0 b, Z/ H- Y$ w
  698.         jmp     _swap_subroutines0 n9 ]: J. Q9 @1 _% @. p3 S4 Z
  699. % `; P# x4 Y: s- f* t$ b8 C
  700. _reset_mouse:2 q1 m2 E. F0 H5 M- p
  701.         mov     byte ptr cs:[buttons],0
    ; B" I" u  ]+ \8 E
  702.         mov     word ptr cs:[pos_x],0
      Z1 @' b9 g) `+ |: T( E
  703.         mov     word ptr cs:[pos_y],0
    ; `7 p: W$ z' ?% j" f6 B; B
  704.         mov     word ptr cs:[x_move],0
    7 C, H2 ^' F6 i4 [! d
  705.         mov     word ptr cs:[y_move],0
    + o2 q% L5 i1 {, x
  706.         mov     word ptr cs:[x_max],639
    1 T* b7 D, n% ?" T
  707.         mov     word ptr cs:[x_min],0
    7 X: `$ c; I: F: G; ]- V( U6 v0 N6 K
  708.         mov     word ptr cs:[y_max],199
    ! \" z3 s3 A' N# h+ y6 J
  709.         mov     word ptr cs:[y_min],0! T  I; _. W! s! w- ^: V/ T# N  r; x
  710.         mov     word ptr cs:[user_mask],0
    " p; x. |. R2 \/ i
  711.         mov     word ptr cs:[user_subroutine],0
    , O. M' f  `7 k7 N
  712.         mov     word ptr cs:[user_subroutine+2],0: u! h3 l6 H4 w
  713.         mov     ax,0ffffh8 k$ O: k; w) `4 n3 n
  714.         mov     bx,3
      M3 E4 _( K3 B, N& d+ U
  715.         iret
    , q$ F: @0 Q/ V8 Q5 `7 Y  j$ P

  716. & u3 d7 i. T# d
  717. _get_pos:8 ~; @$ }8 h9 h; p' z$ h8 m3 b
  718.         mov     cx,cs:[pos_x]* e, i- {" v- N* g# F
  719.         mov     dx,cs:[pos_y]
    3 @' C# U( y) Z7 E* y6 Q- |
  720.         mov     bx,word ptr cs:[buttons]
    # M7 n8 B# C: D) [& X
  721.         xor     bh,bh) }: ?& y4 P  V3 M# C
  722.         iret
    ' i- k$ ^' S; e0 z- t( O8 T/ ]+ W

  723. 3 ~1 ^2 t5 D- ^; b6 _8 |+ S% Q
  724. _get_mouse_movement:
    8 v# _* ^9 Q( q9 m
  725.         mov     cx,cs:[x_move]
    2 S+ E, A& v  a- u, q% A
  726.         mov     dx,cs:[y_move]0 c; L3 K3 h5 ~& J2 T9 {
  727.         mov     word ptr cs:[x_move],0
      C7 a6 q3 m* p1 e4 J: E6 i
  728.         mov     word ptr cs:[y_move],0
    6 b' U8 H" R4 s; s8 b
  729.         iret
    7 {; N* f0 o# E0 j% d

  730. / V8 Y  i- y% X8 A
  731. _show_mouse:
    ) y5 _5 {3 Y. z  o/ o  {* W! I
  732.         push    ax
    + B+ _+ G5 ^3 A# ^
  733.         push    bx
    8 C7 q9 }( R+ T/ `# V5 O3 T4 |
  734.         push    di7 a6 F2 Z! ?0 X1 `+ A) s# d. D
  735.         push    es- z: y0 V0 I1 A4 W( O6 h7 l6 E
  736.         mov     byte ptr cs:[sm_flag],1
    - I6 o4 D) @9 {) `1 x
  737.         mov     ax,cs:[pos_y]4 D0 z2 P% d2 ?/ I
  738.         shr     ax,3' a  r& N$ v* j1 y1 |. Q/ K0 q
  739.         mov     bl,80
    9 ^$ W2 ?% y- u: H) U! ]
  740.         mul     bl
    / E6 b/ h( f6 `
  741.         mov     bx,[pos_x]+ n% [+ @4 J3 J* |/ i4 q5 t
  742.         shr     bx,3
    / O' d* j9 e% \7 E4 _2 [" J
  743.         add     ax,bx
    " ~- b- p8 v/ z* N" X. T& L# |4 k, x
  744.         shl     ax,10 X4 I/ b* \+ {: [" q5 t5 J# ^
  745.         mov     di,ax+ r1 Z6 U6 ~2 J
  746.         mov     ax,0b800h
    & ^% i4 j# o6 L
  747.         mov     es,ax
    ; y7 Q$ P1 c8 x; m2 L$ e. v) M$ v) n
  748.         mov     ax,es:[di]* h% ]% \5 w2 x$ t" l
  749.         mov     cs:[save_char],ax
    2 i' c, M" X; E8 {& i
  750.         not     ah5 v# c# o7 z' p) B
  751.         and     ah,7fh' o) T* Y& X/ f, |) n0 T, P/ s' }
  752.         mov     es:[di],ax2 K0 l2 [, G& d& W. ^: D# X
  753.         pop     es
    4 A+ f; @6 b/ ]" j
  754.         pop     di
    , j# P2 m6 `# d
  755.         pop     bx
    3 P% C- P; p0 c0 Q
  756.         pop     ax: G" s% _( E+ g" w* k: P$ {& J
  757.         iret4 [+ r: \' [! o0 Z: {
  758. 5 i  J- j7 Y! n8 j+ e8 l
  759. _hide_mouse:
    : O. r# u; E& Q
  760.         push    ax; G3 i0 _5 D2 @. p& y4 `
  761.         push    bx
    7 _9 M/ L: O8 f7 L( I  B& b
  762.         push    di
    % B6 W9 T" B' z  }
  763.         push    es
    & J/ P6 T( ]7 D3 S. K" I1 z
  764.         mov     byte ptr cs:[sm_flag],0
    ! F! M# F( B: U& [1 D
  765.         mov     ax,cs:[pos_y]
    . b9 [0 O, Q6 h/ G! R; _! q
  766.         shr     ax,33 e$ u8 E. z+ H9 a
  767.         mov     bl,80
    " D- B( r5 }$ |3 I
  768.         mul     bl1 R% l! b. T0 N1 s# w1 p
  769.         mov     bx,[pos_x]
    0 j7 E0 X1 s' e9 P
  770.         shr     bx,3" K) n  u6 ]& a$ d: z9 P0 ?' w8 f
  771.         add     ax,bx
    * V$ N9 m9 L# Y# l) E/ A- U
  772.         shl     ax,1
    & Q) _7 `6 P. A: A2 {/ Q: m
  773.         mov     di,ax" V7 f9 T" |& K" I7 T' l5 Z0 R
  774.         mov     ax,0b800h' c8 y4 j% U  z) Q9 [
  775.         mov     es,ax4 u0 T: }* [" t) {/ B8 l0 o
  776.         mov     ax,cs:[save_char]# Y4 l) e- r6 ?/ V; \
  777.         mov     es:[di],ax
    3 `& Y4 L# e. f$ J; [9 Z% _- J
  778.         pop     es
    - z9 u0 w! K7 C9 e( h
  779.         pop     di
    ! O% G% h7 l, Y, r% F8 F
  780.         pop     bx! W/ S  x/ Q" r% X
  781.         pop     ax6 }9 M; ]  z) m6 M" ]' {
  782.         iret/ Q1 M% v0 ^3 ~! G  @0 }/ F. T
  783. ! N1 |& l2 C0 w: U9 k
  784. _set_pos:/ H0 x8 |& w% d' `( o- c9 r4 J
  785.         mov     cx,cs:[pos_x]
    2 ?0 ?, s& [+ n
  786.         mov     dx,cs:[pos_y]% ]9 R7 m$ O& V3 C7 F* F' t: K; P
  787.         mov     word ptr cs:[x_move],0
    / z/ K0 j  T6 ^# N, p8 @- q
  788.         mov     word ptr cs:[y_move],0! O0 n6 c1 f8 R3 H
  789.         iret6 d  y4 M) R1 i& b% p8 h3 g2 Z
  790. " t/ n. l- W7 `! Z, \/ X
  791. _set_hor_pos:
    " C2 k! _# L( ?% J. u3 R
  792.         call    max_min
    0 `" A- y) g" |+ M$ t
  793.         mov     cs:[x_min],cx
    7 U& X: Z) z$ u8 p; y
  794.         mov     cs:[x_max],dx; C$ f! c( a4 F" H
  795.         cmp     cs:[pos_x],cx$ X' |9 U( L8 g0 d# u/ Z
  796.         jge     good_hor_min
    & o/ q6 o# M3 j4 W; Y6 e5 {
  797.         mov     cs:[pos_x],cx+ H6 H7 w; f; S. w
  798. good_hor_min:2 [) M* @0 l" x& F( n
  799.         cmp     cs:[pos_x],dx
    : _6 x$ ]& g) A5 j9 S  v( y. z* X
  800.         jle     good_hor_max4 v8 ~! i3 v0 f6 C4 V" {3 o
  801.         mov     cs:[pos_x],dx
    0 ?) D( Y) m" J$ `; d
  802. good_hor_max:
    ' d) X/ j, }4 Q7 Q, ~
  803.        iret
    5 J5 a0 k# v7 Y# F4 t1 L6 G) f  X; r
  804. 0 B5 |% G! t6 w
  805. _set_ver_pos:
    " u, n$ @8 f  Q2 K  [! r( h) E5 D
  806.         call    max_min6 N! X: k, B7 `  o# p
  807.         mov     cs:[y_min],cx& M- u. e8 q$ n5 F1 d0 s. k- ]6 Z
  808.         mov     cs:[y_max],dx4 _  B& U4 @* X4 w. @& q0 ^
  809.         cmp     cs:[pos_y],cx2 _' U9 Y; v. A
  810.         jge     good_ver_min  V" R! i9 F$ j- \3 o) f! z
  811.         mov     cs:[pos_y],cx  z0 V( x+ p& f/ I5 b9 }
  812. good_ver_min:
    3 S4 K, L' o4 H# s
  813.         cmp     cs:[pos_y],dx3 @7 C" i9 T9 I1 w$ P: q
  814.         jle     good_ver_max
    0 d0 g$ p9 ^% E6 H6 x* c8 K
  815.         mov     cs:[pos_y],dx
    6 y% p5 O5 v1 S% L$ e6 w7 t' {
  816. good_ver_max:
    9 m6 k# C) s* n- T  W; D( s/ e  B
  817.         iret& [% T$ j$ j/ o

  818. # x9 X. E; k) Y0 c& j7 V$ f
  819. max_min:# C5 J: N6 X- D0 D0 N, ]+ n; S
  820.         cmp     cx,dx
    8 l6 [2 @, I" `# v' f1 D
  821.         jle     no_swap" v* q# n" Q7 @$ @! ^
  822.         xchg    cx,dx
    ( [5 L; H6 T( l) y9 P
  823. no_swap:9 E0 m  f# v9 R6 W9 k( ]# F
  824.         ret: g+ L0 v( F! o6 Y8 X+ r, e
  825. 7 p; p3 _! O# b2 G% k. K# b3 c2 I' M
  826. _set_subroutines:5 W# N$ S' X- O* @9 I
  827.         mov     cs:[user_subroutine],dx. L: @5 G) u1 }- s, d
  828.         mov     cs:[user_subroutine+2],es7 y  _2 C. s. c& J6 ?7 u( [: ^
  829.         mov     cs:[user_mask],cx
    + a$ w$ L0 [) e0 f' m5 p# U
  830.         iret& ]! N2 J+ }$ F) A
  831. 1 Z0 a. ]6 w6 [. \. z
  832. _swap_subroutines:* C- z' u6 D( ^9 H6 U
  833.         push    word ptr cs:[user_mask]
    9 l4 d6 O$ ?3 q4 t
  834.         push    word ptr cs:[user_subroutine+2]: q% V  X8 n2 L7 l
  835.         push    word ptr cs:[user_subroutine]- R% |- V4 N9 o* M) w- t
  836.         mov     cs:[user_subroutine],dx
    0 p2 z1 T, ^1 a7 ^
  837.         mov     cs:[user_subroutine+2],es# V8 ]7 e4 B1 g/ m& z1 N- }8 w) y& M
  838.         mov     cs:[user_mask],cx, S. X* W. `3 h# h' ^; a( t. F7 F
  839.         pop     dx
    7 j3 {* ?# y+ F, i
  840.         pop     es
    - X, L* l0 F) T" E6 l# x: c
  841.         pop     cx& U# Q2 z1 |! |! s
  842.         iret' x" u" a6 |& F3 U; T
  843. 9 Q' q. E5 V  |
  844. memmouse        endp5 u* {/ {6 g! n0 m. m
  845. ) L6 [# ^+ \# ]
  846. endof_start:
    % V% f! J+ S* C* m/ A
  847. - Z- j" Q" z0 I$ I0 A3 J
  848. emsg db 'No mouse driver install error!$': l* s" P1 _+ o0 N0 P' C% s7 G
  849. old331 dw 09 J) N! ]4 s: L% F% d/ G
  850. old332 dw 0- H; }7 X1 B# K! T/ y7 |
  851. old741 dw 0
    4 Y/ L( n+ b, b6 ?) d' ~# A  V
  852. old742 dw 06 o4 o1 P  w! m
  853. memcopy db 0
    3 j$ Q4 V% X$ f: D
  854. okcheck db 0
    , o! u: g9 [2 V, {0 p, m
  855. pass db 0
    + f% O8 f$ ]' F6 B' C) o( D
  856. chkl db 0- {8 t3 M. i- d$ a) x
  857. lk db 0" J5 N! `" @5 I1 ~
  858. chkr db 0
    6 |; B& G* `! @# z
  859. rk db 0
    7 ]" g/ Q, V) A% {1 R  F1 j
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ': N$ x& v4 d1 o- ?9 q
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    + `! j0 z5 h, q5 h: n/ `( N! N
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '3 h7 N/ V' Z6 r) }% ?4 e
  863. db '                                                                                '2 m. k2 X1 o+ |+ x5 M* x) `6 b
  864. db '                                赏屯屯簧屯屯突                                  '
    1 t9 r5 t/ V6 ~: B* B. _9 l
  865.         db      '                                ?OFF汉OFF?                                 '
    0 J( ]! z! j# A1 s6 a3 k% m
  866. db      '                                韧屯屯既屯屯图                                  '
    7 o/ y" T5 T, G% N/ a8 I
  867. db '                                                                                '+ x4 y! `4 s8 D8 e1 i$ Y' U1 Z; s
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '$ ?7 Y' B2 C8 V( u6 I+ R4 j+ d) k
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '   n% K! S2 a; g, t/ Q: D2 S
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '- [$ Z6 W) X3 J8 Y& m+ k' g. P

  871. & l' i* H0 A1 g$ D' d: {
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!3 S. P1 j' X9 a/ Z: @$ U$ M
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... * k; B& c/ h0 p3 o
" O" L! g, w+ ~# n
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-19 22:08 , Processed in 3.277029 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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