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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
8 S- Y1 ?# Q& `) f' e" _
! M& D, B# }: \& p' {, w, ]2 ]2 z( Z+ x代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    + S% T, h! u4 u% n
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    ' k' y5 e! J9 z3 A
  3. ;                                         By Bini.Yi 易祝兵
    + e5 P* J( V5 }2 K& r+ l. S
  4. ;                                         http://www.ufoit.com 计匠网: j  i6 S/ ~1 ?8 r1 {
  5. ;                                         2002/04/06 YYYY/MM/DD
    # v$ X$ }3 d! I2 ?2 _
  6. ;
    9 u% D* {: _6 x3 `# S
  7. ;          3 L* n2 V* Y6 ^# N& J9 L
  8. ;          This program  test the mouse button  click and move.! C* W" x7 V% o
  9. ;
    : o2 E" c3 H0 Y4 Q$ W# x4 v

  10. ; \4 B, j! O/ A! x; O
  11. .model tiny/ w& y+ z  W6 M9 ]% ^. Z
  12. .586
    1 A0 ^2 x  d$ k) Y* t
  13. .code, x( {% O5 j! a7 v# E3 B
  14. .stack  100h# ?+ B0 h/ S, g% t5 L6 d
  15. .startup
    - M, N1 t: i! x3 r1 M
  16. pusha; c  R- r9 c6 S
  17. mov ax, 3533h
    ! \* N; c5 d7 W
  18. int 21h
    , |! A4 }0 f+ p: g+ {  u( H" @
  19. mov word ptr cs:[old331],es
    % i# b& Y  K5 Z4 f
  20. mov word ptr cs:[old332],bx) Y- H) e  B+ H8 a" @
  21. mov ax, 3574h# r6 |$ k2 [( o
  22. int 21h7 d4 Y+ S& ?+ p: d  {+ Y
  23. mov word ptr cs:[old741],es9 _$ r: g& G% ]% U# G0 ?
  24. mov word ptr cs:[old742],bx
    1 {' a9 J6 J  v( v. I- Q2 v
  25. popa* q+ J/ l- t9 o- p( W7 M  `
  26.         call    memmouse
    8 t3 j/ ?% @4 K$ f8 _! K7 ?# \9 b' _
  27.         mov ah, 00
    ( S" n& \4 Y$ ~
  28. mov al, 030 B; h6 b$ u2 H" x
  29. int 10h
    " V9 F& b4 ]. I
  30. mov ah, 06% G( K$ H6 o% `- K! c* y! ?6 _
  31. mov al, 0
    # T; s/ x" L% r" v; m* V% Y
  32. mov cx, 07 |/ k& _+ E3 u
  33. mov dh, 24
    " A- P5 |) @2 U3 L, a5 g6 I# s4 I
  34. mov dl, 79
    ' |+ Z$ K# m) k! f0 o7 w
  35. mov bh, 07h
    ' z) Q% I3 I+ a) {3 @/ f! B9 ^
  36. int 10h6 k: _2 m" L" K) U' b. E
  37. mov ax, 0000+ N5 j+ o9 C% q' R
  38. mov bx, 00025 T, B7 P: E8 G2 d
  39. int 33h; ^+ R/ n, b4 w: D
  40.         cmp     ax, 0000           ;if no mouse drive install1 @$ L- A: A, D! C7 c
  41.         je      errormsg           ;show error MSG8 u6 \% m3 f3 q2 M4 ?
  42. mov ah, 02! Q) D3 M8 l. u' W" T& R8 J) n1 d
  43. mov bh, 00
    3 m6 M+ X& Y; W$ N# a, o
  44.         mov     dh, 25             ;Move point out screen
    9 R( s! m  p: l; F# z1 B
  45. mov dl, 79  E+ Z0 ~  H, Z6 B
  46. int 10h
    - X' L1 F) J! z! o
  47.         call    showmsg            ;Show info
    ) D+ K' C( d9 P% B$ s
  48. mov ax, 0001$ I; o8 y8 R) f7 ]- h
  49. int 33h
    * P) n2 b& o- M# j2 Z; d" m; E4 j4 Q
  50. ; mov ax, 000ah/ R8 U0 J" k3 t3 _; ~
  51. ; mov bx, 00001 N% g( w5 ^$ O3 X( O
  52. ; mov cl, 0h
    + {' d2 D5 c% s
  53. ; mov ch, 0F0h6 ^" T5 \' P9 u. F5 _9 y
  54. ; mov dl, 0h! ~' v* l! S4 ]8 {# u
  55. ; mov dh, 0F0h
    " _- S2 y" e/ Z3 R; s. l/ Y) h
  56. ; int 33h1 p/ A2 `2 D# \0 J! g4 Q7 Q
  57. mov ax, 0004h. q9 E! [: X" n0 c( Y# O2 R: k
  58. mov cx, 0319' |2 @6 a% V; f1 V3 H( M" ~
  59. mov dx, 0103- A; }- t& ]7 X7 V) c7 I5 A
  60. int 33h0 H5 J7 o" k- v' s4 Q0 Z
  61. casemo:                           ;Case button click and point move
    * D& d" d4 H3 j* ^, j
  62.         mov     ax, 000bh         ;and keyboard press
    5 y' z, r8 ?: }
  63. int 33h
    # a9 Q) J# d7 r+ e
  64.         cmp     cx, 00h           ;if point move....X
    9 ^/ @+ ^( L# P. k
  65. jne xmov/ l8 P! n# `/ {) r' B
  66.         cmp     dx, 00h           ;if point move....Y
    / L. c6 T( H% i# e2 |8 X& X) M
  67. jne ymov
    ; y+ C) D/ S  d! L
  68. xymovend:                         ;X.Y move end
    - S! c: H( ~% X1 v$ L8 v, G7 R: d
  69.         mov     ax, 0003         
      x+ \* y7 k  |7 W. D4 l# e3 o
  70. int 33h
    , x( L3 J& o4 b/ L
  71.         cmp     bx, 0001          ;if left button click  show ON
    & l4 M  z( g9 d0 t/ y
  72. mov si, 18284 c, P1 I' P3 x' @- c
  73. je listl
    ( Y8 D* B" J2 U2 b5 U2 ^8 C8 V( x4 c
  74. mov si, 1828
    1 h* O/ [8 y7 |: A! V6 ?0 q1 v
  75.         jne     nlistl            ;if left no click show OFF
    2 m* x) |6 U4 M" A  L! y' @
  76. testr:/ {3 a5 M- Q/ h, c5 S% d3 C
  77.         cmp     bx, 0002          ;if right button click show ON
    % T7 h, ^5 ]/ l- o# s4 f& m7 a
  78. mov si,1842
    ; p& n! O- f. l0 U9 N8 i. M2 y
  79. je listr
    " Y2 O4 H9 ]+ o/ z  H* h7 g4 o+ T
  80.         mov     si,1842           ;if right no click show OFF, p8 v7 ^+ t. v
  81. jne nlistl( F; i1 ?' U( |' d/ f: T' [# o9 ^
  82. casekey:( {4 O( G. a  N) r  l
  83.         mov     ah, 01            ;if any key press jump check5 c: _9 r9 R- }9 D7 E
  84. int 16h: L5 V, P8 T* R8 y. E, h
  85. jne kpress
    % I# X" }+ n) v/ U  ]0 `
  86.         mov     al, [chkl]        ;check x flag
    + l% l/ g6 F9 L  u# @$ J
  87. cmp al, 02h
    % m- k5 y% @  V. P8 o0 q& T
  88. jnb chkok: J( T, R7 k! `  u
  89. jmp casemo+ `- K6 F; f; v+ i& B( l/ K
  90. xmov:                             ;if X moved, get the X flag+1
    7 S; j. s2 T8 q: r& L5 V. u
  91. mov al, [chkl]8 t. C- t0 @7 {: a6 V. X. Z; S6 [' e
  92. inc al
    1 g1 I6 q% ]( I
  93. mov [chkl], al' d2 C4 w* h5 Z& U- A; X# C
  94. call passok: S7 l! K1 v% |% X' x# w/ h
  95. jmp xymovend8 l4 o1 a- Z. X7 Q& R- u
  96. ymov:                             ;if Y moved, get the X flag+1% Q# \& Z# w8 @& p3 U  L
  97. mov al, [chkr]
    4 M4 a( n5 N) s8 Y9 _
  98. inc al6 t/ R% D9 T) a% g" z) n- r7 |
  99. mov [chkr], al# U5 ~/ L  I+ l
  100. call passok
    % F  g; u& b! o* \: ?6 R% ^' w  ~
  101. jmp xymovend
    2 v1 L* V! ^& f1 C5 \+ ?
  102. ) B% C9 J; E! |/ z( t) x
  103. passok proc near
    4 @% Q( K3 d8 F/ S7 l- ^& [
  104. mov al, [okcheck]
    & r  f% e% q* _3 c, [
  105. cmp al, 1! F. l1 C% B, a. v' @, U  O
  106. je let0- {. {$ v% k0 h: x5 Y: ?& y; u
  107. jmp passret
    6 H# v' t& B, i" \/ |$ r
  108. let0:   h% U: o- i/ S; H/ @' G
  109. mov [pass], 1
    9 G' t7 z3 K6 O' I5 |7 b0 ]
  110. passret:
    2 L- O" P, k4 j9 o/ M7 ?0 v
  111. ret
    ( ^5 \8 H4 Q9 l% K: k
  112. passok endp
    * V9 |* V, v3 `/ g( N
  113. - V" o& \- `& b% [, Z7 |0 }& A
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS6 i4 x6 B+ s- B! w, J4 y1 A
  115. mov al, [chkr]
    $ [/ [& @' m3 ^" X9 J: t0 G6 V* \4 N
  116. cmp al, 02h
    . e" j: v+ k3 |2 |( `, i2 B" w
  117. jb casemo
    1 e, D  `$ U) A; h- r6 S
  118. mov al, [lk]
    ) q7 Z& R$ Y8 s/ X6 [( M$ }* @
  119. cmp al, 1, k: T2 k4 \% C8 |  H* o6 z; i
  120. jne casemo2 I# X! n& t, G+ O0 W! K2 q; j6 Y3 p
  121. mov al, [rk]. M' R9 q$ R5 s/ Q
  122. cmp al, 16 C$ Q' k" Z0 r
  123. jne  casemo
    6 y! Y9 ]( i; R0 C  p6 {
  124. mov [okcheck], 1
    ( q& j5 Y4 N8 c1 X% _# l6 N, q7 c4 S* G
  125. mov al, [pass]
    # V8 e& d- Z6 @, v
  126. cmp al, 1  v- v$ W6 J" `% F
  127. jne  casemo
      I3 |/ r9 e- y" J. ~: S* m
  128. mov ax,0002h
    ! y$ I8 u  Y3 C
  129. int 33h
    1 ^) ], [2 V! P& c: T: Z
  130. call cleascr: \2 [7 n8 L/ x" ]2 ^3 X
  131. : Q' v% C- H+ J" C9 K7 ]
  132. call oldint# h0 ^, F, t9 S; f
  133. mov ax, 04c00h% m$ _, _; }8 F4 \
  134. int 21h
    7 O( @1 i7 g7 `( Z

  135. 3 s% r) L( D  }1 R8 M
  136. okexit:/ H- P3 P1 q6 B# a' e
  137. mov ah, 4ch
    * o; L& ]8 j% I! B/ |+ y
  138. mov al, 08 H" q8 f- c2 O7 n
  139. int 21h/ ~& M' J, h& Y- R
  140. listl:                                 ;Show ON" w( g1 J) P5 Q# u9 ?5 o
  141. pusha7 I- r6 K& x, v+ Z4 F
  142. mov ax, 0b800h% L7 c$ a( w% G) G
  143. mov  es, ax7 p5 h$ d! m" h+ S8 i
  144. mov ah, 47h5 C4 N& c. p- c9 ~" @
  145. mov al, 20h
    ) U3 f& H7 b  ^% {
  146. mov es:[si], ax
    7 P: u! m8 |* J0 M6 @+ u
  147. add si, 02
    # V4 j) n4 F% P4 t' G
  148. mov  al, 4fh
    : a# `- u# W, d) v/ e% K1 F
  149. mov es:[si], ax8 v) m( K7 a4 S- o- Z0 u
  150. mov al, 4eh% Y) l( o8 C/ w3 b
  151. add si, 02: G4 A2 j/ X" o2 V+ e" t( _+ V" d4 U
  152. mov es:[si], ax, ~, j2 N! u% b; w3 o! n7 Z
  153. mov [lk], 1
    + h  I& O7 Z- |5 Q5 x+ U  K
  154. popa  M% v  h/ A7 ]. I$ |
  155. jmp testr
      l/ B1 ?& C; A! p; {5 F3 N1 m* H$ v
  156. listr:                                 ;Show ON* A# R* p  q; r* _) X
  157. pusha
    . u& o* Y9 L! a+ C& {' s4 D! W
  158. mov ax, 0b800h
    8 L9 {$ }5 e2 r. P0 B; c4 n+ W
  159. mov  es, ax  h( N  Z0 _. o$ F+ G. S" R
  160. mov ah, 47h% t) f% j! k5 u8 d& Z: r. ?
  161. mov al, 20h
    - U9 }. i; p/ _7 {  p9 y3 g0 O8 R! u5 e
  162. mov es:[si], ax: {/ |; V1 d3 J6 |8 \" C
  163. add si, 029 j- p; q* f; X7 h( _
  164. mov  al, 4fh
    5 t2 [) b, u# f' {2 {
  165. mov es:[si], ax9 p& Q, e: b0 i. k0 X) b
  166. mov al, 4eh# b( ~# z; e3 ^' p# @! b4 ?
  167. add si, 02
    ) L2 F5 v2 B! u. Y
  168. mov es:[si], ax- P( q* q6 a; a! G) c5 k, Y
  169. mov [rk], 1
    " F2 z% V% P, r; M" E/ `
  170. popa( P2 u! H" C  }" E4 ]6 p
  171. jmp  casekey0 J: H2 ^( Y9 U7 k
  172. # g* h1 ^( Q3 u/ Y. _+ A
  173. nlistl:                              ;Show OFF
    ) d5 O" p3 B- Y$ @
  174. pusha   4 x4 n# z% O2 s4 B3 J- K
  175. mov ax, 0b800h3 g2 s/ S* f' S' h# X6 L
  176. mov  es, ax
    . t( Y2 Q" S1 b0 u1 ~; Y
  177. mov ah, 17h. V, R# N9 O9 @
  178. mov al, 4fh
    & T" K) n7 r2 \# ]) z" Q
  179. mov es:[si], ax9 q6 D7 F1 a, ]
  180. add si, 02' f3 l" L6 p. a& k/ _& R' Q
  181. mov  al, 46h# ?8 n' W' j& [; K
  182. mov es:[si], ax( ^( ?4 M; N& j( {. C- F- f
  183. mov al, 46h
    : z9 [7 P6 i* l' S
  184. add si, 02
    0 u" w6 [3 }: ^' y" R( S& |+ ^* x( D
  185. mov es:[si], ax
    5 \1 D: b& v. F* S
  186. popa2 x/ p$ n, R0 m9 d# Q
  187. cmp si, 1840
    , v" G. ^+ q% E9 |+ r# B
  188. jae casekey
    2 |4 K8 }9 j, e, E/ L1 K
  189. jmp testr
    0 d' j1 N6 A8 K! \# ^1 y

  190. + V3 A: x* G: n9 ]/ P, }
  191. kpress:                             ;Check key press if press<ESC> then EXIT; e6 i9 d: P2 \
  192.         cmp     ah, 01h             ;and return a error
    7 u6 j- M' W" l& R+ n$ G
  193. je exit1& o8 c% L  l" c: }# g: t
  194.         mov     ah, 0ch             ;if press other key then clear
    ! T5 F% {9 e3 q0 \6 }2 {
  195.         mov     al, 00              ;keyboard buffer7 o+ ?; j2 P: f/ W. p
  196. int 21h1 @4 o' g. B: h1 a
  197. jmp casemo ! L) G" K9 {- b8 W4 x8 u* r6 K% [
  198. # T8 C) G7 }$ p& J& c
  199. errormsg:                           ;if mouse driver no install  N: s) Q7 e" T. u( a+ i4 z
  200. call oldint- t  U' ?0 |- N8 a- k
  201. lea dx, offset emsg
    ; x7 _7 x8 v; H6 ]/ I. ?% q: j5 V
  202. mov ah, 09h
    8 V1 }6 i9 V8 Z4 C* B6 f6 l) s
  203. int 21h. c/ r& Y7 |4 M4 f& Y* D4 y3 w
  204. mov ah, 4ch
    ! q. L0 p5 k# B' E. t4 `( k
  205. mov al, 23 r9 i  O7 W6 H$ [' A& O/ c& l
  206. int  21h  v/ R5 `5 |7 [  Y9 d$ k) M

  207. ) P2 W8 P& r3 V) e  `. X% U- Y+ R
  208. exit1:                              ;error exit2 R1 ~! t8 R& s0 \3 \5 ?3 E: U
  209. mov ax, 0002h1 T" m/ d& P4 @. R/ m! n
  210. int 33h
    3 |" j  X+ H: X. U
  211. call  cleascr+ t% \' L! {1 ~4 Z4 v! ~& F9 c
  212. call  oldint# E* a7 M1 f! P2 J  R5 R) ?
  213. mov ah, 4ch
    3 K8 D- T- H5 x6 f7 w) B
  214. mov al, 01
    # z  C2 ?  }/ v: @2 c/ C" h% {: k$ V
  215. int 21h
    1 f5 n, l# f1 [0 G
  216. 0 t7 S" x7 V7 S. S. D/ W* g
  217. cleascr proc    near                ;clear screen8 u3 T( d, x1 T: f
  218. pusha
    + W* x7 ~; k; c* W( v3 P+ N+ I
  219. mov ah, 06
    , i4 y" }4 k* k% @" o
  220. mov al, 0
    , U7 X. U5 C+ |2 c
  221. mov cx, 0" N/ q) u: S+ K- [9 E
  222. mov dh, 24
    ; O' w2 ~0 V8 i  ]- ^
  223. mov dl, 79
    ; R# x: P& {; [. X+ L6 R
  224. mov bh, 07h" ?. N$ T6 Z3 N( t3 \& J: U
  225. int 10h$ N% W2 N: H1 q" l% b
  226. mov ah, 02
    # L/ l7 n4 W$ {% Q( B7 q
  227. mov bh, 00/ _, _9 I2 ~4 A5 P. \  D5 v
  228. mov dh, 0
    3 T5 N, Y/ u* M5 f! N5 G# p
  229. mov dl, 0) i3 J; w* j. [  l) O& C
  230. int 10h0 U/ O3 |) Z$ `
  231. popa+ y- Z, z6 m8 ?; K
  232. ret: H; r" E8 C& i6 R
  233. cleascr endp
    . ?  U, H$ V. Q& {- Z

  234. * ~: F/ Z8 ~4 u) D) n/ `
  235. showmsg proc    near               ;Show info* O! T. _+ {+ Z( q2 }' q' V" ?
  236. pusha
    : Q' `' w$ t: z  I6 @8 O- E
  237. lea di, offset showms
    5 }* m2 `8 W! L! F5 H* G
  238. mov ax, 0b800h
    3 N' }4 ^# f. a& t3 m/ d
  239. mov es, ax
    ! b( [3 H) m4 G, C5 L$ F
  240. mov si, 0
    , p- d( U  h0 [- j( n
  241. mov cx, 480
    - w, r' f* s) N4 u9 P# m
  242. mov ah, 07h
    5 |" E# L' t  k( e
  243. @@:
    & W/ L) Y/ h: D9 w6 P/ x
  244. mov al, 20h) w2 y- q( m, P) o3 S3 D9 ]- v
  245. mov es:[si], ax
    , j; D) Q- p0 {% j4 R$ W" K
  246. add si, 2( C, w* v2 g& o' Z
  247. loop @b4 [% M2 e8 u4 o- I7 q$ ~& r
  248. mov cx,880
    , }  G3 Z3 r2 g: b
  249. @@:3 O! G) f3 A' |' X5 [4 x) T- ]8 ]. D
  250. mov al, [di]
      F3 X8 h( C2 a1 X  M
  251. inc di
    5 ?' S5 a+ G. Y. k# I# k$ T0 p* I
  252. cmp al,20h4 ~4 a7 P( \+ h: H  b+ I: I5 J
  253. je showch1
    : B1 x* J. U9 W# m' H
  254. mov ah, 17h
    + j( a" m8 j; v- w( _; K: _
  255. jmp showch3 6 v" @0 z) Q/ h+ _4 X
  256. showch1:" {. w$ n+ Z$ a: s! H
  257. mov ah, 07h
    % y) b# Z+ {' h6 p7 q/ ^
  258. showch3:
    : z: n* d) K' c" H  H& K
  259. mov es:[si], ax' h6 }4 E7 h0 d; o  N5 d
  260. add si, 2) m. k  C* W! w# y
  261. loop @b
    0 E- H$ f' s9 P" S2 R
  262. popa; i" m  _5 w  L
  263. ret
    ) Y( J) a$ q# a0 e' Y) A
  264. showmsg endp) K7 q7 b+ V" }: R: S
  265. 0 m6 }/ G% C8 D4 }
  266. oldint proc
    ) D9 R5 W8 z0 ^$ D
  267. pusha
    4 y* p% e; c1 ?4 p0 N; G# X
  268. mov ds, word ptr cs:[old331]+ A# c# O- ?- ?6 X/ O# T
  269. mov   dx, word ptr cs:[old332]
    % R; |, r5 |* Q4 M
  270. mov ax, 2533h( U4 }5 Y" ]7 j
  271. int 21h7 t8 Z$ L/ l+ `) J, n9 Z* x7 K
  272. mov ds, word ptr cs:[old741]
    & H; J1 {7 |- Q3 ~
  273. mov dx, word ptr cs:[old742]
    5 E7 ~3 d* ~4 G
  274. mov ax, 2574h5 M4 O4 a0 Q$ F; X
  275. int 21h
    5 `( o; x+ p, ?5 e
  276. popa
    . ^0 j: ]. P0 A9 n7 |1 d, w
  277. ret
    6 F: \8 ~$ e& a# Q- J% w
  278. oldint endp
    + y  R9 i( l- ^: w
  279. - D# p2 Y* Q1 i* n
  280. memmouse        proc
    0 o( Y- G1 u, M* G6 `' |
  281.         xor     ax,ax
    8 i3 L$ ~1 J7 `3 k
  282. int 33h
    . _1 d6 d  [; @# v6 |$ Z) g
  283. cmp ax,0ffffh
    ) V. J7 }; E# S4 t. z( K4 h
  284.         jne     not_loaded
    ; D7 ^& n7 f2 E+ A1 i; f  @
  285. mov [memcopy], 1
    2 j) D+ l9 x$ F# s) X$ u
  286. ret) ]. N2 i) a8 c8 o

  287. ( u3 {9 ^4 N, b. D* w! e  y
  288. not_loaded:
    & o4 O" P0 J8 x1 s8 T
  289. 6 X, f8 e* y/ E7 O. {9 E
  290.         mov ax,2574h3 U+ z. G! A9 R& K) T
  291.         mov dx,offset new_isr
    $ Q5 ]8 q( K: d  `5 Y
  292.         int 21h$ d' Z: H0 p' l* m9 v9 h

  293. + m) Y7 S( c9 R
  294.         mov ax,2533h! ]. Y; e) H' u" e
  295.         mov dx,offset new_33
    3 h2 W) S7 [' G: P4 x
  296.         int 21h
    + F8 o9 {' K; U

  297. ' W6 |8 G% G* X7 [2 F& L& L
  298.         cli" F1 U* |% g) R- W1 R

  299. & v; l+ u0 c5 G$ Q8 O
  300.         mov bl,0a8h& M) S5 w/ ?5 S+ g
  301.         call keyboard_cmd; r. O+ F; I6 s8 I6 ?2 }( g

  302. 9 m! [! ~# N7 y; z3 k' {
  303.         mov bl,20h
    7 X+ e: f- o1 O+ U: R! d/ F
  304.         call    keyboard_cmd) V1 j: U0 O7 S9 A' ?: k6 Z
  305.         call    keyboard_read
    + E4 x5 H2 i& V+ n1 h
  306.         or      al,2
    ( K  x+ V6 N: Q, j7 G0 G
  307.         mov     bl,60h' g' C0 M" i9 F6 I5 S0 |' h
  308.         push    ax5 A: k/ G, c2 y( r
  309.         call    keyboard_cmd
    # t9 G, q- _8 ?
  310.         pop     ax
    4 z0 A0 z2 c0 h
  311.         call    keyboard_write
    , i# A8 J; j( ^& G9 `

  312. ; a) x8 h$ x  ?5 R+ G6 Y% N
  313.         mov     bl,0d4h
    5 X* T" n8 j1 H
  314.         call    keyboard_cmd
    1 ~. s% Q* o; A+ C! K5 `
  315.         mov     al,0f4h5 b+ f) h1 j5 O1 y6 O9 g4 f
  316.         call    keyboard_write. X2 F; y# Z/ }, L# o- \8 e
  317. $ C8 K' g6 @; Z- E
  318.         sti
    4 P- t! v! E& x3 v, f2 B4 C  [, i$ N
  319.         ret. l( [# `4 \7 d1 f( z8 a  ?
  320. call_user_isr:
    # j% B1 ]3 {: g  h& u" V+ P6 |
  321. db      60h, Y( D' M: S% t6 N  q
  322.         mov     cx,cs:[pos_x]
      ^% p4 g3 _7 X7 {
  323.         mov     dx,cs:[pos_y]
    ; \$ N/ q! P8 K' m  f+ e6 F) t
  324.         mov     di,0 ;cs:[x_move]8 m7 _+ Q9 u1 R
  325.         mov     si,0 ;cs:[y_move]
    $ W+ E# `# Z' q( W, d# ?
  326.         mov     word ptr cs:[x_move],04 u- h( ^1 s2 E% _
  327.         mov     word ptr cs:[y_move],0
    ; O- x4 l6 O  v! e
  328.         mov     bl,byte ptr cs:[buttons]
    5 G, q* P% }0 Y: e9 ?7 y# |
  329.         xor     bh,bh6 y- j$ B# V# G4 ^8 r2 E5 |8 x  N" m
  330.         call    dword ptr cs:[user_subroutine]
    " i8 W1 [8 F9 ~3 h4 D4 x+ o6 c. }
  331.         db      61h
    3 Y# @" s2 g9 O2 a
  332. ret7 h7 ~; @' S  E6 G1 U9 s" k! Z
  333. new_isr:
    7 `: n. p: b/ ?- y
  334.         pushf, h3 V; w& D4 e. z, r; h
  335.         cli5 ~' e7 _/ I! a$ s4 ~
  336.         push    ax( K" k% d! v$ ?- y4 x
  337.         push    bx( U( Q* |1 [& t% ?, l1 r" }* E/ A
  338.         push    cx
    " ^( D& U' V  @
  339.         push    dx5 f! i# f8 D/ D* R7 [  b# ~. i
  340.         push    di
    : P0 j2 N3 G  w# ], n7 S9 I6 `: F5 U* S
  341.         push    si
    " p2 T. v7 Q/ h
  342.         push    es+ }- F5 j+ S. y$ B4 G* l" w) y
  343.         push    ds
    " G5 W% l) |7 A* i- H
  344. & S1 h1 O  a$ O4 Q  w6 z6 \& H
  345.         push    cs
    & s6 w) ^5 o. Q8 J8 n
  346.         pop     ds7 J7 d  V, \8 n+ c# _: L7 A! E

  347. + M+ R0 Q8 `; l$ }
  348.         mov     bl,0adh
    $ B0 Y& N. B& H* @: A% E; e
  349.         call    keyboard_cmd2 q! {" M+ b' v) {& k. s6 y3 r5 `

  350. / T6 u( L  C9 Y4 S% Y" ~& v
  351.         cmp     byte ptr [first_time],0
    / |- Q9 G" a* J
  352.         je      not_first_time
    - |/ l3 O+ e  K: I, Y+ M( e% t6 Y

  353. 5 V# @7 ?+ b  b/ _' @" u8 U
  354.         mov     byte ptr [first_time],0
    ! A) d& Z' ]7 s
  355.         call    keyboard_read5 }4 g) x9 I# I
  356.         call    keyboard_read
    # }# g' p) d, M4 Q1 l5 P6 [9 j
  357.         call    keyboard_read
    . v6 J) L8 }" C1 ~1 Y  a9 Q
  358.         jmp     no_show  u' z9 l) M. K) l6 q
  359. , w" Y% t8 E) x) F0 F
  360. not_first_time:
    - E# }( g$ E& p
  361.         mov     word ptr [temp_mask],06 Q2 P) n% |/ C
  362. 1 `8 w7 Q/ z. u( }
  363.         mov     cx,[pos_x]
    0 P7 r, l% B" k2 t& e; g
  364.         mov     dx,[pos_y]5 }, C' l( Z6 a: e2 A
  365. 7 {' A  ~* w- f' Y- O
  366.         call    keyboard_read, k. x, U5 y3 w* }9 s/ N( r4 `
  367.         and     al,7 ;3
    6 @" \: c' S% h# n4 \3 @& c2 Y
  368.         mov     ah,[buttons]) b; l7 Y) H+ L3 A9 A
  369.         mov     [buttons],al  X. t0 ]! K1 K7 u" f3 Q
  370.         cmp     al,ah% p* K% t3 Z: @; m+ X1 H2 K: W# k
  371.         je      no_button_change6 J5 p) V- s$ z* p" |0 o
  372.         and     al,3+ e: j9 l; Q5 h- Q
  373.         and     ah,3
    # |$ X: d+ _9 o
  374.         xor     al,ah
    5 y% u* |- @; Y# Y4 E" w  d
  375.         xor     bx,bx
    / T& `$ `# \$ ?: M" I- X

  376. ' i  \3 F3 F3 G; t7 K
  377.         push    ax
    ' A8 n- {) ?5 o/ ]7 S
  378.         test    al,2/ [) }5 j- p7 @4 M
  379.         jz      no_right_button_change/ T& @8 L% M) c( Y9 r
  380.         and     ah,2. U4 F0 z& g9 @' S( L: D; h
  381.         jz      right_button_pressed
    7 }5 M# F: ?& j7 L
  382.         or      bx,161 E4 e0 I% F. j# W- r$ d! a( J
  383.         jmp     no_right_button_change
    % z+ L# j2 E1 ]6 \, H
  384. right_button_pressed:
    9 ^5 W) h+ X- k0 N" X- S* a
  385.         or      bx,8  d! Z  J6 ]& m- d2 y. U
  386. no_right_button_change:
    & }, F# q9 }  A$ d/ A$ T5 f8 ?6 |

  387. + E: c1 v) Y3 E3 H8 q5 }3 [
  388.         pop     ax6 g; v5 j7 `) _1 r- S

  389. 3 k, ^3 U' q4 f( U2 b
  390.         test    al,1
    # n' ^/ L8 c% p/ B8 m# B7 [; W
  391.         jz      no_left_button_change) F& ~9 }) P6 {9 w: B  [+ H  M
  392.         and     ah,16 i7 u) ]& ^% I4 Z* x4 M) n' W
  393.         jz      left_button_pressed! d& v+ G6 O( B" W
  394.         or      bx,40 q% e; O& y/ h
  395.         jmp     no_left_button_change6 B) u8 V9 N; t6 N) ^
  396. left_button_pressed:
    6 ?' O1 P9 u' X. i! P1 w6 j
  397.         or      bx,2/ n, Z  T; O2 ]. E8 F6 G
  398. no_left_button_change:
    $ A' N- v" l8 T7 S
  399. 7 Y$ r7 r% p! ^; u1 S" E
  400.         mov     [temp_mask],bx
    5 j7 E3 _' W* Y  a6 K

  401. ) m! L, V. u0 T) R( v- I1 s5 z
  402. no_button_change:1 Z: |% R3 k; O* ]
  403.         call    keyboard_read
    + D, l7 @6 @" L
  404.         cbw
    & P5 A- m/ N8 v# G3 @6 K. g
  405.         add     [pos_x],ax
    $ r# r6 k( z/ z3 z
  406.         add     [x_move],ax3 f# b0 X) j; c, z" G0 g
  407.         mov     ax,[x_min]
    : y  A/ y9 g- t9 H$ u# D
  408.         cmp     [pos_x],ax
    % y- I9 Z$ W: X" O) o8 {
  409.         jg      good_hor1
    : ^6 x7 U0 H4 V3 L" B2 `
  410.         mov     [pos_x],ax5 T4 h$ G2 B6 |2 X
  411. good_hor1:$ L, _7 \5 a! Q; N6 z$ g+ w
  412.         mov     ax,[x_max]
    0 H3 Z! T1 P6 _8 l
  413.         cmp     [pos_x],ax: Z0 }% O& v* ^! E$ ~  [8 q$ k
  414.         jle     good_hor21 \+ l  h7 o  ~% k$ l; B6 H
  415.         mov     [pos_x],ax6 K, X+ P3 V$ C; Z# y& y1 F
  416. good_hor2:
    * f3 @7 r* r" j8 L. C8 K$ s9 |
  417. ! L& D4 G" k9 H+ n, C0 p
  418.         call    keyboard_read
    4 N" `, b* F% A) A1 ^' M! E
  419.         neg     al1 s  p) b' m7 r! l( S, l
  420.         cbw
    + m! h+ f3 G  q7 ?* x+ d
  421.         add     [pos_y],ax
    ) d" e& I' {. ?9 p1 k
  422.         add     [y_move],ax- W( u) Z+ u0 N- Q+ ?, n. Z
  423.         mov     ax,[y_min]# F! a/ Y# U8 A- C
  424.         cmp     [pos_y],ax
    * j9 j3 c  _1 B7 w+ n1 X- E. E- H
  425.         jg      good_ver1
    " W- G. {, p9 J0 e: C) L
  426.         mov     [pos_y],ax/ o( k4 E! {2 B
  427. good_ver1:2 [4 \. X! H8 {" {7 M
  428.         mov     ax,[y_max]8 K6 l% E5 D* |1 }  k: H2 V% o" O
  429.         cmp     [pos_y],ax
    ) K+ @( D4 l: D
  430.         jle     good_ver2
    ' d7 n( v0 X7 p
  431.         mov     [pos_y],ax# M- x8 s" b5 R- Y
  432. good_ver2:2 E$ Z5 ?4 t2 v" r& j3 C( D/ J+ i

  433. 4 P2 o3 `9 v" Q; I( e
  434.         mov     ax,[x_move]+ Q" ~3 Z0 L" o( n$ D7 `' A6 n
  435.         or      ax,[y_move]" @+ M  P) n; d# \' b/ G" }5 E# G
  436.         or      ax,ax
    - z" Y5 ?2 s9 A
  437.         jz      no_change_position( ~5 Z' p+ p( V) w
  438.         or      word ptr [temp_mask],1
    + a) [, f) N5 X) H( ?) N4 y5 D
  439. no_change_position:
      W3 z6 B% j4 o, r

  440. % \5 y6 @( u0 h  w% d% p. Z
  441.         mov     ax,[temp_mask]! h% {8 ?6 Q' n% \+ m) ^5 O
  442.         and     ax,[user_mask]2 w7 e8 T% G; E  _8 V$ S6 o
  443.         jz      no_call_user2 y& @4 `8 `% E% ]2 r' f
  444.         call    call_user_isr
    2 D; X8 P- l- `5 d, U: u, X( g
  445. no_call_user:" G  L  y! S9 Q& N% Z9 o2 a
  446. & z, }, x/ P" c0 @
  447.         cmp     byte ptr [sm_flag],1/ \2 e7 |' k. D. E' j2 Q
  448.         jne     no_show
    0 k+ ]" E6 {  Q. B2 ^. l! i" a% `
  449. . G- g' {: s# r* d
  450.         shr     cx,3
    + P+ p0 d% q$ u% k* b2 \( c
  451.         shr     dx,3
    2 O5 b* D% ~4 e1 g+ U! G7 ]7 R! K
  452.         mov     ax,806 d: E; Q0 T5 ?+ c
  453.         mul     dl
    , m/ j- ^  K) e; k/ ?
  454.         add     ax,cx8 X3 g( v0 S+ s" m  X) f
  455.         shl     ax,1% f) n. `. A% c
  456.         mov     di,ax9 u) c& w  t5 c6 f. E3 L4 ~
  457.         mov     ax,0b800h+ m: V: Y2 S/ K, D
  458.         mov     es,ax$ A3 E* ^% W( f4 x7 c# A
  459.         mov     ax,[save_char]5 a7 e, k( V: z* x4 C
  460.         stosw
    - K6 \7 N& U* W( w. {  [

  461. ' I+ g) J4 x+ V) a" i' l
  462.         mov     cx,[pos_x]
    7 H' t* y1 g8 ?8 u; t
  463.         mov     dx,[pos_y]# D6 ?; C. P6 W; C; F7 O+ g  j" _1 u
  464.         shr     cx,3
    + R% x& g$ R/ J0 `- p
  465.         shr     dx,3: W5 o; ]$ ?& K# P! p& f
  466.         mov     ax,80
    ) p* f& Z: @  b2 S& w
  467.         mul     dl
    , W* J. a& v& N5 F# t
  468.         add     ax,cx
    : q! h' r7 d( j( q8 Y2 O) v" N! C
  469.         shl     ax,1
    $ e% h) \( D* ~& l0 h6 s
  470.         mov     di,ax
    0 |3 t% \  t1 W' D0 M0 T
  471.         mov     ax,0b800h
    8 U1 J; |' n0 y8 o. {
  472.         mov     es,ax
    . D6 x6 r) e. a8 I7 z
  473.         mov     ax,es:[di]2 @2 `" F: B% R! r
  474.         mov     [save_char],ax
    ' Z* M/ S: B9 X3 `4 }5 v0 K
  475.         not     ah
    + O( O5 M4 Y( [/ K# X* K4 m
  476.         and     ah,7fh
    2 Y6 k* Z8 E: S( o& p3 w7 z9 h1 e
  477.         stosw
    : `( q: N) }$ L
  478. no_show:2 H8 `9 D( V' O; ]( ]& g
  479.         mov     bl,0aeh% g8 S: i1 Y, |$ ^& Y
  480.         call    keyboard_cmd
    % O4 u4 n& G9 G7 \
  481. 2 {: ?0 D+ J) |6 p
  482.         mov     al,20h
    ' q# s7 e7 D& b0 M9 T3 _
  483.         out     0a0h,al6 Y* N) Y; O, O$ |! _
  484.         out     20h,al) w2 K1 B6 K# D6 _; z. ]# u
  485. 3 e0 m" ]: s& m9 m
  486.         pop     ds4 K5 N" W$ u' V2 M% C. k) V1 w
  487.         pop     es: ^/ C0 \0 G3 s8 K7 _
  488.         pop     si
    2 }5 x5 w2 p: u+ _  _
  489.         pop     di% V5 |6 ~# G0 [
  490.         pop     dx
    & |) B/ @( E" I5 A; g; h
  491.         pop     cx
    . k- V+ A- b# u5 K  Q# R* W
  492.         pop     bx
    $ W( Q* ?' Q& w/ G( t* H
  493.         pop     ax
    ) h4 `3 V* U; q
  494.         popf
    & o. e3 v, H% v9 Q3 y
  495.         iret
    " ~  g4 o1 T# l7 f% ?- r

  496. 0 H8 u2 X8 A9 m" i" y+ |
  497. first_time      db      1! ~5 t) |# K2 C$ v) {+ U
  498. buttons         db      0
      a) e! u% C; a  m+ V) `1 A
  499. pos_x           dw      05 ^5 d- P  w6 O
  500. pos_y           dw      0
    6 i: `" m1 l7 i
  501. sm_flag         dw      01 @3 m% k1 G4 X+ b
  502. save_char       dw      0
      c/ n- c. F: b: z
  503. x_move          dw      0# k) c. w! c6 D: n
  504. y_move          dw      0
    5 V: v8 M& c! E3 L" S0 n+ t
  505. x_max           dw      639/ P7 j/ e3 ~* w; v, g* A
  506. x_min           dw      0; _. v% r5 E8 x+ F/ D/ [
  507. y_max           dw      199
    ) N. h2 ~- \8 N
  508. y_min           dw      0
    6 N- X9 i5 [% K- n. b
  509. user_subroutine dw      0,0
    / c3 p# J; T% \# x! V& Y& L* z
  510. user_mask       dw      0
    $ M0 L, }/ U. K( E5 R; P/ x) M
  511. temp_mask       dw      0$ l, {& z% m; r2 R# {+ F: A4 L

  512. * p0 G9 `- ]) k/ O. A( e
  513. keyboard_read:
    & g6 ^- E% X7 _/ Z! |. p: t
  514.         push    cx/ I' X4 g+ S' H7 Y
  515.         push    dx
    ' x0 G+ @) _) M7 C: [! |: F
  516.         xor     cx,cx% g% p3 n( o2 R9 Q
  517. key_read_loop:
    # H8 V% A8 M+ H/ U
  518.         in      al,64h) Y' X9 [3 Z6 }5 q; P! F
  519.         jmp     $+2% r/ c( @0 r+ f2 F- g6 B
  520.         jmp     $+28 p' X& C( B( _4 |4 `
  521.         test    al,1
    6 O3 N, S* h- G# C# k
  522.         jnz     key_read_ready
    % M; L" w/ o4 A
  523.         loop    key_read_loop
    & E( J* }5 H' I4 @' l
  524.         mov     ah,1
    ( F. v" u- |1 y8 ^
  525.         jmp     key_read_exit  M' W9 k5 ]2 y/ g7 l# @
  526. key_read_ready:
    + _& }+ Y1 R! \6 v
  527.         push    cx
    & ~+ R4 B0 F  [# _2 B% ?
  528.         mov     cx,32
    . y- `% f- Z: m: X( F; K! Q0 y
  529. key_read_delay:
    ' r3 O$ U$ |, o8 D
  530.         jmp     $+24 g$ d! l( L# F
  531.         jmp     $+2( J% `7 w: ]* {% g/ l
  532.         loop    key_read_delay
    $ o& U# b) p% W: z( p4 |

  533. # U& }- y- h) T5 |
  534.         pop     cx, n' @7 [5 E. `% G

  535. % A. s; S: v% H& S, `
  536.         in      al,60h7 u$ }- a. V7 }, Y
  537.         jmp     $+2
    - v1 X6 H8 W6 k+ Y1 k
  538.         jmp     $+20 i. f4 J( g+ \8 K6 c% m+ a7 k6 Q
  539.         xor     ah,ah
    0 t5 a; l/ q( l, ?  H* Y& U9 ^- k
  540. key_read_exit:
    + ~# G9 t' C* R6 b" p
  541.         pop     dx& R, l7 @  l  V! x5 K
  542.         pop     cx) y/ `# A7 p1 F8 [
  543.         ret
    : D0 g7 [# U; I5 J5 }

  544. 3 T, h, `. r& R; ?* ^- y
  545. keyboard_write:
    * l) F2 B& F" H$ D& U
  546.         push    cx" _$ w$ e0 ]6 N( H  M; [
  547.         push    dx
    : h1 a- N$ _; i; j9 j" J/ O4 @
  548.         mov     dl,al
    7 T5 {1 o6 D- j7 u5 p( l. O. s
  549.         xor     cx,cx
    6 ~8 Y- @. |1 C0 r
  550. kbd_wrt_loop1:4 K* u7 ^, ^. {$ S( E' e
  551.         in      al,64h: h# C% \+ B- K; j5 {$ o
  552.         jmp     $+2- ^$ n0 O+ S( ]. u. R# C
  553.         jmp     $+2( O4 `/ d3 {8 }; P' y$ a2 p
  554.         test    al,20h% B! G8 L: l% h% M1 a9 {
  555.         jz      kbd_wrt_ok1
    $ d" d* k. Z, z8 v, r* |9 `

  556. & Y9 l0 U4 x' z
  557.         loop    kbd_wrt_loop1
    ) P4 j5 J) I% p$ W: q
  558. 6 a3 c: Z) w  y
  559.         mov     ah,1; i7 e& G7 z7 ?% ]9 t  x$ _4 f
  560.         jmp     kbd_wrt_exit& S) Q1 e3 K# R, C7 Z% \% P/ i! p/ H

  561. 7 k2 p2 D' L: }' Y  j7 N
  562. kbd_wrt_ok1:* t1 X  j0 o0 V, M  b9 E
  563.         in      al,60h) [1 ^/ `0 ^) q+ t* X' y+ ?
  564.   C+ A& _, V6 |% I
  565.         xor     cx,cx
    6 i. t4 h. L1 T
  566. kbd_wrt_loop:
    - S& B5 O, y. p1 @9 A# e/ G0 }
  567.         in      al,64h4 F. Y( M" e# V6 i: g$ m+ o- f
  568.         jmp     $+2) s  E- i1 N! {) w& \  P8 p' ?, I
  569.         jmp     $+2( R( i& W4 u1 [* p' {6 Y
  570.         test    al,2
    $ ~2 o( f" O  U3 c+ ^
  571.         jz      kbd_wrt_ok% b" A/ H% C  a- E0 a: o" _, V
  572. 1 X& I% g7 f! \8 v& N
  573.         loop    kbd_wrt_loop
    " E0 d; m9 r4 i, c$ l

  574. " D3 G8 C& U' S: Q/ `
  575.         mov     ah,1/ _. q% M. s! Q& q* y
  576.         jmp     kbd_wrt_exit
    $ I, y: n5 N+ W% ]. R

  577. 5 I4 `! D+ D" {6 ^# }
  578. kbd_wrt_ok:, S% c/ ?7 O) w3 p) I
  579.         mov     al,dl  J2 r. I! x. m- i
  580.         out     60h,al8 \8 C/ ]! I) d1 I, Q' D
  581.         jmp     $+2
    , i0 n3 j/ }6 z% O, F
  582.         jmp     $+2
    0 M' f5 d! Z$ _; g( o

  583. 2 A: b: S3 y. f8 r
  584.         xor     cx,cx
    - K, @) O' W3 ]# q/ ~. @
  585. kbd_wrt_loop3:3 P& ~/ C) U" m  P, m( H
  586.         in      al,64h7 c- Q& D) L$ Y; q2 p% \) l
  587.         jmp     $+2  S6 I/ F; m  V0 ?: y. Q
  588.         jmp     $+2) y0 g5 ^* O  x6 z
  589.         test    al,2
    2 f% z6 v5 ?# O% ^0 G6 e
  590.         jz      kbd_wrt_ok3
      T$ f7 F- \* T% K" G- B7 g9 S% Y% ?

  591. & |. y' V" [) O
  592.         loop    kbd_wrt_loop3
    ' Y0 w3 L! _6 T& H% Q- A4 }! w' ?5 {0 I
  593. % p7 P2 L- O6 J# T2 l8 {4 J1 m
  594.         mov     ah,1
    8 q& v+ G3 V: @+ |# I* L
  595.         jmp     kbd_wrt_exit
    ; m& f, a& p; [! ?
  596. ; \$ Q  R6 J+ b' b( ]' B
  597. kbd_wrt_ok3:
    / x! t$ v  p6 l) q
  598.         mov     ah,8
    7 x) N& i) }- Q/ y( G- x
  599. kbd_wrt_loop4:1 l% d, v' c$ |' g" z6 H4 k
  600.         xor     cx,cx
    7 D6 y/ M, P( I, B+ l2 {) n) Y% W, w2 o
  601. kbd_wrt_loop5:
    6 _% Q% m# M; Z0 ^
  602.         in      al,64h, c9 B6 q( }, l8 j5 F
  603.         jmp     $+2
    - Y# \' o1 `8 P& m2 i
  604.         jmp     $+2  E, ]- Z/ Q& P( H6 W2 {9 R/ V. W0 W! g( P
  605.         test    al,1
    8 [. U! P0 U0 I! f  l3 W
  606.         jnz     kbd_wrt_ok4: V9 z6 ^; o% y/ ^

  607. : j$ p4 T4 A" c3 W; Q
  608.         loop    kbd_wrt_loop54 |, l$ W* c# `. k
  609. 8 u. {5 C3 L, l- @6 i) H; M$ K% N3 Y
  610.         dec     ah# S# i8 I8 B3 o8 e2 F0 }$ J
  611.         jnz     kbd_wrt_loop40 n' U4 p3 d( M  s7 ?

  612. ( e- V: }4 s7 Y
  613. kbd_wrt_ok4:( A( H4 Y) O7 x: t4 D
  614.         xor     ah,ah. H- w1 x+ o8 g, h6 G
  615. kbd_wrt_exit:' G  P5 g* Q$ \8 Y$ c2 |
  616.         pop     dx
    6 J' T# U: _: E% r" ~' t
  617.         pop     cx
    * _" A' \4 H6 t0 ]3 ~
  618.         ret/ f2 e9 ^5 O% o9 }9 I
  619.         
    ( O1 Y8 A1 K. f+ R
  620. keyboard_cmd:
    7 Q$ c8 w  Z& i5 \9 N9 x
  621.         xor     cx,cx
    5 `* B" k4 y  }9 z# L
  622. cmd_wait:
    # K- U8 x+ P& Q6 y( W& d0 r0 l
  623.         in      al,64h) ?# }. k) s3 S4 |
  624.         jmp     $+2
    5 N2 v, ]" V% a" d8 ~. `
  625.         jmp     $+2% [" q; w- s! z% F& K
  626.         test    al,2
    - f2 i9 b1 o% a; N) f3 ~
  627.         jz      cmd_send
    $ G1 |, A2 G; V
  628.         loop    cmd_wait% }8 K( X2 L' q& n8 _6 C' v3 w7 J  e
  629. 9 x) ~  a( l  K5 F% V. Q/ b
  630.         jmp     cmd_error+ T4 a/ L+ ?& I6 \
  631. 6 k8 v/ ~8 m7 P9 Z) ]2 f0 H
  632. cmd_send:- Z! b( e* m8 V
  633.         mov     al,bl% P% T) m+ a* K' y6 d8 v
  634.         out     64h,al
    , ?7 K9 K$ Z4 P- i% d! ~
  635.         jmp     $+2
    : e6 N" ]9 B  C. u3 B6 h7 z4 C
  636.         jmp     $+2
    9 @9 B* Y$ B- i6 f1 r* s" d& J
  637.   L6 P+ v# K% O6 G7 |3 j
  638.         xor     cx,cx4 [- `- V# y- F; l# N0 d2 N
  639. cmd_accept:: H( o8 v1 O; U: E7 J: T
  640.         in      al,64h
    ( C+ k. @  l/ G+ O6 r. ?
  641.         jmp     $+2
    ; ]. |, w1 b$ _& U! I: y- U
  642.         jmp     $+2
    % v9 q4 I2 y& c
  643.         test    al,22 W4 O+ n- o+ X. C& ~+ V! ]. s: H
  644.         jz      cmd_ok, O/ Y  a2 i: _: z
  645.         loop    cmd_accept$ e+ ~0 p5 }7 [7 r6 _( P
  646. $ \' P2 g! n5 C
  647. cmd_error:
    4 t- z- c9 t" n6 u; k# C, E( d$ d
  648.         mov     ah,19 |  ~3 c- }6 m2 h( E7 a
  649.         jmp     cmd_exit$ }4 j- n) T1 V, S- L% U
  650. cmd_ok:9 h% P6 `* ?: r8 T1 |0 `5 E
  651.         xor     ah,ah( g# O. P4 t4 s8 ^: O- p
  652. cmd_exit:6 @& W; _# B0 F/ W/ E: W
  653.         ret
      R6 F3 o8 P0 }8 q

  654. 9 ?# d/ k: a' Y" V+ C
  655. new_33:
    9 L. R& w6 t9 h, J7 b
  656.         cli2 k: |& C) m: U6 F4 ?4 }* r  g
  657.         cmp     al,0
    ! Q) B# J' P9 K, m. H8 \
  658.         je      reset_mouse
    9 P- e$ H3 }4 a( A
  659.         cmp     al,1
    * T+ V- B1 _( E5 p; ~
  660.         je      show_mouse- g6 I4 G2 r& l, L5 C. A
  661.         cmp     al,2. i/ y8 U# z2 F9 S# {, j/ B
  662.         je      hide_mouse
    % W6 F+ W" m9 T8 m) e6 U' |
  663.         cmp     al,3$ T- S4 D2 }) H- n+ S) ~
  664.         je      get_pos' I6 v7 y, }1 |$ }0 V# x3 k5 N' Z  P+ W
  665.         cmp     al,4
      _  ~3 ~& s4 |) R
  666.         je      set_pos
    ; C. r1 S, h# u, T- R6 L$ P
  667.         cmp     al,7& S/ S& Q0 U+ l2 G
  668.         je      set_hor_pos
    6 j2 N0 G. O# j3 _* f
  669.         cmp     al,82 e3 d! A# b, o* L3 A
  670.         je      set_ver_pos3 I. v8 k4 K- s- W, i3 F) U3 p, Q7 q
  671.         cmp     al,0bh
    " n& W& f0 q3 M. N% V
  672.         je      get_mouse_movement
    7 e& a. R3 ^/ W- x4 Z( h
  673.         cmp     al,0ch
    % U2 b0 m- \% g2 ~" H
  674.         je      set_subroutines
    1 z1 C2 {% X5 a/ E" ^1 J" b+ q
  675.         cmp     al,14h' R: x% R8 n1 a( v! D6 e6 c7 M* q
  676.         je      swap_subroutines
    4 u9 W- ^, P% t
  677.         iret
    9 ^# N+ y0 z" ~5 H0 b
  678. , o+ W' G0 P8 l% [
  679. reset_mouse:
    - v% a* B. [$ X% ^8 X5 [& \$ h3 C
  680.         jmp     _reset_mouse# F; V4 b2 X$ m' z* U  H. O8 H
  681. show_mouse:( J; F% Y, E+ R; r; W# F0 C, k2 N
  682.         jmp     _show_mouse
    ( U4 b6 `, L4 f$ O! R$ |0 x& j
  683. hide_mouse:) M9 ^/ T/ Z; E* |. d. i, V% `
  684.         jmp     _hide_mouse, L' ], {  y4 W1 \/ j' K! r
  685. get_pos:
    / B5 q7 h( h; H& v+ j2 @9 f
  686.         jmp     _get_pos
    5 X* v8 H: r8 k4 i  A
  687. set_pos:% a, X) P0 }8 c6 q: ~
  688.         jmp     _set_pos, w( ^5 _. K9 K" [, w* L
  689. set_hor_pos:
      I+ e* m+ P0 }1 z( ^3 J* I7 b, ?" u
  690.         jmp     _set_hor_pos5 c$ B. Q$ M# U& |5 @
  691. set_ver_pos:: B' }5 |8 L! ^8 x9 r9 `5 ^3 }/ |
  692.         jmp     _set_ver_pos: Q2 K, E* H7 Q) e" b" X3 a
  693. get_mouse_movement:; v& I" G1 S9 R6 v- Q5 J
  694.         jmp     _get_mouse_movement/ X/ [7 j% g$ d+ F! x! f3 P
  695. set_subroutines:. U& h$ w% t+ i* _- K- K
  696.         jmp     _set_subroutines
    ' J8 i9 `$ }( T0 w0 ]2 L" \/ s
  697. swap_subroutines:$ r; D- d8 N) e, t* B- X
  698.         jmp     _swap_subroutines- T6 s( H# u6 y' w# {# G) s

  699. ! }  x1 a# Z# Q; z! t& c' q; m
  700. _reset_mouse:1 K' x& M# h/ _$ w0 R# N
  701.         mov     byte ptr cs:[buttons],0+ z7 }: t5 @2 M3 W. e. u% k
  702.         mov     word ptr cs:[pos_x],0
    , G# O. F6 h2 W" }- |! t, D# s& x: ?/ l
  703.         mov     word ptr cs:[pos_y],0
    : P3 s7 ]+ I9 ]" \. q5 D
  704.         mov     word ptr cs:[x_move],01 u# E+ I. e; O5 g4 E3 t
  705.         mov     word ptr cs:[y_move],0% B1 {/ c# v/ L0 E
  706.         mov     word ptr cs:[x_max],6399 H' V/ O5 `6 M( m5 m
  707.         mov     word ptr cs:[x_min],0" Y9 b$ _. D' }* w
  708.         mov     word ptr cs:[y_max],199( j4 S( `( }+ n$ ]
  709.         mov     word ptr cs:[y_min],0
    9 ]9 I* F$ {8 g$ ?) k; {" h
  710.         mov     word ptr cs:[user_mask],0& |' T$ }# [" r6 G
  711.         mov     word ptr cs:[user_subroutine],08 c/ o6 j1 P+ T  u; d% X
  712.         mov     word ptr cs:[user_subroutine+2],0
    3 I; z1 l- Q& Z; n1 Q2 @5 b
  713.         mov     ax,0ffffh
    0 m- G0 c& e9 M
  714.         mov     bx,3
    , w4 p& S: b- l
  715.         iret
    - v0 N5 \& y. L
  716. 1 i$ ?9 n+ N9 p
  717. _get_pos:
    8 n" }: L9 |2 R2 E0 A
  718.         mov     cx,cs:[pos_x]
    5 j+ r$ w1 t! o+ W  C2 P
  719.         mov     dx,cs:[pos_y]
    : b4 S; J* ^2 n+ S
  720.         mov     bx,word ptr cs:[buttons]' y0 N/ I" l: |
  721.         xor     bh,bh7 p5 b2 L7 i" K& e9 l
  722.         iret
    - u# w# y. m& [% {

  723. 9 W6 T+ Y8 |6 |6 T' J
  724. _get_mouse_movement:
    7 q: b7 H  Z' O6 a4 |) G
  725.         mov     cx,cs:[x_move]& e4 l7 v! w6 i- R, m4 a& n2 n& Z
  726.         mov     dx,cs:[y_move]
    : M3 ]! d0 B  ?8 @" s
  727.         mov     word ptr cs:[x_move],0
    ! O1 p: w% U3 C5 X
  728.         mov     word ptr cs:[y_move],0( h" m3 S1 y' F
  729.         iret0 y% R+ I, d' Q. G0 J( Z. g
  730. & m- ]. m; N5 R9 E0 R
  731. _show_mouse:2 Y  y0 V: ]8 W: B3 p
  732.         push    ax$ c) R4 N2 P7 |/ B  \) R
  733.         push    bx- Z7 w/ z& Z% n4 R# b5 U: Q9 c# [
  734.         push    di" b" ]! P7 ^$ W$ ]) E* @9 V- v
  735.         push    es
    3 {+ S4 a! j/ `6 h
  736.         mov     byte ptr cs:[sm_flag],1
    % w- Q2 U0 }6 m& b5 p6 @
  737.         mov     ax,cs:[pos_y]& h3 D( x; v1 L1 h
  738.         shr     ax,3
    + o2 N) ?% Z1 F' a  B; l/ V% c" X
  739.         mov     bl,80
    ) J( }8 b8 _; l* Y7 F2 t# \3 T
  740.         mul     bl
    9 e0 e4 L+ V! l5 z6 F
  741.         mov     bx,[pos_x]
    + U+ k7 }) M1 d" O7 H+ I  r
  742.         shr     bx,3
    6 x' R4 N' k$ X( D! ^' ~8 x% C
  743.         add     ax,bx1 t! }* j  f- a/ s' }% |7 S# p6 y
  744.         shl     ax,1
    ) K) D! k. n+ i& M& G' `7 }- {. j
  745.         mov     di,ax
    9 d2 r3 w* h% W$ \. o2 v
  746.         mov     ax,0b800h
      e! ?& E- Q1 H( O% C; \* Y
  747.         mov     es,ax- A  q- Y$ \  ^7 u7 I/ w
  748.         mov     ax,es:[di]
    6 I% \) d3 [6 \6 r. [
  749.         mov     cs:[save_char],ax
    : G* k3 D' b1 f% u
  750.         not     ah
    2 }' z6 S# u4 M
  751.         and     ah,7fh
    ( [. T) n) P2 ?1 b# M
  752.         mov     es:[di],ax
    9 h2 H% Z. O9 d% L
  753.         pop     es
    6 l7 {) z% n/ ]1 M- A" F9 \
  754.         pop     di
    ) t' @; E# A* o8 X$ Q3 g7 e
  755.         pop     bx; ^9 v0 L5 t. y" Z. j! }% E
  756.         pop     ax) h/ c2 q' c1 n& C4 f& Q  C# b, ]8 G
  757.         iret
    * X+ c/ `0 o/ J

  758. # A' U5 q4 U7 I2 }
  759. _hide_mouse:
    6 U5 H% \& B5 V0 B  V) P
  760.         push    ax- y* v' m! s" z8 l4 N2 Q6 a
  761.         push    bx
    2 A2 i* m) `  Q: R3 b& H  R4 \3 H
  762.         push    di
    % W8 A2 n8 @5 K" w% f
  763.         push    es. i' t, a+ t: ?: d
  764.         mov     byte ptr cs:[sm_flag],0
    1 X# @! m# N4 O& J# h+ ~- K# V1 u
  765.         mov     ax,cs:[pos_y], s6 I. b" V  b% `$ @
  766.         shr     ax,3
    ! }  _1 V; D# e3 D) }1 [6 L7 n& z$ ^
  767.         mov     bl,80
    7 F! V0 \; K) V8 O) N
  768.         mul     bl' x. \! o- R+ d. S! |$ g( a
  769.         mov     bx,[pos_x]
    0 c7 |# V5 V. h& U: u
  770.         shr     bx,36 f+ _' T5 ^( w8 H# x6 Z* _
  771.         add     ax,bx% _' O4 w% \9 k& v3 R9 g+ N5 g
  772.         shl     ax,1
    1 {. l# H: ]& K% l4 K
  773.         mov     di,ax
    # O, Z) t. b9 ~/ L& U7 B& j
  774.         mov     ax,0b800h( A, y" T2 C' g$ T" _4 W& w" w, Q% _% {
  775.         mov     es,ax
    : r. D9 v$ L3 D) N6 \
  776.         mov     ax,cs:[save_char]
    . M$ H, J4 q0 R9 Y; v7 n( I
  777.         mov     es:[di],ax; [# i  x# z& G$ O) l
  778.         pop     es
    5 r* J, w4 I8 s. O
  779.         pop     di
    / j; ]" S8 o& P. P
  780.         pop     bx
    2 h* W$ }5 \4 `6 s) V$ w# N+ d* L3 ^
  781.         pop     ax& W- v+ r( d. `6 e  P
  782.         iret5 f$ L* ^& e" Z$ O% c

  783. % M+ D9 L8 c1 g8 N$ Y
  784. _set_pos:5 ^- m7 N  f1 F
  785.         mov     cx,cs:[pos_x]" S1 r2 Z- l0 H; u: h3 @( J0 A3 y
  786.         mov     dx,cs:[pos_y]6 A8 d/ J7 S$ b4 f
  787.         mov     word ptr cs:[x_move],0: P" _/ F. j" o
  788.         mov     word ptr cs:[y_move],0/ O+ b1 f, h0 K3 I/ j
  789.         iret
    8 m9 a4 }" Y- O+ B4 ~& r. ]
  790. & D: ^# ~$ m8 ~) b0 n
  791. _set_hor_pos:
    ; O7 {0 d( o1 ?
  792.         call    max_min
    4 ?5 h2 p  w$ b: B1 @
  793.         mov     cs:[x_min],cx' W8 n2 W$ K- Q3 A; H1 x, L+ G
  794.         mov     cs:[x_max],dx6 B# I, F6 q4 U9 B1 N' I3 y7 t  v
  795.         cmp     cs:[pos_x],cx
    ! _5 D7 ]- I8 J: L) T. A' Q5 }. i
  796.         jge     good_hor_min
    3 D9 O2 q0 {& a) n6 D! l
  797.         mov     cs:[pos_x],cx% G( c" J8 n  {0 M6 F. G3 d
  798. good_hor_min:0 ]0 j+ _% P  c8 u
  799.         cmp     cs:[pos_x],dx
    4 i" v8 w4 ^4 X, U5 E
  800.         jle     good_hor_max6 C/ A2 C7 S  }" @) {' S
  801.         mov     cs:[pos_x],dx* ~& M2 c1 u5 q& K+ h0 a# ]( u% D; L& r
  802. good_hor_max:! U2 z0 X, \1 K$ A
  803.        iret
    ; |, X" I; v- _" O

  804. 2 c' R' f; p3 g* w
  805. _set_ver_pos:
    " f9 M4 Z# R) P) ^* `" Q
  806.         call    max_min5 ~2 E0 O% H" `! P2 B1 |9 `) v0 P
  807.         mov     cs:[y_min],cx8 ?. g- {. v* E$ t2 I
  808.         mov     cs:[y_max],dx
    $ Q* @. ?- _) z6 m7 m0 {, @5 u- a
  809.         cmp     cs:[pos_y],cx
    9 ~4 M" H% C7 A# v+ M4 c
  810.         jge     good_ver_min+ `3 |5 ^9 ^: W* ?
  811.         mov     cs:[pos_y],cx2 L% y/ K1 Q4 S9 K
  812. good_ver_min:
    , d& {) n$ Y- q+ d0 z1 [1 o# D
  813.         cmp     cs:[pos_y],dx
    / T2 H. ~. w- [3 j
  814.         jle     good_ver_max
    6 {0 ^9 E' L  o9 A9 V$ w: Y# R
  815.         mov     cs:[pos_y],dx
    / R/ M8 z+ t' t' z
  816. good_ver_max:
    : J3 a# @& p  g% ]5 w$ Z
  817.         iret& ^8 r4 H* \; Q7 W1 [1 e

  818. * V- a7 k, N- @+ S
  819. max_min:9 T( z5 ?" ]* a0 ^: b" z& \
  820.         cmp     cx,dx
    1 f0 N+ d7 S0 X6 E0 L$ r
  821.         jle     no_swap
    " X8 M" l( F/ D8 }1 q
  822.         xchg    cx,dx/ M! X4 N+ ~- U$ }1 s
  823. no_swap:# U6 c- b" Q3 ]- B+ V# y8 g9 ?% R
  824.         ret
    * z+ h) X+ `8 u

  825. 2 a: N% _7 \4 I  d" I4 T* ~
  826. _set_subroutines:$ P( L* e1 `& E9 c
  827.         mov     cs:[user_subroutine],dx
    ) x. y6 q6 D5 ?9 ]7 }/ d8 ^, o
  828.         mov     cs:[user_subroutine+2],es2 M9 p4 n# Z- H/ \$ W
  829.         mov     cs:[user_mask],cx* w$ b3 T5 T) H8 G: i
  830.         iret* c) Z. \" e% |$ d

  831. ' O% h) j; F3 d2 p
  832. _swap_subroutines:
    ) S  w& j3 R$ D6 |% G) }
  833.         push    word ptr cs:[user_mask]( ]- A( |; ?4 p
  834.         push    word ptr cs:[user_subroutine+2]
    8 g+ R  @: D. {  M
  835.         push    word ptr cs:[user_subroutine]
    * j, K% v/ n9 v4 ]* F  V7 r
  836.         mov     cs:[user_subroutine],dx
    * E4 [0 \- y9 |' v/ d4 e+ V
  837.         mov     cs:[user_subroutine+2],es
    ! i0 ^: r) A9 o& l, ~+ G
  838.         mov     cs:[user_mask],cx
    - R( q+ P: n( i/ q
  839.         pop     dx# k8 w0 X$ W" g3 d/ F# U' `
  840.         pop     es
    8 M6 [* M, X. H+ q) D3 j: m9 y
  841.         pop     cx% V' m& H7 }6 Q" ~- L5 t
  842.         iret  C, U8 r4 q1 g0 B

  843. , z5 G" b" M9 C
  844. memmouse        endp8 j4 t. F' o2 H7 E. N
  845. 7 f7 n$ O3 `( X, a3 z* M- ~
  846. endof_start:
    4 u1 S9 y& f3 s5 C2 q0 w$ q8 j

  847. / Q- J5 L; j6 c9 `1 Y
  848. emsg db 'No mouse driver install error!$': V3 O  v/ l5 A6 s+ L
  849. old331 dw 0+ W7 }7 \1 Q0 p9 k' Y
  850. old332 dw 0
    5 n6 N  ~6 [( h
  851. old741 dw 0/ [' e5 Y5 B, p( w) G$ M9 s# c2 O1 x3 N
  852. old742 dw 01 k4 p! ^4 t/ |" d- u2 s
  853. memcopy db 0
    * k5 t3 `( x5 {
  854. okcheck db 0
    4 i$ X* q# g6 d: x0 a' ^" V% {+ |
  855. pass db 0
    * X/ c' _2 Z. q- i0 a
  856. chkl db 0
    ( n" R0 R8 x  B. g3 ^. K7 [$ c! y0 v
  857. lk db 0+ z: l  Y/ b0 K8 i3 k: K4 u
  858. chkr db 0
    . W; C6 p1 m5 t' u- u/ j7 g
  859. rk db 0! n: t* Z2 {' `& n  K
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '/ k1 P- U1 T5 @( o
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    / q) S1 K) l; X! [0 Y
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ' J5 L+ `7 Y/ w& d
  863. db '                                                                                '7 J8 \$ H- P6 S
  864. db '                                赏屯屯簧屯屯突                                  '; G( E9 j8 t# Q% P) y% D
  865.         db      '                                ?OFF汉OFF?                                 '
    ( l, b6 r5 R+ ?; y
  866. db      '                                韧屯屯既屯屯图                                  '
    " N8 \4 p1 i' ]% U2 J* p1 w- y
  867. db '                                                                                '% G5 K0 c% T4 ?4 O
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    * h) y0 M+ ^7 {% W" U' s
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    - J6 [' {% T2 t( C) l! y7 f% J
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    8 ^/ A# }" @% v3 A7 |
  871. 7 L; x9 N& j, F) u
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!" B; B6 u- E* f/ A1 C% H0 V
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
# o2 N; _% `) q# K8 s& _( A1 |% }* _( y' A( ^* F
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 00:43 , Processed in 0.028700 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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