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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。; G) ~" ?# U0 w* d# W  [0 d: V: g
+ ?! i1 [8 t% w- ^* K* R/ q1 y
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ) R. s; A* l# K* n/ B0 {% K8 d
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9# u+ \6 L- G& }- f
  3. ;                                         By Bini.Yi 易祝兵  r+ R6 B4 T- A: g1 j8 Y: B
  4. ;                                         http://www.ufoit.com 计匠网6 N* |$ e' o  S0 P/ F* r7 _
  5. ;                                         2002/04/06 YYYY/MM/DD
    9 O8 g/ |" w7 h0 g
  6. ;
    5 B9 G) ?6 Y$ F1 D
  7. ;         
    - a& C0 |+ q7 s# k  k5 e
  8. ;          This program  test the mouse button  click and move.3 t/ M1 L8 R, b0 G: H: v( f
  9. ;
    , ]# z; E4 L! e. y
  10. & Q' A- O% d; A
  11. .model tiny
    9 p1 S! e2 v. E' A4 l
  12. .586
    6 ^. _7 M0 e; t
  13. .code
    & w+ w4 q$ ]' n& o& @: M; W7 X
  14. .stack  100h
    / N" i* ^4 Z; i" a  Q
  15. .startup
    * ^0 R3 p  D- q3 z$ v
  16. pusha; K: J7 [; f$ w# K0 x" t/ k
  17. mov ax, 3533h
    ' [( h: I' H' Y6 r% @' h6 z
  18. int 21h: M' k. [- x6 u/ g# Q3 \
  19. mov word ptr cs:[old331],es9 b1 v7 p( P. D" r6 G
  20. mov word ptr cs:[old332],bx
    % n4 ^, Z5 \3 r9 L
  21. mov ax, 3574h
    / M. S8 S  U5 E  n: U" n( l) c% m+ B: T
  22. int 21h
    ! q: ?! G- q0 u- w: R
  23. mov word ptr cs:[old741],es, ^# A! K7 `; D+ x( ^& q
  24. mov word ptr cs:[old742],bx% V5 `! b) g. J- q5 n
  25. popa
    , V% ~' \6 ~2 G1 ~7 B
  26.         call    memmouse
    & u) X4 I1 {( c7 h
  27.         mov ah, 00
    8 n3 h2 @7 \( [, ]- p
  28. mov al, 030 n# S3 \! c9 V
  29. int 10h, d8 c4 G$ `$ y% T3 ^( |- E
  30. mov ah, 06
    ( v) {" d& u2 h0 n
  31. mov al, 0* \  ~4 T0 p5 L$ L% j! j& z) l$ Z
  32. mov cx, 0
    5 u' N( k3 H/ \7 e! w0 X' C
  33. mov dh, 24
    6 p* j4 l+ _3 ~+ U3 H5 L! t) s5 g
  34. mov dl, 79, J3 t- g$ _6 Q# ~* X- Y
  35. mov bh, 07h
    0 o$ j' E7 S2 r" k8 d
  36. int 10h% N/ x2 H1 k  j8 [5 r
  37. mov ax, 0000+ ~" l4 s/ X: ], ?. j
  38. mov bx, 0002
    6 q0 I2 w% @+ p2 G3 G2 t! U2 R
  39. int 33h  g) ~4 Y/ C: r* T% i) d# W
  40.         cmp     ax, 0000           ;if no mouse drive install% O% l! w- V' i) S6 X8 I# a
  41.         je      errormsg           ;show error MSG
    & M* Y/ }0 E! [/ j3 q
  42. mov ah, 02
    3 b" C$ I4 a6 B* f8 A
  43. mov bh, 00
    : {1 [& c- S3 R2 R  q1 A
  44.         mov     dh, 25             ;Move point out screen
    1 K! o/ D: n& d2 V0 J
  45. mov dl, 792 N, C$ ]5 P) }
  46. int 10h
      }) g! w) ^' G6 x; M5 h' S
  47.         call    showmsg            ;Show info5 S: W2 x1 R3 W1 E
  48. mov ax, 0001
    6 K7 B4 z5 |# J: B% Y1 W
  49. int 33h
    % J/ V/ l+ ^: b" L. ^8 v, Z# F
  50. ; mov ax, 000ah/ D- k5 w% S' {" S/ ?8 o+ L" ]8 j, G
  51. ; mov bx, 0000
    3 c' B6 J. w" y0 G$ D
  52. ; mov cl, 0h! u0 \' S5 Y: O, f
  53. ; mov ch, 0F0h
    / ]5 j5 a4 }  B9 t; k
  54. ; mov dl, 0h
    1 @& w$ h" Y- s, Z4 t
  55. ; mov dh, 0F0h' W( C& g) W1 \7 e' I+ M& W" S# m
  56. ; int 33h
    7 W8 g) d# A$ g5 B5 }
  57. mov ax, 0004h
    $ P  p6 p: \$ v5 R
  58. mov cx, 0319& w) G% B( }4 R
  59. mov dx, 0103
    , `4 H0 S+ z! u) k! r8 Z
  60. int 33h6 J# m1 Z! o0 Q3 D5 ]/ g
  61. casemo:                           ;Case button click and point move
    ; j, e7 i2 B4 m9 `
  62.         mov     ax, 000bh         ;and keyboard press) J% X; x# Q7 X0 n# r: n
  63. int 33h
    0 @8 C; J* j6 _2 s* O
  64.         cmp     cx, 00h           ;if point move....X* ^1 a/ k4 Y0 Q, ]  ~9 M2 K7 e
  65. jne xmov
    4 {% s1 W+ N$ w5 z7 ?1 \2 U
  66.         cmp     dx, 00h           ;if point move....Y
    ( f& A7 e1 K- E& Z3 a
  67. jne ymov
    0 Y) _7 i' E2 ]6 d% S
  68. xymovend:                         ;X.Y move end) ~6 M( `, t* t1 B( \2 c. V$ y, S5 C% l1 _
  69.         mov     ax, 0003         
    ! ]/ @% u# t) H7 C
  70. int 33h) Y* l5 ]" ]: Y1 K8 `+ c
  71.         cmp     bx, 0001          ;if left button click  show ON5 p2 w  D# O# z4 B' l5 Q
  72. mov si, 18284 r2 l/ H9 N8 v0 x+ J, t
  73. je listl& D6 }- b& ~" D4 I* w8 S
  74. mov si, 1828
    / D+ T0 Q: D6 `
  75.         jne     nlistl            ;if left no click show OFF: l# D0 W% b3 G2 b7 \; U3 d
  76. testr:. a8 r0 W& B6 w7 Z* _  t( a
  77.         cmp     bx, 0002          ;if right button click show ON/ w1 W8 @7 r3 U2 T
  78. mov si,1842( Q# I3 R8 B" H/ Q0 C# x
  79. je listr
    & E* v9 F: v$ d7 P8 d
  80.         mov     si,1842           ;if right no click show OFF
    1 J  Z! x' n0 t  c, Y3 a
  81. jne nlistl
    $ W: a: \7 o* o4 Z
  82. casekey:( R0 b9 ?  N% O3 S
  83.         mov     ah, 01            ;if any key press jump check
    1 {( }2 L6 c+ S3 j, }5 i
  84. int 16h' g, o# t$ [! t1 X3 I; w6 l9 w
  85. jne kpress
    5 s# c+ l  v6 D. c3 S" r6 ], u
  86.         mov     al, [chkl]        ;check x flag
    " S6 x6 h1 w, |
  87. cmp al, 02h
    1 P2 w% R( k+ _! o
  88. jnb chkok
    ' n( v0 i1 N# o& I0 d, D
  89. jmp casemo) x8 a: O: d' j. [; o
  90. xmov:                             ;if X moved, get the X flag+18 `8 y8 y: h0 `; t! z
  91. mov al, [chkl]5 ~/ g/ `) H& b8 b: v: R
  92. inc al3 Z4 {) ~" c1 R! ]; Z# |! l: V
  93. mov [chkl], al
    . R7 u" w. A# G# F0 I) X
  94. call passok
      q( W8 {- B/ ?8 q( [, |
  95. jmp xymovend
    2 Z' |6 c2 C" [. A. q4 }5 T
  96. ymov:                             ;if Y moved, get the X flag+10 [' `6 R- H& u3 e- D
  97. mov al, [chkr]! [' l' w1 O9 V) r% I3 E
  98. inc al+ N! g3 I( K- C9 [# k& e1 v
  99. mov [chkr], al5 P. X  S( b/ n4 t/ C; w5 s( _1 J
  100. call passok
    / C! b  o" b3 s. d- @& \, q3 `/ c9 L
  101. jmp xymovend
    ) z4 J( E8 p1 \
  102. ; {0 E0 |' u6 z& `. u8 a
  103. passok proc near4 x4 z6 h& `3 u! u6 K
  104. mov al, [okcheck]' M) B. A; }  Y& K+ a
  105. cmp al, 1
    & `# S7 C- [# W1 j6 T
  106. je let0$ a  J, {" B. O# Z
  107. jmp passret' n; D9 Y  o) D/ Q9 p/ d; R) d" _2 H4 ^+ g
  108. let0: 9 A* T$ D1 E4 {2 S
  109. mov [pass], 1
    ' t" I- k" B) d- S
  110. passret:
    / g1 I0 h- b$ a* m/ w. I
  111. ret
    & k9 H0 e- c' s: t5 ]2 k( D% r
  112. passok endp
    ( t8 ]& L  ?6 F1 o7 w5 ?/ X
  113. % \/ Q( ]3 ^# z# K3 y/ _- x
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    7 t. C( U+ K: q- P. l* S
  115. mov al, [chkr]
    3 [+ J' ^7 t2 G3 q7 o) j
  116. cmp al, 02h1 m# z; a* v& h7 U1 W' s0 v
  117. jb casemo
    * z4 |8 t0 _* [
  118. mov al, [lk]
    / e- _1 u- d  t
  119. cmp al, 1
    1 C/ s. I  f+ J# p, t. i% n
  120. jne casemo
    ; P8 ?0 Q: `$ ?: B
  121. mov al, [rk]
    6 a0 N) ^. E: e6 T: p+ v* q5 U# d, c
  122. cmp al, 1# P2 J! h5 p3 K  H
  123. jne  casemo
    : ~. Y  w( e3 d+ m5 Y" j$ R) R! z
  124. mov [okcheck], 1
    : }# \4 f$ l: i9 \( [$ \8 T
  125. mov al, [pass]
    / \- o" @) p. I9 x. h
  126. cmp al, 1# u; W" E6 x0 R) L( Y
  127. jne  casemo
    5 P2 X9 W* _3 E
  128. mov ax,0002h3 ^+ k0 G5 T0 A3 {2 g' a
  129. int 33h) \) t' V+ j+ B5 v8 _# [; f, ]" @
  130. call cleascr4 p/ D! ^- p: U* Q0 R
  131. : [- o" K' W# z( _$ z& n0 ^
  132. call oldint$ T0 Y- q* U7 _" Q$ S9 g& l5 D
  133. mov ax, 04c00h
    9 n4 H9 O. i$ O" M$ G4 B
  134. int 21h
    * P3 l1 }) {6 @% X' T

  135. 9 S! ]6 e' o* R0 w! }
  136. okexit:9 \: u5 {" {2 i
  137. mov ah, 4ch
    3 Z( }8 i' D1 B' |9 t& r3 K
  138. mov al, 02 z& ]# {1 ]0 V+ }
  139. int 21h: J2 a, F0 M' j- P: d( V
  140. listl:                                 ;Show ON
    % r9 i  Z- Z( {4 b" M- |8 F
  141. pusha, b. e8 _0 ?1 h/ f' }8 P1 G8 H
  142. mov ax, 0b800h
    . `3 B, X4 P; |
  143. mov  es, ax
    8 A0 n( o6 A8 \9 x. F
  144. mov ah, 47h
    3 I' j" c& f" c7 O2 H: G
  145. mov al, 20h3 @# U/ ^' R) f1 H* b- I
  146. mov es:[si], ax8 ^: G" D' X5 n2 O5 [
  147. add si, 02+ Q8 E7 ^: j1 x- t# ~8 z" X4 m  d
  148. mov  al, 4fh
      L) E8 s- ?, m% G
  149. mov es:[si], ax! j6 L5 g7 \6 X& M3 L2 u
  150. mov al, 4eh
    / }% A0 _  M5 o/ p- P4 w4 T3 b
  151. add si, 02
      _, E. z) f% I* K
  152. mov es:[si], ax) H# d: r* o' }2 v
  153. mov [lk], 1
    ( |2 S& U$ O' h( n
  154. popa
      B& s. u% m, _! S8 ^( C) L
  155. jmp testr
    # p! b9 ], V4 y4 j* s1 g
  156. listr:                                 ;Show ON
    - Y0 l: c, P0 [; V/ V
  157. pusha: J* A# @& w" O" _0 ?  R9 O2 _
  158. mov ax, 0b800h# M, O. j) _/ A# d5 C
  159. mov  es, ax
    1 r0 B8 b9 N+ b, A
  160. mov ah, 47h9 \8 h, n+ ?5 Q7 y
  161. mov al, 20h) f: }7 l( t4 z# ]; Z
  162. mov es:[si], ax* m1 t4 W2 ]/ }9 M
  163. add si, 02
    , ^2 X  X- M# N2 @7 D6 M
  164. mov  al, 4fh
    5 T' U& i' t8 P, x
  165. mov es:[si], ax1 G  f/ g- l, U" S5 w1 D3 S
  166. mov al, 4eh
    9 e* B/ j7 h! K4 Q. e
  167. add si, 02
    , y/ C7 v' s7 ]3 N8 f0 [) w
  168. mov es:[si], ax* ~$ Z' P  q4 G1 `6 {# @
  169. mov [rk], 12 h0 |' A' M1 j; M  }$ q
  170. popa
    ( t+ T0 m  v/ u2 C$ N" O) t: [
  171. jmp  casekey
    " r* o. }1 z; \& L: E! O

  172. 5 m5 g0 y$ d; d& A7 K& s2 v% F* j4 i  Q
  173. nlistl:                              ;Show OFF9 D  I/ H6 K8 P5 p# q
  174. pusha   
    $ b) @* Y$ a1 N3 M+ P
  175. mov ax, 0b800h: _, L  t. A) E8 D7 I
  176. mov  es, ax, t$ h) p" p7 F( O' `
  177. mov ah, 17h+ D0 O! F' E9 C
  178. mov al, 4fh
    ! b7 ?0 s# h5 h( W
  179. mov es:[si], ax! N) b# r3 U2 l! k6 L
  180. add si, 02
    7 |- g* Q# f) w6 ], M* s
  181. mov  al, 46h
    : G) K! B5 Z! H7 O) I$ v
  182. mov es:[si], ax  d. y0 I* E* _4 I
  183. mov al, 46h
    ( z9 o# c# l) y$ s) q: t$ o
  184. add si, 02: V! W- g# H* f. F7 f+ H  K6 ~
  185. mov es:[si], ax, d2 Z. T4 S/ k; N% ^
  186. popa5 A( ], l5 `3 @( q6 T9 V8 U
  187. cmp si, 1840- a! H8 k; Q$ w! @9 y
  188. jae casekey
      {; J3 r6 j3 V7 I- q
  189. jmp testr
    + S) C3 C5 Z" @+ x0 y: p8 ?0 e# }% E

  190. 0 Y, {. o# M- [( \
  191. kpress:                             ;Check key press if press<ESC> then EXIT; `" |8 n) [- O4 c& E5 c
  192.         cmp     ah, 01h             ;and return a error  z9 r3 D- ~( ], b
  193. je exit1
    4 k0 G  q" N. j% c9 f% Q. z" t
  194.         mov     ah, 0ch             ;if press other key then clear
    + ]9 ?# m3 [/ t# V0 G& B* n
  195.         mov     al, 00              ;keyboard buffer! C& [. N8 M$ }& u, o6 Y  |
  196. int 21h5 X# N: e, q' x; [
  197. jmp casemo 1 E2 Q6 j, s6 _; ?

  198. 3 G, N9 T8 ]0 R& T$ j. n2 o
  199. errormsg:                           ;if mouse driver no install
    * V& U$ p, e' G
  200. call oldint+ L8 E4 j. G; ]2 p
  201. lea dx, offset emsg" M# @) j1 r% z( c
  202. mov ah, 09h
    6 @5 J; E6 y  D. Y
  203. int 21h
    # _2 E4 K/ B4 O7 y  i: k# f
  204. mov ah, 4ch) m! K/ V6 W& h) F; Z. H
  205. mov al, 2
    * t& C+ A9 R7 q& I2 b
  206. int  21h4 J7 }" T4 H7 u! f) p6 k. [4 i+ M

  207. # m, c8 B3 v" D2 g
  208. exit1:                              ;error exit6 W1 F3 u& X. {
  209. mov ax, 0002h
      L6 E8 `4 Q- z: \/ }/ }! f: j0 M
  210. int 33h
    / c2 f/ S( K2 j$ X4 n2 o
  211. call  cleascr, x' F7 f$ L. H3 r. W
  212. call  oldint
    4 H; O& r0 }3 h: Y* x
  213. mov ah, 4ch: m2 I3 k: v1 Y  m, L% Y4 B
  214. mov al, 01' W# {0 L: K$ B
  215. int 21h
    & ?) ^% X2 T+ S+ o4 J

  216. , J) p$ X( s) X( e8 s: N
  217. cleascr proc    near                ;clear screen6 L+ B; @: F& q! [$ C
  218. pusha
    % q' @, ^5 C3 H1 ^
  219. mov ah, 06& R+ {0 `) m7 N/ r- Z. `. M
  220. mov al, 0
    , l( o" f& d4 y. _8 `
  221. mov cx, 0
    # z% y+ s& f7 T1 M& V2 ]6 R
  222. mov dh, 24
    0 F3 A! C7 N- M3 l9 S' H6 C. y: J
  223. mov dl, 794 u2 |' k- M6 f) X+ f0 m* e
  224. mov bh, 07h! ]  U( w( U; W% O' x* V1 e1 Q
  225. int 10h
    4 B  }) r0 e, r
  226. mov ah, 02. L  k1 p+ Z& ]) W2 y# g
  227. mov bh, 00
    ' r' Z0 q1 u$ i* I0 j! A, z; T9 N
  228. mov dh, 0" h0 ^1 ]3 V% ]
  229. mov dl, 0
    * Q1 I. [6 r  d( k( z1 {1 Q+ o5 k
  230. int 10h/ _, V# o  k# M. [& M  ~
  231. popa
    5 u( A: _# O/ ^: o
  232. ret& f/ j4 K% g/ U' |
  233. cleascr endp
    ( ~: B1 [7 r' a& ?% S

  234. # W& z1 N+ u+ T( }: X+ [
  235. showmsg proc    near               ;Show info
    , |( X9 y9 F1 h' d/ K
  236. pusha
    ' d1 S9 H& {& ^% r/ T$ n
  237. lea di, offset showms- s: B. ^. d2 M& D+ S; `; `! S
  238. mov ax, 0b800h9 A# `9 {" E1 g6 k1 A6 J2 w6 R
  239. mov es, ax
    & Y9 \! L7 {5 c7 C- j* V
  240. mov si, 0' ]% j; j' o; v: n7 z
  241. mov cx, 4805 U: `" U8 k. M; p
  242. mov ah, 07h4 M. a) F5 m' `- @; ~2 y7 u/ d0 k
  243. @@:
    ! L5 x4 R' f0 z6 O
  244. mov al, 20h
    8 t, K8 W3 V1 Q5 N$ @$ |3 y
  245. mov es:[si], ax/ K' ~( T, a) j' K* K. B
  246. add si, 26 {2 t: ?' u& p( K" ~  K: X/ W
  247. loop @b
    * q( [3 P4 n  \% k. w. u
  248. mov cx,880+ L: P- U8 Q) Q1 }5 Z5 @, w% I3 s
  249. @@:
    - @. b) m# `1 U# q1 S
  250. mov al, [di]& s) \1 Z0 ~+ R7 F- S
  251. inc di
    + B* E( k: m+ {' E. U
  252. cmp al,20h6 l' r' e8 h/ Q/ T
  253. je showch14 ?: O  l. q( r# u% k
  254. mov ah, 17h
    ; g6 t5 a& R$ F9 ]
  255. jmp showch3
    * R$ j6 z6 [! G& g
  256. showch1:
    ' {$ G0 D6 ~0 L$ x/ K
  257. mov ah, 07h
    9 M+ v* ]; v' r& w7 W
  258. showch3:
    8 x4 V3 t1 n. a% D4 z' N; {! U: t
  259. mov es:[si], ax
    2 P6 U3 D5 D/ N& u  j0 c1 K: T9 X5 k. l
  260. add si, 2' Y$ X2 V4 a' T1 I8 V
  261. loop @b% K% n) ^5 o- `9 Y% M: b
  262. popa
    7 e7 W# o+ x" _
  263. ret& T/ J4 q9 H1 n; N, l& V
  264. showmsg endp
    8 S. C! W6 k! t4 J: r. H4 A. @0 |
  265. 3 P  D% f. O  c6 u, S/ g1 i! {
  266. oldint proc% i7 k8 ^* X% K9 J
  267. pusha0 x! e1 u' j1 J! b1 ]' L% c( P) f
  268. mov ds, word ptr cs:[old331]
      k" K2 s# Z3 o5 H( Q1 U. `
  269. mov   dx, word ptr cs:[old332]
    # Y! B3 M7 M# Q" v/ f+ z6 S
  270. mov ax, 2533h
    " G2 k# e" S' m8 Y
  271. int 21h
    ( |" K) J3 A3 E9 n3 s
  272. mov ds, word ptr cs:[old741]; W3 p! n$ g1 q' b' K
  273. mov dx, word ptr cs:[old742]
    & U, A( p" \  `" A3 K( w+ k
  274. mov ax, 2574h
    3 ^7 C  X6 V1 x
  275. int 21h
    + \8 r- U1 p7 ?
  276. popa
    : j5 g5 @9 N2 D% O, u$ e8 K5 d
  277. ret( z0 L+ f5 n* ]4 r
  278. oldint endp
    9 z! o" q! f: w9 f: E
  279. 2 a# `2 C( _0 z0 p  i2 g
  280. memmouse        proc2 `, w% y; E& N1 e8 ]: `
  281.         xor     ax,ax
      Y4 _- ?) N0 M3 ?7 C7 X
  282. int 33h& r  |0 Z1 n: h6 ]
  283. cmp ax,0ffffh  b+ |- P2 U' O  m9 }# I
  284.         jne     not_loaded
    ' W/ m5 d2 \1 C3 M
  285. mov [memcopy], 10 ?2 I9 [, ?" E6 f' S+ ~
  286. ret
      q1 D2 a) v8 h5 R6 j
  287. & @9 S/ P) |' n, A( F: n
  288. not_loaded:( d6 D# y! @' [0 a# P
  289. 4 R. E. c9 A0 J2 \8 Z- G# N. l8 n
  290.         mov ax,2574h% \4 ]4 h) T: @! A# y6 [
  291.         mov dx,offset new_isr* m2 h* P: @* A4 B, P4 K; Y. e$ W
  292.         int 21h
    + b' o+ Y! E. v0 t9 k  H: t
  293. " I5 h6 R/ I7 ~5 p- l( i
  294.         mov ax,2533h# S6 D1 j& N3 J% I$ w- K
  295.         mov dx,offset new_332 U) y! n5 q$ y/ v5 T
  296.         int 21h8 }' J! M: w2 q' I+ `4 ~1 t
  297. & x* n# d$ a& W8 U9 l* ]3 G: i
  298.         cli+ E' Y8 [9 U0 |# x. k
  299.   g, n5 _  h4 \" l
  300.         mov bl,0a8h
    ( o: ]2 ^' O( b3 q8 G
  301.         call keyboard_cmd
    7 L8 R- r  I! b  E* I/ R
  302. 3 x5 s. T4 p; J$ X  v6 e
  303.         mov bl,20h: s/ w3 j/ G) _' M  y% {2 M
  304.         call    keyboard_cmd
    * `& p. ]2 ^/ b5 i! ]
  305.         call    keyboard_read1 {' v/ e; U' z7 J: Q1 b9 C
  306.         or      al,23 X% u2 I' M- U* [3 U% S7 u
  307.         mov     bl,60h  {, O4 B1 [9 @& b9 t- t" V% C' H6 A
  308.         push    ax
    - ~/ L' q3 B( H  R" T
  309.         call    keyboard_cmd
    5 i+ a/ D; s7 z5 R: ]/ H
  310.         pop     ax( a, [) w$ L: G% ~9 b7 y
  311.         call    keyboard_write
    5 p; y- ^0 z6 u5 i6 ]+ ]; B/ S. f
  312. . m: o8 F; ^8 u4 g; k( P! t
  313.         mov     bl,0d4h  H, E3 s4 i+ h! e
  314.         call    keyboard_cmd7 ]2 I& d2 p- G+ K
  315.         mov     al,0f4h
    6 M/ S9 Y! x4 s' Q
  316.         call    keyboard_write0 Y4 P) W! Y" h

  317. . K) L: E5 _4 w4 O4 d
  318.         sti
    * U, H- h3 n* q# O& s- b, W7 V
  319.         ret* H2 T3 Z  o. @+ W
  320. call_user_isr:
    $ d' _( ]1 e) E% Q& b* x
  321. db      60h
    & W% p; B- t. [$ Z5 y0 K
  322.         mov     cx,cs:[pos_x]& V2 R7 N' _. K
  323.         mov     dx,cs:[pos_y]
    2 V0 c& @( b. @+ b  c8 L) w
  324.         mov     di,0 ;cs:[x_move]; Z8 E# ?& g" V& R5 s7 G3 f: u: S
  325.         mov     si,0 ;cs:[y_move]
    6 _( X4 N7 t1 ~5 K" D
  326.         mov     word ptr cs:[x_move],0
    # T+ F; x" P* t  N5 K
  327.         mov     word ptr cs:[y_move],0
    3 q. @, ?$ h# Q4 R$ m
  328.         mov     bl,byte ptr cs:[buttons]
    - A) ~* P% c; R3 f# j2 B1 m
  329.         xor     bh,bh! L) T! Z- K2 d3 k% C: d9 O
  330.         call    dword ptr cs:[user_subroutine]
    4 V0 e" ^$ w$ ?
  331.         db      61h! \3 S7 d+ L  y3 G
  332. ret
    7 }7 K- X& m: l/ W; n  E
  333. new_isr:5 p" R8 u' ], t. k9 ~8 C4 n8 F
  334.         pushf/ P+ I% \( J- r) k' z/ A
  335.         cli- \% H( F, H3 r
  336.         push    ax/ r6 n$ w# P- L" M
  337.         push    bx5 ?" H, ]' I7 S9 z$ Z
  338.         push    cx
      Q0 F$ t. K" ]4 y6 O" E# X
  339.         push    dx( i) `! v9 b. l! S1 p# j* W
  340.         push    di
    5 E& a4 K' V. i( }
  341.         push    si% p, i6 @5 f5 V5 ?
  342.         push    es3 W+ r1 L: e- ~& ?2 D
  343.         push    ds$ h) j# O9 U- G& ~9 _% ~' ?
  344. ) u) H  X( h5 |% s0 G; p
  345.         push    cs
    6 J' T; p6 ^. F" J5 ?6 t9 A. m
  346.         pop     ds5 G4 g7 U6 R$ s5 e

  347. : f; p1 l$ V( |* A6 Z) J& A
  348.         mov     bl,0adh
    8 ]- A9 j- O% F, ]( Z
  349.         call    keyboard_cmd6 |. ^& K+ q6 Q9 f! \

  350. 4 h( L# L9 ^  q' f6 \- z
  351.         cmp     byte ptr [first_time],0
    0 ?3 L4 s2 U+ T1 l2 ^/ c. ?
  352.         je      not_first_time
    3 n& Z$ S" H& E0 D! ]9 z  H1 s

  353. 2 ?) V% b" x1 f7 M# ?6 _. a$ R7 ?
  354.         mov     byte ptr [first_time],08 c2 |: A3 p9 _4 `9 [& S. j
  355.         call    keyboard_read- B. U2 H0 y5 e
  356.         call    keyboard_read5 i9 }; A* K. S) v
  357.         call    keyboard_read2 m$ D, X! q( y9 M  ^& `0 H( y
  358.         jmp     no_show# E; a. _9 j5 G, @

  359. - P. g8 e9 _; Y7 z# ~/ z
  360. not_first_time:
    5 ~; G$ S, j" ~9 l3 A* a
  361.         mov     word ptr [temp_mask],0
    0 A3 j3 x( n% @: \" M5 b: x
  362. ! t- e) D3 c3 ^% X$ b
  363.         mov     cx,[pos_x]
    ( {3 O) f4 L/ K6 q) i. D6 K9 q6 L. v
  364.         mov     dx,[pos_y]
    1 R: q& x# X$ X7 g: [! T  Y3 ~
  365. ' q) m$ U& _  o1 ^2 H+ ?
  366.         call    keyboard_read& l; M' {1 {6 m; i
  367.         and     al,7 ;31 t3 f) e* B+ F' x
  368.         mov     ah,[buttons]6 o9 E9 e* [. \" r* n- i
  369.         mov     [buttons],al' w4 `1 K% W8 b1 b
  370.         cmp     al,ah
    $ |5 P& F7 E+ y' @% b3 ^
  371.         je      no_button_change
    7 Y  C0 N$ Z  a& o! e+ z
  372.         and     al,3* |) s# t* b6 e. n
  373.         and     ah,30 P+ x$ I3 I% P# Y: s1 k9 K) P8 S
  374.         xor     al,ah$ D3 G, }- r, F2 t+ p
  375.         xor     bx,bx' ?' W. E0 k( w
  376. ; c' i# {5 b9 b
  377.         push    ax# e5 B' H! E1 [' s/ a9 v
  378.         test    al,2; M8 K9 x# w( |& B0 `
  379.         jz      no_right_button_change) G" t1 k: u8 Z6 ?' _5 y# |
  380.         and     ah,2  _4 W& {9 e  t  r3 i2 P
  381.         jz      right_button_pressed2 l3 B4 x, ?" T* f* X5 s: |! M
  382.         or      bx,16
    / l7 v, ^4 k2 W" p& }
  383.         jmp     no_right_button_change2 ?* C2 r' J  ?6 Q  ]8 q/ u
  384. right_button_pressed:
    ! F. f6 d9 K/ ?. `+ r
  385.         or      bx,8+ v) `* K! k  I9 D& ?' [2 N2 T
  386. no_right_button_change:
      d" M6 s% c1 c% @, \, r5 ]- X3 L

  387. ( }0 v) w3 S7 u9 k
  388.         pop     ax
    & g1 Z7 @8 o) b( G( F+ X) P, P5 @
  389. ; Q$ C* j4 W1 j7 P. ]% x
  390.         test    al,1: X: W' n. q" s4 i
  391.         jz      no_left_button_change: }9 B; [  h. v/ J3 S# E
  392.         and     ah,1
    ) [8 \7 l( E+ U- s
  393.         jz      left_button_pressed
    " a4 T; W8 h# h3 q3 r% |; Q
  394.         or      bx,48 T; H$ Y4 a5 ]* G
  395.         jmp     no_left_button_change% V) L* h+ @# j( U! n
  396. left_button_pressed:
    2 a7 e, H+ n* y' n" w+ U* f
  397.         or      bx,2
    / v& x" r% D* x% \4 H4 P
  398. no_left_button_change:
    ' ~9 ]: @' O& P. k0 @; P2 g

  399. ; M% f4 Q  M3 D2 @' e' s
  400.         mov     [temp_mask],bx$ d6 z1 j, ?& m

  401. ! f5 \/ i1 a+ G
  402. no_button_change:
    ! s' Z7 a( F: ?# X1 x
  403.         call    keyboard_read
    3 n) e: u1 _, \1 M
  404.         cbw
    + s$ g/ d. @% v2 h% U, d9 [
  405.         add     [pos_x],ax5 v2 k5 |3 E+ H# i8 L/ w
  406.         add     [x_move],ax
    ) R* B* R& l6 |/ C8 K- v) G4 k4 Z4 ~
  407.         mov     ax,[x_min]' y6 J+ O8 q  T
  408.         cmp     [pos_x],ax9 C& w( ~! @3 B9 X: Q3 c1 V
  409.         jg      good_hor1
    7 ?: }* M8 I. U  V0 D5 Q& ]
  410.         mov     [pos_x],ax- ]! B6 `, z8 P1 n# c3 e# w
  411. good_hor1:
    2 E, x2 \$ L, H- g0 ?5 H% h
  412.         mov     ax,[x_max]
    ; z/ \, a- ^6 I5 m2 z1 C& b4 {, N
  413.         cmp     [pos_x],ax% i* j$ B9 O! S* ?6 Z% @
  414.         jle     good_hor26 }" d' c1 m3 ~/ Y9 S
  415.         mov     [pos_x],ax
    7 q8 [" z6 S# f8 z1 ]6 ~
  416. good_hor2:
    9 D! U0 d" s8 S  \
  417. , Y+ z  G! O; X
  418.         call    keyboard_read3 \0 d) s3 @& k1 e3 ?8 t
  419.         neg     al
    : D; R" b+ q% L6 n, l3 i+ c4 N$ [
  420.         cbw4 o- g1 b3 f4 m. ]6 V
  421.         add     [pos_y],ax
    ' V: o' H0 f+ i+ K* A0 G  _
  422.         add     [y_move],ax
    8 O8 E+ Z+ F& x9 K$ z+ m" L
  423.         mov     ax,[y_min]
    " B0 V: r$ A! S+ R
  424.         cmp     [pos_y],ax
    ; @6 Y+ f( v- y" d8 Q5 n
  425.         jg      good_ver1- D' D: h8 L8 v/ Z' t
  426.         mov     [pos_y],ax  h. q( k2 C( p9 p8 c& m
  427. good_ver1:$ o/ c& r, U7 _; H% h; |; R9 }
  428.         mov     ax,[y_max]
    2 Y. \' t! G* t
  429.         cmp     [pos_y],ax
    , t  K5 L/ v' C. w
  430.         jle     good_ver2
    0 Y1 E7 `  O- z* f
  431.         mov     [pos_y],ax; z( `: K# _# p1 q" G( \5 B3 k
  432. good_ver2:' x+ J: f' g( D- P

  433. 0 b/ \# m& N8 {% ^' q& M4 V8 e, t
  434.         mov     ax,[x_move]4 R1 F; R8 O, E
  435.         or      ax,[y_move]3 i. ~6 {; b1 W8 c$ N( Z" j/ y
  436.         or      ax,ax
    3 A$ ^4 F% t$ {  M0 f8 X3 q1 [
  437.         jz      no_change_position* o( S/ Y) E+ }4 ]
  438.         or      word ptr [temp_mask],1! c# f$ _/ o7 C& C6 j8 }
  439. no_change_position:
    2 p$ }4 ]2 W6 P" x

  440. - U( N4 Y! ~; j# t+ ^9 h. {
  441.         mov     ax,[temp_mask]- K* W8 V* @, T* ?! `
  442.         and     ax,[user_mask]5 U- V, A$ h+ V, g4 u: F4 ^6 P- H
  443.         jz      no_call_user+ J2 H! \' _- l3 n3 t
  444.         call    call_user_isr6 l! Y) I2 `3 ^) o5 E5 C; Q8 i+ J7 {
  445. no_call_user:
    + r4 U! Z0 p" S+ o
  446. 1 K7 o# j$ X0 l* s; ^) ?$ N. A$ [
  447.         cmp     byte ptr [sm_flag],1' M/ v$ p7 V" P( E3 |3 h/ @6 t
  448.         jne     no_show  |% N, i+ n4 K( g3 g1 I5 L1 K8 ^
  449. 3 Q; ?/ x+ G0 m5 m- H/ s. z
  450.         shr     cx,3
    " H6 t+ p$ k9 h; q' X4 ~, D
  451.         shr     dx,3& A* ]. K0 w8 x: L0 s  n. i1 p9 Q
  452.         mov     ax,802 v* V* n, B& w
  453.         mul     dl0 i* a+ J0 E0 k/ p' s
  454.         add     ax,cx/ t) }2 M) G& a- ]0 F0 H
  455.         shl     ax,1
    4 ?. \$ h$ a  I5 C. e
  456.         mov     di,ax
    9 ?- B! k" W# O
  457.         mov     ax,0b800h1 W- }! I# e( l" A2 n9 s+ k% X
  458.         mov     es,ax4 H  ?+ h" |0 {- \% |
  459.         mov     ax,[save_char]
    + P! q& ~+ p: X* a& \) p+ h+ c
  460.         stosw
    ; P6 T4 w; A' X/ L0 \* J
  461. # B$ R: x* v+ @6 p4 R. E) X
  462.         mov     cx,[pos_x]
    ' B; h4 z, O0 p. s
  463.         mov     dx,[pos_y]
    7 B- ~6 \( @1 ]  w# S
  464.         shr     cx,39 B; m. U. x7 |! h4 _; R
  465.         shr     dx,3+ e6 w  P: [" t$ P4 J/ E; v
  466.         mov     ax,80
    " k( A# p+ R1 n9 ^$ V
  467.         mul     dl7 t! K4 [& ^+ a6 n
  468.         add     ax,cx
    0 B( D5 [% L0 F- G
  469.         shl     ax,1
    $ i; ^1 Z" {2 m5 F  f  J/ }! c
  470.         mov     di,ax
    & {. [' ~. f2 g, Y& b; x  |
  471.         mov     ax,0b800h
    0 ^0 v1 s7 V- }$ g
  472.         mov     es,ax9 s" ~5 I( _+ J9 S! O) N9 ]) m
  473.         mov     ax,es:[di]
    8 g- v( N2 t% |5 _( I" v
  474.         mov     [save_char],ax
    0 @( |1 j3 K  t9 l2 p# B9 j  O
  475.         not     ah, u; v! k1 f  A! P  e# f0 Z( p5 D
  476.         and     ah,7fh
    ; _8 K! B4 _( u7 F. s! _! D
  477.         stosw0 p6 ^2 _# X  H% m0 [
  478. no_show:
    - H3 ^7 h, S. {8 |6 u& c
  479.         mov     bl,0aeh
    ( k; p- p1 u' P( J% J" P# K' a
  480.         call    keyboard_cmd
    1 ]; K9 c0 t  v+ o$ K% q4 f& Q

  481. $ D$ U7 J- B  b, U# C
  482.         mov     al,20h( F+ F, }) q2 s3 h
  483.         out     0a0h,al
    4 g  B3 F: ?3 B
  484.         out     20h,al
    0 k( `8 s. F2 @9 z
  485. 1 k# f, K+ e; y2 p% g0 z- ?
  486.         pop     ds
    3 g9 a' V5 t; p6 P& _$ t" `+ y' r
  487.         pop     es/ I* v: w4 s7 [- B" \# @4 @0 o
  488.         pop     si
    / Y+ [% m* V/ P5 \4 r: D1 S
  489.         pop     di
    8 t( {, [! @" p- |1 r
  490.         pop     dx
    , H  O$ _  K- k
  491.         pop     cx
      P) d# e3 L% A0 z  U1 u
  492.         pop     bx
      B( J: M0 K+ i( Q0 c! |4 \
  493.         pop     ax
    : a2 w* |, j+ x! `0 x! J$ z
  494.         popf, G6 I, W) R8 H# C7 B( u! W% {
  495.         iret- [! F; p# ?+ c- Q" O
  496. $ X& A# }, F9 J2 m4 I; O' h7 h( a  B
  497. first_time      db      1
    - Z- t, m  ~- c, ?- V! B2 D
  498. buttons         db      0
    2 p* M& V. f6 g* @
  499. pos_x           dw      07 B) N1 {! T9 ^( c4 k
  500. pos_y           dw      0- L# G  F5 C! P  |
  501. sm_flag         dw      0
    $ e4 M9 g2 b: Y1 ^3 o
  502. save_char       dw      0
    8 Y+ h' y& p& l) V, x4 a
  503. x_move          dw      0! k% e$ S5 R3 d" [  k5 `9 G
  504. y_move          dw      0
    - ~+ a1 }7 x- [4 f6 v
  505. x_max           dw      639* c9 W/ n5 z" i' r
  506. x_min           dw      0
    ) A! j2 ]- u5 C$ H+ Q5 G. D
  507. y_max           dw      199. N* Q  o! q( X2 d* c! M/ @4 h+ N
  508. y_min           dw      0
    4 q( P# m9 B2 y
  509. user_subroutine dw      0,0- y- P3 c& W! I- f* Y1 o5 M5 v$ b
  510. user_mask       dw      0
    5 ^9 w" t7 e+ K5 }
  511. temp_mask       dw      0+ t4 G0 G1 y8 d: v
  512. # j4 `' Q; v/ F8 _/ V+ X
  513. keyboard_read:
    2 [3 U( f/ R7 ]$ \6 c
  514.         push    cx
    ' Z4 ^! @4 P/ y/ e0 ~# T9 Z6 g( v
  515.         push    dx
    : `9 {$ T( t3 i. Q1 n) _6 p
  516.         xor     cx,cx
    " {% i) z/ D, C. k7 D2 J: z- F
  517. key_read_loop:/ y( p& b8 V! G) K! S! Z  z+ k
  518.         in      al,64h
    9 a3 c8 x; @  c9 @( n
  519.         jmp     $+2- @5 w* T( J, c3 i, |
  520.         jmp     $+22 h! K* z: V' y- f, z
  521.         test    al,19 b% s7 X, m6 }2 y, R6 V) v
  522.         jnz     key_read_ready
    ; n. s' j* z  D  l: p
  523.         loop    key_read_loop
    ( S* M' b9 X4 q0 \  W0 c0 y3 {9 M
  524.         mov     ah,1
    & C2 U1 U2 C9 ^! h% L* D
  525.         jmp     key_read_exit
    5 N2 {* f% M# j9 r$ c$ y! Y7 X
  526. key_read_ready:6 H& j( b/ D# N7 _1 O2 m
  527.         push    cx
    ; J4 K* _$ S7 P6 U
  528.         mov     cx,32
    7 ]$ H# `3 \% |0 b5 T& X
  529. key_read_delay:6 x7 g1 i: v  ^# j3 V: ]' \0 E  b
  530.         jmp     $+2, h6 d; O3 [5 f7 W$ B
  531.         jmp     $+26 J3 y4 y" e# Z$ _1 p7 B
  532.         loop    key_read_delay
    5 u$ f1 F' G$ p# I
  533. 7 p. ~* ]+ ~; H# |1 @% g9 a7 L5 Z
  534.         pop     cx: ?' S; M5 p/ a1 K

  535. 5 _* `3 h* b# ]2 @. o2 h* H
  536.         in      al,60h
    : ~9 B  j% l" {2 l/ ~, `
  537.         jmp     $+2
    0 H& \1 Q- G) N6 l( o
  538.         jmp     $+2
    : b# M9 s4 L# i3 P0 p
  539.         xor     ah,ah
      Y; [% i2 v. }- m- h8 O$ i9 F
  540. key_read_exit:
    9 ]$ W+ u6 H2 }+ c
  541.         pop     dx& _1 q+ f2 P$ Y$ \
  542.         pop     cx' E# _& b  C" C& T
  543.         ret
    ) c1 _0 @) I! J# M. m5 b0 O
  544. / E: [2 U: o8 |' x! F
  545. keyboard_write:/ M- i" N/ D1 t  b9 z* n! Y+ Q  E& O
  546.         push    cx
    & w( L; X7 s6 I5 a" J/ m
  547.         push    dx
    : x" T% o* u8 N, {; j2 }. g
  548.         mov     dl,al8 T  l5 w( X, o- i$ m
  549.         xor     cx,cx
    - L# p' X9 {* C) @% z' ?( J/ r
  550. kbd_wrt_loop1:6 \" c9 q1 D; s1 K
  551.         in      al,64h
    # c' Q9 f, H9 u4 N0 V6 W
  552.         jmp     $+2
    ( y. W3 |7 N& H4 p2 q6 k. @: |) P
  553.         jmp     $+2
    # I+ C3 ?8 [* h1 e# a
  554.         test    al,20h
    6 d& H$ Z) I% g: ]- Z. u
  555.         jz      kbd_wrt_ok1
    4 H" k, X" N  U. o

  556. 4 ?6 D' g* L* N
  557.         loop    kbd_wrt_loop1) p6 T1 v3 s( P/ A
  558. ' V. P% o9 R1 X: M4 w" E5 x4 I
  559.         mov     ah,1
    ! w' {! @9 F) v
  560.         jmp     kbd_wrt_exit
    + m5 U- o5 l- @
  561. 3 @1 y& ~. e3 _, x; ?' C( a/ A
  562. kbd_wrt_ok1:
    * ~# g" ?  ]$ `8 {
  563.         in      al,60h1 M) |9 a9 _" ]: F7 l) ]( k

  564. - O1 F" l. M! ~( l4 B/ B
  565.         xor     cx,cx6 C8 Y- A5 ]# c8 k+ M% W
  566. kbd_wrt_loop:9 S7 ~  V- x( k- e" g3 j
  567.         in      al,64h
    , u( i+ R& p% U5 O
  568.         jmp     $+2
    ! \# {" R; s, G
  569.         jmp     $+2
    # A+ B2 {' [1 j
  570.         test    al,2
    5 u, f2 }3 a& \. @' M
  571.         jz      kbd_wrt_ok# W7 O6 |' ~3 v4 _

  572. ( f' ^! f$ _/ j2 Q
  573.         loop    kbd_wrt_loop
    : `# Z; e  e4 A2 W* B( R
  574. 4 J. m% V3 I6 C5 K# c9 n
  575.         mov     ah,1
    - Z: ~  H3 G6 a8 B& C7 E
  576.         jmp     kbd_wrt_exit' t! E6 S  y8 e: p1 J# d, S, u
  577. 4 M  o% w* J% T0 \" ~8 h% ]
  578. kbd_wrt_ok:
    * @" Z9 B0 ]& }$ r$ b
  579.         mov     al,dl! N9 L  T0 Q% w6 l
  580.         out     60h,al
    " C+ A  H% ?. e7 c6 Q) v) j) l/ J
  581.         jmp     $+2
    $ t* O" P  K% }
  582.         jmp     $+27 d& n( k9 G  m. L5 l4 }9 z

  583. ( c/ M( k! ^" G" N  e. S4 ~) h
  584.         xor     cx,cx
    % q% u: [9 l4 {, r, X, Z! `  K9 O7 d- w
  585. kbd_wrt_loop3:' A9 P6 S# }3 b# a* O
  586.         in      al,64h
    , S$ E/ ~, `5 x% `, [" z/ W
  587.         jmp     $+2
    . V% ]  s; }$ \# B5 X+ M+ E; {
  588.         jmp     $+2
    & ]; T4 O# b, \8 b: F
  589.         test    al,2! B/ ^0 k4 A4 V2 [& o
  590.         jz      kbd_wrt_ok3/ A% D9 [: b0 v8 c
  591. ( L! o0 }3 Z- e% [# @5 z
  592.         loop    kbd_wrt_loop3
    9 L* |$ v2 ?' z+ p
  593. " w3 R& u8 z+ ~# H
  594.         mov     ah,1
    . J. @6 x3 g) l, L# [, p, p
  595.         jmp     kbd_wrt_exit
    6 P) P# J0 Z% @1 V

  596. 8 e7 t4 l3 N5 p: V3 B
  597. kbd_wrt_ok3:% o  A5 o" C$ v2 q7 m
  598.         mov     ah,8: `2 Z1 `# A* a- N8 T* A2 w4 M
  599. kbd_wrt_loop4:
    ; c- b) S7 f% @
  600.         xor     cx,cx
    * K$ Y+ D' h9 ?$ J1 ?( S) @4 R+ Y3 ]
  601. kbd_wrt_loop5:! r5 h# t1 c8 ^0 B
  602.         in      al,64h
    ; ^6 |) i3 x1 \9 G9 g1 R1 E
  603.         jmp     $+2
    5 |+ c* s6 s* h/ s' ^4 l9 U. W
  604.         jmp     $+2
    3 z* L- s8 ?6 _* u9 ]" f
  605.         test    al,1. l; u6 H& _* r: `6 C
  606.         jnz     kbd_wrt_ok47 L  a4 m# b6 p9 n9 z4 v
  607. $ W1 ?4 _4 G/ z( ~3 C* T
  608.         loop    kbd_wrt_loop5
    6 W0 |$ L9 v0 d; p" h$ l
  609. 7 F/ L6 q5 w3 N! ^
  610.         dec     ah& c- S* h( l8 s8 `4 Z" `
  611.         jnz     kbd_wrt_loop4  ]9 r' u6 A/ q& r6 n

  612. * r5 _9 _( R6 E4 s. e
  613. kbd_wrt_ok4:' I, Z# W5 I; J8 k3 L! ^6 o
  614.         xor     ah,ah
    1 b5 F. ~, r. ^  ~
  615. kbd_wrt_exit:
    ( A$ ?- n: H8 o. J" [6 Q! B: K! Z
  616.         pop     dx( c3 p" y; q; H0 F  y% y
  617.         pop     cx
    ( p0 @. ?  n/ U- [# M  o
  618.         ret
    ! x* I, m: Y4 y/ j
  619.         
    + c* g0 T$ J, H2 d, S
  620. keyboard_cmd:
    6 d5 _' t4 f0 H+ x' x2 D$ {0 e1 O7 p
  621.         xor     cx,cx+ I3 C0 M) J7 ]' c
  622. cmd_wait:! r4 W/ P( d8 z3 `4 @
  623.         in      al,64h
    , y* d; f( D  `; i
  624.         jmp     $+2
      p: G1 I- J& C0 w3 T
  625.         jmp     $+2
    8 n) S) G. p  ^/ f
  626.         test    al,21 ^) E9 |( [1 a" Y& Y& ^- W1 G
  627.         jz      cmd_send
    8 a8 R8 i4 E3 }9 C
  628.         loop    cmd_wait, c2 c8 @% ?5 u* a  |
  629. 9 Z& Q  D6 _6 I  D1 f% k
  630.         jmp     cmd_error% ^, g5 X5 o1 s

  631. / _, n# Q+ A7 Z7 Q
  632. cmd_send:
    1 T# z, ]$ |- O" T2 z
  633.         mov     al,bl
    ( u( ]* A1 s# i' \1 h  I
  634.         out     64h,al' ]8 M# Y4 e+ `8 X' y6 O% K1 U- `
  635.         jmp     $+2. q  S: _( w2 F6 B( \, e  y- k
  636.         jmp     $+2
    * B7 q9 B+ l6 G0 [

  637. : _; z0 x/ o8 k  K' U4 a
  638.         xor     cx,cx) \4 N8 p* R9 C9 p' E! W# d
  639. cmd_accept:- C+ C9 A' v  N0 |2 T/ I
  640.         in      al,64h. b" \1 r5 R- Z# W
  641.         jmp     $+22 U* q: A5 z3 I! h
  642.         jmp     $+2
    * h& P5 K7 ~; W7 t1 j1 L4 S
  643.         test    al,2
    : w; e; f2 ^9 F
  644.         jz      cmd_ok
    ( p' O" U/ P' X
  645.         loop    cmd_accept
    ) P0 T( j% j$ ]& T5 `

  646. 4 C7 m$ w, u3 _# q0 A  z, c* D
  647. cmd_error:7 P4 D; Y& [: x' B
  648.         mov     ah,1
    - s9 k) E0 C( t" m
  649.         jmp     cmd_exit7 r1 a- S) w) H% i6 ]# f
  650. cmd_ok:1 ^* M2 @+ V& U" O! M. F5 `  \# {# N
  651.         xor     ah,ah* C6 L5 j: q4 T6 h3 `1 k& i! o
  652. cmd_exit:
    ; {/ {1 C- u/ |, a3 R
  653.         ret
    " H- j1 r5 N/ V& q4 i# Y

  654. ' k: x/ x' m* V" F8 h' m
  655. new_33:* k( W" X* C1 U
  656.         cli
    ' L) k4 m) U# N4 U8 f/ M; G
  657.         cmp     al,0. v; `: K; ]6 Y/ t
  658.         je      reset_mouse
    % t& W, X6 |# @( I. y" x3 `
  659.         cmp     al,18 j" n5 }; U7 q  ]; L
  660.         je      show_mouse( p2 N$ q8 ]0 Q) B- v
  661.         cmp     al,2, {# x" Z; K1 C4 z! m  p9 X7 u
  662.         je      hide_mouse
    4 n/ u: o3 b1 M" t! Z% `
  663.         cmp     al,3
    , Z" M" S4 \1 X
  664.         je      get_pos5 [/ F! e8 h) @& w3 |; p* L* Q
  665.         cmp     al,4
    5 b" B3 [: c# D" h% [' J3 Z+ a
  666.         je      set_pos
    + J* j$ ~" \7 Z1 {7 K3 \7 f
  667.         cmp     al,7
    " p2 P8 n/ L% Y; `
  668.         je      set_hor_pos" O6 Y+ Y1 p, G9 q; U9 u
  669.         cmp     al,8
    7 J# a7 S8 H  E# a- X3 a
  670.         je      set_ver_pos, i. {: @3 P( ^' A/ C5 _
  671.         cmp     al,0bh
    * W, X8 P# i# p3 K
  672.         je      get_mouse_movement+ g) J5 ?; y' ]) Y* @8 g
  673.         cmp     al,0ch' f% S+ i7 d# f
  674.         je      set_subroutines
    9 m% g, S3 e# T: b8 q6 a+ N: m
  675.         cmp     al,14h
    8 P% i% Y6 s) O# `8 S
  676.         je      swap_subroutines2 {: i' P, N# Y; {, {
  677.         iret
    9 z0 |; N* ^* z1 r4 n; d
  678. 8 ^4 J1 U( k- _: Q" \
  679. reset_mouse:! W  L0 f8 Y* ~9 ^" E2 v* v# p
  680.         jmp     _reset_mouse5 P. l# K8 v; E
  681. show_mouse:3 q* x& ~: T4 L: |+ P7 z) }1 Y- o0 `
  682.         jmp     _show_mouse
    % R0 L2 ^. X! R' K
  683. hide_mouse:
    3 m5 P- j4 D4 @# I1 ?* M
  684.         jmp     _hide_mouse- h. N* r- N9 v, a+ w
  685. get_pos:
      ?( E6 D( h. W6 M
  686.         jmp     _get_pos& O  J* Q% l2 h& @
  687. set_pos:& x8 |/ @. Y4 C6 Y3 X( |$ G9 j, ^2 z
  688.         jmp     _set_pos+ g3 _3 S3 j1 l$ R
  689. set_hor_pos:( y& T/ b; {% ]& [2 X( w
  690.         jmp     _set_hor_pos! R$ o* |8 E# Q2 S
  691. set_ver_pos:- `; e7 N/ S1 t5 P
  692.         jmp     _set_ver_pos; l; K8 H$ R  r$ e7 `
  693. get_mouse_movement:
    # [1 t, k7 W& v% F, m& O+ ^5 f: S! C
  694.         jmp     _get_mouse_movement
    5 s4 k& x' ]3 q1 F! t7 N
  695. set_subroutines:
    1 b$ a! m9 I# s! U% v/ k
  696.         jmp     _set_subroutines
    6 b, k! N) q1 q" k/ j! _5 l+ Z
  697. swap_subroutines:- Y  `% f& `* t' \" ?' c& L
  698.         jmp     _swap_subroutines
      @5 l* U2 P; J, i0 j0 J
  699. ( ^( Q+ Q8 y( b- d1 b# f
  700. _reset_mouse:; v, P- {8 N( T% z- y7 m2 g) a7 k
  701.         mov     byte ptr cs:[buttons],0- s8 ^$ ^' }& \
  702.         mov     word ptr cs:[pos_x],05 v9 O% e  U$ \
  703.         mov     word ptr cs:[pos_y],0- g# \/ ^6 ^5 f+ u
  704.         mov     word ptr cs:[x_move],0) \1 |) h! G* y8 g7 O/ |  P2 \6 O
  705.         mov     word ptr cs:[y_move],0
    9 O  M& l, u4 T8 n: v+ o* D
  706.         mov     word ptr cs:[x_max],639; k2 ~: t0 x7 m$ a* B
  707.         mov     word ptr cs:[x_min],05 N  N6 o! [0 k4 w3 X. Q
  708.         mov     word ptr cs:[y_max],199
    . h0 i7 V, C* I( d7 d' F. ^3 @
  709.         mov     word ptr cs:[y_min],0
    3 \) S& M0 L8 Z: Z6 F
  710.         mov     word ptr cs:[user_mask],0
    : P  I1 s' c) {( L$ P) G
  711.         mov     word ptr cs:[user_subroutine],0# b6 e& w( A  j2 k
  712.         mov     word ptr cs:[user_subroutine+2],0
    & \( I: e# ^7 H9 e4 r9 |: X9 T2 U; `
  713.         mov     ax,0ffffh! }0 W: w1 c. ~: T
  714.         mov     bx,3( m) S/ c, D/ [& F0 l" l; m; B
  715.         iret! L& C( @3 g8 Y9 t4 g/ i1 ?/ G
  716. * T& n4 E  s, f
  717. _get_pos:
    2 C5 i! [; e8 s; F2 }7 ~
  718.         mov     cx,cs:[pos_x]) {" T- l& j  p: \
  719.         mov     dx,cs:[pos_y]) L% r8 s. O: M2 T( ]% @( e
  720.         mov     bx,word ptr cs:[buttons]5 b$ ^" r6 H2 P  O
  721.         xor     bh,bh1 b2 A" w1 h3 p" Q$ k
  722.         iret
    % d: F$ H' b- y9 l( r

  723. ( C1 {2 F. @+ t. _3 e7 {' X
  724. _get_mouse_movement:& {: Y, H& L. c2 z  j6 M
  725.         mov     cx,cs:[x_move]( R: ~# _0 d; y
  726.         mov     dx,cs:[y_move]
    3 [/ ^1 Z: h, [2 ]
  727.         mov     word ptr cs:[x_move],0% P- V: x% P$ d" k
  728.         mov     word ptr cs:[y_move],0
    & J- ?7 m& F, f
  729.         iret8 z4 N' k5 y- ]  Y
  730. 0 w9 W8 f% g9 j  d0 V# L* j
  731. _show_mouse:
    / |! C/ n2 g/ o& v
  732.         push    ax) v2 Z0 z' ~  H8 M. T' q: }" P8 H; |
  733.         push    bx, S9 }) w# ^% y( ?) D6 N4 n1 Q
  734.         push    di
    0 H% C% `& X# |& h) e/ X8 d
  735.         push    es
    2 K, E: @% t6 D: d! p9 O' I+ E
  736.         mov     byte ptr cs:[sm_flag],1  e, G7 z$ t$ u% Y
  737.         mov     ax,cs:[pos_y]
    ( ]& w1 [6 z( g. v& _
  738.         shr     ax,3
    . H2 V  P2 g5 s
  739.         mov     bl,80
    7 j4 x$ k/ O( a0 ?& Z) N* g
  740.         mul     bl) t0 V7 k. i1 V! L  O5 ]
  741.         mov     bx,[pos_x]
    1 q2 s- z4 o" q' F5 z1 V) L5 A; I
  742.         shr     bx,3( s( Y) V; }1 i: F3 \
  743.         add     ax,bx0 m4 _' S! Z. v' ?6 g. U, }2 p
  744.         shl     ax,1
    " {" [0 P/ C' J. t1 i
  745.         mov     di,ax
    / o% h1 V; p7 ?6 @" B8 i- j+ D0 r6 f
  746.         mov     ax,0b800h) @  r+ [1 N, L0 f( V
  747.         mov     es,ax: c! D3 L! q' Y
  748.         mov     ax,es:[di]
    + ], M/ h5 w  L/ Q7 P
  749.         mov     cs:[save_char],ax1 c) U: s( g7 L  R% X
  750.         not     ah" N6 S/ K2 ^. G; k) p
  751.         and     ah,7fh  ^: `3 t5 Q% e4 q: m9 r6 L
  752.         mov     es:[di],ax9 Z& n5 o- m/ P# A; G
  753.         pop     es
    ) {2 B% v+ I) ^7 J2 ]
  754.         pop     di2 S. \5 U6 a) A8 Z4 n- P$ B7 e
  755.         pop     bx
    0 \  e- ]! _$ b. N0 H' h% j/ X
  756.         pop     ax4 Y6 O! v$ R  N" Y
  757.         iret2 ?; j% [' s* _+ d; F2 z3 O

  758. + u; |, y7 L+ i5 B
  759. _hide_mouse:# U- C; y1 W% x  ^6 r. Z! s
  760.         push    ax
    1 o' G# p; v. r$ Z  m2 s; g; ^1 y3 Z
  761.         push    bx
    $ v2 W* C+ z2 `1 b1 z) p. M
  762.         push    di
    2 S3 e6 B* c0 @  U) b
  763.         push    es
    5 v0 B6 k' G9 r9 i
  764.         mov     byte ptr cs:[sm_flag],0( y0 R5 h6 u% q" x& u  K) u% k
  765.         mov     ax,cs:[pos_y]
    4 S" [. p  @0 x8 f# D8 u; m4 y
  766.         shr     ax,3
    ( o8 O) X3 c) E; D) ]. r
  767.         mov     bl,80
    / y2 C' }0 ]  J# J- B
  768.         mul     bl
    + r# I/ p/ N$ f/ V/ K, C
  769.         mov     bx,[pos_x]; Z4 k( N4 s6 _4 f) v. r1 @
  770.         shr     bx,3
    # ?: y& w+ ^; E) c
  771.         add     ax,bx
    - b1 F1 f' p" y5 `
  772.         shl     ax,1" D4 d8 ?$ {, }! x3 _( c
  773.         mov     di,ax
    8 ^1 T; M5 L: {; t) w% N
  774.         mov     ax,0b800h
    " g( U# D: C: g% e; B/ B
  775.         mov     es,ax
    , v( f" J% \+ M+ q5 C8 d% Z
  776.         mov     ax,cs:[save_char]! K! [3 a, F" {$ e% R
  777.         mov     es:[di],ax7 T; B( C# Z5 @8 ?- M' _
  778.         pop     es" K; f/ O( J5 p
  779.         pop     di
    . P! K# l3 K$ l) k3 f2 E3 \
  780.         pop     bx
    ; A9 H4 D4 x* Z5 s
  781.         pop     ax, M  c1 Q3 f* E2 r
  782.         iret  |6 M/ q; Y( U+ p2 q4 k: v1 V

  783. % X! Q! q; q5 `2 c/ Y
  784. _set_pos:& Z( G# B2 H9 v8 F
  785.         mov     cx,cs:[pos_x]
    3 ^7 d# d* n. Y6 W! Q& Y1 d5 }
  786.         mov     dx,cs:[pos_y]. g* q( Q8 B) G6 m0 U- F
  787.         mov     word ptr cs:[x_move],0( W5 B# n* i9 q  u1 \6 `
  788.         mov     word ptr cs:[y_move],0
    # N9 z- M7 w, B# f
  789.         iret; O% B* d3 d- b: n& ?" k8 ]
  790. 8 x5 }2 x4 W4 ?* {8 @; H
  791. _set_hor_pos:* k' I7 O( v9 P0 w) C% i
  792.         call    max_min7 ?7 `  ?( M4 \
  793.         mov     cs:[x_min],cx1 O) x0 H$ ]+ ]1 R  |6 s, R6 g
  794.         mov     cs:[x_max],dx
    3 P' H* t5 g! Q! L6 M
  795.         cmp     cs:[pos_x],cx
    : I/ P! K" G. H; g3 f  F  \
  796.         jge     good_hor_min0 W5 Y2 ]" @% T  d) r0 d) I3 f
  797.         mov     cs:[pos_x],cx
    , M7 ~5 |8 k& I( q1 o2 G
  798. good_hor_min:
    / x  p+ h) s0 I' h
  799.         cmp     cs:[pos_x],dx
    4 \: q1 `* J( w
  800.         jle     good_hor_max
    " L* f& h9 B- a3 Y+ [8 Q9 f
  801.         mov     cs:[pos_x],dx- B/ K6 V" W  @- m
  802. good_hor_max:
    4 V% S9 g' L# }7 y
  803.        iret7 G5 Z7 d  z: s2 ?1 ~

  804. $ T+ t3 G7 U# t8 @
  805. _set_ver_pos:& Q$ h0 z4 [$ o2 T6 @
  806.         call    max_min1 v/ ^1 ]% E+ f9 U$ w' S( [! i
  807.         mov     cs:[y_min],cx
    0 W6 b8 o8 F/ D4 q) L
  808.         mov     cs:[y_max],dx
    * h! E5 t/ M/ I  E# \6 `
  809.         cmp     cs:[pos_y],cx
    & t& l' m$ l( e
  810.         jge     good_ver_min5 e5 u4 {- W* C3 u; `0 s" ~
  811.         mov     cs:[pos_y],cx
    * w8 c  F# r# F% q% [1 J( w
  812. good_ver_min:* I" v4 p1 T7 P5 p7 g; T# G
  813.         cmp     cs:[pos_y],dx
    # I5 {+ B- g9 M: u. {2 h
  814.         jle     good_ver_max& A1 ]$ K) f1 N! a& x
  815.         mov     cs:[pos_y],dx# F! f" e* i7 A1 w1 k* b0 W8 K9 d
  816. good_ver_max:8 o: I8 @8 @* m, ~# X$ }8 {
  817.         iret
    - N/ e& y% g2 T' T

  818. ! o* m/ G, X& `: B8 i) q* z3 f
  819. max_min:3 j" w9 B9 p0 k# s
  820.         cmp     cx,dx! [. m- p; J" ^
  821.         jle     no_swap2 N3 A7 U; A$ O- I# c7 B3 c! I9 @( s
  822.         xchg    cx,dx: K! l) ~; w: k
  823. no_swap:
    5 L( j' }) u# ^9 }3 @+ Q
  824.         ret1 D) C. A* l& v: I: h% x
  825. % T# `) A  x8 ]! R$ |
  826. _set_subroutines:* Y+ N- H% K" y
  827.         mov     cs:[user_subroutine],dx
    + p# K4 F: M) w# r( Z3 r
  828.         mov     cs:[user_subroutine+2],es! T5 u" s" {; P! F. S
  829.         mov     cs:[user_mask],cx
    ) A/ U. U0 C. }
  830.         iret
    $ N2 M/ a6 z/ }2 ~1 \9 K$ E
  831. & F' p- f5 [/ _/ b& C3 ]$ a$ C- b
  832. _swap_subroutines:
    * n6 D. t0 `6 e+ E0 U
  833.         push    word ptr cs:[user_mask]. V- @) K6 R8 y8 C$ P2 o+ Y
  834.         push    word ptr cs:[user_subroutine+2]( @( c) n& V* A7 P
  835.         push    word ptr cs:[user_subroutine]& \: ^2 Q1 R6 |( g2 R/ V+ N1 k
  836.         mov     cs:[user_subroutine],dx9 T- x, Q9 N4 V# v. P) t
  837.         mov     cs:[user_subroutine+2],es4 i0 ~% E8 B; T- Z! N% v6 X
  838.         mov     cs:[user_mask],cx  ^# {7 ]# @2 T* A" Z2 R& W
  839.         pop     dx: ^: p; R5 j1 A' `$ e  p2 }2 k7 h7 t
  840.         pop     es4 F1 J9 E% g# G  ]5 d
  841.         pop     cx- j& m9 M& c4 q5 A9 G1 G
  842.         iret3 l# p% M# U1 T# R  h- I2 m6 Y
  843. 1 E4 W4 m7 [! J3 ^( o. B2 s8 t
  844. memmouse        endp
    4 S* q2 u2 m) B! v5 ?0 I

  845. : |% d8 i  s  K) `/ D7 j& d
  846. endof_start:1 c' [' r0 I$ F+ b! h1 ]% d
  847. 4 a% H* A4 K9 X6 M, J
  848. emsg db 'No mouse driver install error!$'/ X4 V" y* M8 g: w5 A
  849. old331 dw 0
    " t4 O# M# G3 g% D; U/ I
  850. old332 dw 0
    3 f; {' Q" S( ?: x8 p$ t% X4 b
  851. old741 dw 0
    ) `% S4 V+ b6 }# T) L% t7 H2 w# b
  852. old742 dw 0+ n8 t- W# t. n9 d1 C% a
  853. memcopy db 0  z" A3 d* n& R3 b8 y' s0 Q
  854. okcheck db 0+ _2 [. ^( V' s
  855. pass db 0. P/ y7 s, X+ x% ?
  856. chkl db 0
    % u4 I1 i" [9 K. I6 A9 G! c4 U4 @
  857. lk db 0
    7 x4 s9 X) H/ s3 \$ q
  858. chkr db 06 I# x1 q; O, `  n1 Y" }+ s2 e
  859. rk db 0
    . [' A1 B# U7 R6 {( Y
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ') ~& D! V" h+ B% E
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    & }6 C. h( `" o: N% e/ V3 T
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    , `/ V. Y2 A' s; s; `0 d( B$ E6 ~% l
  863. db '                                                                                '
    * v6 o8 T) W# I% \
  864. db '                                赏屯屯簧屯屯突                                  '
    8 m0 y" p, p$ E* M5 G7 U0 o
  865.         db      '                                ?OFF汉OFF?                                 '8 R4 t4 I" Z* p
  866. db      '                                韧屯屯既屯屯图                                  '
    . ?- `/ G' u$ Y
  867. db '                                                                                '
    ; j4 p+ |" {; K
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    # k9 W  f; ~: s/ C/ n8 d0 I
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    . [: ?% I2 d. r8 |( F
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    ; P9 _+ l/ b2 [6 l! y

  871. 3 [! c6 j( U* A1 X3 d# T' j8 t
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!. Q2 T8 a0 u" w& L. v' U, T
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
7 E5 ~' E' h" D9 u2 D4 w- v9 T
3 V) D0 W" d7 }$ I. L; g谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:30 , Processed in 0.152949 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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