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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。; ]# W' G5 G) P5 c: K% c  O
. y# |/ G9 a" Q) |/ ?+ P+ A
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;# R) h6 x5 F& Y$ Z! n: ^+ U
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    ' B  `$ i: f) `2 w+ [3 U# x
  3. ;                                         By Bini.Yi 易祝兵
    % @; w- R5 m8 l" f
  4. ;                                         http://www.ufoit.com 计匠网+ E' c2 J" M0 @# Z5 D
  5. ;                                         2002/04/06 YYYY/MM/DD
    3 L4 Y+ ^' S7 X4 I& o/ t' H0 p: ]
  6. ;
    1 z5 r  c2 m: B' L! N# d6 c
  7. ;         
    ' U4 x. ?3 Y3 ^, `
  8. ;          This program  test the mouse button  click and move.
    ! f, f' K, g6 H% Y
  9. ;
    2 [! [4 {8 ?* e
  10. - O1 C3 Q9 j+ I
  11. .model tiny: m% w. M7 a. |, l( E
  12. .586- q4 M( u) p4 Z4 y& z6 x* J, I
  13. .code
    $ L) o# I6 ?! T1 W/ u( U
  14. .stack  100h
    4 f+ u4 u& m' Y7 v( t  T* ^
  15. .startup
    ) C3 ~$ o4 l) u* G4 q: \+ k# M, K
  16. pusha
      ?/ H9 |/ B9 |. {
  17. mov ax, 3533h
    . }  I: }8 L7 G6 r1 ^- h! g
  18. int 21h) @5 i; d7 m- D1 U  F. c5 w9 c
  19. mov word ptr cs:[old331],es
    # g' c9 r) y7 L
  20. mov word ptr cs:[old332],bx/ O- G% p' I+ Q4 R2 ^
  21. mov ax, 3574h) ^& @- l/ I" n/ d0 L, B* \* f& d
  22. int 21h( k6 N4 ]% X5 ?- h7 Z0 ]
  23. mov word ptr cs:[old741],es
    3 k& {) s0 \) [6 Q/ f& M
  24. mov word ptr cs:[old742],bx3 K; f4 C) u% X- e! O# ?2 Y
  25. popa* v+ j( k8 L4 R# ?
  26.         call    memmouse
    4 x+ ~4 r3 y3 Y* J# g! c7 f
  27.         mov ah, 00
    - M3 N: y: f  R0 |! F
  28. mov al, 03+ p9 t8 J; U1 P9 L/ m
  29. int 10h3 U* X1 e0 m7 Y! g" y* r
  30. mov ah, 06
    8 N# C4 L0 }7 e6 b" i2 o( l6 Y3 P
  31. mov al, 0, c! ^& U" h2 e8 C4 D6 n5 o5 }
  32. mov cx, 00 y7 g: I+ s6 s1 C4 K" p( R8 j
  33. mov dh, 249 ?9 P" H3 t3 V+ }1 L& A8 _
  34. mov dl, 794 I8 o) ~" L! J5 J( v1 g4 p% w
  35. mov bh, 07h+ x  _9 B) T$ d( K9 L3 K" D
  36. int 10h
    3 M4 B; J  W/ g2 q$ f2 e$ Y8 l
  37. mov ax, 00009 u: _$ Y9 c, y! i. t! k7 ?
  38. mov bx, 0002
    * E# T' y3 {+ _; }! {" d! C0 B8 F
  39. int 33h
    " D' R6 k6 ?" A/ a: D
  40.         cmp     ax, 0000           ;if no mouse drive install0 N% Y* F8 E9 T
  41.         je      errormsg           ;show error MSG
    , X' f2 I  U* F$ ?
  42. mov ah, 02$ y) _- a) C5 l; W
  43. mov bh, 000 O- T8 l8 F/ g6 q" ~
  44.         mov     dh, 25             ;Move point out screen
    2 C, r, l9 |6 L5 T5 T, d
  45. mov dl, 79
    ' Q% i& |! O7 U) G' J& z
  46. int 10h
    : b! h. Z$ J& X4 m8 `4 T
  47.         call    showmsg            ;Show info
    0 o! _6 z" K5 i* v7 m4 \  g' \5 D
  48. mov ax, 0001
    & `1 B- ~5 h- Q2 a% I. c
  49. int 33h
    ) S6 l& r) ^& ~  d8 O( P, n+ A
  50. ; mov ax, 000ah: A# X, C" t* D# G
  51. ; mov bx, 0000
    - v7 P) i4 ?& [( p4 B" b
  52. ; mov cl, 0h
    3 k" u( ?( J3 F' b; K" C
  53. ; mov ch, 0F0h
    0 ?! t+ m) F, O3 ]; i
  54. ; mov dl, 0h6 x7 z( ~% @. N8 }$ ?# j
  55. ; mov dh, 0F0h
    , H* F7 L" B" c  {
  56. ; int 33h4 m& {3 T2 ^+ P# u, e1 M4 k
  57. mov ax, 0004h# g" G& o7 V0 X: Q
  58. mov cx, 03194 B* Z, Q* ]# a: X7 f5 U7 A! u
  59. mov dx, 0103
    9 [8 J& g) |; p: h$ `8 }' j
  60. int 33h- b/ K) l: Q9 D. s( n# Y; F) W
  61. casemo:                           ;Case button click and point move ( Z" Z; }, k+ \& o- a8 O
  62.         mov     ax, 000bh         ;and keyboard press* ^3 I  l: N4 y) e
  63. int 33h
    % C- k$ W9 p- W, l
  64.         cmp     cx, 00h           ;if point move....X
    ! _7 ]9 h4 ?5 a; o, p
  65. jne xmov
      Z' N- W' T0 R
  66.         cmp     dx, 00h           ;if point move....Y
    7 A% [5 k3 V4 h5 R  m" J
  67. jne ymov6 ?2 x% V# K& V6 h! B7 S
  68. xymovend:                         ;X.Y move end
    + W% Y8 X+ O! {+ U. g
  69.         mov     ax, 0003         
    0 \9 m; g: e5 W+ K; r
  70. int 33h
    ) Q8 M: U5 U* }& |: b$ q
  71.         cmp     bx, 0001          ;if left button click  show ON- q+ }) H1 `* }& F9 b' P
  72. mov si, 18283 t1 |4 {( `, y! p
  73. je listl
    " E5 e* \: v/ J9 ?% n9 ~9 }( p" O
  74. mov si, 1828
    6 ^2 s! i/ O3 z- M
  75.         jne     nlistl            ;if left no click show OFF
    5 G9 i" J- W& ~8 u
  76. testr:
    1 p- t* v2 Q7 Y( \6 s( O! {
  77.         cmp     bx, 0002          ;if right button click show ON
    & e' R7 W/ W; S1 c* M
  78. mov si,1842
    2 E! i! ^& v; m8 d" E# h
  79. je listr; m* o$ z0 \3 [& h) k6 e% ?
  80.         mov     si,1842           ;if right no click show OFF; V7 [3 W5 E/ }: [1 \
  81. jne nlistl
    9 \5 ]$ _/ C9 T( ]. m
  82. casekey:
    6 ]+ |  i" k' K# l1 C! B) t5 c0 `
  83.         mov     ah, 01            ;if any key press jump check
    # E" l1 W8 b; R* {+ ?
  84. int 16h
    3 A2 q, l8 m. s+ `
  85. jne kpress
    . o8 H* Y6 G8 a
  86.         mov     al, [chkl]        ;check x flag
    ) o/ G0 k9 L' N. N1 C$ t
  87. cmp al, 02h
    4 p6 K) V" W0 ?. l/ O
  88. jnb chkok, H: v6 ]* ^0 Q6 e* B; r+ M  @' M
  89. jmp casemo
    1 b+ P# S( {$ g% N" z5 V
  90. xmov:                             ;if X moved, get the X flag+1) F) X+ l. [% d
  91. mov al, [chkl]
    ' o$ J2 T# l4 }" B
  92. inc al
    0 L  q8 C- i* E$ _% m6 t
  93. mov [chkl], al
    , e: t* b% d. x9 Z! q
  94. call passok
    + {8 f4 [' d0 e2 k% M* e
  95. jmp xymovend
    & ?8 b, i% I) G* R, H& k- u
  96. ymov:                             ;if Y moved, get the X flag+1
    . ?! Q4 G: g) W+ J+ I8 R( k! m: Y/ L
  97. mov al, [chkr]* Q4 c! N) F' H7 u: l
  98. inc al
    7 A% z/ p5 N! N6 |
  99. mov [chkr], al
    , h! j; n' p% d( ^5 g
  100. call passok
    $ A3 W2 C% X' ^- E7 ~7 q
  101. jmp xymovend, |) s8 J' T2 W6 j. ^
  102. 6 h4 b; u* F3 \/ c! |1 a2 W
  103. passok proc near
    , f/ B) M- s0 N) m5 ]+ j. R
  104. mov al, [okcheck]
    - y- `# T; I9 i5 O  k9 R
  105. cmp al, 1( J1 t# Y% w4 h' R2 `7 i
  106. je let0* P" q+ y0 Z5 V0 F
  107. jmp passret
    / W$ K% ^3 t' F* m* _) E# P
  108. let0:
    & R6 h8 o& p. v* n2 E# m
  109. mov [pass], 1
    4 z( o3 R7 j0 i) y: p& p
  110. passret:9 M0 e0 v( Y" j0 K
  111. ret- Y/ Z7 U! d1 o8 Q- K
  112. passok endp
    & y  e6 B* v1 Z: I
  113. 2 K1 u. P7 x$ }
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    ' i& `) U& k% x
  115. mov al, [chkr]
    , [% \$ j: }0 @8 K0 j+ S# g& p( E+ L
  116. cmp al, 02h4 d. L( n1 D- u" y% `* U/ R
  117. jb casemo: c% Q  h. e) |. m* k
  118. mov al, [lk]
    / G, Z% C( A3 A
  119. cmp al, 1* a* l, H7 o, }0 Q
  120. jne casemo
    $ i8 v% c' T- _9 ?
  121. mov al, [rk]1 Y' l5 A( I$ X" x9 Q5 `: A! _) A
  122. cmp al, 1' H# Y6 e  ^+ k+ g, s% M+ @
  123. jne  casemo" G5 S% Q2 {% c% D% L( G
  124. mov [okcheck], 1
    & b  G2 z  k( p  x( m- |
  125. mov al, [pass]9 X  y2 L$ t3 V0 |* |
  126. cmp al, 18 f: Q0 B7 n. O+ n; \
  127. jne  casemo
    ; _* f  t2 n8 N& Z# V! Q
  128. mov ax,0002h( ?+ q) U( X; n$ g* |) T
  129. int 33h
    % {0 k" ~7 b/ X. L9 n
  130. call cleascr
    0 Y) R* h% m& m  K4 }
  131. ! M: c* o6 ~; ]! S! B
  132. call oldint
    2 m3 h* X* }) `
  133. mov ax, 04c00h8 Z2 h3 q" r; A: t+ l0 r3 ~$ l1 ^
  134. int 21h. S/ ?% F5 H! v! G1 r2 }

  135. ) }4 t/ N1 p- v8 o7 D
  136. okexit:$ K+ d0 V) r2 a7 b; A9 }
  137. mov ah, 4ch5 Q2 L- }, _  x+ ~. {+ N
  138. mov al, 07 Z  \5 \! ^( E3 J
  139. int 21h
    - K+ S7 a$ ~9 R& S
  140. listl:                                 ;Show ON
    0 o( i, R: F7 q% D
  141. pusha$ j- N4 @. `7 T. N- n# e
  142. mov ax, 0b800h& v" X1 y" ]3 _% n
  143. mov  es, ax9 n1 J  m0 G/ u" J' D% G3 M
  144. mov ah, 47h9 U- \* [* \( Q' D6 j
  145. mov al, 20h/ }/ B& Y% M% N& z% g
  146. mov es:[si], ax8 ]  K- P9 R( Z0 C4 j
  147. add si, 02- x' F$ t- [5 o1 ^" h; e
  148. mov  al, 4fh
    1 ~8 `: B1 z9 Y$ w9 e
  149. mov es:[si], ax
    ; V* G" X$ z6 G! j7 U7 X8 {
  150. mov al, 4eh
    # M3 X) G) A) Y3 n
  151. add si, 02
    * H% V- d* N& z$ b( N- @
  152. mov es:[si], ax/ B. U9 K& Y$ G5 h2 @9 P; `* H
  153. mov [lk], 1
    ' [0 ~9 a$ b7 `. {) N' {7 c
  154. popa
    8 U% Y. F/ L5 l  {
  155. jmp testr
    : R4 T1 u. v! G
  156. listr:                                 ;Show ON
    6 A1 F3 u1 ?, }& g: p7 V  Y+ O
  157. pusha
    + f* u9 I6 B# E+ j7 \# P8 x
  158. mov ax, 0b800h
    , h2 L, P3 |( c6 N
  159. mov  es, ax
    6 ?( ^4 m3 w2 w" N
  160. mov ah, 47h( D& e# F; s# }6 ^0 J! f
  161. mov al, 20h
    / ^& ~% G3 W) u- d5 y
  162. mov es:[si], ax& S/ |$ ]# J* _3 q
  163. add si, 02$ p& J% H" A! x# y& J2 E
  164. mov  al, 4fh- `  {  S' N& G2 o* @7 S
  165. mov es:[si], ax
    ) D$ M2 r; ]) B0 D1 ?! t
  166. mov al, 4eh
    6 e3 e3 D. y$ `* _; o7 C4 V
  167. add si, 02
    + u( y. o3 Z, {3 O8 R
  168. mov es:[si], ax) {5 q7 E- _( O3 \- {
  169. mov [rk], 1) k" p0 O! a1 w! T4 T9 i
  170. popa3 c) F1 ]% n, ?# R
  171. jmp  casekey, `( q) n: T! C- F9 j

  172. - P( K! e# X/ y/ A# g+ W8 y" l; z
  173. nlistl:                              ;Show OFF, @# L- L/ o. k! R7 H1 N
  174. pusha   
    ( [6 C5 O  k0 I! }! x: B
  175. mov ax, 0b800h2 R. M7 m/ V1 d2 @
  176. mov  es, ax
    1 I: F; C; a" ~: z& k
  177. mov ah, 17h
    , T$ X3 |8 [4 B2 J( w. S: p2 t6 r8 b
  178. mov al, 4fh# d7 {. L3 K. W9 ]  E5 ~: c/ O
  179. mov es:[si], ax
    / r1 Y5 `$ K1 B2 X% }7 m
  180. add si, 02
    ) ^7 J  \% d7 t
  181. mov  al, 46h
    0 F& s5 x5 [/ b9 `, h
  182. mov es:[si], ax3 M7 j5 [4 f1 g3 L
  183. mov al, 46h
    ' ]0 r' {# n+ W! B7 t" l9 `
  184. add si, 02
    ( w: k' y: I) ~3 w
  185. mov es:[si], ax: x& V" j0 Y! H- z
  186. popa
    ' A% P% J4 ]3 J+ f
  187. cmp si, 1840
    + u+ m! h/ m' K. j
  188. jae casekey
    : y' s1 _) |# Z# b5 X! s
  189. jmp testr* W3 b( J' V$ K$ B, s2 Y

  190. 2 E0 `; g8 D- E7 t. l+ F( A
  191. kpress:                             ;Check key press if press<ESC> then EXIT" S$ c  J8 t# R8 G
  192.         cmp     ah, 01h             ;and return a error
    # f& k/ g. Z3 V
  193. je exit1
    + x1 E+ }+ [3 Y( f, ~9 d1 D
  194.         mov     ah, 0ch             ;if press other key then clear* D1 C# {% w, i& o* z1 f
  195.         mov     al, 00              ;keyboard buffer
    : t5 W/ Q( t1 V/ x9 \
  196. int 21h4 l: s8 B. G9 Z7 a6 G" y: |7 e
  197. jmp casemo
    - r  r! Y7 X8 f( m  r
  198. 7 W) u! S5 m! x6 {
  199. errormsg:                           ;if mouse driver no install# J  D. c6 e# g4 E- j) j) |3 L& N
  200. call oldint
    1 `) J" E( m; |! h% T. G/ O
  201. lea dx, offset emsg
    4 \* a  l# v0 o6 E  S) A" H- R
  202. mov ah, 09h' f# B9 \: }! V' E
  203. int 21h
    - k0 ?/ f6 k) Y8 Z) g0 y3 i4 W
  204. mov ah, 4ch% W' T7 b9 y! |2 n* F5 [- q7 K
  205. mov al, 2* w6 X0 r0 m/ A3 h6 s4 j0 T  m
  206. int  21h
    4 [& ?1 U6 Y: I7 [2 a" O
  207. 4 ?; s, M" A) t) J( _4 M1 @7 _3 w
  208. exit1:                              ;error exit, G) E. |2 {3 C) L! n( X4 }+ y
  209. mov ax, 0002h
    $ f) A9 V2 _& K- i, q
  210. int 33h
    6 e- }' m  ^( X
  211. call  cleascr$ C6 [9 |; Y( c! l' l( N% _
  212. call  oldint
    3 d( ^. E$ K5 W0 j7 O; v) K$ O! Y
  213. mov ah, 4ch0 x5 r% y; S. Y
  214. mov al, 01% Z8 L! i/ ^% X" o, v0 D7 x
  215. int 21h; ]3 d! @2 m: E' m- [
  216. ) H6 C9 i) F7 v2 i$ B" p
  217. cleascr proc    near                ;clear screen
    9 O& O% [. O3 o5 j# z' Y& W9 A! ~7 s
  218. pusha0 j2 q* b+ J' @% c* `# n
  219. mov ah, 06
    6 v1 v6 u: |7 G3 Q( g4 y3 P
  220. mov al, 04 `9 a# O7 u1 I0 ^, T4 M- v
  221. mov cx, 09 y- R$ U" w/ D( i
  222. mov dh, 24
    ) \. _# T3 e6 m& B1 R* a5 a; U: @
  223. mov dl, 79  |$ Y1 V/ d- f
  224. mov bh, 07h* _5 r  W8 z! z6 p
  225. int 10h
    ) k  g4 z* h$ r3 _7 X, B9 ]9 T
  226. mov ah, 02
    3 Q9 |( P/ Y7 E0 |
  227. mov bh, 00$ I( c4 F  J9 A0 m2 \/ ]
  228. mov dh, 0
    ( I2 x2 w) ?0 y; n
  229. mov dl, 0
    , {1 O/ H  X6 |0 G- A+ Y& X
  230. int 10h2 Q) B9 K' B0 v, g; `, M# ^; I, }& q
  231. popa
    " R* P* d, t6 W9 E2 q/ A
  232. ret
    + n4 s5 e3 @% A& S
  233. cleascr endp: s: _# [+ s, h: {% e& e' H: n

  234. : i) X( H5 X, D/ r9 r7 O0 t5 s0 }
  235. showmsg proc    near               ;Show info
    - U  B/ q0 u, R6 _
  236. pusha
      [. F, Z$ p) e/ i6 l
  237. lea di, offset showms* Q: f0 Q. k9 v3 M
  238. mov ax, 0b800h
    # |8 N; r- v# Y8 j2 y+ @
  239. mov es, ax
    ' s7 N/ B$ |/ p
  240. mov si, 0
    / P( A* A, f9 Y3 O
  241. mov cx, 480
    * p: {* k: Y' f# S4 p9 W+ S1 s3 a4 [3 ^
  242. mov ah, 07h8 K, X0 I! @. W7 }
  243. @@:
    - `/ Q( ~' h. z) q
  244. mov al, 20h
    7 A" n$ }) g. Y
  245. mov es:[si], ax9 b: [, u5 ^) }( n5 l% J
  246. add si, 2
    . c5 a$ d, W3 _! x* f
  247. loop @b
    ) K. v2 _. E# q' W1 ]* Z
  248. mov cx,8809 Y9 ^. m8 K' ?, s6 D
  249. @@:
    ' j& \; {8 F" N3 E4 r9 D
  250. mov al, [di]
    % G% Z1 x( [0 E3 k, X8 f* T7 s
  251. inc di9 h  ~! D, V) S2 t  |: \: W1 n. ^
  252. cmp al,20h6 J2 h7 |" i- B. Y' w% q/ b
  253. je showch1$ Y2 @* \$ f" R; ^! `1 b- z. ], s
  254. mov ah, 17h4 `, y9 R  x  r+ V- E# P6 c
  255. jmp showch3
    0 F$ D# Q& g3 e  z  ?' i- V* S  y3 m
  256. showch1:
    . `; n. S+ O5 H5 t
  257. mov ah, 07h 7 `& b9 _# U- L; S) e
  258. showch3:
    0 y, s9 K) g; t9 S
  259. mov es:[si], ax
    6 U& H+ b/ Y: M) I( t) O1 j4 W
  260. add si, 2( L$ G, g. t1 }9 n0 U  p
  261. loop @b! c3 x' ^2 L; ^5 g
  262. popa
    - R4 G8 v+ r' F" D- f
  263. ret
    & [9 Z9 R6 u0 w  B# [* g; [
  264. showmsg endp
    " y: X, k6 J/ g  W! E* K3 E
  265. 8 u! I( p9 G4 T: u! U6 ~6 p
  266. oldint proc
    / W; D: o! H2 Q; z( S
  267. pusha
    ! ~2 K3 `  X) n" E7 g
  268. mov ds, word ptr cs:[old331]2 T) T& ^7 e4 ?  `6 j: n
  269. mov   dx, word ptr cs:[old332]) S$ B1 L0 H* V5 Z, |
  270. mov ax, 2533h) S* U/ A+ m. @0 h$ h
  271. int 21h
    * h% G* f, Y9 v1 o2 W2 D
  272. mov ds, word ptr cs:[old741]
    3 A* a, E/ s2 C  l: a1 h; K
  273. mov dx, word ptr cs:[old742]" P- K* r$ }9 T; k
  274. mov ax, 2574h1 e/ T/ I, O5 k3 I
  275. int 21h
    & P$ [( z# v" d+ C, B; I
  276. popa
    3 y5 ?3 @3 f% G2 I
  277. ret
    5 I2 n7 a- a! `4 c) h" P
  278. oldint endp
    % T1 J$ y' u  H" g9 c7 d: x
  279. , w) |5 g: ^1 g: Y( X
  280. memmouse        proc
    . b" t& X1 T; i, h
  281.         xor     ax,ax
    + c- l, ~* \+ Z) p4 S% A9 [6 |
  282. int 33h
    ; P) z; w* H1 A
  283. cmp ax,0ffffh
    7 @# N4 ~) T- W  z- b/ r
  284.         jne     not_loaded/ W9 K* c& V. o. O: ]- v5 c
  285. mov [memcopy], 1% L8 y) B4 b0 |  K
  286. ret% \; Y8 F  ]+ u0 `9 o1 T1 p- Y+ m

  287. 2 J* B+ I& ]' K# F3 o
  288. not_loaded:
    7 h3 I! @, o4 K' S

  289. / m! L$ k% j; b' L
  290.         mov ax,2574h. g9 C. t% @; m  k8 ~' P
  291.         mov dx,offset new_isr. {# S) c9 z+ o3 k& C2 u; l
  292.         int 21h
    * O8 |7 H6 [( E1 i0 b

  293. 6 p3 G8 b: x! F5 ?- c- H
  294.         mov ax,2533h3 m" c' U$ r6 p3 V! h5 {: H
  295.         mov dx,offset new_332 `6 T/ e6 n' w, `6 \3 q- C9 D+ N
  296.         int 21h. o) ]% @; L' l7 S

  297. 9 A& I& M3 P! @' D' J
  298.         cli
    9 E: e! W. m1 d- F) C2 l( ?
  299. $ h/ [" G" A) B: s# n* U! W
  300.         mov bl,0a8h
    ' E' ?  J5 D0 m4 H& r; f
  301.         call keyboard_cmd
    & o' B4 ^* Y5 E5 b1 ?
  302. : e0 W- Y0 t; C5 n
  303.         mov bl,20h$ t2 q& ~. l2 F) l  C
  304.         call    keyboard_cmd9 n( P* R/ u. U) I, l
  305.         call    keyboard_read# W. ]/ ^- I  L. Z' u
  306.         or      al,2/ g3 G* k+ F$ N- U: D% Y
  307.         mov     bl,60h% w+ X% a+ |" ^/ d
  308.         push    ax( F% k9 T' m1 J, U
  309.         call    keyboard_cmd1 I+ E1 L2 o+ K1 ?7 {+ u
  310.         pop     ax
    . f; X6 O* R' e; d) y
  311.         call    keyboard_write
    / B8 J4 t9 Z; a) d
  312. 3 h- S. F  z  j" u& s
  313.         mov     bl,0d4h
    8 u0 c# J+ H. c3 h! N4 @
  314.         call    keyboard_cmd
    1 A  z6 w+ z0 Z/ q. E& s
  315.         mov     al,0f4h
    3 [1 H0 Z4 M- Z7 s% y& T9 e
  316.         call    keyboard_write
    ' J2 U9 Z' Y* ^  L' K

  317. # D1 n/ f" V5 {/ _8 I
  318.         sti
    ( R( Z7 A; Z: ?, p
  319.         ret
      x4 c  U( k" V
  320. call_user_isr:( ]" Z8 q: Z& z6 i! h
  321. db      60h
    ' L2 ]4 }  H& W6 O/ a9 B8 b
  322.         mov     cx,cs:[pos_x]  }+ n! [1 d0 W5 o* ?* d
  323.         mov     dx,cs:[pos_y], P- n( ~9 V& `* ?! ]
  324.         mov     di,0 ;cs:[x_move]* G2 m& V/ d0 C! Y
  325.         mov     si,0 ;cs:[y_move]
    & c8 L. c$ n6 `* Y$ U
  326.         mov     word ptr cs:[x_move],0
    % P5 x/ z+ b$ F0 P7 o: i
  327.         mov     word ptr cs:[y_move],0
    7 z7 t: m6 E1 s* y& K  y3 p8 c
  328.         mov     bl,byte ptr cs:[buttons]; k$ Z- \1 z: q! a# h  m
  329.         xor     bh,bh
    1 a- @; ]5 O4 P! Z  E
  330.         call    dword ptr cs:[user_subroutine]
    # `" |  W2 f9 i- {; N4 B
  331.         db      61h
    % M+ Z0 `9 }0 s# g8 s0 B$ Q7 {
  332. ret
    3 q1 Y" ^$ X1 Z2 `# F
  333. new_isr:
    6 X% H2 @5 M& n* Y. H8 U  [+ ~3 Q
  334.         pushf( C6 J3 s- |7 q1 W" _6 v
  335.         cli
    7 O( x1 ?% N$ w% u6 D
  336.         push    ax& a7 w& j8 I3 I
  337.         push    bx; T8 L. ?; N+ e# ]% Y
  338.         push    cx" Z. t6 ^, y" V3 \) _% U0 r
  339.         push    dx$ c- x! \, h" m. C  o
  340.         push    di( q. N. H3 L" p' q5 v) m9 I( G8 x5 E
  341.         push    si/ f% N/ ^9 G% m7 D0 E8 L$ Z
  342.         push    es
    & M) w0 q6 ^& O& s3 Z1 X
  343.         push    ds
    $ o5 _# e5 L, T6 u* E( a3 V

  344. , Q) d  Z, y! s5 F/ ^! w
  345.         push    cs, e; t3 L# |8 b# y4 F
  346.         pop     ds
    * a7 a& S0 Z2 f' a6 k# u! H: V
  347.   d& b( o. n& m! m4 j
  348.         mov     bl,0adh
    $ q/ s+ H! H5 _1 D: N( \( V
  349.         call    keyboard_cmd
    " n4 i+ d4 o5 Z
  350. - e) x7 u& m7 p2 I0 t3 E2 [
  351.         cmp     byte ptr [first_time],0
    & e7 \6 D# N  \9 a& D$ f
  352.         je      not_first_time
    9 e4 s0 b. X/ K. V

  353. ) G3 a* d6 K! K: h) b. s
  354.         mov     byte ptr [first_time],0. h: E+ F9 X" Q" l: q
  355.         call    keyboard_read& L2 [& ~% j! X1 d. Y
  356.         call    keyboard_read
    0 |1 ~1 n  f$ ]0 z7 k& o" N4 ^7 U7 Q
  357.         call    keyboard_read
    " D# n* P. V) M0 W( k
  358.         jmp     no_show0 l% j! s8 H! V1 ?& y

  359. % }) A. l9 |! q/ D
  360. not_first_time:
    8 P2 B2 L2 C; S- {6 n( }" F  y
  361.         mov     word ptr [temp_mask],0% A, v7 \3 ^8 L. N  [, Q
  362. 8 R5 m  n5 Y4 s1 F4 J
  363.         mov     cx,[pos_x]% U. G! t6 i% j
  364.         mov     dx,[pos_y]
    / Y; M) W1 _' L3 n
  365. . n' m. E6 F) B, s7 B0 y
  366.         call    keyboard_read
    ) a, _& Y: @' H/ u0 }/ }
  367.         and     al,7 ;3
    ; k; D, m( z1 l% b
  368.         mov     ah,[buttons]* u5 z1 a# n' O1 n" w# N
  369.         mov     [buttons],al
    7 v* E' j- K8 ]: g
  370.         cmp     al,ah
    ; {. g  |# c; |2 m9 }
  371.         je      no_button_change; l; y# H6 n2 C( m
  372.         and     al,3
    ; O$ E' Z+ g& O: W8 R7 B* l
  373.         and     ah,3
    - H7 ^7 z9 y; x* u- m, {' I5 Q
  374.         xor     al,ah
    / N4 L  j6 @1 K8 d4 O- ^* q
  375.         xor     bx,bx8 I; x" i& q9 H- i* w$ V; K. E, \5 l3 j

  376. ! \5 {( n, Y$ ]0 `
  377.         push    ax
    7 ~& d- \5 U8 r1 i# H* t! z; B
  378.         test    al,2
    / }5 U  K$ E$ U$ J2 J' f: ?
  379.         jz      no_right_button_change1 e/ L3 [  ?3 J
  380.         and     ah,2& N) o1 D: [  n" ?" F$ T, C! H0 H
  381.         jz      right_button_pressed! i/ |% d: s* K2 o1 J6 w' E
  382.         or      bx,16! j- I& s+ }, l3 A. C- D, K1 E
  383.         jmp     no_right_button_change! a1 y5 k/ B( K  Q4 c4 t8 ]# }; T
  384. right_button_pressed:
    1 S+ o3 @. w9 P+ q1 _; N9 b1 C
  385.         or      bx,8# M) N% T7 f0 e) I# d* p, b& h, c
  386. no_right_button_change:$ G) }2 N) F1 o3 D' w/ }7 ~' z& M

  387. 8 T9 f6 G/ t/ @3 j( Y0 K- t
  388.         pop     ax
    + Q7 C' V9 h: g: t$ S

  389. 8 P, j4 K, N1 W# s2 i1 i, T0 {% F
  390.         test    al,1+ S/ q0 ^6 p) M6 k0 T7 F3 `( R
  391.         jz      no_left_button_change* H! z7 o3 ~0 U7 G% N
  392.         and     ah,1
    + Y4 \1 A8 b* ?" v' ?! b$ t: `
  393.         jz      left_button_pressed7 d, W. }5 y  d8 T9 U' V; \) e$ q) {
  394.         or      bx,42 r$ n" m& o9 Z4 ]
  395.         jmp     no_left_button_change
    3 V, Y+ x  R: R$ e$ Y% b+ W- v
  396. left_button_pressed:" b$ ^% O2 u# X: }  n
  397.         or      bx,2; u. A( W: d% }9 ]5 Q
  398. no_left_button_change:8 N, S  Q5 c7 ]& _& G3 n0 q* V1 ]4 G
  399. & W- j% Q1 l- J" d$ T
  400.         mov     [temp_mask],bx
    : K6 ]( K0 c: u4 x$ `. v
  401. # m' `$ M- j) _& f
  402. no_button_change:4 O4 t: |6 d  F( e
  403.         call    keyboard_read
    / q$ a7 }7 d# n: L0 @2 O2 m
  404.         cbw
    - i: Y4 x: c9 k5 B) N% k8 ^7 |8 _+ o
  405.         add     [pos_x],ax
    0 u$ w4 v) {8 }/ e
  406.         add     [x_move],ax
    / {( O1 V( x7 ]- k
  407.         mov     ax,[x_min]
    : y$ ]: T! h2 q. n
  408.         cmp     [pos_x],ax4 v2 Z/ }# L, D. R0 P' o# c
  409.         jg      good_hor1
    % I+ ^4 c, Q  p# u$ N
  410.         mov     [pos_x],ax: k4 f* A7 Y2 ?
  411. good_hor1:
    ! B, K4 h* [& e" |. s
  412.         mov     ax,[x_max]
    1 e* e  {. g8 e" T- U
  413.         cmp     [pos_x],ax# \$ b/ l4 v  K$ T$ w
  414.         jle     good_hor27 {% Y- s' M3 Z) B
  415.         mov     [pos_x],ax7 M$ O1 @0 \4 S" ^+ A' w
  416. good_hor2:# Z: `! `) L3 c7 x/ A% E7 Z
  417. & a( [8 A- _; _, m. T5 Q" u
  418.         call    keyboard_read
    3 O5 W) T$ s7 Q1 B+ H: R
  419.         neg     al5 w- ]3 c- h, V8 w+ s
  420.         cbw
    1 m8 |% {9 H7 O. M1 r# v
  421.         add     [pos_y],ax
    5 `: p3 g1 x- _  {( K6 G
  422.         add     [y_move],ax8 R/ D6 ?0 y1 r) e7 g; G' b( T% i$ d; H
  423.         mov     ax,[y_min]
    3 y/ x% V7 ~) {, w
  424.         cmp     [pos_y],ax, n, E+ j% {  R1 Z1 E/ [; _) F; S
  425.         jg      good_ver18 @5 e: ]- i+ W4 l7 m2 u* J. T
  426.         mov     [pos_y],ax
    1 @, G6 A) h+ U5 m1 U7 ]
  427. good_ver1:9 L9 f% Z$ a- o+ g* G9 Q4 U6 e
  428.         mov     ax,[y_max]4 I# f. V4 r1 C' Z
  429.         cmp     [pos_y],ax
    / ]! A! s, @9 {; [" ?& O! m
  430.         jle     good_ver26 l7 b! Q, L* {
  431.         mov     [pos_y],ax# [+ h% A, f6 X( `1 |
  432. good_ver2:4 v! d5 t1 K+ D- e* u) u

  433. 0 Z  h. T# r: Z+ R
  434.         mov     ax,[x_move]9 D: P' ?7 g, X. Q  h8 t
  435.         or      ax,[y_move]
    ) R  n$ V) T3 _
  436.         or      ax,ax
    - k4 ?6 Z- N7 ^! I! q
  437.         jz      no_change_position, \3 e2 t7 V$ e! a: ~3 k3 ]% c1 [
  438.         or      word ptr [temp_mask],1
    % R$ A) X) q5 w! m
  439. no_change_position:$ K1 \) l5 ^* R6 O% b9 e1 z; e; ^8 F! t* _
  440. $ ~4 q( |" u: b+ n: L3 M- F
  441.         mov     ax,[temp_mask]* x- I5 Y! |5 e( j' p6 l
  442.         and     ax,[user_mask]
    + [) x3 s; \( S  F! K" E
  443.         jz      no_call_user/ f5 {9 u+ j  u' c+ ?$ d8 c
  444.         call    call_user_isr
    - s, G8 J, \: M: S% D
  445. no_call_user:
    ! A/ X2 R4 @2 W( T; p' g% J% P& d3 L
  446. 1 Q8 H7 H2 ?8 Q0 P9 B" H
  447.         cmp     byte ptr [sm_flag],15 P  X7 l3 l2 f+ A0 Q- N, b
  448.         jne     no_show
    ! z- I; d0 T' }7 l

  449. 5 w' O* Q: u, b3 |0 ^
  450.         shr     cx,3
    0 U; j8 o. v$ o2 u3 {* q' k
  451.         shr     dx,3& t' w2 `. ~2 j* g* Y- b6 F
  452.         mov     ax,80( k  I2 Q9 Y. i' X$ O4 X: Y! c0 P2 U: N
  453.         mul     dl
    . y/ f, n) e; s% L1 B
  454.         add     ax,cx
    / u2 A: M% p4 b% z
  455.         shl     ax,1
    ; U& ]# e9 f" K
  456.         mov     di,ax9 i) z5 M$ ?6 O, A9 X" c# ]
  457.         mov     ax,0b800h8 T, f) \( X" U
  458.         mov     es,ax# y& e: ]3 k: f% x: C! E, [
  459.         mov     ax,[save_char]
    3 _% a: e5 E2 O2 E7 N
  460.         stosw
    3 J4 _# I, I9 w6 h# D( U1 z
  461. 7 C2 w* b3 T8 z; a5 J' p
  462.         mov     cx,[pos_x]
    3 C. c& D2 p2 U
  463.         mov     dx,[pos_y]
    ' J  Q( [/ `$ e  g7 k
  464.         shr     cx,3$ h' q5 \/ ]3 F* P2 A% s
  465.         shr     dx,3
    9 H1 K, l( b& H
  466.         mov     ax,80, @0 ~1 g$ p' x1 _
  467.         mul     dl$ C: `' \" A% N5 B/ H/ I: D: }0 e
  468.         add     ax,cx
    0 Q1 T5 Z- Z7 x3 w# K8 X7 \
  469.         shl     ax,1  l% Y7 h' L( I4 _/ A
  470.         mov     di,ax
    2 D! V! c# h: _4 K# h5 I* z1 S2 T
  471.         mov     ax,0b800h
    ; G9 p3 b( |3 K# C
  472.         mov     es,ax5 J5 F  g# H- U3 V: a! I
  473.         mov     ax,es:[di]4 n' v( w# C) t- f  N- ?; D
  474.         mov     [save_char],ax0 Z, }3 L3 G3 N  u4 r
  475.         not     ah) _! `: a5 C  ~( E. B5 v
  476.         and     ah,7fh
    ! U+ Z. g: |- D2 g+ L- z
  477.         stosw
    : Y8 g8 p, G0 s: n" p8 ?. D1 D2 K
  478. no_show:  v0 |% c4 k/ U- J8 s5 u
  479.         mov     bl,0aeh
    3 \! u2 e) r2 q6 @+ d2 z0 V' O
  480.         call    keyboard_cmd3 l4 S4 U+ b5 R, C1 Q
  481. 5 H" p& W7 B- b" c! X" @
  482.         mov     al,20h
    % |6 P& T$ ?- o0 X. F
  483.         out     0a0h,al
    . n6 L& G- ~  z* O) ?! c
  484.         out     20h,al% y4 {/ U$ v' _0 i; \( w8 S
  485. 5 R9 `: a& w. i& q8 J# c
  486.         pop     ds
    " S1 A4 T, ]* U) k+ u6 s5 ~
  487.         pop     es
    : B# p+ T5 R: D+ U
  488.         pop     si6 L+ h! o: \9 Z" O/ l2 Y
  489.         pop     di
    4 z8 y$ Z& b2 o' S
  490.         pop     dx6 w5 G* T' e  |* N
  491.         pop     cx
    * H4 k  O5 ~" t
  492.         pop     bx  l& G# `5 [" g
  493.         pop     ax
    3 ^, s% c6 h5 W# h
  494.         popf
    5 G' L% v' i' y4 W: l( N
  495.         iret& d# |4 P% X- U; o8 M: z

  496. " B2 m& t3 q$ j1 X# F
  497. first_time      db      1% r* S/ O' `! c$ j& j
  498. buttons         db      06 u; B( J7 G: T5 U7 q! Y$ e4 `
  499. pos_x           dw      0
    7 \$ p6 Y& D3 {3 E: x& ^6 A
  500. pos_y           dw      0( P/ _6 S, W/ D$ L4 f/ M7 ~8 w
  501. sm_flag         dw      0  o2 `4 y) ?, e0 L/ [% S) I
  502. save_char       dw      0
    / u9 m" E- U" G$ L: F- t* }
  503. x_move          dw      0! ]6 l( X$ N# Z' F
  504. y_move          dw      0/ P) q& L7 H' U& z# R3 h5 ?3 h
  505. x_max           dw      639
    7 u! u5 n5 p/ u2 i
  506. x_min           dw      0
    * p- l8 F5 v, d+ l
  507. y_max           dw      199
    % @; g( ^0 O* D0 _8 P! ]! s
  508. y_min           dw      0
    ' P" R/ I+ X5 c! a
  509. user_subroutine dw      0,0
    ' F4 y* i+ o! Q7 v# ^2 O
  510. user_mask       dw      0, j) ?2 ~5 f) `: e( u/ p
  511. temp_mask       dw      00 R6 H6 p0 J- V, @& ~3 m

  512. & P& B" A5 E; @: {/ C
  513. keyboard_read:
    - q5 [! }3 N2 f! r) y0 J4 ?- |
  514.         push    cx
    8 U9 I/ ^' r$ U! m: l' I) t" G% b
  515.         push    dx
    ; A* C& R! L5 m
  516.         xor     cx,cx
    6 y0 \: H9 N3 G" U! \: m
  517. key_read_loop:' v! r8 I) i3 D. ]7 j
  518.         in      al,64h* J& c- V, v1 l+ K8 [
  519.         jmp     $+27 T  _- v% W; f7 v, H  W, I# e  _3 U
  520.         jmp     $+2' F6 [8 J6 I, i! Z; _7 p! D5 g
  521.         test    al,1. W( h- Y: |' p: R
  522.         jnz     key_read_ready. |1 c4 V. `9 Q3 _
  523.         loop    key_read_loop2 j1 a: h$ d! [0 h. L- V
  524.         mov     ah,1
    3 G9 N" S& z( D& |/ a
  525.         jmp     key_read_exit) n% ^( B2 C* y  \+ ]- g1 b' N2 j
  526. key_read_ready:
    ! U: R& a3 D1 p/ Z# o
  527.         push    cx
    9 ]  v; w6 \& \3 x9 u
  528.         mov     cx,32
    ; V9 ?+ t/ I$ _3 f( k: C
  529. key_read_delay:( u/ y5 f$ Q* V/ V+ _* M, R$ n
  530.         jmp     $+2# Z+ V$ y$ J5 Y
  531.         jmp     $+2% D3 e/ }& D, A' ^
  532.         loop    key_read_delay
    4 q8 \9 H: \( S5 `5 `) }) ^
  533. ! l/ ^" {; B8 q. t
  534.         pop     cx6 h! ~" i+ w3 B- G: [: q* d$ X& U

  535. ( t9 w( ?2 O0 ?: X
  536.         in      al,60h
    ; l  w. M7 l2 y7 T8 _+ Y
  537.         jmp     $+2+ S, c- F1 X7 ^0 k) O* F
  538.         jmp     $+2, l# D: H  `, G$ E
  539.         xor     ah,ah
    & h" a, e/ n5 P  e( @
  540. key_read_exit:. h, ~! l* B, o& [# K
  541.         pop     dx
    1 x7 p( F3 v* D
  542.         pop     cx. u. T- R" X) I' I. }, |" b
  543.         ret
      Q5 {+ x) @3 t0 t; l
  544. 5 g4 c" W2 |! P; h* m  o) v
  545. keyboard_write:
    7 q  w- R8 f% B; \3 B7 g
  546.         push    cx' ?7 `% g; C# t; w7 _. M
  547.         push    dx/ L7 \  ]! X+ i! C
  548.         mov     dl,al0 b+ b# L% W( @+ D3 W: S9 z
  549.         xor     cx,cx
    1 b& P% M) M$ c4 G
  550. kbd_wrt_loop1:
    + p$ {  ~+ g9 Y3 b! `. ^  l$ Z
  551.         in      al,64h  \/ e1 a2 n1 M2 K% p$ Q+ h
  552.         jmp     $+2
    6 d  W* Q$ H3 z6 `% O" J
  553.         jmp     $+2! A* n- M- m6 g3 M
  554.         test    al,20h; B2 N! t, _1 J( y7 M" l
  555.         jz      kbd_wrt_ok1
    3 I  v( ?; u+ t; F$ m3 j
  556. ; y/ F# S" i- I6 I$ E
  557.         loop    kbd_wrt_loop1
    9 i2 [7 l0 E2 R' A* n# v

  558. 5 d/ E8 {! v$ B+ }
  559.         mov     ah,1
    / q+ N( l; P* v* r. a9 z
  560.         jmp     kbd_wrt_exit7 h, O6 A4 Y  w" C
  561. 7 D! j1 Q: _9 ~2 V5 y5 ]8 R& x
  562. kbd_wrt_ok1:
    6 g3 t- d8 c  V! ?; b2 z$ ]$ ?  o
  563.         in      al,60h% c  I9 V" G' m

  564. . |7 |4 ?" D' c0 C
  565.         xor     cx,cx
    7 Z5 l# u: r3 N" M9 ~
  566. kbd_wrt_loop:! @) j$ ^' l0 ?1 u: ?/ z' I# v! W
  567.         in      al,64h4 X0 F: L5 g) ^, D! L; _* E
  568.         jmp     $+2
    . k0 `: O" Q1 R5 N
  569.         jmp     $+22 I. H5 i0 v  ~* [% G' r& U8 d
  570.         test    al,2
    8 s, Z$ T0 O: A3 s, ~; M
  571.         jz      kbd_wrt_ok
    ! i5 \+ T( L! u; Q

  572. % k4 @( \/ D1 S/ ~- n4 L1 z5 G
  573.         loop    kbd_wrt_loop0 L+ m2 |9 z1 t% |
  574. ( D0 f* U" X% e# l  L$ V
  575.         mov     ah,1  v" A5 _8 b9 q3 x" C; j
  576.         jmp     kbd_wrt_exit
    5 h3 T. t5 F2 `; c

  577. ( {% R" O' ^) E3 S1 i: y7 U
  578. kbd_wrt_ok:
    4 V/ g2 t* Q- Z; r2 B' R
  579.         mov     al,dl9 L- y0 q. r. t, `! F
  580.         out     60h,al
    0 l1 E% p. U! f; [5 c
  581.         jmp     $+2
    8 Y4 V  p( q6 K- h
  582.         jmp     $+2" f5 ~4 o& C  [0 j
  583. : H, `6 M( F/ Y& V
  584.         xor     cx,cx
    , h( T7 Z- z# p  @9 d, p! p
  585. kbd_wrt_loop3:& T) n0 o  i+ h; x- n8 o; g1 A
  586.         in      al,64h
    & m  f, w: x# U
  587.         jmp     $+2
    8 W2 C2 J& m" c; F2 h9 K
  588.         jmp     $+2
    . U" y4 T9 a4 x4 n3 U2 M
  589.         test    al,2
    : b+ j+ ^+ e# H) I. k2 T
  590.         jz      kbd_wrt_ok38 w# @$ e' C! w1 M) k  X  T

  591. ; S9 o7 O+ d3 x6 H* e9 S8 T4 x7 R# Y
  592.         loop    kbd_wrt_loop38 ^* M1 U# O# X. x0 r& f$ L7 s
  593. ) k  ?! L# n4 _8 j0 [& w) z$ m
  594.         mov     ah,1- c0 N) A3 v. Q+ t, E9 u& m$ D
  595.         jmp     kbd_wrt_exit6 c0 X; K) ?, k5 ]

  596. , h% X3 X# d6 P7 M# S2 h4 Q
  597. kbd_wrt_ok3:
    * p0 p1 \8 l& O) {( ]- F1 F( g
  598.         mov     ah,8
    2 @* E% V- H4 z% p% x. Y
  599. kbd_wrt_loop4:  ^1 X9 v( f: B: }. {
  600.         xor     cx,cx7 F1 O+ y- H4 a5 ?) V# P$ k3 d
  601. kbd_wrt_loop5:$ q; b0 V% k+ w9 n
  602.         in      al,64h% Y5 B6 s, b. \1 U3 ^
  603.         jmp     $+29 A, y; j8 b$ a2 L- T& Q& _
  604.         jmp     $+2
    , J; z- C. N% H9 m
  605.         test    al,1
    $ N. `, s# y1 O2 z, ?
  606.         jnz     kbd_wrt_ok4
    6 k$ T. f4 u, f( V- F% ?* U9 L

  607. + s, p! y: r6 n4 A( E% z0 l
  608.         loop    kbd_wrt_loop5  q) `# B; }! y- m+ z0 v3 w

  609. 7 _1 f' f6 I/ t! D9 d  |/ O
  610.         dec     ah
    " ~7 ]: Q3 Q& `) X7 q7 R
  611.         jnz     kbd_wrt_loop4
    8 \* Z6 F0 \& h$ V) \
  612. / ^! q' [2 O4 Y6 @
  613. kbd_wrt_ok4:2 L; C; i2 I& W  |
  614.         xor     ah,ah
    ; c. o3 h# b% {+ N6 o
  615. kbd_wrt_exit:- C8 q7 p" h# s/ E
  616.         pop     dx
    / D- y# z3 o0 {
  617.         pop     cx' v6 ~5 w5 K. [: C
  618.         ret
    5 M- P, f4 u+ l
  619.         , U5 p  X. I! P; r6 Y: Y9 {
  620. keyboard_cmd:
    + {8 j1 [# i. r7 Y3 x
  621.         xor     cx,cx
    3 I% ]# _" f" x6 A+ e, L* ?
  622. cmd_wait:
    6 I& e' L, F5 k, \( f; h
  623.         in      al,64h3 r/ F9 f) g, n" F% j0 {7 ?
  624.         jmp     $+2& p( O+ h/ X% G5 H7 L
  625.         jmp     $+2
    # ?% E3 Y+ e, r+ [/ e! C
  626.         test    al,2
    $ n. {9 z( j  ]( v! {+ Q3 _
  627.         jz      cmd_send
    7 I" M+ O9 l# u% G
  628.         loop    cmd_wait2 w' @5 \9 O( U; J

  629. / `8 A* ^, B3 E1 s, [
  630.         jmp     cmd_error
    2 U5 q  v. e7 R. ~! j% u4 D

  631. , k4 ?/ G% `1 G; U8 G  C2 S
  632. cmd_send:! C3 |1 H+ x. ?+ w& S# U  r
  633.         mov     al,bl' B$ H2 J- c% t% m1 \9 V
  634.         out     64h,al
    5 {6 R9 n$ A9 h
  635.         jmp     $+2
    2 K2 x' l1 {; {9 n) j
  636.         jmp     $+28 a) ^+ T/ w6 k' H) b

  637.   d& I0 X: a, ~
  638.         xor     cx,cx
    0 m# u, V+ L+ y6 h& h8 E
  639. cmd_accept:
    & Y' A( g2 M+ h' C2 P7 O
  640.         in      al,64h
    % e# S6 G5 I& T
  641.         jmp     $+22 ]2 P7 w7 {5 [# e6 `- p7 I* D5 ~
  642.         jmp     $+27 y: \9 X6 o! m6 d' m
  643.         test    al,2) V: ~( r( s/ k) }* o0 D4 L$ j) }
  644.         jz      cmd_ok( H0 Y4 }+ d0 r0 C, `! z
  645.         loop    cmd_accept% B& v! w( ?2 Z& N* a1 b$ d7 R  V
  646. 8 ?! w$ L, ]. o7 v6 _& T3 _
  647. cmd_error:
    9 V& U- V3 ^; v
  648.         mov     ah,1
    0 j7 ~# O9 u( P/ E$ c3 }: g
  649.         jmp     cmd_exit$ Y0 |( C4 V- B
  650. cmd_ok:
    / ~4 {7 k# Z7 r
  651.         xor     ah,ah9 V. U$ m3 h- i0 P% g, p
  652. cmd_exit:! c+ p& Z* e6 _" N5 B
  653.         ret
    0 \- W* ^8 H" d

  654. . A2 C# K/ d1 J" K
  655. new_33:, R( p/ L' A; Y; t$ p" D
  656.         cli
    ! S. [6 I' E1 L  A" }" J: I7 m7 P
  657.         cmp     al,0
    & v: I8 B# G9 x  A# i8 P. N
  658.         je      reset_mouse
    " |+ e( `/ O9 _8 R& C
  659.         cmp     al,14 m2 T/ H$ G1 I. x: J0 ~  u
  660.         je      show_mouse1 {- {' q/ h3 R2 ^+ D1 w0 D
  661.         cmp     al,2
    . t0 P6 S% F' {+ w  V2 L
  662.         je      hide_mouse
    6 K2 ?5 J# C) @% k' ]" ~0 d: n4 v
  663.         cmp     al,3" F5 Z9 j& g+ Q
  664.         je      get_pos
    , u/ S" p) I: e8 i2 B+ Y
  665.         cmp     al,4+ v5 q" s# a5 j+ y- u/ j
  666.         je      set_pos0 t' @% F, Z- B- _; O) r
  667.         cmp     al,7& `/ R2 b& F. {% {. ?
  668.         je      set_hor_pos
    2 ~# y* m/ R1 X. l! i' n+ d0 c
  669.         cmp     al,8- }8 w  |+ Q) W9 j
  670.         je      set_ver_pos
    4 T, `% T. Z8 |  I6 Z9 M/ k
  671.         cmp     al,0bh2 Z- u) R  L. B) n+ t( f
  672.         je      get_mouse_movement# Z5 D1 a: ~! |: B& A6 _* e5 |0 Q, l; d
  673.         cmp     al,0ch
    2 y: `2 W  V) H. u  p7 s/ a
  674.         je      set_subroutines( b) x0 L5 S" x& `/ q1 \3 M( Z. J  W" I
  675.         cmp     al,14h
    7 U  t& F* G5 P2 }6 G
  676.         je      swap_subroutines; O/ F5 ?/ y  M* |
  677.         iret5 N8 k* Y) q. P
  678. 2 {( W6 s/ ?* w- c7 z1 D- u' N$ w
  679. reset_mouse:- ~- P+ _* r& i% \6 q& H
  680.         jmp     _reset_mouse
    3 j6 x  s# B8 a4 n0 G
  681. show_mouse:) ~0 w1 G6 B! T) O4 z  n
  682.         jmp     _show_mouse
    , m8 s; r3 V% c$ \( q+ L  @
  683. hide_mouse:6 k( l. V& y* x5 o9 d( X! B* i
  684.         jmp     _hide_mouse& Q0 Y& v4 H( v' x2 o, L/ n4 D
  685. get_pos:
    : n% @3 d9 o/ m% Q" H! t. P4 f6 f
  686.         jmp     _get_pos
    & _" n, S1 {) U; g
  687. set_pos:9 y$ ^5 W& U: m
  688.         jmp     _set_pos
    ) y% q7 {# c2 G8 k; f
  689. set_hor_pos:& l5 M- \) B0 t  k8 _( e
  690.         jmp     _set_hor_pos3 H4 |0 i- R6 a- u+ u; {
  691. set_ver_pos:6 \8 ^$ I  A" t! N9 y9 ]' U' `/ J1 {
  692.         jmp     _set_ver_pos; |8 ^1 r5 R9 q' A( }% J7 l
  693. get_mouse_movement:
      h* O0 J% F7 O
  694.         jmp     _get_mouse_movement
    ; Z9 J1 J$ U8 u! Y) I
  695. set_subroutines:
    , @, Y; X( w! x' x  c0 s! v: w
  696.         jmp     _set_subroutines
    ; \. t' D( O, l
  697. swap_subroutines:; i/ u; |/ L4 z7 `8 y
  698.         jmp     _swap_subroutines
    ! V0 [! n+ L, e8 C8 `; U
  699.   g$ |0 i& L" L5 I! H
  700. _reset_mouse:* q" b; ~3 W7 x1 Y3 U
  701.         mov     byte ptr cs:[buttons],0
    7 b. U: S' r! i+ w
  702.         mov     word ptr cs:[pos_x],0
    0 z3 s  d# u: }5 H1 t, m
  703.         mov     word ptr cs:[pos_y],0( l7 w' {; A8 x; w- {5 X
  704.         mov     word ptr cs:[x_move],0
    $ K" ~# u5 ~' D( t# U' P3 e
  705.         mov     word ptr cs:[y_move],0, ^' n& V0 }% G. w& r, k$ D
  706.         mov     word ptr cs:[x_max],6392 n3 W3 P2 w; @: {) a
  707.         mov     word ptr cs:[x_min],0' u* k$ I6 }8 h; D' F* k2 C0 A
  708.         mov     word ptr cs:[y_max],199
    + R- t# T9 l- l/ X, o2 a- [% @
  709.         mov     word ptr cs:[y_min],0
    0 B6 f" L! \! o* V) E
  710.         mov     word ptr cs:[user_mask],0# L0 y1 G" D+ X3 b9 [$ d
  711.         mov     word ptr cs:[user_subroutine],0' e) c* F, I% V) M' o+ {8 t7 U% J: b
  712.         mov     word ptr cs:[user_subroutine+2],0
    0 V4 @: Q. y% \0 v: `2 p+ S# E, l
  713.         mov     ax,0ffffh
    : m% B3 W( k2 l3 q# R8 i- i3 X5 S
  714.         mov     bx,3
    7 {6 B5 e# F$ k" n8 c
  715.         iret* p' r7 k& w1 K# W
  716. / i" f% z8 N3 k. V+ F& E
  717. _get_pos:
    # W0 \* `- s3 s9 b
  718.         mov     cx,cs:[pos_x]
    $ p8 u/ \+ j2 B7 c+ F
  719.         mov     dx,cs:[pos_y]+ N, Y1 |+ t& `
  720.         mov     bx,word ptr cs:[buttons]' r. L$ F$ g1 Z% U4 h* B
  721.         xor     bh,bh  E8 v7 ^0 B3 n1 {
  722.         iret6 z* R* `2 ^# x3 D( z
  723. ' A& g7 r# r* x. l/ f) v1 D
  724. _get_mouse_movement:
    1 s, o* M* k( R% t0 C8 a# ^/ T4 V9 v
  725.         mov     cx,cs:[x_move]7 L6 ~. i: p. n% |& M. W
  726.         mov     dx,cs:[y_move]. ~+ B/ K: J; Y1 u& a$ R
  727.         mov     word ptr cs:[x_move],0* F( A, h6 G4 o6 A" O
  728.         mov     word ptr cs:[y_move],0
    3 L$ f2 i5 ?+ H
  729.         iret
    : \8 A/ p9 d% Q6 S9 {3 V8 `4 O. m

  730. 4 P# t6 h' h6 i; h
  731. _show_mouse:4 N0 c1 F) W7 a9 y$ [% U: L. c, I0 d" p
  732.         push    ax& a6 h, }& Y; N% u( }; v5 g+ G
  733.         push    bx: i. @9 q! O8 B2 t! a3 d
  734.         push    di% t8 I6 }0 ?1 Y9 P  H2 \% A
  735.         push    es* m% h0 x" Z/ h; u% T
  736.         mov     byte ptr cs:[sm_flag],1
    . p. i, L/ N. D2 Y
  737.         mov     ax,cs:[pos_y]2 m+ w5 U9 k. }/ k. ^
  738.         shr     ax,3
    $ Q, [( y9 M, ^6 I! H" {% P
  739.         mov     bl,80# N4 i$ ]( H6 p* N1 [* B, l
  740.         mul     bl4 e" }% E% ~! k4 x  |2 H
  741.         mov     bx,[pos_x]
    % T& ]( t2 G: ~& O
  742.         shr     bx,3$ t  h# J; }( ^
  743.         add     ax,bx
    . r( q& S/ I  q) E' s2 @9 G6 }
  744.         shl     ax,10 O% R" ]5 Y7 V$ m) M$ b; x
  745.         mov     di,ax2 H1 F) Z' F2 a. ]
  746.         mov     ax,0b800h$ e  i* m  D+ X  A) o  d
  747.         mov     es,ax
    , y8 X: d6 X0 Q# z0 X) Q. m
  748.         mov     ax,es:[di]
    $ |0 T' Z0 V- V1 N0 W: i
  749.         mov     cs:[save_char],ax
    $ O: c' {! T& ~0 X1 Z$ x
  750.         not     ah/ K% F1 H+ r( l. @  e# \
  751.         and     ah,7fh
    1 D2 J1 j3 J3 Z
  752.         mov     es:[di],ax
    * ?8 |3 t: ?& c4 Z0 P+ t) @
  753.         pop     es1 f3 W- e' O& G; R1 z# k
  754.         pop     di: `; J3 R0 k% Y; T  `. o
  755.         pop     bx
    : V5 b7 H- a8 @+ Z- a8 y
  756.         pop     ax0 T' b* j2 I5 |3 s
  757.         iret
    ; W7 D! T* V' ?( J: Q) b
  758. # _, @  u- `3 T* c4 r( M
  759. _hide_mouse:! x& |( p1 x# W! y, a
  760.         push    ax
    : z- X$ S9 S' }
  761.         push    bx: b" y7 H  w! @" x" t8 @
  762.         push    di2 w" D8 w  Z- K6 Y. d4 s
  763.         push    es
    - H/ `" ~: \) P: M" S
  764.         mov     byte ptr cs:[sm_flag],0& |  r+ b/ t, U# x7 A! x$ o
  765.         mov     ax,cs:[pos_y]/ B; k* @2 T8 D# T5 H5 w
  766.         shr     ax,3
    8 [( a$ v# i2 M7 T/ j$ Q- R
  767.         mov     bl,80& T( i" X+ H" b' N
  768.         mul     bl
      ]* `; V$ F- H, x( d1 W/ g. Z1 Q  ~  h
  769.         mov     bx,[pos_x]+ C7 r/ B' m7 ^1 z0 P8 \0 {
  770.         shr     bx,3
    ) L7 W; D+ u+ \8 z; {' b
  771.         add     ax,bx* i: F" M' M# |1 h
  772.         shl     ax,17 q! D" `1 c+ f2 U# u" g
  773.         mov     di,ax+ n+ W; M: B9 G( c, C+ `& A
  774.         mov     ax,0b800h
    4 r: r# K  i) b$ f  ~8 {
  775.         mov     es,ax+ ?5 q+ ]0 r* Y
  776.         mov     ax,cs:[save_char]
    ( }' c+ Q# }. [% W* i8 C
  777.         mov     es:[di],ax0 m) f* P5 S4 h& Y2 \: M% x, }+ ?
  778.         pop     es
    . m, z5 ~3 X0 {: i/ L
  779.         pop     di2 S4 u1 h2 D- t' X& J
  780.         pop     bx
    7 A! `6 t: O3 E* W2 }* f( q! Q7 W+ t
  781.         pop     ax
    " ^9 Q- }" n" O+ }
  782.         iret
    8 \0 n) O4 R, I& @5 X0 _
  783. * o$ P; Y" E, e+ h* i
  784. _set_pos:
    % W+ N; F$ N" L
  785.         mov     cx,cs:[pos_x]
    6 ~0 o& r4 f  b" o9 E
  786.         mov     dx,cs:[pos_y]# I9 n4 B# y" b+ ?
  787.         mov     word ptr cs:[x_move],0: ^% ~3 L& R8 I( q* d
  788.         mov     word ptr cs:[y_move],08 S3 m. O: c+ u8 g% h. F, {
  789.         iret! j% ?/ x* T6 A/ A8 H0 R" i7 ]
  790. ! I$ q' B: P$ N" T% R
  791. _set_hor_pos:
    0 L) o$ ]& b$ a4 L
  792.         call    max_min* T4 S+ M* ~) u3 {# x
  793.         mov     cs:[x_min],cx6 h5 ]) p" N4 b, I& r. U2 T, Y
  794.         mov     cs:[x_max],dx$ M  Z/ O: W; W) A
  795.         cmp     cs:[pos_x],cx
    & ^% R# m1 c1 C: e$ |, t  K
  796.         jge     good_hor_min
    5 L. F3 C& \# R1 B: s  j
  797.         mov     cs:[pos_x],cx
    % T  e+ U  g3 W4 f( `$ z6 T* ~
  798. good_hor_min:2 [! e# u' [; j3 E
  799.         cmp     cs:[pos_x],dx
    6 V% U( ], [& G: O" A$ Q8 t  o
  800.         jle     good_hor_max
    - v. P' l* X! J
  801.         mov     cs:[pos_x],dx
    , `2 d; \$ s5 R+ S5 e, ]2 u
  802. good_hor_max:3 F' Z5 @  I& [: t7 \' a6 ~( K
  803.        iret
    8 V% _  h* H" T) G, |( z
  804. 6 J. b& }6 y8 G8 E% E/ H
  805. _set_ver_pos:4 a2 A) M! y; S! X* f3 b$ }+ W
  806.         call    max_min
    . l& b9 G4 _" Z/ c' a2 r# |/ b
  807.         mov     cs:[y_min],cx7 K; n; {, y( _% M- s) x# b4 p
  808.         mov     cs:[y_max],dx
    $ E9 r4 ?  t. O- c9 n
  809.         cmp     cs:[pos_y],cx
    ; W7 C1 j0 D+ B% H8 T
  810.         jge     good_ver_min
    ' {2 V, i' p6 L6 w4 W+ a
  811.         mov     cs:[pos_y],cx8 s1 M, F5 |2 G1 T2 |6 U& l
  812. good_ver_min:) B) p  u$ x7 t* T( c
  813.         cmp     cs:[pos_y],dx
    6 o0 r8 U0 b* {  |4 E% k
  814.         jle     good_ver_max
    + g1 x' V7 t: Z2 j( _
  815.         mov     cs:[pos_y],dx
    1 M' X, o0 f9 u  x3 U  y/ }7 Y$ ^  \" N
  816. good_ver_max:
    % |: x3 L. a0 b5 ~0 }/ G
  817.         iret6 |/ @$ W) y4 }# O8 g/ s/ g( L6 A
  818. + W, p. a: \) ^
  819. max_min:
    $ C8 b1 X" ~2 h* C$ U
  820.         cmp     cx,dx
    ( _9 ?# {2 t1 Q: Z# Q3 N8 N
  821.         jle     no_swap+ h. r" z5 w# {1 X8 q$ x8 r% |
  822.         xchg    cx,dx
    ! D, |% @6 h6 G1 y$ R2 ?( @7 E% P
  823. no_swap:
    ! Q+ z" k- T2 K3 i. p9 p
  824.         ret" h4 j0 n+ S' J) x$ E7 c

  825. % T- ?! r# e5 \" w: J7 D. k! Z0 o
  826. _set_subroutines:5 Q+ O  l! L1 I$ j/ s
  827.         mov     cs:[user_subroutine],dx
    ) u, k0 ^; _' Y: [  x6 t
  828.         mov     cs:[user_subroutine+2],es7 ~' i3 i# R) ^
  829.         mov     cs:[user_mask],cx1 y0 e% Q3 }+ W* U( _
  830.         iret+ d) R! Z3 P& t- x  @' }
  831. % k4 g$ d( T7 k  {# |
  832. _swap_subroutines:
    : f% U/ o4 D# C! z, z: b
  833.         push    word ptr cs:[user_mask]
    , Y3 m8 x" `7 h. Y
  834.         push    word ptr cs:[user_subroutine+2]
    2 Q3 _( ^8 L2 o" X( O4 q
  835.         push    word ptr cs:[user_subroutine]# d* G# F# B0 E2 K- Y# z: Z
  836.         mov     cs:[user_subroutine],dx
    ( P, r; m* A& j3 P8 E' `. T
  837.         mov     cs:[user_subroutine+2],es5 _' f0 x* |# d  E
  838.         mov     cs:[user_mask],cx2 ]" {, ^& h$ e
  839.         pop     dx; l/ H0 y  D* ^. K4 |
  840.         pop     es; a" ?% `* }' K( W
  841.         pop     cx7 o, x/ {: O  d9 u) [* F2 n
  842.         iret% o7 r$ t! X* l- p) m/ w

  843. * W, N2 v) [- e% E/ t) T- ^9 ~* h
  844. memmouse        endp" u* B. y5 Y5 D% N; k5 F% e

  845. # J% y  a4 `" |* P- x
  846. endof_start:
    4 n2 E! U- n2 u, f7 u$ s

  847. ! l+ v: A7 o5 E8 [* V
  848. emsg db 'No mouse driver install error!$'
    7 H, \% l  O0 A- h0 {5 m( f# ^
  849. old331 dw 0
    ( b0 e2 u, H6 n
  850. old332 dw 0
    6 G- \! s7 E3 N9 S9 S5 [4 h) M
  851. old741 dw 0! {7 S) s! m; G, J4 y
  852. old742 dw 0
    8 H, M, N# ~4 f7 \/ a- y7 h
  853. memcopy db 0
    + n& I: A  B+ X& }- O3 y5 F
  854. okcheck db 0
    . z% d% p; y3 s7 n+ @$ Q
  855. pass db 0
    $ O7 k6 i1 b- E2 n3 ?0 ]
  856. chkl db 0$ e  `* b0 j) {
  857. lk db 0
    0 G9 j- @7 |# h$ P/ k" }
  858. chkr db 0
    . N1 D3 Q2 ^- Q
  859. rk db 0
    ' Y6 W" T2 r. ^1 M
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
      q' c7 n: j8 G. B
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    2 _, y2 G" n8 y7 F! ]
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    & B. f: w  G. Q( n8 q
  863. db '                                                                                '
    3 g* u1 }& q. ^. B1 E' G
  864. db '                                赏屯屯簧屯屯突                                  '
    3 Z# g  \7 X* {9 B# i' [; H
  865.         db      '                                ?OFF汉OFF?                                 '4 b& O; m# p+ `& o
  866. db      '                                韧屯屯既屯屯图                                  '
    8 O. t. {- ~9 W) A
  867. db '                                                                                '
    8 I. e& A3 I7 L: d3 G; b5 q# H- T
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '2 f1 Y  T5 P" _) N
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    . _7 [8 w; V3 E( M! r" g  p& ^
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    7 N" P1 g- F0 @- O9 r; Q1 I

  871. . q  }5 h# u( |' ^
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!0 H$ I! g6 p* o$ l6 g
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
& A  n+ I  l/ F: M7 e
) Z, K' @5 y$ k( ^+ J谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 05:19 , Processed in 0.153585 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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