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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
5 b8 r# q, V3 \$ _( s* H' j. O, @, i& |3 `& J9 R
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;& B6 X9 `* Q1 C1 Q* r- M5 _
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    $ [4 c. i* p7 I3 x+ a+ S5 a/ o
  3. ;                                         By Bini.Yi 易祝兵
    " x) L3 A$ p$ g' t, u$ j
  4. ;                                         http://www.ufoit.com 计匠网
    / U+ I7 P: w0 e$ g" X1 F
  5. ;                                         2002/04/06 YYYY/MM/DD
    " a+ I0 F7 l9 v# ~- w) s
  6. ;
    % V# `& D, T. W. U
  7. ;          ' [" \- G; ?) P' X! u. i
  8. ;          This program  test the mouse button  click and move.  D9 S3 V  g7 f$ n
  9. ;
    2 ~% U: e( s  {+ n2 o* W% a" u

  10. $ |1 H+ Y2 y3 y2 ^
  11. .model tiny! Q0 K7 ]& B. M+ b+ o
  12. .586
    ( _: E) p: @* f; b
  13. .code
    / M( t2 a1 o& R$ a
  14. .stack  100h+ @! C: U, n: J2 u2 X, r# [% l
  15. .startup. N5 R, \2 I6 ?5 [5 T
  16. pusha
      E, E+ q0 H# K
  17. mov ax, 3533h, p* }1 _8 x  G3 L: r
  18. int 21h+ k  W1 Y# K" ~/ d2 D2 _/ q8 g
  19. mov word ptr cs:[old331],es
      c! M8 U% p2 q) C' ^
  20. mov word ptr cs:[old332],bx8 Z, J+ n. K4 h. r& J! c9 F
  21. mov ax, 3574h- r5 w) o0 p, V5 G: h! _
  22. int 21h3 w* A0 C4 n* \  H2 p& G% M
  23. mov word ptr cs:[old741],es" N2 l+ S4 m& J* a
  24. mov word ptr cs:[old742],bx% X  w0 Z5 P. a5 W$ p9 h8 _, h1 s
  25. popa
    / ~% L" _+ }: h4 s3 A
  26.         call    memmouse
    + A, V4 p% w, z
  27.         mov ah, 00
    2 E4 E# B4 `& x" w' [& X+ r5 Y- |, t
  28. mov al, 03% Q1 ]; E0 _, U6 r0 ]# ?# y* G
  29. int 10h
    ; C9 G  q( @& A/ v  B# O
  30. mov ah, 06
    * J: }( \. ?7 J
  31. mov al, 05 m% Z+ y" h  Z+ v
  32. mov cx, 08 Q3 l& A1 M: v- `+ W
  33. mov dh, 24
    . a; r4 i* H5 q$ `8 A' i
  34. mov dl, 79) l/ z) z* ^4 K# O8 a
  35. mov bh, 07h
    * I5 X' Y- |; t! e+ X' Y
  36. int 10h8 ^, ~) Z! V: W8 L/ r* P% X
  37. mov ax, 0000$ J3 `, A, B- \4 y9 g8 Z9 F
  38. mov bx, 0002/ a3 z+ f+ n; S4 }
  39. int 33h& a* z( ^: w. K. l+ q) T* _! i
  40.         cmp     ax, 0000           ;if no mouse drive install
    ; E  @/ }; l( C5 N5 `
  41.         je      errormsg           ;show error MSG. B! K) m9 Y8 t7 }6 b! F
  42. mov ah, 02
    7 x. R; B/ j0 e" V- k3 n
  43. mov bh, 00
    4 B: d+ ?% w; H1 r4 _
  44.         mov     dh, 25             ;Move point out screen
    ( N- j; c  R3 E3 ^: M4 x! M
  45. mov dl, 79
    , v: {/ G+ R; j8 A5 |
  46. int 10h4 Z  B% H4 {* L+ d
  47.         call    showmsg            ;Show info( r: b0 a2 `  W9 v+ q7 P
  48. mov ax, 00012 y& }9 x) E% M3 D0 t+ Y& I
  49. int 33h
    ' S: E2 h4 c; @7 U& f% \
  50. ; mov ax, 000ah# X" K8 O  U  y& Y
  51. ; mov bx, 0000
    & `6 O, o5 e9 N! L4 N$ h$ N. O
  52. ; mov cl, 0h# y# ~- h) C, g; B+ c
  53. ; mov ch, 0F0h2 B- z; s. Z& f
  54. ; mov dl, 0h  [+ E) g% ?4 q
  55. ; mov dh, 0F0h
    ; F9 }2 k5 v1 J
  56. ; int 33h
      d, M/ V" P% q, o
  57. mov ax, 0004h+ u& v. y: m; T% m: o! F: ^+ f
  58. mov cx, 0319$ X0 |2 r* }, q3 `( T$ \' E% A7 r! Y
  59. mov dx, 0103
    . \! z+ }0 @4 L! p" C) L
  60. int 33h
    3 E) z/ @5 y7 K2 i- k
  61. casemo:                           ;Case button click and point move
      I- U5 J, F1 [8 U2 ^  r# Z' C
  62.         mov     ax, 000bh         ;and keyboard press. v/ r. q) [: U
  63. int 33h5 J7 ]! s9 ]$ u8 W- K
  64.         cmp     cx, 00h           ;if point move....X/ L& V) p% x- e! A8 K
  65. jne xmov2 t. j% R3 H# r# h$ u+ D3 B
  66.         cmp     dx, 00h           ;if point move....Y! p* |8 x5 C& |6 u2 h* U
  67. jne ymov5 g( h5 I5 o$ _$ N
  68. xymovend:                         ;X.Y move end8 e  \6 Q! f4 H8 x. h3 d
  69.         mov     ax, 0003          7 I3 L& l$ z8 ^6 [# e# W* v; {
  70. int 33h6 ~, W: E9 C# o- j
  71.         cmp     bx, 0001          ;if left button click  show ON
    & D7 @, Y# `5 W" C* S" o
  72. mov si, 1828
    , ?1 ]5 a; _9 Z2 m& D
  73. je listl1 L5 u) Y7 J; M% ~) e5 [
  74. mov si, 18284 J. X! v- x1 u- z( V$ D+ U4 }
  75.         jne     nlistl            ;if left no click show OFF
    9 A9 j7 K( X  w( J$ }) W
  76. testr:0 r# v* i5 q4 d0 n
  77.         cmp     bx, 0002          ;if right button click show ON/ Q+ t/ \. J6 j/ d# d# ]
  78. mov si,1842
    ) R& o3 u2 i: n* N5 W: V3 \
  79. je listr9 v! ^9 g$ v* \' h5 T0 j3 _! n1 A- b
  80.         mov     si,1842           ;if right no click show OFF0 ^+ `* [+ u5 T& A1 t
  81. jne nlistl" ]0 Q) N! `( i6 E- y
  82. casekey:0 ^) H! Q4 d( X5 e
  83.         mov     ah, 01            ;if any key press jump check8 Y9 `5 |! s9 s$ G: }
  84. int 16h
    - n, V# g! {; D" A
  85. jne kpress0 E" u8 w/ W" ~5 N; a
  86.         mov     al, [chkl]        ;check x flag$ `* T& G' m$ ^1 v+ l6 b
  87. cmp al, 02h1 `0 B- a: P2 K, z' j% |8 p
  88. jnb chkok
    6 M  s- C- n1 @
  89. jmp casemo- Y5 r/ [, X4 X: o2 X! W
  90. xmov:                             ;if X moved, get the X flag+1
    ( k0 q3 x4 T2 y! G0 r3 E/ f
  91. mov al, [chkl]( G1 d9 }5 M4 j' y
  92. inc al
    6 K9 t3 j* Y9 K+ r: u
  93. mov [chkl], al4 H, R4 p; {+ i6 i7 r
  94. call passok
    7 M7 t+ d% \9 O1 b) Y( C
  95. jmp xymovend
    0 r. D& T6 [6 O
  96. ymov:                             ;if Y moved, get the X flag+12 @- q$ M, V' h
  97. mov al, [chkr]& v# U' H# _) G' @- r* {" i
  98. inc al$ q$ D8 U' B! ~( y
  99. mov [chkr], al. `! M3 c# n/ I) q
  100. call passok
    , ^& n+ S" e1 A+ H" V
  101. jmp xymovend! J# z: o1 @. V+ b. B4 M! r/ r2 t$ r
  102. . A$ U) |* ~( C1 m, f  U6 Q
  103. passok proc near; y  m- F8 Q* H% D; U
  104. mov al, [okcheck]' U0 A9 O9 \& `; h5 m
  105. cmp al, 1" F2 P9 _' q9 d% }3 w% L
  106. je let0
    ! d9 V. I3 R6 C: w- w" L9 c) b
  107. jmp passret/ d5 r1 T; b" z# [% K! f  j3 ?+ ~4 w% T, l
  108. let0: 3 |. f' ?, G' U! j# `3 M, t
  109. mov [pass], 1- b: d# r/ ?( w" t; M% w
  110. passret:1 H/ _3 I8 |! B
  111. ret: e: [  S. f9 x- i* T+ L( w
  112. passok endp
    ; N, E) j: N4 C/ }6 W
  113. 4 S, B/ J. ~6 D: o
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS1 h$ ^$ x  q  G4 \
  115. mov al, [chkr]- m. s% Z# x8 U( T4 U
  116. cmp al, 02h
    , P: o. v" d7 s- i
  117. jb casemo
    5 ~  @2 k" z# q8 U
  118. mov al, [lk]+ ~: P+ N5 [! j' Q7 R* l# \- H
  119. cmp al, 1& I: b# d' d  d
  120. jne casemo
    1 Q% d8 [% {4 O
  121. mov al, [rk]: G7 e; A( G3 ?- z9 H
  122. cmp al, 1
    , u' m. l# q3 ?/ L2 W( c9 _
  123. jne  casemo
    7 E5 R. U$ I' g" ~9 u
  124. mov [okcheck], 1
    ) ~* e, M: l# d5 C& S" b; y: M
  125. mov al, [pass]
    % k1 C' L) h- h* \5 i" G' n
  126. cmp al, 1
    1 n" V* K# H8 G, |6 [5 M
  127. jne  casemo
    . F# s: p0 `$ @# I4 Q7 H
  128. mov ax,0002h
    5 z8 k5 I/ _1 a% w- @% a
  129. int 33h
    , t: a' g6 `: r5 w) r2 n  P
  130. call cleascr
    1 q/ U  k: S" X* n0 l: v

  131. 6 ]& r8 U. m% h: j' e
  132. call oldint
    . J6 o$ b) K, E
  133. mov ax, 04c00h! M* `+ f% o: `1 h" ^& l+ u9 S
  134. int 21h
    / ^4 }+ v( k* s9 L$ q
  135. / R0 e! C3 ~' f
  136. okexit:
    3 S4 F* }* X0 D8 e& P
  137. mov ah, 4ch
    6 }0 [% f$ g4 \2 d( K' P
  138. mov al, 0
    1 L$ ~' S$ H1 s5 D
  139. int 21h
    5 h  k& l& `5 G. \# i' d
  140. listl:                                 ;Show ON
    % s9 ^. @6 J1 K3 Z; i7 h
  141. pusha
    ) m% U) ]. K$ I. ~
  142. mov ax, 0b800h
    0 }# ]5 X# z* {6 B! w
  143. mov  es, ax
    # ~9 Y% @+ M2 D) v+ {$ G3 E1 `
  144. mov ah, 47h
    - X6 ?" d" I& E8 W. Z9 f; `
  145. mov al, 20h
    * v8 s* S. G  k/ T+ _$ D" O
  146. mov es:[si], ax
    9 \% p2 y2 w# ~+ s4 t3 ^
  147. add si, 02
    " Q4 f4 q  i3 G
  148. mov  al, 4fh
    % ]1 s! i% }1 P. l1 }
  149. mov es:[si], ax$ E3 ~3 `" f3 u3 T' T2 {
  150. mov al, 4eh
    2 J: j* o7 e2 t/ f) [% f" o$ }
  151. add si, 02
    2 G  Y/ X2 Q! _4 W3 B
  152. mov es:[si], ax
    0 Q+ ?# u, s8 O7 q
  153. mov [lk], 1& U& ^, m* f4 L- p
  154. popa
    % g5 d4 N6 K+ u% d/ n" n) }: y
  155. jmp testr
    $ n* @5 Y$ l$ |
  156. listr:                                 ;Show ON
    & D$ o% n0 n0 N2 k  E3 c5 z' n
  157. pusha. b/ ~3 v8 S4 x7 W+ d
  158. mov ax, 0b800h
    * U1 o2 F" m1 a8 x
  159. mov  es, ax) t, \+ \$ a" w8 A2 P" a; a# d1 L
  160. mov ah, 47h
    5 n6 _1 U# q3 Z1 R1 W9 c
  161. mov al, 20h
    7 C7 n, t8 y- p3 p5 D3 @  K; O
  162. mov es:[si], ax9 i! @9 u5 L8 g! g
  163. add si, 02
    5 U& E$ T0 j- Y* l! w
  164. mov  al, 4fh
    , J) H3 j! d' m
  165. mov es:[si], ax/ A" c% z: a& ?
  166. mov al, 4eh8 G% E( N- m  t( Z; u  Y; J
  167. add si, 02% ^0 I1 ^" e1 }( M" s! X! ~, t; S. ?$ t6 d
  168. mov es:[si], ax+ E# B- K2 E( i9 P, p% g
  169. mov [rk], 1$ U# n/ M5 f/ T0 u2 T( H- K
  170. popa- s) O; ]$ ?2 R  e
  171. jmp  casekey8 {7 f) W# U* i  [; i/ n

  172. 0 v! z' T1 w# Z, d$ k
  173. nlistl:                              ;Show OFF
    " T% a6 T4 W7 o. x
  174. pusha   
    ; t. _. \" w# v# s: E
  175. mov ax, 0b800h  K, y# x( F2 g# q. `
  176. mov  es, ax
    6 U. [: p8 i) B4 o# G
  177. mov ah, 17h
    $ u/ ^, L- j2 y' @
  178. mov al, 4fh
    6 `8 e* ~; ~( U
  179. mov es:[si], ax& p; R3 m! e! {, p9 F# P4 {
  180. add si, 02* g7 W( O" A: ~/ v
  181. mov  al, 46h
    . H0 X/ q- h6 j+ v3 C
  182. mov es:[si], ax
    8 V: f! C1 K5 N: w7 h
  183. mov al, 46h
    " M. y/ |4 S- k
  184. add si, 02& ~, z; r8 P) ]& K' ?
  185. mov es:[si], ax
    6 W( L  |3 w4 R. l+ v
  186. popa( |: B/ m1 B3 z& w$ T
  187. cmp si, 1840
    5 _  l* i5 h7 w" D) K
  188. jae casekey
    - Y# m) ^. }9 w, B
  189. jmp testr4 ^$ _1 B% G  D3 k
  190. 0 I2 ~! N8 A" z# ~6 b# z% G2 }4 E
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    ( _& D3 [* C9 I7 S$ F* Z
  192.         cmp     ah, 01h             ;and return a error
    0 c0 ]  d7 x. s$ }# @6 L2 Y6 t9 q
  193. je exit1$ d4 a  ~. ^' h4 Z
  194.         mov     ah, 0ch             ;if press other key then clear
    8 _# W0 K" K2 H  w
  195.         mov     al, 00              ;keyboard buffer
    " C% [( q% N  H9 C) }
  196. int 21h
    ; n  }4 h9 X. k$ r& \
  197. jmp casemo 5 a/ _7 ?9 v/ G1 m
  198. 2 a& w+ Q% E' E8 y
  199. errormsg:                           ;if mouse driver no install9 J+ s- u( d. v, h% G5 ~# _
  200. call oldint
    4 V/ O1 F. \$ r# }9 a' b3 K
  201. lea dx, offset emsg+ D$ L) E8 Z3 S7 h8 r
  202. mov ah, 09h
    % M4 M9 S/ `; j# ]" o
  203. int 21h
    & e# ~3 c9 V# t" h6 R; c# U' {
  204. mov ah, 4ch0 M6 I; P+ F6 k- F: h' O" |% U) T
  205. mov al, 2
    7 N# r! n1 k0 m+ o* y4 Y- R+ ?+ @
  206. int  21h2 i* h9 c# R, C( o. N2 c
  207. ! [2 m3 X( m" v, W- u
  208. exit1:                              ;error exit5 r5 G: s4 D; I8 C# y
  209. mov ax, 0002h
    1 _+ r4 b& l6 b
  210. int 33h9 Q& C% e+ ]4 ~
  211. call  cleascr
    ' o1 R- w5 `# \8 W
  212. call  oldint5 k4 Z, g6 o, R/ Y: h- }5 i
  213. mov ah, 4ch/ d& O- f+ s" [$ f$ x3 t
  214. mov al, 01
    ; o; F' ^- v( S+ Z9 [' n4 T) P
  215. int 21h
    : X2 d1 [, W6 o" f9 r

  216. , Z9 \/ n9 C5 B. Y3 ~
  217. cleascr proc    near                ;clear screen
    $ E0 ]) l, B# v
  218. pusha
    " A2 m( a5 o1 S7 I+ r8 v
  219. mov ah, 06% v# t! v" s( x5 Y
  220. mov al, 0" p' M8 C+ _: ^7 F% n8 x* n+ K5 ^
  221. mov cx, 0: O6 O, J+ K- B# y+ f: @
  222. mov dh, 24/ q! o; F% i8 U
  223. mov dl, 79
    " M8 q) F# R3 z' P( ~5 b
  224. mov bh, 07h
    + @# S4 h6 t0 l+ z% p8 l
  225. int 10h
    8 M% K# {' c( \$ G: z: g
  226. mov ah, 02
    / m' v* ~2 ^; ^0 J
  227. mov bh, 00
    1 k1 c7 a9 L/ w
  228. mov dh, 0' n0 L% f. E. U1 i) E
  229. mov dl, 0" v4 O: L# }4 l/ ?
  230. int 10h
    0 `, r" e" `) s/ e( Z9 }  W) ~  Y
  231. popa
    4 ~, g7 \6 Q+ a
  232. ret
    6 T$ R) O) _. Z7 p
  233. cleascr endp4 Y: @2 @9 K$ ?, \
  234. 0 a4 k, p' t" V
  235. showmsg proc    near               ;Show info. B+ V! F) _2 S; W/ b
  236. pusha
    ) J9 m7 c2 f& W1 B7 L) D, D
  237. lea di, offset showms
    / N; y0 C- m  b" F, W
  238. mov ax, 0b800h
    / L- l  T5 |; m
  239. mov es, ax5 W) i" x$ y( W" T
  240. mov si, 0
    2 p" I6 T* {0 @
  241. mov cx, 480
    # x/ U2 h% a* b# _
  242. mov ah, 07h
    ; o' P2 D3 [' D" R
  243. @@:
    ; O4 m! Q; c0 Z4 f4 F0 p
  244. mov al, 20h
    7 g4 w! L) \# t( M
  245. mov es:[si], ax
    , k3 o" U. k- k% T
  246. add si, 29 V+ [' t- u4 Q
  247. loop @b+ y) U) n2 ?& y; B6 _: Q4 V* J
  248. mov cx,880, C1 @8 S1 _/ W
  249. @@:
    ! G& B: ?2 Q# O( o2 m! m' X; }. E
  250. mov al, [di], N. G. z! {; P
  251. inc di) m, a5 e9 l& q, ~: O, o
  252. cmp al,20h
    0 a' M1 C3 Q3 e5 o& E8 ~# Q8 {
  253. je showch1
    $ S$ f9 [  q6 g* T& J( @( c9 m5 i
  254. mov ah, 17h
    ! O% ~0 Y- f1 U- B; D; p8 ~- N
  255. jmp showch3 9 M" m5 V$ u+ s
  256. showch1:
    3 ^9 ?2 _, @; L- T( Y6 |2 ^) q
  257. mov ah, 07h 8 |* q8 i1 ^2 Z, @/ J: |5 j
  258. showch3:
    ( d9 P3 |, D; D& J; p) R
  259. mov es:[si], ax8 _. C  H7 ?$ F
  260. add si, 2  s9 e' ^6 v) R/ @7 y
  261. loop @b( w. X2 [9 S8 ^: v- {
  262. popa# X' S0 S  Z- g3 X
  263. ret# [* }. w* y$ F/ V  m% L
  264. showmsg endp
    6 a9 i1 N! S& a5 N4 z7 [

  265. ! L  J- i3 D* y  j' t: i
  266. oldint proc
    ( A6 e! T" @% p* T$ J& n
  267. pusha
    ; r- s) }; w2 v$ W, u' `
  268. mov ds, word ptr cs:[old331]; {0 e4 @- [, D# m8 |$ q
  269. mov   dx, word ptr cs:[old332]: `5 r- c) |7 e' m2 {( Y8 F3 g
  270. mov ax, 2533h7 M. Q$ _" G  k/ |5 ]9 j( I' N5 N8 W
  271. int 21h- C. h0 K& q' r5 `0 A. p
  272. mov ds, word ptr cs:[old741]
      e; a4 B  N# \
  273. mov dx, word ptr cs:[old742]
    ! I. w% ?+ j% Q7 h8 S7 H+ _8 Y. P
  274. mov ax, 2574h! K/ E: X/ D& Z" t
  275. int 21h
    3 n  I8 J1 {, H$ R6 [
  276. popa+ M) m: j' P& T7 I
  277. ret; V7 d& N4 [$ h! m
  278. oldint endp
    2 S1 k: y! L* \) n; p3 |8 b
  279. 7 M4 q0 |/ q4 \4 U* L6 G( p1 w' n
  280. memmouse        proc
    7 u4 `1 I2 w' s
  281.         xor     ax,ax
    ) `, n$ f/ F6 B* G$ e+ g; O, [( ~
  282. int 33h0 N3 U! M, M  b5 A) _+ C
  283. cmp ax,0ffffh
    ; |) O" M2 l& b& m! N
  284.         jne     not_loaded
    # K) a3 Q0 @8 h1 G1 S
  285. mov [memcopy], 1
    " Q; l3 Y* k! ~# y6 k
  286. ret
    2 n; o( W, f# Q
  287. ' O5 ]3 R2 q8 \3 t/ z
  288. not_loaded:1 G& \, W9 z9 Z' ]

  289. , r1 x4 O, Q/ s5 A$ m. e
  290.         mov ax,2574h
    " W  O3 \" N* E5 q6 R9 i" c
  291.         mov dx,offset new_isr
    0 W, y$ d$ n4 k( k9 q
  292.         int 21h
    * ^" c. ~* a9 m; y3 z  K7 G

  293. " m( X4 [" k! ?. \8 l$ x) O7 M
  294.         mov ax,2533h
    % J" q" O( {# t5 |( T' [
  295.         mov dx,offset new_33# T8 T, Z. G+ G. ?
  296.         int 21h
    , Y. t3 R" r+ B
  297. $ P' @5 J! J; p! n4 `3 g
  298.         cli
    , f8 v6 A# h0 c+ c
  299. 9 u) d! S2 [7 R5 n- u$ Z3 I
  300.         mov bl,0a8h4 d! _7 }+ h1 T& P7 c8 O
  301.         call keyboard_cmd  V4 z4 g: o: M, w- ^

  302. ( \5 N) [6 [- X: Z% u7 L; H
  303.         mov bl,20h
    ' Q$ k! L5 n" [, i
  304.         call    keyboard_cmd: n5 ~  P! A* A# |3 b% [
  305.         call    keyboard_read
    + g$ y8 \# J1 K- F$ J
  306.         or      al,2
    . l% T. g! T. X2 H
  307.         mov     bl,60h0 y0 a7 i" J  ^: p! |: ]
  308.         push    ax8 l$ z9 |% C/ Y5 E0 ^- o
  309.         call    keyboard_cmd
    0 F' b/ ^9 O( R$ ]+ g
  310.         pop     ax
    ; l5 G7 g, k" o$ }# G
  311.         call    keyboard_write
    1 g& H; P& Z/ A: W& R6 q9 ?

  312. 5 ^, D. k$ O3 ^, y& ]* N
  313.         mov     bl,0d4h
    $ Y1 u1 i- n/ L9 B1 A
  314.         call    keyboard_cmd
    ( s- x  J( ]; U2 i% p! a
  315.         mov     al,0f4h
    ) {" V9 D5 n; C- ~# D. N9 e. Z+ v
  316.         call    keyboard_write
    # S) |6 M6 C0 Q, Q

  317. ( A; ]! }( D/ d; z
  318.         sti
    4 v% U0 S! M) i; \
  319.         ret
    + }! _! v$ @# |$ C9 M6 H$ S
  320. call_user_isr:
    : l, p5 m8 P* I- M. w1 P, k* _
  321. db      60h
    % d# v0 o- C2 |/ l' @3 E
  322.         mov     cx,cs:[pos_x]
    & b- @6 N9 _  M9 M, |1 A
  323.         mov     dx,cs:[pos_y]
    ( h4 R# |5 Q4 S& ^
  324.         mov     di,0 ;cs:[x_move]0 e% J# b! J3 k; J& N
  325.         mov     si,0 ;cs:[y_move]+ L* D* t3 E! w! B7 x7 v/ E
  326.         mov     word ptr cs:[x_move],0
    ) e+ Z3 v5 M1 G+ \- d1 e% w9 g/ }" D
  327.         mov     word ptr cs:[y_move],0
    9 P1 B  [7 y  J) k' n. C) C1 m
  328.         mov     bl,byte ptr cs:[buttons]
    / h2 q% B1 w' C3 b0 |$ H- T
  329.         xor     bh,bh
    " c: M. `$ R, K6 Q4 P
  330.         call    dword ptr cs:[user_subroutine]! W4 R1 u3 m; Q7 ]- T
  331.         db      61h" F4 }) `/ E$ Q& R9 P6 \& D  A
  332. ret  K" `' E' S1 i- i, J1 @! j! g* F
  333. new_isr:8 s- E' |. i* i8 w6 V* g) A
  334.         pushf
    4 F6 j4 d  b, q) X* z6 O5 O
  335.         cli
    : @1 ~# o" E' Y* w% @, Y* ^9 G
  336.         push    ax- w- {! V" u: H0 \" r
  337.         push    bx* J. I+ E$ s/ F5 h
  338.         push    cx! c: N# U2 O; [- Z( o) B& C" D
  339.         push    dx
    * X1 h6 l3 g7 K2 I8 J8 l. @& F7 g/ E1 T
  340.         push    di& j. {8 N3 s0 U; f; z, _
  341.         push    si. T$ Y" ^6 f8 M4 s& h9 R+ H% \) b
  342.         push    es% P' h# |8 `  n: |* a$ U/ g( x. @
  343.         push    ds
    $ a1 B8 t5 m7 c6 i$ d

  344. 8 z& l4 U5 {; k0 @
  345.         push    cs
    ( `! s+ T0 L- ~$ @* F$ j, B
  346.         pop     ds$ B; q0 @- u0 [& K8 E
  347. 8 }- L. w0 |- y
  348.         mov     bl,0adh
    . I! u% }$ b2 _4 F( _; d) ^
  349.         call    keyboard_cmd
    2 Q1 ]1 }4 H0 z4 P+ u
  350. ; [7 E. ]  \$ h/ M4 k9 I- j; J( z
  351.         cmp     byte ptr [first_time],0
    4 B  Y' B  C7 H9 K: C0 ]- ]: B- z2 i
  352.         je      not_first_time! R' d, c4 K4 t& U2 w" _

  353. + C, z% T  L4 ]) `6 ?
  354.         mov     byte ptr [first_time],0
    " J9 a8 h( e; D) |0 @* A9 P
  355.         call    keyboard_read7 P0 O# ~2 V  B
  356.         call    keyboard_read# |# z" u: d3 }
  357.         call    keyboard_read
    % ?& C5 }3 U* W# m2 X
  358.         jmp     no_show
    - L/ y0 t$ |7 W, F

  359. - L5 m6 L" }1 L
  360. not_first_time:; b# Y9 h6 Q; g3 w1 ^: y! J
  361.         mov     word ptr [temp_mask],0! F" u) c1 y$ j
  362. # Y2 i0 N( Q6 ?: {
  363.         mov     cx,[pos_x]! F, \% U" q3 R: S4 V) f
  364.         mov     dx,[pos_y]  D7 \2 B1 t2 e2 D3 p# z; Y! J: f

  365. + l. [" T7 e) z! R
  366.         call    keyboard_read
    0 `  T3 E5 K* r/ j' Q
  367.         and     al,7 ;3( j6 @0 }3 O3 N$ b7 c0 e
  368.         mov     ah,[buttons]
    ! E6 l7 Z8 z7 y) z' K7 ~  g1 E
  369.         mov     [buttons],al
    5 f2 A3 }3 W/ i) r; m' L
  370.         cmp     al,ah$ M: y) E; c; i! N0 X
  371.         je      no_button_change' Q% [) F2 Q5 ~8 o3 A
  372.         and     al,3
    3 X8 M8 f. }1 L5 U1 k
  373.         and     ah,3% O& n* ~2 b4 X- q# Y* d
  374.         xor     al,ah" [: A' H9 [+ M: [2 |4 a; R" y
  375.         xor     bx,bx3 M' C) k" Q  N% O5 v; q) d

  376. $ X! V5 z' V8 O, @0 A1 V& X. _
  377.         push    ax, J$ @9 f7 d; d6 U
  378.         test    al,2& K1 V7 W7 G  Q( B( C
  379.         jz      no_right_button_change
    5 K3 G& f6 V: S8 \
  380.         and     ah,2+ Q" r: L+ X9 K7 K) d- _2 L
  381.         jz      right_button_pressed
    9 W. H8 U1 U6 I1 x( s
  382.         or      bx,16
    & F  f8 U8 Q( G- p$ }, u
  383.         jmp     no_right_button_change2 N+ ^2 x" @! ?8 E+ Q6 ?
  384. right_button_pressed:
    8 K! n: W; O2 z' B6 \6 i, ]
  385.         or      bx,8, ?1 I, a1 X4 I, ?) Q8 Z* c6 Y4 t
  386. no_right_button_change:
    4 r) U. F# l- ~; O) U4 {) I3 W

  387. ; Z! S6 I* T  K0 D
  388.         pop     ax: [5 e5 h( i) y- v+ d- ~5 g  D: a

  389. 1 n1 \( n2 a3 n: ?8 p$ r
  390.         test    al,1. }) a7 M& ^- l4 \% |
  391.         jz      no_left_button_change
    ( e$ [/ z# \6 o4 e' z. [0 ~& M) Q8 I
  392.         and     ah,1
    3 d, O) p5 C$ H8 K$ E0 b% b8 \
  393.         jz      left_button_pressed' D" R) x. l1 C
  394.         or      bx,4" G  a: ]7 U* g
  395.         jmp     no_left_button_change
    3 p% X/ P& s. h% j4 y
  396. left_button_pressed:/ E1 A4 H$ J  L: d; i
  397.         or      bx,2& }. J% F* g+ W" R, y
  398. no_left_button_change:
    ; `' H: ]3 S  Q/ ]1 a
  399. 1 Y. D- L* U+ o1 L8 D6 E! Q/ i2 f
  400.         mov     [temp_mask],bx/ Y; U5 b& c; b. I
  401. 2 e+ {: _2 W+ w8 P, m
  402. no_button_change:* C* s* L8 x% z$ Z2 ]  w
  403.         call    keyboard_read( S' K; p8 W! G5 \$ V( u7 h; r' H* p) K
  404.         cbw
    2 ?, Q2 L& |1 f& ?' J
  405.         add     [pos_x],ax! U' q$ _' J4 r
  406.         add     [x_move],ax2 w: E% z+ M- z$ x, M6 Q, v
  407.         mov     ax,[x_min]
    2 u; S3 F% e4 T( }1 U: H
  408.         cmp     [pos_x],ax
    2 y) [8 H. f0 R% C7 H9 \! a6 m
  409.         jg      good_hor1$ p; f/ o0 f. l+ S( l! r
  410.         mov     [pos_x],ax
    - }$ e2 V1 w5 M( P
  411. good_hor1:
    0 ^+ `0 L* D# E" z
  412.         mov     ax,[x_max]
    9 a: M# m) P! Y  ?- c5 _- T- ]
  413.         cmp     [pos_x],ax
    8 H; |, o+ t2 Z' U  Y5 e
  414.         jle     good_hor2
    ) P9 |: ^6 `% Y! ?9 ?2 L8 M3 }8 t
  415.         mov     [pos_x],ax
    $ K/ X0 @* m4 ^0 F) E+ y
  416. good_hor2:1 w5 ^: f7 ^" n
  417. . L9 [7 u* P9 o$ t) G; b& [
  418.         call    keyboard_read
      I3 E& m3 ~0 s% c  I0 I
  419.         neg     al& D* A# Y! g8 }& a+ M
  420.         cbw
    1 i5 X+ V; H5 P) A! |3 w$ I9 G5 T
  421.         add     [pos_y],ax; E& g" ^) T" {; r7 }
  422.         add     [y_move],ax0 j5 F, y5 p$ H9 m
  423.         mov     ax,[y_min]
    2 ^0 J. _, K( L/ G- N
  424.         cmp     [pos_y],ax3 d! t7 _' |' \( M3 W
  425.         jg      good_ver12 U1 W& J9 G& x. l: O( B- G
  426.         mov     [pos_y],ax$ }* M- g1 J7 s
  427. good_ver1:
    : c# k! l2 y: f, B: ^5 p) l
  428.         mov     ax,[y_max]
    $ {; Z" }# l! I9 N
  429.         cmp     [pos_y],ax
    ( \4 ~1 t2 L% j! r) B3 |
  430.         jle     good_ver2/ Z, H. H9 P" t, n
  431.         mov     [pos_y],ax
    . D2 m2 T% b; D) D
  432. good_ver2:! j/ r% @, J9 |' _' G

  433. 2 t! d2 k% V) F" ^
  434.         mov     ax,[x_move]
    # c! }* x! ~) ]! M5 S% I9 r2 A
  435.         or      ax,[y_move]
    1 ]8 o. m8 N- E7 }
  436.         or      ax,ax) b  c! d  D5 D+ w8 [, h; P, f
  437.         jz      no_change_position
      e. w/ g. U$ w6 E5 `, v
  438.         or      word ptr [temp_mask],16 @, m% C; u4 v8 U; v: P8 s- K) |
  439. no_change_position:
    5 p- n1 F3 Y4 S
  440. * t+ T, s& ^- W1 i$ f
  441.         mov     ax,[temp_mask]0 J; h9 j+ m- S
  442.         and     ax,[user_mask]
    0 `/ j+ ^/ h, _4 }, O; b
  443.         jz      no_call_user
    ! F7 `& j, \% r/ g7 W3 E
  444.         call    call_user_isr
    6 b7 l9 H1 B% S: Y( `4 Y2 E) H! ]
  445. no_call_user:. ^; e: t' T. E8 H
  446. , p1 `: `; F- h" P/ H7 Q7 x
  447.         cmp     byte ptr [sm_flag],1$ \& J7 C/ c" F6 Z
  448.         jne     no_show  x2 @9 K( Q3 u( j1 d4 V

  449. 6 z8 m0 S! q& z$ M& `- k& l
  450.         shr     cx,3
    ; Z9 q: k) {! Y+ D5 x
  451.         shr     dx,3
    - d' L1 L' D; F& ?
  452.         mov     ax,80/ I: s2 L& ?* b# ^- |
  453.         mul     dl: e7 U9 t1 U2 F% \9 W, d' A- U
  454.         add     ax,cx1 C$ _1 j0 S0 s! V
  455.         shl     ax,1
    8 c6 h; r$ Y( g5 }6 q
  456.         mov     di,ax
      b! T! m! A' x! I  s, N
  457.         mov     ax,0b800h
    ) `% |; F6 p4 U) ]; y/ J& S' u6 x
  458.         mov     es,ax
    - ~0 v3 u/ }2 u; b$ ^  h1 g7 G( I
  459.         mov     ax,[save_char]
    & f) t/ L' I4 E: f( |
  460.         stosw
    & F) s* |# m4 [  z, ^4 b2 y# d
  461. # g! _+ J. {" g/ T7 A" @
  462.         mov     cx,[pos_x]
    $ E/ X- J  X2 r: N9 t
  463.         mov     dx,[pos_y]) R* P& k0 n6 [; {$ F0 J6 [9 m
  464.         shr     cx,3
    " Y; t% @6 l% v1 V
  465.         shr     dx,3
    % x: P. p# F- O" m& b
  466.         mov     ax,80
    ! \% s$ v/ G! j6 v8 t# |! Y
  467.         mul     dl
    $ D/ o/ V" j' [& j' @+ T
  468.         add     ax,cx4 y; x1 B0 I% v$ X+ B! o0 e
  469.         shl     ax,11 E8 O- f1 D2 a- r* B  u9 k3 ?' ~
  470.         mov     di,ax" i  q' V, y, f' H
  471.         mov     ax,0b800h
    % X# A1 b0 [! y* Z
  472.         mov     es,ax
    + c* P; o. ~. J+ [4 z/ H
  473.         mov     ax,es:[di]
    ' @/ u( Z/ U1 n" g: d7 R
  474.         mov     [save_char],ax
    - G$ ?1 W3 D3 F
  475.         not     ah
    , a* ^% Q; |% N8 \  n& n
  476.         and     ah,7fh1 \# Y6 L0 P' o- K. J6 y
  477.         stosw
    5 t- L; \1 D3 p; \
  478. no_show:  r) _+ O+ H+ m" i; R) `
  479.         mov     bl,0aeh- Q( l! w- \4 Q5 o: n6 S
  480.         call    keyboard_cmd2 |: \# U$ u; }  F6 ?
  481. 4 C4 g' {& `4 K1 d- m) ^; q- Q8 s
  482.         mov     al,20h" l- \5 f) F; U0 s1 m( ]! o
  483.         out     0a0h,al. t/ g0 }/ B  A. [, @
  484.         out     20h,al
      t4 ^4 W* b/ H1 Q5 i( k
  485. 1 O2 T/ o8 L- ^2 }7 `) \: z
  486.         pop     ds) ]! d' _- R' G
  487.         pop     es
    4 w* E, i' t- \  C' `) x& `
  488.         pop     si
    1 u- }5 a0 C3 \: L$ u0 |
  489.         pop     di  l4 t2 l/ p* V% O$ o+ Y
  490.         pop     dx
    . ^3 G3 {  O2 o
  491.         pop     cx
      d9 M1 g6 D: C# q) s$ c
  492.         pop     bx- N0 F; Q$ ]" {+ e9 m- a
  493.         pop     ax
    ) C/ H$ V  Q" w$ g* g; \
  494.         popf9 a1 ~8 h5 s- I( p4 p  t& H- c
  495.         iret
    6 D6 ^7 ?% ~2 O% f$ M( i

  496. % E# i5 P; Q& ^
  497. first_time      db      1
    : B; L; {- U7 |4 j8 S
  498. buttons         db      0: Y6 |/ U% u) C/ }* T
  499. pos_x           dw      08 `  |9 T6 t9 D. A  Q8 q' f" X
  500. pos_y           dw      0% i- a5 c  d" R9 h9 B" S
  501. sm_flag         dw      0
    9 o: T# u& M# ?  A7 D1 A7 u  S
  502. save_char       dw      09 h2 @* R- I6 C4 q4 T2 z4 c, B$ C
  503. x_move          dw      0
    & m+ Q: m( D; P* O4 C5 `& L
  504. y_move          dw      04 B% L7 R! X* J& N8 J. ]
  505. x_max           dw      639% z0 S2 V, ?7 ]; D, G
  506. x_min           dw      0
    # T0 z9 f+ t+ Y0 j
  507. y_max           dw      199
    6 K) ]+ r6 ^* E! E: I9 p8 e/ ], O
  508. y_min           dw      0
    9 e! R* _! |, c5 I1 ?, B  R
  509. user_subroutine dw      0,0
    4 T6 H% K0 m9 ]9 z1 f- O: H
  510. user_mask       dw      0
    8 M- C% m7 L' s* K
  511. temp_mask       dw      0
    ' ], P) w# q, J. L
  512. . w* `2 ~( D& G
  513. keyboard_read:% D/ p" ^  g* P5 e& U" B) [# `
  514.         push    cx# q  d  U9 Z# E# q8 I4 }+ Z
  515.         push    dx
    ) _) D; U! d2 D! L9 C! i; D
  516.         xor     cx,cx
    1 i1 I7 [* `& @& x7 ^/ f3 ~
  517. key_read_loop:
    ' k9 n0 @: A2 o0 |% g8 U9 B0 S
  518.         in      al,64h" l5 Q5 N8 I4 t9 g
  519.         jmp     $+25 ?2 t5 M: W* t! Q3 X
  520.         jmp     $+2' y( t0 j0 b: m* }9 U+ O3 [
  521.         test    al,1
    / G9 }5 [. |6 n- T
  522.         jnz     key_read_ready
    7 H  R- Y  r3 y2 d  z2 `3 U
  523.         loop    key_read_loop
    - Q* \( D) l: c) u9 N
  524.         mov     ah,1
      G* O1 U7 W3 g/ n7 a3 t( h7 t. G
  525.         jmp     key_read_exit9 h  _. O4 h3 ]5 t% m
  526. key_read_ready:
    7 o# B6 X5 F9 w& S  j' y, t7 u
  527.         push    cx# u* i3 a- f' p7 J6 ?
  528.         mov     cx,323 [: ?0 p' X# n: _! j2 p
  529. key_read_delay:! ^6 T  i7 v* G
  530.         jmp     $+27 @8 u( P0 m  C5 r: O
  531.         jmp     $+2
    8 s! ]; B6 T  [5 Y/ A3 x( j' [
  532.         loop    key_read_delay
    - F: c0 e5 Z7 ^; i% J- x; d* y
  533. ! B5 p7 ^5 {( c! M
  534.         pop     cx
    7 i. ?# g/ q7 ?  F9 A6 n
  535. 6 }' w6 E) _' D6 H) p# V$ x
  536.         in      al,60h' B+ P# {3 p8 T
  537.         jmp     $+2
    + Z+ N% L/ W  _( i
  538.         jmp     $+2
    , o9 r" W( r  B6 Q$ a
  539.         xor     ah,ah
    ! F# C) M3 m3 S/ M5 U6 {3 ^
  540. key_read_exit:1 ]/ K5 M8 c( G, t. k
  541.         pop     dx) Z& \5 V8 V8 r
  542.         pop     cx! _6 k. E$ L5 u; g% e
  543.         ret
    & L# M5 S' ^% P$ ~
  544. & P" |8 h1 j6 w2 r- w) C( I7 L
  545. keyboard_write:" I" G9 F9 ?4 L3 n. X
  546.         push    cx
    ' I5 j7 U( D4 c8 K, W3 L
  547.         push    dx
    1 l; t, @6 k* D! B. o$ [
  548.         mov     dl,al' n& A7 s7 q. _! h4 \
  549.         xor     cx,cx  h+ s7 \& q1 V0 M: w* o, C
  550. kbd_wrt_loop1:
    1 q3 Y( J2 v" M4 J: q
  551.         in      al,64h& Q5 w; b7 s6 ?! S+ O; J
  552.         jmp     $+2) ~: c: k8 W: Y
  553.         jmp     $+22 b2 p# `3 y. j% k% @  X+ k
  554.         test    al,20h
    8 k' q) k+ C) ?9 I  B: [+ d  u
  555.         jz      kbd_wrt_ok1  S. ]1 Q/ M% i- J2 R; r) B

  556. - E. o  v/ l8 e/ c: W8 ?- `1 `
  557.         loop    kbd_wrt_loop1
    9 m) @  h3 m+ t6 `/ }  ~

  558. : X5 O2 Y2 C+ N. K; l6 Z, I: |
  559.         mov     ah,1$ Z* b$ [$ Z+ s1 h7 Q
  560.         jmp     kbd_wrt_exit
    6 q( U* {8 v, o% i+ F6 [) c
  561.   b$ r- K2 U7 T8 s# o
  562. kbd_wrt_ok1:  N7 e1 W( g. r3 J5 e- S) L
  563.         in      al,60h% |* Q9 {- ], L- ?- I

  564. * K7 b( }0 b4 O. o: O8 A  \
  565.         xor     cx,cx3 K9 P9 Y* t: q+ F7 L7 P* A
  566. kbd_wrt_loop:. f' `% }3 Z1 O4 z) g3 ~
  567.         in      al,64h
    9 G1 F( B  s! D* {) B# ?
  568.         jmp     $+2
    ) i8 {2 M8 Q4 A$ \  F7 D
  569.         jmp     $+27 \3 i  @! N$ \; m" j, T
  570.         test    al,2
    + k2 l* s% `* p1 e' n1 G  V
  571.         jz      kbd_wrt_ok4 Q% Y; }3 I; b3 ~2 O# \

  572. / `# o% `2 a' `6 N
  573.         loop    kbd_wrt_loop9 X  a8 ]4 h- x1 R

  574. 8 P0 W; V$ W8 o( x( T
  575.         mov     ah,1+ P, |) R& b+ {8 s7 V
  576.         jmp     kbd_wrt_exit
    / L" Y- w1 ]" P7 @' x' a

  577. 7 B9 {+ E/ [% U% Y
  578. kbd_wrt_ok:
    * @4 n+ b5 Q  A: b1 q, M+ ^
  579.         mov     al,dl
    ! g- D& k" `  Q& \+ t9 T$ s
  580.         out     60h,al
    2 u5 P0 p% I8 }7 L6 e% \' V
  581.         jmp     $+23 W* E) G  n4 ~" L% _
  582.         jmp     $+2. h6 {6 E- I; z
  583. 6 B. z. o0 v% \% n! A5 E4 l
  584.         xor     cx,cx+ k9 S+ q* O' F  M4 I/ ~% `$ j
  585. kbd_wrt_loop3:
    6 |$ l5 b* O  q9 U: E0 Y6 p& ?+ x
  586.         in      al,64h
    1 U% ]$ {6 \( r0 n9 @/ N( u
  587.         jmp     $+2
    4 n2 g. F2 S1 i
  588.         jmp     $+2
    6 D8 f) G" }/ ^9 M" F- {
  589.         test    al,21 @4 @5 q8 g! }' n, L
  590.         jz      kbd_wrt_ok3) }% e+ l% F3 d3 @- c
  591. / r6 i$ ?3 `  s. X! X9 J2 \
  592.         loop    kbd_wrt_loop3
    $ j7 m5 |* ]% T  [8 S  }
  593. + S9 c: B  w* M* o+ q
  594.         mov     ah,1
    + [! s+ y5 b. r0 m+ `( y# E+ w  y
  595.         jmp     kbd_wrt_exit
    ! T8 T/ {! O& P8 y
  596. " {* e* w1 D, \% L
  597. kbd_wrt_ok3:
    # {9 N( ]" y2 o9 i3 s/ P" k* j
  598.         mov     ah,8- ~1 U% M# f$ ~- E" C1 l
  599. kbd_wrt_loop4:
    ( B) l( s8 z$ i9 _' f: j
  600.         xor     cx,cx
    0 n7 R* k0 ~4 l, I9 G& `
  601. kbd_wrt_loop5:
    " g- U5 b; Z# x( a7 @2 m9 C4 r
  602.         in      al,64h' Z7 h: _- a/ Z
  603.         jmp     $+2
    5 N5 i: {! z3 C( v9 L6 C
  604.         jmp     $+2
    # K7 q% ^6 @% X* c. T# E
  605.         test    al,1/ E1 _1 C5 I4 k* x' P% d# C) ~: Q- u
  606.         jnz     kbd_wrt_ok4
    . X- p6 m& E! y6 Y4 R3 F

  607. 8 j3 M. x- K# a1 r/ w4 V/ q2 S
  608.         loop    kbd_wrt_loop5
    8 D' t8 q- l. c! r' _

  609. + z2 E2 P, Q! H6 R  f& ]1 X
  610.         dec     ah( [0 W& t/ g2 v- E( m/ Z. J
  611.         jnz     kbd_wrt_loop4
    / i; `" T0 E4 \6 ?

  612. / |2 o7 J6 q3 y! F: ]4 V, X
  613. kbd_wrt_ok4:+ c) M7 x0 I& ?8 M: o) G, q
  614.         xor     ah,ah6 S' d- Y7 Q6 Q) M2 R
  615. kbd_wrt_exit:. R1 e, w9 q+ U) i* K0 \# a! H  W8 v
  616.         pop     dx" S3 y) A! p7 p( P0 E$ g) N1 g
  617.         pop     cx+ M. k2 Z  y' D3 ^8 t
  618.         ret  o. _) P! y, o* k4 b' g0 I4 U+ ?
  619.         
    2 v# J2 _' e/ @0 E. z- k
  620. keyboard_cmd:
    % @; L4 |& |: i/ E) Z
  621.         xor     cx,cx
    ) `: H+ _! Y1 l# L
  622. cmd_wait:7 V- O# f- u6 S9 r0 h
  623.         in      al,64h3 A4 e/ u6 z7 R
  624.         jmp     $+2( y$ L$ o9 p7 G
  625.         jmp     $+2- A( ~. N  z9 _, J% b
  626.         test    al,24 M8 F# r4 l  ^+ W( G
  627.         jz      cmd_send
    3 Y' d2 e: K- k; T" v1 F1 v5 Z3 Q- R
  628.         loop    cmd_wait
    " D  G; ]4 A0 {4 t
  629. 9 T% F, l7 j3 f& P
  630.         jmp     cmd_error& W, c+ U, k- l. i6 k/ a. X8 u

  631. 3 i+ Z. o' D  \# D1 x
  632. cmd_send:
    + L5 O! a0 R& f
  633.         mov     al,bl! b/ f4 b# Y+ J7 |7 e5 N" e4 m% ^% S
  634.         out     64h,al( A( `' B1 K3 }$ d/ C8 u4 Y2 h
  635.         jmp     $+27 o* T9 ?  G7 X' {3 u# c+ E$ z
  636.         jmp     $+2
      y* u% p0 @$ G3 l& I0 L

  637. ! @  Y& X& \( W3 V* `* b
  638.         xor     cx,cx; R1 g. C1 n! g+ f0 G6 O9 ~
  639. cmd_accept:
    5 w6 T  `; W8 L! O- n: e
  640.         in      al,64h. q  `2 h' ~* l! X8 `& k
  641.         jmp     $+2  \& q7 j7 X6 w" ^9 d8 D
  642.         jmp     $+2
    ) h& ^' [' D3 W) ]( p. J
  643.         test    al,2. y9 f; S3 W; C* p& P& |  c
  644.         jz      cmd_ok
    $ I  w  I& z4 ]3 F" q1 V, |
  645.         loop    cmd_accept
    5 Z3 O& X, X0 P# c- P& x+ N% A
  646. 6 ?: r+ R5 {# T9 r% ~4 H9 l
  647. cmd_error:
    ; c1 k3 j9 ]' g. Y! p
  648.         mov     ah,1
    , U7 k& S. C; E! x) ]( e
  649.         jmp     cmd_exit. r& N9 X9 Q4 E
  650. cmd_ok:
    # n* a  p1 p  f5 I7 y- ~6 R
  651.         xor     ah,ah
    # b, j/ S! r, S
  652. cmd_exit:
    4 d& T$ Z, R, X: n  _
  653.         ret/ N! U' {0 n6 {! p9 X

  654. " s  c& M% R6 _+ n' c3 b
  655. new_33:
    , E% i; A. R4 u9 z; W
  656.         cli
    - `0 w' J2 K& B7 q9 c7 @* v; Q
  657.         cmp     al,0
    8 q/ `( w7 J/ \8 D- a3 N2 }/ a
  658.         je      reset_mouse1 h, Y; b- u; Y8 `, G( v6 U
  659.         cmp     al,1
    ; X  U0 X! l& q9 B  i3 k
  660.         je      show_mouse( J/ V! O: H1 K3 k1 m
  661.         cmp     al,2
    5 Y  K9 d7 a* Y, H* |& f# X9 L% i
  662.         je      hide_mouse3 b8 Z  d# h- Y* T3 E$ n
  663.         cmp     al,3
    2 B* c! R( U' @1 I! A
  664.         je      get_pos. _4 \- B0 A- `8 J, v* u' M
  665.         cmp     al,4' K* ~# W% D! r7 ?8 W- W. {. h! e% G
  666.         je      set_pos
    2 e9 W9 D7 `1 S; S
  667.         cmp     al,74 }5 C5 b2 X' d% C9 [
  668.         je      set_hor_pos8 c9 q1 i+ K% {- p5 k
  669.         cmp     al,83 f$ \$ U$ _3 F) d- H+ f
  670.         je      set_ver_pos
    # I* B, d3 Q$ N# A. u8 l
  671.         cmp     al,0bh
    8 k$ }) q  P: B+ n( V# b% i6 w; M
  672.         je      get_mouse_movement" I* _" Q* Y4 o8 |$ y1 _! [$ z* K" n
  673.         cmp     al,0ch
      i0 X! w) T" f6 R- n  \% f8 q1 w6 D
  674.         je      set_subroutines
    ' {# P- D5 @& h- ~1 L' K
  675.         cmp     al,14h
    # ]/ o. i& S3 D) x' g2 B/ E" U
  676.         je      swap_subroutines
    2 H3 x: R4 m0 t0 O+ T! K
  677.         iret, S7 ^0 b1 _$ ^( ^
  678. " I- L& W7 Y5 u( U
  679. reset_mouse:/ F; f5 A) R3 f& y8 X' D1 h& a
  680.         jmp     _reset_mouse
    7 z( t& ~8 r8 |
  681. show_mouse:0 Y7 f7 v0 i) [
  682.         jmp     _show_mouse, ^$ t% K( x6 |% |. x9 k' o
  683. hide_mouse:9 q% P/ l0 P% _5 K! i( k! b1 T2 F
  684.         jmp     _hide_mouse2 u% j4 E  Z1 d* X$ W0 V
  685. get_pos:6 q7 x3 B# V; |1 l( y
  686.         jmp     _get_pos
    7 M4 d9 ]% G6 c7 [$ |! |' r- {
  687. set_pos:
    3 c8 J4 C) x8 \1 {  C$ z
  688.         jmp     _set_pos
    6 U5 y0 V/ n$ T4 P- d
  689. set_hor_pos:3 h5 T' L8 s% A' Y# V
  690.         jmp     _set_hor_pos+ l- s& T" K5 W* r2 h  V  N
  691. set_ver_pos:
    8 q, B1 H8 K; l6 y3 j& A
  692.         jmp     _set_ver_pos
    4 G/ I  A. F: ?
  693. get_mouse_movement:
    # J4 O. J' c% d# P6 \! o) i
  694.         jmp     _get_mouse_movement
    ) n4 Y, ?& p/ i( X$ `0 X
  695. set_subroutines:  p) d$ ~  e5 S5 j2 A' P8 K( z" D
  696.         jmp     _set_subroutines
    2 e5 z/ {# Z7 T- g+ F& P
  697. swap_subroutines:$ f: C% ^9 Y; E) \
  698.         jmp     _swap_subroutines
    % Z, `6 w1 o( h3 H9 R! x9 W& |4 D
  699. . y9 X+ V2 L6 R1 i5 [
  700. _reset_mouse:  a' V2 `' V$ V; I1 \6 f; m' L
  701.         mov     byte ptr cs:[buttons],0+ k0 H9 g) R, F
  702.         mov     word ptr cs:[pos_x],0' E$ f2 S" \6 ?: {
  703.         mov     word ptr cs:[pos_y],05 ?6 D  O2 s. \9 J" B
  704.         mov     word ptr cs:[x_move],0
    3 |" w  i& }# b( F
  705.         mov     word ptr cs:[y_move],0
    6 r9 c$ K) P- F" q  b/ U. e" q
  706.         mov     word ptr cs:[x_max],639) O4 S! j2 W6 @
  707.         mov     word ptr cs:[x_min],0
    6 t& `7 d; r1 U7 g- G3 y9 V
  708.         mov     word ptr cs:[y_max],199+ U5 _; i  P+ e' O, Y
  709.         mov     word ptr cs:[y_min],0, {2 Y; x0 n) ^' r+ p# Q2 ?% W* C
  710.         mov     word ptr cs:[user_mask],0
    : P4 l! g3 b& e9 S. [( S. n5 I
  711.         mov     word ptr cs:[user_subroutine],0
    7 G# m# h- ~/ @( a7 w
  712.         mov     word ptr cs:[user_subroutine+2],08 V, \' J9 o* p
  713.         mov     ax,0ffffh
    : U3 a8 l( o2 P3 \9 }: B* U
  714.         mov     bx,31 a- k* u( Y. q' t
  715.         iret( q* l' T/ Y/ B  G* D1 }/ P  J
  716. ' f! w* p7 J. T; L+ t
  717. _get_pos:
    / Q6 A* I3 H5 Q) y+ {: I/ V6 z
  718.         mov     cx,cs:[pos_x]
    9 P3 e! L* P0 N
  719.         mov     dx,cs:[pos_y]
    8 W. e9 D1 f" t+ E0 P9 Y
  720.         mov     bx,word ptr cs:[buttons]* l! C: u2 R1 Z% E. S
  721.         xor     bh,bh
    $ q5 K3 s1 V) F
  722.         iret
    ) f8 L4 Y% A# g4 q

  723. % \' Z! \* V: F! W" e  e% k
  724. _get_mouse_movement:' N2 V% K4 P: C% Z
  725.         mov     cx,cs:[x_move]
    : p! M% [2 T- Q6 g* I7 f$ M' k
  726.         mov     dx,cs:[y_move]
    / ^( z8 n! p/ G4 t5 Q
  727.         mov     word ptr cs:[x_move],0* l8 _) e& s6 I/ X, n/ e7 O: J
  728.         mov     word ptr cs:[y_move],03 R2 r, C1 O9 R2 K, N8 {0 z
  729.         iret
    3 Z7 \# c8 e9 ?1 F; }3 S9 U6 j4 e5 J

  730. + C1 x: k9 Q# M0 F" M+ m
  731. _show_mouse:/ w: Q& [5 N. |
  732.         push    ax
    6 o7 c5 [" M) M5 r1 W! T& t7 u" b# o
  733.         push    bx2 L/ D+ F$ Y$ \- y/ d. i
  734.         push    di
    # E' b! x" h) q: E- R  W5 m9 [% s4 @
  735.         push    es4 j2 W0 @. j! J- ~6 O; R' U
  736.         mov     byte ptr cs:[sm_flag],1- Q9 f% r  ^9 R; }# f+ h
  737.         mov     ax,cs:[pos_y]
    2 E4 g: D3 L; L0 z8 Q
  738.         shr     ax,3
    - I* _! e& \/ U, B- f3 o
  739.         mov     bl,809 r6 K% V8 J2 [" h
  740.         mul     bl
    4 k: ]3 c$ g  N( |
  741.         mov     bx,[pos_x]8 k9 \: W6 F0 ^1 u
  742.         shr     bx,3* u. e7 {! ?7 d! g# v* [
  743.         add     ax,bx
    7 S* |& u9 s3 X7 L& o( o
  744.         shl     ax,1' k7 Q( Y" X* }) Y* T  S; o
  745.         mov     di,ax
    ; J' ^0 }1 X) R
  746.         mov     ax,0b800h
    ) j, P! C8 W- H9 c
  747.         mov     es,ax
    9 d! p* c) u  P; E+ G4 T
  748.         mov     ax,es:[di]3 y1 [+ U) z; \' o0 a$ z: @) @
  749.         mov     cs:[save_char],ax
    8 R5 q6 i: T# R# }% g3 G* w
  750.         not     ah. Y- S" t' @( q% O2 Q5 ~$ k
  751.         and     ah,7fh6 s8 M& T7 s/ {4 P7 u- C
  752.         mov     es:[di],ax
    ' c, Z* ]. U+ ^* _6 W
  753.         pop     es/ t, r+ m# \0 H  d* K: Y, R
  754.         pop     di- }$ [6 R# e. I+ V+ R
  755.         pop     bx# [( y* j) _/ V# ]( D
  756.         pop     ax6 y% P. c7 m& ^
  757.         iret
    0 o* r8 t! |: X

  758. ! B, v/ d# t3 \. Y
  759. _hide_mouse:
    # ^' A3 G/ C' I( ^0 u2 h
  760.         push    ax% I# j7 `" a, I
  761.         push    bx
    : F. v. t$ p1 o$ g. d$ O8 H
  762.         push    di
    + P1 e4 B5 f0 O! C, U
  763.         push    es" S1 n- a2 V' C/ Q7 i/ ?2 v" }
  764.         mov     byte ptr cs:[sm_flag],0
    2 l. J/ Z. G" m7 ]) R) [1 k
  765.         mov     ax,cs:[pos_y]
    1 P1 H/ A$ Z% r2 N
  766.         shr     ax,3
      [% V/ |) ^$ ]: R$ l
  767.         mov     bl,80
    # c$ K" X- z; f
  768.         mul     bl( B1 R+ d6 H2 G* a! U' W9 i
  769.         mov     bx,[pos_x]
    & s4 V: q# o( h
  770.         shr     bx,3+ P1 k& @0 ~+ @
  771.         add     ax,bx
    7 [+ i/ a! L9 L: t6 K
  772.         shl     ax,11 A# n9 K) Y- k  N& X3 w8 t8 ^: N
  773.         mov     di,ax
    - k5 `6 S$ `  L# j& l
  774.         mov     ax,0b800h- h! U% S# f$ T2 u! e7 B' {! J
  775.         mov     es,ax. V1 P. [) ?) R) B$ N
  776.         mov     ax,cs:[save_char]
    2 {0 y/ X2 H2 L* W' F
  777.         mov     es:[di],ax
    . Y9 C: f3 [! r' t) h
  778.         pop     es  z$ T# z& [+ U* |  m' S( h, O2 s
  779.         pop     di; t/ Q; u( e$ U0 e& f- x  o
  780.         pop     bx
    * v* X# f& Q( H1 [' o6 c; z% L
  781.         pop     ax: W" S* F9 z& G: ]( H0 z+ m# ?
  782.         iret& B. F8 ~) z+ o
  783. - Q1 u( R8 h( E9 e! X9 }& ^) b
  784. _set_pos:
    % o$ F( n, J# c- f2 a1 X8 ^* r
  785.         mov     cx,cs:[pos_x]
      Z4 h9 O+ P1 {4 c& E
  786.         mov     dx,cs:[pos_y]% B0 s. r* ^3 t
  787.         mov     word ptr cs:[x_move],03 S& [# E% a" F/ }5 N
  788.         mov     word ptr cs:[y_move],0  w& r6 c- c% j7 ]3 u. S' p
  789.         iret
    ' D6 {) E8 d- k- q* t* i# q

  790. . f1 ^3 ^  Q' T3 u# I; j
  791. _set_hor_pos:
    5 I' y5 Z" D0 L7 V
  792.         call    max_min+ i3 s4 }. L8 e* ]' {" Z+ {6 W
  793.         mov     cs:[x_min],cx# ?9 F! b$ B2 O) V. h; Z) q& p
  794.         mov     cs:[x_max],dx
    8 y* c3 d3 a7 @$ Z: c6 z
  795.         cmp     cs:[pos_x],cx5 x& h: T& h7 x6 Q
  796.         jge     good_hor_min1 `3 K+ q6 S8 u
  797.         mov     cs:[pos_x],cx/ G1 F4 E) ~+ A5 R; j- Y: F
  798. good_hor_min:# N+ B5 z! k3 H# p5 k3 }1 j. B
  799.         cmp     cs:[pos_x],dx
    ; H2 J/ q' H6 a) r# o
  800.         jle     good_hor_max
    4 s( t" v5 z: g6 d' ]0 U0 o
  801.         mov     cs:[pos_x],dx3 s$ D) X: N9 T7 @5 ?$ @
  802. good_hor_max:
    $ q& q7 g3 I5 z, K+ J5 R5 L
  803.        iret
    ' S8 E! S/ b; N2 {/ c/ F) X7 J

  804. " U+ r" C6 f4 k; y  \+ L
  805. _set_ver_pos:7 }0 @2 ^5 ]0 Z$ p6 Z6 ^+ |7 y
  806.         call    max_min
    6 x. ?: q2 H0 Y) b
  807.         mov     cs:[y_min],cx
    ! z6 h  v0 [$ p6 H# ?$ b2 N
  808.         mov     cs:[y_max],dx) U# {$ {# H: R3 j
  809.         cmp     cs:[pos_y],cx
    6 Y: \& t1 Z! j  @
  810.         jge     good_ver_min
    ( {2 c; N8 u- B! |- S" Y
  811.         mov     cs:[pos_y],cx1 R9 X8 c1 n) U
  812. good_ver_min:' d# P+ ~' ~! i$ x9 p
  813.         cmp     cs:[pos_y],dx  c. X+ P+ t/ F7 ?" `% @* h7 U# b
  814.         jle     good_ver_max) F* P& C: ^7 W* w* G
  815.         mov     cs:[pos_y],dx
    : @$ o) @7 _8 e+ N8 i  {
  816. good_ver_max:
    ! ?9 L: K; L" o% {; t
  817.         iret1 T6 K& ~3 L) ^% t* ]

  818. - y, d. }& ~  R- D9 g7 X. Q
  819. max_min:
      O. n1 _- f  O: a
  820.         cmp     cx,dx8 }* z" Q! N' b5 y; A6 ]& R9 }
  821.         jle     no_swap0 m+ x, d$ ]. b$ P
  822.         xchg    cx,dx4 X, S0 b4 I  K8 A6 u
  823. no_swap:# g' X+ X. a1 C! r
  824.         ret* T# ?. }0 W. _3 ]0 W( u

  825. ! Y' F) b1 u3 W/ ~# J
  826. _set_subroutines:
    / `+ S* a+ J  ^) X
  827.         mov     cs:[user_subroutine],dx* x1 N! D; A# G% ~3 B# h
  828.         mov     cs:[user_subroutine+2],es+ N% y5 R% J2 u' p
  829.         mov     cs:[user_mask],cx
    / h0 N. n  @7 G( a3 {2 y9 f" O) _. m
  830.         iret
    $ L' h7 b7 m& _3 c7 P3 w( E% C0 `

  831. & t2 m! v! k' H/ y: u9 }$ r  l
  832. _swap_subroutines:" T2 ~: w0 b" n- F3 ~4 {" Q
  833.         push    word ptr cs:[user_mask]# d4 r/ X' K( I* i7 Q5 D, M; ?
  834.         push    word ptr cs:[user_subroutine+2]
    4 W( {8 v* W$ _& F
  835.         push    word ptr cs:[user_subroutine]
    9 i0 E# O# v) R( Z: e# w! L+ M! t' E8 h
  836.         mov     cs:[user_subroutine],dx% x  B  V4 E7 b: S+ w
  837.         mov     cs:[user_subroutine+2],es# i2 I, ?  P) W/ Q
  838.         mov     cs:[user_mask],cx" N+ K3 g1 ]7 r' O) t/ b
  839.         pop     dx
    % n! e- P/ w3 z5 X! \2 h
  840.         pop     es
    # _) f0 U6 Y# B; S' ?; p# K# T8 X
  841.         pop     cx- N1 L- S7 G5 \/ N2 @
  842.         iret. ~* D1 O9 H7 h/ k8 E
  843. , {; I2 q) v/ Y8 V! o
  844. memmouse        endp
    0 Z6 c) |# z- I0 ^' P5 ^8 t

  845. 3 `: A# u/ R  j. b
  846. endof_start:
    0 i& p" ]" D! I8 Z' W9 ^6 S

  847. # G: p2 ?' t. K
  848. emsg db 'No mouse driver install error!$'
    - ~3 ~; u. Q8 X$ }- Z
  849. old331 dw 0
    ) O+ ~: @6 ]' I* g1 A
  850. old332 dw 0) a  @! N; n: E1 ~; p
  851. old741 dw 0
    3 V# I$ T) l" _9 Z+ j
  852. old742 dw 0
      L: g0 H. ~6 w1 g) E5 k
  853. memcopy db 0# X) [' U* E  Z+ l
  854. okcheck db 06 G+ c/ z& v+ Y" a: ~% E
  855. pass db 0
    ! N2 i/ ?  O; v  X8 t
  856. chkl db 0! s  y& n2 ?/ G! B( ?3 t
  857. lk db 0
    4 y% S/ q# X& M4 D, z
  858. chkr db 05 z) x, O; i+ ]/ w( r) t  A
  859. rk db 0
    3 ~  M& ?; ~1 _! ~' E
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '  b: m1 j0 b/ p. [$ H4 J8 J9 s+ ^1 u
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    5 R! [# u; {8 A: o$ e
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                ') q6 B" w& f& X: m/ A! e# v
  863. db '                                                                                '1 l% S% @. _, h9 C  P% U7 U9 j
  864. db '                                赏屯屯簧屯屯突                                  '
    - N7 h% d5 f& S# U) I! E
  865.         db      '                                ?OFF汉OFF?                                 '
    5 g/ d# J8 `  q  j* q
  866. db      '                                韧屯屯既屯屯图                                  '
    1 ?7 ?, N1 g7 T& A% n1 m8 R
  867. db '                                                                                '* H4 z( u7 G, \- [) ]9 `0 Z; ]+ d
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '4 |1 O! x' h  j/ S
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 4 x' h: i+ `( i# [3 e, M
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '+ `$ c5 |+ V8 k; M+ m& R
  871. . T! E# _, T# C& U: c" D! P7 F
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!/ \1 m# G' v  e4 a* @8 n2 L2 d
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... 8 r5 u' q2 M' |6 T; h+ U' g" ?, ?  i
0 x: j) e" A- B5 }7 A
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-21 03:11 , Processed in 0.038970 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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