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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
$ P+ y" ^- G( P* J* w9 H
3 s" i, ^! a( q$ g代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    ) p: y6 |3 I& c4 L) ~" M( X/ W/ R
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    3 e- C, X  B( E8 a% K
  3. ;                                         By Bini.Yi 易祝兵
    , W! y  M$ s  w
  4. ;                                         http://www.ufoit.com 计匠网
      G" l, t3 w' j: x
  5. ;                                         2002/04/06 YYYY/MM/DD! C2 h9 O* d( C9 c: {
  6. ;
    7 I# W, H6 T) ^& F
  7. ;          ) e9 G3 q4 z  C6 M! m& Y
  8. ;          This program  test the mouse button  click and move., j. O0 [9 N+ \: ~1 `
  9. ;
    2 M5 O' U$ B. y8 ~* H- I, v# A9 F

  10. / M0 X4 Z3 C2 n. K' a' r3 ~6 h
  11. .model tiny
    . G" f1 w+ w4 ]0 {1 T6 I
  12. .5867 e$ D' V' g' d; ?2 C. V& f# Q( T+ i
  13. .code
    1 A: v; l& y9 b+ |
  14. .stack  100h' s) l3 V* Q9 f, C6 Z9 s6 x
  15. .startup
    ) H" A! P. ~$ X4 z0 ]( n# I
  16. pusha
    8 g4 `) l6 w6 h; ~) i& p
  17. mov ax, 3533h9 X3 Q6 p3 H6 p' L0 R# c5 [
  18. int 21h" U% S6 w6 q" O5 h/ T
  19. mov word ptr cs:[old331],es
    + m" S, }3 D" y1 R9 k& X! k6 C
  20. mov word ptr cs:[old332],bx+ g+ F, ]- B; ]
  21. mov ax, 3574h
    / {0 E" L& t5 j; n
  22. int 21h6 z! I. P6 [0 i7 z% z. Q1 C5 i
  23. mov word ptr cs:[old741],es8 y" C* ^* A& ~) S6 ^" @! f2 X
  24. mov word ptr cs:[old742],bx4 h2 N9 _2 Y5 i" P9 v- T" D, i5 N
  25. popa
    - U% D1 g' t2 }( f0 ^- Q2 N
  26.         call    memmouse1 g  |, w, ]7 T
  27.         mov ah, 003 h" p0 {1 }" w& L# i5 h) k
  28. mov al, 03
    + y7 J6 o% p) o# s4 K9 T
  29. int 10h
    ; b2 [1 r) Y* R6 N9 }7 d
  30. mov ah, 060 _" l% s7 L: v& {6 ~7 P( T
  31. mov al, 0, n0 X  k. v* }$ p8 d" u5 x% q- J
  32. mov cx, 09 g. E# N- f# W: k: M5 C) V; v
  33. mov dh, 24" X) c6 N/ e- ?- A/ R0 s; ^8 Y, q5 U3 w
  34. mov dl, 79
    & O- R, H; r' d
  35. mov bh, 07h
    ) M4 q; r7 o8 s# M' z" y  _, {
  36. int 10h6 o: p. A: G0 z# u, a
  37. mov ax, 0000, J+ u# n5 e* ~: w. n+ P
  38. mov bx, 0002
    " l0 e1 Q% X* u1 v
  39. int 33h) c% c3 N+ {5 ]1 w. T
  40.         cmp     ax, 0000           ;if no mouse drive install
      v, l+ o- Q7 j& l) m3 A; |% o3 R
  41.         je      errormsg           ;show error MSG
    ! X. p) \, I$ F
  42. mov ah, 02+ y" M5 c' K9 j' q  A8 R8 W% v. f% c
  43. mov bh, 002 t* U3 {; F/ c  b
  44.         mov     dh, 25             ;Move point out screen
    7 R/ e4 O; H0 s
  45. mov dl, 79
    ) Q3 Q$ C! G( g+ M. |2 T4 I
  46. int 10h" L) d1 K5 I! e) r# m2 y
  47.         call    showmsg            ;Show info' f4 e; C+ X" ]
  48. mov ax, 0001
    * l# i: ]9 m- Y( ]- _& X
  49. int 33h
    : A, c! D& S! R6 g$ o
  50. ; mov ax, 000ah
    " Y3 n8 F% c; K; T( x+ Z* V  W
  51. ; mov bx, 0000# F2 m7 a( K) p/ {" R, p
  52. ; mov cl, 0h* l+ k; ]! ^9 N( ?) k
  53. ; mov ch, 0F0h
    6 k3 S0 T9 O  R5 h& y0 T3 S$ I
  54. ; mov dl, 0h, z- h: S7 H+ D, H9 P: U  ^* ^8 Z6 T0 r
  55. ; mov dh, 0F0h$ u$ T, n" z" e" ]
  56. ; int 33h6 [: y( ^8 [6 [9 v' B7 Y( B+ _
  57. mov ax, 0004h
    , S( G3 K/ ^" }# e+ f" ]" `
  58. mov cx, 0319. L' C4 ]3 d7 J% \1 N$ e
  59. mov dx, 0103$ e2 E* |( y( N1 K: A4 Q. Z
  60. int 33h8 S8 |8 F0 @% `0 D) P- U+ v+ x. [
  61. casemo:                           ;Case button click and point move
    ! V# W# g, A$ d. Y; H% w5 b
  62.         mov     ax, 000bh         ;and keyboard press' {, _! `/ j4 ?$ \* \( H/ y+ q! ?
  63. int 33h) w* ?+ @7 e1 @
  64.         cmp     cx, 00h           ;if point move....X
    , V5 _/ g. U" q* c
  65. jne xmov
    8 H- E& A$ K  x; N% {
  66.         cmp     dx, 00h           ;if point move....Y+ L2 t7 `8 K# v! _+ X: r+ o
  67. jne ymov9 n$ @9 j6 W# \( G1 r; T2 g; r
  68. xymovend:                         ;X.Y move end
    $ u! C; i0 r! X' p: s
  69.         mov     ax, 0003         
    ; O% G; M/ q  U8 K% }% m5 R
  70. int 33h1 _( N% |' ^* t- R8 y
  71.         cmp     bx, 0001          ;if left button click  show ON; r/ k" W- r3 @/ n5 ~* m, [# p
  72. mov si, 1828) w/ p7 V9 ^( C0 s3 |
  73. je listl: K6 p1 z$ B) ]* g! `6 X
  74. mov si, 1828
    7 p1 B$ o+ C5 X- T1 R0 {( e/ ^, S
  75.         jne     nlistl            ;if left no click show OFF8 ^- j3 R) U, @# x% k
  76. testr:
      N: _9 z' G" z' |
  77.         cmp     bx, 0002          ;if right button click show ON, X/ @  N9 `$ H& [" f* u
  78. mov si,18425 g1 [* p  R" i+ Q+ y' G
  79. je listr8 q5 s5 G+ Q% i
  80.         mov     si,1842           ;if right no click show OFF# i4 e0 s' [  v. K" r# M+ s
  81. jne nlistl* A3 _* B% J7 g3 t. d
  82. casekey:' A9 {7 q+ n* @4 _
  83.         mov     ah, 01            ;if any key press jump check9 k4 M+ O( _. l, k6 N- Q
  84. int 16h
    7 ?9 n# r# |! n  T: U" x' X+ L* p$ w
  85. jne kpress
    2 f6 M' P8 Q4 g- s. C! o
  86.         mov     al, [chkl]        ;check x flag- `2 Y8 m( S6 g7 p7 [
  87. cmp al, 02h  p) U  X9 v& ^# I1 K* n
  88. jnb chkok  ?+ A1 l) v# }0 j! F0 X
  89. jmp casemo0 B  q! J1 e* I( z; X
  90. xmov:                             ;if X moved, get the X flag+1' y' y& ^" A: R
  91. mov al, [chkl]
    1 R+ x5 N% V4 ?- f9 a# n
  92. inc al
    % A* C& s! i( S3 A& b& S0 S( M& ]
  93. mov [chkl], al4 _$ y0 E# J- f3 f
  94. call passok$ u* d: C  {+ \9 K: W1 R
  95. jmp xymovend
    * a1 b+ c& I( J0 l. R- F2 B+ X9 H
  96. ymov:                             ;if Y moved, get the X flag+1. z% h1 R9 \; ?1 I# d
  97. mov al, [chkr]. A$ w5 g/ [; O' \! e
  98. inc al7 G- @0 L4 C' \
  99. mov [chkr], al1 v6 I& A! Y% \+ z" |3 D
  100. call passok
    $ d1 G' Q  n/ H. G% m
  101. jmp xymovend
    / r( M: j* `/ |
  102. ' D1 l; [/ t2 P
  103. passok proc near
    * E3 ?; q6 H8 Z$ k" G' z7 M
  104. mov al, [okcheck]
    " B' w9 A, ~0 ^* P0 O8 }* M/ q
  105. cmp al, 1
    ) e. {2 y- P$ T$ K( G
  106. je let0% u* ~7 t" a  l4 S9 I9 U
  107. jmp passret
    " ]- I9 |0 r& z$ K$ ~6 \
  108. let0:
    ) Y# x, s+ `1 X; N' Y
  109. mov [pass], 1
    - B1 ~8 j9 |7 V3 i7 D
  110. passret:
    ! T9 `& o4 \! @6 O0 ]% g. |
  111. ret8 ^+ y5 \; e' E  `# E% g* Y
  112. passok endp
    / u3 G) t. N: ~1 _5 z2 @
  113. ; N; G9 g/ a/ Y! ]1 c
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS& s6 `; W# l/ `- f# e. y
  115. mov al, [chkr]- e+ _; t- c- V$ G% ~/ `+ |
  116. cmp al, 02h1 A4 x% g/ S! T5 @) g7 I7 r8 m. V
  117. jb casemo
    2 m/ R( F- ~* M
  118. mov al, [lk]1 E3 e$ a  [: j& L) P" N2 \
  119. cmp al, 1
    $ Q9 v% X5 a; b* ?$ ^0 B" C
  120. jne casemo) y) S6 p; s2 g4 ~3 j9 @
  121. mov al, [rk]
    ' {, f& `# d2 q/ `
  122. cmp al, 15 A9 X$ j3 ^) ]: O& I3 k% W, i- d1 F
  123. jne  casemo: H2 K- M# _+ [. g
  124. mov [okcheck], 1
    , A" @2 }) g# Z; B0 b1 P7 X! T7 R
  125. mov al, [pass]
    - M! i# ^6 v7 c4 i
  126. cmp al, 1" ?, C* c/ x5 y1 K5 s& O# w
  127. jne  casemo
    6 i: d7 b+ o+ w9 H( w3 Z
  128. mov ax,0002h! S* t4 e8 w5 N0 d8 D4 N, {
  129. int 33h) F) {0 s4 T( P; M% v! \
  130. call cleascr
    7 J, N7 r( l/ l/ f3 M) q, W7 G5 ]
  131. # x' H$ t) e9 Q$ R" i) x
  132. call oldint
    * C  P" O3 r0 j( W
  133. mov ax, 04c00h! p9 ?( q3 E' x. N$ b
  134. int 21h
    ' o: z! r7 v, {( E5 x

  135. ( H  }2 b, W6 _# n# c
  136. okexit:
    % Q: x: F3 ]/ H( T. O9 m
  137. mov ah, 4ch
    & p8 ~! ?! }$ @9 n
  138. mov al, 0
    9 w5 M) w, I4 T5 C/ v
  139. int 21h
    # N% l2 r9 f2 ^# k0 G
  140. listl:                                 ;Show ON9 j1 `) ?9 e, M
  141. pusha- n& p; P! [/ R) Y
  142. mov ax, 0b800h& V, c7 \  V; r' o& C8 E
  143. mov  es, ax
    " K. P  ~8 ]" N2 C
  144. mov ah, 47h, c* r* u" w' @" c' y
  145. mov al, 20h
    + A* s: W+ k% U! q* ~1 s
  146. mov es:[si], ax
    8 G  g: Y& G# E8 D
  147. add si, 02
    3 z/ u# C0 b: ]$ A& \
  148. mov  al, 4fh
    9 o5 m5 D# h+ v3 X* h9 ^
  149. mov es:[si], ax
    2 `$ r. h' S" {0 b6 V6 V
  150. mov al, 4eh: y0 A, s5 r9 L  l+ }4 Q
  151. add si, 02. i7 t9 A1 O, @+ D& ?: q3 C! X% M1 R
  152. mov es:[si], ax6 v2 U7 ^8 u1 ~: s% |: T+ k
  153. mov [lk], 1. |2 a( x1 C- I
  154. popa, }+ F1 c2 F! \8 `, H9 T1 {
  155. jmp testr
    & S% ^5 v8 c8 b6 T0 n
  156. listr:                                 ;Show ON
    2 ?/ H3 j1 c, n; E' O: B  p# P2 K6 C0 D
  157. pusha) h9 m( V- g4 E( A
  158. mov ax, 0b800h. d; V) W0 \/ n. J1 ~
  159. mov  es, ax0 |& E/ {. `0 F
  160. mov ah, 47h
    2 ?6 `+ M, q9 ?6 o' z
  161. mov al, 20h8 o7 L3 X5 j  M1 b3 |3 w
  162. mov es:[si], ax6 ]  ~, c% C5 F. Y( A9 W. u' `# L
  163. add si, 02
    . ~! c; D5 D) d" |; e2 c5 o
  164. mov  al, 4fh) H; ?6 k' G; B( e& e
  165. mov es:[si], ax, u- B4 f% l0 |3 D
  166. mov al, 4eh
    7 i( j" A7 r; u& s/ t  i% N
  167. add si, 02
    % G: }$ _6 c. P
  168. mov es:[si], ax1 g9 N% p& a" B0 m. m! E# J
  169. mov [rk], 1' }( G  |% v: `: J4 Y
  170. popa
    1 z% w+ |# c. w5 |$ X
  171. jmp  casekey8 }! Q, S; f$ g+ }7 j
  172. / U7 b8 ~; U4 p4 @3 }7 K/ K
  173. nlistl:                              ;Show OFF
    + B+ B8 U7 Y. |3 K7 l! ~% D
  174. pusha   
    2 T1 X& R  F& Z" j
  175. mov ax, 0b800h/ |+ o8 r# A, ~# M
  176. mov  es, ax% r. n- l7 `* \# d
  177. mov ah, 17h+ |5 d+ J3 V" {  D& F0 t5 b
  178. mov al, 4fh1 q( X1 N5 B5 b( @0 C
  179. mov es:[si], ax
    & s/ a& u" P$ Z+ b6 P
  180. add si, 02
    0 d& L3 T# C  ^4 I5 R1 ~
  181. mov  al, 46h* t) B) E/ _: h5 W& t9 d/ ]7 k1 V
  182. mov es:[si], ax4 u. @/ y$ E% @1 z
  183. mov al, 46h
    ) c  n) [4 e. Q  I$ Z
  184. add si, 028 E$ |5 A( F  q% G1 q  B  p8 X
  185. mov es:[si], ax
    6 i% V# q& D. G. ?
  186. popa
    4 F! i% O% y: C8 d# P1 o
  187. cmp si, 18402 b# x& M+ N/ K  X* U& M
  188. jae casekey: U/ c- [3 {; L
  189. jmp testr
    , y* k8 Z1 ~% h4 p* X
  190. - R2 F/ a2 C$ w
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    5 n! ?$ u$ }, n; l
  192.         cmp     ah, 01h             ;and return a error/ \" J' i; X* U! S. g: l
  193. je exit1* M& L# M4 w' y  y
  194.         mov     ah, 0ch             ;if press other key then clear, l- n# H: n1 R- r' N; ~
  195.         mov     al, 00              ;keyboard buffer
    " G6 k- v3 Q5 E4 y5 r; G; h9 p
  196. int 21h7 a5 |; |& v' |) ^
  197. jmp casemo
    # ^2 K0 F3 g& B$ {9 [
  198. ( y4 Q, K. S) z  ^
  199. errormsg:                           ;if mouse driver no install: o% Z; n2 |) z& D& w8 `
  200. call oldint( A3 R  \* F0 s0 Q" }; t* A
  201. lea dx, offset emsg
    : U  i0 F6 k( k1 N/ N. k
  202. mov ah, 09h
    ) Z5 ]9 a6 h2 S5 \/ B1 `
  203. int 21h
    4 k- b! A0 W, G4 `. ?" r
  204. mov ah, 4ch
    * b- a% s, t% b
  205. mov al, 20 ^- }( w6 v, U% K/ d; K
  206. int  21h8 S2 ~$ [+ Y* o0 |( o8 t

  207.   t7 @/ I& r) G4 {
  208. exit1:                              ;error exit
    - O1 V" u  d% Y0 p' W- ^
  209. mov ax, 0002h$ ?0 m9 Q- O4 _* ]
  210. int 33h% C" m7 x7 z0 y( n3 K9 M
  211. call  cleascr
    $ ~5 B4 }4 q, N
  212. call  oldint0 R9 O& z7 n. W; m
  213. mov ah, 4ch
    $ I; X8 g6 M& a+ T, s( Z# Z% R
  214. mov al, 01- Z- F0 p; q6 Z
  215. int 21h5 g# X* b, V7 R  s1 S5 x' g, Y& w- [- J

  216. 2 W( D* U. T9 o; y2 y& v* h
  217. cleascr proc    near                ;clear screen
    : I0 @5 e; p+ f9 T3 f4 `
  218. pusha9 L% k% O4 i$ S; ~* r
  219. mov ah, 06
    6 }8 J% X; }6 C( q
  220. mov al, 0
    / E: l; l( G" l2 G8 c5 c4 \0 }
  221. mov cx, 02 M5 W- Z& o% y7 ?7 J
  222. mov dh, 24
    2 s; u* O6 d) r9 N# Q, n
  223. mov dl, 79+ \* K! b/ `. P2 n
  224. mov bh, 07h
    , q" D, t; S$ j6 X* a  a2 g& f
  225. int 10h
    7 [. ^- ~# H% K3 @
  226. mov ah, 02- A: }0 T1 ], N, X) ?1 b$ {9 I$ O
  227. mov bh, 00
    ) m0 r! F1 Y1 Y& J6 x- o3 T
  228. mov dh, 0
    ' \4 T6 y- v7 A1 @  f4 g
  229. mov dl, 0$ E8 i. \8 W1 S" D8 @* T2 s+ Q
  230. int 10h
    8 k# b# C: j; \+ X% P+ b
  231. popa
    2 I! M$ F, U1 q# Q& }, S
  232. ret
    2 [& u9 s! R& m. ^
  233. cleascr endp! {& N$ K. {+ t7 y5 H
  234. : {) k; ~$ c, w( A
  235. showmsg proc    near               ;Show info) M& o0 N: R6 u: A
  236. pusha
    + q) b9 u# [! a1 D& d. V0 [
  237. lea di, offset showms
    , n; Y5 @9 ~. d& K6 W4 E2 x; q
  238. mov ax, 0b800h- ?2 R+ q- ]# n$ q
  239. mov es, ax
    2 W7 i4 m$ T% C; v
  240. mov si, 0
    $ o$ T* m2 Y' U* i/ P. [
  241. mov cx, 480
    / W6 W$ V/ \" y: |8 a! F# Q
  242. mov ah, 07h
    ; t# ~* D) `0 g3 B# m8 h
  243. @@:' F+ Y' i) C0 [+ d4 o
  244. mov al, 20h
    * p) p  k7 E$ s5 y
  245. mov es:[si], ax
    ! N5 _2 |- K$ h; ]4 q
  246. add si, 28 l" i! E4 I: v' y4 U
  247. loop @b
    - z; Z- }: K; K
  248. mov cx,880
    ; U5 k4 B, {7 P! o1 A/ \
  249. @@:0 ]8 L$ k2 a7 R0 [
  250. mov al, [di]
    ; e* F. h7 T3 U! ]
  251. inc di7 r1 b' B8 m! J
  252. cmp al,20h
    2 z$ N8 l) R# v9 s! Z1 Z3 v. k; h" i+ U
  253. je showch14 P0 L# p, i( J  k8 o& _: j5 Y
  254. mov ah, 17h
    ; V" @8 M* r( S7 ]+ ?' j
  255. jmp showch3 - V4 K: Q0 M9 }: _* R; I3 A2 g/ P4 _
  256. showch1:
    ' h: j" P4 y# i4 U* c. J1 y' I" O
  257. mov ah, 07h   J. d9 p" n+ Z( o. V# n( D
  258. showch3:4 C& V/ i  `  e& y7 i, ?* y9 q  A
  259. mov es:[si], ax
    6 k; Z$ \1 }9 r5 n- _8 w4 n3 k# R8 f
  260. add si, 2
    ) _/ q5 I0 c3 y" v, Q  T
  261. loop @b
    6 D& O6 C, s) P# k/ k' j! w- m
  262. popa
    , w/ s$ n4 l( ~9 V2 C
  263. ret
    % O/ P. i( O$ O) g3 n# v3 Z
  264. showmsg endp0 h4 ^# [' X# H! C" z
  265. : {) Z7 l, L. _/ P
  266. oldint proc
    % {. }% \0 V; l3 d- V
  267. pusha
    + s1 f$ ]# p/ `0 Z
  268. mov ds, word ptr cs:[old331]% G0 c2 P$ x- o1 |  Q6 V8 }5 @
  269. mov   dx, word ptr cs:[old332]
      y1 u5 C* s' Z0 u( x$ P" a  y! p+ K( ?1 M$ b
  270. mov ax, 2533h
    , H+ @" V8 w( V  r* S0 N
  271. int 21h
    9 p; y0 T3 ?5 r% X- a
  272. mov ds, word ptr cs:[old741]9 F; R! B  ?4 _7 ^( H( u4 w( s
  273. mov dx, word ptr cs:[old742]* [  |( A* `' H9 l' `
  274. mov ax, 2574h
    $ {  k0 b7 y; M9 ~# |5 `
  275. int 21h
    ' ?- G0 x' _! y
  276. popa
    - X9 X% \- l8 g
  277. ret7 m" q& \- N$ {" ^- d( Q
  278. oldint endp
    6 Y$ A' Q/ v/ ~7 j! T- S7 E  c

  279. $ k* E! x( w& [% W5 ~, |, b3 I" h
  280. memmouse        proc
    9 w- v: n& ~9 c2 e; z
  281.         xor     ax,ax1 x: p9 A  G0 X! \+ m' \! k
  282. int 33h1 ~) T% q) v7 I
  283. cmp ax,0ffffh
    3 D& `+ j" U4 \& R
  284.         jne     not_loaded
    # Z. B* H+ L  o5 f$ H& S
  285. mov [memcopy], 1) O0 P- {$ C4 C5 D6 d& _0 _6 m: u
  286. ret5 u0 e; X" m9 }- T& @7 ]

  287. ! d# V1 B5 j* E7 ?
  288. not_loaded:
    5 r7 i( K" i; j/ S" H% G

  289. 6 `$ o; W% }% V' t  W
  290.         mov ax,2574h' Z2 ^4 A) H1 ^0 [7 J+ U7 k
  291.         mov dx,offset new_isr& e: D! ]4 P& Q9 Z! f( i
  292.         int 21h
    & y* ^: i- V2 w- S

  293. ' O, n! S6 p9 P
  294.         mov ax,2533h
    + S0 T/ u4 A; v0 F- i
  295.         mov dx,offset new_33
    % m8 N' t0 ~4 d
  296.         int 21h
    % v" N7 m8 m, V: p; D
  297.   L) |0 z" g1 f/ N. \' z& ?
  298.         cli. c  j/ E5 L) c
  299. # ^, P1 a5 p# o% T8 H
  300.         mov bl,0a8h
    9 j5 D, V4 `9 T: X1 A, H
  301.         call keyboard_cmd2 g( V* u) ~5 k4 U7 d. h/ \
  302. . E7 d. Z; R; [, _
  303.         mov bl,20h
    9 Y9 i4 }  W. X9 b+ }
  304.         call    keyboard_cmd
    ' r$ B5 h* H( D
  305.         call    keyboard_read
    0 _* L# v% A9 d; o9 S
  306.         or      al,2
    + u# \' }& k, K' y5 G( u
  307.         mov     bl,60h
    1 d% o* [% L) [
  308.         push    ax
    % A  R' U2 h' a+ w6 B8 v
  309.         call    keyboard_cmd
    % J6 M1 V. j5 h) V; a
  310.         pop     ax
    " f6 ]3 [' c. C, ]
  311.         call    keyboard_write( ?6 V2 E& x, l& M' u- ]% E

  312. * u# `; Y* {5 e3 a& i6 w4 [$ h
  313.         mov     bl,0d4h4 w3 p7 l* ~& r% s% u! w
  314.         call    keyboard_cmd
    " w: Q3 m8 X8 Q; b$ ]9 X3 w
  315.         mov     al,0f4h
    2 {+ R; J: o1 l/ W# ~8 o
  316.         call    keyboard_write  r& c4 i3 Y3 n; m
  317. : |) c7 s& [( c- V3 V1 K$ L$ d
  318.         sti3 p" f3 H! L  Z; d6 x+ ?( V4 n6 Q
  319.         ret
    ) [( B6 s: |8 F: T9 e  |4 Q% ^
  320. call_user_isr:
    % i$ |5 r' P+ }- C$ ~
  321. db      60h0 }2 Y/ c2 ?4 R7 D  O
  322.         mov     cx,cs:[pos_x]1 f# D8 G# W! D8 x, F
  323.         mov     dx,cs:[pos_y]! R3 h8 w# M% |8 p1 l
  324.         mov     di,0 ;cs:[x_move]
    7 b- T" [% G: V; e+ R8 B* C/ M8 {
  325.         mov     si,0 ;cs:[y_move]- b( C" v/ \$ C' W' q* K
  326.         mov     word ptr cs:[x_move],0
    0 T$ |; ^* A6 o  D1 I' e$ f# L
  327.         mov     word ptr cs:[y_move],0
    , N  d# }2 }9 ~* w% z  k- A/ ?
  328.         mov     bl,byte ptr cs:[buttons]$ X3 S4 B% S2 K+ t! d
  329.         xor     bh,bh
    ' t4 Z4 D3 `- d: P  n
  330.         call    dword ptr cs:[user_subroutine]
    ( ]2 q/ y9 v% V* d9 O3 @) f% |+ I
  331.         db      61h
    8 ~9 s1 _$ }9 _  v3 `1 J' t
  332. ret% Q+ ?9 j* N2 ~4 }
  333. new_isr:
    . U( [2 T- ?- ^8 R8 z, p* V
  334.         pushf! O( R+ H7 Y& p! c+ ]" O
  335.         cli7 a# E- x3 j. e9 Y6 Y; y0 _# l- d6 O
  336.         push    ax
    , _  [& z* p; V) @3 f
  337.         push    bx0 I  {! _+ F) @8 S
  338.         push    cx/ b* {: E  L% M
  339.         push    dx. l/ q) c: s' t! \6 O, Q
  340.         push    di; j* ?$ w. Q% h! t* w
  341.         push    si  q" n1 S. N9 O- ~2 Q, O
  342.         push    es  h9 U& A6 B  ~$ K( ]! @
  343.         push    ds- L7 d7 {+ c4 L

  344. ; p: p  n' i6 ~; R  l, e
  345.         push    cs
    6 I6 B3 y5 q' f; m3 d; j' @( o' f
  346.         pop     ds' I- i% c2 k: v- ?' h; J

  347. 7 v9 T  y% W7 o7 k& A3 t
  348.         mov     bl,0adh
    ( _4 _  c9 T# g1 \; B
  349.         call    keyboard_cmd0 J! w: U' `/ m0 e6 K- e0 L
  350. " S- s( K# `; D, G# f! a* T0 _
  351.         cmp     byte ptr [first_time],0: Z6 |( m) H3 {4 N. k& x/ D
  352.         je      not_first_time+ y( ~" W& P- W% \2 X; m
  353. $ d9 E) E, X) B; q8 R" |
  354.         mov     byte ptr [first_time],0! i( l1 |3 }5 G6 R
  355.         call    keyboard_read6 a  m; l" s8 l) U/ }/ {
  356.         call    keyboard_read- o1 U9 y8 S0 C% V& E
  357.         call    keyboard_read
    - E$ X$ F  S- W( I$ ?
  358.         jmp     no_show
    2 p8 U( p3 a" x" {4 ~5 P3 z

  359. 5 t% R0 b/ g- n
  360. not_first_time:' J+ ^* V3 u+ Y
  361.         mov     word ptr [temp_mask],0
    $ `# P% `: ?  i5 W: `

  362. - w4 C  F' Z6 Z$ X0 O3 S
  363.         mov     cx,[pos_x]4 s9 U9 b' I$ F. v8 a1 z
  364.         mov     dx,[pos_y]7 r, {* w- I6 i' p' G! x, l
  365. % y4 N9 a* _# R7 u' X& ?" P& H- f* I
  366.         call    keyboard_read
    " a0 m. B5 \% k( \
  367.         and     al,7 ;3
    6 j/ K( F* S+ ?2 l  u) _
  368.         mov     ah,[buttons]2 @8 P# E+ [+ ]; I& [- Y
  369.         mov     [buttons],al
    % Q! r8 @% Y7 J
  370.         cmp     al,ah
    5 Y: g* X2 v* V0 }* z1 d% W
  371.         je      no_button_change6 H, o0 d& ]  w0 Y4 y( x+ V
  372.         and     al,3& r) _2 _; Z" P; A* L( W
  373.         and     ah,39 H% ~7 j2 e' I0 c! R
  374.         xor     al,ah0 c3 G- \  `# F; i
  375.         xor     bx,bx
    ' ^! w* [7 k! a9 [4 N! N' b. `

  376. # V/ f, i0 H5 ^6 y
  377.         push    ax
    4 P& K9 E! }8 [
  378.         test    al,2
    ( F, d. y9 u! D+ I$ ^. I
  379.         jz      no_right_button_change" u! X7 h. |6 s8 Z! `
  380.         and     ah,2
    0 n: f, v" s: n* o( y' P0 _, o
  381.         jz      right_button_pressed% V8 [6 R. u" U* ?* i
  382.         or      bx,16
    9 A9 \/ ^. L$ J- ~9 k
  383.         jmp     no_right_button_change8 _2 O. k4 h( ]7 Z* o. `6 v/ x
  384. right_button_pressed:
    $ n2 C8 \) ?6 E0 X# M8 x/ ~( H
  385.         or      bx,8% y0 ?+ ?% h- m$ l5 p+ M
  386. no_right_button_change:; E' q9 k9 a1 T0 T* t) A5 g

  387. " Z% R3 j* A8 x# Q
  388.         pop     ax
    # X  _, W4 F+ Z- W! T- X2 O2 D# m

  389.   ~- w1 Q: s: F8 M6 @, f( n0 U2 P9 u
  390.         test    al,16 ~/ X! y3 M, p5 i$ Y% ^
  391.         jz      no_left_button_change2 _+ X. i9 K- {& M
  392.         and     ah,1
    2 r6 y) T& h1 s8 k
  393.         jz      left_button_pressed/ U9 H+ z% d+ m  u; U" ?9 d
  394.         or      bx,4
    " d) n4 v! A5 O! }; S2 P
  395.         jmp     no_left_button_change& U& j3 F$ Y2 @5 a
  396. left_button_pressed:0 f3 o. J# b8 b/ Y
  397.         or      bx,2
    ' A4 u6 O" K9 I+ J& P5 Z' C$ _
  398. no_left_button_change:
    7 a! d, j- b: m( Y( A" L
  399. + l' u8 _& t3 Q( l
  400.         mov     [temp_mask],bx4 e$ U; e  t" [
  401. 9 G1 _  y. M& E7 p% l% I: F  N
  402. no_button_change:
      j4 N- Y1 z8 b/ @- d! B6 l
  403.         call    keyboard_read
    9 d% h) {4 K& ]! ?' X, M0 D; K
  404.         cbw0 N! X/ p6 D; ^# C
  405.         add     [pos_x],ax
    . O2 C8 I0 W4 ], z  ~7 R' |
  406.         add     [x_move],ax! _0 g5 W2 L, ~
  407.         mov     ax,[x_min]
    ' I: a+ o  T6 w+ X
  408.         cmp     [pos_x],ax
    : M  ^( V0 k/ T4 z' g
  409.         jg      good_hor1
    : H+ d( s% D' M, x
  410.         mov     [pos_x],ax
    . U- c, |* G2 W0 e) i+ M
  411. good_hor1:/ h' T0 p% q2 T! O$ z$ j% {% e
  412.         mov     ax,[x_max]  C: y8 u" Z3 h( ^$ a# [  v3 s
  413.         cmp     [pos_x],ax
    + l; y: K6 O  u: K# m7 x) w
  414.         jle     good_hor2
    ' K. e2 h/ R( K4 W- d
  415.         mov     [pos_x],ax' \$ m# o7 U8 V8 w/ m5 T
  416. good_hor2:
    7 u0 L7 h# q, A% q9 H( O, \

  417. % b* d8 V, ]; Q- F
  418.         call    keyboard_read
    . c0 n! L  e0 O
  419.         neg     al
    : K) e8 h& G9 O3 b4 z9 g  L0 }
  420.         cbw/ ~3 O3 Y/ h8 d( S0 o' x
  421.         add     [pos_y],ax
    3 c% U  u3 T9 J
  422.         add     [y_move],ax
    - ^+ K: H6 e8 N- S6 U/ c
  423.         mov     ax,[y_min]
    6 C" Q* z: d7 t% S  U
  424.         cmp     [pos_y],ax/ L. P" x9 d5 F
  425.         jg      good_ver11 F4 }  X  o, ~
  426.         mov     [pos_y],ax% V, h1 n' f2 t$ u8 D+ l
  427. good_ver1:7 a" `8 |  O/ ]8 A& b
  428.         mov     ax,[y_max]
    . X( r+ r; x9 ]% d
  429.         cmp     [pos_y],ax
    . K" M/ G2 Y. E: _' B: X9 M
  430.         jle     good_ver20 }$ V& j/ {- h
  431.         mov     [pos_y],ax2 L6 d; v3 t3 I4 R0 |
  432. good_ver2:, \# N* Y8 C& U
  433. 3 V$ b2 r6 v3 H. E/ Q# l  c
  434.         mov     ax,[x_move]
    " M5 j. o$ s3 Z/ t( v+ [
  435.         or      ax,[y_move]
    & `! y# N0 S3 j. l7 [6 N
  436.         or      ax,ax
    7 |6 `6 S* ]% N6 m1 V% K
  437.         jz      no_change_position) n& g2 `. J& C; X- o
  438.         or      word ptr [temp_mask],1
    , E2 O9 F' ?6 \8 ?. z# t
  439. no_change_position:
    ( w" o% P5 K7 u

  440. . Q% X1 h8 c/ q% C
  441.         mov     ax,[temp_mask]
    * I( m$ b4 k- R
  442.         and     ax,[user_mask]! P9 U! G" A/ L/ x( |9 ~
  443.         jz      no_call_user
    , g; P- ?; t3 Z. N; Y: p6 u% Q; V' _
  444.         call    call_user_isr
    # l: p* y- y- e+ f6 V
  445. no_call_user:& s: t2 d0 u3 Q% P3 I; Q! U& M
  446. 7 @' t0 `5 D* m0 C/ {- e
  447.         cmp     byte ptr [sm_flag],1
    7 V* [' X6 p$ S' a  e# u( A
  448.         jne     no_show3 R2 f7 f* n* l; _# _# ~
  449. 8 @' Y$ }! b; ^4 l3 Z7 S
  450.         shr     cx,3
    / Q- U+ B: q  w
  451.         shr     dx,3
    / Z5 t5 T5 A% p
  452.         mov     ax,80/ V" j( Q/ u5 F8 m1 i7 H
  453.         mul     dl$ B2 y: N, L1 k* f. s& C  V& F7 q+ H' e
  454.         add     ax,cx
    7 w& G6 l) ^4 z3 h6 @; U6 M
  455.         shl     ax,1
    0 J3 L  _+ Q6 x6 P
  456.         mov     di,ax' v" A3 Q4 C4 ^
  457.         mov     ax,0b800h
    3 q" U+ y# S$ i0 T
  458.         mov     es,ax6 u6 A9 H/ Z2 X/ P3 S' h4 b9 P6 d
  459.         mov     ax,[save_char]
    . }+ q) E3 a& n4 O0 K  q
  460.         stosw: f8 L) ~! [# {  @' P0 y& k/ h

  461. - M* R# L+ L# O/ i: H) u2 s$ J% Y
  462.         mov     cx,[pos_x]
    " K. \3 n5 f$ f" {& l& ^3 h8 f
  463.         mov     dx,[pos_y]' V- T+ v4 ?+ \* T/ z
  464.         shr     cx,3
      K0 O" O3 L) N# r- T- R0 r8 d0 X
  465.         shr     dx,3
    ' {* P2 t; g9 ~4 v8 R
  466.         mov     ax,80
    4 `5 a1 l" F+ ^+ I; v4 S# s6 D5 S% w
  467.         mul     dl
    7 _! k* _) U% ?8 D$ y6 }% i
  468.         add     ax,cx+ h6 |+ U0 H0 K) P, _- w! J5 A
  469.         shl     ax,1& G1 r: X9 I3 A. I- C8 \3 ~5 F
  470.         mov     di,ax. M6 x! |8 \2 O
  471.         mov     ax,0b800h7 L  r, G2 h* T
  472.         mov     es,ax
    : o$ O% z. S6 R% J+ D6 v
  473.         mov     ax,es:[di]1 U# M% ]' ?0 R
  474.         mov     [save_char],ax
    # o# K! ~8 F2 O# M4 P( }4 _- r
  475.         not     ah
    8 J2 K+ }* H% r; Z4 X( R
  476.         and     ah,7fh
    ) r  J# O; t' v+ {
  477.         stosw
    ! ?! ]5 w! L& [% V
  478. no_show:
    $ M4 T1 C: P; b& j+ N
  479.         mov     bl,0aeh
    ) A2 l% \0 q* I0 P! t, d
  480.         call    keyboard_cmd
    . y' H1 R9 Z$ L/ r, S' q# j5 p
  481. 9 A! C1 g* M! B, v
  482.         mov     al,20h3 C- I; o% z5 o
  483.         out     0a0h,al
    6 d9 x+ L5 Z" S0 D% L/ m* A/ B
  484.         out     20h,al7 Y- }6 I( k% ^% s

  485. 0 i. }, W' w2 y$ i% b
  486.         pop     ds
    8 P, l8 D3 e" @/ s
  487.         pop     es  {2 O- c3 s. u) |4 C
  488.         pop     si
    4 L7 N+ e) V9 T4 e+ u9 l/ \5 Y
  489.         pop     di
    : ^9 f4 S( A! a6 |( Z+ y
  490.         pop     dx6 E+ x+ I: z+ O: T3 [# I
  491.         pop     cx
    $ Q; E  y( c( m1 E
  492.         pop     bx
    " u1 J0 q. m- ?0 W( q
  493.         pop     ax! F# ?, X1 }* z. s/ g; c
  494.         popf- y1 w6 @9 Y3 i. y- Z1 s  b* `
  495.         iret
    . U+ I  Q4 r/ V1 \

  496. . o( E) r2 c0 F; h  j4 U/ l( s
  497. first_time      db      1" }% w5 S5 u) f% e0 P
  498. buttons         db      0
      a! U& E& ]1 V' O0 W  a
  499. pos_x           dw      06 Q! ~8 r7 }% n. x
  500. pos_y           dw      07 {1 d9 u# U- K+ C% ^2 a
  501. sm_flag         dw      0
    / q- E/ u/ R9 U* o* z$ N9 C
  502. save_char       dw      0
    : d2 \$ v% j& L0 ^: \
  503. x_move          dw      00 y7 A& y8 R  y* U. ~' S* n, U. {/ d
  504. y_move          dw      0
    & o! D. ?5 L2 W9 p5 g* d
  505. x_max           dw      639
    ) \: J4 i2 v- G( J
  506. x_min           dw      0( N3 x( }. v5 z0 e$ z
  507. y_max           dw      199
    4 a$ B1 e2 G% U9 n$ d$ J
  508. y_min           dw      0+ \1 t4 Y0 S" G0 X$ J6 U! h# I
  509. user_subroutine dw      0,02 m8 \8 f$ Q6 _2 J1 ]/ }4 h: r
  510. user_mask       dw      0
    0 ~5 R  _; U+ a, J4 X$ g: }3 X
  511. temp_mask       dw      0
    + g' o2 I' t6 {2 Z, o! x

  512. / F" k) J1 T# Q$ @: ]5 L
  513. keyboard_read:" v! C  s8 ^6 E, F8 ?, `
  514.         push    cx9 t- G1 T5 T2 u3 t$ M1 i% Y9 E; l/ V
  515.         push    dx. U7 ~$ _$ a7 z. y
  516.         xor     cx,cx/ c# \; P, Z' m6 Y$ Q" {
  517. key_read_loop:
    $ I5 L5 v: o' a
  518.         in      al,64h
    9 b7 r- a1 H! Q; o* U( G' ?
  519.         jmp     $+27 v$ N1 a3 Y" l. S
  520.         jmp     $+2
    5 S8 Z6 @5 l2 w2 B( i
  521.         test    al,1; n0 w/ B6 J! b( f
  522.         jnz     key_read_ready
    : C6 S# L% l0 d" r# O! }# s8 Q
  523.         loop    key_read_loop8 H+ Z3 h# `* y/ N8 L7 ?. }
  524.         mov     ah,14 R3 N4 w" ^: j+ ?. Z6 U! U
  525.         jmp     key_read_exit
    6 L0 [& }) U( c! Y. a. {: Y! b) }
  526. key_read_ready:# q( F0 t" _3 D
  527.         push    cx: X% M8 P8 f; ]) K6 p
  528.         mov     cx,32: c/ V& c! y& [5 Z6 z+ i- K: G
  529. key_read_delay:) H" J) A$ M$ H) j# v
  530.         jmp     $+2
    5 `) e0 Z: C3 z( p' K; u1 m( {
  531.         jmp     $+2
    4 V# W! l) h/ |* |& u+ i  _
  532.         loop    key_read_delay
    ' \* D# f6 J9 i% y! y' S

  533. & B. y& I; w( }
  534.         pop     cx6 R* ~7 e4 O+ n; x2 J# ]% ~

  535. 2 w- u1 T5 o) Z% X7 S
  536.         in      al,60h: c' h' r* N) f
  537.         jmp     $+2
    % ~9 y! n2 M1 ?$ Y, y/ v
  538.         jmp     $+2
    % i* z6 w" e+ \1 o
  539.         xor     ah,ah! D" l9 S( ?2 f# u
  540. key_read_exit:
    1 J- J) Q% B7 o+ r* c  c
  541.         pop     dx: m3 x* p* b( v0 ?9 N( g: H$ _
  542.         pop     cx9 E! A/ M& }* c( ^' b2 d
  543.         ret2 {+ D0 Q, o) g1 K- a1 Q% o
  544. ) b; t) L( h8 g2 t9 ~! Q
  545. keyboard_write:
    ! D; T9 r8 D( o4 C
  546.         push    cx" O) l% V1 n) y
  547.         push    dx1 T6 [5 `# d& O  M
  548.         mov     dl,al
    / C* e) p  J7 M% ?+ H
  549.         xor     cx,cx
    & j4 s& f$ {# N& J! p6 O" w
  550. kbd_wrt_loop1:
    , g( ?# y  B, N$ c/ E# c
  551.         in      al,64h4 U; n1 r/ g. C( S) Z
  552.         jmp     $+2
    ' M# }" i0 r4 r3 o3 o. y4 L2 d0 t) {
  553.         jmp     $+2
    ; S9 t5 T" J, y; e. d
  554.         test    al,20h
    ) g" u8 w- O2 \* x0 ?
  555.         jz      kbd_wrt_ok1
    % ]: F" q% \7 y' u. L, c
  556. ! C: E' G) W5 ^
  557.         loop    kbd_wrt_loop1
    0 |# ]% S! c9 y7 B0 C
  558. ) I5 b1 {9 d: G
  559.         mov     ah,1
    1 @1 Q. A- G0 m  b
  560.         jmp     kbd_wrt_exit
    6 z( z3 t  _, h4 e  i+ V  S+ W: V3 N

  561. / ^4 u8 W7 F! B. t
  562. kbd_wrt_ok1:
      Z. Q! T5 J# A& n. w  C3 |2 n
  563.         in      al,60h
    ) z( \1 ?, ~6 [5 k/ }: M+ h. [

  564. - m- N; `; c' o! c9 M) K1 P" l
  565.         xor     cx,cx
    ( f: G% N5 p8 E7 E% |1 @
  566. kbd_wrt_loop:2 e+ @  r" U, L" ~' U3 m: C
  567.         in      al,64h
    # v( p1 T1 v, ^
  568.         jmp     $+2
    % ~2 X& J, h/ \, K- g( R: |
  569.         jmp     $+2
    1 o8 w5 J: Z4 j6 b7 {2 m
  570.         test    al,2
    4 N. ^) O+ S; b0 d" Z
  571.         jz      kbd_wrt_ok' k6 I- L$ |0 S! ~' l# H

  572. % a' W$ o* O, {! R2 l
  573.         loop    kbd_wrt_loop3 m$ P- f9 ?  F* z( k
  574. 7 i, D1 }4 z* X
  575.         mov     ah,1- N2 C7 h$ ^( r6 Q) G
  576.         jmp     kbd_wrt_exit: I% A: @4 r' }( ~
  577. 3 [( Z9 A  g+ O, C! W6 S
  578. kbd_wrt_ok:
    1 S# ~% F) F- [% F. k( {" a
  579.         mov     al,dl. K# p- j0 ]; j6 Y3 K# g: g8 a1 b
  580.         out     60h,al' v, ~) [1 C0 q7 }2 \
  581.         jmp     $+2
    : x9 j! g+ f  \3 [$ f/ T
  582.         jmp     $+2
    $ I  |9 B! |/ D

  583. - i: {! C2 |1 A0 F8 i# Z
  584.         xor     cx,cx
    - _# t7 u  }! l2 G9 I
  585. kbd_wrt_loop3:7 @7 R2 {/ x, e! ], C4 s6 k0 Y
  586.         in      al,64h
    : a3 A7 b1 U& x6 l" }7 q" |
  587.         jmp     $+2
    ( \% _4 C" d. b. K
  588.         jmp     $+2
    ) h8 _4 ]- [8 K7 z
  589.         test    al,2
    7 T) e1 @0 W& z- ^- o# |
  590.         jz      kbd_wrt_ok37 H5 B1 _% Z; K7 H* k3 D

  591. 6 n* h# r9 i, {; k. }# S* c; C
  592.         loop    kbd_wrt_loop3
    ' b) X3 y6 {0 C8 X
  593. 0 [, K$ j3 V9 R* F. z0 G) ?
  594.         mov     ah,18 i9 q- l5 j2 u& D
  595.         jmp     kbd_wrt_exit
    7 L4 t' ^  Y) V! J, A
  596. + N. d* ~1 b( d7 X) w3 a; W1 G" ^
  597. kbd_wrt_ok3:9 q" Y  [( L- @, o  S6 ~
  598.         mov     ah,8# ^* r& A/ E& [! H* N) Y
  599. kbd_wrt_loop4:  n  ?% r9 B- C" g0 e. r! A  ?3 x7 N
  600.         xor     cx,cx
    ' ~5 L$ W  s! G. q4 j! [
  601. kbd_wrt_loop5:5 [- Y. G5 @: R9 Q
  602.         in      al,64h/ i  v) Q, H! Y( S
  603.         jmp     $+2
    ) H+ D: m. J# j$ j
  604.         jmp     $+2
    . D" g+ i$ Y, O7 v/ ?
  605.         test    al,16 \3 G& a. X0 @4 B
  606.         jnz     kbd_wrt_ok47 Q  p6 _+ _3 ]. }0 ~( g

  607. 4 }# ^# ^# x9 {. Q- i8 i
  608.         loop    kbd_wrt_loop55 c1 C+ L* ?4 v# h. s$ ^' p! n$ f; U

  609. ; P/ P  T' Q& Y8 }0 s4 p
  610.         dec     ah0 u6 q: z1 m+ K- i9 l
  611.         jnz     kbd_wrt_loop40 V* K  d% X$ v

  612. 9 m( E3 C7 Y$ U9 A, P
  613. kbd_wrt_ok4:
    2 r, k8 c$ R- i6 v% t4 x
  614.         xor     ah,ah
    # `5 A" A1 F4 W0 J; W
  615. kbd_wrt_exit:
    + U- h- D1 o6 r7 l% ^
  616.         pop     dx& ^: Y' p/ J2 A& }" O" t7 n0 `6 v% J
  617.         pop     cx
    ) Y& T$ N/ A8 K# F5 n4 X
  618.         ret
    4 m0 n2 V( `3 S7 }5 R
  619.         
    0 h1 `- o! ^. t! }$ r
  620. keyboard_cmd:( d) o& u1 b: @2 I
  621.         xor     cx,cx
    + X( k6 \4 j# \0 q/ b% q
  622. cmd_wait:8 p. Y* l2 S- s" y& A  G
  623.         in      al,64h
    3 X$ I: i; o+ u$ R: ]5 j0 s8 H4 W
  624.         jmp     $+2: x$ D% B4 ?1 m1 j+ M' ^
  625.         jmp     $+2" o( h5 |/ W$ m+ F4 Y1 m
  626.         test    al,2
    8 c2 m6 {! r7 x8 `
  627.         jz      cmd_send
      }/ X+ J: {6 s
  628.         loop    cmd_wait" G8 d' A. K) l

  629. 4 m$ P. l, m+ {/ O; _, {
  630.         jmp     cmd_error9 L+ _4 P) l* K# b7 }" H
  631. 5 w; _6 ]$ s' g- Y) ^, `! i% {0 X- z
  632. cmd_send:
    % ?  v6 d; ^9 d' C6 ~& C; P9 z9 U
  633.         mov     al,bl9 _6 I! l  g& d$ q; `5 @
  634.         out     64h,al
    ! u5 v1 M' T& ~, B) ^8 T9 ?' `
  635.         jmp     $+2
    2 i# r' i1 v; q9 }' R
  636.         jmp     $+2+ H% X1 G* e8 B
  637. $ \+ |8 H* e  ^, A' D
  638.         xor     cx,cx
      O. b- R) o6 ]+ y/ B- c; t
  639. cmd_accept:
    4 e% s' Z/ L, i4 I! [  l
  640.         in      al,64h
    - l) B" n0 D6 H+ w9 @" m' @3 x
  641.         jmp     $+2
    ! k0 j8 r, n2 [+ h' [, \0 O9 T% r
  642.         jmp     $+2( b1 e0 x5 e6 G. l- D
  643.         test    al,2) P2 R) s' ]& Z6 |) B- e4 L
  644.         jz      cmd_ok
    8 Q4 P0 q; n  C" O9 R. H8 x
  645.         loop    cmd_accept
    9 Q+ C# L/ _4 H. q! W- f5 \
  646. ' _7 \7 ~$ \3 D" h
  647. cmd_error:, t6 `7 J% X1 @8 `: H& Z
  648.         mov     ah,14 Q4 [. N% q" q% ~- q- |4 Y- z
  649.         jmp     cmd_exit
    ! Y, W" x( K9 U/ m  O, o" k0 u: _
  650. cmd_ok:
    ! ^- n  z2 Z" z  x1 X
  651.         xor     ah,ah4 \2 C+ [5 Y9 a) I/ w. x( f# o# S/ w
  652. cmd_exit:# K+ I. R0 Y: @6 |
  653.         ret
    , U! ^2 H! ?) w. _
  654.   V% t7 n% ~+ n0 c5 y" y
  655. new_33:
    # a: `$ q( _+ L( S
  656.         cli& g5 Y1 U2 Y9 l
  657.         cmp     al,0" }7 b1 l' W( O
  658.         je      reset_mouse
    : Z+ i' q- ^  k# W
  659.         cmp     al,1$ G* h! @/ W( l9 z2 K  T* Q
  660.         je      show_mouse
    , {; e- J. }6 Y9 _4 }/ r
  661.         cmp     al,2
    " }' h- [. @, O6 ~" @' k
  662.         je      hide_mouse
    % r! I, [7 [2 P
  663.         cmp     al,36 I8 f1 O: m3 r' r' E. M
  664.         je      get_pos
    ) G; h1 s" N0 ~- @/ I; e/ F
  665.         cmp     al,4* ]+ S3 _$ f" m& t- k7 I- w
  666.         je      set_pos
    ( F3 I  b5 \$ `) h4 |
  667.         cmp     al,7
    $ b) y; \8 P. z) W
  668.         je      set_hor_pos  ]. l+ N# e2 d: Z# r
  669.         cmp     al,8) @- u$ V5 p" y) R
  670.         je      set_ver_pos' y/ }- Q4 O# \$ Q2 G
  671.         cmp     al,0bh- V, x8 W9 p) c# J
  672.         je      get_mouse_movement
    5 r0 m" \  _% \$ u+ U) [
  673.         cmp     al,0ch
    + c. m1 R% Y' L1 e0 K
  674.         je      set_subroutines
    . G, s7 K5 Q& I: o; T4 I
  675.         cmp     al,14h
    1 P  q' d1 Q# ?( C7 ]# x- X
  676.         je      swap_subroutines
    , j: o' b; H& r1 h$ V6 b9 v! x' c
  677.         iret. E( J2 Z' H6 H& v3 B
  678. 0 C9 g! s) B7 y0 j$ V
  679. reset_mouse:6 @1 T6 Y# ^: j* H& x5 Z
  680.         jmp     _reset_mouse# Q! o. k1 c. q6 v1 ?7 y
  681. show_mouse:4 ]" y1 S6 F+ d
  682.         jmp     _show_mouse5 n9 i9 k. t% C$ f. R5 S
  683. hide_mouse:
    & M$ [: ?1 ]# J1 C" P
  684.         jmp     _hide_mouse. c, G' o" D* b+ X8 q) P; a
  685. get_pos:5 u" O" `- \5 o
  686.         jmp     _get_pos- s7 n+ A" @: u! D2 N, w
  687. set_pos:; m/ m+ e- t8 F- g+ G1 x0 b' @
  688.         jmp     _set_pos
    1 \4 Y* d4 O1 j3 e* d
  689. set_hor_pos:
    & M9 N2 ]* z3 r, W2 y/ k
  690.         jmp     _set_hor_pos8 }( e. x* U1 E9 r5 z
  691. set_ver_pos:$ g) |5 H+ F4 F. _
  692.         jmp     _set_ver_pos
    $ i& c! s0 j% V
  693. get_mouse_movement:
    ! E7 @* R' x4 i, N1 _3 e+ L9 ~
  694.         jmp     _get_mouse_movement
    + B) o8 I4 C. q4 Z% R; m
  695. set_subroutines:
    8 [5 n; K' ]1 v/ c2 E7 p6 |
  696.         jmp     _set_subroutines/ X; D& n/ r3 z6 g2 H
  697. swap_subroutines:
    # q' E7 V3 c9 f$ S0 B3 W, o6 c
  698.         jmp     _swap_subroutines- Z( |, d+ k/ N9 f* l
  699. 3 [7 }7 `* j! P4 L0 t7 r) u
  700. _reset_mouse:
    . D6 f+ R5 p5 H- d: y
  701.         mov     byte ptr cs:[buttons],07 x: q* O* b& W* y9 h  I
  702.         mov     word ptr cs:[pos_x],0
    3 ^, D) A) |( ~# Q$ m* L2 b& I
  703.         mov     word ptr cs:[pos_y],0( s* k7 s6 L4 c# `
  704.         mov     word ptr cs:[x_move],05 Z) @* i+ t3 o, J7 {  U
  705.         mov     word ptr cs:[y_move],0, m* k* K; @' E" ~9 y
  706.         mov     word ptr cs:[x_max],639
    * g+ A+ q, u) d  [
  707.         mov     word ptr cs:[x_min],0* h+ h7 t8 F  T2 s/ E: r
  708.         mov     word ptr cs:[y_max],199/ R8 g  m4 q/ A: f9 U
  709.         mov     word ptr cs:[y_min],0
    " }/ ~1 T* _# {9 u% o1 o% M
  710.         mov     word ptr cs:[user_mask],0% |3 m$ V) e* z6 ~! g/ M
  711.         mov     word ptr cs:[user_subroutine],00 }( O& J4 D% R6 f4 Y
  712.         mov     word ptr cs:[user_subroutine+2],0
    4 R& h4 \7 ~' ]. L; e$ M8 i
  713.         mov     ax,0ffffh( m$ f3 Q4 F- d% V. L+ u
  714.         mov     bx,3* S. T# w6 U# _/ u1 Q6 S5 d6 m
  715.         iret7 Q& |( [, E, m; m* z) r

  716. % N% u% j1 K0 w( e2 L
  717. _get_pos:. p7 t! l, m: s
  718.         mov     cx,cs:[pos_x]5 _: @8 t# k  F/ d  G" m8 x; P
  719.         mov     dx,cs:[pos_y]
    % g) d4 ^7 X, R% P! }5 G7 f
  720.         mov     bx,word ptr cs:[buttons]- \8 D; D( t! a6 L7 p) v
  721.         xor     bh,bh
    7 K+ \9 `' o  T, [, U- e+ |
  722.         iret
    8 B. d/ l% l6 @7 ?4 A5 k6 t) V
  723. 9 e5 B1 e2 J4 r7 {5 P2 R
  724. _get_mouse_movement:
    8 C' u$ a5 R1 D1 s. n
  725.         mov     cx,cs:[x_move]
    . t8 n4 a& v9 q/ x( H$ ~7 d7 x
  726.         mov     dx,cs:[y_move]
    0 J# ~& g8 {, Z9 }# a/ D# ~
  727.         mov     word ptr cs:[x_move],0, E, o. L2 P3 c4 M8 g& d! M
  728.         mov     word ptr cs:[y_move],02 N1 W1 ~# G: }! I0 a( ?
  729.         iret9 @2 E1 x2 d, E3 ?7 ~
  730. % u5 @& v' `7 ~( P6 D  L
  731. _show_mouse:
    3 `) _" B9 O: h2 @& O6 e/ f5 L
  732.         push    ax
    % I/ Y) D9 H1 i5 X& D
  733.         push    bx5 j# I5 P2 F! _. n0 D
  734.         push    di
    - @/ q" R" @$ N8 T+ c1 a, O2 a7 B/ ^
  735.         push    es" J8 Z, f* l2 @$ t. D1 F
  736.         mov     byte ptr cs:[sm_flag],1
    - X, C5 K/ K! l1 @' I: d6 D
  737.         mov     ax,cs:[pos_y]  K4 Z/ f% p! c* S* L
  738.         shr     ax,3
    " j5 g7 J6 Y; X! o4 F2 U
  739.         mov     bl,80$ o/ s/ \4 n7 X& |) f
  740.         mul     bl2 P& r' t9 ]' B6 S7 \
  741.         mov     bx,[pos_x]
    . y* P3 J2 M8 b& K
  742.         shr     bx,3
    - Y/ @) ^" b' @  Y& ?
  743.         add     ax,bx) \( r. m$ Z- J
  744.         shl     ax,1
    8 u: i5 c) c. L& ]
  745.         mov     di,ax
    , Z3 u& o' j  n5 u. w9 L. j
  746.         mov     ax,0b800h- y* ^8 ?3 [) M. X, u+ V* Y( ^
  747.         mov     es,ax
    / w0 @8 k8 \# y, t; _! J
  748.         mov     ax,es:[di]
    & I! m$ w1 ~+ B' l7 W3 ]/ t
  749.         mov     cs:[save_char],ax2 Q/ r7 p/ r  r: C. m
  750.         not     ah" l! \, @4 C. Y* e1 x
  751.         and     ah,7fh1 P6 d' S% M. U
  752.         mov     es:[di],ax
    4 D6 }5 B, g! v7 A/ Q
  753.         pop     es( l2 i" M6 u! A2 ]# y; f
  754.         pop     di; S+ j: t! [; f3 |9 x
  755.         pop     bx5 J8 _7 m/ ~2 i3 Y- u
  756.         pop     ax# r+ N2 s* j  [  I* x8 P7 Q* |1 A
  757.         iret, L4 v+ C- V2 w! m; |: |7 C, h

  758. # `1 D2 G9 I2 T! K$ f# e* I
  759. _hide_mouse:" f) k$ s1 I/ k+ n; s
  760.         push    ax% a. m  \& S/ n  Z8 z" N6 f; f
  761.         push    bx
    ( B/ Q" p& l6 p4 e4 j
  762.         push    di
    . B  w+ Z& g! W
  763.         push    es
    4 Q% T- q7 R; o2 E- o. u3 @+ \
  764.         mov     byte ptr cs:[sm_flag],0
    , k# m0 u. N. w. o+ j2 z, `
  765.         mov     ax,cs:[pos_y]
    ; T1 V" m# X& w# p
  766.         shr     ax,3
    % H/ C/ S+ P1 S' G! N5 ]6 N
  767.         mov     bl,80, P  X5 }. G! b- V
  768.         mul     bl
    3 {8 h. |- j3 v. x% }! d9 ^
  769.         mov     bx,[pos_x]
      ]8 A7 Z' \" p0 f! Z' c5 B
  770.         shr     bx,3) \9 P' ~% G; a" y
  771.         add     ax,bx  Y( H1 F9 S) D( d- B$ f2 T
  772.         shl     ax,1
    5 z$ |: s% S0 r. `7 i. e2 c6 V. o
  773.         mov     di,ax
    $ X7 f; h  w9 F& y% W1 K( _9 V$ h% u
  774.         mov     ax,0b800h% c' }0 o9 O% s7 _. ?
  775.         mov     es,ax
    ! f1 ^& x9 c6 f5 @, n% H
  776.         mov     ax,cs:[save_char]# z9 ]/ B. R. K8 j+ f. f/ S
  777.         mov     es:[di],ax( b/ a5 @8 n  k& |1 L* e/ x1 F5 I* Z
  778.         pop     es! \5 F. g& k0 e- M" b" {
  779.         pop     di
    & S  ]; ]$ U0 ?2 {
  780.         pop     bx
    & k, n: X' U+ x* [' F
  781.         pop     ax
    " T- W! N, j5 \4 k  Z
  782.         iret
    1 R$ T, ]. I; N7 I. m8 e
  783. " e# A/ @- b* \$ Y3 u6 Y
  784. _set_pos:
    4 f+ {2 R8 Q. V+ V! @- m+ N8 {
  785.         mov     cx,cs:[pos_x]
    ! l( C; g, Q0 P0 n
  786.         mov     dx,cs:[pos_y]
    ( f( U; z) _+ w
  787.         mov     word ptr cs:[x_move],0( ]4 [6 ^8 W! w, |: H) U
  788.         mov     word ptr cs:[y_move],0' t: ^) U7 I+ r8 [1 k. f
  789.         iret6 a0 B- @2 {7 {0 k
  790. 0 r2 C" V! Y, `2 b, o: p. B( b' d: y
  791. _set_hor_pos:
    7 L0 S$ n4 ~: l
  792.         call    max_min+ r. t" O- N: ?; `9 V6 Y
  793.         mov     cs:[x_min],cx
    2 a8 x' a- g9 n: j7 _
  794.         mov     cs:[x_max],dx
    + h  M) ?. x9 ~, P5 z0 B
  795.         cmp     cs:[pos_x],cx
    * A9 R  E# z. V+ v5 u
  796.         jge     good_hor_min
    8 r3 M" y" |. X& g7 v+ U8 O
  797.         mov     cs:[pos_x],cx( B9 F& \+ }) `' h9 ]2 }5 }3 p* `* M+ k
  798. good_hor_min:
    4 f9 T: b& z) F* D; |! u# Z
  799.         cmp     cs:[pos_x],dx
    ; H9 @; l! k8 v4 k% |
  800.         jle     good_hor_max
    4 {- t, `( B. o8 U1 `
  801.         mov     cs:[pos_x],dx: {& q8 P. ^/ p/ {. F. F
  802. good_hor_max:! K0 w# X0 h0 t* n* B3 z9 P* e. E/ k
  803.        iret% }/ P" {. J, D( ]! b, H, E8 k" z

  804. & w: A/ G6 a5 Q" p" a* ^
  805. _set_ver_pos:2 t+ C7 a) d' ?- v* f  `
  806.         call    max_min" t+ O+ i) h. ?
  807.         mov     cs:[y_min],cx
    : P# _7 T+ G) x/ O6 ^1 \' b( N; ~2 ~
  808.         mov     cs:[y_max],dx, X0 p0 N) b1 ~: ?* M, \7 d5 w
  809.         cmp     cs:[pos_y],cx  R2 ?5 W. p' x0 z, r* G
  810.         jge     good_ver_min
    3 o3 U8 N+ L/ S+ j
  811.         mov     cs:[pos_y],cx$ u3 [/ x" p" n: b" g' r4 N1 q3 _3 I
  812. good_ver_min:; F# n' J8 F) h/ O8 a- |
  813.         cmp     cs:[pos_y],dx
    + h( r! w: O) Y" j6 B; A( u
  814.         jle     good_ver_max
    + c# @4 V) ]/ ^" b' l3 ?  ~
  815.         mov     cs:[pos_y],dx
    4 z8 _* A! C+ W1 ^- u  x
  816. good_ver_max:
    0 k; o3 i$ g* Y4 C
  817.         iret1 T6 o. a2 O8 i9 t1 H$ y- r- f

  818. + G7 s8 r6 Z, O+ n+ R& o- J, ?
  819. max_min:* d, c" P& m- }" A& a( W. a
  820.         cmp     cx,dx
    * u# _! N% E" p, G
  821.         jle     no_swap
    ! X4 P8 v; x( z% M4 f, r# ]& }$ I
  822.         xchg    cx,dx3 g# r1 a6 X3 R3 T0 a3 A" h4 ~2 Q
  823. no_swap:
    ( _) ^7 q  Y  _, F8 R
  824.         ret
    2 P& {# w; x9 C8 ?

  825. 6 ?; [2 p+ H* G7 U6 y; e4 E
  826. _set_subroutines:, j! v3 y  c% U5 @' X! F$ p9 M
  827.         mov     cs:[user_subroutine],dx2 M- N  h5 w: i5 U) M, C
  828.         mov     cs:[user_subroutine+2],es
    " a, Y: J( g7 O% s4 u2 E
  829.         mov     cs:[user_mask],cx
    0 @5 ^7 m) L5 I3 t& g, S
  830.         iret
    4 o/ ^, n+ S0 P4 z/ A
  831. 8 s6 m# t% u/ |2 L/ E
  832. _swap_subroutines:
      t/ a  ]" n* z2 c" E# M
  833.         push    word ptr cs:[user_mask]
    7 l$ h" h, w7 \
  834.         push    word ptr cs:[user_subroutine+2]
    9 g, ]+ }1 ^" t
  835.         push    word ptr cs:[user_subroutine]
    - r& {4 y  J- |+ w7 l
  836.         mov     cs:[user_subroutine],dx1 Y5 Y% I1 g( D' |
  837.         mov     cs:[user_subroutine+2],es' b) P# I# a0 K% d+ m9 _
  838.         mov     cs:[user_mask],cx
    6 q8 l0 F4 o$ D0 P: `/ H
  839.         pop     dx! V  v4 [; X* f4 H, t  r
  840.         pop     es$ `8 O" `1 `& v  w. ]" w
  841.         pop     cx2 ~+ o( C8 Z/ x) B
  842.         iret" i8 c* V* z% j* q9 P, T

  843. 7 ~" V) M0 v7 Y  h0 _
  844. memmouse        endp% X! F$ ]! {  T) w0 K4 X* o0 b/ [/ |
  845.   _7 P( B: Q' x; w5 [* R* \4 n1 f) Q
  846. endof_start:1 q9 s* n; h) n" V* [- E# L
  847.   k8 B8 p: C1 p2 m9 M. I2 h
  848. emsg db 'No mouse driver install error!$'
    * H! o3 \9 c. Z! [
  849. old331 dw 0
    , M& x& y) y7 c. l  l9 ^% L
  850. old332 dw 01 g5 ?* D* F0 b& S( u* }
  851. old741 dw 0. {5 `! p! Q& I; K: U# Q( n( ]# @
  852. old742 dw 0  j! t" ^' E7 o6 N
  853. memcopy db 0$ t# J& O# w3 I. s
  854. okcheck db 0
    ) ~: O' Q! I0 v( S9 a
  855. pass db 0
    % y; P3 K3 V5 P: B9 I1 i
  856. chkl db 0, z, b. }$ }7 P
  857. lk db 0
    + ~9 Q- P; E0 T
  858. chkr db 0! @2 L# i& u. @# p: R
  859. rk db 0
    . y/ W. J9 O$ m- X
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    . e% \1 H- |; a/ h
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '& J6 S0 e6 _1 P+ O) r' X
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '& ]7 a6 j) K8 D: X; B# A# ?( T; G
  863. db '                                                                                '
      v) ^* \) l: d* w7 t) _3 m5 F8 F
  864. db '                                赏屯屯簧屯屯突                                  '
      L0 r' k# c4 b9 h2 s0 w7 G
  865.         db      '                                ?OFF汉OFF?                                 '$ H) ?2 R% |! N- Y) r
  866. db      '                                韧屯屯既屯屯图                                  '
    ' c6 |: B( D( C5 y1 \: W0 |
  867. db '                                                                                '
    3 N6 [  i& M! W- l9 }
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '% U3 \* c+ N6 v+ s' u
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    5 t# w9 X6 ~; V( x$ V4 G$ F
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    5 @' @4 L9 b2 ?7 X- o0 ~+ S

  871. # t  v$ `6 E- |  G2 y
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
6 h( E! |6 I; [1 ]1 v哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
- }7 m4 O5 h1 Y* C- p/ y" G
$ _# o# G, \' s7 m5 d7 n谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 08:35 , Processed in 0.754145 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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