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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
2 l. @1 c7 G1 U3 l6 Y
1 `! u1 J; p' H5 Z代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    + ]8 ]) s: h. [
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9- L* t! {3 X4 H
  3. ;                                         By Bini.Yi 易祝兵& `/ q# [" W1 @" d  F
  4. ;                                         http://www.ufoit.com 计匠网9 R" S# V- Q# ~3 h0 x6 L% c3 x
  5. ;                                         2002/04/06 YYYY/MM/DD$ j5 K. g* u* S8 d# u5 o
  6. ;
    ' R4 V+ U4 r) X) i$ B9 ~
  7. ;          7 y; r% T. ~# \1 x
  8. ;          This program  test the mouse button  click and move.
    ( s* V4 h3 x1 t+ _! O! }) A- ]+ \
  9. ;  @1 O, R  C; B  {( B' W

  10. - R) ^3 _, ?( F% Y; t& d
  11. .model tiny
    ! V* E/ M. _- L: b+ o% H
  12. .586
    5 o/ m/ d0 w. {0 M; o4 N6 V0 P5 ~
  13. .code
    : F- Q; Y. t' w  `( }
  14. .stack  100h
    , K; F3 V8 Q$ _' h, `
  15. .startup
    1 J# z( g2 T' n$ Q% q: b" z
  16. pusha
    * p" z) e9 E; [7 A8 X
  17. mov ax, 3533h
    * h$ T9 ^( d2 n; Z6 O) ^; j
  18. int 21h
    : {. S, b* ]" C
  19. mov word ptr cs:[old331],es/ Y# o% f  s# D, s5 \2 F- P
  20. mov word ptr cs:[old332],bx
    & w2 ]- {% Q( v4 d4 x5 y/ j! T
  21. mov ax, 3574h
    7 h* \7 M8 E- m5 j: `
  22. int 21h
    ' K/ ?9 S1 [+ Q$ G0 d3 L
  23. mov word ptr cs:[old741],es7 A3 c/ u0 W4 d) u! r  `' [5 l
  24. mov word ptr cs:[old742],bx; W- b. `5 p4 x* c0 Z
  25. popa6 C( a' K# }1 p$ I, b- p
  26.         call    memmouse
    9 o) A5 H) x" z) L
  27.         mov ah, 00* `8 T6 q$ C! U# ]# x6 ^+ F: I# l
  28. mov al, 03
    6 _( D9 K2 S- Z8 r: m
  29. int 10h) f5 Q% R) U: S9 ~9 h' J
  30. mov ah, 06% }2 x  z/ o" A& z9 r/ x
  31. mov al, 0
    6 z8 a0 B. A9 Z* M" P: `
  32. mov cx, 00 u3 b7 x0 Y. C
  33. mov dh, 24% ~9 I: Z/ g4 j# \
  34. mov dl, 79* c1 X& _/ X/ K+ Q( k. R
  35. mov bh, 07h
    ) n3 C: q/ v5 a; s  L" R
  36. int 10h4 K2 h8 S! |# J; ?: \
  37. mov ax, 0000
    : F% X" a( n1 {- Q; m. K( k
  38. mov bx, 00022 X6 j. y3 n, I" d9 P7 Y
  39. int 33h# W6 [, I' {; F/ K# b# y' d
  40.         cmp     ax, 0000           ;if no mouse drive install& Z3 @! ^8 @. b# ]! Y
  41.         je      errormsg           ;show error MSG8 }* ^$ g/ |4 l6 J- @+ d- T
  42. mov ah, 02
    ! z* |' i% G- d+ [9 C+ q
  43. mov bh, 008 [+ L! y/ w' o1 R  g) k0 E
  44.         mov     dh, 25             ;Move point out screen- S  m) [; _# x2 J2 a# M. D
  45. mov dl, 79, D" M) F: h2 Q% G0 g" A
  46. int 10h/ Z$ z0 A- I3 E0 I+ ~
  47.         call    showmsg            ;Show info1 J2 Z/ g' {, w+ ]4 s& X
  48. mov ax, 0001
    1 s* c* Z$ b" `% M7 h! J
  49. int 33h
    ( }0 ^' V7 j7 R7 T$ c2 u5 l1 u
  50. ; mov ax, 000ah* O7 d$ P0 }8 _
  51. ; mov bx, 0000
      i: L9 p+ O' G) E( Z; }# M  ]
  52. ; mov cl, 0h0 o6 o; y4 d. n6 k) `
  53. ; mov ch, 0F0h
    1 a& e$ r) @4 ~% o' v1 h1 O
  54. ; mov dl, 0h
    ( {1 U( g! D) }8 ]8 f. z. W* @
  55. ; mov dh, 0F0h% u, s; Y7 X9 C4 }- G, ?4 Z
  56. ; int 33h
    ! U% m6 m9 Y/ p; z' ?
  57. mov ax, 0004h/ `7 c7 f. O2 S. U! g
  58. mov cx, 0319  ?$ {5 U" e2 C/ o& \: B
  59. mov dx, 0103
    9 f9 k) v( w$ K4 C0 r4 }! x
  60. int 33h. N' x% a; j. D6 E$ [  a7 M1 \! N
  61. casemo:                           ;Case button click and point move
    . T( a. V$ m3 n3 d% J: `& _
  62.         mov     ax, 000bh         ;and keyboard press
    ) o; N! n* A0 a. t/ f' \3 W& O
  63. int 33h
    ( a5 c% O0 B0 D, e# ]; {5 A' H9 o
  64.         cmp     cx, 00h           ;if point move....X# k: v6 J% m8 {$ T( U
  65. jne xmov
    + `8 @( c6 N' `; u% o& k
  66.         cmp     dx, 00h           ;if point move....Y" Z0 w+ y5 B* L% ~
  67. jne ymov1 v5 l2 s6 G. Y: G6 Y
  68. xymovend:                         ;X.Y move end
    / S" v/ O6 T' Z! C) q7 n, |
  69.         mov     ax, 0003          8 g% s7 Z( Y. i0 [- @4 R
  70. int 33h; X! K- |7 W7 o$ D: ~$ e3 P
  71.         cmp     bx, 0001          ;if left button click  show ON
    2 D/ j( e( p* |4 ^: E
  72. mov si, 1828
    . d) B5 l3 q$ h7 g% [* `1 s
  73. je listl% b5 P8 n" d: t
  74. mov si, 1828
    3 n+ L  d' l; V% N" n
  75.         jne     nlistl            ;if left no click show OFF
    ) r6 K  E9 Z  Y4 K' i# H
  76. testr:
    ' |& U$ b* O: b- s
  77.         cmp     bx, 0002          ;if right button click show ON
      O/ \3 `* L6 ^
  78. mov si,18420 r0 H3 A  ]3 H' c5 t) k2 l# e% M
  79. je listr( O) d8 G# J1 y* i- S( @
  80.         mov     si,1842           ;if right no click show OFF$ Q" Y* _+ M. Z
  81. jne nlistl
    ' a0 T; Y% }6 ^. t& ^, T
  82. casekey:' H  E# |& m0 N- o
  83.         mov     ah, 01            ;if any key press jump check
    ; c5 e! b1 B9 f
  84. int 16h
    # M2 j6 [, ^4 h6 v
  85. jne kpress
    1 B8 r. T3 b9 A
  86.         mov     al, [chkl]        ;check x flag7 S( ~9 i3 e* y: |" H' {
  87. cmp al, 02h% n- y( b0 y! A7 I: p& T: o) c
  88. jnb chkok
    . G7 W" g1 W' z* x2 W4 I. a; K
  89. jmp casemo
    # T# f" n7 N* t$ c3 g
  90. xmov:                             ;if X moved, get the X flag+1
    - }0 X% D' M$ A3 o, B. s' o
  91. mov al, [chkl]1 l( w( i" r- H
  92. inc al
    2 I7 @4 j3 ]& o4 C1 m' J/ w
  93. mov [chkl], al
    $ t- V: G. l# n; W7 }5 G& ~
  94. call passok
    2 O7 ]* p0 B7 `' z$ i4 g; f. I$ D' S
  95. jmp xymovend
    3 t# K( \+ [9 G
  96. ymov:                             ;if Y moved, get the X flag+1. r0 D4 g- K4 R3 @
  97. mov al, [chkr]- }4 q! t8 P$ ?1 s9 t; y/ L8 K
  98. inc al+ {5 S& G& b- @! @, \
  99. mov [chkr], al3 g& P( s4 m3 u- i
  100. call passok
    0 _' s/ Z2 ?9 p* \5 I3 ]
  101. jmp xymovend3 D. j' \: B% }9 F; U  H
  102. * q, B- b/ o) ~) Q: j; n2 D
  103. passok proc near% |4 m0 u% n9 C1 ~) i* [0 U
  104. mov al, [okcheck]# n# Y- n1 |1 V9 o- B
  105. cmp al, 1
    ; s( L" ^, S$ B* M
  106. je let0
    7 W. S6 `8 ]5 P. ]0 }
  107. jmp passret/ ?& r+ G% `( [% x1 f+ R2 Y
  108. let0: ) z: d# u( x7 R; l4 i
  109. mov [pass], 1
    ( C! f1 j4 q9 D( g5 G( l' @
  110. passret:
    + p1 R9 F( X! w! X
  111. ret7 M" \( t% `3 a& Z
  112. passok endp " M! ~, U! @4 U" T4 u

  113. , v+ Q3 s; a! x' U& n7 g% G- R/ b
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    $ o+ k) U1 b) t9 M- m
  115. mov al, [chkr]
    ) f3 v0 ^" W8 X4 ~& ~
  116. cmp al, 02h
    " k+ K3 o7 X3 o# S  E
  117. jb casemo
    ; `$ E- p+ \. q) T
  118. mov al, [lk]' I2 H+ v/ O$ Y- g+ J. \- W
  119. cmp al, 13 ]7 E' R4 {! c; ~2 i0 H8 X5 N, R
  120. jne casemo
    " h) ^( L/ }& r1 f7 b
  121. mov al, [rk]
    2 `# D# G/ ?3 @/ J
  122. cmp al, 1
    % Z0 j4 ~8 a' ]8 y3 f
  123. jne  casemo
    # N6 u2 U- @  _" y. a8 x$ y
  124. mov [okcheck], 1
    5 R/ i0 c) R6 x4 }$ [" [# s
  125. mov al, [pass]+ C; I0 ?- I3 h9 g: q
  126. cmp al, 1
    0 j! c6 y- _8 R9 Y  e
  127. jne  casemo1 S" N9 [' M+ p+ w) s8 Z" M8 d% j
  128. mov ax,0002h
    " r0 e2 @- T' c/ p
  129. int 33h+ H! d  ?* [0 w- n6 W4 K
  130. call cleascr, \+ y! Y5 [: ?% O0 o- b1 y+ k# |

  131. ; R: N2 g' P  |  `# S$ u
  132. call oldint9 D* b6 n: \) D( r+ C7 o  c
  133. mov ax, 04c00h* Z. c# n! R1 n, O7 G. n) `2 E% }% k
  134. int 21h% Z3 ~5 \4 Q1 Q% X- E; `/ s8 r% g
  135. . l# c, L$ _4 ]" a
  136. okexit:# Y  J+ H+ y5 F5 y6 h" m+ N
  137. mov ah, 4ch
    / O. z5 |- I) X
  138. mov al, 0
    2 I# Y. V7 n3 a% Z+ v  L
  139. int 21h+ Y* E6 x* }% S; Y
  140. listl:                                 ;Show ON" r4 s) E3 g. [5 v$ x
  141. pusha3 u. i! M( o- B
  142. mov ax, 0b800h8 S' x; S3 ~& Z3 F: L; O/ V
  143. mov  es, ax2 d; b3 {" W+ y# n
  144. mov ah, 47h
    / J) c+ V) q7 l" b
  145. mov al, 20h5 I: M  Y/ U3 s# W" L
  146. mov es:[si], ax
    ! H$ `3 I) g8 C- |
  147. add si, 02+ P. Q4 ?! D( ?
  148. mov  al, 4fh
    0 q8 o. W  o+ `. P" }0 ^8 g  O
  149. mov es:[si], ax
    & |. p0 d8 |4 m. \! M; e
  150. mov al, 4eh
    ' s: [1 z) U: l
  151. add si, 02! P, Z& t, e, c+ C2 x# _  j! S( ~9 Z2 B7 L
  152. mov es:[si], ax% u$ s) D. ]! t" A# e
  153. mov [lk], 1
    . i  T' b7 g) I5 h- @- ^. \3 S
  154. popa
    # s* M4 W' E9 ^& ?# U
  155. jmp testr
    % ~& v: L$ U# [7 R. f* b
  156. listr:                                 ;Show ON
    0 }* a: Y/ U: Z6 m/ P8 ~" p( E
  157. pusha
    5 b6 j: e6 K& T. ^% h# d6 S
  158. mov ax, 0b800h: o" R0 ]5 C0 n  H% ], W
  159. mov  es, ax
    - ?/ B+ R# N: n. J3 l$ N$ D  R
  160. mov ah, 47h
      J* E* A  D1 y
  161. mov al, 20h" d% S; p/ F  }- T, `$ m# a" o' d
  162. mov es:[si], ax! z5 o& s/ _% \0 T& i: o
  163. add si, 02
    & k/ e+ a5 G" _( f/ s  q
  164. mov  al, 4fh; k% F1 |# l4 W3 {0 S; p1 B
  165. mov es:[si], ax
    ( B% ~/ V& i- v
  166. mov al, 4eh& _2 I6 F' q! g7 G+ X, }, b5 o+ ?
  167. add si, 02
    7 h0 A' J; D; W9 u! E
  168. mov es:[si], ax3 Z8 |" E8 g: \; j' x" P& P* L
  169. mov [rk], 10 q5 w) \  W" O& X7 X0 e
  170. popa+ I4 x9 D& K  T: v$ k# ~
  171. jmp  casekey
    2 o, i( ^; W' W3 @3 }

  172. , u- i! f2 U8 V3 T- {
  173. nlistl:                              ;Show OFF, e; \4 Z; R3 U9 v: G
  174. pusha   
    + q- x2 R: `% }( B
  175. mov ax, 0b800h! g; G' o1 R0 ]1 b. ]# J. Y
  176. mov  es, ax
    1 Q) _. m8 w& @6 _* W. D0 J
  177. mov ah, 17h
    & O( x. d. K/ l' m
  178. mov al, 4fh: u& c; N- j& G/ L8 o
  179. mov es:[si], ax
    ) a0 g! ~, [+ X# Z8 X) S8 x
  180. add si, 02
    8 A( o- Y5 j' `( n
  181. mov  al, 46h
    + }$ [  ~+ l* J9 D1 }3 U3 C
  182. mov es:[si], ax
    3 v7 u9 b+ D+ w& `+ o
  183. mov al, 46h
    : C; V6 u# J* e' Z
  184. add si, 02/ }: i. ^2 r8 ^+ V' f
  185. mov es:[si], ax* B; r) D$ g7 g! A& Y9 q+ P
  186. popa
    % T$ j" \8 x" j7 E9 x8 B
  187. cmp si, 18403 _% y) N* v( o( P" N
  188. jae casekey5 H1 }' ^& z! z8 n$ R( M6 O
  189. jmp testr0 }! k5 f- M& i( e# e4 W5 |( h
  190. / S+ {* `# ]  \+ H0 h
  191. kpress:                             ;Check key press if press<ESC> then EXIT3 L/ T  K% i' |- B8 w
  192.         cmp     ah, 01h             ;and return a error
    5 U9 v5 {% A9 m- N
  193. je exit1
    ' ?8 K5 m4 x* C7 M# r
  194.         mov     ah, 0ch             ;if press other key then clear
    ) X# U' }, L1 \8 Z
  195.         mov     al, 00              ;keyboard buffer
    ' U  }+ N3 K2 u) Y
  196. int 21h
      D: N8 t% n/ t
  197. jmp casemo 1 y% j3 }" [; F* o3 g

  198. 0 f4 x: p8 g5 D- x/ g# R* R7 C
  199. errormsg:                           ;if mouse driver no install
    1 L& ]2 t. A; d- a2 j
  200. call oldint  B9 t3 D8 E$ y9 s
  201. lea dx, offset emsg7 T( ~' f$ \2 ~0 N/ K
  202. mov ah, 09h& E2 i- p- p7 P: t6 L
  203. int 21h
    / H' U) ]" ^6 u+ N, I# Z& z
  204. mov ah, 4ch: J6 _( ^) v- R: w* O6 U
  205. mov al, 2
    2 }  T; ?/ S+ x! c
  206. int  21h
    ( W5 M; r; C0 l4 Y8 @

  207. - m  q" X3 V$ A/ f, E1 D
  208. exit1:                              ;error exit- E! p: B0 N& }! P7 H
  209. mov ax, 0002h
    3 @, K; h' B; B. C8 j
  210. int 33h- V$ v/ I8 j; p9 U' A5 B
  211. call  cleascr
    0 _& N. ]# X$ r# ]
  212. call  oldint
    # @* f; ~; h5 C. q( k1 y8 F
  213. mov ah, 4ch) H' Q, L4 D1 t  q: \! G
  214. mov al, 01" T  j/ f. k& U
  215. int 21h
    5 `- |6 [# C9 E9 q1 G$ p

  216.   W3 L/ b. ~; V
  217. cleascr proc    near                ;clear screen1 v/ G* Y; b9 E
  218. pusha& J" E0 ]3 ?' R( B4 A  U+ f5 b
  219. mov ah, 06' Y5 ^. S! Q; `) v9 t) l$ B5 v
  220. mov al, 0
    2 O& W: @2 P3 }) _, X
  221. mov cx, 0: t# ^! ]# C' h% f
  222. mov dh, 24
    & l8 F; k7 ?+ o; T+ l
  223. mov dl, 79
    0 X. Z( q9 e. Z$ t/ r
  224. mov bh, 07h
    4 b9 b+ L) [" V# E* C9 M" v
  225. int 10h( z  g8 i( O) J8 A
  226. mov ah, 02- k7 h' n7 U/ t! r5 W* Q- Y
  227. mov bh, 00
      [" n5 C5 `7 u5 |$ \
  228. mov dh, 0, ?2 {' U# @  a
  229. mov dl, 00 t0 F# @4 I! b# l
  230. int 10h' V/ F0 G1 _; U6 n$ }* G0 O. n. F
  231. popa
    ' p$ s, Q4 D5 z! Z% n+ s8 \
  232. ret7 y. y2 w+ p2 c
  233. cleascr endp1 G5 {4 w. w7 _

  234. # L  H( G3 c6 U5 {
  235. showmsg proc    near               ;Show info
    3 I8 R1 I0 ]$ J1 w) r
  236. pusha! t2 ]+ J9 ]  j1 t8 s
  237. lea di, offset showms
    # k1 C7 x* W) V9 D: \8 k# p; z" ]- S
  238. mov ax, 0b800h
    0 a# C1 \" j  U( c: L
  239. mov es, ax
    - R2 [( o- Y. z- I
  240. mov si, 0
    : ]! H& x* U% Z8 A
  241. mov cx, 480
    5 P$ H2 y6 Q9 ~# O
  242. mov ah, 07h% L( p& @- ~% B" L+ b
  243. @@:
    0 _7 @5 J3 x4 A! @! O$ g3 {+ }2 R
  244. mov al, 20h
    % {7 `2 E1 a% S% y* E  \- [
  245. mov es:[si], ax
    4 R* J+ I7 W' e% J* L
  246. add si, 2
    6 N9 H7 d2 C6 S
  247. loop @b+ U" ]' u; ~/ F+ c
  248. mov cx,880
    # N6 {; g, o$ p
  249. @@:
    & A6 g0 M2 v7 F5 R/ B
  250. mov al, [di]
    0 L. `. |* }% J& P% G
  251. inc di$ l% O1 M" s# S. e7 n7 v* f4 [) I( l
  252. cmp al,20h
    , G; V4 Z* a# B4 A7 C
  253. je showch1
    # h$ [3 T! f% D: Z. [0 p: e% e3 l
  254. mov ah, 17h- B$ B) ~$ t5 a: g1 y, g, V
  255. jmp showch3 , `. c8 n1 a1 g* b
  256. showch1:
    2 N, Q; V! [: T, o2 v
  257. mov ah, 07h
    ! K, @" M/ s$ C% A3 H+ ]8 L1 D) i
  258. showch3:
    9 C" T; a9 p* q4 J- s+ R
  259. mov es:[si], ax% J# H* \* Z/ W- A8 D$ U
  260. add si, 2
    6 H% O( b0 K: j0 @5 k9 {
  261. loop @b
    . r/ F) o/ T5 D' C0 \
  262. popa% P5 j/ n' G1 S+ A+ J. S4 `
  263. ret
    : u9 r8 X. z+ M, G6 C" L8 V3 m
  264. showmsg endp
    4 q5 u1 R7 \1 Q" s7 i' B! |  O  y  |# \4 I

  265. + K2 a7 Q. Y0 R/ \' [, E
  266. oldint proc$ U" ]3 l2 z+ q+ `) l# q9 {
  267. pusha
    " o& |0 l7 V9 I( j6 D" V: x
  268. mov ds, word ptr cs:[old331]
    5 `1 ~; t6 i1 `% x4 u
  269. mov   dx, word ptr cs:[old332]
    2 F) R+ Z) l, P3 s/ D& r
  270. mov ax, 2533h1 b4 z0 h! Q# W& n+ g
  271. int 21h( i8 t) A. g- J& v4 {1 Q
  272. mov ds, word ptr cs:[old741]
    1 i+ r" I2 |$ H1 A  j
  273. mov dx, word ptr cs:[old742]5 f: }1 R! b3 d
  274. mov ax, 2574h
    : w4 r, a  t# c( s9 m& s
  275. int 21h
    & j: n( X8 J* F3 x  P4 n) N
  276. popa
    7 q+ ]% V0 z$ Z
  277. ret
    : z' Y  K: D- N' }  A5 |& y. t7 K
  278. oldint endp
    ; u$ I! ]3 Q" o3 ^6 ~
  279. . \: v5 s: F* G3 d' M$ q3 v
  280. memmouse        proc6 G  v2 W+ E$ a4 R: R- e3 F
  281.         xor     ax,ax) \, Y& Z$ `6 n9 D& w! d& E- }3 q
  282. int 33h9 j0 b. E8 s2 I+ R+ \
  283. cmp ax,0ffffh
    8 W% `1 `6 Q" X4 y6 F; ?# _( S
  284.         jne     not_loaded
    , s2 B" }) Z! w2 ^. A
  285. mov [memcopy], 1
    7 u( v3 p0 p8 N
  286. ret
    ! }2 y3 {: }- w4 ~6 D% h; n
  287. 5 A3 E! g" W/ V$ `9 a, H' X
  288. not_loaded:5 l8 u) W# W# J9 s0 _

  289. 1 E2 H9 A8 N3 N' x# j% [
  290.         mov ax,2574h
    ) }% H3 n5 l% \/ T! b9 S7 N4 M' [
  291.         mov dx,offset new_isr5 k  U! P, h. ~. O
  292.         int 21h
    6 h! t# c* `* x& O- ^3 }

  293. ; u" H* V; e) ~
  294.         mov ax,2533h
    5 r; D6 O* Y. V2 Q
  295.         mov dx,offset new_332 x9 E" T) [* ]: s2 y
  296.         int 21h5 }, d4 G, e9 @: E# i% O

  297. 4 V$ r% E% h( d
  298.         cli
    + ~# B) R2 P" N4 g' l3 C' W/ z

  299. , H) P0 o5 L! I3 O
  300.         mov bl,0a8h* b4 `8 A* u+ M7 s1 _
  301.         call keyboard_cmd
    : B  c9 A5 v# M/ S9 m; a
  302. ; L) m/ s/ F$ ?& ]
  303.         mov bl,20h
    9 E* C- }" }* P: W2 s
  304.         call    keyboard_cmd' S1 ^8 H4 i! z! \
  305.         call    keyboard_read
    $ W/ ?/ ^9 Z) ?- z0 J0 w
  306.         or      al,2/ E1 M. c4 @" m" \) ?! ^
  307.         mov     bl,60h
    % H6 S# ~2 J% _1 {
  308.         push    ax
    1 f. }% h' H! ~% o' X& d
  309.         call    keyboard_cmd
    : `+ f* s7 [! O, X  [
  310.         pop     ax
    ! z* L3 @3 N: H5 B# t
  311.         call    keyboard_write& \4 p4 z) g* }

  312. 5 [2 y5 b: b5 X$ a6 p7 {4 F
  313.         mov     bl,0d4h
    - s! [$ G$ k( e- q0 }  `9 a- @
  314.         call    keyboard_cmd
    # [3 h0 w/ q. D6 X1 a0 i6 S
  315.         mov     al,0f4h0 H9 g( a1 e3 r5 M1 s/ A+ N
  316.         call    keyboard_write
    4 C0 E2 t, w1 D1 b  q; Y

  317. * w0 c* `7 a: R4 p4 I0 u! c' a
  318.         sti
    ( r% u& w& U4 Q
  319.         ret
    $ `* k4 x& M4 \( Y
  320. call_user_isr:
    5 _& d# F6 `8 V% D& `, s
  321. db      60h
    ' `& g- r& b4 ]: S1 G( m0 c* X
  322.         mov     cx,cs:[pos_x]' r) V: v& Y6 F. `4 |( }6 U
  323.         mov     dx,cs:[pos_y]
    # q# S+ s' a' F2 W  F  q! W" V
  324.         mov     di,0 ;cs:[x_move]
    ' V# |0 U2 ]; a) \* |! z4 P
  325.         mov     si,0 ;cs:[y_move]
    " x" Q& B7 G0 y$ Y* ~: j" E
  326.         mov     word ptr cs:[x_move],01 J3 Q; S& m7 W' S* x
  327.         mov     word ptr cs:[y_move],02 X2 X5 W- G# Z8 `# j& x5 x
  328.         mov     bl,byte ptr cs:[buttons]
    2 }! {5 R7 f& ~( [9 N# O
  329.         xor     bh,bh! ^1 I/ Z5 M! T
  330.         call    dword ptr cs:[user_subroutine]! ^* ]( x2 d7 l8 S! r" a* g" \
  331.         db      61h0 B" B5 S1 Y1 b7 C0 ~
  332. ret1 L+ T: C1 i- v$ s8 r
  333. new_isr:
    , w2 E: ~3 E2 M: C: I/ C8 I
  334.         pushf
    # l* m' B+ B& O
  335.         cli% t- a' {6 c! Q0 d" P8 S" Y
  336.         push    ax
    . A2 \; C8 [% f$ c
  337.         push    bx: S) i5 ]1 }& f+ j% C, _  N
  338.         push    cx
      c% K% S1 z/ n/ E* \3 I
  339.         push    dx
    4 `- W1 F5 a* d/ o$ A
  340.         push    di
    ( M$ ^+ D- |( ?$ ]  c$ T( c: F
  341.         push    si, Q3 ]( O% B+ `9 M; _
  342.         push    es
      T$ n# w5 W4 C/ a
  343.         push    ds
    ; Y  f+ @  a  Y4 @1 W
  344. 9 ~' e+ ^( h4 u: _3 W# k
  345.         push    cs
    % H$ Y6 s5 m% u7 j/ w
  346.         pop     ds
    4 K# ]0 A, q" L! a0 `* @

  347. ) n. s. f, \  H. s
  348.         mov     bl,0adh
      E  r- J2 Q& k2 q) Y
  349.         call    keyboard_cmd( _* \" U) x" f

  350. ' o6 P/ S' T$ J
  351.         cmp     byte ptr [first_time],03 N0 G8 P% I& G4 B
  352.         je      not_first_time* O3 |# O8 \! O6 Y! P3 w
  353. 6 E6 ]8 u3 X# P  q
  354.         mov     byte ptr [first_time],0* x8 {+ S# s" U5 F* {. I# R
  355.         call    keyboard_read/ I. Z! U, C, X
  356.         call    keyboard_read
    0 ^) D" o% A8 B" f- L
  357.         call    keyboard_read3 R* Y. P2 r' @( O: d
  358.         jmp     no_show: u4 R. d3 \8 P8 \5 p' x" r

  359. , n* R! {8 k3 ?- r0 |" E
  360. not_first_time:! L" Y3 K5 r) o  A9 X/ m
  361.         mov     word ptr [temp_mask],0! ]9 L& S  q/ I  _, ?

  362. 6 M/ _4 F: H3 b2 d& _
  363.         mov     cx,[pos_x]6 b& Y% V7 l5 h1 q: q
  364.         mov     dx,[pos_y]
    4 {8 a; I1 t% k3 f1 Q

  365. 0 y! ?8 a" N( i. l7 H% U& f# Z- d
  366.         call    keyboard_read- `6 R6 D/ m- n- T' }
  367.         and     al,7 ;3
    6 z. o6 h& G& A8 {: Z) A# t+ i
  368.         mov     ah,[buttons]
    0 q9 M- A) u# S& G& l
  369.         mov     [buttons],al
    + A) z+ G) H3 Y. b* _( w3 g
  370.         cmp     al,ah
    . D8 w& f4 y7 A+ `1 [& W7 q
  371.         je      no_button_change/ c" I& }8 X1 S8 U1 v
  372.         and     al,3
    6 c: _& Y7 n& M0 s- U; _
  373.         and     ah,33 D, _, i7 K  l  z3 [
  374.         xor     al,ah1 ^( U- y& T1 P7 ^
  375.         xor     bx,bx
    0 y( X: K( p- k& L6 X1 d. }! n, b

  376. + V. [* e$ S) ]6 c, m% y$ \6 d
  377.         push    ax
    ) V2 d0 q6 N8 r4 ]+ ]
  378.         test    al,2
    : v) h- Z$ }) k& c5 O- t3 x! i
  379.         jz      no_right_button_change
    / e: ]9 M4 [% ~+ r. Y% I& o
  380.         and     ah,2
    6 f, K( U, o( z& @
  381.         jz      right_button_pressed, }5 @3 i% Z, x. ]0 Z+ y" m# G
  382.         or      bx,161 f- m6 t2 Q$ h' ^  I! e8 F
  383.         jmp     no_right_button_change+ V- L" M; N3 I. Z
  384. right_button_pressed:
    ! F- r, g" P- a( [& H$ u
  385.         or      bx,8& ^0 g) O  ]) C0 m* g- _. H; {- G
  386. no_right_button_change:
    6 m# `% [$ Z( N. x7 ]

  387. * Y; ]' Q8 `' s0 y9 n  m  x% @/ ^
  388.         pop     ax( f3 G$ S1 h! ~$ N3 D( C% V
  389.   b3 ~. \3 p5 A5 W+ }
  390.         test    al,1
    % o' t3 _8 i. l
  391.         jz      no_left_button_change2 B' r9 e5 n3 P7 f+ s2 [
  392.         and     ah,1
    $ G  N" W, _, j7 y1 O9 Y
  393.         jz      left_button_pressed
    1 W/ V2 G3 I3 _6 e5 q3 v% \
  394.         or      bx,4
    5 q  o# h) S! ~. c' U6 Q
  395.         jmp     no_left_button_change
    4 y9 \$ J& A, l( b2 P' M
  396. left_button_pressed:
    & d9 f. |. a$ E( ~5 C/ {
  397.         or      bx,2$ N  W& q$ O* z$ F/ R$ G
  398. no_left_button_change:
    & ?+ {$ Z& c  {/ @: v2 m& N- l

  399. ; h: i3 o) z2 R: J- x- C# P
  400.         mov     [temp_mask],bx0 I3 v/ f+ U" ]. y; z
  401. # n5 |2 F! U3 w: I% B3 S
  402. no_button_change:
    0 x2 n( T, q7 d
  403.         call    keyboard_read
    1 D- Y6 N3 b9 a- g7 M/ W
  404.         cbw" o: y, s9 N& [3 v* Q/ H
  405.         add     [pos_x],ax
    - a% J: q& H' f) \8 W: X' D
  406.         add     [x_move],ax6 M0 Q0 Z6 c- f3 M5 {
  407.         mov     ax,[x_min]
    - L6 S7 I7 t/ F
  408.         cmp     [pos_x],ax& _( j+ C' v: ]  l) @4 M
  409.         jg      good_hor1
    % J  C5 U  b5 b1 e8 D
  410.         mov     [pos_x],ax* p/ H8 k9 e6 U  V
  411. good_hor1:
    2 N- _* n% Y6 w4 z  f( Y8 M! R" u
  412.         mov     ax,[x_max]. v- G: `; V% R
  413.         cmp     [pos_x],ax3 R& ~' h1 [( L/ N- F8 j6 T
  414.         jle     good_hor2
    : R4 `0 {6 ]; C7 d, [
  415.         mov     [pos_x],ax# m+ D3 f1 A* |6 a' m# _; Z$ e/ g1 V
  416. good_hor2:
    5 j3 X( `5 X9 X8 x
  417. , @1 ^. ^1 f% K% b/ M) N, ]
  418.         call    keyboard_read( E, L5 k( ]: o: W/ `. j# J
  419.         neg     al8 C- g, {* Y/ _3 a* {8 M7 x8 b
  420.         cbw' V1 o3 p" B  i/ S
  421.         add     [pos_y],ax
    & k( |4 W" P) Y" y9 R8 A. C
  422.         add     [y_move],ax& c2 w& E5 {" V& T
  423.         mov     ax,[y_min]
    ; x- ^, n4 O8 [" _2 b0 Y# X
  424.         cmp     [pos_y],ax" a8 {+ b# J5 m$ ^
  425.         jg      good_ver1& ]8 a5 H! Y; i" m
  426.         mov     [pos_y],ax8 l" ~0 V6 p& W
  427. good_ver1:
    & R8 I4 @/ R% P" [" \8 f# X: ~+ I
  428.         mov     ax,[y_max]
    0 |  ^5 e# y( n8 u7 j
  429.         cmp     [pos_y],ax* |% {2 _; S0 D. w: [$ V
  430.         jle     good_ver2
    ! R; U+ b$ S( T  F
  431.         mov     [pos_y],ax$ G- Z) i2 f: \. G% c8 j" S
  432. good_ver2:9 Z0 T' a/ g. ^1 i  Q) e

  433. 3 ]; {6 m  G9 j3 W8 a! E+ C6 M7 d
  434.         mov     ax,[x_move]2 O7 u" E& W$ q1 {
  435.         or      ax,[y_move]
    & E2 o/ h) U. _& _
  436.         or      ax,ax
    7 Q* o8 M) E1 t: x+ [- h& D
  437.         jz      no_change_position
    ( T5 }  M+ j  i2 H/ ^, C, U
  438.         or      word ptr [temp_mask],1
    ; w5 g7 \% A- S: j  D! X
  439. no_change_position:3 O% j! v, W6 R6 T( O
  440. 8 ?- q3 T1 ?- w% C* O
  441.         mov     ax,[temp_mask]# ~+ n6 K+ \& H0 H; z# K2 b! ], o/ R- \
  442.         and     ax,[user_mask]& U/ q# l/ @; j2 `' @
  443.         jz      no_call_user& h0 y. |+ a" M( `% \5 k. m8 O
  444.         call    call_user_isr7 F  M' q8 g* E6 b2 x
  445. no_call_user:
    + E8 X* D; D( i. `/ `

  446. & C+ g$ M* K- C# O2 h: T
  447.         cmp     byte ptr [sm_flag],1- T& `  `+ P  j( t0 ?5 a' X" m+ b
  448.         jne     no_show$ g9 E+ C  Q0 d

  449. 3 }7 F7 z3 H& c% f: |8 \; ^
  450.         shr     cx,3
    " e* |6 L8 N* x- a% e( x! J
  451.         shr     dx,3" {" T8 x, B, y, K: V
  452.         mov     ax,80  L2 g! M+ t/ p
  453.         mul     dl8 Q% o/ n+ X$ p
  454.         add     ax,cx
    $ n9 \) }9 Z( ]" a
  455.         shl     ax,13 q$ t- n$ K0 }9 O
  456.         mov     di,ax
    3 |0 W6 F  L( i* k' ]
  457.         mov     ax,0b800h6 K3 S& ]- n) j8 y0 |% K8 V$ c0 X
  458.         mov     es,ax
    ' k8 D2 r! \6 n7 y  c6 B
  459.         mov     ax,[save_char]
    ( j$ f6 c2 F6 l; C. g
  460.         stosw
    & X* f& h- {# A- s

  461. " R7 j; \3 Z4 K& N* n
  462.         mov     cx,[pos_x]; g- b0 r% J  d2 M( H) I
  463.         mov     dx,[pos_y]9 `3 z2 _" n' ^1 v4 i1 [
  464.         shr     cx,37 @1 D' f+ `! M" B- j$ S1 P# P7 K
  465.         shr     dx,3; N* E: O; [6 q- \( w7 a9 h
  466.         mov     ax,80
    % J; c/ G% L  ^
  467.         mul     dl  r  Q1 e6 t6 Z+ F* }2 }. u
  468.         add     ax,cx3 h; H' E6 `+ [! ~$ W* p
  469.         shl     ax,1
    : i* h  T# w0 m/ B5 \
  470.         mov     di,ax
    & G+ |  A& s1 t
  471.         mov     ax,0b800h% E7 G+ n( k! \* [: v  C
  472.         mov     es,ax. _7 y5 r% L6 m- m+ F
  473.         mov     ax,es:[di]
    & b! ^2 H( B; \7 }
  474.         mov     [save_char],ax9 j& k' T; g3 l4 z" y% l* `
  475.         not     ah
    ! O& i. T4 k, j+ k( E( t
  476.         and     ah,7fh
    8 z: c! [7 c7 T* l
  477.         stosw
    . ~# o4 T- \/ p: [4 r  c
  478. no_show:
    - Z' I$ G. A6 t" h
  479.         mov     bl,0aeh
    7 f6 U7 u9 V& S; L8 K
  480.         call    keyboard_cmd! M* O4 ]9 C( B; d, p

  481. 1 f* I4 D' P7 n$ g* t  f1 y$ s
  482.         mov     al,20h- Z/ A# w9 `( O9 `. O& A9 Z
  483.         out     0a0h,al+ v" y* }- u& T' H  D& z% I, K3 D; j
  484.         out     20h,al" \& W9 `4 X. }5 f; u( u

  485. 4 t% d) B4 s) a$ _- {. n+ \  W
  486.         pop     ds! N# u3 |, x1 k- I9 G2 |
  487.         pop     es
    - O/ ?: \+ C  x1 s3 G7 }- T* ^
  488.         pop     si
    2 t7 q3 h$ l8 U) p' W- T- M& x
  489.         pop     di& T5 f/ K8 r4 h% w
  490.         pop     dx! r1 c% o, \' {$ T8 h3 \
  491.         pop     cx& L$ u; P9 s: R% N+ ~* m& u5 Z0 G0 o
  492.         pop     bx/ I5 |$ I* I6 K9 g6 a6 r# |* G
  493.         pop     ax$ n' I2 C' X& c$ L- j5 P- b
  494.         popf, }5 A+ d. P7 B4 o# a  ^8 R9 Q
  495.         iret2 d+ _/ Y% n! ^3 L& {
  496. 5 m. @  _! S% v% U9 H: ?6 D
  497. first_time      db      1* @8 X6 x, [% O9 O* K/ D9 ~5 q
  498. buttons         db      09 t+ s6 Q& R$ {$ o0 Q, P# I, V
  499. pos_x           dw      0
    # P7 O0 D8 p6 f9 g
  500. pos_y           dw      0
    ! l6 m' ^$ n- e. j+ k, O# }
  501. sm_flag         dw      04 C& [8 p$ \+ H& T# t
  502. save_char       dw      0
    ( k' j/ B5 z/ v; {- k, a. z
  503. x_move          dw      0; Y5 J, I; {' z) U# G) t7 Z
  504. y_move          dw      0" Y+ P5 y3 Z& @4 O# F, l
  505. x_max           dw      639
    2 \; Q$ d# d' p" J1 d
  506. x_min           dw      0- i) |# g. W! C( e
  507. y_max           dw      199
    3 U' s  F* L! J# O& ~3 e
  508. y_min           dw      0
    " v1 N. B, a6 b1 @" s
  509. user_subroutine dw      0,0; K' o3 K9 w2 b) L
  510. user_mask       dw      0
    3 N9 y: V. u% o+ w4 c, g* C+ y
  511. temp_mask       dw      0& Y0 d2 U- N& B' x% `& i2 C% S

  512. / ]9 l4 k0 S$ |& N' W; s0 M
  513. keyboard_read:
    & C4 m7 ^7 ^4 M8 @+ `
  514.         push    cx
    ) d" A  Y7 g" K! _2 E" @% u. N3 [
  515.         push    dx
    ; {4 m3 ?7 M# G* L2 P9 ~. _) X
  516.         xor     cx,cx* p9 K: }0 E" {) M0 t
  517. key_read_loop:
    + K* M, T8 n9 |( h  z$ V" n6 Q
  518.         in      al,64h
    - O! |) T8 e4 ]4 Z5 f( f( v4 O7 c
  519.         jmp     $+2
    0 d' Q+ D0 L0 F, O0 {$ E
  520.         jmp     $+2+ q2 }& F$ y( v
  521.         test    al,1) i4 Z, T3 C/ R8 {6 L
  522.         jnz     key_read_ready4 q7 _3 t1 J9 [1 d# B
  523.         loop    key_read_loop( X" {0 |# `6 D- P: R4 ~( m
  524.         mov     ah,13 h- F; u) ]8 L1 M& Z7 P) j" _4 n; ^
  525.         jmp     key_read_exit
    : k. M7 |; T5 k3 }' M, f; E
  526. key_read_ready:
    6 U. H0 T2 E, A1 A" m
  527.         push    cx! E) E& g0 K( m  a. ?3 E
  528.         mov     cx,321 V! ]: x# `9 q
  529. key_read_delay:* c' ^: j+ h7 L9 W0 h1 S6 A
  530.         jmp     $+2+ }$ g% x$ P( H( `4 Q- H0 L# ^
  531.         jmp     $+2
    7 V1 z; q  r' r2 J: J
  532.         loop    key_read_delay1 X6 G: R/ s3 W
  533. ( l5 _  _6 S2 i6 `8 g; ^; W/ @# C- i/ }
  534.         pop     cx
    . @; {6 V5 o7 N& ^, I9 o

  535. : O% _) `9 d. l& @4 M! e4 I
  536.         in      al,60h" M! I8 s9 ]4 e5 d1 k0 U2 X
  537.         jmp     $+2
    . F& N. i7 ]; p# t
  538.         jmp     $+2; S4 c7 Q2 {1 R5 h! E
  539.         xor     ah,ah8 q1 R& s' H# @) p) s
  540. key_read_exit:, g- L/ O- L7 p
  541.         pop     dx+ [  t6 I3 Z) S/ U8 |! \$ k% `- h
  542.         pop     cx
    . |5 y/ C& P" U+ h+ I
  543.         ret
      d6 M( G* H3 ?/ {
  544. 4 w! g4 i5 E4 ^& o$ ^6 W" y( n0 j
  545. keyboard_write:
    4 O! ^% M; S  w+ e4 w9 |0 j
  546.         push    cx' `5 E' I; S* ^
  547.         push    dx  b8 x( a  s! B3 G) K* r8 d
  548.         mov     dl,al9 m+ Y% ~8 s1 G2 D% t; \0 m
  549.         xor     cx,cx6 x+ H7 T# T) I
  550. kbd_wrt_loop1:
    4 u- k6 j7 p: S
  551.         in      al,64h
    # h/ N% \0 v7 U9 E9 x) w
  552.         jmp     $+2
    3 }- `4 k$ R- b* p/ X
  553.         jmp     $+20 P1 M/ ^7 I3 s- i$ W& t
  554.         test    al,20h) G* L, E) `+ @
  555.         jz      kbd_wrt_ok10 d" y0 C3 Z2 z0 j

  556. - S8 i( k9 e: X7 q3 c* D* ]  @
  557.         loop    kbd_wrt_loop1
    + L5 `2 K* o; @3 M4 L
  558. % r! p9 G( u7 f( R( ^& s$ s
  559.         mov     ah,11 N' @- N* ?5 w1 T: M* J: m
  560.         jmp     kbd_wrt_exit
    8 i( w( c' _" ^* w
  561. . R/ o) o& D: |2 Z% E+ g
  562. kbd_wrt_ok1:; t# V6 v- ~; W* D" n
  563.         in      al,60h
    : @0 n. n7 a& H. C: G) I

  564. ( L, b6 q! V- l2 q/ T( T
  565.         xor     cx,cx7 L1 k/ J0 l, \; D- _9 ~
  566. kbd_wrt_loop:
    $ n% y9 K' e% q2 x! k6 i" B* {$ y& X/ U8 ?' ]
  567.         in      al,64h
    * M. l0 K% a4 e- b. L6 _; K3 ^
  568.         jmp     $+2
    8 q& u' N3 b0 e
  569.         jmp     $+2
    . L+ }2 o' z! `  {- z
  570.         test    al,2- p- M/ _2 N- Q( X
  571.         jz      kbd_wrt_ok4 i7 z; S% y& S8 R5 C$ z
  572. 3 v- D' ~5 A0 |9 V% u  f
  573.         loop    kbd_wrt_loop% C2 G% M, M9 x- f, Y3 n# a

  574. : x+ Z6 q2 i% b
  575.         mov     ah,1
    ! q' w6 A- I, m) q& a
  576.         jmp     kbd_wrt_exit: N4 K; m* x& w- x, N

  577. ! T4 @3 }" l+ j+ S# g
  578. kbd_wrt_ok:
    / v$ e, Y8 q7 A1 x" x8 t4 n
  579.         mov     al,dl
    * D7 R. G- \& N. v/ \) S* f
  580.         out     60h,al
    % M+ @% {+ ^, P
  581.         jmp     $+2
    + ^6 g1 M9 [: D$ L5 v
  582.         jmp     $+24 B  t* j% e* H
  583. + h! T6 D: l8 w. u/ F- L- t
  584.         xor     cx,cx
    ' \7 ]4 j1 q& ^0 f2 ~9 l
  585. kbd_wrt_loop3:' l& z7 d% j" F- R! Y
  586.         in      al,64h
    5 h9 b& K/ |- q' [
  587.         jmp     $+2
    2 B1 h  u8 H) _( p( s1 V
  588.         jmp     $+2
    6 \9 K" ]! u  a& C6 B* p, v
  589.         test    al,2
    4 x! q( j; q5 T+ n' o4 [* u# y( w# l* u
  590.         jz      kbd_wrt_ok32 Q5 d/ V& }1 B! V

  591. 6 ]4 \/ ]) U& m* b1 |
  592.         loop    kbd_wrt_loop3
    . G( {/ r; t1 T, p
  593. 1 P* J& A  X" }; K6 G- A9 @2 Q
  594.         mov     ah,1
    , N9 T5 J' n: F$ ]8 P3 L6 `
  595.         jmp     kbd_wrt_exit1 m/ z) H9 x& Z5 D

  596. 2 ]: Y! U% L$ N" W6 Q: j
  597. kbd_wrt_ok3:
    ' k3 U  P) z0 {) a. R
  598.         mov     ah,8
    % `! h  w( L5 q# r* w+ i1 n8 t* ?
  599. kbd_wrt_loop4:
    . r! n( Q. R- o( Z  g
  600.         xor     cx,cx# W- k8 t7 M# n1 q7 W$ }5 w0 m$ _
  601. kbd_wrt_loop5:
    : R3 ^( \* e5 S# Y( G
  602.         in      al,64h4 n5 ?% h1 @% Q! m- `; B9 p
  603.         jmp     $+2! {4 c  `' F. j( d: C, m
  604.         jmp     $+2
    " x& x7 w8 c: a! P) Y& v- E( c
  605.         test    al,1
    8 ~2 `& r1 ~7 S) k: ]5 \& v
  606.         jnz     kbd_wrt_ok4
    ' J# d- n) r+ j( W
  607. , ]' L8 J8 K2 I. `
  608.         loop    kbd_wrt_loop5
      v# x1 @$ e0 R. v+ _. d3 o
  609. 1 l. c2 n% z% f! G3 `
  610.         dec     ah
    4 G4 j' Q$ o+ C; m& o3 X! {8 I  l
  611.         jnz     kbd_wrt_loop4
      o) H* U, R* ?$ X" p, X

  612. ! y4 j( a8 J/ Q+ W% e! B
  613. kbd_wrt_ok4:6 X. ^5 n1 @: o3 V5 u( M1 a
  614.         xor     ah,ah/ ^! K4 s) I6 L; P
  615. kbd_wrt_exit:) O- i* i, y& b1 W4 V( s1 o8 O% C  o
  616.         pop     dx
    1 A# y) V) u" J& I% k, |8 V
  617.         pop     cx
    2 b8 Z$ w9 X4 q" z+ l$ h2 P
  618.         ret
    4 A. k  G1 \& _& C
  619.         / U% M$ l8 f( }% G
  620. keyboard_cmd:6 R9 R1 Z$ c: @  x) U
  621.         xor     cx,cx
    % c/ z: w' H+ h) B, |1 Z3 @
  622. cmd_wait:, Z4 E( N5 O9 O3 v$ b
  623.         in      al,64h
    # N7 V2 S' ~. ?9 a+ t) U% z# k2 l
  624.         jmp     $+22 G8 d' V7 F1 \9 G# K2 H' V
  625.         jmp     $+2/ h6 r1 Y3 a3 e4 ?" `
  626.         test    al,28 v9 s- l% t2 q1 D6 ~; m
  627.         jz      cmd_send
    0 [. E5 U  u5 E3 b: |- s1 v
  628.         loop    cmd_wait( m8 A% v/ U5 X

  629. $ {! T5 r  S3 c* j6 W) [
  630.         jmp     cmd_error& q) s' g( m, L/ Y' D2 r; }
  631. + T) R( L1 \! q8 k' K& |8 a
  632. cmd_send:
    2 M! P& T) S! I; k/ i: s
  633.         mov     al,bl0 N2 i+ O: b5 `( g+ o
  634.         out     64h,al
    9 d; k4 z* J0 w5 _1 K' R# f- r
  635.         jmp     $+24 C1 Q5 g7 l1 _: K7 M
  636.         jmp     $+2
    . B* D# y$ Q! Z$ O+ b

  637. ) ]9 b7 l$ N9 y) b6 n
  638.         xor     cx,cx
    $ x+ b9 v; I" A. `" Q
  639. cmd_accept:
    9 Y9 {% y/ l1 `' T9 A
  640.         in      al,64h
    9 }/ y- M' c! k' U3 ~
  641.         jmp     $+2
    $ {9 c6 A9 A9 I" t
  642.         jmp     $+24 M0 X, k2 D1 s) |( }
  643.         test    al,2
    4 K5 X. `3 I: g+ `6 ]) G
  644.         jz      cmd_ok! [# C; H/ m3 d% r& R: U
  645.         loop    cmd_accept  z2 e& e) k1 }
  646. 5 c. d1 N9 y0 S; e$ }( W* u
  647. cmd_error:
    7 ?! m1 g+ [) [1 H/ o% R& P3 n
  648.         mov     ah,1+ e# n3 i( S( U* g# Z3 ?: @* A
  649.         jmp     cmd_exit2 p+ I% ?# [% a' M
  650. cmd_ok:
    # ~# \6 D" {( u$ B! ]% M( e/ [: p7 ]
  651.         xor     ah,ah
    ; x! q( S/ ?( l; t9 ^- O
  652. cmd_exit:! q9 u( p1 x+ h+ e# v/ H! U
  653.         ret
    " N! h# o, V/ ]7 f9 q3 \

  654. * n0 W% X. I$ N7 U$ o: Z2 G
  655. new_33:6 |+ Z/ e6 z( c1 P6 U
  656.         cli
    . t- b! V& n/ O0 ?( x5 z
  657.         cmp     al,0
      U1 k, i9 v8 i3 |" K
  658.         je      reset_mouse9 i' u) w+ Y2 A" @) ^: o$ ?7 t
  659.         cmp     al,1
    7 o* B$ V. K0 s5 Y
  660.         je      show_mouse
    * @5 z5 M% @$ b& U! A: w3 u- Z3 k3 I& ~
  661.         cmp     al,2; Y1 n  b) P) d8 D3 I" ?; A1 l
  662.         je      hide_mouse; d* k* F" ?( C  G1 S! ?! W! Q
  663.         cmp     al,33 B) `5 k+ z1 ]) u5 E
  664.         je      get_pos
    8 x5 h8 T6 L5 h  `+ C( _4 C
  665.         cmp     al,4
    . F9 P  s) N9 Y) z* z: h: U
  666.         je      set_pos
    7 q) P" y$ t! i
  667.         cmp     al,7+ h  l1 c# z4 L! [3 ]
  668.         je      set_hor_pos
    ! L3 C( |; \) o
  669.         cmp     al,8& c, E( v  N3 F/ ^* j" y8 c
  670.         je      set_ver_pos1 A1 [1 g+ r5 A0 s& E
  671.         cmp     al,0bh
    - M- U) R0 @9 o# a0 k6 L4 ]
  672.         je      get_mouse_movement' T# a6 p  l0 L/ P0 B$ L' U. _, |- L
  673.         cmp     al,0ch/ V: ^% `3 c/ ?! v
  674.         je      set_subroutines
    . ]! j6 j) m! x7 Q
  675.         cmp     al,14h
      c* k7 s) v: ~5 D9 K- L5 ~! r+ |
  676.         je      swap_subroutines2 P% [; m: F* V* u8 M; \
  677.         iret
    : o" `1 F! j' C0 u
  678.   X( c# i  _( \
  679. reset_mouse:
    - s" |! R8 ^2 X
  680.         jmp     _reset_mouse
    0 O; n) `+ z4 ?; X. D
  681. show_mouse:& I7 W6 y2 R) M6 W; d
  682.         jmp     _show_mouse
    7 T4 k5 ?1 e  x
  683. hide_mouse:
    ; l$ J9 I, H. |& Y& {. h( G
  684.         jmp     _hide_mouse
    ! V: d* k$ G- G( Z5 F: [+ M
  685. get_pos:0 S4 v: K$ Q, V5 w3 \3 O; h
  686.         jmp     _get_pos
    3 T$ z' b1 L- Q& [& N: O8 ?
  687. set_pos:5 m1 l: y! X0 _' X9 o" E9 W- U5 V
  688.         jmp     _set_pos( {& D: m! E) ?
  689. set_hor_pos:
    $ A6 r4 |% n, V' h9 m
  690.         jmp     _set_hor_pos
    + h& U: w: v  S# {4 H
  691. set_ver_pos:' L1 A$ H. s; x2 s0 x) ]
  692.         jmp     _set_ver_pos
    4 e6 K5 O/ }/ Q  ^' f$ }
  693. get_mouse_movement:3 |; L8 f8 W; V2 ^; Q- h$ q7 N
  694.         jmp     _get_mouse_movement
    ! d4 r9 _% l9 A1 B; R
  695. set_subroutines:0 h2 P" d5 ]; L- D2 p* e8 I# C
  696.         jmp     _set_subroutines2 d# @" Q2 ?1 J6 F7 N. m- K
  697. swap_subroutines:+ N6 z' J" R9 [! z) o
  698.         jmp     _swap_subroutines% D. y* O$ n) q" i
  699. 4 q  ^9 P" z4 @* k& E
  700. _reset_mouse:
    - t" p$ J) X* |  M+ }
  701.         mov     byte ptr cs:[buttons],0" U! ^* Q! `8 ~9 Q9 [
  702.         mov     word ptr cs:[pos_x],04 x# f" w. T  P/ F- n# {7 m6 s# g0 m
  703.         mov     word ptr cs:[pos_y],09 n1 }0 A. i+ }
  704.         mov     word ptr cs:[x_move],0' S+ V) d' b" e+ @
  705.         mov     word ptr cs:[y_move],0
    2 O$ `4 r/ S9 b
  706.         mov     word ptr cs:[x_max],6391 I  M+ _5 w9 V' k# |! \( t
  707.         mov     word ptr cs:[x_min],0; ]! X. B( o0 t8 E. k, J5 a9 j; R) D
  708.         mov     word ptr cs:[y_max],199, |1 s0 l- ?* r0 b0 w
  709.         mov     word ptr cs:[y_min],0. j0 x5 u. U# |9 Z+ q
  710.         mov     word ptr cs:[user_mask],05 D7 S* r& o; C3 [6 l* I
  711.         mov     word ptr cs:[user_subroutine],0
    3 {6 i: k( c5 \8 a
  712.         mov     word ptr cs:[user_subroutine+2],0
    # i( [6 t% B  d
  713.         mov     ax,0ffffh
    / j) E- B2 I( d, T6 M
  714.         mov     bx,33 C& Y8 u# Y- T1 o( b
  715.         iret
    4 U5 A. f1 i, v/ O
  716. " |& d9 ^& e" D6 t* I0 v: g
  717. _get_pos:
    0 Y% U& W3 z! T$ S. _' r4 F: x
  718.         mov     cx,cs:[pos_x]
    + J1 p, [7 k' v" e- s
  719.         mov     dx,cs:[pos_y]! T$ p% n; D, W- X' `4 u
  720.         mov     bx,word ptr cs:[buttons]) v8 W0 c# p/ v* |: d
  721.         xor     bh,bh
    ) o* g& T5 m: Q1 u8 g! H
  722.         iret
    ( k2 p9 P8 e) |5 {% v

  723. 1 {8 ?3 K8 \) y# ?
  724. _get_mouse_movement:6 e" [) P! H' Y! Y* j. h
  725.         mov     cx,cs:[x_move]' J! W+ \7 J5 z5 D( ^
  726.         mov     dx,cs:[y_move]5 U8 \# @( y7 a  b0 W
  727.         mov     word ptr cs:[x_move],0$ O3 H, ?; \9 h+ ~/ a
  728.         mov     word ptr cs:[y_move],0
    9 U" z# s9 s1 _+ B- J, T4 q
  729.         iret
    ( c; g5 G# |& x# Z. d
  730. 4 e) y* N  R' K9 J
  731. _show_mouse:
    # s2 m' w/ [7 u
  732.         push    ax
    6 K. u6 X7 _: \$ u) O! T
  733.         push    bx3 u5 B2 u# c. u+ a$ o7 E
  734.         push    di" e! n, H; ^  B- T1 o1 J
  735.         push    es
    - Y( G0 w, p7 |6 K
  736.         mov     byte ptr cs:[sm_flag],1
    " O3 o  s5 N* Z4 s2 Z9 E% Q
  737.         mov     ax,cs:[pos_y]
    6 @' ^+ q7 V' O$ {& Z
  738.         shr     ax,37 M" x- J7 H# S- Z6 w, Y
  739.         mov     bl,80
      g9 @, @8 O# r2 F
  740.         mul     bl$ J  r2 |- d9 a' w% \  ~' `
  741.         mov     bx,[pos_x]; j1 d/ W5 t7 v7 N4 ]! C. K
  742.         shr     bx,3. \6 [) q6 B# Z
  743.         add     ax,bx
    7 K  Y+ a$ u3 n1 E0 @6 B
  744.         shl     ax,1
    - [# t( z" }) @+ n% K6 i0 [
  745.         mov     di,ax) Z2 i4 X& }' V
  746.         mov     ax,0b800h
    ' ?4 T4 _; f: g
  747.         mov     es,ax
    , S. ~' p3 p2 j
  748.         mov     ax,es:[di]
    ; i, O6 P" J3 Q# l1 ~
  749.         mov     cs:[save_char],ax
    4 J  r' _5 {  G! L7 \% w! h' u! `
  750.         not     ah2 b- D, S7 M) s9 C
  751.         and     ah,7fh& s! L' J: K% f* c4 H1 ~/ q. i
  752.         mov     es:[di],ax
    % `4 U# h' @% A1 j1 h. [5 L: q7 t
  753.         pop     es
    7 p5 J8 G  R& L" a) A# U( H. ]
  754.         pop     di2 P/ D# ~8 z9 n
  755.         pop     bx& W# W. @# Z( t, {  B9 `1 X0 A8 w7 r, k
  756.         pop     ax& r6 Y) @) l& q* t: ?& o
  757.         iret- ?- y# R5 O5 O5 \! }
  758. $ k% r: _& }2 B5 j5 b' @/ `3 O
  759. _hide_mouse:
    3 L; e# r7 `" n
  760.         push    ax& s+ ]/ }& I+ q0 N
  761.         push    bx
    ( f/ Z- O# K1 I4 g* r$ k, O( r
  762.         push    di, ]6 q, K2 T& H+ b  b
  763.         push    es
    * q  N7 [8 H: Z. D, `
  764.         mov     byte ptr cs:[sm_flag],0
    0 R# O, c% C8 k" L7 }: }1 }; C. b
  765.         mov     ax,cs:[pos_y]
      S4 w0 X9 A8 a) v7 C
  766.         shr     ax,34 W7 ?9 S3 n  Y6 o) {
  767.         mov     bl,80
    8 X6 q6 |/ \9 G0 p! y
  768.         mul     bl! P& i  |- G' x$ y' w: p
  769.         mov     bx,[pos_x]" \! J: f7 e/ o% o3 r) J
  770.         shr     bx,3- E# _/ z; x* {1 |+ h* Y' `
  771.         add     ax,bx
    ) u" T1 U: I% l7 g
  772.         shl     ax,19 G: l1 _& m/ c0 Q
  773.         mov     di,ax
      q' c3 _7 `0 ~# n8 [
  774.         mov     ax,0b800h
    ( n# s, I) q- }; F$ w* T+ Z* |, i
  775.         mov     es,ax
    ! V& b( F: H' c( E; N0 p
  776.         mov     ax,cs:[save_char]
    5 l" @( d- d3 W3 }+ ]. j! v
  777.         mov     es:[di],ax
    : ~1 m, m/ Z: M0 Q1 K' X8 u; @
  778.         pop     es2 t9 ~( y3 l( x. j
  779.         pop     di
    ) k9 |4 W/ L7 j0 t; O4 C' h
  780.         pop     bx
    5 V, L- f; g9 v5 g/ i, I
  781.         pop     ax
    & x9 Q# k; }9 z6 i+ [9 w' Y
  782.         iret
    : ~( c* m8 Z$ n; w. J7 |2 ?
  783. $ M- l8 n- ?' k& V+ F
  784. _set_pos:
    # s* b& M  H3 |8 O% R7 W3 }% K5 K
  785.         mov     cx,cs:[pos_x]$ J) {6 y' d3 Y2 Z
  786.         mov     dx,cs:[pos_y]  m( q' a( a; \; ]. s( t: [7 g/ g( G
  787.         mov     word ptr cs:[x_move],0# L) A$ G' j$ H* {: o
  788.         mov     word ptr cs:[y_move],0( v1 n' O4 b% _9 f* f
  789.         iret" R* `4 R5 d" C6 `( P$ k* ?7 v. u

  790. & W$ Q1 [4 ^5 x: l& D9 X' \
  791. _set_hor_pos:. ~* ?6 D7 G9 u- W" v
  792.         call    max_min& `& W; [) M7 k2 Z; f9 j
  793.         mov     cs:[x_min],cx
    4 P: ?8 P/ w4 H/ V4 O
  794.         mov     cs:[x_max],dx
    ( D( ^$ ^2 A0 a" E
  795.         cmp     cs:[pos_x],cx
    ) O! I1 r  P! I: x7 V" w
  796.         jge     good_hor_min
    4 |7 H8 I0 f: s& U
  797.         mov     cs:[pos_x],cx* d. V( W- t: j; D6 c( N6 T1 V. q
  798. good_hor_min:
    - R" w7 L) s; L; [
  799.         cmp     cs:[pos_x],dx* ^5 B: z/ N3 k+ Y
  800.         jle     good_hor_max
    & d; b( q6 x$ q! R0 D8 w
  801.         mov     cs:[pos_x],dx
    ) L4 h5 r; s+ @2 U
  802. good_hor_max:
    , Z/ x; S! y& z  `
  803.        iret& ^! H: Y0 G* i& D/ F

  804. ( Z; S5 w' J- Q
  805. _set_ver_pos:! o. J/ N. e- W4 m
  806.         call    max_min
    , }" ~3 k$ W4 F% ?% M
  807.         mov     cs:[y_min],cx
    $ i) ^+ d8 E8 q( f  A
  808.         mov     cs:[y_max],dx
    ) `1 N3 v, H: f1 M: L- w  U
  809.         cmp     cs:[pos_y],cx
    ( P( j5 ?. f5 L- s) q; L
  810.         jge     good_ver_min6 F. H2 i" Z) K4 l1 ?
  811.         mov     cs:[pos_y],cx
    ; _4 K3 x) ~  Z) E6 h8 c
  812. good_ver_min:
    ' K( H* Q7 Y5 \) m4 X! I) v4 K* t8 x
  813.         cmp     cs:[pos_y],dx$ w+ X6 q+ i$ U8 k- L* s5 b" g
  814.         jle     good_ver_max
    ) K/ P& e- v& H' a. L( a7 ~/ N; u- ]# a$ Z
  815.         mov     cs:[pos_y],dx( u) |8 @$ Q- \' I- m
  816. good_ver_max:- Y5 P. H  d1 q# u0 V2 \
  817.         iret* E! z! [* Y/ J9 r' M3 b' }2 j) \

  818. 9 M. F, n7 k# h/ G
  819. max_min:* r7 J7 y$ ]  {7 M; y
  820.         cmp     cx,dx
      v2 m# E" h8 i* n2 |, r+ K+ C7 t
  821.         jle     no_swap4 G4 @. N% j. T" W
  822.         xchg    cx,dx+ E  T, J: T  [/ H" L0 I& b
  823. no_swap:
    + h9 I7 P3 s; G2 e5 }. @  W( f
  824.         ret
    + Q6 u* M0 o4 R" ]9 B' {3 F
  825. ) Y+ u1 W/ C  d: S& P2 \
  826. _set_subroutines:6 p% L' o9 A9 \, ?3 A! D: R
  827.         mov     cs:[user_subroutine],dx
    0 x) s- Y$ W7 ]% H% E4 g
  828.         mov     cs:[user_subroutine+2],es9 w/ @# i0 d+ e* E
  829.         mov     cs:[user_mask],cx
      W. v! Y' Y# v( P- t5 v9 |
  830.         iret
    & f) P) d  f9 O

  831. & D$ a- S( X. l4 D3 u
  832. _swap_subroutines:- Y  d; ~# k( x! P2 T& e5 w
  833.         push    word ptr cs:[user_mask]
    2 H5 M8 y' k; e+ S" n" _4 v: C
  834.         push    word ptr cs:[user_subroutine+2]
    * a! N0 S3 j0 K" O! W. m
  835.         push    word ptr cs:[user_subroutine]! d. {! @- x. s; K9 I
  836.         mov     cs:[user_subroutine],dx
    ' ~. G' T. l0 `+ F( t
  837.         mov     cs:[user_subroutine+2],es, B1 V( n2 T# ]# p$ m
  838.         mov     cs:[user_mask],cx2 K$ M1 V% Q4 Q3 ?5 U' a1 @
  839.         pop     dx
    , L/ H' K5 b0 ?. G  E( t1 r
  840.         pop     es
    # u. \# c5 X" O0 G: t
  841.         pop     cx
    : G" U6 d; _- N. K
  842.         iret8 R) ?0 b! B5 e: V* x* f9 Y

  843. - J6 P. q: p' Q' p
  844. memmouse        endp
    . J6 M9 s7 ^9 V( S6 v! ]
  845. 8 h% G7 M1 [: `/ I" C; m/ [
  846. endof_start:
    5 _7 s! c2 K9 u! f
  847. . A3 Z) l7 g- g. b2 \& }
  848. emsg db 'No mouse driver install error!$'
    6 v0 d% `) X2 A: H1 @6 v  x
  849. old331 dw 0
    ' G8 l1 W  ?4 E) m% m1 a
  850. old332 dw 08 X6 R3 Y5 x' h/ a1 G
  851. old741 dw 0
    1 K3 a7 w, }. J7 A2 P0 m9 ~! v
  852. old742 dw 0; D9 v1 R8 M* ?$ `( E+ @
  853. memcopy db 0
    ! J  l, u. M2 C
  854. okcheck db 0
    / R" K# O' y, O0 \
  855. pass db 0
    " e/ N, b; U# h# r
  856. chkl db 0$ U( P  G. {9 z* R; Y
  857. lk db 0! u1 L; i8 b% b/ j% z) U
  858. chkr db 03 X$ R8 v0 ^6 Z4 v4 w
  859. rk db 0
    1 U- h( y' o" b1 @$ h& g% H
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '. w0 `0 B2 O/ K$ E# Z3 _
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '2 H- ~' V) ?( f; |+ ~, O3 C  f5 @
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    4 m8 G+ }* g/ e4 z2 Z  v
  863. db '                                                                                '' o" [) E# W3 j2 x0 v2 ]
  864. db '                                赏屯屯簧屯屯突                                  '' a! n3 f/ S# x
  865.         db      '                                ?OFF汉OFF?                                 '
    # E. b/ W1 B4 T% n6 I9 f4 s1 p
  866. db      '                                韧屯屯既屯屯图                                  '
    6 G0 g* ~0 J/ s* {/ \% L( }
  867. db '                                                                                '
    $ g2 h( H9 v& x1 o5 ?4 j
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    / q: @% U" R, g9 K; L7 n
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' & H0 w. F- C- _
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '3 f% q- C* I5 j0 M
  871. 2 l) F2 s& v5 y
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
( `$ c% D% z3 q) x1 l0 k2 W哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
0 E5 H4 x1 m& u' Z, F. \3 P$ w+ B6 C# F& }0 H9 ^/ k! j
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:37 , Processed in 0.058990 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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