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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
5 |9 K) d# y- u6 s# }& {; i. \0 A, z! z. T" c
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    , \+ v2 X) p& i
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
      K# _8 j, m" [" w# W- L1 C. N. \* j
  3. ;                                         By Bini.Yi 易祝兵/ G3 @" O1 n5 d+ k; F0 \
  4. ;                                         http://www.ufoit.com 计匠网! i, U! I/ M8 l
  5. ;                                         2002/04/06 YYYY/MM/DD
    5 i1 B3 y% y: m0 e2 G
  6. ;3 @/ y' ?" X# a0 A
  7. ;          7 l' q# f4 j$ r
  8. ;          This program  test the mouse button  click and move.0 v  Z- s- ]' o$ ^6 w6 |* Y& X6 c
  9. ;; [# P) f' O" |' Q
  10. * j$ A( J- ?8 n: w7 l) R9 s; W) F6 c
  11. .model tiny
    + A* a, I( p# H& U
  12. .586
    8 N/ @7 M: `8 F* F6 H0 k! W1 n  O
  13. .code
    4 S4 v* P6 Z& Q
  14. .stack  100h2 t$ r' X% u5 T- x9 f
  15. .startup
    2 d% Z9 q1 h2 y% e3 e7 J5 E
  16. pusha
    & `+ y: m/ H: y% i$ s6 A
  17. mov ax, 3533h
    ! K2 o% ]& \+ R# }
  18. int 21h2 a/ \! e; b" _4 C) V* `) k
  19. mov word ptr cs:[old331],es9 a3 [* ?! M- R. o. A
  20. mov word ptr cs:[old332],bx& @; R% T3 F/ ?) v& j4 T0 z: D
  21. mov ax, 3574h
    , w2 [( @. h! V. ?
  22. int 21h3 A- J$ j* K$ |2 q$ z0 M! |; V
  23. mov word ptr cs:[old741],es
    5 z5 R" Z/ O! K6 v6 Q
  24. mov word ptr cs:[old742],bx: V) Y: m) ^2 S) r# E
  25. popa: {2 q1 `5 I4 N# H# b9 R( m
  26.         call    memmouse
    ! `! Y8 h# q" Z; \7 L$ x/ i
  27.         mov ah, 003 p7 n. O  O7 ]4 N( i5 f% u/ v: d
  28. mov al, 03
    7 W. ~' e% p2 a# [- }, M
  29. int 10h
    / ]$ j1 r8 t8 |' C6 ~/ a( i6 T7 \
  30. mov ah, 06
    . n8 h) x, d, J+ w) k( S  f
  31. mov al, 0
    % n# g1 l# Y# y
  32. mov cx, 0
    1 w' u# |* s0 b( @6 H
  33. mov dh, 24  ?, |  R, Q9 ~9 M. P# a
  34. mov dl, 79, x! P7 }( U" s4 m5 v
  35. mov bh, 07h
    5 @! M$ j" E& ~+ R& v, i
  36. int 10h
    , I; f" l" X1 H! [) y! E9 u
  37. mov ax, 00005 J& W* y  R6 j6 e2 V
  38. mov bx, 0002
    " E& j- T* G6 @% A$ k
  39. int 33h5 M6 C; Q0 U- S7 R, h8 t
  40.         cmp     ax, 0000           ;if no mouse drive install
    0 L% F  t. ~, E' {
  41.         je      errormsg           ;show error MSG
    ; E/ ]1 H& Q+ ?/ O! K$ E8 N5 J* W  j% O
  42. mov ah, 02  V$ j' Y$ T& P" K1 J
  43. mov bh, 00
    7 [8 F& F! G2 C3 E
  44.         mov     dh, 25             ;Move point out screen) M3 z1 \7 e5 M+ M1 l
  45. mov dl, 79
    ' }. y+ G9 p- g# @$ e: m
  46. int 10h& }4 }# N9 A+ B+ @
  47.         call    showmsg            ;Show info
    & B8 i3 l6 c) q2 Q' R' p6 n
  48. mov ax, 0001
    7 W5 ]  C- Y1 S! y* K3 K0 Z9 n
  49. int 33h
    , Z9 E) Z4 g2 @9 V/ D- F* U
  50. ; mov ax, 000ah
    $ `+ C2 j4 \8 F) o9 r
  51. ; mov bx, 0000- D+ e# w  n! {+ O; b% y
  52. ; mov cl, 0h0 f' g, T8 `( W4 J# p
  53. ; mov ch, 0F0h
    : j1 t. w- `% D* V
  54. ; mov dl, 0h6 M2 v/ s- S! B+ Q. b
  55. ; mov dh, 0F0h/ E. x3 G% M5 k4 ^" V- Q
  56. ; int 33h- t# B6 R5 Z9 N  k, s" B7 V; }9 z
  57. mov ax, 0004h
    * D, u; h/ F" C9 v2 t
  58. mov cx, 0319
    9 T$ P* d! T/ a
  59. mov dx, 0103
    ) o1 @! S0 O0 z' g/ ^. K* d
  60. int 33h3 w. h* l4 S, ]& ~) O
  61. casemo:                           ;Case button click and point move
    * W  B, l2 v& P$ C) U( W& l
  62.         mov     ax, 000bh         ;and keyboard press
    0 A, a1 g- n4 ]) j. b& D/ v
  63. int 33h/ ]2 k% e# t* M  a7 w  O
  64.         cmp     cx, 00h           ;if point move....X
    # |( N0 a: ]' \4 P3 u
  65. jne xmov
    4 O7 L: Y4 p+ ]5 s
  66.         cmp     dx, 00h           ;if point move....Y* N! @9 j; n4 g7 j9 O
  67. jne ymov7 p7 Q1 W; |7 k* a
  68. xymovend:                         ;X.Y move end
    : b. a$ a" L- ]
  69.         mov     ax, 0003          5 k& r6 S& |* u3 Y8 R( a4 M
  70. int 33h1 t/ E# t8 L/ P* a
  71.         cmp     bx, 0001          ;if left button click  show ON
    ; D& V3 m9 X) ~# N# r8 g
  72. mov si, 1828' F# N! E+ m8 A$ s; L" C- j; n
  73. je listl
    " f: e: f& A1 q( k) \
  74. mov si, 1828" M8 q  e; r7 }4 P) g
  75.         jne     nlistl            ;if left no click show OFF& B. K  l' R; w" d, I/ h
  76. testr:
    / w" P. S4 O2 _
  77.         cmp     bx, 0002          ;if right button click show ON
    7 t. Q$ d$ Z- \- e4 \1 s$ s+ `8 h
  78. mov si,1842
    9 p& Z2 E5 K- V: V
  79. je listr4 w3 v8 ^' _" ~! z
  80.         mov     si,1842           ;if right no click show OFF% }, [4 P  |- l' d& \
  81. jne nlistl) C9 G# x: c9 A4 A; O  `, ?
  82. casekey:# R4 ?- x9 Q: S  g
  83.         mov     ah, 01            ;if any key press jump check
    9 c! k+ s4 d( F+ U& z6 K8 i
  84. int 16h2 O+ B' N7 E7 y
  85. jne kpress( D: `8 ?2 t! J. Y7 _
  86.         mov     al, [chkl]        ;check x flag
    ' n$ k$ n* L+ A6 D: _& r
  87. cmp al, 02h# V2 D) _: b1 H7 l/ I3 Z
  88. jnb chkok% v  m2 w1 |! y2 \7 i6 n
  89. jmp casemo
    + p8 s* p. t& D# N9 \2 i3 n
  90. xmov:                             ;if X moved, get the X flag+1
    2 t8 L1 _* i$ C# A
  91. mov al, [chkl]- o' |  F8 \+ A9 {
  92. inc al
    % O7 f0 U: e0 g. o; t: j
  93. mov [chkl], al
    % i; `: V9 ~- U9 `
  94. call passok$ b4 R2 B7 U; f* V4 S2 f$ V
  95. jmp xymovend% U5 ]$ {7 K" _. @/ Q2 ]
  96. ymov:                             ;if Y moved, get the X flag+1- N: D$ B) ^, l2 y  Y
  97. mov al, [chkr]
    # a+ P3 x" N$ R6 L5 N( {; O! T' X
  98. inc al7 k) `- Y0 p0 I7 V+ p
  99. mov [chkr], al. ?5 X5 p! Z5 t. m3 n
  100. call passok$ H) G1 c1 u) ]2 K0 W+ ?
  101. jmp xymovend
    * H2 P5 D$ i+ Z! s: ~9 b4 f

  102. : I. [: q" M$ Z$ L7 ?
  103. passok proc near
    / S& W0 t1 \" y: [- [, `2 O
  104. mov al, [okcheck]
    * j5 p4 e1 t; o0 j4 M" N
  105. cmp al, 1
    0 c! s4 w% J! z" S( S" J" X
  106. je let0" O% v, y0 n0 s) b1 f
  107. jmp passret
    " D. S3 M3 w  L6 i
  108. let0: 5 `/ K' D# f) I; ?: t( F3 ?: ]' [
  109. mov [pass], 1
    ' _; x) W. |: k0 Q. Z
  110. passret:
    / U8 r$ n9 Q, C( E
  111. ret
    # u+ v$ y9 _1 S! [
  112. passok endp
      u8 N+ _' t! z" I$ Z

  113. ) T5 V/ u( }/ G
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    / t9 q# D7 o9 L' x, s/ h9 j2 m
  115. mov al, [chkr]
    : h* K) `" B9 ?; R% j
  116. cmp al, 02h
    . a( n  ^+ p6 ]; G* D
  117. jb casemo
    / c* L$ |! ]0 z7 d5 _/ n
  118. mov al, [lk]' ^) H4 a. J5 |  T0 Q! B
  119. cmp al, 1
    6 x3 Z9 N. Z$ ~2 W& ]
  120. jne casemo3 L' I- k& k5 w. s9 p6 v, c. F
  121. mov al, [rk]/ H4 r3 s6 P' ]  {7 ^2 C6 w
  122. cmp al, 1
    - _, {( t7 M/ D+ t- ]
  123. jne  casemo0 Y/ _! O. H& }! }7 A
  124. mov [okcheck], 1  B9 F' W+ \6 a+ J/ [
  125. mov al, [pass]
    ) R9 H1 x8 I- O: y: x
  126. cmp al, 1
    6 M- ]- H9 f" u6 ~& p
  127. jne  casemo
    1 C4 f. `, {+ o( j( O1 Z3 g
  128. mov ax,0002h
    6 N' j( g& D5 M  F2 A( o
  129. int 33h
    2 S8 w6 I9 q% U) M- [5 M" ~" y, U( ?
  130. call cleascr
    / a; J; X  }7 r
  131. 6 P2 z7 N3 ~- j
  132. call oldint+ F; s3 Z* F/ J+ p
  133. mov ax, 04c00h/ b: A. Q" u3 l& q7 L
  134. int 21h
    2 C* B$ D. l9 \0 e6 P3 I

  135. 8 {5 ~5 _6 I: Y  W! \
  136. okexit:
    : X) c% D# ?# n: |
  137. mov ah, 4ch" Z' i; t1 [* n6 o2 W
  138. mov al, 0. P. j' V* Q2 D3 t/ ?+ c& _' B. a
  139. int 21h2 j7 `( g3 \3 Y5 K2 k
  140. listl:                                 ;Show ON( c+ u# }* l! \) Y
  141. pusha
    ) l: G& _1 v/ [% @# b. ^9 {) {
  142. mov ax, 0b800h4 B: J  ]) A* A3 s; g0 h
  143. mov  es, ax
    9 ]- ?. w, B, @: d* H
  144. mov ah, 47h% B, _* O) s/ }8 G! M8 ~+ y
  145. mov al, 20h
    ) e+ a7 _& P$ Y4 W& \- r0 R  n
  146. mov es:[si], ax0 \6 s& B; T# ]
  147. add si, 02
    % ?9 a& e" q3 `% L& g' ?
  148. mov  al, 4fh: s0 U# d& V4 J& Q% ?- Y
  149. mov es:[si], ax
    9 Q8 l3 S+ e: X+ ?! a" G9 G
  150. mov al, 4eh* Z3 ]( {8 t  \% }  W, V6 b' P
  151. add si, 02& ]+ ^* h( W# Q/ i' a! i6 B% q
  152. mov es:[si], ax
    1 L& S( @, w$ ]( _) D3 r- Z7 [; d
  153. mov [lk], 1& \5 V2 Z4 d8 _0 p5 E7 G7 e4 M
  154. popa
    3 P  _( F+ ]) X6 k. ~3 E
  155. jmp testr0 j$ R% s8 u) p2 U5 R) Y8 D1 t
  156. listr:                                 ;Show ON
    % I7 p, d* Z! Y/ z% x
  157. pusha  |( d) Q/ e" {9 S3 c/ _
  158. mov ax, 0b800h
    5 L% S9 h' N  c. y# n; X
  159. mov  es, ax4 p6 D* e; j: b- O/ w" K2 P# n
  160. mov ah, 47h9 c  @6 X& p5 i# l' v
  161. mov al, 20h5 t  z9 O- O0 j; r+ C6 \7 M
  162. mov es:[si], ax7 p, w8 J. p! h
  163. add si, 02; [1 ]) ?. v' x1 }* Q
  164. mov  al, 4fh4 q/ x7 a; l' B" C
  165. mov es:[si], ax) |+ n; x+ j. ?& [; |2 \
  166. mov al, 4eh
    9 w5 V% l; d% h7 j
  167. add si, 023 @+ C0 ]" M9 n' n# t6 R
  168. mov es:[si], ax
    7 J$ o1 _+ X; N4 _# `
  169. mov [rk], 19 d/ D3 o- j% W8 r7 B9 I
  170. popa6 W8 b9 v. F5 P- q+ Z+ G- Q
  171. jmp  casekey
    ! X" w0 q! [2 W0 ?' V+ |/ c& Z

  172. % N. W/ z0 g+ i, N6 n0 [
  173. nlistl:                              ;Show OFF, O* h0 l& t1 k, ?. ^! Q3 N
  174. pusha   6 [: c" u$ R' C
  175. mov ax, 0b800h2 I! e9 N; Z3 ~9 E
  176. mov  es, ax
    . w! G9 Q2 a3 x0 z6 l8 a
  177. mov ah, 17h4 `4 [; ?" A$ g6 B$ e( m
  178. mov al, 4fh
    ! Q1 b4 N7 |( n
  179. mov es:[si], ax5 Q) `! @% @) y
  180. add si, 022 r$ `+ W* f) v
  181. mov  al, 46h
    2 Q( F# w2 f" j5 C
  182. mov es:[si], ax
    " |+ h! m) Y5 j4 \5 h% c7 }
  183. mov al, 46h9 ~/ d9 ~( H! }) i- q
  184. add si, 02
    4 }5 n  k: T$ q- ^- [
  185. mov es:[si], ax& M! ?: A# i2 e% j) G" G
  186. popa- Y; K  U. j/ x& K, `1 S
  187. cmp si, 1840) g& o+ T; j. }0 Q* K
  188. jae casekey
    $ @3 s4 G5 H0 K% t
  189. jmp testr
    / t, \) p3 J$ y' H4 J
  190. " n$ k& Z! {) G, m$ b* ?% P
  191. kpress:                             ;Check key press if press<ESC> then EXIT6 C  h/ b5 Y# h1 f; R' W
  192.         cmp     ah, 01h             ;and return a error; g; a; M. m8 j" A' L' O# U
  193. je exit1$ I% |. g  D! n5 Z9 l) w
  194.         mov     ah, 0ch             ;if press other key then clear, j$ a2 D0 V! y0 c; {2 g2 h
  195.         mov     al, 00              ;keyboard buffer
    " @3 g  A/ Y4 `
  196. int 21h
    / S( L: u) k" x; Y$ \' o3 \) w
  197. jmp casemo 1 n2 E7 \/ w1 p3 j& e

  198. 8 x* z- |$ K( |7 i4 s' f
  199. errormsg:                           ;if mouse driver no install
    4 d$ f$ q/ Q9 q7 P) E
  200. call oldint
    ; P! E% n% S3 Q/ A
  201. lea dx, offset emsg
    1 z# C: ?! x3 u1 I, _$ T
  202. mov ah, 09h1 f( H# z: ~2 M5 q  d' [
  203. int 21h
    2 _- W# m! x' h6 I7 ~
  204. mov ah, 4ch1 x5 F3 c" _( Z5 A1 Q
  205. mov al, 2% G" s0 ~1 i$ s, _% q( u
  206. int  21h# t- w1 v# Q( [+ L

  207. $ X$ c1 V& ~4 I% a+ g4 a7 X
  208. exit1:                              ;error exit
    ( {& \. \  g* f. `8 V0 G. ^
  209. mov ax, 0002h/ |5 C6 F; ~6 t& b0 u; M% \8 o
  210. int 33h1 }0 @" |6 [- \. G
  211. call  cleascr/ @  \: `. f2 G1 C4 ]  }2 c0 k
  212. call  oldint
    - D% x' q2 s6 n9 ?
  213. mov ah, 4ch
    6 r' j* y- L! F( b$ m5 C  I
  214. mov al, 015 k$ O9 c1 C' Q0 F; T
  215. int 21h
    1 T8 p. z# B0 M$ p# a9 E6 n9 _
  216. 6 b1 v3 |; O, u; T
  217. cleascr proc    near                ;clear screen2 d/ a# x9 w  N" c: _
  218. pusha
    ( x( I6 q; n" S( [9 S( E: {% h
  219. mov ah, 06
    , v4 Z1 b( b: b! \" s
  220. mov al, 07 A! P2 d9 e% f" V9 i4 v7 \
  221. mov cx, 0! O& O3 ~5 `3 J5 K
  222. mov dh, 24+ j$ L4 o& I! `4 V
  223. mov dl, 79- T/ @, w) V$ A( g6 K
  224. mov bh, 07h
    7 }/ F$ v7 K- u; S( E- `
  225. int 10h- ^' i, y4 e8 J: D9 |4 C- \0 W
  226. mov ah, 02& B& G. z; Q( a' S/ T$ a
  227. mov bh, 00
    0 j/ F  _6 Q6 G, G6 d# h* c; N
  228. mov dh, 0
    # _: }; g1 w! m8 P# {7 ]$ w
  229. mov dl, 0$ I: M/ }0 `: Q/ t* J3 G7 U
  230. int 10h3 @0 |+ }: m) N
  231. popa
    ( g7 e/ A; h4 d9 X' H
  232. ret
    $ b4 s# F6 @3 r) a+ w
  233. cleascr endp
    4 @/ ^' D& R9 u5 _# q% }+ j
  234. 7 j: _% T* o+ N- Z7 ^
  235. showmsg proc    near               ;Show info
    # O$ D) @9 x& W( ~& z
  236. pusha$ J# u! M* J3 c+ g4 M" |
  237. lea di, offset showms8 G7 Y( M5 W% L* B' g
  238. mov ax, 0b800h
    2 e" B: v* {6 f1 F/ L
  239. mov es, ax4 @, r0 p) x2 W5 F
  240. mov si, 0
    7 g5 }" Y# ?! {
  241. mov cx, 480) ?! S; J$ ^% V. @" F
  242. mov ah, 07h( b0 H& }+ k( _' P
  243. @@:
    1 S! E  [1 K& _2 d) X1 F. }
  244. mov al, 20h# u* u& n* M7 n; n" {' R
  245. mov es:[si], ax
    ; n$ T' F* p1 t" h8 o
  246. add si, 28 ?8 |' l; A# e" f  m2 ~
  247. loop @b
    ! h& E8 L) R' _. C) o2 F
  248. mov cx,880
    : ^" j( |2 X) `
  249. @@:1 z) {6 V! Y- ?1 q. L
  250. mov al, [di]- f7 g  ?9 M  s* H( f/ J
  251. inc di
    " o* ?/ B7 e" E( D1 V7 H
  252. cmp al,20h3 S. W5 l8 p9 H( |0 \! \" S
  253. je showch1
    6 `9 K0 X$ b! g8 |; V
  254. mov ah, 17h/ J2 f9 d! i' E9 k$ f1 l
  255. jmp showch3
    ( |# X; W5 v5 P
  256. showch1:
    . g8 q9 X2 B& ^! V) ?: R2 [' d
  257. mov ah, 07h ) `9 r) n  I% k% M6 N# M( p. A5 n0 ^  @
  258. showch3:  y6 Z! c  `# F) e: Y
  259. mov es:[si], ax9 s* [4 d( u9 i6 R
  260. add si, 2
    3 l% P- Z2 c- O! C
  261. loop @b
    & H3 A8 z8 o$ u  O
  262. popa
    3 ^7 ~  Q( |  Z: }9 g5 u2 z3 w
  263. ret
    / u9 d6 o3 V. X( b$ T7 ~9 l
  264. showmsg endp* I7 P4 k. _0 I) R3 k: B. S
  265. 5 d) C0 \8 V) y" w7 K$ s3 m
  266. oldint proc
    + H" @3 p  O8 h& C
  267. pusha
    4 C3 `" m* D: k" d7 E
  268. mov ds, word ptr cs:[old331]
    ( V) M6 y3 N+ F, p0 E3 @
  269. mov   dx, word ptr cs:[old332]2 l7 x5 Y  T6 T. r
  270. mov ax, 2533h- M( d' i( j2 m9 |
  271. int 21h, y+ K1 w5 F" y$ m' W& D6 m  C7 v% f
  272. mov ds, word ptr cs:[old741]0 _: H+ H6 ]( M. |- Q! h
  273. mov dx, word ptr cs:[old742]
    $ F' B2 B" {* W3 R' K, E8 J( i: Q& G! |
  274. mov ax, 2574h5 `# |# F( j( u; M
  275. int 21h4 h8 Q, F: f. t
  276. popa5 `, M. U4 z" c6 z5 q$ n/ p! g
  277. ret7 _# }( @( S/ ?' G3 |" G
  278. oldint endp
    3 V& q$ y* o+ V; p5 O- }! [
  279. 2 f; e. s7 h) H( c+ U8 q
  280. memmouse        proc% ?$ o( {* V# t' B' O7 l+ I% K
  281.         xor     ax,ax
    ( v* ^, ^9 a( \4 \" a2 T
  282. int 33h
    ( [+ Y4 F3 o: X- Z3 \# u' k7 P/ U
  283. cmp ax,0ffffh; K) Q1 H( ~, j$ o' e( \, I1 [
  284.         jne     not_loaded
    * J, L9 K8 W! p1 b
  285. mov [memcopy], 14 E% {$ v, J$ \, F* Y  p& Z2 y
  286. ret
    9 v/ z& _5 N+ u9 y, E, n

  287. 8 C& T0 T7 D+ y7 F' T
  288. not_loaded:- N* T: Y6 B/ b* Q3 q+ B
  289. , n5 z, u& R8 I+ j/ `% x
  290.         mov ax,2574h1 S% c& a, t: ?' [# J
  291.         mov dx,offset new_isr* Y0 @+ G) [! h2 z  |1 q
  292.         int 21h
    ( ^7 a' }5 M5 H* @5 \) L
  293. ! q- {! A+ b7 A
  294.         mov ax,2533h
    4 P( O- G6 R) f# z4 S
  295.         mov dx,offset new_33
    ; N$ e& x# h# y7 L
  296.         int 21h
    2 A/ A' ]6 U6 Y7 H# ]$ p1 i

  297. 5 o! b% U+ m# b7 X1 V$ y' }- R! r  y
  298.         cli0 u) p  l( b( \6 T& ~, f  I8 D5 G
  299. ' S! ~$ p- ^, K) X8 t
  300.         mov bl,0a8h
      X3 Y: e# n! z$ h3 K+ l4 n' [% d* t
  301.         call keyboard_cmd
    + f' |5 l) u: r8 j2 x
  302. % ^' z: Q+ C! S/ E3 L9 m
  303.         mov bl,20h
    0 m1 t' M1 ]5 x" i5 l5 E2 x3 G
  304.         call    keyboard_cmd! u# ?1 A) \4 B/ Z* }  Y
  305.         call    keyboard_read
    ) _: N' r  M! V3 r" N
  306.         or      al,2
    , T9 [) }' i( {. j$ D
  307.         mov     bl,60h
    ( Q- n. I3 r/ w- b* o
  308.         push    ax( c: o9 |7 A9 ~. P5 I  y
  309.         call    keyboard_cmd
    4 Z6 x* k. b7 k. v+ V/ v4 v' @
  310.         pop     ax0 ^6 M$ l! s  I8 d% t5 z
  311.         call    keyboard_write0 ?1 D3 S2 Y" X7 U

  312. / L& F/ {" u2 I8 g8 x( Y
  313.         mov     bl,0d4h
    ; u6 s9 b' A, O6 m( {- G$ D; ^
  314.         call    keyboard_cmd$ A' c# a4 f' ^) ?+ }% o+ v% K4 u( N4 Y
  315.         mov     al,0f4h, j$ G! a# h1 k
  316.         call    keyboard_write
    & ]: a" k! f6 I4 W

  317. # F6 B2 R# r. v: H
  318.         sti
    ; P) O( r# S. y: e( H- _
  319.         ret
    / [% c6 |3 z5 f
  320. call_user_isr:
    2 v1 Z4 ?- C( t3 o
  321. db      60h1 f" D3 [: ^7 K% |
  322.         mov     cx,cs:[pos_x]
    0 |4 L; `& M/ v
  323.         mov     dx,cs:[pos_y]  N% k' y8 [: S
  324.         mov     di,0 ;cs:[x_move]7 O9 i( {4 {) S1 l
  325.         mov     si,0 ;cs:[y_move]
    0 h- d7 k0 o2 `' @7 @) R
  326.         mov     word ptr cs:[x_move],0
    9 R. [6 \/ V" j% k
  327.         mov     word ptr cs:[y_move],02 x) s( M$ H4 C. I/ ~
  328.         mov     bl,byte ptr cs:[buttons]
    ' N/ x7 h; E% q: g5 f# J. e* ^9 F, ]
  329.         xor     bh,bh3 V# U" F1 P& u9 r6 `  S
  330.         call    dword ptr cs:[user_subroutine]
    ! a( K/ s4 f% o: b3 C
  331.         db      61h' j" x$ V; ?7 X" P1 i! u1 \& d
  332. ret( U) f4 T/ ~0 H. K1 k3 J
  333. new_isr:
    " B" f5 y: i4 Q4 d$ Z: }
  334.         pushf
    1 @; B' }. U9 c* [: y( c' @3 K" G& w
  335.         cli
    , s% A4 H# ]2 e* i
  336.         push    ax, ]2 k3 A1 u# @7 U8 I4 Q4 t* b
  337.         push    bx
    + M4 s3 G' o" D7 d
  338.         push    cx' D" j7 ]' i. C
  339.         push    dx
    * X0 b6 o! p- c
  340.         push    di
    0 i8 Z/ q% Q' Z* m: _/ o
  341.         push    si
    , |: }( Y; `) s; n
  342.         push    es
    + n' s+ t$ D: t* g+ m/ Z8 N
  343.         push    ds
    9 Y% O/ b  s% o5 W4 E
  344. " a) z  r/ d4 ]5 q4 G; K
  345.         push    cs
    $ s" \$ Y; y7 B9 p) |% O- s
  346.         pop     ds
    4 S/ _- Z( o" N) t4 ^% n0 N& k
  347. - x3 u1 C5 `+ C
  348.         mov     bl,0adh/ e: `9 m% e! ]: G7 |
  349.         call    keyboard_cmd5 `5 ^: o$ G+ \3 i
  350. # _  J2 s! q$ i0 g; X* y
  351.         cmp     byte ptr [first_time],0' U& M9 r- z  S3 d1 B0 `) L  d& I
  352.         je      not_first_time
    1 M4 n* V( G* p
  353. 4 W1 i$ l/ a9 o& s3 t; `
  354.         mov     byte ptr [first_time],00 R" p! {- [* w4 A3 |( @
  355.         call    keyboard_read
    # a3 }- j' _( x; o9 B: V5 ~
  356.         call    keyboard_read& C4 a8 ]! Y' D" m0 d, P
  357.         call    keyboard_read4 z/ l& |4 w7 ^8 `
  358.         jmp     no_show  \* f& O& m% k7 I( E5 d9 N2 P

  359. ; D8 C& `4 ~- w6 n- p  |: P
  360. not_first_time:- k) {; G& f+ {4 }
  361.         mov     word ptr [temp_mask],0
    6 `, h9 N( `+ \3 A8 C3 Y

  362. , P+ Q; n& w* L6 ]% [5 |
  363.         mov     cx,[pos_x]
    ; p2 M5 h! {" \, Z1 h3 f& n' z/ `
  364.         mov     dx,[pos_y]  c  A$ u  {0 O+ `2 {# U
  365. ) f& Q. I1 o3 ?
  366.         call    keyboard_read
    7 u' \) j5 G1 b* `% ~3 ?& k
  367.         and     al,7 ;3+ u+ {5 s1 i3 q& B$ @: ]+ L: O
  368.         mov     ah,[buttons]8 K# z' V5 P4 ~  m% F9 n. r
  369.         mov     [buttons],al
    , r( [0 V1 [* w2 w; i' B
  370.         cmp     al,ah
    & W' S0 y4 A! y7 {2 T: P
  371.         je      no_button_change
    . E3 s9 P! C/ t) ~6 K, N8 z
  372.         and     al,3
    2 D# F' |2 C& r5 [9 G
  373.         and     ah,3) s5 y  v: W3 t) n6 A( Z: H
  374.         xor     al,ah
    ' C: L" y: q8 P
  375.         xor     bx,bx
      X7 u9 w8 U- b* G7 D; r# C
  376. 3 p3 o! M* S* m1 ]- v1 _! [
  377.         push    ax
    3 c. N' I) ]; J% H( g
  378.         test    al,28 G0 }$ Y+ U5 r( g8 O) h
  379.         jz      no_right_button_change
      F/ @& a' _! l. b+ A
  380.         and     ah,2
    * W6 A: R( I5 y3 `4 |/ l/ L# C3 ?
  381.         jz      right_button_pressed
    ' k5 C; j- c+ k2 S# |
  382.         or      bx,16. z3 |, _% \/ U& d! a8 l8 h6 {; J
  383.         jmp     no_right_button_change# E+ D$ g! M0 D" U/ f$ Y
  384. right_button_pressed:  M  j, U- k, `. R, l& J4 B
  385.         or      bx,8* d$ w; b( n6 r, ^* _5 ?
  386. no_right_button_change:
    ! z6 A; i8 _; j! D
  387. / u9 b2 v9 B( Y+ ^' r1 i3 ^$ n
  388.         pop     ax
    ; K# l1 d* P1 w
  389. 2 g) W% ?, k& T
  390.         test    al,1
    : [" o8 f/ K. B: P9 K5 r
  391.         jz      no_left_button_change
    + P1 F/ `& N0 k9 v% o) r: H
  392.         and     ah,1& O" C% X* f/ u: t1 T
  393.         jz      left_button_pressed& Q7 p* r, f4 s5 V
  394.         or      bx,48 W  i6 A, p! y" B: H
  395.         jmp     no_left_button_change4 _6 @3 \1 I9 v* w) I
  396. left_button_pressed:
    9 O7 D) q5 m1 R5 L( O
  397.         or      bx,2' m7 H: H/ R1 {$ f' W1 P7 Q
  398. no_left_button_change:4 R/ ?# [9 ?# Z8 i  |

  399. ; O) h) r  w, M/ i. y- C$ G6 S. ~* J! f
  400.         mov     [temp_mask],bx! b: ?+ K# g7 Y: C7 d) M( v# O

  401. * {0 k# K% T0 S4 I$ T
  402. no_button_change:2 ^/ p0 t. j" d- w
  403.         call    keyboard_read, r9 D3 z! n$ {! l) T1 r7 q0 u
  404.         cbw. s) _+ n0 ~0 k4 l, v( H
  405.         add     [pos_x],ax; z( D. m; G8 f2 K8 A9 Q( K
  406.         add     [x_move],ax' t4 m; G8 V8 w  `. Y6 E
  407.         mov     ax,[x_min]$ ?, U1 D: K; y: t. ?& e1 w4 e
  408.         cmp     [pos_x],ax/ X* j# j; Q1 {# c
  409.         jg      good_hor1
    + x6 m+ W, g5 E! H3 r$ @- c5 y
  410.         mov     [pos_x],ax
    ) w* u* P0 i& q1 w9 d
  411. good_hor1:8 Q& f+ O: b. O7 e
  412.         mov     ax,[x_max]
    , `/ ^  x" w/ _: o9 R* }- [: e
  413.         cmp     [pos_x],ax
    2 X- N, u; a' n
  414.         jle     good_hor2
    $ p! X6 Y7 W' r$ f, g8 o  y9 M
  415.         mov     [pos_x],ax
    0 d6 E6 f& q6 l
  416. good_hor2:
    * K/ ?1 R- [* L/ B/ T) c
  417. 0 e$ |% v2 G% r
  418.         call    keyboard_read2 R$ c+ ]# n) s# O7 G$ \0 K+ C
  419.         neg     al
    & E+ ~/ D& U% i
  420.         cbw
    ; R6 {6 d( F, ?% K8 O& Z
  421.         add     [pos_y],ax4 z% D+ u( P. g$ w/ |" i1 g
  422.         add     [y_move],ax
    * t' @; Q- f3 h8 B+ p& t
  423.         mov     ax,[y_min]
    2 a! o. j# U& T3 y& a
  424.         cmp     [pos_y],ax$ f: ~% b. q- ~
  425.         jg      good_ver11 L7 _  a% ]6 S  y0 R: N. F' @
  426.         mov     [pos_y],ax0 j- M" s6 y/ v
  427. good_ver1:- V: E3 p# c5 j
  428.         mov     ax,[y_max]
    % R# t* F1 I  j' U2 y* T7 o5 l
  429.         cmp     [pos_y],ax& V0 b& z; j* I
  430.         jle     good_ver2  X4 F' q- k8 h) I) N% b5 Z( i- s
  431.         mov     [pos_y],ax
    5 C2 V; M  k( P3 K* G- P9 ~* l
  432. good_ver2:
    / j$ }: M  w; v; R0 j2 q( p) Y3 n

  433. 6 N) M$ j9 V- y: L1 }, C: V
  434.         mov     ax,[x_move]% \0 t! _3 i& o: P: y: k/ `( A7 O
  435.         or      ax,[y_move]1 w% c2 H  }5 m* v: k
  436.         or      ax,ax
    : i2 @) {7 Y: i2 r" V0 }, Y
  437.         jz      no_change_position
    5 ]6 `2 S2 }" y. S8 X: h
  438.         or      word ptr [temp_mask],1) y- c$ _* K8 w
  439. no_change_position:
    4 {7 ?& N- g0 _3 x
  440. ( m% W4 c" ]. u9 [/ \
  441.         mov     ax,[temp_mask]
      X' h0 d; G/ g' x6 M) T
  442.         and     ax,[user_mask]/ H& l: D; E, V+ P! H* q
  443.         jz      no_call_user
    ) o* X" A/ u0 C1 r
  444.         call    call_user_isr3 h# }7 m  Z$ j
  445. no_call_user:
    1 l9 ^4 M; {3 Z  L+ ~
  446. ' X7 K1 g5 k2 d. k/ l! z
  447.         cmp     byte ptr [sm_flag],1
    ; K2 V9 K5 X" n/ ?0 l
  448.         jne     no_show! x+ \( E& \; T7 p+ g& c; Z2 G

  449. 1 J6 K( `+ V5 ]+ L) ~
  450.         shr     cx,3
    2 d! t- }. s0 O1 W
  451.         shr     dx,3' \! a5 [# r: l, |+ k: P
  452.         mov     ax,80' X! R+ U4 k$ c
  453.         mul     dl
    ! ?" }/ W9 |6 A1 J# b7 L
  454.         add     ax,cx% h/ U9 f% w" w3 S3 l6 N
  455.         shl     ax,1
    2 W3 \6 k8 r4 @; k/ [& Z% \' w
  456.         mov     di,ax* ~1 v* Z+ m& O$ X) i1 ]3 A
  457.         mov     ax,0b800h1 _! Z3 f* o: x* g/ v+ }
  458.         mov     es,ax0 y) v4 z8 \! G& o; A; {
  459.         mov     ax,[save_char]' `6 T8 M9 g( K* B& D
  460.         stosw
    4 D6 i2 x' i: u- J+ ]) q; q1 u$ d
  461. 9 d' a7 N+ `5 z+ e
  462.         mov     cx,[pos_x]3 O% Q9 b2 P/ p6 `& y8 @
  463.         mov     dx,[pos_y]: D6 _/ `* P1 X, n( E
  464.         shr     cx,3
    ; h! j" ?$ B  c1 h* q7 G' _6 i7 i
  465.         shr     dx,3
    , [0 f$ k- Y" v! }$ a& J9 U
  466.         mov     ax,80
    1 K! t2 @# ^" K4 H
  467.         mul     dl
    ) z/ [, F8 m3 L' P, h) @
  468.         add     ax,cx
    5 ^( k- C, X* K- T  b' Y  ~& m
  469.         shl     ax,1
    : ]- S. q2 x1 C1 h- t
  470.         mov     di,ax6 T6 \, L( U  P$ ~7 K+ [, m! N% ?
  471.         mov     ax,0b800h
    / h4 y6 t; p/ B+ F9 h( {5 m
  472.         mov     es,ax5 k5 @0 a! @, q1 T
  473.         mov     ax,es:[di]
    ) f* c8 d7 A* u5 p9 `
  474.         mov     [save_char],ax
    ' k, ]" P8 |) q: G, C
  475.         not     ah, l7 U+ E) x/ L9 n- I  i( N$ @! _. ]
  476.         and     ah,7fh* ?5 Z7 d* ^" k2 Y' v
  477.         stosw  Q4 l) Z* h  y7 }
  478. no_show:
    0 h: j) Z" n" [6 k
  479.         mov     bl,0aeh, F4 x, r- m3 @+ H7 `
  480.         call    keyboard_cmd1 f: B* _! [- E. z
  481. 5 |3 O  F+ {$ |
  482.         mov     al,20h
    + p1 h! \$ X- a7 a1 {, K
  483.         out     0a0h,al
    8 w; X  `: B- Z$ u. n; Z( F* ?1 N
  484.         out     20h,al, z2 S" v& l/ |/ O8 L

  485. , d( i" _- Z; `! c
  486.         pop     ds
    4 P' A" F/ U% [  V% N8 ]
  487.         pop     es" L5 W/ a+ K) i' F" f8 v2 R3 t
  488.         pop     si  B! w$ D3 w# r2 m
  489.         pop     di( v3 X4 y) I2 U# l
  490.         pop     dx
    # k% R6 k) W* _% u( U
  491.         pop     cx
    - y7 M' ]  J' e8 X2 Z& f  Z
  492.         pop     bx! L0 f% |% i$ T2 f: z
  493.         pop     ax
    ; p7 u8 j0 e) W4 P
  494.         popf3 k5 X2 q/ [2 O# M# v+ v  T" Y. _
  495.         iret. }& o9 `9 o1 a9 J, g" N

  496. % }9 }- u$ M' x9 W
  497. first_time      db      1) U) J' V. ~' ?9 d
  498. buttons         db      0
    7 t8 J  |: a; f
  499. pos_x           dw      0
    1 W* g3 z) a, u8 q/ p7 x" _2 D
  500. pos_y           dw      0
    * s( u' t: J6 n4 @* E, f$ e
  501. sm_flag         dw      0
    / l: r3 k% F  }# t% O7 G
  502. save_char       dw      0
    6 @( V+ k2 j0 d, L2 y& @7 m
  503. x_move          dw      0  B, k, a9 e" a/ |4 x3 N% p; ]$ Y- H
  504. y_move          dw      0' s" Q+ s- k5 h# A* m
  505. x_max           dw      639
    - X; [3 @: w' a8 k( {0 H' w
  506. x_min           dw      0$ s- |; F9 @  E+ `) t$ W  {9 [
  507. y_max           dw      199
    - p3 E, f* l2 ^* c1 [# z
  508. y_min           dw      0" P$ Y/ Y4 O' O5 L
  509. user_subroutine dw      0,0
    # M/ M/ h% H  n* n2 G
  510. user_mask       dw      0
    8 D) Y! f+ P' i+ o9 h
  511. temp_mask       dw      0
    $ T/ |1 }& }( g+ n$ B, h( Z
  512. 4 L; R+ g" B, p
  513. keyboard_read:
    9 W2 g! {" ]" p4 t. Y2 X5 H
  514.         push    cx1 O  \9 _: @; k9 M- D2 s8 V3 V
  515.         push    dx
    5 ]/ U, R& f5 g, [! D1 G3 s0 I
  516.         xor     cx,cx
    8 Z- O, `& m# A6 |% @, l8 l& i
  517. key_read_loop:6 V5 F; _. H: n/ e+ q
  518.         in      al,64h
    ; Z- z" ~) n1 _3 M, L0 \/ |5 q5 z2 T2 g
  519.         jmp     $+2& A; `4 F; v" C$ u6 I
  520.         jmp     $+2
    8 _4 Z1 l* U8 v9 ^( w
  521.         test    al,1: W6 _0 N' Z$ J" L; u* Y
  522.         jnz     key_read_ready
    5 c/ w# ~- u6 `6 {) v- ~0 R
  523.         loop    key_read_loop1 g% x0 \, }; o- P. ?4 I; l  _
  524.         mov     ah,1( q/ W2 U5 R! d+ Y
  525.         jmp     key_read_exit4 b" q, Z5 W: d% I
  526. key_read_ready:
    + c& o+ C3 F+ |5 ?5 G& ~9 c
  527.         push    cx
    ' v1 `5 x$ c$ m$ W
  528.         mov     cx,32
    % v9 Y  O0 z+ p! c
  529. key_read_delay:
    , E8 ]1 K" f1 \6 v* [: Z" F- x. J% m
  530.         jmp     $+2
      D5 f% x6 V8 M7 L
  531.         jmp     $+2
    8 t; {3 s$ C) N# a: R. _
  532.         loop    key_read_delay
    % ~6 ]& v& ]' D1 ~5 V2 v% _" I

  533. 8 D( q3 I7 e: v5 j6 ?2 D& ]" W
  534.         pop     cx1 H# V( w& n7 }7 Y- A
  535. 7 T2 Z& @0 Z; k  ]7 w
  536.         in      al,60h* R% [; r, ?7 }2 Y  H$ G
  537.         jmp     $+2
    6 S4 ]% z, i0 F3 U! R
  538.         jmp     $+2
    : I: s: {9 ~: h( E* d& o( D
  539.         xor     ah,ah
      Q2 w5 P6 q* {: z/ i2 ^
  540. key_read_exit:
    / d  D6 [; Q. u1 E2 Q
  541.         pop     dx
    5 B8 i6 a  o7 |5 E
  542.         pop     cx/ x  h- l* E2 ^8 q! b3 S* p1 K/ e
  543.         ret2 I7 `7 S  c! M7 \& i3 m6 \
  544. . x: ^5 u; {: e) C6 E
  545. keyboard_write:
    - D1 a2 a: M) A1 R* J
  546.         push    cx
    * A  C3 H% w1 z- v0 E
  547.         push    dx- {2 P3 K+ w# P# Y4 ?
  548.         mov     dl,al
    ) J% p5 {. l6 l/ s4 _! g
  549.         xor     cx,cx
    0 G3 Z, s; D% U" k) J# P
  550. kbd_wrt_loop1:7 X5 D) V: B+ a
  551.         in      al,64h/ k# P' T- d- W1 Q* s  n
  552.         jmp     $+20 `! ]$ x8 w) j
  553.         jmp     $+2
    : }+ u4 a( ~) H& M1 u
  554.         test    al,20h" v6 A/ k2 n, |8 A
  555.         jz      kbd_wrt_ok1
    5 e' o' w1 S% D' V/ _4 T8 N

  556. $ T+ J( c: _7 W3 L7 ]; |
  557.         loop    kbd_wrt_loop1
    ! J3 t8 M/ D& w4 W

  558. 5 H" C1 ]5 C* S. r. x
  559.         mov     ah,1
    : c3 S& D* U, D& @7 ]4 E
  560.         jmp     kbd_wrt_exit* X, }0 O9 `" f$ w+ s( B: ]

  561. % z6 |, t0 H2 ^7 b+ ~
  562. kbd_wrt_ok1:
    $ g9 m" @- l5 s' V6 d
  563.         in      al,60h
    ! }, N/ P4 w5 Z3 W7 l6 c% o) S
  564. & l; K8 E# h# B2 ]5 Y
  565.         xor     cx,cx
    $ w* j; W! u: O8 I7 f
  566. kbd_wrt_loop:
    0 R8 B' Z( O4 c% j9 |5 t7 u9 Z
  567.         in      al,64h" ?1 y0 P& o5 n" w) G
  568.         jmp     $+2
    5 }% |: S! h/ H$ V3 C
  569.         jmp     $+2
    3 W. P1 S7 U) w# G6 n, ~
  570.         test    al,2
    5 `6 I! @/ R% l: q
  571.         jz      kbd_wrt_ok/ _+ t: O7 k9 z9 ^! @( b' z; d. P
  572. 4 }# b4 G+ @/ A& m2 w2 G
  573.         loop    kbd_wrt_loop% b" G: i% a3 f2 t' j& y# H
  574. # {; T- a7 S" |
  575.         mov     ah,1; u8 C) {! q) M( r+ `7 Z
  576.         jmp     kbd_wrt_exit
    3 }: I. P' o2 S) T/ d, w) G+ ]

  577. : G" l) d# N3 q3 ]7 ]2 X7 B6 @
  578. kbd_wrt_ok:' W; Q: u. U2 l) E) x) E0 r
  579.         mov     al,dl0 T  ~$ l  }1 N5 h  Q: c* ^- m8 P
  580.         out     60h,al/ E8 |9 J6 S# T0 c1 {- f2 n1 N1 k6 x# T
  581.         jmp     $+2. O" q8 ]! r, N. Q* R; v
  582.         jmp     $+2
    % R. f4 f7 h/ a, G  j
  583. # X, K/ w; e: S
  584.         xor     cx,cx+ B) K6 l- ]4 @9 a
  585. kbd_wrt_loop3:
    2 {/ W1 f2 u0 F. X4 P, }9 C0 \# d/ ~
  586.         in      al,64h
    5 N0 I! u  X+ k- z! u
  587.         jmp     $+2
    4 H# z4 D4 |9 `7 F$ _
  588.         jmp     $+2+ W% L9 H/ p8 E7 N4 z
  589.         test    al,2" ?/ D5 p, x% k- d0 H
  590.         jz      kbd_wrt_ok3
    7 S2 o$ X" U% h# F1 N2 S/ S
  591. 2 B* n' _& R9 {9 `6 }3 O
  592.         loop    kbd_wrt_loop3
    7 d1 j# P, D" ^* N' ?3 d7 U

  593. % T6 f9 c5 Z4 }# C$ u+ n. M9 z
  594.         mov     ah,19 r- w* i, ]# y$ c/ g
  595.         jmp     kbd_wrt_exit
    ; H+ O8 L( p% v9 ~

  596. 5 T* F' m4 h+ ?6 [5 Q2 ]* H; {" G: B
  597. kbd_wrt_ok3:0 w" ^- v6 B- [0 c- E  Y- N  i8 w
  598.         mov     ah,80 ?+ V# W3 v  f( w9 Z$ u
  599. kbd_wrt_loop4:8 k: Z1 g. O6 O1 ]
  600.         xor     cx,cx7 E% b% U& F- K4 v6 P
  601. kbd_wrt_loop5:4 O; [/ \! W' u5 a/ ?. S6 B# O
  602.         in      al,64h
    & I/ Z. n6 h8 O" g" L5 c/ Q9 |
  603.         jmp     $+2
    2 `4 `( r7 C" O# i+ @* c
  604.         jmp     $+2# \; o; m+ e  ^0 V$ e
  605.         test    al,1
    : U% o* u! ^4 Y7 P2 T) ?
  606.         jnz     kbd_wrt_ok4
    1 M' X5 \+ r+ i0 M

  607. * N* X1 W! I# ?9 Q- h
  608.         loop    kbd_wrt_loop5, Z8 j0 O1 g- d% v# ?
  609. " `+ Q. `2 }1 c0 [- Q
  610.         dec     ah
    # }  j2 K6 }+ H# b
  611.         jnz     kbd_wrt_loop4
    . Y0 c1 S. O/ o! W3 d" T+ s/ n

  612. % h! p5 d5 v5 R7 q
  613. kbd_wrt_ok4:9 h+ b8 b+ H4 r
  614.         xor     ah,ah( U( k' n6 N" N( ?
  615. kbd_wrt_exit:- L( _7 J2 M: r* P
  616.         pop     dx* t/ ]4 c( \* z/ {+ s0 M' v0 n
  617.         pop     cx% z) F" ~/ g8 R* r1 `
  618.         ret9 X2 `' z5 d% c) I
  619.         0 K) R( _5 E% v! n# C
  620. keyboard_cmd:8 k/ v; ]$ L1 r) o3 D
  621.         xor     cx,cx
    & n( k: K. f: t4 k, _9 g& H  |
  622. cmd_wait:3 V" M- O9 Z# r
  623.         in      al,64h
    2 p9 @: W8 W0 T* ~" H! ]4 j9 c
  624.         jmp     $+2# Y  r' M( E7 b- I% O: E- G
  625.         jmp     $+2
    - s5 H+ B, I* a- |5 r4 V# U( @
  626.         test    al,2
    * W+ T/ f& {: c8 E* e2 k' A1 n) x
  627.         jz      cmd_send
    & Q8 k" E& p' K; H9 Z' w
  628.         loop    cmd_wait
    : F6 w( o8 f8 S

  629.   ~5 T* B. ^7 u9 x
  630.         jmp     cmd_error
    ' l: D- Q. r  \' U2 g6 y! M3 `# ?- i

  631. $ G. F8 c! v7 ?2 w/ i
  632. cmd_send:# T  _; `) d8 U- e. G$ p
  633.         mov     al,bl2 Y( t: X4 v) @8 B
  634.         out     64h,al
      P3 g% p" g/ O/ a+ @! Y
  635.         jmp     $+2/ c9 s: J0 T: ]# q- `+ P/ L; {' Z
  636.         jmp     $+2. H8 I( y6 C" `6 O
  637. + s  `. q( ^7 r6 O3 g2 Z1 [! h
  638.         xor     cx,cx
    9 w9 B6 T3 ~) K9 \. _+ \
  639. cmd_accept:1 \) E' K! d. I: h3 X
  640.         in      al,64h6 r6 Z% d% ?  I  F& ~
  641.         jmp     $+2
    2 R% A( y* G, r* ^$ ]
  642.         jmp     $+2
    ! b/ ]! }, j" S0 x4 |
  643.         test    al,2
    * I4 C7 F, W# M0 X/ v4 Q
  644.         jz      cmd_ok
    1 M4 i( h, G9 m/ |1 k  R
  645.         loop    cmd_accept
    9 H# l+ [5 g- s/ j
  646. + f% y( j3 R' |) k# k
  647. cmd_error:8 C; O  \7 `8 z' W% W7 C
  648.         mov     ah,1  M: [* s$ Q* g+ j8 y6 ]) ?
  649.         jmp     cmd_exit
    # p9 E2 p* t& E- E
  650. cmd_ok:  R, Z4 P: p8 E7 X% L8 P& K) ~. k
  651.         xor     ah,ah9 K5 A5 O" c% f; l. \6 R
  652. cmd_exit:! Y! R1 C% g$ W2 ?" X4 Y+ X* C
  653.         ret
    / t1 v; M6 f5 k& r% y2 X
  654. 5 a' T( J. ]' P' g
  655. new_33:
    ' K, f) Z4 b+ e
  656.         cli
    + N# f+ ?/ y1 \  T( f  r
  657.         cmp     al,0
    , s' Q7 D" r* O
  658.         je      reset_mouse# {& Z! o! [  H' O+ ^1 O
  659.         cmp     al,1
    3 u2 f0 T9 O4 ?( J- o
  660.         je      show_mouse5 D% s1 _( d0 ~3 E: v
  661.         cmp     al,25 L  y) z$ Z! `0 b9 Z/ F% r
  662.         je      hide_mouse
    ; |5 I- _! I2 b+ e7 {2 a$ [  d6 D
  663.         cmp     al,3
    # `- w& I7 Q0 b5 H. m# V" O
  664.         je      get_pos- e( v6 b% h# w& K7 S8 P% ]
  665.         cmp     al,4* H9 s- i. n4 R9 W3 w) [, j
  666.         je      set_pos* M' z( r. F3 A( w% f, c1 G
  667.         cmp     al,7
    2 V$ \) I& V; Q/ I  }% S" \3 A
  668.         je      set_hor_pos
    " y% x6 Y0 V2 ?$ K8 Z- t
  669.         cmp     al,87 k) d: b* \8 g3 C# C
  670.         je      set_ver_pos7 E2 t; h6 w0 Y6 d3 i; P
  671.         cmp     al,0bh
    & M8 ~2 m: @' {7 L9 T
  672.         je      get_mouse_movement" K0 m( l7 p- R5 f, P1 B
  673.         cmp     al,0ch/ N7 u: \: @9 v  [! |
  674.         je      set_subroutines; w" {* w8 m% f1 K
  675.         cmp     al,14h9 `3 |! H0 [) e/ V; r8 L
  676.         je      swap_subroutines
    " U$ U  O  F- E' z0 I; R  M
  677.         iret( P, q8 n0 y8 M+ o

  678. 0 p7 N. X2 w  {* k
  679. reset_mouse:* a( n+ Y# {) Z4 k
  680.         jmp     _reset_mouse
    3 w; ?7 T  W: g% F/ ?! {
  681. show_mouse:
    : ?( _6 z$ H* x+ Q& ?( C
  682.         jmp     _show_mouse
      C/ G' b1 l5 L4 Z7 ]% J
  683. hide_mouse:+ u; u9 Q- P% b, O% i
  684.         jmp     _hide_mouse
    $ P! C) A, [# p0 A9 O
  685. get_pos:
    ! J( I; a9 u+ ?" \  R  M8 y0 E
  686.         jmp     _get_pos
    " q" D* V3 v6 y
  687. set_pos:
    ( ^" k; K4 S9 w  R; M
  688.         jmp     _set_pos6 [: x- M9 k8 o1 p
  689. set_hor_pos:
    2 L: m- V) f! O0 t; [+ Q
  690.         jmp     _set_hor_pos
    7 q! M6 e1 m5 T
  691. set_ver_pos:3 i1 ^) h6 b5 D, I5 G
  692.         jmp     _set_ver_pos* c+ c: M: H0 X, Y$ s/ E) O0 m
  693. get_mouse_movement:1 Y2 B1 J9 u  Q4 y
  694.         jmp     _get_mouse_movement$ F, g, k7 {+ X6 ~
  695. set_subroutines:& `; L8 ]* F# c5 P5 U7 c
  696.         jmp     _set_subroutines
    1 \" j& l: J" b
  697. swap_subroutines:
    6 W2 g4 X' C9 F$ _9 Q' L
  698.         jmp     _swap_subroutines
    6 D4 |$ d  v: H

  699. / f: D" I/ x0 [+ v+ _
  700. _reset_mouse:
    ( I) X% D8 `8 j& i! r, F
  701.         mov     byte ptr cs:[buttons],0
    4 G$ r# j+ q: }. m: D
  702.         mov     word ptr cs:[pos_x],0. n- |- `, @9 [, u5 B
  703.         mov     word ptr cs:[pos_y],0
    4 L) R, l& o8 X# w9 L* b2 w0 ^
  704.         mov     word ptr cs:[x_move],05 j5 c. V5 ~, p1 i4 p3 W
  705.         mov     word ptr cs:[y_move],0" `9 v0 }/ i: R( I& O
  706.         mov     word ptr cs:[x_max],639
    ) ?% X0 b4 v( `& k: q3 f; [" a  Y1 U
  707.         mov     word ptr cs:[x_min],0
    & p0 `0 G; M; {  I6 k: [5 w; ]
  708.         mov     word ptr cs:[y_max],199, I2 U+ L  e+ d1 e
  709.         mov     word ptr cs:[y_min],0" c  J+ y( L  {, ?, M
  710.         mov     word ptr cs:[user_mask],0
    1 u2 P/ [% g- ]2 _; T# @
  711.         mov     word ptr cs:[user_subroutine],0
    / z) D5 b, [2 M6 U' [
  712.         mov     word ptr cs:[user_subroutine+2],0. U$ ?& H" }+ G% D! K
  713.         mov     ax,0ffffh
    / S+ ~# [, }( m% M3 }
  714.         mov     bx,3! ]5 N6 c, j) a7 ~" i3 |
  715.         iret3 T' ~5 H2 m) h" z6 q) B. t3 j
  716. 8 G$ w) N# ]+ a8 ~4 r
  717. _get_pos:" _. ~6 Y& Z% P
  718.         mov     cx,cs:[pos_x]
    ! F3 ^6 O  a) m8 ^) N
  719.         mov     dx,cs:[pos_y]
    # l3 |! V9 |8 G5 E, J
  720.         mov     bx,word ptr cs:[buttons]9 k5 E* h3 I) e1 F0 r
  721.         xor     bh,bh+ j. J' r0 o) {/ Y  |* j
  722.         iret
    7 {0 d: b. Q9 R% z- c4 L% S

  723. " `  f3 u$ S& F: z0 O
  724. _get_mouse_movement:
    , b$ O* D( G# m: O1 f) a+ G* g) Z7 H
  725.         mov     cx,cs:[x_move]8 u1 u; K" h+ {  z5 s4 S* x
  726.         mov     dx,cs:[y_move]
    ; d$ ~4 {$ D& T5 J1 }+ d
  727.         mov     word ptr cs:[x_move],0' C* I, ?/ k5 X! h, f& a
  728.         mov     word ptr cs:[y_move],0
    + {( Y4 Q4 b. G( S4 U- b0 Y- g, M
  729.         iret
    . B6 \! v! \) o7 P6 f

  730. & m! J; w2 I  @: x0 a) i* q
  731. _show_mouse:
    & m! p, L+ x& d4 q  C3 D' N$ A- t
  732.         push    ax
    9 t: u8 p! X4 k% [
  733.         push    bx
    " X6 K# w. T) w4 ~* a* A4 t
  734.         push    di' G& V( L" a7 a& z4 I* l1 `9 _* e
  735.         push    es! L2 @9 P* d- I' b! q
  736.         mov     byte ptr cs:[sm_flag],13 Q& b( P. e% O/ i+ X1 G. |
  737.         mov     ax,cs:[pos_y]
    - W3 d# h0 z" X3 M3 Q/ H
  738.         shr     ax,3
    ! ^* b9 [0 R* j' I+ [3 S
  739.         mov     bl,80
    7 \' B' Q; s( V" Q
  740.         mul     bl
    9 c; t" q! J/ G
  741.         mov     bx,[pos_x]% E) E7 L: W) ^0 L# m8 m
  742.         shr     bx,33 Y/ G# O* m8 q6 t0 m# ^3 S
  743.         add     ax,bx6 l) M, y7 J+ a2 x" ?- o7 n' N
  744.         shl     ax,1# W+ k1 l0 H2 Q
  745.         mov     di,ax: ~7 F( H$ H: g( _6 [
  746.         mov     ax,0b800h$ d1 G; V  I/ a8 ~* J% u. d" I
  747.         mov     es,ax. r1 m" v5 W1 n3 ~) p
  748.         mov     ax,es:[di]
    * f3 ~# ^3 B( d- E8 U
  749.         mov     cs:[save_char],ax4 B4 x9 O/ K" V0 X' y$ x% g
  750.         not     ah
    $ i& i; c. }+ ~2 o9 Y) B
  751.         and     ah,7fh6 h! T7 b/ Z0 U
  752.         mov     es:[di],ax- A* A  `8 u5 M" ^& c- ?$ ~
  753.         pop     es0 j5 {7 C/ B) F$ B& y
  754.         pop     di
    ! B- b! }9 b0 ^7 h( q) X
  755.         pop     bx
    $ H/ r. s2 L& r5 v; H' t* R
  756.         pop     ax  {8 v2 d% [# |8 Z/ E- N! }
  757.         iret
    - f6 z( N$ P- F: ]6 ]+ y' d

  758. , R9 D2 g- Q3 F) G# D1 [$ r8 `
  759. _hide_mouse:9 S; Y) A$ O6 o" j8 g! j7 o
  760.         push    ax
    5 i$ B3 C- h3 e  L( v
  761.         push    bx
    ; A% @: m7 n  V/ ?
  762.         push    di  R  u: O, c: m
  763.         push    es9 n, m+ ~+ z0 m8 E7 W: N
  764.         mov     byte ptr cs:[sm_flag],0- k, C$ A  Z) ^4 y2 S/ y) d  Q) Y
  765.         mov     ax,cs:[pos_y]
    ( b$ g2 ?/ L+ w7 `* F2 P/ k) p
  766.         shr     ax,3" q$ @# g; y% z6 H# }+ q
  767.         mov     bl,806 a6 l0 y  R8 ^, K" R, q+ j; P
  768.         mul     bl+ K& R9 ^8 q8 v
  769.         mov     bx,[pos_x]
    0 q9 W/ V( Y9 `3 q% m6 b9 G4 G2 [
  770.         shr     bx,38 Z* s. Z8 B" s
  771.         add     ax,bx+ y9 o9 {- x7 ~3 m8 {! U9 i) V
  772.         shl     ax,1* L4 J' a) F1 t  ]
  773.         mov     di,ax7 `& G: e6 j: F8 F* B
  774.         mov     ax,0b800h
    . }/ m8 _5 t( H6 F
  775.         mov     es,ax0 r* C1 C1 U0 {4 ^3 ?: d6 S
  776.         mov     ax,cs:[save_char], Z2 w" @, w8 ~4 s! J
  777.         mov     es:[di],ax
    ) B6 u; H) J9 E' R! p
  778.         pop     es3 A. b# b, g% V7 N. [" n9 y
  779.         pop     di( C' W: r# q; o
  780.         pop     bx
    5 d* F- y9 V7 @% b* [# a: w* C
  781.         pop     ax
    # Q$ @' X! g% g9 y2 ^
  782.         iret$ y! d. c6 r5 W1 D, J$ K8 k" E

  783. 2 o! m, ~# D: m$ \
  784. _set_pos:9 V. j/ C) a* C! s% Z) v
  785.         mov     cx,cs:[pos_x]
    - a  K* t1 c/ M- g( E5 v- C; }
  786.         mov     dx,cs:[pos_y]4 v( S7 U* m2 c" l1 }- F
  787.         mov     word ptr cs:[x_move],0: s+ z9 }4 C: X) G1 @' [
  788.         mov     word ptr cs:[y_move],0
    * `8 e5 i  Z- x9 D4 J! o  }  ^+ e) r
  789.         iret, [9 k9 J0 l$ M7 d
  790. $ \# N+ m5 g0 h1 J9 B
  791. _set_hor_pos:, X, H( y8 M3 `& C
  792.         call    max_min& K' }1 }% }  a8 Q" `
  793.         mov     cs:[x_min],cx" x% |5 W; y/ |. s) M; f
  794.         mov     cs:[x_max],dx
    , o/ t0 a6 V2 r+ F3 K" W' ?
  795.         cmp     cs:[pos_x],cx
    $ x- y9 B, C# S
  796.         jge     good_hor_min5 l7 j4 V3 P, e7 Y' A3 W
  797.         mov     cs:[pos_x],cx
    / _# B0 @1 c; ^7 O& \1 R+ y
  798. good_hor_min:2 }* C) g- l3 g
  799.         cmp     cs:[pos_x],dx' U( i8 ~8 I& o5 j
  800.         jle     good_hor_max
    # C3 o; ^0 U3 x+ Q6 J; W9 Q" C
  801.         mov     cs:[pos_x],dx
    ( M2 w/ P3 ?: N5 C  g2 Y$ ]
  802. good_hor_max:' ?; Z: v, H& ]; M( |" @
  803.        iret; H7 g7 r1 Z! e5 U. A

  804. # E+ d! i9 s( a. I
  805. _set_ver_pos:4 r* P! f, K4 |( C# J+ K- v
  806.         call    max_min
    2 G1 K- ?4 T9 Y  R' s4 X: q7 O' F; I1 W! {
  807.         mov     cs:[y_min],cx
    - E/ R8 M( _- @% }4 @4 i
  808.         mov     cs:[y_max],dx; |0 E. s) `  t8 Y/ d
  809.         cmp     cs:[pos_y],cx
    / y9 _: }5 A/ o* H0 o* @
  810.         jge     good_ver_min/ {' U' w  L. ?7 m" v# F6 w
  811.         mov     cs:[pos_y],cx! g. W4 E9 ^6 `
  812. good_ver_min:
    " K/ S- \6 c2 b! Z6 M5 H$ F' n  i( r
  813.         cmp     cs:[pos_y],dx
    2 E8 W3 x& |' H
  814.         jle     good_ver_max
    & |% H" L9 h. U" b. f
  815.         mov     cs:[pos_y],dx8 Z( g/ T! `0 E
  816. good_ver_max:/ X* L$ M- y4 Z/ S6 t+ C) g
  817.         iret
    ) l# d' w0 N- i0 ?1 `: v- Q
  818. 9 {4 M3 c- x: ^) F- A
  819. max_min:
    / K" h8 {2 Y  f6 q% A
  820.         cmp     cx,dx' ^  j; E% B: K/ n3 `
  821.         jle     no_swap
    4 D2 G' U* E' P7 y2 M8 f( j' {3 R
  822.         xchg    cx,dx
    3 N& [: `3 P) G" V) r; ?
  823. no_swap:
    " N8 T$ u& Y4 n0 x$ g5 E! i( ]
  824.         ret
    7 k1 M  i  P! @# }( c$ _; `0 j: Q

  825. ' q+ D8 t+ m% \* [- h: c
  826. _set_subroutines:' _: ?1 k* A* U* B
  827.         mov     cs:[user_subroutine],dx
    ) n2 L# L4 P6 M# L9 E
  828.         mov     cs:[user_subroutine+2],es
    6 S! U5 i7 l( ]' }9 E% c$ q. A
  829.         mov     cs:[user_mask],cx
    6 {; V) |3 N0 J+ r0 m5 I
  830.         iret
    & m0 a9 T8 y* C& q$ y) f

  831. ( p: @- o5 F% k2 ]9 X4 a! S
  832. _swap_subroutines:
    - g+ P1 K; R* }( W: c
  833.         push    word ptr cs:[user_mask]' R* Y  H5 w1 B8 h% v
  834.         push    word ptr cs:[user_subroutine+2]% l  K3 z6 `) U* P( M, @# u6 s( [
  835.         push    word ptr cs:[user_subroutine]7 S. n1 l/ o' w/ S! }0 P
  836.         mov     cs:[user_subroutine],dx
    # a- `5 \- k$ L, y
  837.         mov     cs:[user_subroutine+2],es' p( M% u* l* y2 j/ m' j* z
  838.         mov     cs:[user_mask],cx5 j( i  U  K( h( N0 Z
  839.         pop     dx6 s+ _5 U. a- K/ f  ]/ P1 g: T1 d
  840.         pop     es
    6 l  B5 W4 b  k4 M5 z# V  b
  841.         pop     cx6 u5 v$ d8 y9 i1 k! G0 V
  842.         iret
    / X/ X: B/ ^! k; g' v* x
  843. * p) V1 `9 \4 n7 M, n% D% v
  844. memmouse        endp  x% ~8 q5 }# i' y% p" @; Z5 C' w

  845. & b4 v/ t  u' @- e  |
  846. endof_start:, W2 z6 c. G$ l4 w' q; Y! x6 V. _% W
  847. " T- `# g0 v; |9 j3 S( w/ k
  848. emsg db 'No mouse driver install error!$'$ K5 E1 O* f5 H4 e' e9 D
  849. old331 dw 0! y- d. ~- x( Q( i: k- Z* t: I
  850. old332 dw 0
    ' }8 k# x0 M1 M7 L
  851. old741 dw 0
    4 B; X. U4 F* E: q
  852. old742 dw 0' y9 ~. I2 C1 x% P( A! W9 z0 o
  853. memcopy db 0
    ) e, x6 I2 z) M. Z" l/ H  Y
  854. okcheck db 0
    % c' L& ]- u6 }' E/ }
  855. pass db 0; l! J8 G3 V9 i" {9 H
  856. chkl db 03 n5 w- A: e. T9 ]3 b' E
  857. lk db 0
    " g1 M) \# w/ H- j5 T/ Z+ ?
  858. chkr db 01 |0 K) Q2 M! D5 ?0 k
  859. rk db 0
    : {8 o9 i9 x& I  z, w
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    + @$ D3 T: l4 W1 E; H( D, R1 [
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '- j, I) g: z" E+ m( s4 u
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '1 _' ^9 Y# ]/ T& r0 p
  863. db '                                                                                '& [7 Q8 d( Z0 I: l3 C6 E/ m
  864. db '                                赏屯屯簧屯屯突                                  '
    + K' C% I: a9 u+ A8 L
  865.         db      '                                ?OFF汉OFF?                                 '
    # a9 s' |' P# _, g5 U; v
  866. db      '                                韧屯屯既屯屯图                                  '
    9 Z) m3 g, P8 h. k. x5 H; f
  867. db '                                                                                '
    ( q, \( I! h) [- @
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    8 J7 m; a6 I4 _2 w& ^4 t
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    5 q) \) Z5 X% `# ]1 X0 L
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '" v+ x7 `( G; j7 _% J. {: K6 K& D
  871. 4 h  A5 u" D. \! l, [6 @( G
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!7 y: E5 Y# [5 e9 H
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... . W+ z, ^3 ?( ~4 t- I: M( l

  i& t: l3 Q. ^1 V谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 15:11 , Processed in 0.103279 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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