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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。, M2 c7 R1 \$ F/ x' G! S; m2 ^* w
9 c5 `/ c1 R7 `$ }6 _+ \
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    9 j: X$ l) {* K* O2 \: L2 W' _
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    3 E# V' R0 _! e/ Q2 K4 K
  3. ;                                         By Bini.Yi 易祝兵
    " u! X6 F- w6 k* m6 k2 a  t0 V) g
  4. ;                                         http://www.ufoit.com 计匠网
    . z# e1 c& h* A7 L
  5. ;                                         2002/04/06 YYYY/MM/DD' @3 S* s; u% N7 F+ S; l
  6. ;
    , m% K; V' o+ a; c2 S
  7. ;          " p( C9 L" w" G' [. I1 b
  8. ;          This program  test the mouse button  click and move.
    0 z0 L8 L; J, A
  9. ;, X( S! L& [( f0 ]5 ^5 i" s
  10. ( @& ]4 G' Q2 D9 `
  11. .model tiny
    . f) \$ H, a% G/ K& Z
  12. .586
    ' i" m  P9 O& c% J1 d+ s
  13. .code( L: ^& w) Z$ T
  14. .stack  100h7 Y7 Q& h, k  I9 s) l
  15. .startup
    ; E2 e5 k. B; c/ l  N2 ^. g
  16. pusha& _/ F8 I. Z' z! y8 |' q
  17. mov ax, 3533h
    & H- y, b! O4 N( L
  18. int 21h5 N. p5 z. N2 [  S! n7 L3 p4 F( F2 H
  19. mov word ptr cs:[old331],es. R- y; _$ F  {5 \( Q+ Q* M0 D  r
  20. mov word ptr cs:[old332],bx* g3 i7 c2 i, H+ k6 q
  21. mov ax, 3574h3 G4 d! {" c* Q2 a
  22. int 21h; @+ u4 v$ M: v% Q; J7 f0 U$ q9 M+ m
  23. mov word ptr cs:[old741],es
    2 q; Y( C% }! B
  24. mov word ptr cs:[old742],bx
    % X5 V2 s" ~: P( E
  25. popa
    5 @/ t2 ~1 S3 X. K7 h+ Z
  26.         call    memmouse1 b3 N, e& V/ W. }7 O
  27.         mov ah, 007 q. K. e, j5 E
  28. mov al, 03
    $ o1 B% F/ b1 K% Q8 x3 J" `
  29. int 10h- |5 `. C. L; _. J* p
  30. mov ah, 06
    2 x( P3 {) P* U$ ~6 ~3 B, L
  31. mov al, 0) s4 P) J, x# K
  32. mov cx, 0
    ) y& O' |- r' t
  33. mov dh, 24" g: Q! \0 O; z; S  h  H
  34. mov dl, 79
    : N- y! P) h5 V1 D9 U
  35. mov bh, 07h
    0 _& A  C) t8 h" g) n
  36. int 10h/ F8 e" [, ~3 f1 o
  37. mov ax, 0000
    , u( w2 g+ {8 @" \) [# z5 k
  38. mov bx, 0002
    2 Z+ H2 k+ g* h9 J" G5 i
  39. int 33h! W$ y+ r# b# b* U8 [
  40.         cmp     ax, 0000           ;if no mouse drive install* K2 `* l0 B( }: X5 ^% L
  41.         je      errormsg           ;show error MSG
      _( F7 P7 M6 D2 w" Q! R. e0 L# r
  42. mov ah, 02
    ) G, N9 r' V" F) ]8 u) q7 b
  43. mov bh, 00
    5 e7 C, P/ ]; I' _4 x
  44.         mov     dh, 25             ;Move point out screen/ [" [/ P- `" m! n, |
  45. mov dl, 79
    6 \8 ]( ?# l, y6 S$ L: w
  46. int 10h
    , q& m* w! w6 [
  47.         call    showmsg            ;Show info3 k) C9 Q% s& r0 j6 K1 B1 _
  48. mov ax, 0001% G. b# M) x/ g8 l! M: k- v) B# ?
  49. int 33h9 c) ^0 l  g8 Q! M! Z+ _
  50. ; mov ax, 000ah( Z+ t/ N, J0 z2 |0 ?
  51. ; mov bx, 00009 x9 @+ I+ W3 Q: Y8 r9 D+ K2 ]
  52. ; mov cl, 0h
    + X" e" @' Z0 o: U. ~  K2 b1 Y4 q9 t- u
  53. ; mov ch, 0F0h$ @! O3 k& `$ j! R6 D8 o
  54. ; mov dl, 0h- q9 L. j; v% g% y
  55. ; mov dh, 0F0h/ A1 s7 L2 w( h& M8 }# |
  56. ; int 33h
    - A2 ]" }0 ~6 K
  57. mov ax, 0004h! |* h* d# Z  N# d* d" i6 ?
  58. mov cx, 0319" o6 I+ @9 j8 O+ H" D! o  `! K8 b
  59. mov dx, 0103/ z% m5 F* \4 G8 J
  60. int 33h5 J  r. E; _/ x+ z( c
  61. casemo:                           ;Case button click and point move
    6 f" L# b$ ~5 ], ?+ Y9 i) S
  62.         mov     ax, 000bh         ;and keyboard press1 C3 g% x& q2 G; r# U$ k2 Q
  63. int 33h
    5 M8 q) l0 _2 {# \1 `- b2 H7 w: W( v
  64.         cmp     cx, 00h           ;if point move....X/ J0 I+ q/ b& s8 P( w$ e  Q5 z
  65. jne xmov
    ! `% J5 o$ v! ?* `
  66.         cmp     dx, 00h           ;if point move....Y
    3 l/ `/ T  K% d' B0 `
  67. jne ymov
    % r- W1 o# G& u8 ?8 K4 Q
  68. xymovend:                         ;X.Y move end- U0 d  R( T6 L
  69.         mov     ax, 0003          ! p/ C0 a0 d6 s$ c. M3 x% ~% w
  70. int 33h1 m( }: F) z3 p% q$ [+ X
  71.         cmp     bx, 0001          ;if left button click  show ON; a5 a7 Q/ U8 T! |
  72. mov si, 1828. ^; [& L: L7 F" [: {+ T
  73. je listl
    , n0 B0 g( |' \  v6 ~
  74. mov si, 1828& N. t- g2 k/ G. O1 P& W
  75.         jne     nlistl            ;if left no click show OFF9 Y* ]" X! e$ I$ c$ @0 R& f3 _
  76. testr:9 F: c4 I0 F/ n- l
  77.         cmp     bx, 0002          ;if right button click show ON
    : |; o7 o0 B% K1 p( b0 t  x
  78. mov si,1842
    * Q3 R2 t# v% T( q& {# |1 D7 d
  79. je listr
    ; [4 _6 W% `# e* ~
  80.         mov     si,1842           ;if right no click show OFF
    & y4 t7 R; n' ]  l' v8 D' f4 {% U
  81. jne nlistl
    - ?& _# j2 z6 K* |5 D& X8 k
  82. casekey:+ v" g+ t+ A2 P9 o5 Z9 S& {
  83.         mov     ah, 01            ;if any key press jump check' z+ `& s0 m9 E2 R' \
  84. int 16h/ r% q& a5 V2 M
  85. jne kpress
    * K, d! j3 r  L5 ^, W. c6 [
  86.         mov     al, [chkl]        ;check x flag2 `$ b8 g8 S- `& w
  87. cmp al, 02h$ n9 N  Q1 j* t: `
  88. jnb chkok# M2 A6 X' }5 F# Q; v! R9 s0 Q
  89. jmp casemo
      f+ H9 C; u8 K* j5 U% h1 o/ B
  90. xmov:                             ;if X moved, get the X flag+1. b& \3 W* X0 A, u$ x7 t# O
  91. mov al, [chkl]# h) _8 }9 I& u0 J$ _9 C7 G6 p6 C" Y: C
  92. inc al
    - G0 p& Y5 w4 N. R* |2 v1 {! x* ]
  93. mov [chkl], al; p1 l/ j0 B  L5 M9 G" @% y. H) Y0 ~
  94. call passok
    ) y8 H  W2 M. O
  95. jmp xymovend
    . A' T, U, h3 {0 A
  96. ymov:                             ;if Y moved, get the X flag+1
    9 X  g/ a& b: J, ~& T
  97. mov al, [chkr]; I" [) X" z  R. c
  98. inc al, e+ G) L# }) a4 k( e6 o  d
  99. mov [chkr], al
    ! I; N" |! I' T
  100. call passok
    " `; {5 S+ r# N# K$ I
  101. jmp xymovend
    * M& X7 R' [! C3 C

  102. : o5 P, C- r+ t. T: ?& Y9 V, P
  103. passok proc near9 T) A7 q% i) O2 B7 m
  104. mov al, [okcheck]8 F7 l* L4 W1 m5 u
  105. cmp al, 1
    4 a  j$ E1 |5 l' U
  106. je let0
      @! @, ~! m3 ?7 i
  107. jmp passret
    2 h( {& u# Y$ [! X
  108. let0:
    3 Q; h  Q! V5 p
  109. mov [pass], 1
    2 j2 D! K( q- q4 D) R" X
  110. passret:- J9 l+ K& U6 J: ^
  111. ret
    # U: X1 ]# J! n
  112. passok endp - N0 t- j" T  U  s! k4 `  f4 g2 m
  113. $ ~  `& |: W3 b6 U
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS- g/ F; F* A7 ^, k
  115. mov al, [chkr]7 q  a% c$ Y: i8 ]5 J7 @
  116. cmp al, 02h
    1 E# `+ y7 \$ [
  117. jb casemo8 v. u4 A3 v2 s( y- `& {& |. p
  118. mov al, [lk]
    2 B% {( N1 r7 N8 q
  119. cmp al, 1" e1 b6 D+ O. y5 ~8 l5 X9 G* ^! ?+ D( V
  120. jne casemo6 F8 g" _6 r8 m' M; x* D
  121. mov al, [rk]
    / ~) ^; z/ e, M7 n% U
  122. cmp al, 1) j# v, L- ?/ d/ B4 z/ m
  123. jne  casemo" v9 c" X0 e8 ~3 a
  124. mov [okcheck], 10 R9 k# D% ?0 z! x2 @/ g- ~
  125. mov al, [pass]. P# {4 q- y# h8 m
  126. cmp al, 11 s, J. {0 _6 R! O
  127. jne  casemo
    8 w7 |/ E  C" ^3 A' R& u
  128. mov ax,0002h
    ) u1 e  K; Q7 U/ l" x6 Z( n6 P. o+ e
  129. int 33h
    & Q! c9 A, Y$ U" }6 D) Q+ d# I* K
  130. call cleascr
    6 j, b: h! y9 }  d& s9 w5 I8 f7 S
  131. / y  n4 u$ d2 B! o6 t
  132. call oldint* b( }& p# ]3 R
  133. mov ax, 04c00h
    - m4 k4 `3 t; a" P, B8 o$ V
  134. int 21h
    : V0 X3 K: u. u; t, @3 `6 f; j/ {
  135. 1 ~0 t' O2 s6 Y: s
  136. okexit:
    7 V4 X& d. [+ B2 E# E& |' b
  137. mov ah, 4ch
    " m6 i; D- o8 C5 k" ?- a
  138. mov al, 0
    & ~" @) [5 [* a+ T9 M! e9 m5 P
  139. int 21h6 N! ~: e) U" a
  140. listl:                                 ;Show ON& S) F# N2 s1 p8 o" ^
  141. pusha
    9 O) o+ X8 P/ C
  142. mov ax, 0b800h
    9 l1 g2 k8 g# t. f8 a
  143. mov  es, ax
    ! X  X4 E8 M: J0 h5 K  a% s% |9 ^
  144. mov ah, 47h. o' f1 V. W6 [& ^
  145. mov al, 20h
    ' }( F% ~7 l# L* C
  146. mov es:[si], ax. S! `. X& K2 ?* U( u
  147. add si, 02+ s5 J/ P; v& M6 K% @
  148. mov  al, 4fh' ?- w5 ?7 y4 ~: m8 B* Y- q: p& [
  149. mov es:[si], ax
    0 `/ M/ M- {" S' d3 p8 x
  150. mov al, 4eh: ?6 K+ i- @8 l. R
  151. add si, 02
    % X8 W& o  I6 b1 _
  152. mov es:[si], ax
    + T/ B" U0 e; m: x7 G6 k
  153. mov [lk], 1
    , a) I" n3 {2 G' {& k2 W
  154. popa* i* i% l" b% e' X0 }
  155. jmp testr
    " A. X* r  D0 X, D& p1 f# U
  156. listr:                                 ;Show ON4 d% S! Y( @. l2 q: y4 W
  157. pusha
    $ E! x, z* A4 a* o
  158. mov ax, 0b800h) G( x: e  ^/ O3 ^* ?! y
  159. mov  es, ax
    ( o1 p* L7 p& T5 |
  160. mov ah, 47h4 ]5 [2 I) Y: A5 |1 }% u1 {
  161. mov al, 20h
    ! V7 V1 }: s# r$ ?
  162. mov es:[si], ax3 |5 p& Y% o$ m( \
  163. add si, 02
    8 K9 w# e, G" t, P+ ^6 y; O/ U2 r
  164. mov  al, 4fh# L$ {3 z; \/ }- f7 z! j
  165. mov es:[si], ax  t3 b6 M0 p, Q, C% n4 D$ f
  166. mov al, 4eh
    * N; a1 b( |5 U* a
  167. add si, 02
    0 }6 M6 J4 ~5 S* ^
  168. mov es:[si], ax( H! n. B( l+ H/ Y7 V" c! X
  169. mov [rk], 1# [+ t! w; H- Y0 V1 Y; P" p% a
  170. popa2 N1 p' s/ ^! G/ _0 u
  171. jmp  casekey( ?! t, q9 C" H3 g* x

  172. 5 G0 _. y+ l0 I% r! O! `! \: x
  173. nlistl:                              ;Show OFF$ q: _9 H! |/ A1 l- U  V
  174. pusha   . U0 |" b2 Q2 J) ^) G: [
  175. mov ax, 0b800h
    9 ]3 h  R/ S' s' H3 C$ ~) j
  176. mov  es, ax5 {. D2 [, `8 Q& e! H
  177. mov ah, 17h
    - i4 f) I) ], P# d8 V4 F/ @
  178. mov al, 4fh+ u: r( \1 f& f. p- Z
  179. mov es:[si], ax
    / n9 v1 _' s* C% p9 _
  180. add si, 02$ i( K- N5 k5 p& S0 ]% z0 l5 U" B$ t
  181. mov  al, 46h1 M( D& A+ ^  c/ w
  182. mov es:[si], ax* P0 ^6 X  ^; m/ C! E, m
  183. mov al, 46h
    + @* X8 i, y6 Y. }0 Z
  184. add si, 02
    ) f  A3 N+ T- p/ o1 p- s
  185. mov es:[si], ax- G: y) e' S6 [) d& l
  186. popa
    " ^( ^" T" z0 Q/ Z
  187. cmp si, 1840
    , T2 u! R8 l- e) ~/ x: m2 k
  188. jae casekey
    5 a8 v- M' r- m9 v2 P
  189. jmp testr2 S& }' c1 `" N3 G% h
  190. * P6 N' f% D8 J! M- _8 V; b
  191. kpress:                             ;Check key press if press<ESC> then EXIT- ~+ ~6 r0 B! s( y! \9 q7 O& }
  192.         cmp     ah, 01h             ;and return a error8 ^( U3 m/ k" G  C, Z/ \
  193. je exit1
    6 k5 ^+ B6 G- U  S4 M. X
  194.         mov     ah, 0ch             ;if press other key then clear+ B; q* W8 f. h
  195.         mov     al, 00              ;keyboard buffer
    6 y: s+ o. _3 h- `
  196. int 21h) E+ }* C" p# y' d- i
  197. jmp casemo
    & B! I2 h& o3 [: E" D: o5 n' q
  198. 3 o( O9 _9 l! `4 W  Y2 U
  199. errormsg:                           ;if mouse driver no install
    / [/ I/ N* n* I) m. W3 h
  200. call oldint
    ( L; b3 W7 A& e0 y5 C
  201. lea dx, offset emsg
    3 n0 n4 J) g' L0 u) V: h
  202. mov ah, 09h
    2 ^9 K. h6 K4 Z/ g
  203. int 21h
    ) K! z) a5 o  |- e" I
  204. mov ah, 4ch
    , c: \  ]3 [3 n& v3 O
  205. mov al, 2
    : T! W5 C+ G3 }/ k8 R0 L- c, `& J
  206. int  21h
    ; K( ~' r' z1 X. s" i

  207. # b" D+ E' y( w, @6 \7 D# w
  208. exit1:                              ;error exit6 |4 }7 I1 s! A& @5 B; n
  209. mov ax, 0002h
    ! ]4 v& {- p* T4 L8 m7 j5 I& _1 |
  210. int 33h
    , e, e6 Q% K% C# C% ^
  211. call  cleascr
    - ]5 R/ N  M0 m2 E) s: k$ u
  212. call  oldint
    ! C, g. @, n- l: i2 w
  213. mov ah, 4ch
    1 f% N6 \! K; N
  214. mov al, 01
    6 G9 d# w' H7 ?1 R1 N/ Z, y/ u! O
  215. int 21h& @) U6 T/ K0 W  |/ Y, ]
  216. 3 X6 C2 p/ n% F& a3 r5 L
  217. cleascr proc    near                ;clear screen
    " ~; @+ P! v- [5 X' R# e- ]5 F. y
  218. pusha
    $ N, r$ ~' u& p% n0 Q
  219. mov ah, 06; U: e: @  G  Q( b9 i3 k; \( F0 M
  220. mov al, 0) x& P# t! L& f5 c/ Z9 E
  221. mov cx, 02 N& h: U, e% U) i8 O4 o
  222. mov dh, 24; c" G8 g; S2 x! v2 E: k
  223. mov dl, 792 @2 P) Q/ y: s! H0 `7 V
  224. mov bh, 07h0 U/ [( y6 i) k
  225. int 10h
    1 I, M7 J6 U3 c" n6 h
  226. mov ah, 02
    ! h* W! W$ x. o0 |- j) Y
  227. mov bh, 007 W$ d! L2 b2 [- P3 b
  228. mov dh, 0& `4 I# O, v5 g$ G+ u% a* E
  229. mov dl, 0
    " v8 Z4 R! a# P6 p) }
  230. int 10h
    $ t  o# H& e+ O0 D! m
  231. popa
    + o2 I7 d) |$ v& ^* ^, u9 m
  232. ret' k  M9 }# G; j9 z8 F2 @
  233. cleascr endp
    % Y3 t$ P+ J$ B% |& [
  234. 8 C' G# I) C" x3 V2 H
  235. showmsg proc    near               ;Show info7 A: W. K" H+ R- Z
  236. pusha
    5 H$ Q! u1 g* q" k4 K% L7 p5 m9 ]& X  J
  237. lea di, offset showms
    $ m; ^6 H5 }2 c& j  R' n* l
  238. mov ax, 0b800h
    " a. E4 y. \3 h1 a8 n
  239. mov es, ax2 {/ @* ]0 |' G- ~7 b; G
  240. mov si, 0/ j$ ^6 ^* g2 p* Y9 v+ Y, M5 o
  241. mov cx, 480
    . y( Q2 b6 {8 V$ k& n6 w2 t: y3 g
  242. mov ah, 07h
    + K: F# [, g) I' r' F
  243. @@:
    6 L$ A! R9 v! A! y- P
  244. mov al, 20h7 z% N1 O0 Y0 y8 L( X" k
  245. mov es:[si], ax. L& ~% V5 A. w% t3 }
  246. add si, 2
    / j- W! g; _, g, [. ?3 q% z7 V
  247. loop @b3 s% W5 Z$ k* V- V7 ~
  248. mov cx,880  s3 D+ Y1 G5 L1 X+ L$ [5 c, _
  249. @@:) J$ E  G$ C3 v, X; I2 i; B/ A( H
  250. mov al, [di]
    ! Q+ Z4 A: u+ i2 U2 l  I: r
  251. inc di
    0 u5 e5 q. k! x( q4 F+ b( F1 l
  252. cmp al,20h
    0 v' A* B( b' S0 D) w
  253. je showch11 |* m# V5 z& v& g
  254. mov ah, 17h
    5 i9 x4 C6 T+ V! K0 I
  255. jmp showch3
    ! c1 Q: [5 ~) B3 n" i( b
  256. showch1:! Y7 ~0 y7 ?* N- D4 ]% c* \' E8 P
  257. mov ah, 07h ! P7 U; u6 d  g. a! _) a
  258. showch3:8 y' _$ @$ \$ T) ?* h* K. w( T% g
  259. mov es:[si], ax
    1 A0 p! c% z; h) X0 ~% g
  260. add si, 2
    ; \  x. _7 X; |: D3 a7 s
  261. loop @b1 `2 G) D1 f2 K. D. U6 r3 p) w
  262. popa
    2 ], p* S( ^" F  W( v
  263. ret4 S' h: ?# j/ Z8 J9 _6 i) x6 x8 [
  264. showmsg endp. i  r- O# s2 B3 \* D3 j% ?
  265. . g$ F" P* U5 _; J
  266. oldint proc& l9 C) h' M+ t8 M5 j% ^
  267. pusha; Y, B- t( p/ A& g. {. c1 p
  268. mov ds, word ptr cs:[old331]8 ~/ x6 l0 }: e1 K5 a
  269. mov   dx, word ptr cs:[old332]
    6 ?5 X3 k" A" E- i$ Z+ t2 u9 [% L
  270. mov ax, 2533h
    ) O% h$ F$ M; \9 x
  271. int 21h' Q" w- N6 Q* h6 y8 n( D9 Q/ Z8 V( r
  272. mov ds, word ptr cs:[old741]
    * l4 v4 X2 Z8 l* f, h: i
  273. mov dx, word ptr cs:[old742]
    # ]; c! J& a' F% h
  274. mov ax, 2574h+ Q3 H% A- x' {5 J* f% Q( `+ O7 q
  275. int 21h
    7 R2 P8 T4 S# l7 \1 E" Y! Z1 c# j
  276. popa
    3 i  H6 Y$ p1 q0 i) Q
  277. ret) X* I8 W4 {  T
  278. oldint endp! \2 ~, [- A$ N! n2 N& H. Z$ h& c" Q4 P
  279. ; G7 v2 o: Y2 \) M6 `5 s+ r4 U
  280. memmouse        proc$ |) h; q; Q# L. J1 H2 K
  281.         xor     ax,ax1 f/ `/ a- @( o5 z& w8 R- r; l" _
  282. int 33h
    6 \8 ]7 L. t6 p5 T2 u" V
  283. cmp ax,0ffffh& a3 S: @+ {: d# q2 G
  284.         jne     not_loaded
    5 x- n% ^( E% U+ d2 m# G
  285. mov [memcopy], 1
    3 N4 V$ v2 n- A: `$ a: D3 }1 Q& J% N
  286. ret% z* W9 k. \8 S6 ]
  287. 8 o2 d+ e% o4 L& c
  288. not_loaded:9 A) y( Y  O" b# E1 Q+ u7 t. |
  289. + O9 k1 q1 l+ Q' ]
  290.         mov ax,2574h' _/ Q" K& r" f$ P/ J' ^/ S
  291.         mov dx,offset new_isr
    7 Y0 P+ T% o( {' q
  292.         int 21h
    4 N3 |7 a9 a; N. d1 I
  293. 2 U+ p/ T' I3 [' X* q
  294.         mov ax,2533h
    , w$ U4 b, u  r! n& D7 K1 Z
  295.         mov dx,offset new_33
    . F3 H7 s" D3 B
  296.         int 21h
    8 L! W, I* J5 x$ {6 L4 x

  297. . f) ]6 L  \  ~8 j. u
  298.         cli
      _  w5 O) O) V9 b
  299. # S. r' l/ m. t9 U( N# I$ n/ T
  300.         mov bl,0a8h
    4 V7 ~, m. S: t" ?# c  s, x
  301.         call keyboard_cmd/ O5 @  ]3 c+ [# B
  302. + q. c: g$ P% p1 [3 l
  303.         mov bl,20h
    ! |3 V9 C1 l% [# |6 d
  304.         call    keyboard_cmd6 V1 J5 O3 I6 J/ t8 ]9 i, E
  305.         call    keyboard_read( Q3 p; q) {. z- u  m* g5 H! Y
  306.         or      al,2
    . h! m, ~1 _& q  v. ]$ L" V7 P% h
  307.         mov     bl,60h
    8 Y* T( l8 E- `! {" P; s
  308.         push    ax
    6 T$ W$ C$ r2 b/ F, T0 q5 w. ~/ Y
  309.         call    keyboard_cmd! \1 C) F! r# k- \2 k
  310.         pop     ax
    - `2 g5 Q  h$ z6 G- S
  311.         call    keyboard_write
    7 G2 _1 v4 K* q
  312. ) |9 X1 r' V% m5 v
  313.         mov     bl,0d4h' [% U9 ^9 F4 j+ h) P1 B: q
  314.         call    keyboard_cmd7 r: }/ b8 ^! `( Y. l
  315.         mov     al,0f4h1 J1 U" f- J. W  `0 u
  316.         call    keyboard_write
    ! |; Q" k  h0 z5 y

  317. 5 p$ D3 J! Y3 l# X+ \. f
  318.         sti
    $ N$ d4 X6 m, k2 _' M8 T( _
  319.         ret
    / a# t& v" P' t5 ]/ C4 J
  320. call_user_isr:
    4 Z0 H( ]* M" n1 `
  321. db      60h6 L# X0 H# Z! F8 v/ G
  322.         mov     cx,cs:[pos_x]
      x3 p, ~/ D1 m: r2 j
  323.         mov     dx,cs:[pos_y]
    4 m3 A0 r2 O% r2 w
  324.         mov     di,0 ;cs:[x_move]
    8 \; C3 {) V/ O8 e# Q
  325.         mov     si,0 ;cs:[y_move]
    " _; u0 s/ T' H3 m! F
  326.         mov     word ptr cs:[x_move],0) T/ Q0 N. f- d# E
  327.         mov     word ptr cs:[y_move],0
    & A1 f: N% E! r' a  I8 N
  328.         mov     bl,byte ptr cs:[buttons]
    + N- I& s1 I2 @0 h' I
  329.         xor     bh,bh
    6 e9 t6 g& y! R1 Y* U
  330.         call    dword ptr cs:[user_subroutine]. v4 A3 z: k& [4 o
  331.         db      61h* h) d( }  U6 H$ d* W# T
  332. ret! N: j. U8 Z" _. F
  333. new_isr:
    $ j2 a( S* Y) D$ _( I" Z' f
  334.         pushf( [" p" k9 H2 b5 f
  335.         cli, X2 _6 b4 ^; j1 P. D% ?
  336.         push    ax4 O, w- h* y2 P1 R$ Y
  337.         push    bx
    $ [1 ~, C" ^& I; l, ^
  338.         push    cx) I/ V9 n+ I( ^8 x
  339.         push    dx1 \) ^# W: V3 L% I) I
  340.         push    di
    ( p4 H$ e4 K& D
  341.         push    si; e) r8 H9 }' F7 E
  342.         push    es
    ) f7 B' y* ^0 }1 f6 @! Q
  343.         push    ds* p, C1 H/ O8 X. t- R; b" R

  344. . g* @' ?3 l4 R" K  k8 j+ ]# G
  345.         push    cs
    % T7 h0 C* L# }5 [2 G- _3 l5 S
  346.         pop     ds
    , m! M2 w5 A, @; j2 ^, b

  347. * H; @/ a7 I0 _
  348.         mov     bl,0adh0 e/ Q9 D1 V, R; M; w8 N! y* O( t
  349.         call    keyboard_cmd1 k) Z7 ^9 E. d
  350. 5 L. G! Y6 f( g$ Z( R: B- p
  351.         cmp     byte ptr [first_time],0
    2 {; w$ S/ u2 @0 J/ h* L7 ^. k
  352.         je      not_first_time
    , _, e; \! t6 M/ ~4 F! M
  353. 5 `2 m' ^; g5 ^  |) f$ q7 _
  354.         mov     byte ptr [first_time],0
    - U' @' S: P1 M% Y. N* |4 ]
  355.         call    keyboard_read
    - b3 G  ~# `! t; b5 ~' E% y/ l3 C, G
  356.         call    keyboard_read
    1 m% ?$ r& T! ~$ p  [& y0 x
  357.         call    keyboard_read
    # {" G' d( T: K  ]' C  w: C0 z
  358.         jmp     no_show$ Z3 }, j: `5 t0 K) c
  359. 1 |( v1 I& c/ K% |' t6 G% v; E! \
  360. not_first_time:8 |0 e% a* R& ]+ _2 N
  361.         mov     word ptr [temp_mask],0& ~& r) _" }' W& V1 E9 r/ [7 S- ?
  362. 2 `8 p, C" M" e& v4 S3 l
  363.         mov     cx,[pos_x], V. X0 K0 l& |! c* T
  364.         mov     dx,[pos_y]/ V9 E; p+ U5 f* D
  365. : c# ]8 y4 }1 i5 u
  366.         call    keyboard_read
    ) D5 P- W8 _" O% k7 Z, t2 q* O7 \
  367.         and     al,7 ;3
    8 Y% Z( A6 b/ B3 ]/ e; R
  368.         mov     ah,[buttons]
    ! r. B! X" c$ B8 H: m$ O: r
  369.         mov     [buttons],al. C& \# ?& C, q' ^- x
  370.         cmp     al,ah
    9 Z2 G; K. l, r
  371.         je      no_button_change" u' m+ j# f$ O& E
  372.         and     al,3
    . H8 p% C* X- B9 T. ]3 y- _
  373.         and     ah,3, Y# {) o1 [% N0 `
  374.         xor     al,ah
    " `3 v+ I) i' {- D
  375.         xor     bx,bx4 Z/ o: x2 u3 l/ ]

  376. ; E* h) `8 t( Y7 K. T4 ]. ~
  377.         push    ax" Q: V" N/ y! \$ D
  378.         test    al,2
    # A; V, k$ B6 `8 _3 x' Q
  379.         jz      no_right_button_change8 t* D+ m3 \, @! g
  380.         and     ah,2& w/ b3 h! O) a8 K
  381.         jz      right_button_pressed6 {$ y* `& u. y+ \. z$ Q0 u
  382.         or      bx,16
    & ^+ a# Q/ q8 d( f2 D+ _1 P# t0 \* p
  383.         jmp     no_right_button_change1 a" U  E( S3 P4 N
  384. right_button_pressed:
    9 U7 L6 G. V# s
  385.         or      bx,8  Y- X, _; j1 ^! ~4 C3 l1 s
  386. no_right_button_change:  P$ H1 P6 b' h! T4 k) V
  387. 7 p' s  F# n" b2 x; ]
  388.         pop     ax
    & D$ w$ M* {% \- _, p9 o

  389. 5 Q$ x5 ^4 M6 k5 h3 a
  390.         test    al,15 k( @" f' @' w' ^/ m; Z9 t, ^  }6 P
  391.         jz      no_left_button_change
    $ \8 |" {1 k" y5 V4 Y
  392.         and     ah,1* Z* K8 L0 v& I
  393.         jz      left_button_pressed
    4 V8 w* l8 G, e% U! X
  394.         or      bx,4
    : ?, v, a/ n/ D! [9 h
  395.         jmp     no_left_button_change1 t1 T" {. {5 C- V' P
  396. left_button_pressed:& o& ]% U- z" H
  397.         or      bx,2
    3 J% Q/ X( i$ O1 l* A
  398. no_left_button_change:
    - f7 [3 L6 D8 N. k- e

  399. + v( W8 L& _) d
  400.         mov     [temp_mask],bx
    $ ~) n8 X2 E5 {4 b
  401. 2 T0 }0 J2 x/ Y$ N, @
  402. no_button_change:
    9 q! h. `8 `. }5 o7 V6 N
  403.         call    keyboard_read
    ! z" [3 f1 P( [
  404.         cbw& _, x8 b7 l+ I0 t/ w
  405.         add     [pos_x],ax4 S/ V& v, @, d5 C6 e7 T) y8 F
  406.         add     [x_move],ax
    1 l7 [$ ]$ v2 D( ?2 p/ d* P! j
  407.         mov     ax,[x_min]
    : S; \0 M5 z( L! V
  408.         cmp     [pos_x],ax
    ! |) K, _: S2 L
  409.         jg      good_hor1
    4 x% k7 T/ r4 `# |# r; T4 a$ D
  410.         mov     [pos_x],ax
    9 |8 A9 M! M$ e* A6 {
  411. good_hor1:6 h0 @: _% P" B+ ^; {' [
  412.         mov     ax,[x_max]
    7 v2 _8 }+ i$ M  i
  413.         cmp     [pos_x],ax
    - c6 E% M. z- J- C( G4 K9 v  J
  414.         jle     good_hor2
    - P- _) z( {7 c+ I- r  s
  415.         mov     [pos_x],ax$ U" H4 }$ s' Z$ s! s# a
  416. good_hor2:3 ^  w; x( }  H! Q' k9 K

  417. ! \! J3 ~9 o0 ~& ^
  418.         call    keyboard_read* `/ q  X& C, L  b- Z& [  \
  419.         neg     al
      l4 j6 ^# Q4 s9 L$ ]& m
  420.         cbw, u6 O! s$ y# P8 w* V
  421.         add     [pos_y],ax+ z$ L' t5 ^: _, Y
  422.         add     [y_move],ax" l9 p+ w2 G7 {
  423.         mov     ax,[y_min]6 @9 U3 }( m  C$ t3 |% Z
  424.         cmp     [pos_y],ax
    ( p' V6 A% H( F
  425.         jg      good_ver1( S% v6 M: m" ]8 c
  426.         mov     [pos_y],ax# _2 O! z3 u. G. U: N
  427. good_ver1:2 o: H4 _! h( M
  428.         mov     ax,[y_max]
      r% ^' m- v" _9 A  @2 H, n6 [" f
  429.         cmp     [pos_y],ax8 e4 v  {& g9 N
  430.         jle     good_ver2( Q+ ]9 m1 G. `+ R7 T- O" X  e
  431.         mov     [pos_y],ax
    3 N, Y. b" h+ C) G5 h
  432. good_ver2:
    , N2 h2 I- H' {! x% r& P$ ~6 y. _
  433. ; r& N0 Y! ^. c8 t, S
  434.         mov     ax,[x_move]% I! j! ?# ~9 L7 B3 f0 @+ U& Y
  435.         or      ax,[y_move]: D8 t# ~( U  M# S& L
  436.         or      ax,ax
    ) p6 y7 N$ J4 K' a1 c
  437.         jz      no_change_position
    ! U; \! m9 I* v, a  A# n! l
  438.         or      word ptr [temp_mask],13 c# V1 K0 \. S
  439. no_change_position:9 c) V# A& n: h& W# D, {# h/ H3 i

  440. . g; g# G% t% }( Y) |9 V+ ~
  441.         mov     ax,[temp_mask]) r, q+ Y' U( G6 q/ w
  442.         and     ax,[user_mask], L- O0 `1 Y- `7 t
  443.         jz      no_call_user( T# z: i8 X  i' b  y
  444.         call    call_user_isr# P) _) Y+ i$ t& l9 ^2 G. f
  445. no_call_user:
    1 s" b, l: U$ ]# c& j; ^

  446. ) d5 S" w# u8 ~5 \" Q
  447.         cmp     byte ptr [sm_flag],1" k  B* s$ ~" ], D' J
  448.         jne     no_show
    0 Z! H' i/ t: }/ q5 P# l5 N

  449. 4 E8 _, `* E7 s
  450.         shr     cx,3" G' a% }" M. y  V0 H: _7 z
  451.         shr     dx,38 i3 Z+ z$ B4 R# Q( g
  452.         mov     ax,803 ]+ l& Y2 C; q- ?- l4 V
  453.         mul     dl' ?# U$ [' W6 i  ]  q7 z$ X
  454.         add     ax,cx) D, r) z( z' b- F# y
  455.         shl     ax,1
      S3 e* T/ A$ V* Y* \% e, I
  456.         mov     di,ax1 b5 m2 F4 X. P
  457.         mov     ax,0b800h
    ) y8 n* B! L. t: f' j) q) ]
  458.         mov     es,ax
    ( N2 ]+ k" [5 _8 g: s" a7 G+ e
  459.         mov     ax,[save_char]  X1 Z+ O& ?: z- T( c. N# r" m2 S! i+ s& ~
  460.         stosw" }/ K( }2 S0 x. X
  461. 2 C5 H. f- t; _2 m: H' h
  462.         mov     cx,[pos_x]  O- |- Q5 `) z2 M
  463.         mov     dx,[pos_y]
    ) M4 c! A" b; F& X2 U. j+ n; q
  464.         shr     cx,3' T2 @9 W- U# _# T+ e$ w) F8 z" H
  465.         shr     dx,3
    . b; ^5 `3 a9 _$ e
  466.         mov     ax,804 k# s1 u* V! Q$ X) S) F
  467.         mul     dl( d2 P$ b* Y5 G7 G/ K7 }1 A
  468.         add     ax,cx' W+ j5 P3 i% M4 g$ I7 H  g2 _
  469.         shl     ax,1
    + c& G& o& N: Z, e" X$ Z" `. E. S
  470.         mov     di,ax1 B3 U# A' c4 Q/ t% `7 Q
  471.         mov     ax,0b800h
    8 ]( _. L3 C: w& H- `) _/ ~
  472.         mov     es,ax7 \* e3 U7 Z8 h. r$ B* D  }
  473.         mov     ax,es:[di]
    3 |% H3 b* k7 R) w  S$ c0 X
  474.         mov     [save_char],ax
    0 u3 \2 K( r4 G
  475.         not     ah
    / u, u6 e8 m, N! N
  476.         and     ah,7fh
    0 n4 I$ A/ i" e, l7 I* W
  477.         stosw+ K+ w$ @5 }) M$ `3 O) J
  478. no_show:4 B0 }6 B' m6 x5 J: \( K
  479.         mov     bl,0aeh4 [  u. q* H! `0 {* J% w2 ?* t( c
  480.         call    keyboard_cmd
    $ U: M* J+ {# {% R

  481. : Q4 Y+ A, C5 E; b0 K3 X7 I
  482.         mov     al,20h+ c4 w' y& `6 l
  483.         out     0a0h,al5 {3 z; D. L& l1 b
  484.         out     20h,al4 C9 N$ ]7 J1 e0 t& |6 G8 B

  485. 5 ?9 W, k0 W/ P
  486.         pop     ds
    ) \* q9 ~$ G" s# r; L; _
  487.         pop     es
    / }) `. L+ {7 u+ j" x3 B% M4 B* e, e
  488.         pop     si% y: Y7 C* K4 F3 _  D+ O+ H3 V5 x' f
  489.         pop     di
    9 v5 f8 ?5 X% M8 I! s
  490.         pop     dx
      O  K' Z1 N% h; N
  491.         pop     cx2 f* b& H$ }9 i
  492.         pop     bx7 n( J! v& }7 ^* N+ e5 J% s4 O/ h1 h
  493.         pop     ax. j/ q  M# I3 N
  494.         popf
    & B6 r4 ]! @2 C5 `9 z
  495.         iret
    9 Q, Q) b- ]" A: O: i
  496.   A: X" D' T: Q/ n4 u8 o
  497. first_time      db      1
    ; b$ |* _# A: d! r
  498. buttons         db      0. {8 S  Z5 @2 z  [
  499. pos_x           dw      0
    ; d: N0 ~, C# Y$ _) F1 o, Z: Q: C
  500. pos_y           dw      0
    ( Z% ~/ L  _0 C. V! L
  501. sm_flag         dw      02 F) a% _# }$ Y3 u; ~7 k4 j7 a
  502. save_char       dw      09 p  g3 D0 [+ p7 ?' p
  503. x_move          dw      0
    0 Z3 p; V7 `+ s' w- F+ z/ z: x& @
  504. y_move          dw      0
    8 p+ N# _* \" F; r+ C
  505. x_max           dw      639% M( \$ n' R$ h# L
  506. x_min           dw      0
    1 p5 `9 z/ k% U" Q4 `6 o( u9 a# O1 P
  507. y_max           dw      199& X) a1 {+ v" ?: }5 \- U8 P
  508. y_min           dw      0
    7 L9 A  N  i; K5 m! x& v- ?
  509. user_subroutine dw      0,0
    $ y$ V9 U0 Q; v9 W) N
  510. user_mask       dw      0
      e# i' u8 E/ b% ~6 p
  511. temp_mask       dw      0& j& K% O* c! |  U; u8 i% E4 m# @0 |

  512. # o  N: m. G+ U7 l; |
  513. keyboard_read:
    , u0 P3 c3 F' ?9 g
  514.         push    cx
    2 c& m0 ^1 m7 U4 P+ `
  515.         push    dx
    0 S# M+ \" ~' H. T
  516.         xor     cx,cx( q  L/ Y- H; ?- K( N
  517. key_read_loop:
    * D4 d' y7 [+ F6 {
  518.         in      al,64h) {, Q' B! m0 g
  519.         jmp     $+2
    8 J5 ?0 V0 k3 y: i5 o
  520.         jmp     $+2
    $ A: ^1 B! I$ c7 q# J/ {
  521.         test    al,1
    3 k! Q' N) Y# {* h/ X) Z/ R: o
  522.         jnz     key_read_ready  m5 o& v3 |& b+ p
  523.         loop    key_read_loop
    $ T  A- J) \1 e. c( O
  524.         mov     ah,10 N1 X' C9 d1 w1 x
  525.         jmp     key_read_exit/ O5 m- Y) m5 l2 v/ H! ?- I- z
  526. key_read_ready:  n6 s1 h, ?3 x: n! X
  527.         push    cx
    % h6 T4 d- B8 f: E
  528.         mov     cx,32
    ) J1 }) ]6 @! p1 ^3 \  y- x2 g' A% I
  529. key_read_delay:
    & a( J, K/ ]1 @7 {% s. {
  530.         jmp     $+2! j, t; W) ?. X! u' e
  531.         jmp     $+22 }7 d$ |5 ^" A1 r- M: O
  532.         loop    key_read_delay
    ; w; O4 [' {5 P; _/ x

  533. 6 W7 M; B" e1 [0 K1 |8 g
  534.         pop     cx
    6 c# v+ ^% `7 e2 m+ w1 N6 m7 W
  535. ! [! j  v$ G; N5 ]1 K, D+ ?
  536.         in      al,60h
    + [; g4 x, J2 [: V3 }
  537.         jmp     $+2
    " ]' t* Q- o7 t+ R, w4 t6 a
  538.         jmp     $+20 l; A9 G0 d' W, ?  d  B7 t- ]
  539.         xor     ah,ah. F9 t! p& O6 O  a, w$ w
  540. key_read_exit:
    % U7 }; Q4 H5 s9 I
  541.         pop     dx
    ' U; @/ z; T$ t3 X2 F9 }
  542.         pop     cx
    6 ?2 P: ?2 J6 Z. ^; q: O: b: \3 G
  543.         ret
    , y: s( y1 k4 O6 @8 c
  544. 6 q9 X! B$ |, }+ m1 c$ A9 D5 e
  545. keyboard_write:
    8 Y2 Q# d0 p1 [5 d6 h+ U! r+ p
  546.         push    cx  T- O' M$ d9 \% t* u4 E
  547.         push    dx
    7 @9 Y" o1 i! t7 w: D8 I
  548.         mov     dl,al: q( G. Z3 i( \. q) }3 h
  549.         xor     cx,cx5 F5 J, C% K; l$ }1 G
  550. kbd_wrt_loop1:4 @7 Y# k) l+ ?% n: H9 }
  551.         in      al,64h  s6 S3 O% B- e0 i, U1 P2 g
  552.         jmp     $+2% B) x$ k8 u. r5 ]" W! d. P% a# e
  553.         jmp     $+2
    - |1 V+ \/ J5 T& `1 J/ m) _
  554.         test    al,20h
    / X7 |/ H1 ^/ B6 N* [1 C
  555.         jz      kbd_wrt_ok1
    ) x4 K7 D% @0 ]7 A. [: D+ {% t

  556. " n9 {& g9 i. x8 s. n6 i8 F
  557.         loop    kbd_wrt_loop13 h9 w3 B: E( e: i( G0 |

  558. $ O( ?/ C2 ?! u3 [) n) v+ ~% F. Q
  559.         mov     ah,1
    0 W4 W! N" X2 ~% s' _4 l, b
  560.         jmp     kbd_wrt_exit
    ! f2 N! m# R$ ~: U
  561. : ?, i( f& f& x  I$ k: e
  562. kbd_wrt_ok1:5 |8 p& M, q; t9 {) f) {2 F: q
  563.         in      al,60h, Z. a  {; S' r$ ]

  564. ( B4 k3 t- d7 ^
  565.         xor     cx,cx, r! y; A* g4 x7 E- g
  566. kbd_wrt_loop:
    & W1 w* Z0 \# }9 t5 l- R6 t
  567.         in      al,64h
    1 n. l: h2 C+ h) |
  568.         jmp     $+2
    & i' n" X7 u" o/ A' g
  569.         jmp     $+2
    0 f, ~( D0 f3 M) H) u( E
  570.         test    al,2& A/ m1 l" M, ?9 Y5 G
  571.         jz      kbd_wrt_ok+ s' f0 n$ y+ Y0 o, E, a" y; ]

  572. 9 }" B3 ]0 F5 I/ F8 t6 X
  573.         loop    kbd_wrt_loop; _9 x9 c# c( e' N2 J, l1 A
  574. * D/ K) E- Y/ m5 K) E1 \
  575.         mov     ah,1
    " P; N+ j! x5 _! z8 e" z" |: |
  576.         jmp     kbd_wrt_exit0 f3 b% T# @$ c0 x$ k

  577. : v0 X9 C, L" Z8 X- P8 ~* x7 Y. y
  578. kbd_wrt_ok:
    ' K5 n, f% U6 S- w0 ?8 l
  579.         mov     al,dl
    0 z( }9 i- R. u- i" k, U- X
  580.         out     60h,al
    $ o( T6 j: Q" g
  581.         jmp     $+2: G4 F. x0 d1 f. V! C+ c
  582.         jmp     $+26 {4 M; G3 Z% [/ b3 Y

  583. & C7 e- \; j* @* ^# O/ H
  584.         xor     cx,cx6 i0 I* `5 L  T" _6 F
  585. kbd_wrt_loop3:
    5 Y. a9 B( P! D; f# S
  586.         in      al,64h9 U$ e5 K& a; u( n1 _9 v/ V
  587.         jmp     $+2
    . N' T( @& O' F- m$ f, L
  588.         jmp     $+20 @. I4 Y9 m- R2 \: }( t$ ~
  589.         test    al,2( j: _8 N# t/ m6 F% ?/ ^
  590.         jz      kbd_wrt_ok3/ s- R9 e9 x2 a! {0 \
  591. 2 h7 Z1 Z5 U0 i2 J  z
  592.         loop    kbd_wrt_loop3
    ' l1 K( ]7 U% l( y( @

  593. + \! F/ C- a! G
  594.         mov     ah,18 Z. V: \* E5 B, n
  595.         jmp     kbd_wrt_exit' \2 l3 o' E, ~7 t0 j1 `8 N

  596. & `: E& P) ?. B- M$ B7 Z. A
  597. kbd_wrt_ok3:9 z" B- }; I( c! O  v- q
  598.         mov     ah,8
    ' V2 I4 }1 c( @2 @" N2 D& o
  599. kbd_wrt_loop4:
    ; [6 h3 d6 r7 E/ h" O
  600.         xor     cx,cx. r1 H9 d2 I& u: v* d$ n# T7 z
  601. kbd_wrt_loop5:
    5 K9 J4 o$ c5 d' G" V$ Q
  602.         in      al,64h
    8 [/ C0 W6 Z# S7 {5 X- n3 f
  603.         jmp     $+2# X5 W' ]% m- p
  604.         jmp     $+26 y! g$ Q% b7 N' j4 D  ^
  605.         test    al,1; e: L% a  i! l& f
  606.         jnz     kbd_wrt_ok40 ?/ l( c0 B3 K  x& A1 y% a  a
  607. 2 [- |0 f) A. x5 x, v& Z" _
  608.         loop    kbd_wrt_loop5
    $ G, q& Q) S" [+ i8 e

  609. 0 j1 h! T; C: N+ ?6 u
  610.         dec     ah
    - ~% }' O! h% @; E" M
  611.         jnz     kbd_wrt_loop4
    % L5 _' S0 Z+ E
  612. 0 W2 c0 I" L+ e+ H  }7 z+ }
  613. kbd_wrt_ok4:
    4 |/ d2 ~- E/ A/ h7 O% M- z6 R6 C
  614.         xor     ah,ah1 K" I; J* S- }! R; K
  615. kbd_wrt_exit:
    ) H5 [( V5 ]/ B3 O4 T: l
  616.         pop     dx  w9 A  z5 ?: r2 J# f3 `+ Q# U0 ?
  617.         pop     cx- L, e- l$ C: W$ K$ {9 V
  618.         ret
    9 O7 D; _- g3 \. y  b
  619.         : m  z% w5 L8 T  ]% O! ~; d
  620. keyboard_cmd:+ \7 a/ Y* a: I% l! j) j
  621.         xor     cx,cx- B) Z- E! W( H8 s+ b
  622. cmd_wait:
    2 M  c/ P9 d$ l. }  J* v0 k
  623.         in      al,64h+ Y, C. h$ n9 V9 s( o' c" q
  624.         jmp     $+2% @% O+ A/ N8 L3 Y' c
  625.         jmp     $+26 v" r# }$ j( t: |" R& d3 v
  626.         test    al,2
    # ]& S7 \8 w( w" p
  627.         jz      cmd_send
    9 D9 }% o3 C0 X2 }6 g2 F
  628.         loop    cmd_wait7 P3 K9 M1 E3 I
  629. 8 C4 ?+ z7 u, j: v. {" e* I: R
  630.         jmp     cmd_error; e' m$ _0 a/ |! l+ q

  631. ' i& t! p$ l: ^  B$ n1 o
  632. cmd_send:
    ; @+ o7 V5 S. K! A/ m
  633.         mov     al,bl( a8 I6 a: Y6 o& U
  634.         out     64h,al
    # [; u8 ?+ O: D
  635.         jmp     $+2
    ' K+ R2 e5 ?6 B
  636.         jmp     $+2; i8 j7 T, X; S8 L0 H$ L

  637. * {: E. A' J. P7 h3 W# L$ r3 t
  638.         xor     cx,cx
    - B! v* ^) H0 u( |) V. W
  639. cmd_accept:9 G4 V# r' H1 H
  640.         in      al,64h
    ) g/ N( g  {  F5 _- _
  641.         jmp     $+2
    / b( D2 W# o# [
  642.         jmp     $+2
    ! q+ j  [6 Y" m8 |& ~; T
  643.         test    al,2
    8 A- V' ?* |  E! m* ]: f- F
  644.         jz      cmd_ok; I1 N! D5 X7 B/ Q& U
  645.         loop    cmd_accept' D1 }% @+ y8 v+ @+ a9 M
  646. * w" A7 F$ @' M9 v* i8 B" a5 f6 e
  647. cmd_error:
    * p! }+ t- P4 Y9 g0 G
  648.         mov     ah,1) g, t* ^( R! n1 W9 r/ T# b9 B$ K
  649.         jmp     cmd_exit
    $ P7 t3 Q% o9 D  D  `! A5 F
  650. cmd_ok:
    7 ], @9 f! U* L4 q: @
  651.         xor     ah,ah
    $ X# ~& |. o2 a" a
  652. cmd_exit:
    / X6 }3 ?8 C) T( e7 o
  653.         ret5 j- Q6 H: e* }& Q$ f6 V
  654. , m! a. V/ V9 B7 j! O  U
  655. new_33:% p; W7 T+ Y7 f2 Z* m
  656.         cli# m: p# _! C( V! |$ }+ }5 U
  657.         cmp     al,0
    / i0 r4 b3 d) F7 k3 g. z5 F
  658.         je      reset_mouse
    ' B. I9 Y! C2 t% O
  659.         cmp     al,1
    , R! Z- M! v' I& A' j
  660.         je      show_mouse
    # e. T# c" K' j" m
  661.         cmp     al,2
    4 c" Q9 w% ]9 V  Y3 [
  662.         je      hide_mouse
    1 @9 a3 @9 C/ w3 P* f
  663.         cmp     al,33 e0 J) o" h$ m1 |; L
  664.         je      get_pos
    $ k# A8 v0 @% z) Z
  665.         cmp     al,4
    6 M( b' H& U) F9 ?
  666.         je      set_pos+ \$ V, N* p0 B' ~4 g* W: v
  667.         cmp     al,7
    % x7 o" R! e# t2 e- c
  668.         je      set_hor_pos
    ( |( U, F. o1 n
  669.         cmp     al,8/ O; ^) `5 v! o) Q
  670.         je      set_ver_pos
    ! ]1 y9 }$ N8 ?7 p" w* H0 d7 L
  671.         cmp     al,0bh
    5 @0 k( _4 G1 e% f% S6 c7 ^! Z
  672.         je      get_mouse_movement
    4 i& l+ R7 [1 I' }: A% u7 G
  673.         cmp     al,0ch! ?+ Q) u* v$ M4 A! a1 q( ^
  674.         je      set_subroutines
    0 A- R) u  g( ]2 I9 {- i, G! s8 P
  675.         cmp     al,14h
    " q! O! I, m) c' I+ n# E3 \
  676.         je      swap_subroutines' ]1 `% r' B' O% _
  677.         iret
    " q6 F- m  `; I, y9 p6 K: c5 ^9 B6 g" N
  678. ! A3 t6 O0 z$ Y) d* J& \
  679. reset_mouse:9 G9 a" b1 A+ \; b4 f& v. L  G
  680.         jmp     _reset_mouse; l! h& U2 Y/ m
  681. show_mouse:
    6 L& Z7 b- j# r& v& T& ]
  682.         jmp     _show_mouse
    ! d$ |5 w6 M& g+ b, E- L; o$ U
  683. hide_mouse:
    , R$ R9 i  T' X! _: q' a7 B
  684.         jmp     _hide_mouse2 i/ Y) ~7 X& r
  685. get_pos:
    " B- y! ], b  L0 R$ ~% G" y
  686.         jmp     _get_pos8 }* ^7 X0 `4 F$ L7 J) }
  687. set_pos:
    5 }. }9 a2 a, E, l; N6 l
  688.         jmp     _set_pos6 Z, h( i' }; V; s4 j" z1 |5 T" E
  689. set_hor_pos:6 L  v2 R% ]3 ]( p6 D
  690.         jmp     _set_hor_pos! P, _7 S- N9 ]  `" N
  691. set_ver_pos:2 J" d4 ?$ i3 b4 @7 }  r# H3 c
  692.         jmp     _set_ver_pos8 v  C. o6 _( \
  693. get_mouse_movement:
    8 {# U1 p$ }! x. n
  694.         jmp     _get_mouse_movement
    4 [( n5 x6 l1 Z2 h
  695. set_subroutines:; Y  S: Z$ E. I4 b) Z& C
  696.         jmp     _set_subroutines+ ^% _: V; G# f1 b* y: E) L
  697. swap_subroutines:7 i! `( I4 t: f& ]* r1 L
  698.         jmp     _swap_subroutines+ ?% o" q* c7 ^: c
  699. $ F6 W8 p1 v0 ^9 D' D
  700. _reset_mouse:
    & T! F7 q' w3 `7 t" W" ]
  701.         mov     byte ptr cs:[buttons],0: V' a( K# w+ d4 ?+ A- ?- n0 Y( [
  702.         mov     word ptr cs:[pos_x],0) ?# {( E/ q) b' U8 p+ Z  H
  703.         mov     word ptr cs:[pos_y],0% s" _; q' ~% z# b" K
  704.         mov     word ptr cs:[x_move],0
    7 |0 W  ~' G" b5 g9 K0 v
  705.         mov     word ptr cs:[y_move],0: I) C1 z+ {+ [% n5 T8 Z
  706.         mov     word ptr cs:[x_max],639
    ) X+ V. w( P6 U% w
  707.         mov     word ptr cs:[x_min],0
    7 C" V7 S  G2 `3 C) L, H
  708.         mov     word ptr cs:[y_max],199
    . i% p+ q9 [" W7 [8 D2 w. }) N
  709.         mov     word ptr cs:[y_min],0
    5 U* {9 ~8 s" v# U& l
  710.         mov     word ptr cs:[user_mask],0) H5 W- F6 E3 I! v1 I8 j& t2 g
  711.         mov     word ptr cs:[user_subroutine],0) M2 A# a  @3 K- |
  712.         mov     word ptr cs:[user_subroutine+2],0
    3 \$ ~% D$ s( }
  713.         mov     ax,0ffffh$ v% h: x  A' f& m7 i# c2 y+ b- j
  714.         mov     bx,30 {  N6 \. S( I: v5 l9 K7 e
  715.         iret
    6 o, R5 d/ w" l
  716. ! I% \% \1 X/ o, s/ z6 ~- W) d
  717. _get_pos:
    ! f$ D3 k: b2 Y2 M; M
  718.         mov     cx,cs:[pos_x]; q0 O' \5 N* {& B8 W8 C
  719.         mov     dx,cs:[pos_y]. z# z2 z! L/ p( ?* ]3 _
  720.         mov     bx,word ptr cs:[buttons]$ a5 D% _! \  x+ t' g0 P
  721.         xor     bh,bh
    0 l8 G/ k! {2 ?4 e; Y0 j1 G2 M& h6 u* Q
  722.         iret8 I( b1 @5 |7 O+ D: C1 Q" w
  723. % C& H# ]2 ^$ ?# P; y
  724. _get_mouse_movement:
    $ K) u1 W( ?' K  ?
  725.         mov     cx,cs:[x_move]
    3 q+ k% o* [) Q) ^
  726.         mov     dx,cs:[y_move]0 R: z3 P- x9 S6 [4 N1 b
  727.         mov     word ptr cs:[x_move],04 b$ d. j5 U( f6 S/ J8 W
  728.         mov     word ptr cs:[y_move],0# P8 k7 c/ n7 e# a
  729.         iret' |* u1 R. e8 M( C, B
  730. 4 \5 U- ^/ X7 `$ Y" M1 s8 A
  731. _show_mouse:
    - g% `" I( d3 z; D9 _
  732.         push    ax
      w* }. g6 K1 ^5 h& @3 m
  733.         push    bx
    ( T! [9 D8 m3 u' h9 s1 }7 `" m) @
  734.         push    di- ~& ?3 `& Z9 v$ t- \6 y- a  f
  735.         push    es/ n0 b% d; M* Q3 P  J* L
  736.         mov     byte ptr cs:[sm_flag],1# ?& k0 X7 }. O: t- h# A2 j! c
  737.         mov     ax,cs:[pos_y]3 k4 H! [; ]" ^3 Y, `
  738.         shr     ax,3
    $ x/ O8 D0 i# _9 n0 x8 Q& D6 @
  739.         mov     bl,806 J7 o. {7 F% X4 R& q
  740.         mul     bl! b, l% z: }3 b9 {3 f* G
  741.         mov     bx,[pos_x]: [& F. P1 d7 g) y
  742.         shr     bx,3
    " f) z$ p; s2 q& G! ^/ S
  743.         add     ax,bx% O' q3 H/ J1 ^) \* n4 I
  744.         shl     ax,1, y7 n( u% U( R: {& L; e
  745.         mov     di,ax
    ) r0 `  F) v0 C: H- `8 y) U
  746.         mov     ax,0b800h& _! Z; j0 U4 t! v' R& F7 l
  747.         mov     es,ax
    : D0 z# h/ F1 |: I: @7 m# k
  748.         mov     ax,es:[di]" i  m0 _& S9 o
  749.         mov     cs:[save_char],ax; @' S/ ~$ j  E+ g
  750.         not     ah
    9 X; q( d% L4 @* ]& [
  751.         and     ah,7fh3 L3 v' w' L" A& Z8 d3 m
  752.         mov     es:[di],ax
    ( c# Q8 E: Y9 f4 w2 I
  753.         pop     es
    % }3 I6 L: A7 m- S( t
  754.         pop     di
    ' w7 M4 q( U  W( ~+ v9 h6 w3 [, j$ k) R0 `
  755.         pop     bx; y1 z. T- `2 K% u& Y$ c: P: h% Y: M8 d
  756.         pop     ax# L9 s  {1 g: s& l  M! c- l- R
  757.         iret
    - x, ~: A, \; f: C
  758. 9 k, K, W, o( |5 L5 @9 Q+ F3 Q- g( G
  759. _hide_mouse:
    " i! ?, R& l* |) e, T4 t
  760.         push    ax
    ) X0 E; u9 L3 G$ `7 {% L! _
  761.         push    bx
      v; j/ g8 H" Z8 Z) [
  762.         push    di
    8 p$ `: f" }+ [
  763.         push    es, x3 h( ?; }. N* L& t  k% Q
  764.         mov     byte ptr cs:[sm_flag],0- \' O+ e3 S) S1 B$ W: i1 p- Y
  765.         mov     ax,cs:[pos_y]  a( j9 q1 x+ `4 V3 A' \- x; d
  766.         shr     ax,3
    + m6 y" H' p) `
  767.         mov     bl,806 h% V( T- @9 [- P
  768.         mul     bl
    - g  p2 n8 \9 \4 [$ I" Z% t
  769.         mov     bx,[pos_x]
    ' |% C3 b* `: q- ^
  770.         shr     bx,3
    9 i( g/ ?" x1 r, ]9 n
  771.         add     ax,bx4 L% M: W' p  ^* ]5 U! B- v
  772.         shl     ax,17 Z# }" ]8 }0 y
  773.         mov     di,ax
    : f9 J( R" q) A1 m
  774.         mov     ax,0b800h. i! M0 V/ t9 M/ l6 \; P
  775.         mov     es,ax
    1 A& y; r% a6 [( l: U# i
  776.         mov     ax,cs:[save_char]
    6 ]! D  o, V: F: U4 K
  777.         mov     es:[di],ax0 L- f8 ]7 `  r6 W& x' U
  778.         pop     es
    ) e7 _# X# x: g/ ?
  779.         pop     di
    / H! u" s+ l5 s( r, I6 b
  780.         pop     bx# `  l' _+ {7 P$ C2 w" K
  781.         pop     ax- n' X- i* c. ^" U
  782.         iret
    4 n) \# Y7 g2 z& ^! _; k5 C/ A" o+ C
  783. / J1 {/ B! G3 ?0 c3 z2 W
  784. _set_pos:+ w- i6 Y$ ~- j5 q. @6 d0 l
  785.         mov     cx,cs:[pos_x]
    9 r) W0 g" r! V# ?& k4 S# _
  786.         mov     dx,cs:[pos_y]
    ' w/ [7 ^( X2 ^
  787.         mov     word ptr cs:[x_move],0
    , E& K& N  {# s: @  ?% B
  788.         mov     word ptr cs:[y_move],06 V4 b$ n  Y7 e, e
  789.         iret& Q- ?1 z# ~! R+ r0 c- ^
  790. 4 V) k$ V# z4 j2 P+ i, z4 s
  791. _set_hor_pos:
    - w6 t8 B1 l. e7 {+ J- l
  792.         call    max_min
    - A+ N4 m" P! p+ d3 [% V# b
  793.         mov     cs:[x_min],cx. n! x( |: O9 O5 F, V& S3 w* F' c1 X
  794.         mov     cs:[x_max],dx
    7 [0 i2 J, d1 l( T3 p
  795.         cmp     cs:[pos_x],cx
    + k3 E  i" u2 z0 L. a* X
  796.         jge     good_hor_min" l: T& Y8 x3 y& F- T; j# C
  797.         mov     cs:[pos_x],cx$ w, v( Y( Z5 ]: }- {
  798. good_hor_min:+ W. _% T$ u" j7 L+ U
  799.         cmp     cs:[pos_x],dx
    % Q' _( g! h; [( k2 G2 O( t
  800.         jle     good_hor_max# _- X+ G, H- b6 `0 O# G+ Q* J9 t
  801.         mov     cs:[pos_x],dx9 F4 z6 g) G% ~) y! L, o, g
  802. good_hor_max:& N( l  j* V$ V
  803.        iret
    $ p" I# B& X8 j5 \9 n; `9 F0 z

  804. ! E  j. c; x; l
  805. _set_ver_pos:
    ( {3 v4 i  y7 {) ~: b# c
  806.         call    max_min
    ) \  W: o% n  U
  807.         mov     cs:[y_min],cx
    5 n8 x# c. f. |0 R2 S* Y
  808.         mov     cs:[y_max],dx
    & ^% H! K, i' I1 I
  809.         cmp     cs:[pos_y],cx7 Q% }. M7 G3 c# [. g+ z1 O- h
  810.         jge     good_ver_min
    9 u$ ^/ J/ K- i) K$ Y
  811.         mov     cs:[pos_y],cx
    , \5 Q& G% f% B" X% N% p
  812. good_ver_min:
    2 ^+ H( D, w5 O/ V+ W
  813.         cmp     cs:[pos_y],dx
    , N( k# @' ^7 l9 ]0 ^3 p
  814.         jle     good_ver_max4 o* L# Z8 Q6 r/ Y( h
  815.         mov     cs:[pos_y],dx1 T% L& b  F" }5 U5 b9 c+ Q+ r' }) W: l
  816. good_ver_max:  o  ?! c& X/ Z. h
  817.         iret
    3 L4 _4 Q: v" e8 w2 e1 t

  818. ( ^+ k- p9 ?6 e! M( f, o
  819. max_min:
    4 A1 M. n: q) V$ `: ^$ m, c
  820.         cmp     cx,dx* {% A- w, N  i) v# }/ a0 }
  821.         jle     no_swap
    4 P" m3 o5 {( u5 z# u  D8 X- d
  822.         xchg    cx,dx$ ^' W$ s( J. @0 g% I
  823. no_swap:  ]5 |6 r) n& Q* L
  824.         ret
    % q' r! v; u, e, C

  825. ) ~) s$ A7 F0 b* D4 d$ H
  826. _set_subroutines:
    . Z: s: U- C3 w$ g+ v" ]. P7 P
  827.         mov     cs:[user_subroutine],dx
    ; m. h+ n2 n  U7 r
  828.         mov     cs:[user_subroutine+2],es
    : `7 @* c( q+ N; Q( S
  829.         mov     cs:[user_mask],cx& _  F; a! u: _8 S+ h6 `3 Z
  830.         iret3 M9 e3 ^0 I. e8 M+ ~

  831. ! G6 C8 G# a! n- b3 }3 R, V' u
  832. _swap_subroutines:
    : }1 k3 ^: @" S- k: S6 f
  833.         push    word ptr cs:[user_mask]
    7 C% a2 c% b% M0 n. p3 o% n: E) H2 y
  834.         push    word ptr cs:[user_subroutine+2]4 g  k0 n% `7 E4 a+ [' Z; A
  835.         push    word ptr cs:[user_subroutine]/ D# J/ e9 |% h
  836.         mov     cs:[user_subroutine],dx
    5 ^( a" A& J; I' \+ q. k) f  e5 u
  837.         mov     cs:[user_subroutine+2],es
    . C+ j! |0 H  Z- h) _
  838.         mov     cs:[user_mask],cx7 K$ S1 K& o( Q5 L/ w
  839.         pop     dx$ F. h9 L( T2 e6 b; n' @  @) \
  840.         pop     es% g3 Y6 h% ^7 ?6 n# a3 W8 I
  841.         pop     cx" S8 E+ D7 S* M5 {; ]: N* q
  842.         iret: D) e$ D+ k4 a

  843. , `8 G  g) E: Y+ i2 X) c
  844. memmouse        endp
    2 O" A: u2 J+ q! _6 ~5 g
  845. . m' O6 U" c7 ]2 u4 U( }" H3 g
  846. endof_start:
    6 S+ @6 x' W1 o6 q2 d- _1 _; ^
  847. 5 Z! e% `; l; ~* F/ @7 W
  848. emsg db 'No mouse driver install error!$'' X8 p& p" {5 h  v  ^
  849. old331 dw 0* Z! @$ J% R# [) `6 z! @8 Z/ W* h  T
  850. old332 dw 0# [- r1 T3 v; ?$ j( w, C
  851. old741 dw 0
    % R, }2 w! j# \& }, X
  852. old742 dw 06 n! o9 ~3 V+ q& S
  853. memcopy db 0
    $ ^2 P# h% N3 f' A- l
  854. okcheck db 04 ]7 a* G$ A. Y3 \* _5 c
  855. pass db 0! w- U& d$ w; g0 v7 k
  856. chkl db 0
    ) O4 E- D; E5 I( V
  857. lk db 00 p3 p( n4 ]' C' s! v( \8 O
  858. chkr db 04 Q& E% B; P+ G
  859. rk db 0
    3 n. ]9 j9 }9 V+ c3 r; x
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    . ^6 a% j% G$ y
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '; C1 N3 o; w& @0 F* h, X: S! Q) D
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '1 @$ R- B) q- r) ~$ G3 r( c( Y% I
  863. db '                                                                                '3 S! z8 c' F9 C  y  y
  864. db '                                赏屯屯簧屯屯突                                  '
    $ S  i2 [! G% i( D
  865.         db      '                                ?OFF汉OFF?                                 '. Q& F/ D* F4 A) u
  866. db      '                                韧屯屯既屯屯图                                  '
    9 g2 t5 b) S! p( a5 d7 @5 V, e9 L
  867. db '                                                                                '
    8 H8 Z; p% z. y( Y- U
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    1 @7 \  H( Y/ C3 `6 \0 n  P% N0 m9 k) @
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    . m4 B: o- }0 m7 ^# N
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '  p) a2 p+ x* _. V4 F1 N

  871. / z2 u, O8 h. }3 r+ L
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
& i1 Q: H* l4 K, x$ A哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 3 ^- I1 \9 R) d+ i
7 x0 X& X1 S5 ]4 ^, A
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 20:16 , Processed in 0.047637 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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