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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
. a. B# K+ f+ ?% M7 U% M0 @
$ ]. F+ ^6 A6 M, B3 E8 v) S9 S代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
      A; x/ R! ]: J! _
  2. ;          Ufoit PS2 Mouse test program   Ver 0.92 f0 b3 X3 A. T1 H$ {, H
  3. ;                                         By Bini.Yi 易祝兵0 N9 x! T( J" L. A
  4. ;                                         http://www.ufoit.com 计匠网+ o) v3 a. L: ]7 L! M* p3 S9 X
  5. ;                                         2002/04/06 YYYY/MM/DD
    % {8 C* n! l$ w( n+ D' n
  6. ;
    ) K# D4 u1 n+ \* A- C0 r
  7. ;            Q. b9 G! O3 T
  8. ;          This program  test the mouse button  click and move.5 I. v" G3 e5 S: d) P: s* ~
  9. ;% c; G4 T" j1 L* F

  10. / ^/ j5 K  O  d& t5 }! I
  11. .model tiny  ]1 E& a8 p+ i' Z, D1 D( X, u
  12. .586
    : G+ V% a) j2 m# z% ~
  13. .code
    4 p9 S( Q# V4 K; B' ~8 u/ _0 ^% e& e
  14. .stack  100h+ e8 O0 ?; c  s# i, w3 K. u  H
  15. .startup
    # q* x; d# E( g0 _3 A1 B* z% ^  z; D
  16. pusha4 M# ?0 n. T0 b6 @. V
  17. mov ax, 3533h
    9 L2 H$ }" F4 x2 N' }
  18. int 21h; u; B" j2 b% ~, b) T1 F
  19. mov word ptr cs:[old331],es
    0 z, p$ E" o" a9 o, @) Y  |
  20. mov word ptr cs:[old332],bx6 t+ ]- ^$ b. \
  21. mov ax, 3574h& W+ ^9 @7 u% Z7 F7 V
  22. int 21h" a# H7 O7 W2 N% \
  23. mov word ptr cs:[old741],es! L+ T5 j1 W  Z5 e3 u: t( \
  24. mov word ptr cs:[old742],bx
    1 V% y1 [9 O6 m( I0 S1 ~. V! A1 z
  25. popa* T, ^$ D% J$ G4 u6 R1 |
  26.         call    memmouse
    8 o  r! C. T: M7 A% j
  27.         mov ah, 00
    4 s9 I( r1 m" ]( k, e
  28. mov al, 03& }. w1 Y: e; v- T" v2 U$ w
  29. int 10h
    / t9 w0 y  g, U, r7 ~
  30. mov ah, 06' A. I, t7 c; F6 K# J  p3 P& |
  31. mov al, 0
    * L' v% w9 c; L
  32. mov cx, 0
    , m1 s, n- ]4 Z: Z% I
  33. mov dh, 24% Y3 M0 x2 k) ]) w: D
  34. mov dl, 79
    9 I" G% p# ?$ ]* s" N% }: r
  35. mov bh, 07h. U0 W1 m' Q) q) o/ \
  36. int 10h
    * G3 a& A7 H) }) r. x3 g# T: R
  37. mov ax, 0000
    9 Z' R- H% a/ ^  Q
  38. mov bx, 0002
    ' Y/ d# W. {  k; R6 _
  39. int 33h  O. l% h$ y' o# X& x$ X9 p4 ?; m
  40.         cmp     ax, 0000           ;if no mouse drive install
    / Q( e" z% ?5 G% J$ f
  41.         je      errormsg           ;show error MSG
    + {: ?' b6 D8 M  S8 |$ N/ E+ e! j
  42. mov ah, 02
    & P. P3 }9 c2 C: Y
  43. mov bh, 00# U( `. i. Z1 @
  44.         mov     dh, 25             ;Move point out screen
    & y" d" M7 _% @3 Q; Y' f8 p
  45. mov dl, 79
    / N- C& X6 C5 O6 U, c5 J4 Q. k
  46. int 10h
    0 w2 k: G* t2 k; O
  47.         call    showmsg            ;Show info1 a$ V5 e8 ]6 F- J' E2 G
  48. mov ax, 0001; S  {6 w  N; ~" ]+ X
  49. int 33h
    . E$ D$ U# N7 Q2 {* v, F+ `3 K
  50. ; mov ax, 000ah4 Q9 R$ N5 z1 ^9 _5 Z4 Y
  51. ; mov bx, 00002 d! y$ C. W! q& ~8 {  q1 t& y
  52. ; mov cl, 0h
    6 A" O6 W- m: `+ l! S
  53. ; mov ch, 0F0h
    ' ?  p0 z- g2 @/ }2 @( X$ Y
  54. ; mov dl, 0h
    7 e3 i% N, K# D& Y
  55. ; mov dh, 0F0h
    1 c0 b5 E! a1 v; r( t) O- P
  56. ; int 33h
    ( g9 N$ d+ N% Q7 v1 Y# o/ p$ y
  57. mov ax, 0004h
    % S  G9 u4 I5 O8 S
  58. mov cx, 0319
    . y% G/ `, s6 W3 k3 A
  59. mov dx, 0103
    $ l% W# c- D" G
  60. int 33h# y$ p8 f4 T& K- p  G9 q2 N
  61. casemo:                           ;Case button click and point move
    ! ?+ Y7 d" Z0 }9 T3 K( x/ n0 c
  62.         mov     ax, 000bh         ;and keyboard press* Z, P. s3 m: z* d+ A
  63. int 33h" S+ K, J; E% k7 O, h
  64.         cmp     cx, 00h           ;if point move....X- v& V  c2 k: [  h& U
  65. jne xmov
    8 _) E9 n: N. x  A  l0 I/ j, g
  66.         cmp     dx, 00h           ;if point move....Y5 r) a& p5 Z8 _! \/ c
  67. jne ymov& e  Y( e, d1 }1 R$ ~2 U. m; K  ~
  68. xymovend:                         ;X.Y move end
    0 R: a) o; S' `) F, Y% U6 g# ~& o
  69.         mov     ax, 0003          ( E& Q$ {. L: Y& Y) s4 W1 Y/ B; e0 _
  70. int 33h
    . P" q/ ~, r2 k7 ?, s1 r
  71.         cmp     bx, 0001          ;if left button click  show ON& c) s% }) p) T  b  K" d4 b# ~+ n
  72. mov si, 1828
    ) A! Y% F& z6 D; p& ~- n
  73. je listl
    + G2 W, O5 l; K1 w2 g' Q6 {
  74. mov si, 1828( |& ~5 o5 M" q
  75.         jne     nlistl            ;if left no click show OFF) s+ O+ i: ~; C  d* y0 t4 W( h6 t
  76. testr:
    % Y* @& B% S& N) |2 O: e
  77.         cmp     bx, 0002          ;if right button click show ON
    $ J8 T# n; q) y, l: n
  78. mov si,18424 \# n4 B. ]& M% p
  79. je listr) a; O1 |- p# K1 R$ w& |
  80.         mov     si,1842           ;if right no click show OFF
    9 @, Q  N& U% v5 X- G
  81. jne nlistl. c" t( l+ c+ h5 t  Q
  82. casekey:
    . H; ^& Q5 }& L2 ~# V  O
  83.         mov     ah, 01            ;if any key press jump check; Z) k8 ~& m& z
  84. int 16h" x3 `$ x# N  c' P1 K! c' D
  85. jne kpress: J' s9 s$ F% ?& j3 M" u: n
  86.         mov     al, [chkl]        ;check x flag( _( x9 `& J7 }' N, n+ r# A! E
  87. cmp al, 02h# B" y6 i0 S* o% X" x
  88. jnb chkok
    - r6 A. ~6 `  Y6 r* L
  89. jmp casemo
    $ S/ B  P; O* e8 T* G: h2 L
  90. xmov:                             ;if X moved, get the X flag+1
    ) U% P# Z! h9 n) h) X) y
  91. mov al, [chkl]
    # Z4 h3 M! C; x' o4 ]
  92. inc al- }( Z  z, o( O6 I# {& z
  93. mov [chkl], al, b0 T4 k: P6 D8 F; ?* W
  94. call passok# j. X& R- z  l' N
  95. jmp xymovend
    + o4 r0 @1 W: g* M. Y5 }
  96. ymov:                             ;if Y moved, get the X flag+1/ K  u$ Q8 u9 B- }2 K
  97. mov al, [chkr]
    # B6 F) Z; c% ~' D; Y4 c
  98. inc al/ R* b# P( T, X. y: w
  99. mov [chkr], al# z- E! f. R. H' A- p4 ^
  100. call passok
    7 x8 y" [7 F# T% e3 ~, v+ }
  101. jmp xymovend2 C- t! c2 a( a, S- V( E
  102. + b8 H$ Z5 r) D7 d, X
  103. passok proc near
    ) N7 H( e5 p9 x4 }% I4 O' Z, w
  104. mov al, [okcheck]
    ) `+ Z" y& ]) M, |$ B9 \
  105. cmp al, 1
    6 V) j. A2 ]2 c5 U
  106. je let0
    ' u; }% k: P8 ]. Q( F
  107. jmp passret) i2 H* X7 U& U) O
  108. let0: 6 c7 z9 Z2 b3 P; a: C# Q3 B
  109. mov [pass], 1- Y6 @5 J+ D6 ]$ Y, ]/ }
  110. passret:
    ( W+ k, u6 s' |/ c$ A) H
  111. ret' t* s: O9 X* G7 l
  112. passok endp 5 K* [  G$ [; W4 l* j4 Y) L
  113. / V2 y$ Y1 y# b& d3 c, u
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS1 d0 b  V  c. }7 V% k& D
  115. mov al, [chkr]6 j3 K/ U/ P4 H% M" {& I  `: S
  116. cmp al, 02h
    1 S$ s$ L4 J; e3 I/ H; A8 ]
  117. jb casemo( x* b1 g3 K; g+ ?6 t  ~
  118. mov al, [lk]
    & l3 `. n! f7 }5 z  ^
  119. cmp al, 1
    9 G2 k' ]0 L7 W! @/ L5 i+ D# w
  120. jne casemo
    - m3 I* @, T2 I/ z
  121. mov al, [rk]( i* y8 r5 j& z9 G5 s& w" X6 m
  122. cmp al, 11 V0 I6 L+ Z( H4 q
  123. jne  casemo
    & R% j* ]( t2 [# I
  124. mov [okcheck], 1) C" Q8 T' A4 h3 T" l* N9 r
  125. mov al, [pass]8 I! B1 A! F* u% o: M7 x  k
  126. cmp al, 16 S, i0 f! }+ d9 J3 [, \
  127. jne  casemo
    8 }% V4 H/ x# \( V: m
  128. mov ax,0002h
    7 [% d$ C; W" z/ X, L2 T
  129. int 33h
    ! p# D+ ~- N1 I7 F/ I
  130. call cleascr, J. g8 {* Y4 z/ b# v5 u" W9 K4 _

  131. ) v9 p' f. H! N
  132. call oldint/ b$ I. n6 {& I0 Y5 z
  133. mov ax, 04c00h
    ; e% M' J/ f6 C
  134. int 21h
    : |1 @/ }7 @- a

  135. + T3 ]: A4 d0 I+ ]/ ^
  136. okexit:
    % k: N4 d, c" \% o
  137. mov ah, 4ch, K$ q: H4 ^5 _8 y. q! y
  138. mov al, 0( U3 o5 J. Q9 Y8 }: u+ b
  139. int 21h. l3 C% A! a, h* x( {
  140. listl:                                 ;Show ON+ {. k9 x# [2 T  v/ U* o( k
  141. pusha9 v! [/ ?1 S  V7 y
  142. mov ax, 0b800h, f2 t( D5 K$ K# L+ }9 ~
  143. mov  es, ax
    ! g" R% i5 d( |% I; g; ^
  144. mov ah, 47h
    + [2 K; C( v& Q& s, m- d2 m
  145. mov al, 20h
    6 @. V) z  h% d. F; u" ~, x
  146. mov es:[si], ax: C, b0 p+ T2 K5 Y2 J6 @
  147. add si, 02
    2 o( K3 \& R8 m: f: Y, O4 U
  148. mov  al, 4fh  u" ]2 j' {% b- U# E
  149. mov es:[si], ax
    1 Y2 I$ |0 `1 E
  150. mov al, 4eh: X$ X. N  \: a2 y
  151. add si, 02) @. o- x$ l7 I) |- k: E: P
  152. mov es:[si], ax8 Y7 Y' m' K6 w3 O
  153. mov [lk], 1
    " O0 P, \+ m5 @- f/ H( _
  154. popa8 F$ q( m8 J) {5 Z
  155. jmp testr/ a1 [4 \: `; j- W$ i8 k
  156. listr:                                 ;Show ON7 }$ B' b0 ?& H' u8 _
  157. pusha
    7 ?' N; \. Y8 M) e9 i
  158. mov ax, 0b800h  S0 O+ y5 A# Y; n9 Y1 i. r3 {
  159. mov  es, ax
    7 B$ O0 {3 M3 x! P; }" D0 y1 j
  160. mov ah, 47h
      i  r, M' S& l
  161. mov al, 20h1 j: k7 }: T3 P2 p! e
  162. mov es:[si], ax
    8 l5 v4 A/ W0 `4 L" Z! ^/ I
  163. add si, 024 ~3 s" o# T% Y  s
  164. mov  al, 4fh) Z: l( R8 s2 h& ~; Q
  165. mov es:[si], ax3 r: O1 l' H( _% Q
  166. mov al, 4eh- L) G) t3 [& W3 v' m$ Q7 v
  167. add si, 02
    $ F! O( s, B9 i5 E+ |  Y8 I% V
  168. mov es:[si], ax& g) o2 N/ @! j9 n( i4 a3 K: A
  169. mov [rk], 1- y1 c4 M) u- H
  170. popa
    - H) ]- f5 X9 b+ ^
  171. jmp  casekey
    - }6 v! d2 ?9 _9 I
  172. ( R0 K/ w0 a$ N6 I2 V' q( Z  ~/ x' Y
  173. nlistl:                              ;Show OFF
    7 T, i4 e3 q$ {7 O7 w! ]
  174. pusha   
    ' T7 y9 o* g5 n; N$ `+ @
  175. mov ax, 0b800h
    # o3 P9 @* V# w
  176. mov  es, ax
    " |: _( j2 I" S4 U' _$ B" j' A0 z. ^
  177. mov ah, 17h: i# `/ a5 z% ~4 T
  178. mov al, 4fh6 J% @# V& h* @7 i9 t1 b6 W
  179. mov es:[si], ax
    2 K$ `; C5 S8 r6 c# j3 u
  180. add si, 02+ |. o' B6 ]: |6 v8 G, s' O; ?
  181. mov  al, 46h: x( T/ U2 c) d3 `  y% t& M
  182. mov es:[si], ax
    8 t# J% ?4 U( W# E
  183. mov al, 46h4 v" b, H* u' n* K7 t. w
  184. add si, 02
    . }  [( c' K$ k9 w' U) s
  185. mov es:[si], ax
    . i% h- W, J! u2 f
  186. popa
    # m6 w- m/ j1 s; g
  187. cmp si, 1840
    ' P" l( p4 k+ d9 g8 M8 ?( @4 p1 E
  188. jae casekey2 R' }5 O4 N  k' _. Q( r6 ?5 Q. ]& O
  189. jmp testr6 U' u- ?! W( H7 b' \
  190. 8 T+ [4 m4 Y. R7 ]. `1 m) q% H/ ?
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    ! N" B5 y, F, a- w' Y, r/ {
  192.         cmp     ah, 01h             ;and return a error
    ' C+ c, n4 O" n' Y0 C* _9 s
  193. je exit14 ?$ D' Z0 v+ J0 _4 U. Y/ Y  B
  194.         mov     ah, 0ch             ;if press other key then clear
    ! f/ _$ c% @: U, y9 w7 \9 _
  195.         mov     al, 00              ;keyboard buffer. d) H1 Z9 y( d- X+ W
  196. int 21h4 d9 H+ G8 o) W1 x
  197. jmp casemo * ?, t' B4 J& Y  a3 R% f

  198. 4 r8 e  X5 C$ R+ _
  199. errormsg:                           ;if mouse driver no install% f" B! W1 U# l7 ]% U! A: V' d
  200. call oldint
    5 `) S" h) y" p& X. ^" i* W2 g1 P
  201. lea dx, offset emsg1 c" g4 c" i) W7 q
  202. mov ah, 09h  u4 q: ]% r7 y/ q
  203. int 21h: q6 i9 ~1 y6 _% l3 ~
  204. mov ah, 4ch9 t- D. C: o% @+ Y8 g8 H& `
  205. mov al, 2
    : H! L9 t. L) C4 O
  206. int  21h! H$ w! r8 a$ R) c6 k7 f4 b

  207. ! p# q; g! j; e0 ^2 k# h: l5 }, q
  208. exit1:                              ;error exit
    1 {7 b# v2 V- W# N4 U% p
  209. mov ax, 0002h9 ]" U1 O7 \( X% v" ~/ e7 K/ t- [
  210. int 33h; T1 q* s# a: {. X
  211. call  cleascr
    ! O6 f, @0 O5 G1 o- ~6 U, a' V2 W! B
  212. call  oldint+ M+ h) \; l6 U$ p' }) |  I
  213. mov ah, 4ch
    & }0 W  P1 b& d% w" i
  214. mov al, 018 O9 T7 {! l/ a3 q
  215. int 21h6 V" z' I* \2 }8 `. v
  216. 2 z+ J7 B$ h5 Y5 E- C+ }8 ]
  217. cleascr proc    near                ;clear screen
    $ u, I% d* C7 q
  218. pusha
    2 i5 N3 A4 E$ ?. G) e
  219. mov ah, 06
    $ x' h' b$ U$ \' M+ o4 @1 w
  220. mov al, 0
    2 q3 X9 P: b% ^3 A
  221. mov cx, 0# j  E! R9 y+ w' j+ {1 A) N
  222. mov dh, 24
    5 r' {8 K  @# v: Q
  223. mov dl, 79( s( [( Q% L0 e$ n4 ^! l6 s
  224. mov bh, 07h+ S' ~2 p3 T1 P9 G
  225. int 10h
    4 X" Y6 d/ V5 [& ~
  226. mov ah, 02, A# [; w$ T7 a4 @2 N5 \' K
  227. mov bh, 00* `2 g  z( t% i: M# p$ c: ]
  228. mov dh, 0
    , E5 n9 W, Z1 X6 N9 ^) w- O3 Y; L
  229. mov dl, 03 B% b' n8 q( |
  230. int 10h1 T3 A2 [- I  Z" z
  231. popa' ^" s" x) r, v# I8 l$ ^# {
  232. ret: c8 i5 c' ?$ r& u0 c
  233. cleascr endp, O, C5 }% |! `+ r3 A/ d
  234. - {* ~) l1 N3 }6 |/ m
  235. showmsg proc    near               ;Show info
    9 ?9 A& [, A' I8 `% J% g& K
  236. pusha
    5 \% x; Y5 I9 N; J; i
  237. lea di, offset showms! {7 ~) e9 d& p( [
  238. mov ax, 0b800h1 |7 s: b( l, J5 c- \* l9 L
  239. mov es, ax6 n1 ]  T0 p) B7 s6 j( J8 Y
  240. mov si, 0
    ( [* a1 h8 _9 P
  241. mov cx, 480: r9 j, N# l; z% N: P- z; m: r
  242. mov ah, 07h0 D& f3 R. V5 O( O. H& t: {
  243. @@:0 w7 ?7 F1 ^# h9 l+ K4 B3 z
  244. mov al, 20h( v+ n/ _7 F( l& G: l; T) w
  245. mov es:[si], ax0 T$ V+ F; Z* u2 Y2 \; Z9 q; j
  246. add si, 2
      A- E/ [1 X1 W0 F- W
  247. loop @b
    $ J* m$ F+ I3 i- N3 n0 p' {
  248. mov cx,880
    # K  T- D4 ^4 R6 s, `6 h
  249. @@:
    + r5 V/ |( T6 w, P; U
  250. mov al, [di]
    4 b1 a- t% N, h& A8 X1 \( |* Z& S
  251. inc di
    4 [. S5 E7 ^) J& d, o8 g
  252. cmp al,20h
    7 `. Z8 J. Y  [4 }. g$ N
  253. je showch1
    0 @( x$ r$ M) d! h5 C
  254. mov ah, 17h2 u$ ^- {8 Z, y8 }0 ?9 \
  255. jmp showch3
    8 N0 n0 h% W- _' s  Q
  256. showch1:8 s( Z- C: i1 _# F
  257. mov ah, 07h
    7 t6 @: v0 g* ?' {% c: {7 [- a$ j
  258. showch3:1 y& `1 N& }1 U- y$ O
  259. mov es:[si], ax
    / m& E1 G* u# ], Y
  260. add si, 2
    ( t" C5 ]/ A1 v  U/ g, u
  261. loop @b9 `5 k' n0 m) d2 D" @
  262. popa& c0 ~+ h- E  w. p, A
  263. ret
    1 p, x% T$ L/ U
  264. showmsg endp9 S; q5 ~8 c6 w; z" n( `% P% l

  265. 7 r& O# H( J* ~+ F0 c& G: S
  266. oldint proc
    : v; S. \6 q+ ]4 E* E+ n  @4 _& Z
  267. pusha5 ?6 z" R: P8 T, B5 G
  268. mov ds, word ptr cs:[old331]
    + d: J4 U7 V6 l6 a
  269. mov   dx, word ptr cs:[old332]
      b6 n, v4 b' W/ ^* s
  270. mov ax, 2533h
    / J3 K, y' {; [7 A, \+ G! O
  271. int 21h$ l5 w6 p7 f7 u) d6 [
  272. mov ds, word ptr cs:[old741]/ E4 W, ~4 ?7 `2 [8 S
  273. mov dx, word ptr cs:[old742]
    $ M! D# l2 R6 A1 ?# J6 a- A) I
  274. mov ax, 2574h
      B4 \6 |# ?+ e( v1 \& g
  275. int 21h
    " a! A; }5 b4 e
  276. popa! m+ |, P2 H3 B: J7 T. A8 Q6 ^
  277. ret
    ! M  I- b7 A, {5 O
  278. oldint endp
    9 I8 ~1 k- J+ C9 W9 u, Z1 a

  279. 2 A  a$ c  V2 W2 O. p: T9 o
  280. memmouse        proc: ?. r1 H4 _+ N' b; g
  281.         xor     ax,ax# a0 D0 h$ U3 i$ e; j% E* c
  282. int 33h
    / |! X2 m2 P4 O* ]( g5 Y/ M
  283. cmp ax,0ffffh+ i9 g/ N" R  s9 m5 V5 V5 I
  284.         jne     not_loaded! Z7 t. G2 D7 l$ B9 J; I
  285. mov [memcopy], 1
    8 u* l& \9 o2 p
  286. ret
    9 Y1 L' L, i- M. G( k

  287. 3 b3 `: F( y9 r2 K0 O* `: a7 h6 |
  288. not_loaded:! }* B8 R! K! R7 X

  289. 7 \- C5 J  z2 x5 ]1 |# w9 X# m+ p
  290.         mov ax,2574h
    % H: u8 ^' V& X+ F
  291.         mov dx,offset new_isr0 \3 `+ ?) w) I0 x
  292.         int 21h
    4 a/ x! l5 w. I. k  \+ z

  293. # f. H( d" ], \( `6 y  g* x
  294.         mov ax,2533h  M5 X* D0 s# S" {6 D0 I
  295.         mov dx,offset new_33, c3 w0 Y9 R' x9 u: S& {/ ]
  296.         int 21h
    $ R3 T% v: k# a

  297. : C+ P% a" V+ l4 M
  298.         cli
    % V& X9 F/ E+ Y" m$ U2 B0 u
  299. + ?+ v4 e2 M; T8 c& ]
  300.         mov bl,0a8h' y) ^1 p  L, h0 d( q% q  S4 i" H$ |
  301.         call keyboard_cmd
    $ e! Q' U+ y  H+ s9 ]

  302. ! e$ Y" u9 h  N% s4 M* s3 b5 ?% q
  303.         mov bl,20h$ g( \7 N" c$ F
  304.         call    keyboard_cmd2 y4 ?3 m2 ]3 M+ m9 Q
  305.         call    keyboard_read
    ; }9 X( l; w1 k# e/ ?8 T0 M
  306.         or      al,24 N( E! {3 A0 S! S) ^0 C
  307.         mov     bl,60h* q0 P8 ?5 E! B* v* J3 Y
  308.         push    ax. T) J. h& R4 `' s! e! O5 y+ p) w% c
  309.         call    keyboard_cmd3 a# \# F. k8 ^& G/ a8 d5 C
  310.         pop     ax7 O5 s/ m" L# z
  311.         call    keyboard_write
    5 t. ]$ x2 j9 W5 C8 H

  312. + p0 _4 v( \4 ^
  313.         mov     bl,0d4h0 R5 g- }9 a. Q& k
  314.         call    keyboard_cmd
    , \& T0 Y/ c! y2 u2 @/ L) H: G
  315.         mov     al,0f4h! o5 P0 a. S( G& r* Y; U
  316.         call    keyboard_write+ d2 S7 E: j$ h" y# z
  317. " t$ b, X; f, Q- w) r
  318.         sti
    - T+ t- ]0 N/ j$ I4 e5 \- J3 d+ m
  319.         ret5 m9 i) `* p$ M8 Y+ P3 a
  320. call_user_isr:& e9 e* ]/ c/ T9 t! v7 W2 C- \; [- Q
  321. db      60h
    6 `: k1 a9 L) p1 ~
  322.         mov     cx,cs:[pos_x], b: R; B- d( _2 G6 M$ I9 g' x
  323.         mov     dx,cs:[pos_y]
    * U2 z1 Z+ ~# u1 B3 H, P4 e  C
  324.         mov     di,0 ;cs:[x_move]
    - H% F* s4 Z4 a6 |8 `: \5 P. w2 ^
  325.         mov     si,0 ;cs:[y_move]4 u% i0 e( \  P- Q0 m
  326.         mov     word ptr cs:[x_move],0# E% x& }! d) n# V& |
  327.         mov     word ptr cs:[y_move],09 u3 t- y  F( r; J2 j1 V
  328.         mov     bl,byte ptr cs:[buttons]( l- _1 O! B: P0 X4 s/ v
  329.         xor     bh,bh
    ( o* ?) W( }, J; I  m) \% M7 Z
  330.         call    dword ptr cs:[user_subroutine]* f! O5 d& J& I# a6 a, B# {
  331.         db      61h1 u$ Q' T& L5 X
  332. ret
    ) I0 h7 ~) C* s8 e4 o/ j
  333. new_isr:
    - G0 q8 s" Q5 n+ f/ C/ f* e% e
  334.         pushf
    ; n  _6 h$ w; L) z5 B: v( \
  335.         cli* H" w1 t5 \" p6 R' s9 e2 d7 o
  336.         push    ax
    9 K! z/ j, A1 U
  337.         push    bx6 X1 M5 C1 H) D9 B! i2 H/ a" _
  338.         push    cx
    9 W+ L; G* D0 C: h( M5 g
  339.         push    dx  B& O: @3 i/ W; P$ b, Q0 [, ]0 l
  340.         push    di
    1 ?# A$ t* N$ v6 X9 A$ M3 ]2 Y
  341.         push    si
    % K& X( q* g8 w& [; j) r4 g0 T
  342.         push    es. N+ s* M6 U0 z2 o) [
  343.         push    ds: T0 Z( C3 z, H. P$ `" @

  344. ( b6 s7 r# Q1 w  B# }* W5 v  {
  345.         push    cs8 _6 W7 I( w/ P' F# D
  346.         pop     ds
    2 k- w! g: Z9 l3 |" [& j! v

  347. . Q3 p% \+ @/ G: _8 C
  348.         mov     bl,0adh8 c. M- U# Z7 x& F$ b( a4 ^; V8 K
  349.         call    keyboard_cmd
    ' P! F! Y5 Q+ [. P

  350. # h3 V1 k6 K* z+ F* F
  351.         cmp     byte ptr [first_time],0% Q6 y- `9 e8 R+ Y
  352.         je      not_first_time9 \. p9 Z; p: g) m* ?

  353. % m% P2 Y7 a; n* E) D
  354.         mov     byte ptr [first_time],0& i- P( E8 e0 s; B; |( G
  355.         call    keyboard_read# _4 M# E) U9 e% ?% u
  356.         call    keyboard_read
    # {) q# @, D1 ^
  357.         call    keyboard_read% D, _* l0 `$ i" d$ F
  358.         jmp     no_show
    ) v" {. h$ }/ \& [/ E/ c- u( _3 G, D; c
  359. / n. k' ~6 e: R6 F* o/ M
  360. not_first_time:
    : v) P* p- C. X' [6 M% |. F1 Z
  361.         mov     word ptr [temp_mask],0
    ' l8 ^6 R' ]) R: i5 G. N

  362. 1 N  v( w7 r# v( F# l
  363.         mov     cx,[pos_x]
    8 Q& ^, e& [2 b9 w. H
  364.         mov     dx,[pos_y]
      X. V8 a! h8 H2 i1 z+ @
  365. 8 o, I( Y1 [- ^8 |0 q+ o: x5 v3 y) k
  366.         call    keyboard_read) T$ ?3 T7 A' @, T4 ~
  367.         and     al,7 ;32 n$ K5 ~* ?( Z2 H4 e
  368.         mov     ah,[buttons]- {9 e9 t3 N, z" w4 F+ ~
  369.         mov     [buttons],al
    + \! b7 e9 L2 A' T. [
  370.         cmp     al,ah
    / o- W% a- A, X. `4 P; J
  371.         je      no_button_change
    5 H2 |( v' Z8 }
  372.         and     al,3
    - ]" ~$ b; A9 Q7 [) H' o
  373.         and     ah,3
    4 c1 F) |5 Y2 k0 w+ }
  374.         xor     al,ah. M- C' z/ R/ E; I/ p
  375.         xor     bx,bx) b2 s- C6 d; \' ~3 h
  376. 1 @  W& C# G9 E9 Y6 |* J( J' D
  377.         push    ax2 R# F* L! [( A8 C0 _& Q! Y
  378.         test    al,2' t& Q7 q. a7 b6 F
  379.         jz      no_right_button_change: T6 v1 }6 }* d0 s) C
  380.         and     ah,2
      ]1 l  g& U# j' S6 _
  381.         jz      right_button_pressed5 _# }/ N" ^8 s; e1 w) Y1 b' p
  382.         or      bx,16
    ) D3 d' ?: g" [
  383.         jmp     no_right_button_change' A9 h) ~- R+ y, L/ Y
  384. right_button_pressed:6 t2 k5 ?7 K! E, K
  385.         or      bx,8  z" X7 x2 G: Q/ @
  386. no_right_button_change:9 }& [# C1 r$ R& X

  387. ; A- @- Y- a' \. ], \' a
  388.         pop     ax/ H# k, ^5 K0 Y# E( h+ G% j) D
  389. 4 K4 O) d; O& S& p- J
  390.         test    al,1
    5 m* A  f5 c. D8 y7 r# r
  391.         jz      no_left_button_change! R0 n/ G. T7 u3 H! s) K
  392.         and     ah,1
    . _0 J7 c$ y5 c: d0 m" Q
  393.         jz      left_button_pressed' b3 T' T5 v, x+ c8 x
  394.         or      bx,4% z6 |" S- r1 G( X2 K4 `1 j2 K
  395.         jmp     no_left_button_change( P6 I& e' K9 ^
  396. left_button_pressed:2 l1 s+ A% }0 c
  397.         or      bx,2
    & f1 M- {( d. f) u& T: q& |4 _
  398. no_left_button_change:* V5 [$ C& d. U5 w2 g
  399. + C+ ~( ]/ r9 F' X& Y; W" }7 w0 P$ h
  400.         mov     [temp_mask],bx
      J$ T, V, g* }8 B% b! T

  401. - [, E: g" M, S; W! ]/ k# |. y
  402. no_button_change:
    $ v3 Y, V  i4 T
  403.         call    keyboard_read
    $ H, X7 s7 g! ?4 A  L& T- Y" B
  404.         cbw9 y' l% W" m! O) e9 f: c
  405.         add     [pos_x],ax" X7 D5 l" h1 i$ ~. U
  406.         add     [x_move],ax- P- j. M/ n" i8 p; {5 K
  407.         mov     ax,[x_min]
    % B0 t  Q# f" Y/ g$ I3 U) x
  408.         cmp     [pos_x],ax
    , e, V  }( B& Q0 V& l
  409.         jg      good_hor1
    3 O7 C6 a8 p( M' r6 k
  410.         mov     [pos_x],ax: j- \9 V9 Z- y
  411. good_hor1:! h1 C2 q6 E1 [7 q7 a
  412.         mov     ax,[x_max]% p! ~6 c- L, N$ D, N7 c8 s
  413.         cmp     [pos_x],ax5 N; ^2 h# v. ~: D8 M& K; c2 Y
  414.         jle     good_hor2& v2 F) g. L2 [8 o3 H0 l! {' f
  415.         mov     [pos_x],ax
    . e9 X, y* N0 p" o6 E: k" `6 N
  416. good_hor2:: g9 |( g; O9 v, |6 D

  417. * u0 R) v1 M& Q8 u2 p' s
  418.         call    keyboard_read3 |; q, |2 P& L1 }
  419.         neg     al1 x; F9 w* {2 @+ }* Z1 w
  420.         cbw( y7 C, s! j6 R
  421.         add     [pos_y],ax
    5 M6 b! M! R3 s* O5 W9 o
  422.         add     [y_move],ax9 K) A+ @7 z' p, |
  423.         mov     ax,[y_min]
    $ `7 R- n7 h1 a* v3 Z7 n
  424.         cmp     [pos_y],ax+ I3 j; a" f& B# B  U
  425.         jg      good_ver17 o5 ?: k, N; Z
  426.         mov     [pos_y],ax
    ! u5 X( I3 T5 Z4 X( R
  427. good_ver1:  g( o, N8 g5 R# f5 G' A' S
  428.         mov     ax,[y_max]. M# g. x. O2 b  S1 V7 P  K8 Q
  429.         cmp     [pos_y],ax
    ( b: c8 P0 X" Y
  430.         jle     good_ver27 E- ?. [7 {) o, G% M' ~! H
  431.         mov     [pos_y],ax
    + I' E6 }) G) K7 I" ]# E; a
  432. good_ver2:
    $ ?" v( A# {) M4 c$ D/ @

  433. 3 D* N2 D# ]) g9 z
  434.         mov     ax,[x_move]- v4 Q. U$ {) J  j$ s) w; o0 R
  435.         or      ax,[y_move]
    2 P# [* A% b9 C4 Z
  436.         or      ax,ax
    9 w6 x7 i# t' [* @0 e; L
  437.         jz      no_change_position6 f/ Q* ]9 p1 `# i3 t+ x- Q
  438.         or      word ptr [temp_mask],1
    $ |+ a" w( q1 [
  439. no_change_position:- i- E: c) ?8 l) F7 F5 R

  440. : a% u- @8 E0 W
  441.         mov     ax,[temp_mask]' Y. e% J9 x* ~
  442.         and     ax,[user_mask]1 m$ |7 F) X! o; i- W6 p
  443.         jz      no_call_user# ?0 Y5 |$ D  E! a9 S
  444.         call    call_user_isr
    : D# T' o' Z$ B6 J
  445. no_call_user:/ l& C( Q3 \% G* x+ F
  446. - i2 k" Y! q. J. c, U7 {/ m3 h
  447.         cmp     byte ptr [sm_flag],1- t$ c  t/ U$ O4 W. t
  448.         jne     no_show
    ) {5 k* f! l! w- s

  449. + @5 v/ f1 A0 z3 u& r& |6 R
  450.         shr     cx,3
    9 ~% `, D) v" l6 ~3 |& q
  451.         shr     dx,3
    0 Q0 Y) D* }6 d9 Z
  452.         mov     ax,809 ]* V1 Z3 N! E8 t/ `; x1 B5 Z
  453.         mul     dl
    & u  b$ D8 K  d" Y2 B0 z
  454.         add     ax,cx
    0 ]" E5 d! T9 i5 H4 z  a
  455.         shl     ax,18 w* P4 f/ a0 ?' y! m/ ]2 `
  456.         mov     di,ax
    9 l" F+ o1 v; X) R
  457.         mov     ax,0b800h3 Z/ }/ ^  E5 u/ ^: u
  458.         mov     es,ax2 G/ |4 O4 Z' n1 R' p
  459.         mov     ax,[save_char]9 P7 a) z- I$ i$ t' E; l' Z. T! K
  460.         stosw
    3 F9 a7 t1 V' A1 u
  461. ' T5 [8 r" K5 b/ v8 Q  g9 X9 T
  462.         mov     cx,[pos_x]' N* _0 T/ g0 Y3 \& i
  463.         mov     dx,[pos_y]9 e+ E6 @/ n" ~* P
  464.         shr     cx,3& H$ J8 f! M) ]$ h! p3 V
  465.         shr     dx,30 v, t6 Q2 l' G9 r$ A
  466.         mov     ax,80
    / `3 N. y9 M* t+ |
  467.         mul     dl: O2 }) k/ N9 z+ p! c% h1 }
  468.         add     ax,cx7 h/ i1 p/ m/ }9 a
  469.         shl     ax,1
    0 ^' A0 Q# P3 \* r
  470.         mov     di,ax
    # Q/ L2 a2 \/ q4 \- a$ Q" T0 d) m
  471.         mov     ax,0b800h! d  i9 j$ X/ V2 _- y( n
  472.         mov     es,ax4 W( V! y% Q* q/ |  g) O% j/ L
  473.         mov     ax,es:[di]4 d" r1 R) ~6 r4 }1 {
  474.         mov     [save_char],ax% f  K5 ]( }- B7 H7 O, {
  475.         not     ah
    ' U( H. h; T1 H
  476.         and     ah,7fh8 M& N. q% X% F3 R" Z
  477.         stosw  g1 _  f9 c3 s, @" F6 V  s: F
  478. no_show:
    6 G# m- c0 `# b" j, f" I( I
  479.         mov     bl,0aeh( K5 g, }& I5 w. l
  480.         call    keyboard_cmd7 D+ u0 G* u7 P- v0 g, l4 P
  481. , w9 K- V, u* L$ s! ^0 p
  482.         mov     al,20h
    3 m' k& m/ L! E4 }( }* A0 U+ \1 f  \
  483.         out     0a0h,al
    # b- S2 S) ~7 A4 a, m
  484.         out     20h,al
    ! n  W: x  C* H4 f

  485. ! v; R! B( B( \9 f( e/ a4 R
  486.         pop     ds7 m$ x* c9 a5 k5 X% U4 t
  487.         pop     es; _* f# [( ^# @7 {# H: i* ?
  488.         pop     si
    ( B4 {* G9 `) i7 ^* d& {
  489.         pop     di' w6 O8 ^. e$ t* Y; t! ^
  490.         pop     dx
    ( ~- t% \) x! Q
  491.         pop     cx' ?# [2 B. ~- p+ p
  492.         pop     bx4 |: i# e+ q: G8 e# U* P* {
  493.         pop     ax
    ) z" A; }! T  F; i
  494.         popf
    6 p& v# i) }4 ?) j# N" W
  495.         iret. s6 v( H# H. }, X
  496. 6 r: n6 r6 y7 n. @$ U2 l, c# P
  497. first_time      db      16 E8 y/ i4 |+ ]0 s' a
  498. buttons         db      01 C1 S2 a6 g7 t$ L$ U
  499. pos_x           dw      0
    2 i3 [0 e$ P% ]. R' D! y
  500. pos_y           dw      0" O9 c8 [9 l* |6 ~3 l6 G: U1 i
  501. sm_flag         dw      0* [/ Q! B7 f7 r7 f; J& o3 q9 o
  502. save_char       dw      0! c& l& |4 r$ X4 c
  503. x_move          dw      0
    5 u* G; W, e$ I+ [/ b! z
  504. y_move          dw      01 S# k7 a6 t6 F( T, p
  505. x_max           dw      639% L: J/ ?. P$ s
  506. x_min           dw      03 N! u. M) Y7 Z# \; }
  507. y_max           dw      199
    ' E2 U$ t1 e6 r6 N
  508. y_min           dw      0: J/ ?0 l" Q( r& o7 J6 b* B
  509. user_subroutine dw      0,0
    9 Z- f' T/ P. j5 D
  510. user_mask       dw      0
    * ?. c: ?; L. w: O/ g/ C# k
  511. temp_mask       dw      0( D; n4 d9 \( x3 E( q

  512. " Q; n( G2 A) R1 H
  513. keyboard_read:
    + |, b% Q3 I+ O, W. d! @
  514.         push    cx
    * P- \/ m$ I1 `  y! f
  515.         push    dx% o9 n2 u+ h9 z( ?2 W' u8 _* w
  516.         xor     cx,cx
    ) T* @/ T. q' n/ b- Q' D
  517. key_read_loop:  A  D8 p- w; ]+ N, g; t- e
  518.         in      al,64h9 e8 @  V& t" s
  519.         jmp     $+25 `; Y' k( g2 O1 ?
  520.         jmp     $+23 X7 z, D, f' e$ S1 C; Q) V9 ?
  521.         test    al,1! c7 B) s* P) T6 F7 w( l
  522.         jnz     key_read_ready* K( `  c5 D/ m! a
  523.         loop    key_read_loop
    9 A: u2 ?  B2 q+ W; d
  524.         mov     ah,1- r( z9 X3 O' H0 r
  525.         jmp     key_read_exit
    1 g) E. W. \5 z  g% S& k  |0 w
  526. key_read_ready:
    + ~. r5 W  E6 B+ @
  527.         push    cx4 a2 c0 f2 S2 w2 y
  528.         mov     cx,32# i. h: }9 e+ L' `# i7 Y4 Q: b
  529. key_read_delay:
    * B, }0 M3 T1 G, A$ I
  530.         jmp     $+2
    " ?6 ~( T9 C6 Q7 J5 O- v
  531.         jmp     $+25 N: b+ W/ B  Z7 p4 M3 V
  532.         loop    key_read_delay
    5 t3 y4 T3 g0 _0 [

  533. : s+ n' m) {( z3 D$ v0 o4 J
  534.         pop     cx
    $ g5 b0 `, A2 _

  535. $ e9 u1 G4 S' |' c  R
  536.         in      al,60h3 U! t4 _0 E: x) T) V
  537.         jmp     $+2: Z" p0 G/ {! B7 q/ t. b) m
  538.         jmp     $+2
    . ~0 B( g9 C. ~8 d& y5 |9 j
  539.         xor     ah,ah  X5 ?% ~  F7 C9 m6 [) D
  540. key_read_exit:- o& E# A2 [) |6 i
  541.         pop     dx
    * z& I/ o% i9 N
  542.         pop     cx
    $ Y7 H9 w8 E' l) b
  543.         ret
    / V: Y* ?& i. S. a9 w
  544. : [+ I& F# J/ Z) n# d
  545. keyboard_write:
    0 ^0 n7 `- {) J
  546.         push    cx4 d  z2 Z. {1 V
  547.         push    dx
    - B; f! i! ^+ B% j1 Y- K
  548.         mov     dl,al. {5 }- z& W2 O( E! C& w
  549.         xor     cx,cx
    9 ^+ k7 e# A. p! n3 }
  550. kbd_wrt_loop1:) W2 g8 C# F" \5 J: ]
  551.         in      al,64h
    ) `; Z# F- x0 ^( Q- `8 u
  552.         jmp     $+2
    ; J: z8 A) k8 W: C9 E' ]+ v/ v% s
  553.         jmp     $+24 u3 c2 G/ \5 O# z
  554.         test    al,20h; v3 q. p+ R. P
  555.         jz      kbd_wrt_ok10 I; ]4 T7 B* o& f- H1 B" }

  556. / S% U/ q+ R6 H9 c: r' ]% d
  557.         loop    kbd_wrt_loop1
    8 R+ V: S( p: D" @1 d& R' h

  558. 5 T4 D. E! B6 H
  559.         mov     ah,1- x* ]' f- b) s2 Q6 v# Y+ ]
  560.         jmp     kbd_wrt_exit
    0 e" s- w- a1 E" b% E' D
  561. 3 @9 C, e3 g/ @7 [
  562. kbd_wrt_ok1:9 ^) [1 U2 p' |1 R+ P
  563.         in      al,60h
    & K. q; h$ ~% m; m  K' ^: V4 L
  564. 9 c# h+ e, X$ L$ Q# a
  565.         xor     cx,cx. W; _; d  J( C. Z8 e6 L
  566. kbd_wrt_loop:- j, j; P5 F& P
  567.         in      al,64h
    5 z# }! [. D+ b. ]3 e
  568.         jmp     $+2
    ' P" e5 N+ C7 g3 ?5 g6 x. I* q) o
  569.         jmp     $+2% p* v' |+ E2 W8 }  Q2 a
  570.         test    al,23 `5 l9 \) F) S
  571.         jz      kbd_wrt_ok2 O2 ?. y# I9 m

  572. 7 F0 `  c9 e. ?8 l9 n( T. q
  573.         loop    kbd_wrt_loop  J( T1 p' W9 I: ?5 A3 E

  574. 8 `8 J4 Z, B' C3 T* d
  575.         mov     ah,1
    / L8 L4 i  b( o+ n1 y7 l' N
  576.         jmp     kbd_wrt_exit5 b8 j5 D' W9 t5 `% \
  577. # O6 W5 B. _" n
  578. kbd_wrt_ok:: o4 q1 H  Q% J" K; g# ^- d* ~
  579.         mov     al,dl
      F9 C# ?, ^; p
  580.         out     60h,al% q* W0 Q+ b& R5 a6 H: _0 Z
  581.         jmp     $+29 P2 f$ Z, @" [) w+ H
  582.         jmp     $+2
    ! j8 C* i: [7 R3 q; l* M; n- G
  583. 1 p- S( N3 X1 k% m
  584.         xor     cx,cx
    ! _+ l  O% r: ^' c! r% `5 C
  585. kbd_wrt_loop3:$ d# d9 ]- Z) h
  586.         in      al,64h
    % r( i5 p4 V5 w* Z8 C. y9 p0 e
  587.         jmp     $+2
    9 R9 X+ e* f) l' R
  588.         jmp     $+2! h: D) U3 p; e! h  G3 D  W
  589.         test    al,2
    5 Q  C8 R' P) s- v
  590.         jz      kbd_wrt_ok3
    5 G$ A0 l' q& |  m' s% b
  591. . I2 N+ m$ P# P7 A4 s5 i$ K: x7 B7 v
  592.         loop    kbd_wrt_loop3" @) {. Y0 {6 k/ \6 x  P1 G

  593. $ \6 }( N4 P2 J8 y
  594.         mov     ah,1
    : y. v0 X' t3 x$ Z. A; L7 X
  595.         jmp     kbd_wrt_exit
    7 b" S7 ]) h2 j7 a* y; U5 j1 _" X, {
  596. $ a" L5 h, d- S' L# Y/ k
  597. kbd_wrt_ok3:4 c. Z) u! [( B; B4 K6 Q
  598.         mov     ah,8
    + C# [! B8 y, l+ D4 I8 V+ ?3 P" \& q
  599. kbd_wrt_loop4:3 I, [) V/ h9 U, a4 N) p
  600.         xor     cx,cx
    8 ]" R+ R! {1 \" ~/ L
  601. kbd_wrt_loop5:
    ) `& a% [; j# `8 Q! x
  602.         in      al,64h. h; j/ N# z, a% S: z
  603.         jmp     $+2% C/ R. F$ t9 {8 B$ j
  604.         jmp     $+26 f* b6 h' w3 m) S# Q" B
  605.         test    al,1
    $ \4 [! Y: K9 d4 {* F3 ~
  606.         jnz     kbd_wrt_ok4' b7 `7 Z# D, d

  607. / V8 b* s$ p' \- V
  608.         loop    kbd_wrt_loop5
    6 F5 l# ~" u9 w  G: J1 [2 i

  609. : {2 L1 s8 H; }( O4 `  F$ N5 |
  610.         dec     ah
    2 S7 s5 J( e6 w
  611.         jnz     kbd_wrt_loop4: P1 G5 Y$ h( D5 J
  612. 2 f$ {$ k# B1 e
  613. kbd_wrt_ok4:- y# O4 Q( }/ T
  614.         xor     ah,ah
    ; A8 O& q* |; q% Q2 z/ L# c. {# y
  615. kbd_wrt_exit:; ~) c0 K; e1 T; k
  616.         pop     dx8 Y) d* _# y8 }) Q2 X$ j
  617.         pop     cx
    0 U0 J* Q$ f% {' h. H1 y. c5 q- k/ B
  618.         ret
    ! Q) t3 b: D4 @' H  C
  619.         
    $ l' Z% g7 I. d3 @
  620. keyboard_cmd:* O; l) x8 ^+ _4 l0 N; Z
  621.         xor     cx,cx, ]# r: F7 _# A  K4 o
  622. cmd_wait:/ G6 m/ ?8 ^% L- y, F
  623.         in      al,64h4 j' Y$ j- }" B% o
  624.         jmp     $+2
    5 z: m) f4 j0 @4 W0 u/ A# K
  625.         jmp     $+2
    & u0 A: `) K: M5 H* @' S
  626.         test    al,28 g* ^4 S$ W+ e& |* L: p
  627.         jz      cmd_send
    & I. w- o7 j7 D- E
  628.         loop    cmd_wait
    7 K- Z( I2 a/ R# I7 K0 k

  629. " B5 @( v  O0 _1 i0 p, O, p7 Q
  630.         jmp     cmd_error
    - l5 `4 z5 D1 z4 X  U- y

  631. 0 {: l6 K7 B) r4 F1 r# ~
  632. cmd_send:
    & ~/ h+ _) ^6 A0 p1 [$ D* I
  633.         mov     al,bl
    1 M9 `9 U# J& y) j
  634.         out     64h,al; l6 a% D& M  D1 L3 A
  635.         jmp     $+21 H5 M; @" B  ?8 Q4 ?2 {. z. g% R
  636.         jmp     $+2
    . O1 S! I& x6 W) l# Z# g; R
  637. - x0 n6 h# L7 n/ j( v, j
  638.         xor     cx,cx: @4 E7 V- b5 Y: F
  639. cmd_accept:
    0 Q9 E9 C6 `, G+ U
  640.         in      al,64h
    ) P* y2 a  M( ]& K
  641.         jmp     $+2/ n6 l& B& A) i8 X6 w/ m9 l
  642.         jmp     $+2* A! p+ y; q+ D7 u: b
  643.         test    al,2. ?& n* k' h1 B* v. G) f, @
  644.         jz      cmd_ok: L* q# Z, {% \8 M
  645.         loop    cmd_accept% Y8 m5 {# U" D9 f. K6 N% J

  646.   L+ g# s/ l+ J( {7 T
  647. cmd_error:/ m! k5 q) x  e% C& Y
  648.         mov     ah,1
    ' b! C% c8 u" D: W9 U( W' f
  649.         jmp     cmd_exit/ l8 N0 |! m- m1 K9 H! ^
  650. cmd_ok:
    : w) h0 Z" E2 o) N  N
  651.         xor     ah,ah: o) G$ a# L6 u! u+ u1 _6 k1 H: K0 B
  652. cmd_exit:. V7 d! X, G$ e' I; J
  653.         ret. O- E$ x: O. r/ s4 s7 N8 M' ^6 L" g

  654. * t& k6 v/ C: c" t
  655. new_33:
    " F. j) [6 Z  i! t+ A' n
  656.         cli
    . L  U7 k# V- B+ T) l6 ?) ?
  657.         cmp     al,0
    ) G" n6 e, z4 W4 ^4 _6 l& F. X" J' h
  658.         je      reset_mouse! P2 G; F. [! k# \
  659.         cmp     al,1
    + E/ l% M/ D8 S/ H1 i; c! d
  660.         je      show_mouse
    . ^0 `" B4 R; _# P8 |8 Y6 @
  661.         cmp     al,25 r( G9 S# M& [
  662.         je      hide_mouse
    7 h: x# Z7 |' L( L3 F
  663.         cmp     al,35 E, P6 ]3 ~2 h; u9 J
  664.         je      get_pos
    5 v: p1 F7 k7 _7 T4 Z. l6 _3 s
  665.         cmp     al,41 x/ G/ F/ ?4 T  m1 }. g/ k: V# H" k
  666.         je      set_pos
    0 e2 [% B* |7 M7 J1 O" X0 d) d4 H* e* ~
  667.         cmp     al,7
    / }. i: @; ^9 ^$ I% _  W8 Y3 p
  668.         je      set_hor_pos5 U6 z( L% a6 D9 \) d
  669.         cmp     al,8
    & q4 s. E7 q, x% \, M& p
  670.         je      set_ver_pos
    % o1 f; z) d  u' B5 b* k( Z
  671.         cmp     al,0bh
    # ~+ D. I3 E. D
  672.         je      get_mouse_movement
    6 J* i) ~, o9 D2 B# b- o
  673.         cmp     al,0ch  z( T, w, L& ?5 w; f: G: r
  674.         je      set_subroutines
    0 y9 C  n7 F; z( Z
  675.         cmp     al,14h3 u9 P4 V- H0 W( C4 K
  676.         je      swap_subroutines
    : H' @1 a; e6 H. C( d$ w7 m
  677.         iret
    ! e/ S/ ?7 X' F1 w6 \4 i3 F

  678. 9 H4 w9 n- [4 h6 B7 l; h& O
  679. reset_mouse:
    ( ^6 @5 E. _  g& `6 N0 W7 Q+ S
  680.         jmp     _reset_mouse& j9 Y6 m/ H. ^# b- d/ `7 a3 g$ d
  681. show_mouse:- Y) z$ y: P( ^) u3 E. ~8 _% [2 _
  682.         jmp     _show_mouse0 b$ A$ u  h! C0 y
  683. hide_mouse:
    : ^" [+ r6 H: j# h8 N9 J% C8 P
  684.         jmp     _hide_mouse2 I9 d: ]" S7 n9 r& t3 ?; S+ Z: H
  685. get_pos:7 a* Y) K# [/ O( T4 q/ b! ?) I
  686.         jmp     _get_pos2 {/ u9 v/ t4 m6 q4 s
  687. set_pos:- [" y# K0 E) k+ i; G' o. C. f
  688.         jmp     _set_pos7 p7 [& E2 z. C$ `
  689. set_hor_pos:4 P% A, |% U1 \! e8 P+ X
  690.         jmp     _set_hor_pos
    # e, O9 x# y2 G, E
  691. set_ver_pos:
    - _- z, _+ s7 N. b# e9 _% L& z
  692.         jmp     _set_ver_pos
    ' f. C$ m0 o/ }7 t: u0 q
  693. get_mouse_movement:
    : t2 K. {: O) _) [/ T
  694.         jmp     _get_mouse_movement
    % P$ h9 [' @5 X/ d" ?
  695. set_subroutines:3 J# y+ Z# D# Z# v2 Z0 L
  696.         jmp     _set_subroutines, R) \5 W: [* F# A( F
  697. swap_subroutines:& l. q+ W& {1 {' ?
  698.         jmp     _swap_subroutines+ w/ W' B6 W/ r: I
  699. 7 [* c- A7 ~: W+ d# X+ a" j9 L  |4 M
  700. _reset_mouse:
    1 k! j! x" t. G7 b
  701.         mov     byte ptr cs:[buttons],0! T" T+ V' ^- e- Q8 \
  702.         mov     word ptr cs:[pos_x],03 a1 b  s! l9 ~+ W
  703.         mov     word ptr cs:[pos_y],0
    ! f) @3 v4 Y8 Q3 n+ l
  704.         mov     word ptr cs:[x_move],0  N6 |! `# b+ l1 O; E
  705.         mov     word ptr cs:[y_move],0
    ! X2 f% N7 C( h
  706.         mov     word ptr cs:[x_max],639
    : F, o5 |, Z3 o. \& H8 u7 n. P+ ?6 K* ]
  707.         mov     word ptr cs:[x_min],0, }3 ~0 ]# r6 T# h! W, D4 q
  708.         mov     word ptr cs:[y_max],199
    * _1 F- l' m7 ~+ E. [/ I% X2 X
  709.         mov     word ptr cs:[y_min],0
    ; A* Y3 P% j- t; _% v
  710.         mov     word ptr cs:[user_mask],0  \5 Z0 T7 u, ]+ I
  711.         mov     word ptr cs:[user_subroutine],0& |" k& f( P) }$ I* j. x1 `; A
  712.         mov     word ptr cs:[user_subroutine+2],07 S9 p# C% u) U4 E, s. t9 n+ u
  713.         mov     ax,0ffffh
    & f4 l+ _- \& `" X3 q" s  m0 g
  714.         mov     bx,3
    & j# d5 h0 R3 r* H7 r5 W8 B5 a7 i
  715.         iret
    8 V1 N6 y, W+ P$ R- I
  716. # ?, q5 l, G+ r; N9 G5 O
  717. _get_pos:
    ( Q8 x8 i" T1 t+ ]- v% y' i- T
  718.         mov     cx,cs:[pos_x]
    0 |6 V! W( n' B( X5 D4 F
  719.         mov     dx,cs:[pos_y]0 Q/ g; P4 d  H: p8 F. O
  720.         mov     bx,word ptr cs:[buttons]
    & R8 M; z7 b; I  s4 c' Y  T
  721.         xor     bh,bh- z( i' {+ p2 j, u# @( }* B0 }
  722.         iret4 y2 H0 L4 z7 [7 p( g+ H6 k
  723. 9 p3 ^0 z$ d" e5 X! F" c& w2 e
  724. _get_mouse_movement:
    : @" q$ q! G1 r$ b5 E2 K
  725.         mov     cx,cs:[x_move]* _. S0 L9 S6 l* @: h9 [, P
  726.         mov     dx,cs:[y_move]
    8 e' S  b' r$ c# L/ T6 g; e
  727.         mov     word ptr cs:[x_move],05 l5 d* R4 ?  ^9 a; G; [
  728.         mov     word ptr cs:[y_move],0% C. Y) y6 m6 X" [
  729.         iret+ X& J+ d- n6 X/ H8 V! T. q. S9 E

  730. ( w% Z" T  i4 a% |9 l& v, J
  731. _show_mouse:
    : N$ \3 k, {2 k7 [: V- ~
  732.         push    ax
    % P+ s) j( T* m+ h
  733.         push    bx
    , `  ^& X2 D* h# s' P! l/ [
  734.         push    di' {6 q5 C7 z8 Z+ x9 B
  735.         push    es
    , u- m  e5 N4 }
  736.         mov     byte ptr cs:[sm_flag],1
    , c) B! Q: B0 I* J  t! D4 z
  737.         mov     ax,cs:[pos_y]
    2 t! H: c7 I2 i+ V/ [6 P+ \
  738.         shr     ax,33 f. Y3 W& V( ~% y+ W5 P- ^6 A/ B
  739.         mov     bl,80
    ' s4 o, R% j) B! A, Z$ B
  740.         mul     bl: l! ]5 c: g5 m& u7 Z# [! G) i
  741.         mov     bx,[pos_x]
    6 k2 I1 }& ?4 y
  742.         shr     bx,32 y4 C+ b7 M# D4 o5 @
  743.         add     ax,bx; U5 V6 F; Z( p6 s( p& }& S6 E
  744.         shl     ax,1
    8 G8 p4 U* {2 [$ N5 Q7 t( E1 c
  745.         mov     di,ax
    5 L$ l# d7 r. Z" \
  746.         mov     ax,0b800h
    ' c6 Y. t- J7 b1 s9 g$ t- s4 J
  747.         mov     es,ax: L, q2 `/ ?! ]# {) I
  748.         mov     ax,es:[di], l" F  }4 x9 e1 B4 B) W- {6 J5 [
  749.         mov     cs:[save_char],ax; S0 |# ^$ o& u6 J8 p. P+ i
  750.         not     ah
    3 Z/ C: u/ X9 X  M5 p
  751.         and     ah,7fh
    9 O4 M0 k1 i  u
  752.         mov     es:[di],ax
    9 B! r% q/ o* ]: r6 C8 V6 R# i( G
  753.         pop     es/ A" j; u: i/ ^( }
  754.         pop     di
    $ D. M: P. i3 |3 `" h1 U+ w0 ~. m/ q
  755.         pop     bx# f" @7 X1 W- D) }7 }+ O8 I
  756.         pop     ax
    . |/ ^: w; `9 E: H
  757.         iret& B! `* V! l( L9 u9 v6 r, N
  758. * k: z' L/ m% E+ h' a
  759. _hide_mouse:
    ) v. O! C2 Y' A! |$ S  Y$ a
  760.         push    ax" S% s, k, b3 x, f# m7 y# S7 Q; R
  761.         push    bx
    # Z/ b5 U4 Z% b" ]; h
  762.         push    di
    ) _% L; H  m# q% V6 T# R  z6 V
  763.         push    es
    ; s. I# L: y0 W( O/ p: s3 U8 J/ i/ M
  764.         mov     byte ptr cs:[sm_flag],0
    , i7 r9 H: g$ o# P
  765.         mov     ax,cs:[pos_y]/ `$ p# b' o) Y
  766.         shr     ax,36 q% h3 K5 i; y7 A$ q( n
  767.         mov     bl,80" K" `" l4 T" c. D* R$ ^
  768.         mul     bl
    8 S  [9 t' l) `
  769.         mov     bx,[pos_x]
    0 V  u9 J4 ]3 B8 j9 y2 }
  770.         shr     bx,3
    $ h# u. }# ?+ G6 F3 S5 }6 o$ `0 e
  771.         add     ax,bx7 d+ z& e, k  |0 h
  772.         shl     ax,1% m& R: N* t! R$ g2 n. }: i$ G
  773.         mov     di,ax: D0 A7 f2 R, k$ l6 @
  774.         mov     ax,0b800h
    9 P$ b4 t7 B  T- U" _& t
  775.         mov     es,ax% c7 n7 h9 ?: U- C4 f. V: o9 r* X% M
  776.         mov     ax,cs:[save_char]
    , M" Q5 `) f1 Z. _1 ^) u1 X' s
  777.         mov     es:[di],ax
    - U& x7 y2 n7 _& C# z) j: l
  778.         pop     es
    - C9 H; _& Y  A2 k0 D- P
  779.         pop     di7 h1 l( y0 d; L
  780.         pop     bx
    ; U$ ~' ?! j8 L- N4 h& J
  781.         pop     ax! i% @1 l% y% [8 e. Y( R/ M9 D
  782.         iret3 z1 p; g, y  X6 Q$ o
  783. . {2 y. t7 Y, A7 t% E+ `
  784. _set_pos:! B& e( B) W7 n. N
  785.         mov     cx,cs:[pos_x]# [9 P) `! a. A1 B- |! ?5 Q
  786.         mov     dx,cs:[pos_y]9 @. J+ E: G9 W; y
  787.         mov     word ptr cs:[x_move],01 a3 s0 B2 I; K5 g3 ]7 S2 ^
  788.         mov     word ptr cs:[y_move],0
    ( v6 L3 h5 Z. E7 E  Y$ {6 m5 {
  789.         iret! s2 e: J# e# k& f* V6 b

  790. 9 O5 n* E- x) @# k, g: a
  791. _set_hor_pos:4 h: O# `" r! e4 H6 o
  792.         call    max_min" ]7 T6 ^, H9 \! A* I
  793.         mov     cs:[x_min],cx
    ' F: m0 D' x9 E; i: X# j2 k
  794.         mov     cs:[x_max],dx
    " V0 m$ ?. a* Z5 p0 v0 K0 I
  795.         cmp     cs:[pos_x],cx: ^1 K" n" q+ C
  796.         jge     good_hor_min
    ( }, r: |5 x# t$ f" F8 h7 J
  797.         mov     cs:[pos_x],cx/ {4 q6 z7 L# t, r( T
  798. good_hor_min:
    + m- T0 m- \# R! c% r, g) L$ O: i
  799.         cmp     cs:[pos_x],dx0 Z$ E1 t4 X/ ?3 Y5 b) a
  800.         jle     good_hor_max
    / I+ I$ B4 a# E+ G5 ]! Z; d+ ~
  801.         mov     cs:[pos_x],dx
    . r* i& g1 T* N3 H1 B
  802. good_hor_max:; G% g" {, v" l1 O  q8 s4 @
  803.        iret
      x& A8 C+ J6 V& l4 T" ^

  804. 1 D/ d' D' l. i8 Q1 F
  805. _set_ver_pos:  m" |. p) D9 a) A( y6 }% `3 v
  806.         call    max_min( Z$ G/ b3 }4 A7 d" s( w1 u' R) x9 H. N( c
  807.         mov     cs:[y_min],cx
    : n2 W* F% \% D  K
  808.         mov     cs:[y_max],dx
    ) F+ |3 Y; x, g
  809.         cmp     cs:[pos_y],cx
    6 X! z! B$ U9 b- s/ m% o+ y/ S
  810.         jge     good_ver_min
    7 T' x- V* c4 \3 i4 k
  811.         mov     cs:[pos_y],cx
    8 f& r7 o# o3 _  z9 _0 J+ B0 E
  812. good_ver_min:
    1 Y( R( x) B8 w  ]
  813.         cmp     cs:[pos_y],dx' q4 x, ]0 ~$ C9 h, n6 c
  814.         jle     good_ver_max0 U  |) p; X/ K% l6 P+ G
  815.         mov     cs:[pos_y],dx8 P  W* z9 |/ W( h8 E) ~
  816. good_ver_max:
    " I  D+ S  h% h9 R
  817.         iret
    3 x- |) K: U1 R( i! Y2 Q

  818. 1 w! M+ m- ^$ y. o9 r" k
  819. max_min:! x% e/ G8 v5 R& f, h% o
  820.         cmp     cx,dx  H8 V9 k0 t9 m( a! y
  821.         jle     no_swap2 H3 c; V! P: C& {6 `
  822.         xchg    cx,dx
    # _) m4 v+ Z8 Q3 O% p) _
  823. no_swap:
    : ?! w* r: r2 Z! J
  824.         ret1 |6 B; ^. g# h! c

  825. " t" _! P3 ^0 c  @, J
  826. _set_subroutines:) r$ {$ a. L2 `3 D+ \
  827.         mov     cs:[user_subroutine],dx
    . n6 L+ w7 Y( n5 P* o
  828.         mov     cs:[user_subroutine+2],es! t9 G, f5 H( t8 S/ U$ p' h
  829.         mov     cs:[user_mask],cx! G& `3 I7 ?7 s
  830.         iret
    7 Y( ^9 c# J% B- s0 r
  831. 2 V4 M* V0 P/ X1 x8 V) L; u( ?, e6 K$ c
  832. _swap_subroutines:
    ) p: Q1 D( D: W! ?" w$ k) W+ \
  833.         push    word ptr cs:[user_mask]3 \" a7 p- r0 I
  834.         push    word ptr cs:[user_subroutine+2]
    . Z4 G4 h0 v4 V: A: O
  835.         push    word ptr cs:[user_subroutine]2 {) I5 M* I* H, R: f" ~! e: R
  836.         mov     cs:[user_subroutine],dx- {5 Z, y  ~5 [! \
  837.         mov     cs:[user_subroutine+2],es# \# s& N6 J, u" R+ [
  838.         mov     cs:[user_mask],cx3 d0 L7 h2 X6 B- s& F
  839.         pop     dx
    6 v3 A, i, x- P5 e9 ?
  840.         pop     es
    , V* C& g2 `5 G" U) v3 L- v- ~
  841.         pop     cx/ M& H4 H/ m7 C
  842.         iret
    ) v) e( m; u; I" M# W
  843. * g' a7 s; n. C- ^! h
  844. memmouse        endp+ B8 l% O: }/ o2 f

  845. 6 A  |8 Z4 X5 Y% }
  846. endof_start:5 i! b' ^; x; e/ a8 s

  847. $ I9 H2 ]- k/ R5 V
  848. emsg db 'No mouse driver install error!$', o, I: g4 Y* n! V. }' Z' f
  849. old331 dw 0
    " l' d% r" |6 o, k' R
  850. old332 dw 0
    ! K7 P7 j. r8 r% O( [* q: v
  851. old741 dw 09 b' B" p" W( @# P; T5 s, H% k% j
  852. old742 dw 09 a+ h0 [: V( L2 X9 K
  853. memcopy db 0! K3 h% b- ?5 z. o
  854. okcheck db 01 W9 k  p$ b  r. {0 `3 K: `5 r
  855. pass db 0
    " `7 d9 T6 x; k- z9 ?0 }/ [! H
  856. chkl db 07 k" v8 k8 o" Q# h' n+ e& E
  857. lk db 0# r* ^, D0 f! G2 ^6 v
  858. chkr db 0
    0 K8 y0 x5 Y3 y5 E* ]1 {
  859. rk db 0' r# _6 a, r# `# F. _! s
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '9 L: O% j1 }" _5 Y) _
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    9 G* B2 ~+ R6 o* |/ X) x
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ': U7 Y% ]3 z* w7 H( o4 |. D% e
  863. db '                                                                                '( }; ^$ T1 x& ]. d" A
  864. db '                                赏屯屯簧屯屯突                                  '
    " q, L' S+ w: f
  865.         db      '                                ?OFF汉OFF?                                 ') T5 {0 \: h& @9 a6 E4 `0 v, v& V
  866. db      '                                韧屯屯既屯屯图                                  '# a: B' f$ q) j9 d% f) P
  867. db '                                                                                '
    ) H" T8 A% ^" f4 B; H% r
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     ', s1 v: ?3 V2 W; X& C  @
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    ; V$ `! k1 O6 O' p
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    5 H; T; M% Y( L  C
  871. 2 i) H8 ~9 c  D: H, g) G: ^4 E2 T7 r2 R
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
) Z# O$ c" K) z哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... ' t. f7 q" Z* ?, d
4 @( v! e+ i& U; z4 T
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:14 , Processed in 0.049309 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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