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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。% C; X8 n" x! U# H4 ~& l

/ Q; U. s! W# L  D7 A/ v: k, ~代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ; W( _# P0 V: A
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9( f/ ], n  S' j1 \0 A" L3 ?
  3. ;                                         By Bini.Yi 易祝兵: Y' M+ T0 z# f4 H8 L* t
  4. ;                                         http://www.ufoit.com 计匠网+ y2 |+ @: i1 L$ j7 \: ?
  5. ;                                         2002/04/06 YYYY/MM/DD
    + K0 N3 M/ \" ]; h: {( ?' {7 m
  6. ;
    0 S7 |+ A! Q1 ^, @& b% i
  7. ;         
    2 U8 j- Z# S+ ]! W7 ?
  8. ;          This program  test the mouse button  click and move.% B% V; k* y3 M; l* z
  9. ;: f$ x" m/ ~! ], n6 b! K" N
  10. . k. x8 K2 j/ M9 z) k
  11. .model tiny3 F% z# A3 r; P2 T0 j1 M
  12. .5860 v+ n7 D# o) v$ H9 }0 @6 t
  13. .code
    0 p" z4 M) o  U- `
  14. .stack  100h
    ; z4 {5 l* k6 j% G6 \6 [" @
  15. .startup/ e& p) a* ]8 j
  16. pusha
    2 E  A5 l9 v3 y: d  T
  17. mov ax, 3533h
    9 v7 \9 T. E; R0 g! d
  18. int 21h+ X/ I2 \% _; l0 E
  19. mov word ptr cs:[old331],es
    ' o8 l/ o$ j+ _- m: W' ^* o
  20. mov word ptr cs:[old332],bx( t+ V  K* n4 `* f+ w7 J: B, e# z
  21. mov ax, 3574h
    ! G' N! N4 T1 ~- W3 z8 s* O5 f
  22. int 21h; i) B' q$ N8 M" g- z/ X: |3 e
  23. mov word ptr cs:[old741],es* E+ y9 Q0 X1 Y$ e9 s/ U
  24. mov word ptr cs:[old742],bx3 ]5 x  }/ e& z
  25. popa, V# _3 B! ~; [# @4 p- n# A
  26.         call    memmouse6 I/ j- r# y4 o+ n7 ~/ ^
  27.         mov ah, 00
    " a6 i0 ]* r, `* o3 X3 E& p7 Y
  28. mov al, 03- c; i8 U/ K& {4 o3 x  g( j
  29. int 10h0 J7 x, J8 B% X' }
  30. mov ah, 06" S; O$ z* y, `7 ^5 t
  31. mov al, 08 I: D0 a9 q9 [3 s2 O
  32. mov cx, 0
    . V8 H- {- l" c
  33. mov dh, 24- g1 s& P* ?) l
  34. mov dl, 79
    % e, ^6 T( N0 i: T
  35. mov bh, 07h& w0 u* e' H! D% c1 R# C
  36. int 10h
    0 i- J% o% L- L, ~# i! x
  37. mov ax, 0000, \7 K+ U( @) ?7 b
  38. mov bx, 0002
    4 I/ |- @5 q8 f& L
  39. int 33h1 m' P; v8 {/ Y/ w: g
  40.         cmp     ax, 0000           ;if no mouse drive install+ `3 v$ W& e% O
  41.         je      errormsg           ;show error MSG! C' ]: p* x, t. {6 x
  42. mov ah, 02
    $ J0 @4 {# u) e6 ?
  43. mov bh, 00
    9 m  K* D* W3 j
  44.         mov     dh, 25             ;Move point out screen- F2 ?$ E; U6 V
  45. mov dl, 79" q" W' r- F- ?0 Y. q& L  ^* N- z8 f
  46. int 10h
    8 H& T1 O2 W0 T% ?
  47.         call    showmsg            ;Show info+ z6 U! u" ~: X* q
  48. mov ax, 0001, |8 h: h0 W4 d' w% V( ^
  49. int 33h3 Z- g9 z2 I( N; s3 w
  50. ; mov ax, 000ah5 q& \& G) D5 a& u& A& [8 @
  51. ; mov bx, 0000. V1 b# h8 ]5 ]; l
  52. ; mov cl, 0h8 Q- S9 b8 f( f/ D7 t/ g
  53. ; mov ch, 0F0h
    & t  }* w2 M- M: H' w# Y
  54. ; mov dl, 0h) e$ W3 l6 t# b. d3 g, p! i+ z
  55. ; mov dh, 0F0h% C1 G6 U, {+ ?
  56. ; int 33h" }. r* O9 B6 b9 M7 Y6 x
  57. mov ax, 0004h9 o- Y0 `4 ^- J+ |6 F3 r
  58. mov cx, 0319. I* E& y4 f. Y1 z) @
  59. mov dx, 0103& w8 G1 H' e2 a# }( X- l
  60. int 33h
    0 t9 m* @5 u- f, H- b; a- n
  61. casemo:                           ;Case button click and point move
    + M1 p( d/ g9 m. p- A8 X. _
  62.         mov     ax, 000bh         ;and keyboard press
      M# C+ ]4 Z( A) F/ j
  63. int 33h3 Y- m$ I! S# n1 z1 V9 N
  64.         cmp     cx, 00h           ;if point move....X
    ! W1 p, z1 l& t) s* A! U
  65. jne xmov
    ; M' `! O3 \3 ~' p
  66.         cmp     dx, 00h           ;if point move....Y
    9 O5 r( s5 `. d. w* _
  67. jne ymov
    " J4 h+ n4 F  K- h8 d! ~. K# v
  68. xymovend:                         ;X.Y move end, t; z# f$ @- P2 W# ^5 f! X: @: p* }
  69.         mov     ax, 0003         
    # x! ^, ?  h2 n+ `; m0 a/ A! T
  70. int 33h
    + Y" {! E& m( }7 O7 }+ L) U
  71.         cmp     bx, 0001          ;if left button click  show ON* t1 r2 q* P6 B5 z. z" G, q! U; u
  72. mov si, 18283 i- }9 k& M4 A1 |
  73. je listl% W' a7 K& m! Y, _
  74. mov si, 1828. J! t" C- f  g6 K# i* N
  75.         jne     nlistl            ;if left no click show OFF
    4 N& O. b% k- x' r3 b9 |
  76. testr:
    ) g6 l& N7 \, o. S2 [9 \
  77.         cmp     bx, 0002          ;if right button click show ON5 @1 r: c6 Y& A
  78. mov si,1842
    ' {+ l: U* F4 B3 s; a  i2 L
  79. je listr) z, B3 Z: z/ ?- a! j5 n- |4 |3 z3 j
  80.         mov     si,1842           ;if right no click show OFF
    3 T. @9 s5 W* \5 j8 D, }( p7 p- _
  81. jne nlistl& H. Q; `7 F; u) a0 ^1 W# F
  82. casekey:
    ! e" J; e5 w; |0 |  [+ t
  83.         mov     ah, 01            ;if any key press jump check- N  N4 v2 A, ^, j) U4 R$ I# K) H
  84. int 16h! b) \' V. X3 Q' {. R4 S6 n1 d
  85. jne kpress, _- k% @5 Z$ b; A0 \. i
  86.         mov     al, [chkl]        ;check x flag7 G  T& T$ `) K; y8 s
  87. cmp al, 02h# a* l( J4 P* ?. Y
  88. jnb chkok( e9 T0 [* f6 I& r: ^
  89. jmp casemo! E# M. Y# T# B) j; U0 N$ t0 m; I
  90. xmov:                             ;if X moved, get the X flag+12 n/ z: u. z* _2 \+ ?) F$ x) T5 Z9 f
  91. mov al, [chkl]
    8 A3 V4 v' K9 r3 I/ D
  92. inc al) J; \! W1 L6 W5 `# o
  93. mov [chkl], al
    / y; x9 m, q7 W# ~" L
  94. call passok
    7 F! r+ z2 I3 C, e% f, K) @! t, V9 {& T
  95. jmp xymovend
    ' n; J% G- W1 R$ A$ M& T
  96. ymov:                             ;if Y moved, get the X flag+1
    8 L2 n3 d7 N9 {, p" l& u7 @
  97. mov al, [chkr]
    6 m5 @3 h5 q1 |/ ^7 [
  98. inc al
    3 w7 S2 R0 z" d! U8 v1 R/ q% j1 [
  99. mov [chkr], al: n4 Y* f5 T" ~& M+ Y+ |
  100. call passok
    ( j9 v% q3 C8 l5 U9 a* h- x
  101. jmp xymovend
    8 E' v: K! o: E2 a; D# s6 C
  102. 9 e! m$ e- R$ {2 e, m) K
  103. passok proc near1 d, q9 z2 ?, y8 m5 ?
  104. mov al, [okcheck]7 @- i- X. V" r4 d& F7 [
  105. cmp al, 1
    7 A2 W* I" U$ R  [
  106. je let0
    + X3 _) E9 w. ]. R8 q6 ~  W% y
  107. jmp passret; s3 y% I; t0 q2 Z
  108. let0:
    $ A, v, s, d; d6 H- v- Z
  109. mov [pass], 1
    " c( _* N+ g& F; D- k" X: k
  110. passret:
    & |1 Q0 q/ W8 W8 @; m
  111. ret1 B) ^& A7 P! `% h( R" l
  112. passok endp 2 ~- Y: D) f$ y* O7 N6 {4 t

  113. 7 l* u% ^3 S; [8 m( }9 T
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS4 ]# n6 ^5 N% H. y( {& j
  115. mov al, [chkr]3 R! J$ b& F1 l/ \" n- {
  116. cmp al, 02h( L- m+ V% p* I! j  Z. S
  117. jb casemo
    # q# b. T7 t6 r  o- w# ~" p  O" D
  118. mov al, [lk]  q2 X* R2 U2 M. a0 C; [
  119. cmp al, 1, ~" i* R% s5 _  s9 f% S; ~
  120. jne casemo. ^! _5 l7 c+ E) y
  121. mov al, [rk]& t0 _  H/ i/ ^. d
  122. cmp al, 17 Q( X! q0 i6 X
  123. jne  casemo
    8 {/ D6 `6 {# L* R7 C( Z
  124. mov [okcheck], 1
    * D/ T& ~* L( q. d: z. S: D' L
  125. mov al, [pass]
    4 a3 [( K) b9 L* a4 h! n
  126. cmp al, 1+ j" _: @4 U! I* m
  127. jne  casemo& V8 D+ @5 y8 z- v
  128. mov ax,0002h" X! ]' ~( m4 u6 [2 q- x
  129. int 33h/ y9 R/ e( k& e- j2 ]- |5 X% z
  130. call cleascr
    6 h, l: ]  x9 e# P

  131. % W6 w$ P- @* J
  132. call oldint0 t, b8 Z+ ]0 u
  133. mov ax, 04c00h
      U! A- D0 l% L8 s) q
  134. int 21h7 P! ?* Z8 R, \' `

  135. 3 d. b, ]3 E0 o6 i- G* P
  136. okexit:
      j4 G$ k; F1 L$ U9 D; j8 c& ~
  137. mov ah, 4ch. |3 P' \/ b# t% \
  138. mov al, 0( `% l- p. M6 @/ n0 ^3 o: N
  139. int 21h
    ' q0 {) r9 R& ~5 L
  140. listl:                                 ;Show ON/ K2 H+ `& W6 d( N1 Y- l/ U' H- o
  141. pusha8 A' O# _; V% y$ A& v. U0 i# Y
  142. mov ax, 0b800h9 ]8 R5 n: G. W# B; y+ x4 Q
  143. mov  es, ax" W" N5 ~! P8 e' E
  144. mov ah, 47h
    7 v6 T* z+ @, r. I1 ?  E
  145. mov al, 20h& l7 z8 g, [  v. N/ k
  146. mov es:[si], ax
    / m" M. p; G. N2 X; E/ M) u/ Z
  147. add si, 02
    $ T# B, m# l. [. h0 h1 ^2 J
  148. mov  al, 4fh! c$ U! o# q: _2 R. j: H
  149. mov es:[si], ax$ _4 l: v& k- |/ z# [% H
  150. mov al, 4eh9 @( p2 y9 T2 d
  151. add si, 02# v, f+ O/ e" M/ b
  152. mov es:[si], ax
    # ~* D5 \- k% v& [9 T
  153. mov [lk], 1+ u# M& Y  T6 b
  154. popa1 i' J# ~6 F, @& C
  155. jmp testr5 H, P, {& M! K* j" \3 @; k
  156. listr:                                 ;Show ON; w4 }' }( }7 |
  157. pusha  \" z6 p: D/ ~1 \) [) S
  158. mov ax, 0b800h
    ; K2 E# o6 [9 z" D* C
  159. mov  es, ax4 @  i0 {3 o; v6 n
  160. mov ah, 47h
    4 x- U, S! l2 K4 b. G3 g
  161. mov al, 20h4 _+ U% o) W& d) E
  162. mov es:[si], ax1 `7 U  @7 O: f5 A2 r" l' t
  163. add si, 02
    ( W5 x/ _  V- ^$ A2 k
  164. mov  al, 4fh# q+ ?2 l: R7 |* ~/ i# S3 O
  165. mov es:[si], ax
    0 j+ q9 X- M5 ?7 [5 f
  166. mov al, 4eh& a! u) t5 l# ^
  167. add si, 02
    & {9 ]7 `4 A7 G- t6 m+ l/ @
  168. mov es:[si], ax
    ' `+ M  N# m* m9 N7 `2 O
  169. mov [rk], 1
    6 U+ U3 R4 l- j/ S
  170. popa( x; r1 w& K0 J- J8 j/ z- \
  171. jmp  casekey
    . ^. ^1 l& o# m. m
  172. 8 V1 B% n8 s( C! @4 k
  173. nlistl:                              ;Show OFF
    # h0 W+ f7 W# R1 w- K1 ?
  174. pusha   
    3 a, Q, X4 y1 V1 a3 ^) g# g8 k
  175. mov ax, 0b800h  Y) C  j* l) h& v; m  E
  176. mov  es, ax6 {, {1 o8 y- A8 r
  177. mov ah, 17h
    & b/ ~2 H& C# [% q
  178. mov al, 4fh" s! ^9 u" r- O) J5 j4 j/ E/ l& z
  179. mov es:[si], ax) C$ a7 K& ]5 U4 A8 @
  180. add si, 02% p3 T% i% F) S3 ^* R2 E. T5 {
  181. mov  al, 46h7 o$ m& q/ D5 g9 ]4 [; }. |5 z
  182. mov es:[si], ax  b( p; X# w) L" T0 ~
  183. mov al, 46h- o' E& V9 m+ i+ q% z
  184. add si, 02
    9 b6 n5 Z& e/ a6 N+ P
  185. mov es:[si], ax: A0 ?5 h2 S' ]$ r* l! O( L
  186. popa5 ^+ L% H9 H5 e! z. h/ a
  187. cmp si, 1840
    # X# E( W* C4 n: R
  188. jae casekey8 o% M0 M0 K: o
  189. jmp testr9 Q9 P2 S9 L  D' H5 ?

  190. 4 p. R" |& U* ?" o$ |  z
  191. kpress:                             ;Check key press if press<ESC> then EXIT8 `3 n! x6 l! j3 t6 M
  192.         cmp     ah, 01h             ;and return a error" Q4 m4 ^0 a3 ^- Y
  193. je exit1
    + z: a0 z$ F2 G/ g3 k& C
  194.         mov     ah, 0ch             ;if press other key then clear
    " H8 b. r; y8 B
  195.         mov     al, 00              ;keyboard buffer
    6 i! g% S2 b& O* ?# d* t, f3 f
  196. int 21h2 `. `1 `. E+ b* l  W
  197. jmp casemo
    ( w1 Z% R) O1 o: x
  198. 8 B. |5 [4 B8 G( V# ]
  199. errormsg:                           ;if mouse driver no install% X7 M7 g: l# d1 a+ U+ x
  200. call oldint
    ( V9 n3 f* h# X3 s* v. v8 x6 q
  201. lea dx, offset emsg
    5 T. \' V- b. m" O+ Z0 n% j/ z
  202. mov ah, 09h" B, a  I* u+ t
  203. int 21h$ w; Z8 i9 w* Y' a9 G1 h( n
  204. mov ah, 4ch
    8 G( V- d9 v! L! M
  205. mov al, 2
    6 Q- C+ e  v9 L  P
  206. int  21h( l9 K5 Z4 U0 }3 n) U' K
  207. ( B0 y' r8 }2 ~( _9 p
  208. exit1:                              ;error exit
    + |8 l7 S& |6 x# m! i0 `1 f- i0 V7 w
  209. mov ax, 0002h0 R- Z. ?) X$ I' }' Z+ X
  210. int 33h
    - F; T+ y% f, R2 H
  211. call  cleascr! A4 Z! M- N3 K% \
  212. call  oldint
    3 o4 u7 t1 i8 F
  213. mov ah, 4ch
    ; f* S5 S0 _5 f( H
  214. mov al, 01
    ) o" [3 M' e4 U3 s% ~5 `
  215. int 21h
    & {' u9 N8 C3 ~. k

  216. # ]; L& @9 \& ^# j  v
  217. cleascr proc    near                ;clear screen
    2 z9 R: Z7 M6 W/ |- d
  218. pusha
    % p8 e3 `( E% R& H0 l. z
  219. mov ah, 06
    ) B" O. _) I) `) a- `$ t
  220. mov al, 0& B1 e, W2 y1 W. L/ A% @; }6 w
  221. mov cx, 0- m3 c+ Y4 N+ D; E
  222. mov dh, 24* Z4 C; z8 u# g9 i9 N+ j' i
  223. mov dl, 793 o$ S9 @# C( ?; T
  224. mov bh, 07h
    ) I; m* `) a; P+ B5 D. |) U7 Y) u
  225. int 10h
    0 o% H1 x  h0 {* G+ D
  226. mov ah, 02( q& @* P) u& Y' W5 Z
  227. mov bh, 00
    0 ~4 Z  g3 N/ Z4 [5 r; D
  228. mov dh, 0
    0 {- @6 F" n- v4 m3 k0 [$ ^
  229. mov dl, 0
    6 d4 Z1 A6 U: {4 k. |
  230. int 10h
    3 M# v7 u- e' t% w+ N
  231. popa
    ( R6 x$ W* [0 u
  232. ret! [0 t1 {& `5 M- D! U0 `8 I
  233. cleascr endp
    : k/ P. Z! M1 t- `/ [
  234. 8 H) t6 R  e5 d; I/ i
  235. showmsg proc    near               ;Show info+ ]3 p# _; s) I1 `: b+ U
  236. pusha
    ( ?: e+ k0 P) B2 J  L( i- O' w0 d
  237. lea di, offset showms$ ]" e" X: ]; b4 o" c
  238. mov ax, 0b800h
    - f+ y- T! ~# l# N5 ^, T$ E$ v
  239. mov es, ax
    8 l: P3 I9 \( V; n& w: L$ m
  240. mov si, 0
    / F: b" V8 I8 L0 z( [2 v/ J& f
  241. mov cx, 480
    , ^; P7 s$ ^% t+ ~4 u( R: T; H
  242. mov ah, 07h
    $ c' d9 Y# i5 f
  243. @@:' V' w0 `& D, ^4 V
  244. mov al, 20h' l- H/ b# N# M6 U) o  |& v  g& \
  245. mov es:[si], ax
    8 L1 M( l, t" Q
  246. add si, 2, `6 }5 K% L9 `7 h( }0 A0 \, _. q
  247. loop @b
    6 V8 b2 Z8 H# L/ K1 H; t
  248. mov cx,880
    3 }: v5 q/ {! x8 O
  249. @@:
    0 F" A. o; v) i
  250. mov al, [di]5 S8 v: m, T. Q' P( K' I
  251. inc di, g! [+ d- w% @; w6 c
  252. cmp al,20h% X, J. |& ~8 A% G2 i5 A: R5 w
  253. je showch1
    $ U$ t: V3 X! F/ \
  254. mov ah, 17h* E- G# ]. C+ T4 y1 T, e. E
  255. jmp showch3 & o5 T- z, B8 V3 d
  256. showch1:3 S; ^9 J% g5 x; m7 f" J
  257. mov ah, 07h 8 R1 L6 c: Q& ?4 p  |1 q, L5 _& e; I
  258. showch3:
    5 @( X+ |! P% [4 E5 Y
  259. mov es:[si], ax/ y9 y& g' z  w$ N, u  W* n$ y% T
  260. add si, 20 u8 j. e8 D* f" G
  261. loop @b# a0 _/ @6 l" Z0 j" V: d
  262. popa
    9 w5 m. R- k# L( u8 _+ b7 u  Z
  263. ret
    % f; o! v" i+ k2 o
  264. showmsg endp8 `4 S" I1 \& l" ?* Y

  265. 7 z2 w/ |! u8 X. O8 S
  266. oldint proc- @6 x3 n& p2 s: D
  267. pusha, o/ w8 b6 u8 O  t
  268. mov ds, word ptr cs:[old331]
    2 O* i; R/ x2 W1 ?/ M
  269. mov   dx, word ptr cs:[old332]" H* K% ]' P2 R$ m( n. k
  270. mov ax, 2533h
    + `  i3 F- [: E* i5 n7 |" ]
  271. int 21h
    + u% q) A. p6 _! I5 |4 ]/ i6 x4 A
  272. mov ds, word ptr cs:[old741]
    ' j! I/ N# a% }
  273. mov dx, word ptr cs:[old742]; B+ r, X% s, s1 O
  274. mov ax, 2574h! s* c1 ?  H: a& x! A- X
  275. int 21h
    - g, q% [: r2 @+ F- x: }4 U( |
  276. popa
    6 f- s* h: _+ r; Y
  277. ret
    1 e7 k4 k/ c" H( F
  278. oldint endp3 e$ L% |) ]5 O& b0 p
  279.   i" L- K  V' {4 ]9 v# D
  280. memmouse        proc
    + X+ k: q0 o' S9 l  _" J* ~3 q
  281.         xor     ax,ax
    6 R/ Y8 x6 X/ L- A8 I
  282. int 33h. \" |/ R! F1 r8 Y0 H  m' v
  283. cmp ax,0ffffh
    % f' l2 v( l2 R1 p
  284.         jne     not_loaded
    $ x$ G! y0 \- {2 t
  285. mov [memcopy], 1
    3 }9 J7 M, A  P9 q# e: ~, X  i& K
  286. ret0 r5 Y* k, k. c& d
  287. 5 C/ M6 w3 k% C7 a7 Q
  288. not_loaded:
    ; P" \: a) N1 O% W( d
  289. & d, D- t' l' ~7 h) G6 w! I3 ]4 ~
  290.         mov ax,2574h, u4 H+ s+ Z+ W# c" c5 x/ ~5 j) s
  291.         mov dx,offset new_isr' L% G4 u+ A/ X" C
  292.         int 21h* I/ V* e3 j6 d; r% t1 H+ d. S3 O

  293. 5 _) I/ h/ R' w3 ]! Q) N4 Y& ^+ I
  294.         mov ax,2533h* H% I! e% d' l$ [: {3 C
  295.         mov dx,offset new_33
    " s2 G, O" y( N* t7 k# N& y$ ]* c7 K
  296.         int 21h
    2 f4 q/ m" p- w# n
  297.   e6 c  V! ^4 t+ j& [- g
  298.         cli. ?& w% ]- h& D$ z5 M

  299. - L3 ^# }* j7 o
  300.         mov bl,0a8h' [% o7 ?" E% i( r1 G- z8 t
  301.         call keyboard_cmd
    ( |3 k; f$ n, p$ ]6 N( k4 \/ F
  302. 8 ]5 }: w" V( ~8 k" g; j
  303.         mov bl,20h
    ( r# [) n3 d- o2 y9 H( `8 v3 \
  304.         call    keyboard_cmd' Z+ @9 Z/ J2 m7 F: o# N
  305.         call    keyboard_read4 x0 Q. P2 u8 n9 j8 ~& S
  306.         or      al,21 o1 _8 r8 a4 d
  307.         mov     bl,60h
    ; a/ ^, Q/ }5 M% N! C
  308.         push    ax% q5 y# F$ I& ^8 b+ v
  309.         call    keyboard_cmd
    7 ?/ k/ a! G" K1 w
  310.         pop     ax
    1 Z  u. @2 o5 X
  311.         call    keyboard_write
    / K/ ^, l0 i" t  P4 g: I/ y

  312. 4 ?0 E2 m: T* a9 T5 Q! [  h
  313.         mov     bl,0d4h' T! W* S* _: D. ^) b  Q
  314.         call    keyboard_cmd
    8 q& ~& d' Q7 R5 C$ A
  315.         mov     al,0f4h1 I- e% @5 t$ N! x, q  O& I' P/ l! R
  316.         call    keyboard_write
    - A2 [" i: u( {6 C
  317. ( b7 {) G, o: C1 @# E1 ]
  318.         sti# y4 J" Q( D" h
  319.         ret9 F# i! T, i5 h& G' h
  320. call_user_isr:6 h' i3 q. A" e3 E6 N
  321. db      60h
    5 n1 e; Q) T6 f( F2 f
  322.         mov     cx,cs:[pos_x]0 }" G) X7 f5 }
  323.         mov     dx,cs:[pos_y]( h9 z6 K$ X' W; |3 [
  324.         mov     di,0 ;cs:[x_move]
    / D- b6 L/ e- r
  325.         mov     si,0 ;cs:[y_move]) I' V. c. J$ K2 [
  326.         mov     word ptr cs:[x_move],0
    8 H7 x6 L1 B7 x! H% H& B& M/ D/ b
  327.         mov     word ptr cs:[y_move],0
    " L# u5 z# T7 p/ h9 Q/ o: D; h
  328.         mov     bl,byte ptr cs:[buttons]$ a- U- B, P/ r# Y. g. j
  329.         xor     bh,bh
      s' B2 T8 t: Q8 L% ~/ H
  330.         call    dword ptr cs:[user_subroutine]/ a  C( U0 A0 `4 W: C6 I! R
  331.         db      61h) l+ g% d3 Q4 Z5 t7 q
  332. ret  u* m" t% O+ ?( G$ c
  333. new_isr:$ \2 e  g, x& w
  334.         pushf
    . E  k' P. S( Z& \/ x9 o
  335.         cli1 G8 u+ W4 M0 Z8 r
  336.         push    ax
    + B" y7 \5 b; C: u7 ?0 p# y. P
  337.         push    bx  ~9 d$ T1 H- O3 G. N7 s; C/ x, e
  338.         push    cx' @4 Y/ c8 q$ B# c# z( H! E
  339.         push    dx
    : v  X6 g7 ]! G; L8 S# f" C
  340.         push    di- i4 g; c9 C5 L+ n
  341.         push    si5 M9 Z; K( x0 O8 C6 |- [
  342.         push    es( L8 o3 u2 P- K; M7 B
  343.         push    ds' D" {1 [4 k8 h. Y

  344. $ E2 z2 w* o. j: w8 X9 Y# S
  345.         push    cs$ G' h: W, i% V3 T. M+ B5 H
  346.         pop     ds% ?" V. X( f4 j7 S* {8 w

  347. + @. s) K5 ]& m3 b5 \8 ~. a9 ^$ F
  348.         mov     bl,0adh! v# v: m3 w6 ~; m; E2 c/ n
  349.         call    keyboard_cmd
    ! s/ n: x- U. \$ V- N4 Y
  350. 2 [6 W, d: z1 m  n1 y7 n' X
  351.         cmp     byte ptr [first_time],0
    * G/ W8 V# {( Q. s8 S$ d
  352.         je      not_first_time
    ! ]; K( m6 Z1 v7 P! [5 ~
  353. 2 U9 y& z3 D. E" I5 \+ I& x% H
  354.         mov     byte ptr [first_time],0
    + _2 {* v7 d  H
  355.         call    keyboard_read
    : ?1 d. h& A" Q
  356.         call    keyboard_read9 p+ R, u  D# j! g
  357.         call    keyboard_read
    9 J/ r* E5 c7 j* C- c) \
  358.         jmp     no_show9 D5 h) Q1 Q: E1 r3 Q- [* I3 v1 G* A
  359. 5 k* ]5 V7 L$ Z1 `  Y1 h
  360. not_first_time:
    - ]. h' D* U) I1 p
  361.         mov     word ptr [temp_mask],0
    & Q1 C. u( z/ x9 {: v! W3 H
  362. 9 T6 Z+ Z1 k5 \' A
  363.         mov     cx,[pos_x]
    ( @: A4 E! g$ t, y
  364.         mov     dx,[pos_y]8 l) {( |  I; t  l! Y* ~( Z, }
  365. 0 M9 E3 Q0 C. L3 L, c4 o
  366.         call    keyboard_read/ g+ h7 @. k  g' E
  367.         and     al,7 ;3
    . p$ I. ]8 E. [& O" f# {
  368.         mov     ah,[buttons], K+ C5 j4 E& p- o+ r' o5 [: O7 o
  369.         mov     [buttons],al7 F0 L( W; d6 H5 j0 Q  _# `
  370.         cmp     al,ah7 p- z1 s7 u9 ?2 X
  371.         je      no_button_change8 z. y- W* \9 t
  372.         and     al,3! a1 t) C3 _8 {- }, V: x/ i+ ^
  373.         and     ah,34 i6 E% Y  a& n. R$ }  P7 H
  374.         xor     al,ah
    3 W6 o! n, z0 ?
  375.         xor     bx,bx$ X4 g' V4 O# S3 u' N, f$ d
  376. + z. n& B% W) }1 ]
  377.         push    ax
    4 i' f* o# b5 ~
  378.         test    al,2" b0 p+ h: ]/ {( y; _2 S3 O  T" Y, ^
  379.         jz      no_right_button_change  l7 h  |' p6 a5 |
  380.         and     ah,2
    ) a! `3 |0 @( x
  381.         jz      right_button_pressed
    . _- A- |! ^& H0 |
  382.         or      bx,16
    ( E) L0 T, U2 d, _
  383.         jmp     no_right_button_change
    5 _' q; b' y) c: n# J* B) ]2 Q
  384. right_button_pressed:# t6 ^2 c6 s* u4 x$ Q
  385.         or      bx,8% e. |4 [3 \! @/ }4 Z
  386. no_right_button_change:; P. s' s# ]" U! I1 M$ C* H

  387. 7 M# V9 k1 Q- S6 ~( \( l
  388.         pop     ax
    ! U8 B. z" ?$ z6 l; \

  389. : N. k5 K" |; L0 S6 z
  390.         test    al,1( O- M7 D: T8 n7 p; W7 l
  391.         jz      no_left_button_change5 D5 q3 G3 \- z  N6 S* S' p/ N  a
  392.         and     ah,1
    * t$ T5 @0 Y& d* B4 w) ?, h- V/ [
  393.         jz      left_button_pressed
    3 p6 b# |, f- c) h
  394.         or      bx,45 a3 n+ }* P1 y4 f6 G
  395.         jmp     no_left_button_change; g" S4 f: P7 B) I! @5 h+ [
  396. left_button_pressed:
    ' d: _5 V$ @$ U( O7 D0 s! @- y* X
  397.         or      bx,2) j4 l7 n2 C. b+ e" N+ H8 B
  398. no_left_button_change:
    6 x0 M6 H% X, ~% d: j! y% Q. n

  399. ' m) [) `' h9 t+ z9 q
  400.         mov     [temp_mask],bx" M% r6 u5 w* g3 @* K/ e

  401. % Z- \5 z- m/ K, l, h7 b  ~$ W
  402. no_button_change:+ \. ^, h1 M1 k8 Z/ R9 f9 j
  403.         call    keyboard_read
    8 C5 p4 S( s. ], G/ w
  404.         cbw
    : t6 t) J. G6 U3 c. _: f! h% l: {
  405.         add     [pos_x],ax# M" A$ N$ {. y/ W2 }+ `9 Q8 H
  406.         add     [x_move],ax( X# y* f- L3 f4 K
  407.         mov     ax,[x_min]3 w3 H2 [7 u* `
  408.         cmp     [pos_x],ax
    0 K0 t+ F) B* s. r
  409.         jg      good_hor1
    ) M8 \! `6 w- z7 e# U
  410.         mov     [pos_x],ax7 C. t4 H/ a: G' t. j' y$ M* t9 o
  411. good_hor1:
    . G7 N4 g0 c$ t" J6 m* Y
  412.         mov     ax,[x_max]
    4 \$ T; }+ [8 i7 c
  413.         cmp     [pos_x],ax
    " ]# I4 O: z& a& r9 m
  414.         jle     good_hor2
    ! R  H& G/ \' q7 E: Y6 f! X2 x3 @
  415.         mov     [pos_x],ax
    , U9 N4 G7 v% M" X/ ?. U
  416. good_hor2:7 B% ^4 ?0 C' @

  417. $ B& ]- U0 m) C* n6 u; g+ e
  418.         call    keyboard_read
    * E' V8 R/ h5 u( N9 U) ?9 P6 @/ q
  419.         neg     al2 J5 i' h/ X( {$ D
  420.         cbw
    # s2 B3 s/ d% }3 `8 Z
  421.         add     [pos_y],ax
    ( C  X) J' E. S; A! _' n* t8 `# N
  422.         add     [y_move],ax
    1 T. b6 v# _( s; J7 K0 |
  423.         mov     ax,[y_min]% s" x5 p% V* H
  424.         cmp     [pos_y],ax/ Z# _( k$ r8 j+ a) B9 t% t  U1 q3 ~' M
  425.         jg      good_ver1
    , N; |% J( ?7 |) C7 |: e2 ^2 o
  426.         mov     [pos_y],ax
    : R: x/ ^( ?% g. U
  427. good_ver1:! y7 m- r  C1 I/ r6 V
  428.         mov     ax,[y_max], n6 J" w& S% Q- S$ y
  429.         cmp     [pos_y],ax
    / p- Q6 r7 u; m0 h9 F" ~  a
  430.         jle     good_ver22 }. T5 b2 k6 v
  431.         mov     [pos_y],ax6 F3 f  m* l, [2 [+ Z6 M8 }6 `0 ?
  432. good_ver2:+ Z. Z8 [0 I) D
  433. 5 l3 r6 G! B: i# w' ?: j) t
  434.         mov     ax,[x_move]0 h' f/ `6 ?6 i
  435.         or      ax,[y_move]
    + k, L) o+ y/ l' }8 E/ n/ Y4 l
  436.         or      ax,ax2 ~& r- C5 P' d
  437.         jz      no_change_position
    + Y; T/ r, |- f& c( V! k
  438.         or      word ptr [temp_mask],18 L; ^2 y- h) p8 Q% {/ M% ~7 F
  439. no_change_position:
    * {6 T0 a% g: t3 I  g, j2 l
  440.   e& @& _  t* |2 U9 _) \
  441.         mov     ax,[temp_mask]
    8 f3 s, A2 b! s' _6 Z0 G" c: U0 }- v
  442.         and     ax,[user_mask]
    4 ~! q  f* o/ s9 W( s. L  O
  443.         jz      no_call_user
    4 M3 u) I+ T2 j( d' ]$ I& Y1 e
  444.         call    call_user_isr
    * h6 x+ ~8 w. W# |0 z0 \
  445. no_call_user:2 N2 l% v! M) R3 `4 Y  i9 s" o

  446. 0 y- K- ?) W9 u" s8 O3 q0 e4 @
  447.         cmp     byte ptr [sm_flag],17 C4 W/ N) h% l# a  \, \- |# e
  448.         jne     no_show6 s2 Y3 ]" d; G# S" {' c! ?& p# _

  449. ) g& s$ `3 R' J$ d
  450.         shr     cx,3
    4 n" R% o' P! w5 j5 j' Z
  451.         shr     dx,32 g7 p5 r& t1 c' r, j/ Z
  452.         mov     ax,80
    ' @% J4 j0 e; ?1 I: w
  453.         mul     dl
    4 G  U- D( K8 U4 X/ }0 k: `/ Q
  454.         add     ax,cx7 O# V4 n: j$ J) Z: @; m
  455.         shl     ax,1
    : `8 ^6 B) ^% R& Q$ z
  456.         mov     di,ax$ c* w. Q+ j6 f4 d  A5 I
  457.         mov     ax,0b800h$ y+ H; W# F# ~9 G: p
  458.         mov     es,ax
    * P; t- |! @# j; g& i8 q/ G5 g, q7 H
  459.         mov     ax,[save_char]
    + S$ C; l9 m$ k
  460.         stosw3 L8 r$ E" o4 L7 ]7 G. w

  461. ! F3 {$ T" t; v4 a8 L. R7 z5 h) B; ?
  462.         mov     cx,[pos_x]/ k) d9 h5 i6 g7 ?3 v
  463.         mov     dx,[pos_y]
    $ t& T' U6 I- L/ n; _
  464.         shr     cx,3( c" P- s# o& c# n: b  k
  465.         shr     dx,34 X$ I" D/ o/ c8 O1 N# R# I
  466.         mov     ax,809 T& [6 U0 L9 s4 w5 x. A( [
  467.         mul     dl
      V) Z) a, J; F1 L0 `) s
  468.         add     ax,cx
    ) h  S$ m; }' l* _# l% _
  469.         shl     ax,1
    1 D# r- M( n1 Z0 T0 ]; k6 q$ D5 g' Z, Z
  470.         mov     di,ax- O# R( j2 B& \$ @8 C0 B) Q- i
  471.         mov     ax,0b800h
    5 o& e. \. W+ n0 M- X
  472.         mov     es,ax& |& U+ W6 N9 R& e+ h
  473.         mov     ax,es:[di]
    # b8 N5 p! ?7 U; _+ n# s  @
  474.         mov     [save_char],ax
    " ^6 T6 f5 p- s8 U- V
  475.         not     ah" |9 V# L; [' f: h
  476.         and     ah,7fh
    & k/ ?2 h. ]- x* y
  477.         stosw) {, F: H* ~3 \
  478. no_show:
    $ x4 y! n5 {* h7 r! e
  479.         mov     bl,0aeh
    . V; ~/ Y5 i2 @2 Y5 s4 D: ~
  480.         call    keyboard_cmd
    " D9 O% Q4 Z' l* u# y% u; L

  481. % ^9 U1 P3 F) w1 p* l  [( K+ l
  482.         mov     al,20h+ W3 i+ c) z1 E
  483.         out     0a0h,al
      |' P+ Q2 @3 N" j% j
  484.         out     20h,al
    ! z7 p$ J/ Q( h0 D( [/ _

  485. ' Y  x: S. H$ e' i" |
  486.         pop     ds
    7 o; [7 C) n7 V( r. W& r0 O
  487.         pop     es1 N0 S7 J* g6 J. F" r: l$ ]: s
  488.         pop     si
    ' r: `# E" v- F2 |9 b1 W
  489.         pop     di  I. T9 e& m# W) D
  490.         pop     dx3 Z6 j5 O0 P3 b
  491.         pop     cx
    * o- ]2 ^. d2 ^
  492.         pop     bx
    ( w7 N% @6 i3 d* L( t7 a
  493.         pop     ax
    ) G! Q: x, ^1 H/ {% P' x* k
  494.         popf
    9 M  _: @; Z) ^  P8 |& I% r
  495.         iret
    * D0 D( U/ z* u$ Y! N* J( j$ |6 d: w
  496. . T; s: X' a5 K/ `/ L
  497. first_time      db      1' X9 Y# {# ?  H! h" h& e) A, n
  498. buttons         db      0
    / O. r9 b# ^. t, [' f
  499. pos_x           dw      0) _  y( E  k* J
  500. pos_y           dw      0# R6 H6 g/ o, X
  501. sm_flag         dw      0
    : ]% x# Q7 ]5 J# x2 q
  502. save_char       dw      0( R0 q* Q- E. Z: G
  503. x_move          dw      09 ^- p7 a5 {, a; T6 ~; B
  504. y_move          dw      02 ?4 ?" @7 S8 p8 B
  505. x_max           dw      639
    1 \/ n( Z: g! u0 |0 W2 M
  506. x_min           dw      0
    : R, c4 n# s4 w" ^
  507. y_max           dw      199
      g9 n$ A$ t1 e0 d% ^3 j5 {  ~
  508. y_min           dw      0- o0 d" y9 N$ u9 m  g# G+ L0 F
  509. user_subroutine dw      0,0- u1 T! A) P; D
  510. user_mask       dw      0
    & C( G) W- D: I7 }( |' N
  511. temp_mask       dw      0
    " N; [/ X+ T/ H5 [7 b

  512. 2 n  E0 {5 K! ?
  513. keyboard_read:
    0 D' Y" v$ p" z. |" b' U
  514.         push    cx. F) Q  b0 B% D
  515.         push    dx4 ]1 P/ K9 e$ N4 L# T5 H
  516.         xor     cx,cx9 v# @' i0 {' |: D1 @" u* e! j
  517. key_read_loop:
    ' I! v( L) q4 L% d7 K
  518.         in      al,64h
    & h3 C" I. m& }% A( v
  519.         jmp     $+2
    ! P/ E# k8 f1 Z' P
  520.         jmp     $+2" {9 K0 ?1 F. i+ B
  521.         test    al,1
    0 Z- q) L" K) s- r
  522.         jnz     key_read_ready
      G& J$ B3 T$ a- _$ N
  523.         loop    key_read_loop
    / F9 C: j5 ~  s9 k3 A' I
  524.         mov     ah,1
    / U1 ^1 }9 O2 P' _  U, x
  525.         jmp     key_read_exit# U! J* O. J8 ~7 B/ K+ h& ]
  526. key_read_ready:; ]/ S. E! ^& x: G5 p
  527.         push    cx2 |9 ?  c7 o$ y" t
  528.         mov     cx,32
    2 b1 I4 U# d# V2 w4 K
  529. key_read_delay:
    * R9 x# T* V$ h2 \/ p3 g/ v, k
  530.         jmp     $+2
    ' E; {4 @( ?/ d7 Z* g' l8 e6 L
  531.         jmp     $+2
    - i; s3 f, n9 K3 Q! j, b, x
  532.         loop    key_read_delay
    * T) B( |9 F1 M/ A' @3 U8 {

  533. 7 o& m. D. y" y& A3 r& V
  534.         pop     cx
    - R* r( H7 h) A  ^% U# F
  535. 0 k0 X( x% q4 i, i" Q8 y
  536.         in      al,60h
    # j6 c: e, ?9 c! N+ a' B0 u6 D2 H
  537.         jmp     $+2
    & ?8 U5 m9 \$ U" g0 ?1 D/ M* S
  538.         jmp     $+2
    ! K! U6 J2 }; u' h& k: K+ [. @' p
  539.         xor     ah,ah4 y1 j6 H6 r' p1 Y- T
  540. key_read_exit:9 }$ Q( x. r" v' T
  541.         pop     dx* _. N* M# i  ^* @% i) e, d  C3 a
  542.         pop     cx" C( {) ]+ v/ |, y
  543.         ret* Y9 y! ]1 q7 j8 m2 w- S/ R7 h2 T7 e
  544. $ W+ [5 K! l6 B$ m
  545. keyboard_write:
    3 w7 K. F4 d! [$ x
  546.         push    cx
    - Y* S* q( \! i/ f
  547.         push    dx  O9 _) J; _0 o/ C0 u- D
  548.         mov     dl,al
    & q- S$ l( U" d1 E
  549.         xor     cx,cx( [) w, \9 d; v" U' E
  550. kbd_wrt_loop1:6 \, i+ |' D4 i5 {6 D( y; Q1 P
  551.         in      al,64h9 s# @$ ?7 y3 W/ m' {4 B3 w3 r/ R
  552.         jmp     $+2
    $ X3 j* l" J+ s5 b4 _; q
  553.         jmp     $+2
    # u& {6 d+ s* r6 ~, M
  554.         test    al,20h5 }1 `1 B7 A8 F5 R) [
  555.         jz      kbd_wrt_ok1
    & Y2 c; m8 g: \# U
  556. ( U1 ?% \0 i& B2 C! g( ?
  557.         loop    kbd_wrt_loop14 C  `3 {1 ?: e
  558. : W+ ?. _, V6 Q8 |' k& S. a
  559.         mov     ah,1, r9 F6 P0 N- K" k) ~: O
  560.         jmp     kbd_wrt_exit
    . W9 L  d4 \, Y& G1 c7 w7 ~
  561. % M0 [, n7 M+ a5 X7 x9 M& c
  562. kbd_wrt_ok1:# V8 A0 C* A/ z8 b7 T; s8 L1 W' Y
  563.         in      al,60h
    7 P4 B8 \* c, X" J9 `' E" H& H

  564. 1 _* {2 z, z2 `
  565.         xor     cx,cx
    # J4 R8 e" x% j0 Z
  566. kbd_wrt_loop:
    4 ?: g* P! u! u0 A  q
  567.         in      al,64h" m% i- M5 h& C9 H+ ?
  568.         jmp     $+2- K: [8 E2 l! N5 D4 B  f: F
  569.         jmp     $+2
    3 k9 e3 b8 N. j+ ]  c. {
  570.         test    al,2( D4 n. A3 Z6 C; O
  571.         jz      kbd_wrt_ok
    $ ?$ b  j) S* e0 V
  572. 9 z- i+ i8 M; e2 n
  573.         loop    kbd_wrt_loop8 m/ D4 E! w3 r% p: H2 v# \

  574. & `# O, _- L) f5 [7 W9 j
  575.         mov     ah,1: w. T& @1 I( u: J/ |5 g6 Z
  576.         jmp     kbd_wrt_exit
    . U. q' _. a5 T) @, P+ C$ L& c

  577. 9 l" D7 ~: X5 u. K! X' _
  578. kbd_wrt_ok:3 H  w: t3 |7 |5 M0 s6 p
  579.         mov     al,dl
    # F" [. ]& Y+ z1 @6 Y) y
  580.         out     60h,al
    , H9 r3 v$ z3 h; r" I3 i
  581.         jmp     $+2+ e+ k! c* N* e3 j7 t
  582.         jmp     $+2
    / v2 D% ]3 `: \5 Y7 F. P( Y, u
  583. - ?: f, n7 ~+ m" S3 K" l1 Z
  584.         xor     cx,cx7 e  t% V2 f6 R
  585. kbd_wrt_loop3:
    " X: L/ p% f) t3 G' s9 i$ l2 N2 I" _! a
  586.         in      al,64h5 u; [4 E$ c5 h3 }0 R
  587.         jmp     $+2
    ! O  c" J" V; v2 R1 P
  588.         jmp     $+2
    + m, l0 j0 {, U* d
  589.         test    al,2% p  D4 P. w2 _6 u, L
  590.         jz      kbd_wrt_ok3
    . {$ n- H! k9 O) ~
  591. ( @3 H4 f' I  j9 ]! j  |# G
  592.         loop    kbd_wrt_loop35 d/ q0 B) y8 m% x3 C4 W$ A& c
  593. ( E7 p. f+ |; s3 c
  594.         mov     ah,1
    - I' }1 h+ {3 q5 d  A& e% {
  595.         jmp     kbd_wrt_exit  J' }* ^1 w* i! ?! }1 I& p" B
  596.   F7 {: h- p2 c/ z- b9 t
  597. kbd_wrt_ok3:! E* J/ K, v- K' C( P! ]
  598.         mov     ah,80 F. y3 E5 d0 y; x5 O8 o
  599. kbd_wrt_loop4:
    ! y0 K) ^. p6 }+ x
  600.         xor     cx,cx% e0 V, {6 d9 B( F. Q
  601. kbd_wrt_loop5:  ?) X9 v! ~" ?4 n, I4 ]
  602.         in      al,64h, W& r. j+ m3 c+ i: M7 w
  603.         jmp     $+2
    3 J# l6 H" N$ `" f
  604.         jmp     $+22 r3 C% r( h/ I' @+ v, w0 O+ C+ A0 l
  605.         test    al,1* s; C) w4 x1 v6 u
  606.         jnz     kbd_wrt_ok44 d% [1 M5 |4 R; b% n7 p  l4 }. e

  607. $ z! g4 p1 J9 Z" V
  608.         loop    kbd_wrt_loop5
    + m8 l" L( S2 R9 G
  609. . T% X2 y  [. a2 ]  `5 t1 Q" ^
  610.         dec     ah
    * m# P% i" d1 y6 m# }9 N6 F" U$ E
  611.         jnz     kbd_wrt_loop4
    0 q* W7 r" t$ Y9 O/ T

  612. . w" {5 V* R& l( p. U4 k
  613. kbd_wrt_ok4:4 ^" ?$ {  y2 L8 }( J6 V# K
  614.         xor     ah,ah
    ' y* V* g. T* p% r4 `! ?' [: {
  615. kbd_wrt_exit:
    5 `1 E0 [9 z9 ~' \3 S  t- Q
  616.         pop     dx
    8 U) r0 s# y% e% t
  617.         pop     cx( o' t8 w3 T! C$ y2 K/ \! K% S
  618.         ret# _: i& @! y( h2 N
  619.         # F+ Y- a6 z- z: |
  620. keyboard_cmd:
    ! v4 C% @; I# q1 g" \
  621.         xor     cx,cx
    ( @! y  _; e  u( r' F, b+ a' N
  622. cmd_wait:
    ! E8 h; e/ g$ |9 Y# N
  623.         in      al,64h
    * Y( z9 \  d# _1 t/ s5 F5 d0 B: e  \: X
  624.         jmp     $+2" y- C& P7 G7 z% H* _6 \, M1 {* y
  625.         jmp     $+2: _' h8 s4 P# o6 ]8 ?
  626.         test    al,2
    , h# n: }0 f+ S/ f1 b  A
  627.         jz      cmd_send/ l% q" ]1 {1 T& }
  628.         loop    cmd_wait
    9 o0 n8 g7 u! ]
  629.   W2 L7 O" S* B, E+ a0 p) |2 n
  630.         jmp     cmd_error5 o4 O6 p5 N' q) B

  631. 6 _9 L) k( `2 c& W3 s
  632. cmd_send:
    / q0 H+ x' I4 N* T  k" q
  633.         mov     al,bl' W: B# o# ^4 a/ \& E' P
  634.         out     64h,al; D: P2 A. e: }
  635.         jmp     $+2& `, {& Q- w# `- |5 g
  636.         jmp     $+2
    ' b& r$ D/ J( ?0 B6 j! S' R
  637. ' j+ ]/ L0 v1 O' `
  638.         xor     cx,cx
    ' ^6 A. }1 }/ d
  639. cmd_accept:
    3 D. C. b& |, n) C. L' H% }9 l
  640.         in      al,64h+ y: A% M  r' v
  641.         jmp     $+2
    6 h) Z; F% a. ~+ Q3 Z
  642.         jmp     $+2  R5 W; D# `" {% l; b* g# {2 G, B
  643.         test    al,2+ t8 B5 d) V  l
  644.         jz      cmd_ok0 f) J9 X( X* o  _0 o
  645.         loop    cmd_accept# n  M- Q: o. q
  646. - N( ]! q3 T; D0 S; t, d
  647. cmd_error:
    8 G4 f8 p. F7 X- z, q0 k: J
  648.         mov     ah,1
    3 s# ^% }7 N2 _7 S; a# k; z7 O  v4 V
  649.         jmp     cmd_exit
    ! Z+ G5 q" {% H# [: ?
  650. cmd_ok:
    ) x6 P4 a3 W" l
  651.         xor     ah,ah
    7 U7 y5 ]; H$ }" k0 F8 |1 m
  652. cmd_exit:
    . u% S( c3 Q, V  \
  653.         ret
    / n' i- e' @6 f& w% ~& a* t/ P) e

  654. 3 g/ t$ d4 W: k3 J3 r, ~" V9 k5 S
  655. new_33:
    9 d2 `! X. K, J! l* c1 `
  656.         cli# U, W' g# S0 v  u$ ?; v' t
  657.         cmp     al,0
    + |" |/ l( ]4 W# I
  658.         je      reset_mouse
    5 e) {; e: D4 G, c" I
  659.         cmp     al,1  L0 Y( {: j! C5 B5 b1 s# }
  660.         je      show_mouse
    0 w' t  A+ G( C' Q) B+ A
  661.         cmp     al,2
    / ~8 M/ q2 Q0 w
  662.         je      hide_mouse
    # U8 I. y' v1 N: `6 I
  663.         cmp     al,3
    + r# X+ @- j; _2 j7 s+ v
  664.         je      get_pos
    9 y& G" Z9 L4 e5 _( U5 U3 R/ m( d
  665.         cmp     al,4
    3 v+ `" A5 U9 u- Z0 E$ ^% ^
  666.         je      set_pos2 q( z" s$ X! Z0 u
  667.         cmp     al,7
    + B2 C4 ^4 c( m$ g, i3 i
  668.         je      set_hor_pos5 g% j( p$ s) B9 s
  669.         cmp     al,8' X8 Z" v3 K9 d7 X( M
  670.         je      set_ver_pos
    $ W2 F/ q9 c0 X1 }( i
  671.         cmp     al,0bh8 B# x+ A1 x1 w3 `* o  |
  672.         je      get_mouse_movement1 T/ x7 I" i. u! L* A7 K
  673.         cmp     al,0ch
    - H0 _: }  [3 s; Y& R* ?
  674.         je      set_subroutines! z7 H8 J2 g! b
  675.         cmp     al,14h6 P) y9 J+ y8 p/ M, X! Y* @6 w
  676.         je      swap_subroutines! j( J( p1 J6 q2 E) m, J8 V) `
  677.         iret9 B( [, e: Z7 ^: ~' Q
  678. $ Z9 }7 s8 C5 t" ~# C& v8 \
  679. reset_mouse:8 m. X. L5 e' ]+ T# m5 [% ]
  680.         jmp     _reset_mouse" K  ~+ C2 y8 B
  681. show_mouse:4 v1 D$ V- k, m* c( [6 `' e
  682.         jmp     _show_mouse
    : S8 Y" P. U0 C3 I
  683. hide_mouse:
    1 {5 [/ L% s7 X7 J8 d7 K
  684.         jmp     _hide_mouse1 ]2 _* R  y0 C, y0 ?
  685. get_pos:( [( N0 y  P. X$ v
  686.         jmp     _get_pos
    ; B; Q- T7 Z3 M0 @+ t
  687. set_pos:, k5 O  p6 Y, ^3 l5 B& Z. [& M
  688.         jmp     _set_pos
    9 q$ r8 p% K3 f- u. o  V
  689. set_hor_pos:
    2 `- x# z" p( c6 a
  690.         jmp     _set_hor_pos1 `8 Y6 c/ O& k# t
  691. set_ver_pos:
    $ K! ]* `" b7 p8 w( k1 O
  692.         jmp     _set_ver_pos" ~" V. w, U5 D3 l& \
  693. get_mouse_movement:( m+ n9 t$ R/ [) @2 {
  694.         jmp     _get_mouse_movement+ s5 U/ x2 e8 f6 T6 U6 _% H; w
  695. set_subroutines:" j5 q. r; A9 _/ x
  696.         jmp     _set_subroutines( C2 j; D! H5 m) N3 d8 v% f5 F
  697. swap_subroutines:
    1 L' I; _2 i  H8 S5 Y" e
  698.         jmp     _swap_subroutines* E; o% U9 W3 h0 K

  699. & k* a4 @+ J$ [  t. n
  700. _reset_mouse:
    ! B2 G4 S6 q  j; j1 L
  701.         mov     byte ptr cs:[buttons],0
    * O3 ^" L; u0 n/ l0 j9 Z8 O
  702.         mov     word ptr cs:[pos_x],03 c6 p+ r& z0 f
  703.         mov     word ptr cs:[pos_y],0
    ( G" ]7 T% ^0 |: t6 V1 h( j
  704.         mov     word ptr cs:[x_move],0+ N* b5 {8 b+ S: v
  705.         mov     word ptr cs:[y_move],0
    6 N% ~6 R& U, V% Z$ q& B
  706.         mov     word ptr cs:[x_max],639+ @9 m, P' x7 Y! p
  707.         mov     word ptr cs:[x_min],0
    ; f; h& t4 z* o7 W/ u% F
  708.         mov     word ptr cs:[y_max],199& @4 h" ?1 {# O1 ^; n
  709.         mov     word ptr cs:[y_min],04 W& Q+ y7 [  u9 t3 l6 }* M/ [
  710.         mov     word ptr cs:[user_mask],0
    " u1 J7 U4 E% I& q( a1 R4 O
  711.         mov     word ptr cs:[user_subroutine],0
    : z' ]1 k* L- j: d
  712.         mov     word ptr cs:[user_subroutine+2],0
    % p* l, Z6 v7 M) X
  713.         mov     ax,0ffffh# t4 S9 r3 ~: ?: J! ~
  714.         mov     bx,3* z: n4 @. Y$ S: S( H
  715.         iret+ t! y6 V# L' q6 Z, A
  716. . O$ J$ D6 L8 v1 z% a
  717. _get_pos:& R- ~- |! ^6 Q- I/ |( s
  718.         mov     cx,cs:[pos_x]7 [( @$ U! e% U' }3 V
  719.         mov     dx,cs:[pos_y]& w8 U) z* o6 ^# d2 ^  c8 v
  720.         mov     bx,word ptr cs:[buttons]
    / T. n' _; z" W* n( q
  721.         xor     bh,bh" @! ]$ Q! M0 {7 V# q; D
  722.         iret. n  t& M! E) H8 U5 ^5 l/ @0 K
  723. & W4 f! W3 W( d0 p& U
  724. _get_mouse_movement:
    & D% L' X# C6 h# x+ Q- Z. S
  725.         mov     cx,cs:[x_move]
    1 a1 x/ {" V! E: _
  726.         mov     dx,cs:[y_move]
    8 N3 f9 x8 J  R- {
  727.         mov     word ptr cs:[x_move],03 b# [+ w0 D& _  I
  728.         mov     word ptr cs:[y_move],0; J4 ^( J  y; l0 K; P1 {
  729.         iret% p! x& ~2 o# ^. L5 X5 }" x, _

  730. " K- G/ d9 z' z& k% M3 K  }6 V3 q1 }
  731. _show_mouse:& K, v5 s7 q% m( z/ W
  732.         push    ax, o3 ?5 p2 f5 w: Y2 r
  733.         push    bx
    $ E0 C- k' B' s6 E) D
  734.         push    di
    1 N% G# r( W2 I- d! v5 g
  735.         push    es0 C4 B  b7 G7 E1 i3 y
  736.         mov     byte ptr cs:[sm_flag],17 P7 Q' T# w# H9 c" j4 L
  737.         mov     ax,cs:[pos_y]
    : g8 }  ?* A1 U8 n. C
  738.         shr     ax,34 K% K  N) f# ^! l7 D
  739.         mov     bl,80
    7 s" h( r4 j) l; z) U
  740.         mul     bl
    # K6 s$ T0 M2 P' J4 z3 D# r8 z
  741.         mov     bx,[pos_x]2 [4 W" b& }- t' {& P' L; U" ?1 c
  742.         shr     bx,3
    1 @& I+ q9 [. J% e% q. z% u
  743.         add     ax,bx
    - R! w0 g5 ^5 ]8 c7 r' {
  744.         shl     ax,1& I  w. d  {* f+ a; v# C% I
  745.         mov     di,ax
    ' K* A: h2 r/ G7 Z  `
  746.         mov     ax,0b800h) ?. A% z& t9 S/ D. L$ B9 W
  747.         mov     es,ax- c+ C# L! r  ^, O
  748.         mov     ax,es:[di]# w+ q8 J: S5 a& L6 t9 l
  749.         mov     cs:[save_char],ax9 x& R2 R/ H" b4 H& |3 _
  750.         not     ah
    & g: a$ Q3 s2 \7 h7 |$ O% [3 _0 O
  751.         and     ah,7fh- @0 p! s8 \  L( i$ {4 D4 R4 `
  752.         mov     es:[di],ax
    . Q% ?1 }6 j; G; s* Z! I
  753.         pop     es
    2 V- [, m* j# ^- h& u, E5 i
  754.         pop     di- D) {0 m( {2 F# o6 s: t
  755.         pop     bx, o. [9 J' d5 _8 q+ m$ ?
  756.         pop     ax, t$ O6 n3 Z/ N' D2 R4 h
  757.         iret
    ( l& C1 {3 M7 V# Q
  758. 2 X* d2 J! g8 m: \
  759. _hide_mouse:
    0 O3 n& B' M9 m; U5 \1 H- G8 x% d
  760.         push    ax' S- B0 r/ O* V% N0 M/ J
  761.         push    bx7 M: ]! |: {) y8 q" w
  762.         push    di# a3 G) C5 R2 L- V+ |" Z
  763.         push    es6 m" n# L& X; @! Y2 `* u/ s
  764.         mov     byte ptr cs:[sm_flag],0# Q8 _+ P& Q/ T: {6 b
  765.         mov     ax,cs:[pos_y]1 i. y6 `0 Y/ M3 ?% e
  766.         shr     ax,3
    ! P7 [! c- a5 b
  767.         mov     bl,80
      y4 c- J3 g; H4 `
  768.         mul     bl: M9 d4 t; o3 c: G/ D" c
  769.         mov     bx,[pos_x]0 q6 a+ o, r5 g' Q; V& ]2 A3 m
  770.         shr     bx,3
    0 R4 `) v/ C( n. k, B5 x
  771.         add     ax,bx) T! {# ^4 w& ^- F
  772.         shl     ax,19 e- e) ^. {, k. [
  773.         mov     di,ax
    9 L* X$ Q. Q5 k; T& x
  774.         mov     ax,0b800h  U7 {+ i' o/ V5 ?4 d) G; a7 ?6 z% G
  775.         mov     es,ax
    * Z" ?) G* X& g3 q7 [, Z& G
  776.         mov     ax,cs:[save_char]
    3 `# z+ q8 [% |, t$ J+ n# U1 Q
  777.         mov     es:[di],ax
    0 P& r0 |: b. h7 e7 [
  778.         pop     es
    1 \  a0 x; I9 R% F" U7 ~! Y# b
  779.         pop     di
    5 [3 W+ B2 K: H$ s/ K( p" F
  780.         pop     bx
    5 C& i3 a# p. k# J5 `: g$ h) C5 `
  781.         pop     ax
      v" \! ~# ^- s2 f2 H0 e
  782.         iret3 i7 {: B- ~% e$ l, Q
  783. 8 `0 A5 ]2 L' f% M
  784. _set_pos:/ ?0 B" p9 `" S, ~
  785.         mov     cx,cs:[pos_x], P# E5 g9 D+ L9 F
  786.         mov     dx,cs:[pos_y]
    / G, f0 z$ t1 w) P; s* K4 D
  787.         mov     word ptr cs:[x_move],01 \/ A; @- [' o: ]. Y) f3 P
  788.         mov     word ptr cs:[y_move],0
    , ]0 H4 X( O, s% G8 g; ^
  789.         iret  B; G  ^9 b2 O, _! H( q; L: l6 a

  790. $ I$ F9 e1 \* P! K5 X$ x
  791. _set_hor_pos:  s/ R7 N+ K$ d" O8 N, f' ]$ R
  792.         call    max_min
    ; C$ o: b  g! h3 x( Z6 V/ N
  793.         mov     cs:[x_min],cx
    / r) p" |$ U5 O6 m! Y
  794.         mov     cs:[x_max],dx
    ' y! B$ b- z8 Z0 P$ |" l
  795.         cmp     cs:[pos_x],cx
    $ I% ^  Y0 {6 {( C- l
  796.         jge     good_hor_min
    8 O  ~- z! k" _5 I- E8 Z- l
  797.         mov     cs:[pos_x],cx
    ) ?1 w. {8 g, @  o
  798. good_hor_min:% Q) G1 a& Z3 `& j! o2 f5 u/ c
  799.         cmp     cs:[pos_x],dx
    9 b: M) u. b: L
  800.         jle     good_hor_max
    2 R6 |  H. E' Z# ^5 E
  801.         mov     cs:[pos_x],dx0 r1 o5 X" r8 F* j" b
  802. good_hor_max:/ \- a! V9 A  R  _
  803.        iret: n/ J( T! X- [  c; z6 ]. Y
  804. + O( w5 U0 s5 A. J2 k5 k! ]
  805. _set_ver_pos:
    7 D8 F1 N; y' z4 E7 p* A
  806.         call    max_min3 G+ B$ W6 n$ i: K& u9 s9 ]( \
  807.         mov     cs:[y_min],cx! D$ Y; n" F% z
  808.         mov     cs:[y_max],dx7 ?* W8 s  M. c9 t4 q4 E
  809.         cmp     cs:[pos_y],cx5 L* L8 y! B1 W- T  O  R/ u
  810.         jge     good_ver_min% x* z& K! x& h& A
  811.         mov     cs:[pos_y],cx
    / [2 M3 b: f1 j9 o4 w, |
  812. good_ver_min:( h0 X5 E0 u% G. |6 `/ ~
  813.         cmp     cs:[pos_y],dx
    % W9 b9 y, o3 s/ @4 J3 @/ N: K
  814.         jle     good_ver_max
    + d' ?7 E# J0 o! p
  815.         mov     cs:[pos_y],dx5 ]* Q' W2 u1 L4 x5 W) @- ?
  816. good_ver_max:( q" ^& E+ _/ u, J% n# Q/ e. G+ `! m
  817.         iret
    ) t9 r5 ~4 n% G5 ~- a& k
  818. 6 p- g5 W# e5 Y# I
  819. max_min:5 T! p0 l$ l5 t& R5 L5 e0 T; w
  820.         cmp     cx,dx$ x+ ^5 G2 _* r8 P8 f5 C; p; k6 M
  821.         jle     no_swap7 `" h# k( Z$ v! ]1 |# N- |
  822.         xchg    cx,dx
      a. Y; `1 [. |: P2 w0 ^
  823. no_swap:
    # K8 P4 V3 @. |3 J
  824.         ret7 R, B2 B! q7 u
  825. " a- ~. e3 [+ r3 E$ n
  826. _set_subroutines:
    / B, m3 ~; L0 ~
  827.         mov     cs:[user_subroutine],dx
    9 W. j" E1 V: j
  828.         mov     cs:[user_subroutine+2],es
    8 l% q4 p6 Y/ @" x# O3 K
  829.         mov     cs:[user_mask],cx
    7 t" d( f. [: W8 R8 o% }, d( L, Q  b
  830.         iret
    ' {. ?5 h$ j' \4 v6 W
  831. 3 K) G2 Q+ n& d) Q# F% K+ c
  832. _swap_subroutines:
    + d* f6 u+ O* s& q+ S
  833.         push    word ptr cs:[user_mask]
    9 o! w* `; y- o8 O4 E' Y
  834.         push    word ptr cs:[user_subroutine+2]6 o, M5 w0 O- x8 t0 \9 E) [6 H
  835.         push    word ptr cs:[user_subroutine]
    . ?/ }( e7 h* P: f* r
  836.         mov     cs:[user_subroutine],dx: R0 ]* Q! J9 c" E7 a5 Z; \
  837.         mov     cs:[user_subroutine+2],es- C$ n6 a2 G. m2 z% W2 i
  838.         mov     cs:[user_mask],cx
    , ]8 X( q2 |3 r2 s$ f
  839.         pop     dx7 W* E3 z0 [! f' k4 O
  840.         pop     es
    " u5 r. w8 D8 G! I1 }
  841.         pop     cx
    , ]% p3 r: ]( O: @$ s9 `( w9 G
  842.         iret9 J: ?- k) c' _3 @0 _$ B4 |8 A

  843. ! L8 Q* d6 u# z; U
  844. memmouse        endp
      S( V* R" Q8 y6 S4 p3 H+ z

  845. 5 e1 o; e: Z8 j1 \& a/ c7 @4 A7 s! ]
  846. endof_start:% D9 h6 z+ ?$ ~& Z4 u9 y7 D( I, |

  847. ; G. P9 e7 y( ^7 W5 l
  848. emsg db 'No mouse driver install error!$') a2 g- c8 N1 d
  849. old331 dw 0
    5 U0 k  N7 `2 ]) u
  850. old332 dw 0
    0 T( j/ q+ F+ i% S) Y
  851. old741 dw 0
    2 \( V9 P7 ^1 v. C  {5 z
  852. old742 dw 01 [& {% ]7 O4 N& a
  853. memcopy db 0
    + u9 \7 a7 F! j- x
  854. okcheck db 0' d/ E! t4 Y: H) i6 H8 y7 |
  855. pass db 0# Z/ M, j2 Q7 v$ {
  856. chkl db 0
    ( O  d* ?$ S9 w0 U- @
  857. lk db 09 }$ [4 O/ j5 S8 h- a& ~5 n; _
  858. chkr db 0
    , h8 l3 J+ d  g0 o, V) D' d+ {
  859. rk db 0& k" L  A) ~# B& Q
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    , v' o  T- ], N) {# X  P
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    / E% i6 O7 S  P: |3 W/ a
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '& S3 R- N. i8 z9 }& e
  863. db '                                                                                '7 w7 \% L) ~+ Q& t+ W/ b9 m
  864. db '                                赏屯屯簧屯屯突                                  '+ n3 `4 e2 `: b# l' [3 o
  865.         db      '                                ?OFF汉OFF?                                 '% m3 c1 [$ L5 J0 R, W. i5 `
  866. db      '                                韧屯屯既屯屯图                                  '& k) f" U0 i* |/ q0 F
  867. db '                                                                                '
    * ?" \0 y" P" P; [, c1 a
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '! A: w- L& o& @* O" I* ~- P
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    5 l- n+ n4 `! m$ J$ u+ L
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '# t1 L6 a/ \1 i
  871. " L; d2 P' ^# A
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
" ]- X8 x- x- z4 S: U哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
& c' I; }* `8 C! O* ]3 U0 \% x" A& J: w- q4 p' ]
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-15 20:42 , Processed in 0.064253 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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