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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。
3 L9 |7 a7 y2 @6 C7 H6 K$ Q8 n  o) D! c8 w" ]$ Y9 D
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;+ B9 n( t2 d9 Y& _. v+ ]# f
  2. ;          Ufoit PS2 Mouse test program   Ver 0.9
    5 ?; ]1 ~! J9 |+ Y
  3. ;                                         By Bini.Yi 易祝兵# I' ~! _/ S5 H5 |2 y& f
  4. ;                                         http://www.ufoit.com 计匠网
    * v' h9 w0 p# Q1 }* u+ y* Q$ a4 ]
  5. ;                                         2002/04/06 YYYY/MM/DD5 V# u" F0 Y+ F1 S7 J) Z' J
  6. ;
    3 S. m! i% I" Y' w4 ^3 q
  7. ;         
    , l2 j& w. A5 a, g
  8. ;          This program  test the mouse button  click and move.
    9 k5 Z0 z: m. ]7 `& ]0 h
  9. ;' c- w& a+ f4 S+ X
  10. 8 `# b  U; i0 k+ ~: z: U$ d2 k, Z
  11. .model tiny
    / q3 h! x; Q9 X0 y  `( O; ?
  12. .586
    9 f- x* M8 w1 {* D% w) z' m
  13. .code8 A& R" l: X9 W9 q& E" U
  14. .stack  100h9 E, _* `: O& ^1 y8 q/ T# a
  15. .startup
    ( `* Y  u& L6 H4 v7 r5 a3 w
  16. pusha8 i( o: [; l- W
  17. mov ax, 3533h
    8 C/ X# f4 m; Z# h% l: A" D
  18. int 21h9 z: n5 L# i8 c1 S
  19. mov word ptr cs:[old331],es; P# _$ w" V0 {4 ]- X8 [; P0 q
  20. mov word ptr cs:[old332],bx
    + d$ [6 U2 w) a+ n! S. p' a9 |' E
  21. mov ax, 3574h
    : z. F; v4 `! r, d0 c2 [
  22. int 21h
    3 \& `$ L  x& E2 r$ Y% N
  23. mov word ptr cs:[old741],es& F/ g4 U: ?& G% J# Q* d  _
  24. mov word ptr cs:[old742],bx
    , @  `" M6 B, l9 g% a
  25. popa0 Y+ }; ?# f9 C7 f
  26.         call    memmouse" P# R. ~4 @* J( [& y
  27.         mov ah, 005 N- L! x# Q# s8 m2 y
  28. mov al, 03% }0 i$ c% e/ D% Y8 `7 R% E& p% S
  29. int 10h# ]' G& r5 K% G/ Z3 G4 `' |
  30. mov ah, 06
    8 E( S+ l8 ~" E6 w& ], Z' B
  31. mov al, 0
    3 v* D, w1 s9 y
  32. mov cx, 00 g) V" @6 ^& S6 @
  33. mov dh, 24
    ! e+ f, S6 H0 ~& m- u: u! a* I
  34. mov dl, 79
    . z  H' n7 R" L7 u: J
  35. mov bh, 07h" ]% t1 Y4 O# E# ]* S+ A5 d! q
  36. int 10h
    & [1 e* R! [3 F0 Z2 Q+ p: ]" R
  37. mov ax, 0000
    9 j+ u+ A" L% H- {
  38. mov bx, 0002
    ( _, q$ M! e  \$ _, H+ H/ f
  39. int 33h
    9 B) H2 E1 J9 d2 G9 v( R
  40.         cmp     ax, 0000           ;if no mouse drive install7 A* B. {3 f! ?* x8 k2 s- C
  41.         je      errormsg           ;show error MSG
    . o2 u: `1 V: X
  42. mov ah, 02
    , v8 y  t4 v% W) l$ W8 w7 Y/ J
  43. mov bh, 00
      w. I9 A$ c1 ^$ O
  44.         mov     dh, 25             ;Move point out screen
    ; a6 {6 B. X2 q# M# ?1 \2 z
  45. mov dl, 79# O6 q  \) [1 o% u
  46. int 10h8 a  g2 J5 w( r% {
  47.         call    showmsg            ;Show info* j. v; V- p) u( }) T. g
  48. mov ax, 0001& K& Q7 g! g( N% y
  49. int 33h! z) P" @) c* d% V' j
  50. ; mov ax, 000ah& L4 o4 m5 q0 v: ^
  51. ; mov bx, 0000- m: h$ ^' y6 u: h5 A& Q
  52. ; mov cl, 0h; F2 ?4 i5 |* i2 E8 l7 ?! W9 m
  53. ; mov ch, 0F0h
    $ D. g0 X7 @. M" q! W4 y" Z9 D
  54. ; mov dl, 0h
    ; \+ E6 i- A! c7 d2 c
  55. ; mov dh, 0F0h) E& f  u( y# U8 s: ]7 V/ s
  56. ; int 33h
    ) t1 r" @9 z) a
  57. mov ax, 0004h& T5 A1 q, s/ c$ ^* j4 ^
  58. mov cx, 0319
    : n- ]* l- J' k, W- E& X
  59. mov dx, 0103
    7 r! e( I' q2 C4 U' e' R9 ]
  60. int 33h
    ) y  o% E7 d8 g2 {5 [
  61. casemo:                           ;Case button click and point move
    ( v1 Z& |; R9 u5 z0 ?& |4 z, w$ ?, E5 {
  62.         mov     ax, 000bh         ;and keyboard press
    4 \" z! j% L* B+ @1 A  q; m7 t; R6 U
  63. int 33h
    - V! B" ]5 \/ @6 m) n' I; G' p" p
  64.         cmp     cx, 00h           ;if point move....X
    ; |6 V& s  ^' b
  65. jne xmov" w: f$ u( p- r2 v8 M& s8 @
  66.         cmp     dx, 00h           ;if point move....Y
    " f9 s) n; \1 ]6 R
  67. jne ymov
    - s) D' L1 m. o% m
  68. xymovend:                         ;X.Y move end
    : o# u$ d* e$ O- X
  69.         mov     ax, 0003         
    " n9 C2 f2 V/ a  c/ |0 `* w6 u( z+ P
  70. int 33h
    5 E+ m$ r" X# d, C5 z" F  F
  71.         cmp     bx, 0001          ;if left button click  show ON
    - D6 x: M" b/ c2 k8 C' E
  72. mov si, 1828+ l; T# H% q+ t
  73. je listl9 ^; L) T- C0 o- }) O1 \; R/ n1 D
  74. mov si, 1828' d8 H+ d% j. D( `' h$ d! c$ n: L
  75.         jne     nlistl            ;if left no click show OFF) h0 S% y- [$ T$ d. u
  76. testr:
    : x- d3 `! R" ^
  77.         cmp     bx, 0002          ;if right button click show ON
    $ l' m" l$ [- T" H
  78. mov si,18421 L. j' L6 \* x
  79. je listr
    . w3 l! X& J: H8 O1 m8 Z# ^
  80.         mov     si,1842           ;if right no click show OFF
    4 Y' h* q  G, G; `" M8 ~: n( S
  81. jne nlistl6 X0 e, f! g, K- ^
  82. casekey:
    2 u) k# v3 W# r. W1 K
  83.         mov     ah, 01            ;if any key press jump check
    6 Y' [4 h, E& b! {2 }. H. o' t
  84. int 16h
    9 C$ j7 n! F( T: ^7 l5 x' q
  85. jne kpress. }9 q! D/ z8 L! r' T# E
  86.         mov     al, [chkl]        ;check x flag
      K3 A5 C8 v9 \
  87. cmp al, 02h( O& t' Y5 M  o$ `) S$ ~
  88. jnb chkok
    . N; G% p2 d0 R. g
  89. jmp casemo- z1 s' j9 H0 m6 R1 e2 }0 @2 f  D- V
  90. xmov:                             ;if X moved, get the X flag+1
    9 i3 Y+ {8 c" `
  91. mov al, [chkl]8 B$ l. H8 {6 z! D2 k+ H# _
  92. inc al
    ; E8 |" s& _2 T' R9 b
  93. mov [chkl], al
    # T, ~, F4 D2 W2 t* S. E
  94. call passok
    ! e3 j5 w3 F, M, z$ o0 z
  95. jmp xymovend
    ; g. M9 @  g$ @2 x7 M; K
  96. ymov:                             ;if Y moved, get the X flag+17 }* m3 O1 v1 J1 f  p# I
  97. mov al, [chkr]. Q! O, ~; d4 B. J7 u
  98. inc al
    : {5 N1 N1 A. U2 p
  99. mov [chkr], al
      L; Y8 v2 B. x9 @' J6 z
  100. call passok; i/ G8 a. V' {) b9 |  o$ O
  101. jmp xymovend
    . ?. z9 w/ l4 D" r( u0 V. q7 ^/ c
  102. ( x# s- v4 |" f9 H
  103. passok proc near
    & i$ x- K; D" A- Z
  104. mov al, [okcheck]( {3 m/ U; c1 z7 k' A
  105. cmp al, 1& F) o7 [  U4 N+ c2 w' ^
  106. je let0& V4 R# ~0 b3 Q1 p
  107. jmp passret
    ! z5 C& W1 x  @; M- m& d8 {- L
  108. let0:
    3 q5 @8 n+ Q) y* R8 W9 x0 m' T8 S
  109. mov [pass], 1
    & r% y3 t3 P+ d
  110. passret:  b9 {; p2 P; E2 P7 f
  111. ret6 Q$ r3 |) M: A6 s* z4 p7 g
  112. passok endp 3 B# h% i* ^# @

  113. ! f# p! ]; o" ]+ p! L4 S3 K* [$ s
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    : T* |+ _" @7 ], I" \: v
  115. mov al, [chkr]
    " J4 d2 o5 y& S, w/ z" D7 a, a( L
  116. cmp al, 02h2 k4 w) J: C# y
  117. jb casemo% L3 ?0 F' I5 {1 p" \7 @/ c
  118. mov al, [lk]
    # H, F$ X8 R: \- B- D
  119. cmp al, 1
      Q' t3 ?( I5 b! A9 w7 @
  120. jne casemo
    9 K' |# g0 }( `+ |
  121. mov al, [rk]
    % \- }4 q7 m7 D5 P7 H( x$ \/ b
  122. cmp al, 15 F' R0 G8 p( N; ?# n' w
  123. jne  casemo$ @0 y( ]* [8 u, V' h/ F: V
  124. mov [okcheck], 15 C# W4 X# z) J. s1 `" w- X
  125. mov al, [pass]( V- v3 \5 u9 R
  126. cmp al, 1
    ! C; V- x1 z, L" G; t  z9 @
  127. jne  casemo
    / Y7 z( S# u5 t6 \& f
  128. mov ax,0002h
    . p, O4 c5 c  c
  129. int 33h
    ' T0 @2 G, f( Q+ C# ]" U
  130. call cleascr
    ' \0 s# N: X+ d5 ^
  131. * V1 W- ], s- U7 u  |/ S' l7 k2 n- Q
  132. call oldint9 M" J9 S. c5 ?& R2 C6 f. L' c
  133. mov ax, 04c00h
    8 h0 h$ ~! L5 B9 h% B& E1 b
  134. int 21h
    9 _) ]3 Z# w" ]* Q: k4 p& X
  135.   z* `3 c3 c' B  U3 n% x% c
  136. okexit:, L9 y  b% w8 Z$ z$ m
  137. mov ah, 4ch
    ; g: e  O' k' [- d  U5 Q
  138. mov al, 06 I# t$ n% Q4 |# n$ {. D
  139. int 21h
    ( L- b: j4 [1 _$ {  ~
  140. listl:                                 ;Show ON
    / y! l5 Y) `0 D& Y. q0 j
  141. pusha
    , A; A- K& w4 b9 M( P" J
  142. mov ax, 0b800h+ R# N; v6 l6 _0 n, e7 ?, m! F
  143. mov  es, ax0 m# F: `$ _1 h+ O" [$ T
  144. mov ah, 47h# T* s: P  d- ~& v* _/ \# {& p
  145. mov al, 20h2 Z' E$ Y6 F: S
  146. mov es:[si], ax8 F; P8 t% v2 f$ m
  147. add si, 02
    7 I- e  c+ t1 ]: ^
  148. mov  al, 4fh( \4 o3 H% K) M8 p
  149. mov es:[si], ax" ^+ r  D/ }" R6 {: V# d7 T
  150. mov al, 4eh$ y5 Z& @, `- G- i' w, Z) W; n
  151. add si, 02
    $ z+ W2 a0 l! w7 N. X4 C& L- k
  152. mov es:[si], ax
    4 p' [; ^* R& L+ U2 d+ @8 d7 u
  153. mov [lk], 1
    - O" m0 @3 P0 D) j: b( Q3 n5 ?4 Z
  154. popa3 X$ D( v8 K! M1 _  J! H
  155. jmp testr% H: U/ o$ m+ K; M7 {
  156. listr:                                 ;Show ON
    0 j3 \: x& ~% R# P4 d, C
  157. pusha
    0 T' v6 Z/ A2 r* T
  158. mov ax, 0b800h
    % U0 D8 I2 C6 p& Z
  159. mov  es, ax
    ' p- d$ r, `; [) |. y& t
  160. mov ah, 47h: _( b  `$ Y) `5 r2 \: [. v" a
  161. mov al, 20h4 z* B5 M9 L4 a) a4 q. q" X
  162. mov es:[si], ax) q4 D. ?. y: C
  163. add si, 02, M! f0 `; B/ k! I; ]: v: h
  164. mov  al, 4fh6 P+ g8 t9 k: L4 Y. J4 b
  165. mov es:[si], ax1 j; @6 U% Z3 O2 z: P) V0 ]& S& R% V0 J
  166. mov al, 4eh+ C* V3 F$ J: {
  167. add si, 020 V2 S, V; C) q6 C6 Q5 Y9 T
  168. mov es:[si], ax
    . w! |: z& [/ Z- y" j
  169. mov [rk], 1
    ; Z! m  D# X/ [, b
  170. popa
    , Q5 E! a, R) T7 Z9 z4 m
  171. jmp  casekey
    * K9 C. i  X, r' _

  172. " ]+ Z& u2 z$ m: c( E% \5 U8 \
  173. nlistl:                              ;Show OFF
    & o9 Q- u' O2 g# y& F# V5 {
  174. pusha   % V, L% W+ D2 n# P* z. Q9 g
  175. mov ax, 0b800h) y& e3 L0 u" V9 m9 n: z. g. e8 q# f) z
  176. mov  es, ax# R. w* y" f# k
  177. mov ah, 17h$ K; n0 N4 R! }6 u6 e% H
  178. mov al, 4fh
    3 Q2 ~! u5 k$ I
  179. mov es:[si], ax
    * d8 `$ a, S$ G( P
  180. add si, 02
    - x2 W% n8 p! G( @3 S; s' w+ b; B
  181. mov  al, 46h) H" I( h) ^) }( G
  182. mov es:[si], ax& q. C3 S$ q1 ^2 G" l8 L' W
  183. mov al, 46h, e! L% o* W/ F! S. P
  184. add si, 02
      o; U& q7 s( R% E+ g- _
  185. mov es:[si], ax4 B' B  ^  I8 k
  186. popa9 X6 d2 ]& U4 Q! n) t
  187. cmp si, 1840, N* x3 s6 O1 K
  188. jae casekey
    ' D1 r5 {/ X# f1 |' E0 f) b" _% b
  189. jmp testr9 U7 B$ Q* [; b0 H
  190. # C' ~" ~+ w" l$ E' |/ A5 F
  191. kpress:                             ;Check key press if press<ESC> then EXIT5 T5 \  X; z+ M1 \% {* b5 G
  192.         cmp     ah, 01h             ;and return a error; A8 R* [. u* ?$ x
  193. je exit1
    ! T3 ~9 r! C1 w1 A3 G. K" o3 h9 Y
  194.         mov     ah, 0ch             ;if press other key then clear# x0 T7 M7 t  r* P: b: p& x
  195.         mov     al, 00              ;keyboard buffer
    3 {3 A( E+ _5 o7 N) a) o7 b5 r5 ]
  196. int 21h4 c6 J) k7 C% f  v  f! _. e: F
  197. jmp casemo
    4 [9 U" A0 `* W

  198. , V! w( M& F+ k
  199. errormsg:                           ;if mouse driver no install8 p5 \+ H7 }0 A8 U4 O
  200. call oldint$ g! W( P5 k1 I1 P
  201. lea dx, offset emsg
    : [( G7 i9 [& F
  202. mov ah, 09h5 L% Q6 p, ^7 ?
  203. int 21h1 a) m5 T7 N! J: @; O
  204. mov ah, 4ch
    5 W) m! Y' z6 ]; G
  205. mov al, 2  v$ a# a, q- r4 {; A" \2 d3 t
  206. int  21h
    # Q9 c5 J4 k+ F
  207. - N4 ]* O) \2 l/ s# v. M1 k( K# g
  208. exit1:                              ;error exit
    + {4 {2 d6 j( q7 L; d/ Z
  209. mov ax, 0002h
    6 w+ G1 \" @- d# _* J' Y5 r/ t0 v
  210. int 33h
    2 I- g. E! U( W
  211. call  cleascr) ^5 b2 U0 u4 k0 H/ P
  212. call  oldint0 D$ C9 c0 F4 G- {! t/ ]
  213. mov ah, 4ch
    : Q9 D8 P' D0 d0 Z: V" M* j& }
  214. mov al, 01( ~9 z1 D0 k2 _! ]8 R4 ]
  215. int 21h
    * o6 `& v8 D7 P" m

  216. ; R1 R. P: W! F  _) P$ f
  217. cleascr proc    near                ;clear screen
    ; N8 i* k! j* j/ _! ^
  218. pusha
    0 X% b  B5 B. n9 W; F. H
  219. mov ah, 069 [* P. k, f% W" Z
  220. mov al, 0
    0 X; _, n* P' @  r  E
  221. mov cx, 0, [( M( T+ |& t) `" M
  222. mov dh, 24
    1 @$ D7 g" s! y) R- A' }8 I
  223. mov dl, 79
    5 g6 R/ h" D4 H) G5 p2 A
  224. mov bh, 07h
    0 s! X7 V2 ~$ b' L5 B
  225. int 10h. `5 @1 C3 m6 s  _: `
  226. mov ah, 02
    5 ~1 ]% n6 K( p2 K- l7 j, v
  227. mov bh, 00
    1 i5 T" E2 [, S* @- Q' o, s7 c2 [
  228. mov dh, 0
    ( Z/ A7 X+ y& z, [; O; Y1 E% w  N
  229. mov dl, 0
    " `3 k4 g6 Q! B; ]
  230. int 10h
    - A" B+ [; O0 P; J2 ^- S! R- q
  231. popa7 z% \* V1 _  j9 D3 C
  232. ret  C/ A+ D0 G; @, ~) s( H5 B) }: D
  233. cleascr endp: _' C& G" @% g+ C+ c( s
  234. - f9 |( y" C2 Z) c
  235. showmsg proc    near               ;Show info
    8 R5 }( t0 o+ W+ c/ j- n
  236. pusha$ ]8 [2 i9 i# D' y' t5 V6 k
  237. lea di, offset showms- z# a+ v5 R  a2 K3 x( ~. |
  238. mov ax, 0b800h
    & F0 |1 P3 J3 X
  239. mov es, ax1 h1 l) q* i. z( {! v/ n* T+ j
  240. mov si, 0
    0 _' u: t! ?( k% @- s( @) O- H
  241. mov cx, 480
      Q0 f, p" {6 E: T/ B5 B
  242. mov ah, 07h. \$ ?" V; z5 E5 Q" {
  243. @@:
    ( V( p" z1 Z1 D# [3 J
  244. mov al, 20h# S; P1 z6 J: I8 C3 c$ }: P3 T
  245. mov es:[si], ax
    2 R9 `9 ^2 J; l' z' h
  246. add si, 2
    6 V  I. u. J4 u/ y/ x
  247. loop @b) G+ J  k- U# T( H7 P
  248. mov cx,880
    : b9 B# ?* m) @1 W6 H# w; y* m" }
  249. @@:+ u$ y5 W; \5 J
  250. mov al, [di]6 n# E$ `0 A* _) R: I* f1 o
  251. inc di
    " L1 x3 R7 J2 G4 ~* z
  252. cmp al,20h
    - {; H* \6 O' K$ d. U
  253. je showch13 R! `5 G% Z. X' |( e6 X
  254. mov ah, 17h
    8 H0 ]8 l2 F: j" L" ?6 |. {+ i% X
  255. jmp showch3
    ( _" D, o* ~% ^, w9 H- ?/ c
  256. showch1:- I) k1 M# {+ I" p2 R
  257. mov ah, 07h
    5 S4 k( c$ d2 w+ N0 l$ Q
  258. showch3:
    0 p( @# S1 [2 w
  259. mov es:[si], ax
    % B  h' e1 l" W/ @
  260. add si, 23 i6 i/ P! @2 S
  261. loop @b* F- }& i2 R# e
  262. popa+ x; a$ H( V- M7 V4 U2 h) J. p1 Y
  263. ret  G3 b& K$ d2 ?( t+ \- P. [- g
  264. showmsg endp) C0 G/ \1 f' j* Y1 }

  265. 8 K; Z, h( h  ^. x5 _' U5 _3 ?
  266. oldint proc7 m( ~! i. c; l! x  w2 M
  267. pusha
    6 x# s5 |- q) i! E! e4 F
  268. mov ds, word ptr cs:[old331]
    4 e# ^, r- g# Q$ V; X: N
  269. mov   dx, word ptr cs:[old332]4 y. p0 c& G. w7 Q* {. b
  270. mov ax, 2533h
    0 k0 }4 x# _$ o2 T+ a8 X
  271. int 21h: y; U2 Q! T2 m$ d6 u4 p  b% U
  272. mov ds, word ptr cs:[old741]# z1 r  R9 V# J8 Y+ v$ t
  273. mov dx, word ptr cs:[old742]+ c* Z5 j, P  o( |; ~
  274. mov ax, 2574h& I9 I' p1 O3 p; b7 Z& \8 ]
  275. int 21h. N2 V/ ~' y" D) F3 G6 W
  276. popa. Z4 |+ g/ q" B4 l" _. M: ~' h
  277. ret
    2 W; Y! Z# {6 R" a. k
  278. oldint endp
    + [# w/ y/ R7 f2 ?( ?/ V5 ~
  279. 2 l0 {  J8 m$ q6 U( _4 A
  280. memmouse        proc& [- v/ U5 `9 ^4 @; w; \0 N2 ~' ^
  281.         xor     ax,ax
    7 ^) M6 @* u  A! n1 U$ ^& R0 Z
  282. int 33h8 H; m8 S8 Y$ i& ?% N" d9 l% o
  283. cmp ax,0ffffh
    ) o; U' J; x+ m. B
  284.         jne     not_loaded
    5 ^" ~7 d# F( F2 b
  285. mov [memcopy], 1. g' o! t( s; r1 M3 S. [
  286. ret
    , g+ X" E7 t% Z

  287. # m+ `/ s( g  Y: X# s/ ~' `: i
  288. not_loaded:
    ( p" `# m& p" j- I5 N

  289. 4 }+ D1 V0 S8 w% Z) E
  290.         mov ax,2574h
    0 R& d. @+ X. X( S! g
  291.         mov dx,offset new_isr1 z+ `, _& ]' u5 F! V! `' [
  292.         int 21h. h! y. ~3 m. q& J; c, M5 w: v

  293. 6 \2 b/ x. o+ [' T! @5 x1 S
  294.         mov ax,2533h
    : L* h+ H- {. c& A2 J9 w+ q4 z) ?
  295.         mov dx,offset new_33* u, q7 _+ z; |% w% }( A, m% c
  296.         int 21h, H5 G0 [" _( i0 G
  297. 3 [$ m# H9 `  r: {; X
  298.         cli
    7 m6 v) \, D/ F

  299. 9 p. c' e3 ?  E; a) @! v, @, V
  300.         mov bl,0a8h- G7 ^3 C+ P  u" e$ @; Y7 y
  301.         call keyboard_cmd' V6 X' a" T6 U! h

  302.   K" |% L9 z/ @7 R0 U, o$ I1 x
  303.         mov bl,20h
    7 b( J' B9 g% B) k3 X
  304.         call    keyboard_cmd( J$ j* u. ]+ S' b8 z4 i4 L2 z0 @
  305.         call    keyboard_read
    % b- `7 S! r# U) D/ q0 Q4 q
  306.         or      al,27 X2 V6 z8 R/ L  ~9 V
  307.         mov     bl,60h
    1 l! ^$ f% B* O5 c( T
  308.         push    ax0 F. K% r; a! W, r: c
  309.         call    keyboard_cmd, |' R3 Y& Z% f( }
  310.         pop     ax
    2 f7 W/ h) R6 u# i  F  M
  311.         call    keyboard_write  ~4 @0 t! O4 \2 K

  312. : ~) e4 \* ?( O' }+ q. m& z* l* {
  313.         mov     bl,0d4h
      q! f: Q1 L) K. Y
  314.         call    keyboard_cmd
    8 f/ I( ]. d  v2 g, q( e1 G
  315.         mov     al,0f4h4 i% C+ D1 a* k" \1 k& ?7 b# l, t
  316.         call    keyboard_write
    & c& L9 F& z8 W  h* O& O7 }
  317. + g( F' _& `* M! F1 h" B8 u
  318.         sti
    ) v6 p3 o  B4 ~1 [: c
  319.         ret
    + x0 ^# l- n" j5 X( ?* j# ]5 ~
  320. call_user_isr:
    # L$ H. U' g7 N& @; Y/ q* _. i
  321. db      60h, x& |$ K1 [* \3 \' @/ Q2 l3 _
  322.         mov     cx,cs:[pos_x]# C5 E3 C1 N6 U; `. j2 c
  323.         mov     dx,cs:[pos_y]
    0 v- l9 o) G) T" F: y
  324.         mov     di,0 ;cs:[x_move]
    + v6 J/ M2 W1 a0 O4 }3 W, Q2 v/ E
  325.         mov     si,0 ;cs:[y_move]7 ~6 W- L9 s$ Z* S# z! m; z4 N
  326.         mov     word ptr cs:[x_move],0
    & _( _  `( _& [( A, g
  327.         mov     word ptr cs:[y_move],0# O: D) o3 o* {6 G! q
  328.         mov     bl,byte ptr cs:[buttons]
    ' H7 W- s, ~) D, _2 h/ I1 x/ h. e3 y
  329.         xor     bh,bh
    ( p% I1 B) w% x; ]
  330.         call    dword ptr cs:[user_subroutine]( s' v) n# v( m* s' W# Y% I1 \
  331.         db      61h' F* [( L5 v; g5 b: s& a6 w
  332. ret$ b( z4 l0 \3 P
  333. new_isr:
    5 \1 o, z+ m2 s: i. d! H! }. U
  334.         pushf
    # E$ H8 K$ X$ H1 p$ }4 n7 f9 p  P
  335.         cli
    ( T3 q; n* v9 f0 h' v' r
  336.         push    ax* r% B) \* _& ]
  337.         push    bx
    / l1 S" n3 f: T6 k
  338.         push    cx
    8 {  N8 m/ K" W7 [& }
  339.         push    dx
    " o4 U6 [8 w! _/ H( ]  D, S
  340.         push    di
    4 g' w' E8 \& ?- l; C
  341.         push    si7 n/ k. U& h5 _8 o' e' h, j+ N) Q
  342.         push    es
    3 R! D8 {3 K! M
  343.         push    ds0 _& l4 |3 R; x" ~. S

  344. 6 j3 _) n% x; V! {
  345.         push    cs9 y" C5 u) R* M7 b
  346.         pop     ds2 C' z9 E- |& `4 W5 k: n& |& J% U+ J
  347. % e2 ~$ @  R* w9 I' W( G0 S: ?) P
  348.         mov     bl,0adh/ r% E4 |+ M* R+ @
  349.         call    keyboard_cmd
    . r. o3 k( K$ _) a; B4 V

  350. ; i: S  u* ]& W4 [
  351.         cmp     byte ptr [first_time],0& q/ a% e# t! x7 I  W
  352.         je      not_first_time
    4 z" J3 ?1 a# |& F5 i0 c
  353. 8 F. u  w- f/ T: T; V* B  `: A
  354.         mov     byte ptr [first_time],07 k& o' g" p, C, R  u
  355.         call    keyboard_read4 a$ J4 ]3 o% P1 ^
  356.         call    keyboard_read
    " E! T# \, {3 _; E8 J4 v
  357.         call    keyboard_read; D2 B4 Q; V$ s8 H# H7 T; Z7 W
  358.         jmp     no_show
    " N6 V5 N4 }3 z
  359. $ X% ?& Z, ~9 C5 U+ Q1 |
  360. not_first_time:
    6 g6 n$ M2 R' M1 e2 A
  361.         mov     word ptr [temp_mask],0& ?$ j! w# G8 R
  362. 2 x# E7 K9 ]( h; p- E
  363.         mov     cx,[pos_x]1 `' `  o. W$ t8 Z# Y
  364.         mov     dx,[pos_y]
      J& n# `' \. J

  365. ( C4 [, g* H: Z. O( U; M- a
  366.         call    keyboard_read
    * G' W0 W4 ~7 r$ n$ a5 [
  367.         and     al,7 ;3
    7 X8 V4 U( o# H8 b( F1 V. z! e
  368.         mov     ah,[buttons]
    ) A; \9 o! b' S) ~5 O% M
  369.         mov     [buttons],al
    , K6 s" P$ I* i7 F' c  {: m* l9 Y4 V6 B
  370.         cmp     al,ah; m% q3 M% M2 c, }/ b3 ]
  371.         je      no_button_change
    : e, N. N: |7 {, ?/ _* J
  372.         and     al,3, Y* M; A6 y( Y" S) O
  373.         and     ah,3$ ~: ]; m! n& \( F+ u8 M2 V* S/ }
  374.         xor     al,ah7 B4 C$ b% F7 Q+ `0 U
  375.         xor     bx,bx
    * _) d0 \9 u( r3 ^
  376. 1 e3 }$ I" O3 `) {( u" U/ J8 c
  377.         push    ax
    $ ^0 f1 `# x3 B) ]) O2 A
  378.         test    al,2
    7 E+ i" e" _6 o; P* d0 f
  379.         jz      no_right_button_change/ j0 A6 f1 j" V; w2 ^/ k
  380.         and     ah,21 r1 V7 D% c  Z" v
  381.         jz      right_button_pressed2 ], R# W* k% H8 K) y
  382.         or      bx,16) F" t  x- b; w
  383.         jmp     no_right_button_change: ~5 |& j# d% G7 L, ^+ x' V
  384. right_button_pressed:
    6 z$ e  [6 y/ [/ H4 D- t+ G# k
  385.         or      bx,8
    ! r. _. N/ B1 l- V
  386. no_right_button_change:
    6 j( i3 `1 L* H3 H6 Q8 A
  387. & q& F* ^* N4 \4 C  d
  388.         pop     ax
    % Y# N/ M0 Y+ ]; _/ Z7 G
  389. ! N; H0 V0 A- \8 N: v2 r& a
  390.         test    al,1
      q) c0 c% z% i% v+ }9 w( C
  391.         jz      no_left_button_change
    ( w4 o1 q' Z7 y' k9 ^6 \
  392.         and     ah,1! o, n/ W5 y5 p; h9 u
  393.         jz      left_button_pressed9 T; S+ w- E7 _8 {4 l
  394.         or      bx,41 l3 M( ]' k- y/ t/ `1 e5 @5 {
  395.         jmp     no_left_button_change
    . l8 U2 B$ [3 p# b& @# r
  396. left_button_pressed:
    2 v6 P& V5 b: ]* n  w4 F# O" l# p3 k
  397.         or      bx,2. ~. T2 o5 h( n+ \- {2 d
  398. no_left_button_change:- b* t1 y2 z! r5 l" i: y
  399. : [3 n" `- A' R
  400.         mov     [temp_mask],bx7 }4 \. E- [% l4 \* h" R

  401. , t0 S1 u6 F2 k# {2 W) ?
  402. no_button_change:
    ' O9 g! V, k/ T  `
  403.         call    keyboard_read
    7 i* C& z2 P# V/ b
  404.         cbw( R4 i7 \9 \- E
  405.         add     [pos_x],ax" h! a) \% [  F! {0 M1 c9 Q
  406.         add     [x_move],ax" R, G5 K- Z$ ]/ e  q- u$ W+ X5 b
  407.         mov     ax,[x_min]: e2 }% k$ Z, S. w. D% @
  408.         cmp     [pos_x],ax
    2 j( Z  |% Y+ ^. [+ T
  409.         jg      good_hor1
    & T) Y6 W9 X8 g) s0 t; b* w7 l% m
  410.         mov     [pos_x],ax
    $ \. E3 M7 g/ T4 \4 `
  411. good_hor1:
    ! i& ?9 t8 b- f! O
  412.         mov     ax,[x_max]
    1 t4 f. c- M- U
  413.         cmp     [pos_x],ax
    + @- C* W9 f& a2 P$ a0 t
  414.         jle     good_hor2* _+ _3 K! e! H% h2 h6 D$ O( j
  415.         mov     [pos_x],ax. v! k$ |; `+ p3 c4 \
  416. good_hor2:
      b0 i) o* Q" i  A/ Q) T

  417. 2 b/ f" H- e  j8 y7 b$ b8 n- L
  418.         call    keyboard_read
    1 }9 }" n  u- C9 D( m" t9 D
  419.         neg     al
    ; f9 ?% M3 V8 [+ K5 n$ f& l% V! M
  420.         cbw4 {! P( S- N; j$ y& V% f
  421.         add     [pos_y],ax
    2 n4 g+ g: s. u% R1 U
  422.         add     [y_move],ax- W3 i2 v- T( M! q3 b4 d1 ?
  423.         mov     ax,[y_min]
    & u) a) B: h8 P8 Q) t  l  B/ M
  424.         cmp     [pos_y],ax
    & w- ?! U: E5 U" D& S
  425.         jg      good_ver14 j7 H2 u' Q  m$ c
  426.         mov     [pos_y],ax
      A# R; s' t& K9 t8 j0 v6 ~
  427. good_ver1:
    5 w+ n* \8 M5 t- t' D# U: {( k
  428.         mov     ax,[y_max]; d* ?) @" `3 s& o: n3 E! u/ n
  429.         cmp     [pos_y],ax
    1 T1 g0 M! |- R1 o
  430.         jle     good_ver2
    # ~% P3 K  {; I- J, s
  431.         mov     [pos_y],ax4 j- A% Q% j0 R0 K3 h# `( n/ I+ \
  432. good_ver2:
    $ R/ X6 e# y: ~2 b
  433. * R/ S2 |0 T+ x' l' U3 V
  434.         mov     ax,[x_move]
    5 [2 z1 V3 U) i5 z* y; F
  435.         or      ax,[y_move]+ [4 N$ B% X4 h
  436.         or      ax,ax
    - V) S" X% p' z3 f, X
  437.         jz      no_change_position
    + f4 w- k& |0 L& o7 G
  438.         or      word ptr [temp_mask],1
    ; W, ]3 Y7 {9 {# J1 I5 J. H
  439. no_change_position:
    ! r( \6 d6 t4 `1 H

  440. - b5 m  o$ b, }
  441.         mov     ax,[temp_mask]
    : F- f  c3 l% i7 E8 j# V* b( w
  442.         and     ax,[user_mask]2 ]" `: v- U( }$ H1 b, V! j
  443.         jz      no_call_user# t3 B! b3 r$ ?8 j! S8 ?
  444.         call    call_user_isr
    $ L0 P  `, G2 x' k6 m5 g8 l& W
  445. no_call_user:! w! T0 r! t; y$ N$ ~
  446. ) K6 }) x* A0 k6 K) J7 \! [5 E: v
  447.         cmp     byte ptr [sm_flag],1" R* k/ Q- [  L3 d1 C
  448.         jne     no_show
    ' w7 j2 Z+ M/ S' |
  449. / z: H# z4 c. M
  450.         shr     cx,3
    - t5 l, i* m2 \
  451.         shr     dx,3
    + H9 ^+ l7 Q/ n* V! a" ]. g2 d1 k
  452.         mov     ax,80
    ) r9 F0 W7 ^9 @' l
  453.         mul     dl
    0 L+ b9 S* E; y) e! J
  454.         add     ax,cx, W: x, ]' N9 {
  455.         shl     ax,1
    2 u5 ^) l1 O! A' f- p* G! o% N
  456.         mov     di,ax
    6 {5 K' b, y4 j) t5 Y3 o& _
  457.         mov     ax,0b800h" ^( \- p3 x/ |" t
  458.         mov     es,ax
    + D4 g& e8 W3 K4 A/ k1 m7 V
  459.         mov     ax,[save_char]/ k  e- o! J7 }: h9 a$ q+ Z
  460.         stosw" A# {  B" D, B' e3 S6 L* P; ^

  461. # m/ d5 L/ G) n5 A
  462.         mov     cx,[pos_x]/ a4 V$ J3 [4 m' ?% ]# X
  463.         mov     dx,[pos_y]4 ^# K6 P1 B- |2 [5 ^( f0 x/ l# s4 R
  464.         shr     cx,3
    8 q& T8 |2 ?1 s0 F
  465.         shr     dx,3
    . @. c9 M; l9 k& W- I. W
  466.         mov     ax,80
    ( ~2 J. g0 }# H. \  a1 c' `
  467.         mul     dl
    6 v& a1 h+ f* B3 N, `+ k
  468.         add     ax,cx
    " |" }: X  T1 p# [
  469.         shl     ax,13 [& [+ l* m4 Z% ~1 O
  470.         mov     di,ax8 r) q3 B, b( ^0 {: U
  471.         mov     ax,0b800h
    ; }3 X' S( O0 ?2 {
  472.         mov     es,ax: I  W$ K5 p& B2 J8 S% ^
  473.         mov     ax,es:[di]
    . J7 [7 `2 Y8 f4 V5 D
  474.         mov     [save_char],ax' S- s1 Q, e: t
  475.         not     ah
    ( w5 {0 v- y+ \' F" L" J, |: Z8 W
  476.         and     ah,7fh% S- S4 Y3 U0 S) F! ~3 D- z
  477.         stosw
    7 x6 b- W3 F# E6 u6 [
  478. no_show:
    , M# U: N4 ^: w3 w- a
  479.         mov     bl,0aeh
    / R2 b6 ?8 z' m+ f; K2 L
  480.         call    keyboard_cmd
    9 J$ Z7 z6 u5 ]3 }" M+ z0 O* p+ t

  481. 0 I6 w! o: e; y7 A$ C9 L% q
  482.         mov     al,20h: J# S5 y, i. p- o$ X1 I
  483.         out     0a0h,al
    & [  c- E8 G, p4 u2 n9 R
  484.         out     20h,al7 A) w3 N$ a6 q0 ]
  485.   R  }. s8 T) t
  486.         pop     ds
    $ w& M. B/ v! ^' J
  487.         pop     es
    * E) y- C" a$ K. a' z& W# s
  488.         pop     si
    & U% @1 S) x+ l6 _& a
  489.         pop     di
    ! M5 D$ H6 }- Z8 d: R, a$ h" E
  490.         pop     dx
    " w; h8 e0 Z5 L# w+ v* ?2 R
  491.         pop     cx& l- k- A: o- ?% p+ U
  492.         pop     bx( i* g  C' U  p2 `1 G0 q9 I
  493.         pop     ax
    / \5 n! [# C: g: {3 E) H7 L
  494.         popf- y1 N$ ?, [' R& d. q6 @/ d
  495.         iret% G3 A' E* f  k; G  P1 [
  496. ; ]" x! X6 n8 j( d9 Z8 e
  497. first_time      db      1; q3 w$ k7 X( l  w  U" o
  498. buttons         db      0/ s2 H; D) n) `; `" t; x/ Z% Y
  499. pos_x           dw      04 C3 X; o1 p& v" w; T# h5 ~/ _
  500. pos_y           dw      0
    + s! P- z2 \0 B4 t
  501. sm_flag         dw      0
    9 w" P; o7 F6 S, {: |. i( R
  502. save_char       dw      0- ~* S( X) E1 c$ v
  503. x_move          dw      06 s8 M7 E7 n/ c) f, C
  504. y_move          dw      0
    + t; z0 u$ W, `/ Y3 ]! V
  505. x_max           dw      639: g2 l" r! ~3 Z+ b0 Y9 w( D, \8 s. O
  506. x_min           dw      0
    ( B, f( _9 A- |6 ^
  507. y_max           dw      1990 z1 S2 ?+ B+ k, K2 q
  508. y_min           dw      0- a9 G* k2 s& ]8 k; S
  509. user_subroutine dw      0,0# |! U5 b  n5 f4 o9 g
  510. user_mask       dw      0
    2 q# @5 t3 B  n, t$ P
  511. temp_mask       dw      0( b/ s0 a- A1 I' Q# P
  512. 2 Z1 O9 K" |# N; r3 i
  513. keyboard_read:; m5 p, U' |% Z9 k0 l: x
  514.         push    cx
    . M7 k; p) l& p- P
  515.         push    dx
    : w  D0 O' Z/ e1 y
  516.         xor     cx,cx
    " X$ ]' J; }$ v8 a6 G
  517. key_read_loop:) @' h* p3 T# r: p. d+ E1 |
  518.         in      al,64h3 B, I5 \; m# q4 ?' g- \
  519.         jmp     $+2
    9 d  h9 |# I2 a* B( u, b5 G
  520.         jmp     $+2
    9 y% s, d( b3 H0 Z" g  q8 C
  521.         test    al,1  @5 ~3 H1 a3 u6 `5 V3 }
  522.         jnz     key_read_ready+ O9 G( P6 R; p
  523.         loop    key_read_loop; v7 A: Z, d2 R2 e0 {
  524.         mov     ah,1
    / l$ K& r& j2 I5 s( r# i
  525.         jmp     key_read_exit
    $ p! |- @+ M! A6 H. z
  526. key_read_ready:' e. F. p3 q( [* F- d3 b
  527.         push    cx
    6 I* o5 d2 j9 @* A( q; u. f
  528.         mov     cx,323 y$ x( ^; [$ b' f' ]. R+ v. H
  529. key_read_delay:
    / v, P. M  p! ^  v* S
  530.         jmp     $+2' S# a) U% p$ p# K' P
  531.         jmp     $+2  |7 q" p. [4 [" S, m$ }
  532.         loop    key_read_delay
    " Z/ O* h9 I& z/ H" m( u
  533. ) s+ d; n5 P) g9 C
  534.         pop     cx
    # ?9 x% V+ S7 n5 X, g4 x
  535. 0 G4 c8 ]/ r& m
  536.         in      al,60h
    6 `/ k' q* K6 q6 A! ^8 k; d
  537.         jmp     $+23 r5 ?" F. P: s# o2 {* R4 B; T
  538.         jmp     $+2
    4 G" |5 q2 e* @* t2 T8 U4 f; P( N* u
  539.         xor     ah,ah  v9 Q! ?7 T- i  k
  540. key_read_exit:7 C& `1 W4 x- i, H
  541.         pop     dx
    3 X! T- t  p1 J- F: d
  542.         pop     cx
    . |" Q: e0 ~' O2 {
  543.         ret# p- v2 L& Y7 l. l; u
  544. ; y7 T$ c. l# S
  545. keyboard_write:
    7 v4 _4 Z: Y* e/ N8 f( a
  546.         push    cx
    2 w7 S' @; P/ f: r' f9 ^
  547.         push    dx
    * E) H5 c& h) B5 v& D; c- {$ j
  548.         mov     dl,al
    7 K0 l& r% N  M' W5 `
  549.         xor     cx,cx4 v6 D( Z1 F: N
  550. kbd_wrt_loop1:! e2 |; P$ ~* F) N3 Q
  551.         in      al,64h
      R( B+ L1 X" W. Z/ i) z5 m2 W
  552.         jmp     $+2. }. E0 j  w6 K* v& H
  553.         jmp     $+2
    3 r+ ^  Z2 O2 a; b! H
  554.         test    al,20h& Y6 m! U/ r4 e3 F
  555.         jz      kbd_wrt_ok10 v1 X- U8 U9 j$ F' F

  556. - Y8 Y8 h/ W# d$ s* }3 N" `
  557.         loop    kbd_wrt_loop1
    ' F2 u1 d& ~" S
  558. & v/ ^& A; _! G# l1 E  \- p
  559.         mov     ah,1
    5 `7 _+ W3 e& l
  560.         jmp     kbd_wrt_exit
    2 ^2 ?# K% d) }( }0 @3 ~7 R- l
  561. ' l1 A# Q! T/ _! g
  562. kbd_wrt_ok1:/ r. ?5 M& k/ E9 t; ]0 c# L
  563.         in      al,60h
    . z* ]* i$ R" t% n! n* c, Y9 o

  564. 8 X9 g0 r) j: G2 ]3 c7 \# ~
  565.         xor     cx,cx! U: `4 V  h* {% U7 o
  566. kbd_wrt_loop:
    + ?. |0 A. v' ~
  567.         in      al,64h! j+ I' L( u& }
  568.         jmp     $+2
    / `* b% @) v1 V4 ^4 X4 m
  569.         jmp     $+2& \1 {. _. C8 A1 K
  570.         test    al,2# F% m1 l4 f, Q
  571.         jz      kbd_wrt_ok
    ( N( A) b: d( j, I4 `+ L
  572. 5 w' S, f3 }: v0 w, N0 x+ \; J
  573.         loop    kbd_wrt_loop
    % E2 {/ T! j, M7 t& a

  574. - X# [! |1 r5 g1 H& E* \
  575.         mov     ah,1) K  m- Q/ T# w3 f# ?7 O/ d
  576.         jmp     kbd_wrt_exit) v  {2 ?9 j0 k# M) I0 ~

  577. 7 U  m7 x$ P) Z
  578. kbd_wrt_ok:
    3 m7 b8 n# r$ y+ K- w5 k% k
  579.         mov     al,dl$ e6 t2 A! D# O* |. p# _- |% r  M
  580.         out     60h,al1 s0 Q/ d0 y* U% S
  581.         jmp     $+2
    9 P1 k/ Y. W3 |/ t
  582.         jmp     $+2
    # `& x8 m( _$ g/ J0 s$ n5 u

  583. 3 H6 @5 j" t" a. z6 \" x
  584.         xor     cx,cx  O/ w4 x9 S$ j$ L( J
  585. kbd_wrt_loop3:* c; t& z, C$ h2 t/ g7 n
  586.         in      al,64h9 y( a7 m! H/ B" _4 s
  587.         jmp     $+2
    " c6 V: t5 \4 Z2 ~9 b
  588.         jmp     $+2( r$ h8 J" q+ B4 J
  589.         test    al,2) y; E+ K) e1 V. u: Y9 X, d' v, t
  590.         jz      kbd_wrt_ok3
    1 b4 c4 a- f8 K' c" k

  591. 5 S0 r' d. @2 Y  U
  592.         loop    kbd_wrt_loop3+ |) w  s8 s9 k

  593. - d; V' L; X1 t' l! ^/ F
  594.         mov     ah,1/ {$ @& {- z* J) U9 h
  595.         jmp     kbd_wrt_exit
    ; }5 N: C" g: z/ U0 [' {0 ~
  596. 5 g* y" r1 V0 m! U4 h! c
  597. kbd_wrt_ok3:6 J/ ?. [, X( \3 F+ v
  598.         mov     ah,8
    % z% s4 f  m' R
  599. kbd_wrt_loop4:) q. N" s: }8 @, r- R+ J1 ?
  600.         xor     cx,cx
    4 d) @' H& X9 X7 b% D' T
  601. kbd_wrt_loop5:
    7 ]& `" k4 ?8 y0 v9 e' n8 {
  602.         in      al,64h
    9 S2 w, k- O0 h- f5 ]! V9 n
  603.         jmp     $+2
    " v3 S+ G! Y/ z$ J
  604.         jmp     $+2
    8 u: Z7 X) ^$ A8 W! ~# Q) I
  605.         test    al,1
    % x( Y  ^  u; e+ ~
  606.         jnz     kbd_wrt_ok4% B. `9 W3 J. N; M4 A: Q& X
  607. 0 ]  V9 G7 D* ^3 R6 i$ t0 |4 v1 s
  608.         loop    kbd_wrt_loop5/ R9 h  h& L9 ?8 e7 ]9 P

  609. 0 Z% H( B2 v7 J" }
  610.         dec     ah2 k6 u/ T0 b3 C/ ]- {
  611.         jnz     kbd_wrt_loop4) I7 S: o- N" g" [$ Q' k+ K

  612. 1 H' d( H* |9 _. B0 Q
  613. kbd_wrt_ok4:2 L$ L! b+ J1 n" E! ]
  614.         xor     ah,ah& h) A" J4 o( M$ i, ?
  615. kbd_wrt_exit:
    : T5 h- K0 u+ f4 z* o9 k' r
  616.         pop     dx
    + Z3 e" n2 m& G6 E# H  k
  617.         pop     cx& C& z8 K7 d0 B- C% J( |0 _& D: j) A
  618.         ret
    ' E( ?9 y6 B* d2 s/ s$ n1 T
  619.         
    & o6 k. Q2 X* j0 E9 v6 f+ Z
  620. keyboard_cmd:
    , \! X9 ?$ ?) B# f8 ~
  621.         xor     cx,cx3 G; C+ _2 W6 c+ `& T5 n
  622. cmd_wait:
    9 L; U; B0 i% F% \
  623.         in      al,64h
    / X& O+ [+ g3 O3 ]% d
  624.         jmp     $+2$ r" y* s. ]+ l7 l' I4 L3 J
  625.         jmp     $+2' {' g  I+ f' g3 K) A
  626.         test    al,2
    , k7 \) E: n+ D! j) Q
  627.         jz      cmd_send
    / I# p! e2 j5 a, l
  628.         loop    cmd_wait
    - q4 V7 [/ W. P
  629. 8 {1 k6 M  [! i" F: q3 ]
  630.         jmp     cmd_error5 f0 ~0 r$ L, A, }' j
  631. ' v1 r# H8 d( k5 O
  632. cmd_send:6 g0 X- ^! w8 T7 H4 e
  633.         mov     al,bl
    5 [" `3 W" F! S3 P" g5 c0 ]" y
  634.         out     64h,al
    ( |, E' Z. V, U5 g# r0 p
  635.         jmp     $+2( t' n$ f6 \/ t7 F, K% D' M* |
  636.         jmp     $+2
    9 w- ?0 t8 C1 F0 c
  637. 6 g# c0 b5 o+ }% ?, }
  638.         xor     cx,cx5 N- g$ R9 l, m# V+ M7 M
  639. cmd_accept:3 O. W4 ^7 N" J/ u/ F& }
  640.         in      al,64h1 V: W0 w0 o& ]! M$ N8 ?7 [
  641.         jmp     $+2
    3 A. t  |% u% e  e4 c
  642.         jmp     $+2
    ' E9 i; c( d% g7 U
  643.         test    al,20 t$ ^  f: q3 G
  644.         jz      cmd_ok
    & N3 {. U5 f& H3 L4 T
  645.         loop    cmd_accept
    : ^! b$ L2 f1 e! s/ V* k* g

  646. ! W5 M% ^9 z4 Y& I6 M
  647. cmd_error:
    / o! t: e% n: F, \- e9 A
  648.         mov     ah,1. s) p: ]* a2 p4 c& J" [: }
  649.         jmp     cmd_exit# g2 w+ C2 ^* b7 `) Z0 Z4 N
  650. cmd_ok:
    7 A  e$ l; j( _
  651.         xor     ah,ah! D# X3 T5 x2 t9 R0 O
  652. cmd_exit:
    2 C* i* i. K* ]5 h4 n2 X7 t
  653.         ret
    - Y; r3 h' J8 X& V
  654. 2 k4 u) @1 c% b6 F6 c# \+ Q
  655. new_33:
    8 J1 V2 j+ k( W! `
  656.         cli
    2 |6 D- C. R  m, x4 T
  657.         cmp     al,0
    - l; p5 o+ h+ q4 {5 B: {
  658.         je      reset_mouse
    ; S' J4 H5 s% c  `
  659.         cmp     al,1: @/ U9 }' M7 ]$ L: \
  660.         je      show_mouse/ b( `7 ~3 Q, N, ~6 l% L
  661.         cmp     al,2. X' B7 d; h9 A
  662.         je      hide_mouse
    0 p6 ~# w6 ]. J$ J
  663.         cmp     al,3  U! C9 k6 H2 O2 U2 Y
  664.         je      get_pos
    + N( F/ V1 g5 M5 t  ]. a7 T' g
  665.         cmp     al,4; k9 D  A5 N% |+ ?5 a0 m
  666.         je      set_pos$ o# @3 {0 f4 O. c9 i
  667.         cmp     al,73 P9 c' |: m3 u1 _
  668.         je      set_hor_pos2 f1 M' T2 y( w% {9 R4 u3 c4 ~
  669.         cmp     al,86 g2 O5 d" j1 w% \$ R% W: F
  670.         je      set_ver_pos
    " ~  s3 S) ~7 d# L$ W3 l7 `
  671.         cmp     al,0bh
    / p  i5 v& k4 W# Z( G5 E
  672.         je      get_mouse_movement! T8 K6 N# L2 d: ?9 A
  673.         cmp     al,0ch8 j- ?1 y1 n% d& M
  674.         je      set_subroutines
    ( H+ x' w6 G! X0 b7 D" X9 Q0 L, ^
  675.         cmp     al,14h8 o8 h  M! s) j- h. k: r7 N; S
  676.         je      swap_subroutines! T/ a4 M; J1 C5 S/ A& G
  677.         iret
    1 [  o) C0 |4 M4 e1 C$ y
  678. 3 H: J1 p9 F2 w# }
  679. reset_mouse:: b! h8 P* T; E! n8 C' e
  680.         jmp     _reset_mouse3 W, f( P+ {! ~( d7 T  U
  681. show_mouse:
    - \' f. g/ Y# Z: g
  682.         jmp     _show_mouse' H+ c. ]( h9 B- v2 R  q8 m1 d
  683. hide_mouse:$ S* S8 W: S# t
  684.         jmp     _hide_mouse- O! t5 A3 h" c- G6 x2 A
  685. get_pos:
    6 l4 R! C+ T/ t0 c
  686.         jmp     _get_pos
    : k& C0 b( k1 H! D8 @
  687. set_pos:8 i5 J6 L/ D. q+ q4 N
  688.         jmp     _set_pos
    $ b2 q) J; L: x2 x6 d$ e/ o8 G1 B8 D
  689. set_hor_pos:
    , V8 t1 g+ ~! A: }7 z
  690.         jmp     _set_hor_pos! e+ e1 e) G6 m7 z
  691. set_ver_pos:
    3 |' X7 b, e1 g, k$ n3 `
  692.         jmp     _set_ver_pos
    2 x& P; L+ U) ?/ |# ^( N& Q, t
  693. get_mouse_movement:5 f( r! S1 S- b& q
  694.         jmp     _get_mouse_movement$ W+ C7 h% {& s8 o% K7 F
  695. set_subroutines:
    - W; l/ `3 T1 B' _: R
  696.         jmp     _set_subroutines
    + f! A0 S" [% [0 o- S- i5 ]4 f* F
  697. swap_subroutines:( O0 t4 J; A- }. C$ Q8 T
  698.         jmp     _swap_subroutines
    . g' P+ p; e. @. b! _0 v6 ~

  699. 0 p, t! L5 M! R% ?% X
  700. _reset_mouse:
    $ x; s3 x3 x0 a3 Q* r
  701.         mov     byte ptr cs:[buttons],0! j  N9 p' F/ T* Z' T
  702.         mov     word ptr cs:[pos_x],05 {0 L" a% }# T% {
  703.         mov     word ptr cs:[pos_y],0
    ) E: B3 J3 ^% j8 J
  704.         mov     word ptr cs:[x_move],0" L  X9 R3 s% f+ i! g
  705.         mov     word ptr cs:[y_move],0
    + C9 K5 p* Q( n' J0 p
  706.         mov     word ptr cs:[x_max],639  W) D9 Z0 N) |/ j' V9 g, l
  707.         mov     word ptr cs:[x_min],00 q) m% [+ H* y" ~
  708.         mov     word ptr cs:[y_max],199" @7 H" ~% p" N. ?* L6 Q9 N6 V4 U6 M
  709.         mov     word ptr cs:[y_min],0
    8 ^" _: ^) f. c6 A+ @
  710.         mov     word ptr cs:[user_mask],0
    & W) M# [; ]3 p) K
  711.         mov     word ptr cs:[user_subroutine],0
    6 A; F* L* ?) \' T2 w, k! b
  712.         mov     word ptr cs:[user_subroutine+2],01 J* T: q' p  c  D: L
  713.         mov     ax,0ffffh4 A$ T6 J3 ?2 U: b& s; X" I* U
  714.         mov     bx,3' J, E; H) C& B# w# c9 O4 _$ E* r
  715.         iret
    # z- t' Y9 ~4 F8 m

  716. ) l3 {8 V4 [& ?. _% V: ^6 N
  717. _get_pos:& b1 T" u0 ?3 F4 l% |$ ~
  718.         mov     cx,cs:[pos_x]9 ^( P9 T0 s3 [) u# H' N3 [0 r
  719.         mov     dx,cs:[pos_y]
    " ]. d) O% H' H+ _6 t) F
  720.         mov     bx,word ptr cs:[buttons]
    7 Y! r3 I1 v9 M1 n% S; f4 ~* |5 E, `+ `
  721.         xor     bh,bh
    / a8 B; ]- A. u1 ?$ Q1 W/ K
  722.         iret
    / u  I1 m  _3 O
  723. + }/ M- _6 Z+ m% w
  724. _get_mouse_movement:
    / f4 ?% }4 e9 ]; K7 ?" U  Y
  725.         mov     cx,cs:[x_move]
    ' ?" n* Z- i* `3 K
  726.         mov     dx,cs:[y_move]
    & z  k# s& l* u0 A
  727.         mov     word ptr cs:[x_move],0" D& ^$ z; O6 g/ Q: g8 f
  728.         mov     word ptr cs:[y_move],0
      |$ b5 O" Y6 }- r  q! v1 y' W" ?
  729.         iret1 k5 U# G6 z2 i( Q

  730. 1 T. I$ P5 P" b) ?! w5 v6 H
  731. _show_mouse:& j5 \# M& \9 ?  Y
  732.         push    ax
    ! M2 J. _; f& `
  733.         push    bx
    8 T: z# H+ o1 V+ w4 A" K- `
  734.         push    di
    2 k# \( t- [- }" r
  735.         push    es* b) e3 q: V) B6 y0 j( Q
  736.         mov     byte ptr cs:[sm_flag],1" T. g& ~& u1 B  B: B* S+ i" F2 i
  737.         mov     ax,cs:[pos_y]! m6 P9 X+ ?" J5 Q( G' X9 p: j: n. Z
  738.         shr     ax,3
    1 q; b* x3 C( t
  739.         mov     bl,80
    % ?. w0 X' e4 ~6 i) I' x
  740.         mul     bl; X" y8 A% ]$ I& g$ D5 w! z
  741.         mov     bx,[pos_x]- u$ U  {/ S# Z5 M! p  {6 X
  742.         shr     bx,3
    # G8 D* N* J( _4 l& W
  743.         add     ax,bx1 v4 [6 u6 c! A$ ~
  744.         shl     ax,1. o% Q  x% ^# ]3 ]1 z2 A" a
  745.         mov     di,ax
    * V# d7 a2 I* s# |0 L2 j$ A
  746.         mov     ax,0b800h4 v$ \& R: c2 {
  747.         mov     es,ax
    / J" e4 [! X" \8 i. @" [" g- m/ @
  748.         mov     ax,es:[di]
    8 l/ N9 c* r2 L9 @
  749.         mov     cs:[save_char],ax9 A4 [" J+ j6 Z/ J
  750.         not     ah
    * z8 e1 E5 }7 ~
  751.         and     ah,7fh
    . S+ C3 Y2 R6 W& d
  752.         mov     es:[di],ax# q8 b4 t: q) P* E* k. A
  753.         pop     es
    & w- X6 p& y" N3 Q* ?
  754.         pop     di
    ; e1 k; n7 [1 u! A0 k- W! K) d! K
  755.         pop     bx. y" P1 S/ ?6 @, F4 ~: ?# L
  756.         pop     ax! e( A8 h  b' h2 N$ [
  757.         iret8 r$ l" r& B/ @( P# C* j

  758. % ~, ^0 @6 F% N8 s  l% K
  759. _hide_mouse:
    4 u( Y  `* o! d! u* l
  760.         push    ax$ B7 y) p7 h- W/ j% f
  761.         push    bx
    9 B6 e6 l7 i1 ]" [' s, C
  762.         push    di9 u! c5 v" G$ ~) P. d; d! U
  763.         push    es
    ' d; d, v6 U# X1 W
  764.         mov     byte ptr cs:[sm_flag],0
    . \4 m& l4 l2 ]1 t" t/ T
  765.         mov     ax,cs:[pos_y]
    * n: ^" H, A- V  F- {/ \
  766.         shr     ax,3
    4 s0 n8 H: p" L
  767.         mov     bl,80
    ; v1 e6 y& T0 L) G4 `- a
  768.         mul     bl
    2 e% J3 |/ _6 ^( h4 Q" {: Z
  769.         mov     bx,[pos_x]* Q( G( z6 Q( n/ N1 K5 O6 V% B. Z0 ^
  770.         shr     bx,3
    ( G: [2 F4 _; Y+ N( n3 P
  771.         add     ax,bx
    ; V2 f/ T0 {* A) U4 o8 e! @! s! A
  772.         shl     ax,1  i, s  k4 Y1 n2 E7 l: O6 |
  773.         mov     di,ax8 r5 M& ~; }" W
  774.         mov     ax,0b800h
    ( B$ }1 O9 n( Z9 b
  775.         mov     es,ax/ a. }/ ?/ p: Q
  776.         mov     ax,cs:[save_char]! v5 \: |7 v3 x
  777.         mov     es:[di],ax
    ( q; j% I6 k2 l6 v( k2 D6 ^
  778.         pop     es
    5 v" A5 c4 H8 g0 \* L, g
  779.         pop     di
    - [" V5 r$ {; i, @  s
  780.         pop     bx
    * B% V3 ?- o" ~4 E4 S) D; `
  781.         pop     ax
    ; o. X9 S( {( u  k1 s/ T: _
  782.         iret" s' B( \- J6 a3 U3 x; s
  783.   g0 X% h1 ]. V/ z" O# j8 C( I
  784. _set_pos:, T! t( Q; E% g/ Y: Z! j# E6 c
  785.         mov     cx,cs:[pos_x]$ P1 V! r. T0 s
  786.         mov     dx,cs:[pos_y]  U( o- t" G- t" @; `
  787.         mov     word ptr cs:[x_move],06 ^: v& s( k8 K6 w
  788.         mov     word ptr cs:[y_move],0
    ! U: h& Q. D8 j' a$ C
  789.         iret
    5 g7 {+ L6 }) B
  790. * G' j& s- O; w) I* K! A
  791. _set_hor_pos:' {/ F$ k/ E2 {( ^- Y$ m7 t) n
  792.         call    max_min
    $ v9 `2 p4 M9 a4 n9 S/ ~! t
  793.         mov     cs:[x_min],cx
    ) R( \# J% C$ ^" i9 D
  794.         mov     cs:[x_max],dx: U% {8 \1 p+ r% C7 v& z- b
  795.         cmp     cs:[pos_x],cx7 ~8 Y9 @! Z6 B% H- d( G* v
  796.         jge     good_hor_min! ?$ X$ o( F7 g) q# [1 ]0 [4 E
  797.         mov     cs:[pos_x],cx
    # D# Z, ~5 `6 r( w/ u9 d  N/ W% \* H
  798. good_hor_min:% a; i, C& S' S
  799.         cmp     cs:[pos_x],dx
    ! Q! z: }4 J0 K2 |
  800.         jle     good_hor_max* r& n6 |% l3 D. Y, w+ ]
  801.         mov     cs:[pos_x],dx& e1 I* b. A' C2 \; a
  802. good_hor_max:4 u: A5 Y& ^0 C; \5 I
  803.        iret
    ; {9 W9 e1 j- }) j- T
  804. & e) n7 ^1 L+ P2 `; o+ R& m
  805. _set_ver_pos:0 g0 B' Q+ A6 E$ \' y; J
  806.         call    max_min2 s; [! B% u- l/ e" v& v
  807.         mov     cs:[y_min],cx$ S9 s0 ^+ ~7 k. H$ x
  808.         mov     cs:[y_max],dx
    4 P) j" `* h4 B$ O. i% S9 N1 v# M
  809.         cmp     cs:[pos_y],cx
      z+ N7 X1 K' z' Z- \6 b6 N
  810.         jge     good_ver_min
    4 w3 c9 j2 _' J' E
  811.         mov     cs:[pos_y],cx# @5 E  L9 E5 q/ K+ \4 t# B
  812. good_ver_min:* V# q5 j8 i% P0 ]6 v
  813.         cmp     cs:[pos_y],dx- x- ?: `% C+ V# A) ]" t) n
  814.         jle     good_ver_max
    & L, T: n4 ?+ F# [
  815.         mov     cs:[pos_y],dx
    $ u9 N) U+ {' v5 @- G
  816. good_ver_max:
    ; F# [: ^  Y, i* y8 h# p/ J
  817.         iret1 N- s7 h  G1 |
  818. 1 r+ v9 u# N' b$ q
  819. max_min:  Z7 q8 T/ u4 C6 C4 v8 G9 j
  820.         cmp     cx,dx
    ; K) w' G) h& |3 Q
  821.         jle     no_swap- n' R# q: v+ P) P& m+ e3 n$ Q
  822.         xchg    cx,dx
    0 F4 Y4 L( R& V% Y% E# [( I7 b* {
  823. no_swap:
    1 C, p- L$ ]8 ^( D! O% k! m
  824.         ret
    ) d9 t6 v* ~6 x# B1 q7 U
  825. ( }: Z* b. C. _' m- t
  826. _set_subroutines:
    $ s- i# n) I) d5 b
  827.         mov     cs:[user_subroutine],dx
    / j% A! f, l% P' n- r* h, D
  828.         mov     cs:[user_subroutine+2],es
    1 a) c5 a/ ?3 P
  829.         mov     cs:[user_mask],cx& q3 m8 U9 q4 D8 `; ?+ i% f) M
  830.         iret5 h, K, c/ q, V# J

  831. 1 M! i3 J6 {: [( W; k
  832. _swap_subroutines:
    : ^7 k5 R8 y' U6 B4 ]2 y
  833.         push    word ptr cs:[user_mask]
    " `/ p( E3 d& s4 W
  834.         push    word ptr cs:[user_subroutine+2]: }2 Z7 B2 m& W9 D. M+ O) _
  835.         push    word ptr cs:[user_subroutine]# k$ O6 w: R7 ]2 y
  836.         mov     cs:[user_subroutine],dx8 a. ]* e3 G! M9 e% F
  837.         mov     cs:[user_subroutine+2],es# a. y% K6 C# v$ f
  838.         mov     cs:[user_mask],cx: Q9 @5 b; P9 J1 G' Z% T
  839.         pop     dx
    / d' B* _8 o$ R0 A9 l- y) l, ^; L
  840.         pop     es4 w1 S% U; N/ |/ M6 s
  841.         pop     cx5 N: X& {4 E+ D; O; \, Z
  842.         iret
    9 `! i6 h) o( y# Q! L5 L
  843. # f& c* T. t$ I) {9 g2 s' s
  844. memmouse        endp. B5 M) z, f3 p* e" j& ?

  845. $ N1 F4 O; ~1 p
  846. endof_start:# g7 ]& _* P$ L# f. P: D1 p" j
  847. , Z, A" u  N* h5 ~/ ]$ J" L
  848. emsg db 'No mouse driver install error!$'. z9 P  E' z& v2 X2 p7 T! R$ |) [
  849. old331 dw 02 ~6 I: I0 S0 c/ h
  850. old332 dw 0
    5 c5 S9 n1 F- O2 }  {
  851. old741 dw 0
    ! S  O$ S, T* d; S. e
  852. old742 dw 0
    2 ^' K$ Y* l: E' k4 ~6 g+ |
  853. memcopy db 0: _3 \+ k7 o: l0 L2 l
  854. okcheck db 09 ^* F3 [) g6 G* L
  855. pass db 0
    ' i# Z0 A7 W# Q# Z  n3 W  v
  856. chkl db 0
    ; B8 x; c7 ]9 A, J
  857. lk db 0# ?% V+ r. R. D4 D# K, O( e
  858. chkr db 0
    2 J3 D0 T& p; `  z7 x: y, ~
  859. rk db 00 X$ T7 P+ |3 v
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ( C- j; _5 c. j9 o; `
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    ) E9 _) E5 z: z- I
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    5 m) {- h' p) B# |
  863. db '                                                                                '
    , Q9 P! i( K, _2 s! C. G4 C
  864. db '                                赏屯屯簧屯屯突                                  '
    ( c& v5 Q% A$ e2 N
  865.         db      '                                ?OFF汉OFF?                                 '
    ! p/ `% C; E% x" r$ @1 q
  866. db      '                                韧屯屯既屯屯图                                  '" Y! e* o" V( H# y: N! j1 U. E  G9 i2 U
  867. db '                                                                                '
    0 T9 v( m/ m, \* M
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    , m7 W& {+ s- Y" p
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    * L' \3 |% I! V2 |+ Z( `0 \
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    " T2 \  Y# J8 z( @% M7 V( ~) P
  871. ( O9 e6 s# A8 `
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
: Z% y0 R/ E. a% v哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
5 F" k: U; V3 M& D7 A/ X/ D/ {; }3 ?6 k* C
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 22:00 , Processed in 0.533873 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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