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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
/ }2 K% B" i! t/ O. z0 k, t2 V+ h  Y7 i/ v3 e! H
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;, p" Z: v7 U8 C' {- J: i: c  P& z% |7 S9 a
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    & J; b- e0 M! C
  3. ;                                         By Bini.Yi 易祝兵2 R/ Y3 z' P* h
  4. ;                                         http://www.ufoit.com 计匠网
    9 m3 ~' B) w& h* `# i1 v5 f6 A) d
  5. ;                                         2002/04/06 YYYY/MM/DD% d3 J. k! u$ G9 b
  6. ;9 l9 l. j9 {! D) ~+ j6 m2 _5 H) U
  7. ;          6 n3 p) w/ |( Q1 z
  8. ;          This program  test the mouse button  click and move.
    + d3 U  s! B( c  t) d
  9. ;( v- F, o* D7 T) x; m' Z1 ~( R

  10. " @+ E0 B, ^: I7 m1 y5 j+ ?
  11. .model tiny  P+ L/ k4 e% A2 `/ Y
  12. .586% d" q3 x+ p5 y  t! t7 |: d7 f
  13. .code' c. x3 D# j2 |
  14. .stack  100h
    1 u$ Q3 H0 n2 E* M9 m- p( K7 i3 G
  15. .startup
    ( K/ i- d" P1 ]' E# I5 d: Q. N
  16. pusha3 M1 ]7 L! n% Q$ \- O/ C
  17. mov ax, 3533h; E5 J# K& {2 t
  18. int 21h- B) o! B/ a) X, c* Z. l6 l
  19. mov word ptr cs:[old331],es, H( K' M/ V$ P) W8 l
  20. mov word ptr cs:[old332],bx
    5 n$ Y% W' {6 D+ V. F
  21. mov ax, 3574h
    / B1 a( m9 I* K$ y
  22. int 21h
    , r+ Y' T% p) e+ l+ \
  23. mov word ptr cs:[old741],es
    + L5 l5 J+ D' H3 m
  24. mov word ptr cs:[old742],bx# _1 F4 I  b8 w9 }" {+ @
  25. popa' a& Y9 ?+ Y: [# J
  26.         call    memmouse
    8 x+ v" n2 f7 M  {, O
  27.         mov ah, 006 b3 X# \5 P; a, w* x
  28. mov al, 03
    $ ~0 Y1 H9 m: e$ h# N) k9 D
  29. int 10h
    " y) N/ W9 p$ o+ N
  30. mov ah, 06' G; v7 \# H) c2 ^) {: T4 H1 V
  31. mov al, 0) P) z% M7 t  T
  32. mov cx, 0
    5 w: q" {5 Y1 V# L6 I# J
  33. mov dh, 241 p" @: [; Z3 o9 X; b; ~
  34. mov dl, 79# X8 j# w# a8 a( @
  35. mov bh, 07h+ w1 z, U8 I: F: j
  36. int 10h
    ' p+ o2 @3 F' k( I8 J$ \& _% O; W
  37. mov ax, 0000
    & C% h4 `' l! e/ Y
  38. mov bx, 0002
    , n3 d! {. |9 ]7 K7 S
  39. int 33h
    / A- y6 s$ u# W! D" b7 Z8 U
  40.         cmp     ax, 0000           ;if no mouse drive install
    # |0 u* ?" x8 k3 l" }1 o
  41.         je      errormsg           ;show error MSG6 {) w2 H( |+ j1 ~
  42. mov ah, 022 f6 A" g+ Q  p1 u
  43. mov bh, 000 u$ K3 x4 H- `* e
  44.         mov     dh, 25             ;Move point out screen/ i: P/ i2 S6 Y& C, R0 j
  45. mov dl, 795 f' ^7 X7 S% p3 l& x& W$ n1 k
  46. int 10h8 u/ F  _; D% s/ N
  47.         call    showmsg            ;Show info
    ; w+ f) R& O+ Z( k  X
  48. mov ax, 0001
    ! {6 }" S: @: i7 M5 i( P' p
  49. int 33h% {  O+ G2 a  _+ m8 k8 h8 {7 G
  50. ; mov ax, 000ah
    ( x3 ~* n% W1 H3 @6 i
  51. ; mov bx, 0000) c& P0 ^) V) o$ K( b
  52. ; mov cl, 0h! y, B1 F# }2 q: t
  53. ; mov ch, 0F0h
    5 \4 p3 S9 C4 h$ U- u
  54. ; mov dl, 0h( F: f( [/ p  N7 p- R, M( h
  55. ; mov dh, 0F0h! \) E* h# T, c
  56. ; int 33h
    4 y0 e0 @8 B2 `1 L9 \
  57. mov ax, 0004h6 f. `1 f- q) N* Q
  58. mov cx, 0319
    , y+ V" i0 y& R) [) O# p' M9 n6 t
  59. mov dx, 0103
    9 B% h2 X0 N' x, a* p6 E
  60. int 33h
    * O" C( ?( K! y7 Q# I& s
  61. casemo:                           ;Case button click and point move 3 c2 Y3 O8 j( }5 z' M
  62.         mov     ax, 000bh         ;and keyboard press
    ; s& x7 s( g" u# c1 j
  63. int 33h' p, Y; |8 ^. Y1 I0 _2 I: n: L7 B
  64.         cmp     cx, 00h           ;if point move....X
    & g" E) M+ }+ f/ X- {/ V  n3 u; X! G
  65. jne xmov
    # ]# M; y8 J) |& A% [
  66.         cmp     dx, 00h           ;if point move....Y
    1 \+ E. w. G) E- p& ~" x7 Q  O
  67. jne ymov8 b, [  i$ Z" M+ y2 x, h7 w
  68. xymovend:                         ;X.Y move end# I" d& Q$ B" _6 s' w
  69.         mov     ax, 0003         
    * z1 c* \( `1 M0 Z# l
  70. int 33h. y6 [4 e+ N0 f+ D8 [& }
  71.         cmp     bx, 0001          ;if left button click  show ON
    1 j; b" g2 M# F, T/ f
  72. mov si, 1828
    9 Y: C* b* f6 m. R  c  ~4 F
  73. je listl
    * i; t; j8 d, `; b* u) z* b6 c
  74. mov si, 1828
    1 }7 v4 J2 N% b
  75.         jne     nlistl            ;if left no click show OFF
    ) g$ }9 C: G' ?- S) M7 Y4 I. v
  76. testr:- v: [' B: F; Z2 B. B- K  |4 J
  77.         cmp     bx, 0002          ;if right button click show ON
    ! f  w  h- Z" Y6 O: C; U
  78. mov si,1842
    . |( e' q& g+ m. `. a, F
  79. je listr
    # S3 l4 p- d4 {. X
  80.         mov     si,1842           ;if right no click show OFF
    3 f& B4 N, \5 z) H+ M0 m/ M* X& N0 x
  81. jne nlistl
    2 ^" Y7 x5 B) i9 }
  82. casekey:2 e6 e- e6 z2 k& q2 L5 B- x
  83.         mov     ah, 01            ;if any key press jump check
    + L  Z! C+ e; G- d7 D* d; n
  84. int 16h
    - _' O% y% U  d$ e, f5 r
  85. jne kpress; A. q  E+ n3 F
  86.         mov     al, [chkl]        ;check x flag
    & e2 B( }: j+ T  S7 h% y' @/ A
  87. cmp al, 02h" L* a( C/ X- H9 x1 o2 B$ u! Y2 j3 Y* B
  88. jnb chkok
      T0 D9 J: J- N/ b5 A
  89. jmp casemo/ X. O5 l& a( l  M' S2 c' h
  90. xmov:                             ;if X moved, get the X flag+1
    ( G) r; B5 @  t+ D. j% T
  91. mov al, [chkl]
    / x  O2 e3 P0 `5 Z% u# _, {, B5 W
  92. inc al
    9 F) \0 P2 Z+ j; F8 e
  93. mov [chkl], al; f* \( M) q8 @+ Y
  94. call passok) e3 I. [8 v: V! o* v
  95. jmp xymovend: L7 F; i8 c" {$ m
  96. ymov:                             ;if Y moved, get the X flag+10 ]* f( E( j7 J7 f3 w
  97. mov al, [chkr], a2 S8 g3 c7 Y/ ]8 n7 P  p
  98. inc al
    8 C8 `% o; ~! g: d$ y, ?5 r. n
  99. mov [chkr], al0 a8 h2 P8 l0 N# C! d5 E4 Z, D8 D
  100. call passok. n. x( q, t. {# L& H+ G8 L: I3 |1 m
  101. jmp xymovend: Y/ p( V# M6 x1 E

  102. ; W& r  q9 e4 H: ?. I( l
  103. passok proc near
    / K) ~5 {0 I9 U$ M
  104. mov al, [okcheck]# g* U2 T# i8 ~
  105. cmp al, 1; X: ~2 O" t/ {8 j- w
  106. je let0
    8 J" D, C  N* B# P& v  N4 W5 B: q
  107. jmp passret/ W9 e! v0 V' M7 O0 m  k! T' V( i  s
  108. let0: , O8 B% P2 a  U/ u$ R
  109. mov [pass], 1/ H8 d2 ?: A3 t
  110. passret:
    - @, E: Y, R- i8 l
  111. ret
    " R( c4 x) T$ t5 J+ Z; L
  112. passok endp , e* G: V* D0 T7 p, n
  113. 0 e- [, _5 `1 r4 i
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS+ E! }5 N( y( K5 s- E
  115. mov al, [chkr]* K" _0 X4 b* K) `. _
  116. cmp al, 02h
    , a# G; L4 a+ U. K
  117. jb casemo
    7 L$ m3 b& j/ W; e1 V! K% {# P
  118. mov al, [lk]( P1 l; t+ |* g+ v& u/ G2 D
  119. cmp al, 1
    * i) V' U0 U. j2 t/ I( t
  120. jne casemo
    3 m# h1 G5 B0 S$ W! o
  121. mov al, [rk]0 x& `: [4 E7 [5 Q/ }
  122. cmp al, 1
    4 N  j/ P+ J. e3 \" k% L
  123. jne  casemo
    8 [* T& K7 `1 ]5 J+ Z$ q. |, @6 ?
  124. mov [okcheck], 1" a$ p5 q( b! f- X; p2 K& e5 H
  125. mov al, [pass]
    3 @" T4 y. i( ]+ v+ a9 Y! E/ ~
  126. cmp al, 1
    5 `8 z- X. l/ c
  127. jne  casemo
    $ Y# N+ A, S" e) j' h
  128. mov ax,0002h
    3 G3 {( J/ m* t+ o# N" r) Z1 c  Z8 `
  129. int 33h/ Y  h: j8 e8 Q2 N2 M
  130. call cleascr
    0 ]" F$ e8 I# m

  131. 5 N- y+ w. W1 n' {' e
  132. call oldint
    ( y* A, j" ]/ W
  133. mov ax, 04c00h
    " Q2 P0 V5 n" {: N* L% s* A. [
  134. int 21h
    : y% b8 h8 c4 B/ i- L0 Y

  135. 6 l& D: E0 c. |  z" a6 L
  136. okexit:! V) x. n, q5 l' o; P
  137. mov ah, 4ch
    8 V0 @0 M6 D* N  H9 R4 y
  138. mov al, 0. ?8 K) g! {0 B7 y4 M2 E
  139. int 21h* F0 g' u" s9 G, O0 I
  140. listl:                                 ;Show ON
    : p: T- n6 h1 ?
  141. pusha2 e# W  Y! K2 n1 s/ m2 M$ u/ z
  142. mov ax, 0b800h( {/ X3 A# p$ A& \
  143. mov  es, ax- b) M" S3 U" @; y. d
  144. mov ah, 47h( n1 Y  a, R3 v. d8 ?) L: _# {
  145. mov al, 20h4 I  l; o+ x4 [" X$ C9 x* g
  146. mov es:[si], ax
    : C# y- x9 k9 f3 H
  147. add si, 02
    / i  s3 `0 t6 k; K* O  m6 c& |7 }
  148. mov  al, 4fh
    " G4 o# g' G3 ?& ~& ^
  149. mov es:[si], ax) {  Y0 m4 ?9 i
  150. mov al, 4eh
    8 h7 V7 s, I% O! E
  151. add si, 02
    5 @& |" ?. G- A( S5 B% [- K0 B
  152. mov es:[si], ax
    8 p: H# t. o! B! Q6 X
  153. mov [lk], 1
    / ]1 Y0 }) B5 U+ N; i
  154. popa
    ' t4 f# L0 Z$ B1 C, [
  155. jmp testr
    8 S0 w. H  W& s6 G* o% F" p
  156. listr:                                 ;Show ON: ^$ J6 b2 X7 k# P/ ~6 M
  157. pusha( Q$ J, ]; D1 ~/ O1 q, t
  158. mov ax, 0b800h" Z) E* M$ G4 I5 q0 \( B
  159. mov  es, ax0 g( ?/ U  i( k1 i# S. L
  160. mov ah, 47h
    " _- t5 E- I1 u1 z& x  |/ M* |
  161. mov al, 20h3 M: d# B+ x; [) K0 ~! F( u. `0 N5 ?
  162. mov es:[si], ax' n$ y9 y! Y- _; j/ F: I! ?6 L- |6 n
  163. add si, 02" b# b3 D4 v; c+ e) a! o
  164. mov  al, 4fh9 U$ n7 d0 v7 ]
  165. mov es:[si], ax
    2 A: p6 g4 {4 c2 K
  166. mov al, 4eh3 ?4 U0 |, A4 F3 d
  167. add si, 02
    $ Z) T+ |/ F( g1 o7 ?2 Z1 D0 o
  168. mov es:[si], ax
    # _2 o: K* g3 |
  169. mov [rk], 1
    ( p$ G4 |( L" l2 K' l+ H$ c
  170. popa
    $ n' u9 j- I0 b
  171. jmp  casekey
    - c8 Q, o( e1 a- n

  172. 8 Q* N7 r$ I$ M% N3 d4 n. W
  173. nlistl:                              ;Show OFF* g( _2 @5 I" K: J; W
  174. pusha   0 q' z6 c' P) Q( r4 C- y- F6 }
  175. mov ax, 0b800h
    2 z% N8 H. P1 D4 x8 K5 K- r
  176. mov  es, ax
    : R0 j% D5 D2 N. I1 x6 Z" i
  177. mov ah, 17h7 Y8 }% d- D. b4 `# Z0 b6 e
  178. mov al, 4fh
    7 Y& W+ O, L- q4 h
  179. mov es:[si], ax
    - P% a+ W+ i. Q
  180. add si, 02
    3 a. o- V; D: s
  181. mov  al, 46h7 R: @8 `* \2 _" J3 r7 |2 d& }
  182. mov es:[si], ax
    . x5 N9 w+ K! T
  183. mov al, 46h
    3 P& Q) y* P' X
  184. add si, 02- @4 E  f) o) }) C) d& S6 P3 m
  185. mov es:[si], ax
      ^+ J/ V, O' N8 }
  186. popa8 s" r" S, s7 M5 v1 G4 e5 i
  187. cmp si, 1840
    8 z9 y7 a. w, @; c4 Z, c5 I2 Q
  188. jae casekey9 B8 |/ f; _3 [1 I& H, [$ `
  189. jmp testr
    ; m3 k! @7 g* z7 |& p
  190. ' ~+ F; o3 h) N1 \% {# A6 z! ~
  191. kpress:                             ;Check key press if press<ESC> then EXIT9 E! Q* ?+ k; Q. m4 w% ^/ B% i- [* D
  192.         cmp     ah, 01h             ;and return a error
    " _+ T$ s/ w2 b1 ]1 s3 L
  193. je exit1
    / F% n- \; {- |" H. g
  194.         mov     ah, 0ch             ;if press other key then clear" y1 \' u! N' k7 X0 h: O
  195.         mov     al, 00              ;keyboard buffer
    & _- G$ Z3 k' F1 ?) P$ M
  196. int 21h$ B; I5 B% z+ ^, {* j
  197. jmp casemo 6 ?1 H9 {& k5 d6 E8 |, K  l
  198. * k7 v; `! _4 y7 [; o2 n9 Y
  199. errormsg:                           ;if mouse driver no install* c* `6 o6 A- t+ e+ l( |7 r3 s
  200. call oldint
    8 Q; P/ N; h; [3 }& g
  201. lea dx, offset emsg8 K; A8 _5 x4 O
  202. mov ah, 09h* V- U2 s# W0 o% n7 Y* u. [( k
  203. int 21h0 ~( ^) f4 J5 W- u9 S; a- S
  204. mov ah, 4ch
    6 f0 g4 d0 t, o% ~, W
  205. mov al, 2
    + I5 p  i8 k7 J1 }
  206. int  21h4 f, r0 s' S' v3 k# Q

  207.   _8 {" ~+ J  T) Q/ M. V
  208. exit1:                              ;error exit" j  \6 g1 S& i/ o4 [
  209. mov ax, 0002h6 @4 C$ @/ ]# t! o( C8 y
  210. int 33h
    " P% X) r# G* y4 d+ m2 W% h* `% Y$ ^* g
  211. call  cleascr
    0 _5 f8 O0 x6 q9 a2 O4 ~1 F7 }
  212. call  oldint; S9 d* H5 m9 m5 d
  213. mov ah, 4ch
    & ]! d2 ]: j5 f" p6 }
  214. mov al, 01
    ) t( P  \3 |/ K) |
  215. int 21h8 Y! k8 }+ f4 C, r- Y* B# p

  216. ; P0 T/ s8 s$ Z6 o
  217. cleascr proc    near                ;clear screen
    ) l# O0 Q) r5 u. o" k
  218. pusha
    1 p* n* P) K- U8 H# F+ J) X1 b
  219. mov ah, 06( O9 c7 A7 B0 n
  220. mov al, 09 d+ _& g; p; K- _
  221. mov cx, 0
    , I4 q& F. m- k$ S6 l$ b+ ~0 ^
  222. mov dh, 24: P8 E4 n% K9 O8 G; q* W
  223. mov dl, 79
    2 d. y, u  h7 ^# P5 N; o* {! Q- O
  224. mov bh, 07h
    * H& y0 f# D; T3 [
  225. int 10h# P) l2 Y3 n2 `
  226. mov ah, 02' T- F- R6 F% Y; N. l. \
  227. mov bh, 005 W) C& q9 E5 H
  228. mov dh, 0
    3 D+ X" ~( T0 ?3 r* @8 R
  229. mov dl, 0
    5 g% L+ [! w- I
  230. int 10h
    9 J4 N% s' C3 K
  231. popa
    - `$ N/ p0 T& R5 _1 [6 x! I+ X
  232. ret4 f: l7 X7 F7 P6 M0 [. A
  233. cleascr endp
    ) V# V1 R8 V; k6 c

  234. 5 {/ c) s6 I( h/ E( A- q) {  c
  235. showmsg proc    near               ;Show info, {$ d0 y: u8 P9 q
  236. pusha
    + ]$ l! h* a4 x
  237. lea di, offset showms
    & |1 P3 @9 s3 S9 F
  238. mov ax, 0b800h
    7 i  W6 Z0 {# R
  239. mov es, ax$ k: q  D' ?: \# y* w1 \/ k
  240. mov si, 0# ]; y  {" g: Z, a/ G
  241. mov cx, 4800 M0 c  F7 m( w: A
  242. mov ah, 07h9 r' w6 \) K2 G$ o
  243. @@:" }$ H6 O$ P8 h3 V
  244. mov al, 20h4 a3 J8 r0 F* e3 n6 H$ ^; B7 N
  245. mov es:[si], ax( t% ~3 u: ?  |& {
  246. add si, 2- ]1 I' [: h& a: K3 t! t. }
  247. loop @b
    ; _  H. M1 \9 l- Q
  248. mov cx,880
    . e$ _  Y  h; \8 q
  249. @@:
    ( j0 m2 k! Y- G4 ^! w
  250. mov al, [di]
    ( d% l# w) _7 x6 M
  251. inc di
    0 `1 t3 w2 N" \( R$ c5 t7 h; N" ]& N
  252. cmp al,20h" c/ f6 F6 i' g/ P0 b! v/ h' J9 N
  253. je showch11 [# w* V! E4 J
  254. mov ah, 17h
    - c+ h" ~4 X+ S* G
  255. jmp showch3 , Q" M# A) _6 n6 F) }
  256. showch1:
    5 F/ [5 A7 Z1 z  F* K
  257. mov ah, 07h
    , R) X* p' ~; Z) W# V4 Y% H. x3 d
  258. showch3:$ Z1 z1 \8 I% {" q  J$ r: ]) _
  259. mov es:[si], ax
    ) ~$ T$ h/ P7 p
  260. add si, 2
    0 z: p  N' r. h# l
  261. loop @b
    6 _0 i6 s, a. _* n% s% F
  262. popa  [9 S* N1 a4 x- I  j* p. j
  263. ret
    7 Q' M- x* ?3 ~* E8 ~2 t4 ?0 ]; L
  264. showmsg endp
    " @8 j0 e2 W5 M$ w& P4 \; j

  265. + n1 ], P) Y2 A4 `% T
  266. oldint proc7 f$ u) i6 }* A. c" `5 J1 X9 P
  267. pusha3 ?0 K! v: q3 A
  268. mov ds, word ptr cs:[old331]  D; F8 y# W9 _2 z5 _1 L8 L, Z; U
  269. mov   dx, word ptr cs:[old332]* H4 b4 O5 _# s4 V5 I& ^. G0 G+ ~) |
  270. mov ax, 2533h4 d9 |1 l1 a5 u" c' s9 B
  271. int 21h
    4 v8 C' D5 K8 i4 O+ {( @
  272. mov ds, word ptr cs:[old741]* d1 k% v; n# I8 a" ]9 R. c* N' V
  273. mov dx, word ptr cs:[old742]
    5 @: ~9 j* |# \6 q, [" K* Z
  274. mov ax, 2574h
    0 c2 F' K, R1 ^. ]2 f" ~
  275. int 21h
    , }+ e4 F; m+ i7 X
  276. popa
    , l- s: O3 C+ K+ p5 e+ W+ p2 D
  277. ret8 u7 K2 m. {' }1 F
  278. oldint endp" E. i5 M+ S0 G0 y3 }! h0 [/ g

  279. 7 i3 \) x0 m/ q
  280. memmouse        proc% F- K6 |7 Z, x% t/ c2 B
  281.         xor     ax,ax4 m, C, u4 t% ]& {0 K: N% p( \
  282. int 33h
    9 c4 k( `6 V6 I6 W
  283. cmp ax,0ffffh
    , j# t  s1 O) J* K, m2 k) Q1 K
  284.         jne     not_loaded# w7 i1 P: S" r+ I" e
  285. mov [memcopy], 1$ s$ {% u0 A1 _. k
  286. ret7 U3 N5 y8 r& ^8 @& d1 K
  287. ) X1 ?3 q' r) z$ a2 d1 O, o4 y
  288. not_loaded:
    2 ]9 \  T( g. T2 S+ j; U, O0 c

  289. ! O1 k& Y  i2 {9 r: h7 O, v
  290.         mov ax,2574h' N6 w+ W1 p. S. i  x6 r
  291.         mov dx,offset new_isr
    , r, z' d; T. A- b, z( [/ Z
  292.         int 21h1 m2 n; r: k+ H" ~+ r

  293. * p5 j( [; |+ ^+ k* x$ K
  294.         mov ax,2533h
    3 d' t: N4 |  F) S
  295.         mov dx,offset new_33
    . X+ f" z5 |& U+ }$ ~. l3 J
  296.         int 21h
    - n- X" @9 V- R  k% `+ X. d* N/ S

  297. 0 f! ~4 ]' G$ [7 i5 N8 S! T
  298.         cli/ k1 u: G6 M1 l4 r" @" b, |7 C

  299.   T! \" C- ~$ o* c' M0 t% ?
  300.         mov bl,0a8h
    9 _. o& ~# K& c/ O9 y( f
  301.         call keyboard_cmd
    $ v( C4 G* [9 E& K, F
  302.   d0 d: \# L3 G* y- r  m' F( y
  303.         mov bl,20h
    / W0 q6 p8 y  u2 }- T
  304.         call    keyboard_cmd: p9 ?' a( M9 d- D8 l4 m
  305.         call    keyboard_read
    0 K+ M8 O5 }  T) ?2 R# ~
  306.         or      al,2+ L! Q) q- I, z+ h
  307.         mov     bl,60h& R; _+ t  \6 ~
  308.         push    ax0 Z* @1 c5 a) |6 k7 \+ f
  309.         call    keyboard_cmd
    8 H. x8 n! t4 v/ H' ~# O$ J" Z8 t! @
  310.         pop     ax
    - r- U9 v& ]7 w7 |5 b
  311.         call    keyboard_write
    6 t* Z4 I3 }9 N9 Y

  312. $ e# D& ]; L0 t7 V5 G+ `1 u
  313.         mov     bl,0d4h( M+ Q1 B+ O: k2 r" R* X6 k& Z  K7 M
  314.         call    keyboard_cmd  c( F& e" Z4 O) p: ~
  315.         mov     al,0f4h- D- a2 J7 L" d! W  {4 |3 f- _- ^
  316.         call    keyboard_write) i4 G* }3 U2 W

  317. $ s5 v4 t$ q6 a0 w2 D" Y' S/ e2 ^* `4 Q
  318.         sti0 G. N2 }* R- u: B  K
  319.         ret
    $ X2 y8 ~$ @% b( e. [
  320. call_user_isr:3 X+ G0 M! h7 I* \" H
  321. db      60h
    5 q# K7 [# q. t+ B
  322.         mov     cx,cs:[pos_x]+ F: c! {( a  g+ W) \1 v$ b
  323.         mov     dx,cs:[pos_y]& N8 X5 e) z. g) D+ r" [# y
  324.         mov     di,0 ;cs:[x_move]! s$ l( I( v, q- x0 Q1 z( s4 s$ y' M) P
  325.         mov     si,0 ;cs:[y_move]/ E) D- @- ^7 t% b
  326.         mov     word ptr cs:[x_move],04 _+ e% p6 J! {* ^7 s* [5 W
  327.         mov     word ptr cs:[y_move],0
    0 a  q2 Z- G& U7 X0 B
  328.         mov     bl,byte ptr cs:[buttons]
    8 w3 |1 K1 J1 i1 c! q+ z: k
  329.         xor     bh,bh; q# r* K" H0 L' h8 H
  330.         call    dword ptr cs:[user_subroutine]
    9 F& R/ P7 A$ @4 t! H) h
  331.         db      61h+ S" F' Z/ N4 L& I2 i! |" Y
  332. ret2 w$ T+ e; j7 z* X8 \8 E( J
  333. new_isr:' K. h( R8 C8 q2 f+ o7 I
  334.         pushf8 Z7 v5 V! J; P5 _: ^
  335.         cli
    # P8 t" ?% }2 z' E# A9 G" e0 C
  336.         push    ax
    + @  w9 b  i: |
  337.         push    bx. f7 z6 [7 N+ t9 g  ^
  338.         push    cx
    9 T) Q; u7 n# n3 ?0 N1 ?
  339.         push    dx( ^+ @" m9 U, k7 Q( n5 z3 Q, q
  340.         push    di
    , i& f% p7 x9 D* i; z. i* \
  341.         push    si
    4 A' Y( c8 T/ n1 u
  342.         push    es7 u1 |. P& Q2 H8 h
  343.         push    ds+ x9 g1 H% d3 N, }: f/ J) c
  344. % M. H/ Z3 i* ]+ X6 [8 b4 g  v/ n
  345.         push    cs2 g) t- J! _) l
  346.         pop     ds
    - w( H$ @( w# f6 s
  347. 2 j2 m2 r6 \- }( N& T
  348.         mov     bl,0adh
    - y0 `, `& l6 [& ^3 R+ c
  349.         call    keyboard_cmd
    6 o: L5 U1 r3 q9 N# c) E  z
  350.   k1 F4 c: y& X
  351.         cmp     byte ptr [first_time],0$ v& S8 L0 x: o' U/ _  W
  352.         je      not_first_time
    $ e8 A. L& g8 t* `

  353. ' F, ]4 Y) G0 `, l: J" S/ q. E
  354.         mov     byte ptr [first_time],0  }2 B6 Z5 G! K6 L, s
  355.         call    keyboard_read
    8 D6 r; E, k7 s; u: D* j6 p
  356.         call    keyboard_read0 ^- r  J' Q4 L5 j. }: h5 [$ d
  357.         call    keyboard_read% ~+ M- c2 W6 U* S: i6 t) }8 i$ b. Z; m
  358.         jmp     no_show
    4 e1 y5 T" A+ c* R+ C$ f
  359. 0 y) n: P" W2 Z6 w
  360. not_first_time:
    ) o7 @, A6 T6 z& c1 ^
  361.         mov     word ptr [temp_mask],0
    5 l6 r- h: Z9 g; R# t# \: p$ g% E
  362. 5 e2 o+ A+ ]: f  h- v
  363.         mov     cx,[pos_x]/ z, @7 T5 N4 G( N& x$ x2 q" P  y
  364.         mov     dx,[pos_y]% x) K* O# W" J1 [
  365. + k0 Y3 g: H/ H$ U7 ~% \3 {/ _
  366.         call    keyboard_read2 |( _- C% r( K9 J) p, c! r
  367.         and     al,7 ;3
    ( A* S" L% S' B" M7 d- n
  368.         mov     ah,[buttons]
      t! S* P) ]6 R
  369.         mov     [buttons],al
      E) `8 G2 {$ W. @  U4 ~/ U/ F' [) r
  370.         cmp     al,ah2 k" K8 Q5 B7 T2 t8 h6 z
  371.         je      no_button_change
    4 I) j4 |, w8 T8 X0 g- p; V# e
  372.         and     al,3- Y4 i( N: L9 s; ?% C
  373.         and     ah,30 b+ |! G# X5 @# F- Z3 A
  374.         xor     al,ah# t1 p. O$ _/ S: f
  375.         xor     bx,bx
    5 S: N3 m  Y* n) g( n% E- Y

  376. * {, P' _9 j/ {- s
  377.         push    ax+ |+ |; e3 K* |5 a
  378.         test    al,2) N, d# V: o# d! a3 T6 M
  379.         jz      no_right_button_change$ ?) h+ `3 ?3 J) u% ?: o% `
  380.         and     ah,2. a7 a- Q7 R9 w- ^
  381.         jz      right_button_pressed1 E" b! e, V1 n6 L' h/ h
  382.         or      bx,16" U, T; X( q* T1 [
  383.         jmp     no_right_button_change
    8 t- ^7 S4 J% m5 _9 F
  384. right_button_pressed:- d4 s; n$ Z/ A2 O
  385.         or      bx,8' n* B' G' C% d% S6 [
  386. no_right_button_change:
    5 T* c8 s. h+ l, U5 N, b; S# @

  387. 2 v. r2 o4 U# ^. A) W6 [# |
  388.         pop     ax
    / C5 I9 z' m, H: @; f+ d$ d
  389. 4 W& h# _" R; y& s
  390.         test    al,14 x; ^; b! r- x  i: v! h* N- i
  391.         jz      no_left_button_change
    ' n8 a9 g+ _' \
  392.         and     ah,1
    / I7 c5 n) y2 n3 L# }
  393.         jz      left_button_pressed
    & }7 M6 T6 x2 A9 O7 G$ A
  394.         or      bx,4) H9 y" [6 c4 b! [
  395.         jmp     no_left_button_change+ H) B' T/ n# g) y9 s
  396. left_button_pressed:- a* W: w! b9 w
  397.         or      bx,2
    2 C, D/ q' O& ^4 \  x# ]# h7 @
  398. no_left_button_change:
    " l# Y, |' q$ R4 Z: z
  399.   O9 c% }0 b! B$ {# D3 {2 f
  400.         mov     [temp_mask],bx
    # g# p  C3 c& p6 K! D7 ]0 m
  401. 0 n. Q) Z' n! Y3 o
  402. no_button_change:6 `0 B) ?1 N+ z3 z: L# ^
  403.         call    keyboard_read* Z) V' o8 F& D8 p$ s! q0 N
  404.         cbw
    9 V4 r2 c7 E9 p  ]+ c& a; ~8 c
  405.         add     [pos_x],ax/ B; T/ [0 C0 t1 o" D
  406.         add     [x_move],ax* P: n2 m6 L& G( J) r
  407.         mov     ax,[x_min]
    " P( {$ ^1 q. a6 D
  408.         cmp     [pos_x],ax$ a/ G; Y9 w8 \1 p8 A8 J
  409.         jg      good_hor1/ W" d) T, y3 v( I1 O! h' B4 x
  410.         mov     [pos_x],ax4 ]+ u* w; a# X- ~4 e; N+ q
  411. good_hor1:" X" Q8 C1 X- s, J4 P1 c2 g
  412.         mov     ax,[x_max]
    1 S1 c6 U/ P. A
  413.         cmp     [pos_x],ax5 S# H( b+ Y- F
  414.         jle     good_hor2
    # ?+ s, V1 B3 B
  415.         mov     [pos_x],ax. h* y6 ^" ^7 _. l5 P% L" p2 v
  416. good_hor2:7 a9 K" ~% \6 ^
  417. 3 f5 `0 s/ N2 O. G$ K# G
  418.         call    keyboard_read
    , s! B# @: Z5 O' g5 y
  419.         neg     al
    " R6 @) e4 g/ t' h
  420.         cbw
    + N* y4 M; \3 e4 N! H$ ?" \# D6 b
  421.         add     [pos_y],ax
    ; g$ J+ E& u3 v+ Y  K" X  E* ~
  422.         add     [y_move],ax
    / k6 m- ~! G( @9 q
  423.         mov     ax,[y_min]& f, w% T5 d" q/ Q9 \  ^9 u2 n
  424.         cmp     [pos_y],ax, Z9 k* H6 K/ i* M8 V
  425.         jg      good_ver16 e/ n" S7 C+ r5 l% {) F
  426.         mov     [pos_y],ax4 `/ p: r) s" K0 \' t6 k$ w2 t
  427. good_ver1:
    # n5 A9 O: R" K
  428.         mov     ax,[y_max]5 A. T& e' C# ?
  429.         cmp     [pos_y],ax# N6 _( Y$ x8 i8 o: f
  430.         jle     good_ver2. s" F; V' k1 c4 M# E# b& v$ ~% f( S- c
  431.         mov     [pos_y],ax
    0 B) v! i! v' |& O/ u9 E7 {! ]
  432. good_ver2:
    4 ~% _+ V4 v/ T

  433. ( J8 \5 r/ T* J# H5 t
  434.         mov     ax,[x_move]
    ! I) M% q% E, i4 G; |4 N- U
  435.         or      ax,[y_move]
    7 |5 i) M7 i1 [2 E
  436.         or      ax,ax
    % i0 {' ~" r( f& ?1 r
  437.         jz      no_change_position& w: V3 e- }8 q* o7 x' ]2 I6 x
  438.         or      word ptr [temp_mask],1( |& c* [: g, {8 L. h4 Y0 O
  439. no_change_position:
    6 Q( q7 d9 V: H1 N+ `
  440. ; }) o1 P0 U9 d. Q
  441.         mov     ax,[temp_mask]2 G8 }7 x  }5 z% H6 p1 d6 D) F5 m* c( T
  442.         and     ax,[user_mask]
    8 z6 x' Y" F3 ]: C- y
  443.         jz      no_call_user
    . Y8 o( x. h9 m! ?) V  y
  444.         call    call_user_isr
    * \5 v4 d- s. t. C7 `' Y
  445. no_call_user:
    - h) K6 F4 }" \) n' E; T! V* Q
  446. 3 w8 D" {& ^2 {
  447.         cmp     byte ptr [sm_flag],1
    6 \3 m4 ]+ n5 j6 w! O0 \) u$ x
  448.         jne     no_show
    ( h8 d. K1 ^0 e$ Z$ l: a

  449. ; R+ G; N  E* ?- {0 L0 y
  450.         shr     cx,3
    1 l. F/ T& O: k! c5 F4 V
  451.         shr     dx,3
    # e9 B( `0 }' }
  452.         mov     ax,80
    ! D6 `' j- O+ h1 O6 K
  453.         mul     dl
    * Z" P2 H, Y9 h/ Z. S$ d8 _8 a
  454.         add     ax,cx
    % w& |$ S) b# I  v+ a( d& T
  455.         shl     ax,1
    9 d) }+ \) G% K: y
  456.         mov     di,ax; @, u+ A8 K- T' U3 V9 G* X5 O
  457.         mov     ax,0b800h
    ) G. H) g- S+ @; x
  458.         mov     es,ax5 B' Y3 N" v% a) Y3 z2 F
  459.         mov     ax,[save_char]
    + q1 G) R$ z5 K, K% P6 x
  460.         stosw/ \5 g4 j4 t+ N2 r/ U2 f
  461. , p& r! F/ i- B2 p
  462.         mov     cx,[pos_x]
    , b6 c3 W7 J+ M& |/ j  k
  463.         mov     dx,[pos_y]
    3 M4 R5 _4 z& \
  464.         shr     cx,3
    ) L* n/ m' m8 n; L' h
  465.         shr     dx,31 h% R7 q3 r3 z, s
  466.         mov     ax,80- y9 N' \. |5 H, L" t$ P/ k" U2 @
  467.         mul     dl* m; Z9 Z- n* C" r
  468.         add     ax,cx  K* H+ ]8 t$ U+ S9 A' n
  469.         shl     ax,1
    9 ^! B% Z* [/ l, |* F6 g/ z
  470.         mov     di,ax
    + f1 X. V. `+ P6 Y4 V
  471.         mov     ax,0b800h
    + c) Y. u* W+ n) p
  472.         mov     es,ax
    2 q: j0 |9 Y2 O4 G2 \% ~0 b3 Y; H
  473.         mov     ax,es:[di]0 |6 p7 x& {- P% l
  474.         mov     [save_char],ax
    / H/ ?6 L; `" |3 k) B$ f( B# \5 Q3 B
  475.         not     ah
    + i' e+ q, ]# F- L- r3 L7 g- d0 U  [
  476.         and     ah,7fh
    3 C. E% O( c4 x* k8 A, s- p; g7 G
  477.         stosw
    ( C3 Z( s0 J# V: G" d
  478. no_show:
    " V" [: ^- i* K% L
  479.         mov     bl,0aeh$ F  {! @9 C* p' i& F1 h
  480.         call    keyboard_cmd) C0 l% e# h% J' g1 O6 N

  481. ' v4 Z# m# z- d2 D5 p
  482.         mov     al,20h
    $ M' C2 Q$ }3 Y, H% n9 H" ?+ A' U
  483.         out     0a0h,al
    6 d/ y% ~6 F5 a3 v* j
  484.         out     20h,al
    % W$ F0 s) `+ M6 |( n

  485. ' w' t# B# y, O+ m# |* s
  486.         pop     ds3 _( o  F$ q6 n
  487.         pop     es" `: Y8 @7 i% M, i) M0 T8 B. d* ^6 _
  488.         pop     si6 b9 K3 X8 p; f1 I" `
  489.         pop     di6 I: L2 S7 a) F7 {' I5 P: m
  490.         pop     dx
    $ V/ t: k3 e- g3 O' N- ^7 H# \
  491.         pop     cx
    ! N5 |) b' t8 X
  492.         pop     bx2 ~, b& A+ E+ [0 @! t
  493.         pop     ax# ]& P8 W3 U1 ]( i# Q8 w" A# v9 M3 r
  494.         popf
    ( X; j8 v: ~+ E& F
  495.         iret; i' ^( T6 t! z: b3 s5 M& Y

  496. # _# o4 w" h9 P, v# R3 i
  497. first_time      db      1- N- f5 J0 a4 c4 F1 K
  498. buttons         db      0+ @5 e' L5 z' _& }; ]) R# ~
  499. pos_x           dw      0
    " [; n, D' |7 f& r
  500. pos_y           dw      0
    , l/ O  X# e* U# \
  501. sm_flag         dw      0
    : t) \  Q' R! D0 r$ D4 w
  502. save_char       dw      0/ ]2 u( ?) [: S  Z1 r- A( Q
  503. x_move          dw      0
    7 J. ^6 y* `. z5 V: g% M. c
  504. y_move          dw      0
    6 d% B9 _8 Z) u" G. ?- q$ w. a
  505. x_max           dw      639
    4 s0 P. L, O9 A9 D, [7 D
  506. x_min           dw      04 K  d( }* X) \+ D+ w  O
  507. y_max           dw      199
    , s: D4 M- k4 q
  508. y_min           dw      0
    2 ~: ]$ m# ^$ c! v% n
  509. user_subroutine dw      0,0! L. s6 u* [* x2 W% J
  510. user_mask       dw      07 W. {& T6 |' H0 F  I$ t# f: u
  511. temp_mask       dw      0
    " _1 ^3 G5 O  A) @6 Z
  512. 5 v4 B) I7 y% L; n1 b) h
  513. keyboard_read:
    2 @% s6 X$ _8 e% W
  514.         push    cx, Q  I- h) e  v% B0 ~$ w
  515.         push    dx; P  T2 q! C- e( j7 i  {
  516.         xor     cx,cx
    5 A/ m( I4 I- a' O; e* X
  517. key_read_loop:- V: V; X: H6 O! L
  518.         in      al,64h; v  E! V  H7 `& Z% B4 }! D
  519.         jmp     $+22 e- Y9 g0 h% M5 q
  520.         jmp     $+2; s: L$ g. e; C+ M7 H
  521.         test    al,1: A) y/ ?* |. j9 a
  522.         jnz     key_read_ready
    : d7 |, @' z& U9 Z' b7 X
  523.         loop    key_read_loop; o7 {- _: L/ ^8 e2 u; i
  524.         mov     ah,14 j  |- x( O/ q# Q
  525.         jmp     key_read_exit# {( x* f( R. E% @( _& L; P
  526. key_read_ready:
    4 u, d% c% h7 }) x0 i
  527.         push    cx; ?. |  j0 Y2 q; e1 M% l
  528.         mov     cx,321 h  r# U7 @& \* u- p
  529. key_read_delay:% ^: }# Y! v% \6 m% r# W# K
  530.         jmp     $+25 n$ J3 Z0 d9 n2 c, g
  531.         jmp     $+2
    3 d3 |9 B( K( I5 t% V+ t3 _
  532.         loop    key_read_delay$ Z& L+ X( ]: N$ M- f* k8 f' o
  533. % G3 i  f2 d' e6 R
  534.         pop     cx( q+ l4 v* {" X6 t5 L: G

  535. + Y  K7 b3 X# m5 c1 i
  536.         in      al,60h6 `) a2 z" }7 v" O9 P
  537.         jmp     $+2) A9 j# ?+ ?) a9 g% ~9 e- U: u! \/ q
  538.         jmp     $+2  t4 [/ b. O$ F' h5 D
  539.         xor     ah,ah- H: e* r& }  [# k7 V
  540. key_read_exit:
    4 T5 G2 ?2 _/ Z
  541.         pop     dx* A# Q  f/ L/ ^7 X% j- M
  542.         pop     cx
    7 I. s0 ^9 v/ L# x2 |& G0 T; p  @
  543.         ret" G! F- [. X8 i5 R- S

  544. - i) ~/ U  ?4 b, ?& B
  545. keyboard_write:' a$ V3 L* q7 d" H; I! L* i
  546.         push    cx( l& e: W, g4 t# a# A
  547.         push    dx4 |! n, o- X1 k( Y# C
  548.         mov     dl,al
    " s0 K( N( K% t' `/ V9 j$ M! Z
  549.         xor     cx,cx
    ! f: v5 M% F( s+ N3 S' [/ Q3 A
  550. kbd_wrt_loop1:8 w7 a6 M6 a, t$ S) t7 R
  551.         in      al,64h
    . @' s$ k# k, L6 f2 C  J
  552.         jmp     $+2, j9 d) u. \, m3 [3 W# ~% Z2 i
  553.         jmp     $+2
    + q5 {- x# H, D9 k$ d' B7 _& j2 ^
  554.         test    al,20h" h5 F+ M  d/ Y
  555.         jz      kbd_wrt_ok1
    5 y: m4 Q4 R9 b% {
  556. / D6 a9 I' m+ u; o
  557.         loop    kbd_wrt_loop1  O! H: i" h: v( v. \- D

  558. " ~" U$ A- e- Y8 D( b
  559.         mov     ah,1% [) J) x; \1 f% |# b; h
  560.         jmp     kbd_wrt_exit9 r- S6 n4 n7 J8 _' n6 O/ Z* A
  561. 4 ]0 L. Q/ A" Q+ }
  562. kbd_wrt_ok1:
    8 @- }" @1 L( m% W
  563.         in      al,60h
    $ M8 x2 h! m- g' v* W
  564. . S+ A6 e( _) G" E% p& A
  565.         xor     cx,cx: G8 ^8 o* n. X
  566. kbd_wrt_loop:
    ' \* r1 c; i7 b2 h! _7 B
  567.         in      al,64h
    . M& P$ @2 N$ o1 o8 d' c
  568.         jmp     $+2
    * Z! e% g  U3 d* [7 G
  569.         jmp     $+2
    ' X! K1 {! X6 q; a; }, o( r
  570.         test    al,2
    $ E/ P/ t1 x+ T5 U. o2 \- i' B
  571.         jz      kbd_wrt_ok
    5 P/ r3 B$ [8 ]* n/ e

  572. 5 d- A; O' L7 }: X
  573.         loop    kbd_wrt_loop
    1 Y* ?) q* }) {; a/ f, [  C3 X& o) y
  574. $ y" G3 j; |# U' P" t% Y* f1 ]4 ^
  575.         mov     ah,1; L8 N2 g" N% z; |
  576.         jmp     kbd_wrt_exit
    3 b; P) ~/ u9 S% K
  577. ( S: r0 ^; v0 V( v9 F
  578. kbd_wrt_ok:
    ; \- M6 E. b. U0 `
  579.         mov     al,dl! U( ^) F# }3 Z" g/ ]5 t
  580.         out     60h,al' u2 ^- j0 o- t- t
  581.         jmp     $+2- K  ?9 Y7 A# E6 e" Y
  582.         jmp     $+2
    3 y1 P5 T  P7 Q" ]" B
  583. 9 M5 z8 V  E1 a# I
  584.         xor     cx,cx
      R7 t& y! }; F6 @! M: w. o
  585. kbd_wrt_loop3:
    1 X6 F2 N- D: @# r
  586.         in      al,64h
    " O5 B7 _! W5 P& A2 A
  587.         jmp     $+2, d; X' b+ b7 n! L7 a3 a, X
  588.         jmp     $+2+ `5 J7 w0 M- X8 x! A
  589.         test    al,2
    % }( v5 U' o  Y/ a
  590.         jz      kbd_wrt_ok37 J! B, |0 _1 Q/ X8 ]! p

  591. * H& `1 ^$ k* R' ^1 R6 `
  592.         loop    kbd_wrt_loop3
    ! N7 ~+ F# \& ^( d

  593.   t# M: l8 c- H0 _
  594.         mov     ah,1
    8 [) s2 _  g9 K1 n
  595.         jmp     kbd_wrt_exit4 V4 D/ H! j; _, X6 N

  596. / c- [, K/ e3 x8 R; b
  597. kbd_wrt_ok3:9 T9 u2 ^0 F0 O; W7 O4 I) F
  598.         mov     ah,8
    & {" ^+ c' D6 N! n0 w- g
  599. kbd_wrt_loop4:
    , W1 s$ M, k3 Q7 p' e0 p& `( u3 D
  600.         xor     cx,cx% ]9 B9 X* w1 G/ ]3 M" U
  601. kbd_wrt_loop5:, I$ h; y# u2 W" N+ M# D. m
  602.         in      al,64h
    : |4 k, S8 V9 s- t5 F6 o* g
  603.         jmp     $+2
    ' ]( F, H( K( n
  604.         jmp     $+25 b1 h# O  p% ~1 B* z1 {5 t
  605.         test    al,1
    / x3 \& p9 @% g# D! e8 S0 B
  606.         jnz     kbd_wrt_ok41 [9 X& k  R( m7 _0 p; ~" @! o

  607. ' I+ s6 b6 @1 G
  608.         loop    kbd_wrt_loop5
    7 L( r- N! u1 A& G

  609. # e$ p. r8 o' T& r! H- b+ ~
  610.         dec     ah5 C: V4 Y0 i, L+ ]
  611.         jnz     kbd_wrt_loop4" J) q# P/ i( y
  612. / S3 M6 `, Q5 U4 i: q' B1 b: f
  613. kbd_wrt_ok4:6 R( Q, K5 y9 S# ~
  614.         xor     ah,ah
    - x; ?# M5 F: N& W2 w$ Q/ C) T
  615. kbd_wrt_exit:' x5 W# c  l; e+ p
  616.         pop     dx: V2 r. ~# M- Q
  617.         pop     cx
    9 h% H1 V3 e& _' f6 G9 d
  618.         ret" _- Z4 b' Y* a; X
  619.         
    $ j0 Y- }) ]/ l
  620. keyboard_cmd:
    4 y. W4 v& e) `  ^3 h5 X
  621.         xor     cx,cx
    6 V" X9 m& D1 J6 j# a3 x
  622. cmd_wait:
    ( o1 a& Q3 a) R# [2 B: o
  623.         in      al,64h
    , l1 }( E% ^# M4 P
  624.         jmp     $+2
    1 `8 a' i1 H- v& C: m3 E3 t* m3 d
  625.         jmp     $+2
    3 ?6 u) u0 Q6 G' c; {% @* Z8 ^6 O" }
  626.         test    al,2. h+ e6 p2 f0 M: X) T
  627.         jz      cmd_send
    ! `/ Q" P7 z% O7 Z5 O
  628.         loop    cmd_wait
    0 s3 [" d4 N& }) @/ p" d6 ~; }

  629. 4 B/ i# A; a# \& ~* Y$ K
  630.         jmp     cmd_error
    , M, }- k; w8 E( L& _' M

  631. 3 }3 }7 Z: R4 f* V  D
  632. cmd_send:' G2 ]/ y5 j' e+ V% Q- L3 B
  633.         mov     al,bl
    $ J9 b' M3 ?& I% i7 B: N; H  o$ d
  634.         out     64h,al
    ; C) y# b* V7 f! |$ {3 N) D/ L
  635.         jmp     $+2
    1 A8 W; u/ A8 L$ `6 k
  636.         jmp     $+2% E: u5 R: h, L8 J6 ~7 \: j

  637. # R; n3 B* U6 p: M! c' M
  638.         xor     cx,cx+ v$ G8 [# D6 X  x. U! m/ u
  639. cmd_accept:, Z+ X: C; J# Z' W. R0 m9 \9 ^
  640.         in      al,64h
    % e2 q8 K+ ~3 t% ^- t% c7 R
  641.         jmp     $+2
    ) }( I* {5 V" y  {  t& |9 P3 ^
  642.         jmp     $+2  A& }  x8 H5 Y6 ]. E5 n% b) H
  643.         test    al,2# E/ l) q3 S1 c$ U9 C2 o
  644.         jz      cmd_ok
    9 p2 t7 r* _& A0 F9 S
  645.         loop    cmd_accept/ p# H- |& S* `9 v
  646. ; F+ |9 y( I+ B5 ^' f! p- x4 [
  647. cmd_error:( u: h- q" w* Y8 j3 X
  648.         mov     ah,1! t* }. l2 o. @1 ~7 I* ^- v
  649.         jmp     cmd_exit) ]& k, o: L5 I8 x6 z, k* S
  650. cmd_ok:
    $ D7 W$ y5 y5 f; ~
  651.         xor     ah,ah4 a' d4 g0 A4 o; C( F
  652. cmd_exit:. ~, _9 @" ]; y- A- ~7 f3 @: M
  653.         ret
    3 v* G; n' H  J

  654. 6 B& N' E1 V' @! g* Q, I5 F5 S4 R
  655. new_33:
    8 O  E0 f. `8 {/ Z  ~8 S2 w
  656.         cli% i! p! m9 F; G( B- j$ X+ o0 X
  657.         cmp     al,0
    6 h) z* I% j! {" t" q
  658.         je      reset_mouse
    1 d/ p/ q1 Y, F: v; d" L: H9 X
  659.         cmp     al,17 ?  T+ t/ r0 F  I) W+ {0 U$ l
  660.         je      show_mouse) b. C. U1 e: ^7 H3 s! ~, I7 _6 }
  661.         cmp     al,2
    ( L8 s$ O7 B4 X# H( u5 E( S: U
  662.         je      hide_mouse
    & y$ p  x  A" z" T+ U" p
  663.         cmp     al,3' f; x3 ?; _! a% K" p8 U* d
  664.         je      get_pos1 f! u7 _7 ]8 k- ^
  665.         cmp     al,41 ]' K1 h3 o' t- a: D4 T
  666.         je      set_pos
    , s+ b) @3 I2 T4 U1 d) F/ M* B
  667.         cmp     al,73 f9 o8 Y% c# C$ r/ e+ }. K, O
  668.         je      set_hor_pos8 d4 x! p$ E, d
  669.         cmp     al,80 A: H& H& g3 y2 j/ ]5 @) E4 Y
  670.         je      set_ver_pos
      F, U" v7 b8 A, X" c- s( q$ D6 L" ~
  671.         cmp     al,0bh
    : }/ z3 X! F4 @9 w: |  a  g
  672.         je      get_mouse_movement
    7 r( h; e7 b# _# G1 |# y3 t
  673.         cmp     al,0ch
    4 U5 r0 E0 R6 g. |4 K
  674.         je      set_subroutines& I- t7 _! g( J  `+ ~/ P
  675.         cmp     al,14h6 |, T+ n/ i# i  F
  676.         je      swap_subroutines
    # c. _- O2 h9 z' \+ }( K
  677.         iret
    7 V9 B% {6 B. v. a% |0 H, N

  678. 7 R. Z: V# X; B& [, M" C' A
  679. reset_mouse:* A) v) ?6 \4 q1 U3 C: ~
  680.         jmp     _reset_mouse
    # p  ?4 n4 J, W; K/ ~
  681. show_mouse:# S  j# J* I- L7 r
  682.         jmp     _show_mouse
    : i' ?: Q3 B/ h8 Z3 |$ B  |
  683. hide_mouse:
    1 K. J3 K5 I4 X
  684.         jmp     _hide_mouse& o5 A" O9 ?' ~; K* X
  685. get_pos:
    5 V! W. f, q3 k+ }
  686.         jmp     _get_pos) Z, o( i4 t4 m: o
  687. set_pos:
    6 y' [4 h7 q& n4 f# P% X" C3 o
  688.         jmp     _set_pos. o% h  [4 p! ]5 c) y
  689. set_hor_pos:
    " V: J" D" @9 U% R
  690.         jmp     _set_hor_pos
    - G- l# a+ j: V2 k( F6 b
  691. set_ver_pos:7 e' Z4 u- r. J
  692.         jmp     _set_ver_pos
    * }9 U+ h1 H- t
  693. get_mouse_movement:
    6 [. t: G" r+ _; o$ Z# ?' d/ b
  694.         jmp     _get_mouse_movement' k* A8 Z2 f, c5 E
  695. set_subroutines:
    8 @* m% k- ?. Y0 p" y
  696.         jmp     _set_subroutines$ i( B/ r3 o3 R' g. f
  697. swap_subroutines:
    & Y. C1 G  Y; `+ W
  698.         jmp     _swap_subroutines- Q% ^9 u+ ?# m
  699. / r3 t) L+ R9 n8 t
  700. _reset_mouse:' L: W) {/ g" g* e
  701.         mov     byte ptr cs:[buttons],0. z' N# p( `) `3 R3 H8 j
  702.         mov     word ptr cs:[pos_x],0
    9 }. ~; _3 c% o! [# \4 n6 v
  703.         mov     word ptr cs:[pos_y],0
    1 f; E# `- _" J
  704.         mov     word ptr cs:[x_move],0
    1 {) Y& \$ A: S" v
  705.         mov     word ptr cs:[y_move],0
    0 o% |8 k; k: @" h' f3 C1 V9 ]
  706.         mov     word ptr cs:[x_max],639( }5 O: A6 P6 Y/ ]  \
  707.         mov     word ptr cs:[x_min],0
    ' _$ n4 _5 \, ?/ w
  708.         mov     word ptr cs:[y_max],199
    / o/ A& @  E" L! n
  709.         mov     word ptr cs:[y_min],0
    6 V% e: E& I% g1 U
  710.         mov     word ptr cs:[user_mask],0
    - \0 `2 m# w6 D% c( e( L- O0 ~
  711.         mov     word ptr cs:[user_subroutine],0
    " k$ G8 {$ P; X! _/ x8 I4 w" U! Z  U
  712.         mov     word ptr cs:[user_subroutine+2],0
    # N: d; u0 d! ^: U/ p
  713.         mov     ax,0ffffh( R1 \% i2 q( E* L( H# v. }
  714.         mov     bx,3
    - I. j+ c9 H& ^/ `
  715.         iret9 l1 _* k) X9 O7 _2 R- q2 I# N

  716. 3 Q" K! t. b7 \& F9 w4 c% F
  717. _get_pos:+ x. r# I9 @. u+ V$ V2 y' u
  718.         mov     cx,cs:[pos_x], _" s, g) I# Q" U$ j1 b
  719.         mov     dx,cs:[pos_y]
    : |3 h' {2 U1 E. b% T. Q
  720.         mov     bx,word ptr cs:[buttons]
    5 I4 M5 b+ x! p3 |# ]" ?/ K( k5 h
  721.         xor     bh,bh
    3 K* x! a' W$ }
  722.         iret
    4 C5 K' O! W8 Q: t6 S' ]0 p7 o/ d
  723. * g8 P) Q* n' j& H/ J  _
  724. _get_mouse_movement:9 x1 G' Z$ a* s! S1 a
  725.         mov     cx,cs:[x_move]
    5 K9 U  b; ]  `  \$ l% h
  726.         mov     dx,cs:[y_move]+ P4 ]& L  D1 L: g
  727.         mov     word ptr cs:[x_move],0* b6 s  u2 M: o. `
  728.         mov     word ptr cs:[y_move],0$ z  Z% s: j( J- X: Z$ e
  729.         iret# g+ h( y9 Q- h0 E

  730. : a7 J$ e! w0 k4 i, b& w8 z
  731. _show_mouse:) y8 k3 c0 n+ M( S
  732.         push    ax/ }1 X% E% A( L1 w9 Y" u; R# y
  733.         push    bx! S! {) x7 w3 |7 i  c" ^
  734.         push    di- f% [2 L) i1 q) B. C: Y6 p5 Q+ j
  735.         push    es! t6 J: T8 }: l  d; d# D
  736.         mov     byte ptr cs:[sm_flag],1$ F: }" ]+ n$ I5 d8 e
  737.         mov     ax,cs:[pos_y]5 S  m- D3 n4 e' D! [
  738.         shr     ax,3; b. F1 X: y$ o( g% o
  739.         mov     bl,80
    * M) o& N8 y( h. E9 Y+ ~
  740.         mul     bl
    : j7 r0 k3 }  ]& w: X4 Q4 h5 X2 Z
  741.         mov     bx,[pos_x]
    7 O$ m/ k! {' A
  742.         shr     bx,3
    : {/ w/ C/ I2 z
  743.         add     ax,bx: U( G( N  t6 ]. d7 E9 |6 {
  744.         shl     ax,1
    # z+ L" V  u) p- _* c3 _- y6 p( u- m
  745.         mov     di,ax
    3 V- r5 h" L& h4 [) ^' P: e
  746.         mov     ax,0b800h3 {& H  p; \# s$ w
  747.         mov     es,ax* ^) X4 u: p' \6 w7 o
  748.         mov     ax,es:[di]" B+ s+ c5 p$ e/ P
  749.         mov     cs:[save_char],ax
    5 @* L) U* j( x4 s0 l! Z
  750.         not     ah; p  H  z! W/ V( w; q: k- R
  751.         and     ah,7fh
    . ~* A: R& a) Y
  752.         mov     es:[di],ax/ w" z8 I6 R" G0 c
  753.         pop     es
    6 T" ~! V. \3 t) T. ?2 q& m$ {
  754.         pop     di% }; ]9 r0 M1 {: p# j) @1 ?
  755.         pop     bx) {0 F6 _0 L* `# _6 B
  756.         pop     ax
    - q1 z0 X! C+ J2 X* |! g
  757.         iret
    ( i. s$ C: N' @/ Z( ~

  758. : O* m% P0 l- D; ]$ `
  759. _hide_mouse:
    5 J* T2 H) T# U# f' h4 o9 ~' g5 F
  760.         push    ax7 f- _7 y: I% C6 I
  761.         push    bx* @6 l1 m2 ^, J/ x  _( ~
  762.         push    di) _$ H- A/ Z% M7 ?( S
  763.         push    es+ J4 Y% F  V4 p+ O- h
  764.         mov     byte ptr cs:[sm_flag],0
    ! p/ `- d' Z  i0 f5 t
  765.         mov     ax,cs:[pos_y]
    ( k8 D5 Y5 \0 F* Z- K$ ~+ y
  766.         shr     ax,3
    2 j/ y4 j" z  }% |# x1 W
  767.         mov     bl,80
    / ~5 j( Y( d7 D/ ]  z1 K
  768.         mul     bl
    % o! N, J8 A: f( k; ~: b5 D
  769.         mov     bx,[pos_x]
    $ R' g) ^! j+ }6 m
  770.         shr     bx,3
    ) m) m" ~% {  w# k
  771.         add     ax,bx
    - P, q& a8 E4 f$ Z! X2 q
  772.         shl     ax,1+ A7 C, _2 i6 J1 K. ^, D* S$ E
  773.         mov     di,ax! n. g6 Y5 ]" L
  774.         mov     ax,0b800h" D8 ]* w6 p  R- Y) d% ^
  775.         mov     es,ax% }" [3 y. h$ S) L% b7 @; F
  776.         mov     ax,cs:[save_char]
    - F$ I/ L7 {: t( m* |7 Y
  777.         mov     es:[di],ax7 d! k/ a- G9 U- R& G3 C
  778.         pop     es5 M& C6 B7 O" k/ G2 i" i
  779.         pop     di% `* O7 V' ]7 Y' x
  780.         pop     bx
    , y1 o: e5 u0 T9 c+ t7 s# [* {
  781.         pop     ax
    3 x" e1 r/ B+ X- H# n
  782.         iret# Y* V: {$ n( n' i1 L3 E* h& U7 `
  783. 4 h( j9 T2 s5 H8 U1 j
  784. _set_pos:1 g' N. l  k3 T9 H/ \
  785.         mov     cx,cs:[pos_x]
    7 o) Q& k* k$ ^, E( Q0 J) i
  786.         mov     dx,cs:[pos_y]
    . ?+ s0 Y5 \2 y+ K, u* t$ i; v3 k
  787.         mov     word ptr cs:[x_move],0
    3 B! H4 J  e* y
  788.         mov     word ptr cs:[y_move],0" {8 P5 }& I5 S8 e& X6 }+ R
  789.         iret
    * |- _0 K4 n% j# |

  790. , Q# T0 `3 o  d: @2 M
  791. _set_hor_pos:) i. F4 c% Z. U2 W3 m
  792.         call    max_min: p$ o" U& i: A! b
  793.         mov     cs:[x_min],cx$ e7 f2 F$ Y, i
  794.         mov     cs:[x_max],dx9 ?9 W& A2 G$ ~* b, g0 j6 ~
  795.         cmp     cs:[pos_x],cx( X8 X& y) R$ ?# w
  796.         jge     good_hor_min" v& l9 q5 _, Y* l8 z- G
  797.         mov     cs:[pos_x],cx
    ( _% f. l3 A+ E9 G, U* F3 O
  798. good_hor_min:9 M/ T. I: L: l5 A  E
  799.         cmp     cs:[pos_x],dx
    ; q2 o! b4 ~. g. z% ]( i8 _; b
  800.         jle     good_hor_max; X8 V6 H& V0 H9 M$ k+ f
  801.         mov     cs:[pos_x],dx
      |* W' Q7 d0 s1 R7 k
  802. good_hor_max:
    ) [/ o/ t" S0 _1 X: P% H
  803.        iret
    9 t8 Q2 W& _: v' v

  804. " V8 g% T' M  C$ @6 _+ L
  805. _set_ver_pos:
    4 `6 W% q/ i& q* E* I, _' |
  806.         call    max_min) d, T% r  J1 I
  807.         mov     cs:[y_min],cx, F$ d% e# _8 c9 L( n
  808.         mov     cs:[y_max],dx
    / y- S5 x$ r! D; m. I$ ^
  809.         cmp     cs:[pos_y],cx
    / w" J, K+ X+ f! m* T" W$ }& K, E; H
  810.         jge     good_ver_min( K0 {6 g: W9 `
  811.         mov     cs:[pos_y],cx3 F5 w% y, r/ B8 N; P
  812. good_ver_min:
    & M$ V4 \% F+ y, ?& h6 l9 I* i) \/ U
  813.         cmp     cs:[pos_y],dx
    4 ]- t6 y+ e& H; ], D4 k& L
  814.         jle     good_ver_max
    # }: U0 j- L7 i0 F2 J9 `* N) r
  815.         mov     cs:[pos_y],dx
    ; c. n2 ]6 X5 S3 P0 X- K( {+ |
  816. good_ver_max:
    3 g. I" ?' X- G6 d3 L
  817.         iret
    % ?' P3 d/ H5 s' D: C8 c0 N. ^; y0 {
  818. : @/ E' H. x3 K+ u( K5 R, X% U
  819. max_min:$ P- ^$ ]) W" y9 c! J1 B
  820.         cmp     cx,dx$ f: }$ K5 `5 _
  821.         jle     no_swap/ Y' ?( u. x' d( j! ?" ]& Z- {- \
  822.         xchg    cx,dx. [$ u6 H' a( T. V/ |
  823. no_swap:; O$ R3 g2 w/ d. Z! [5 U
  824.         ret
    * w2 R0 o) @# N& r' i8 S, r
  825. 0 |0 q5 U& r( u7 F! {
  826. _set_subroutines:
    2 y* I% a4 |: w  [) x# I# f
  827.         mov     cs:[user_subroutine],dx
      o6 u" P) r  i9 r- `
  828.         mov     cs:[user_subroutine+2],es- O/ a; z) c) e8 y; F# l
  829.         mov     cs:[user_mask],cx8 I- F2 ~; o3 ^7 f
  830.         iret+ A* V6 k  M9 p$ X8 [5 r: k
  831. 2 N. u: g2 L2 p8 O2 ?* @
  832. _swap_subroutines:
    - p9 W- F0 t; E; O
  833.         push    word ptr cs:[user_mask]# r* I* c, ^+ B
  834.         push    word ptr cs:[user_subroutine+2]5 B! `+ Z3 x; R; S0 D( q: a
  835.         push    word ptr cs:[user_subroutine]
    ) f/ P* i7 V: u& ?
  836.         mov     cs:[user_subroutine],dx
    1 Q8 E+ L. I+ Z" X! c' A/ ^
  837.         mov     cs:[user_subroutine+2],es  T" j8 }0 a/ t8 ^! _; V3 ^& e
  838.         mov     cs:[user_mask],cx4 V- ^+ ]+ u  H: n
  839.         pop     dx
    / o  w. x% _  q8 k  T/ @
  840.         pop     es
    % X) ^3 z5 V. G/ ?7 w; T" x% Y
  841.         pop     cx3 G. E- b9 c3 W$ O) Z
  842.         iret
    / p% @4 ~( I6 _. P

  843. & c) M" j( O( X' E3 i) Z, a! D
  844. memmouse        endp
    * Q8 i9 R' l" s, [$ \  T

  845. 8 k0 x; z6 _/ _" b
  846. endof_start:+ V6 u8 a% e+ N

  847. 5 }  y' W0 N5 n
  848. emsg db 'No mouse driver install error!$'
    ( o5 O! F. C( h& z/ M
  849. old331 dw 0
    2 q4 p! [. ?' P
  850. old332 dw 0
    ; g# e7 R& I  o4 R9 A4 T( n( c& O
  851. old741 dw 0
    + U/ V+ c5 T& X: f& Y1 |; I! {6 U
  852. old742 dw 06 d' m0 i) w' o8 z9 ]4 u- N2 r
  853. memcopy db 06 z3 F+ F3 ^; Z" T; }* h
  854. okcheck db 0. t" ?: B$ `/ I
  855. pass db 0
    , y7 }5 u5 e, q- m8 y
  856. chkl db 0: ~! m( |7 ^$ z1 K9 \$ M1 t  i. V
  857. lk db 06 c! E/ i1 C$ J* v8 H
  858. chkr db 0- M) S# o  A1 ?  `7 Z8 E
  859. rk db 0
    # X2 y  X$ Q+ ~8 P& [6 H8 }) L& i% a, d
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '1 ^- b) a; Z+ l% {; h! H& ]4 Y
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    8 y4 t7 A& M  Z! }, w
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ( t  L: K+ S4 ^# b
  863. db '                                                                                '
    & h4 z6 x4 x7 b3 T
  864. db '                                赏屯屯簧屯屯突                                  '
    1 @, ~) j0 h5 \1 c) C
  865.         db      '                                ?OFF汉OFF?                                 '4 v9 O3 q# q1 _+ W- p
  866. db      '                                韧屯屯既屯屯图                                  '1 ^' p5 w4 D( c/ g) }, H
  867. db '                                                                                '
      t) p, `8 i+ A) e7 o
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '. F5 Z0 `; B( e! p6 t+ C
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    7 u3 V$ o! ?; X) I# Q
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     ': G$ p7 `6 A- `/ U( f* P
  871. # Z! |( z& n+ y# i6 \
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!3 L* T, b4 g* O0 G: ~9 R
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... + A' ~7 u; k4 c! |% r6 r; K" F

$ o, [5 Y$ L  u) r; e' y6 C4 C谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:55 , Processed in 0.105850 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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