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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。' ^8 U' n1 }9 M5 y
8 b0 b2 d3 k, Q+ R
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    % n% h: s6 W* q$ S
  2. ;          Ufoit PS2 Mouse test program   Ver 0.91 W8 V! S' j1 H1 N2 X: y+ q
  3. ;                                         By Bini.Yi 易祝兵6 _1 e) E; i! o! O3 q0 I1 Y6 ]# b
  4. ;                                         http://www.ufoit.com 计匠网! c6 }- o3 N0 H6 K' T
  5. ;                                         2002/04/06 YYYY/MM/DD
    * H+ o* s% Y+ u7 j- p* ^7 z
  6. ;
    : c! ^7 G- y) a+ Z, o
  7. ;          ( k: C# y" Y+ S0 a* v; J; H% M
  8. ;          This program  test the mouse button  click and move.7 M* k3 y( f% Z& {
  9. ;
    ! i5 c6 R- K4 C5 T3 ]$ D2 H
  10. $ b! f" [( ^# n+ N+ v. |* r
  11. .model tiny* q& X% W! t  F' Y; z5 q
  12. .586, D* D, z. N  w) P& p( u2 h2 ^' l
  13. .code
    1 R! a0 c; R0 y8 C' G. Y/ @. a
  14. .stack  100h
    4 [7 Y1 A( j" H: H
  15. .startup1 u6 J" O2 p( |4 l  ]8 Q
  16. pusha" b! g7 P7 e; y& C6 i
  17. mov ax, 3533h
    3 F+ I8 g/ h) r. f
  18. int 21h1 r: j8 t% Y4 v6 N; R0 z
  19. mov word ptr cs:[old331],es
    ) t4 S3 V! t- N0 O4 ]" N: Z# U% o
  20. mov word ptr cs:[old332],bx; X/ l$ d2 J# o2 v
  21. mov ax, 3574h
    ! I" E( x/ G2 I9 D" _) u0 \+ ]
  22. int 21h  @" j8 R4 O+ e* X; ]
  23. mov word ptr cs:[old741],es
    ; G" f4 e& T& Z) {3 ~
  24. mov word ptr cs:[old742],bx  h' W5 R7 O$ F" l, g
  25. popa9 m5 T+ O0 y$ n" N7 D4 e' ?
  26.         call    memmouse
    ( c  \9 I9 e7 `: n
  27.         mov ah, 006 K6 u" m3 G# K- X/ r
  28. mov al, 034 k0 Q5 G) ^3 z7 d" P/ D
  29. int 10h8 \+ x, _2 O5 D
  30. mov ah, 06
    , g& x; k4 x+ u, z2 l3 A% ~
  31. mov al, 02 \0 d9 K6 r0 p5 h
  32. mov cx, 0
    4 M' y; X6 G% Z+ c+ o5 @
  33. mov dh, 24
    % v* `+ [5 q) ~! e3 W9 j0 Z4 z
  34. mov dl, 79
    : O4 O& Y- x5 J( W2 q4 h
  35. mov bh, 07h
    $ Q& S1 r  q1 v" a8 ]/ Y
  36. int 10h* w- H9 k4 ~1 a/ f, @+ j
  37. mov ax, 0000
    8 B* o" U! {$ J& A- e
  38. mov bx, 0002
    # I4 H( [  M/ x6 p7 P/ T
  39. int 33h/ t3 z' k$ j( m" ?7 P( K$ d
  40.         cmp     ax, 0000           ;if no mouse drive install9 r" B; ?1 T+ O6 S* r
  41.         je      errormsg           ;show error MSG% K: M% b  q+ ~; G8 j+ k1 k
  42. mov ah, 02
    " u: _7 z9 [: F" p1 Y$ D0 @
  43. mov bh, 00
      L* B5 J$ f0 Q  C% Z0 f
  44.         mov     dh, 25             ;Move point out screen
    6 d) P6 w! F" Z" _5 S2 W8 R- u5 ?
  45. mov dl, 79
    7 q* G: q# P' I3 F( |8 y
  46. int 10h
    3 \) b% W5 r6 U, R2 g
  47.         call    showmsg            ;Show info. \, k% Z5 @% z' |! P4 Z* n
  48. mov ax, 00011 e3 ~' Y9 a* ^
  49. int 33h; V: q1 _' g% ~
  50. ; mov ax, 000ah
    8 b+ U1 S0 U, J: o
  51. ; mov bx, 0000
    5 M- j( N, _% D7 ?) @
  52. ; mov cl, 0h
    6 `: j6 W" t! G; `
  53. ; mov ch, 0F0h+ }% y; ~; c" C2 R. u: ~
  54. ; mov dl, 0h
    ! z: \" ^3 T2 n! g
  55. ; mov dh, 0F0h0 ?/ z. E; M$ l6 s" |% B
  56. ; int 33h  [& t( ?* z9 G* q5 B, \) b" w$ d
  57. mov ax, 0004h
    ) M7 E$ {( ?8 ]
  58. mov cx, 0319
    * S' W/ B+ @: ?, g0 U$ f8 H8 F% O
  59. mov dx, 0103
    8 f' a( [9 Q5 M; X  s$ B5 {
  60. int 33h
    ) a. b+ l9 j$ G
  61. casemo:                           ;Case button click and point move + T" o/ R: x% J  K* j
  62.         mov     ax, 000bh         ;and keyboard press7 B1 F! N! ^$ M3 Y) F
  63. int 33h
    ( ^( {! G# _- s7 E/ {) \
  64.         cmp     cx, 00h           ;if point move....X9 L$ v: g- \' f8 J7 @' R" T" f
  65. jne xmov
    . H3 P: r! B- [. ^% z* ~0 e
  66.         cmp     dx, 00h           ;if point move....Y
    3 h+ |0 r) @0 B
  67. jne ymov7 B' W3 N1 A. ^5 L) @3 M. C" }
  68. xymovend:                         ;X.Y move end- F6 e+ _- N, V+ w' Q# g" f
  69.         mov     ax, 0003          ) J9 w$ b, e( _; s" H
  70. int 33h
    4 k( r  j; x; D
  71.         cmp     bx, 0001          ;if left button click  show ON
    ! ^: [1 J; `; c, f0 K6 i8 A
  72. mov si, 1828: q( o" k  c# v! ]1 X( O
  73. je listl6 L& O6 V" k! a, M
  74. mov si, 1828( ~) p- X' Z/ u! D) o
  75.         jne     nlistl            ;if left no click show OFF
    9 C7 K5 K5 ~2 `( {
  76. testr:# g. v( c3 `1 n+ E
  77.         cmp     bx, 0002          ;if right button click show ON4 t+ ~+ Y" n! t; X2 T/ v
  78. mov si,1842; v0 w0 [- D/ u; ~, ^; `- U
  79. je listr
    2 c1 z9 J! J" q
  80.         mov     si,1842           ;if right no click show OFF
    / g( f" x2 c+ Z& Q! _9 S; a
  81. jne nlistl- p/ a+ v" M9 K0 A0 a) O% W, ^  y
  82. casekey:5 x  _/ k7 ^! t3 e- a; i
  83.         mov     ah, 01            ;if any key press jump check
    $ O! T  W9 Z+ w; R6 V& f2 E
  84. int 16h- k( B. Z% x! W" _5 ^3 [: `
  85. jne kpress+ `! ^# t/ r& ^) X2 B3 k8 M; D
  86.         mov     al, [chkl]        ;check x flag4 d4 x' c: v( n, e  B% S7 B
  87. cmp al, 02h
    , y9 |, k) [& t* U, \, X# c
  88. jnb chkok
    6 R! C$ Y/ K8 O  u9 C
  89. jmp casemo: k8 @2 F. D0 a+ Z
  90. xmov:                             ;if X moved, get the X flag+11 s$ k2 W6 n% @1 v5 @
  91. mov al, [chkl]
    3 @) L* a4 E& v7 B4 u4 Q8 u( E7 o
  92. inc al
    % h% j) G( m+ m$ J  P, G8 E
  93. mov [chkl], al# y8 e( h0 {& C$ R/ H
  94. call passok! @  `" ~8 j  Z  l+ n
  95. jmp xymovend9 i- d  C! r! E) M% y' {5 w
  96. ymov:                             ;if Y moved, get the X flag+1& M5 |# e8 f  k3 q
  97. mov al, [chkr]2 M1 G. |8 @2 r2 u9 E9 d
  98. inc al
    * X' a) b# `5 m5 c
  99. mov [chkr], al
    ( K9 B3 {& U# `
  100. call passok8 n3 s; j+ b3 c1 {! b
  101. jmp xymovend3 o. Y( ^( @: o2 x1 T) n! Q

  102.   o- J! T" w6 S. |
  103. passok proc near$ j7 ]9 Z* c  k$ }. Q. ]$ |; h. A1 f+ @: [
  104. mov al, [okcheck]. Q; J1 N: q/ u# a1 m
  105. cmp al, 1
    / Z. @8 `( d+ q  F" P
  106. je let0) T8 ^& x+ V% N2 o
  107. jmp passret/ x) @6 r1 l* w" U% D9 g
  108. let0:
    9 _! U! n% }% K( p3 M4 x
  109. mov [pass], 1
    0 g+ O2 Q( {3 B& P
  110. passret:7 X' W, `; N& Y' l& k. H- R' l9 {: g# W
  111. ret
    & v3 ?9 ~$ Q7 J# Q/ p2 M1 q/ r* b
  112. passok endp ; x# A8 @4 y, L: G8 [) N

  113. $ k) N) W6 z) I
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS1 }9 ~* i5 P! d/ l: e2 I4 s
  115. mov al, [chkr]
    / x1 w5 u$ @% t/ n
  116. cmp al, 02h
      Y9 ~, `8 I6 u& F
  117. jb casemo
    * f% c' ]6 R* H$ h
  118. mov al, [lk]0 a. `( V! a9 K2 W4 Q# {
  119. cmp al, 1
    3 v- ?. J" W4 C8 N2 Y+ ~! i+ C- ~
  120. jne casemo
    6 h, w( x, I2 J% v- E) A$ D: c
  121. mov al, [rk]1 T" M6 X, C$ m) B; k  N
  122. cmp al, 1
    % B* U# i) v5 O, ~. d9 C  m" r
  123. jne  casemo
    ! v( a/ g  p7 s( z# q9 f
  124. mov [okcheck], 1# C" h' Z  F1 r% r" s) E
  125. mov al, [pass]
    ; [1 L4 M1 G+ }- x0 O
  126. cmp al, 1
    + u1 G" k8 `5 z# f3 w* u7 z4 o* J: t
  127. jne  casemo
    . I) Y( K5 l/ u" N) A
  128. mov ax,0002h( h4 f; N, z" k
  129. int 33h5 g/ g; r1 l  e( W
  130. call cleascr1 K3 s- _7 ?' a

  131. # W  v  f" I# s! N
  132. call oldint
    8 P1 N/ T3 f5 M& g( U' W: F: ^
  133. mov ax, 04c00h
    2 V' X4 d2 l8 h" G, C
  134. int 21h
    3 i: Z- }( d* s9 p# h0 F( d

  135. 9 b7 i2 f8 r+ u' F. F
  136. okexit:! f1 N& @* C+ g$ \2 m2 p$ {9 b1 e. E
  137. mov ah, 4ch
    / L  x2 ^! W) u. u
  138. mov al, 09 M- g' ^1 D" B7 L) c, }4 `
  139. int 21h
    % r4 o# R2 ]9 f. u$ w+ o
  140. listl:                                 ;Show ON& ]* d! g% |2 J) W0 ~( [$ O
  141. pusha
    7 i0 _& D% E: t( g# n% r
  142. mov ax, 0b800h
      u% B  q2 s' a" i$ J5 [) \# u( J
  143. mov  es, ax
    # R* b) c. |) e) P5 k; B: _
  144. mov ah, 47h
    , Z: `" x* j$ u  G
  145. mov al, 20h
    ( F& p- d0 ^( [+ E+ x: ?
  146. mov es:[si], ax
    2 ?: [8 [9 O! w, n
  147. add si, 02
    ( }4 R# H, }0 q0 `/ h
  148. mov  al, 4fh
    6 S2 m7 ~  b4 i7 S+ Z
  149. mov es:[si], ax5 o. t8 b5 ]* t3 ?" M+ ~
  150. mov al, 4eh
    6 N7 Y5 Y2 p; T" L- W2 W/ |% {- Q4 |1 C* o
  151. add si, 02# {1 [9 p& V) B) `
  152. mov es:[si], ax  S% F7 w) R1 z4 X
  153. mov [lk], 11 u: B9 i2 t* c/ M
  154. popa7 h4 H8 _9 T" t1 p6 m
  155. jmp testr
      d, W8 n1 F2 v" D7 e: g- H% b
  156. listr:                                 ;Show ON
    & a' u; J- A0 ]; ?( ?+ X
  157. pusha! ?0 Q& b  r  Y0 _/ r
  158. mov ax, 0b800h0 B9 i) z0 i/ {  n: Z
  159. mov  es, ax
    # M% b4 @* J8 [+ T
  160. mov ah, 47h( K( ~& S! \2 p: t' f
  161. mov al, 20h3 D( ?0 w" |9 }" m- t6 G' T
  162. mov es:[si], ax' v4 L) ~2 b+ ?" [" q# Q$ ^2 N2 s
  163. add si, 02
    ! x1 \4 k* [6 @. ^, l3 I
  164. mov  al, 4fh8 i8 L2 W6 s' l- E- V
  165. mov es:[si], ax; g+ v/ b& o% P2 Y
  166. mov al, 4eh# ^  z  ^2 L7 P$ _4 m: |' z
  167. add si, 024 {+ ~7 ~2 k" ]9 S! W  r
  168. mov es:[si], ax
    : F9 ^: U! {/ E6 i" y$ w
  169. mov [rk], 17 h$ ~2 @6 D3 B3 p. k, d
  170. popa) a8 ?) C# U9 o  G
  171. jmp  casekey
    + \0 s8 M1 l/ l% ]! s
  172. / V/ H  E9 ~/ D; @6 Y
  173. nlistl:                              ;Show OFF
    * x9 s5 W. P; H+ E7 v, p* Z% Q, x
  174. pusha   & R1 k8 W7 ~' X: Y) B  r
  175. mov ax, 0b800h
    3 N' y% l* \* ?) a* J) }
  176. mov  es, ax8 v6 e" p; N+ ?; j
  177. mov ah, 17h
    $ @; r, M+ H9 U3 F1 v
  178. mov al, 4fh
    * k. u' @* b2 `9 A$ p; ~: p; r- t6 w
  179. mov es:[si], ax7 f6 ^. W8 T$ t8 B: \
  180. add si, 02
    0 v' |  ]1 s; y0 \; ]4 D$ U
  181. mov  al, 46h
    * a! {5 V1 i$ H# B3 y# q, Q2 ~+ z6 n
  182. mov es:[si], ax! j" @+ X4 }: T
  183. mov al, 46h
    3 v$ ]; K& ~! S
  184. add si, 02: t  f- J! Q: {9 B. `! h. |
  185. mov es:[si], ax- D% D( d2 D' R9 V$ \& Z. M
  186. popa, Q* c6 E9 D2 ?. j9 {9 P
  187. cmp si, 1840
    " j1 |9 g8 b5 ]+ G7 k6 M/ z- N
  188. jae casekey
    9 z2 p# p: H( z6 _" w( v5 b' R* t
  189. jmp testr# ?; o$ a* W5 g! d' Z6 N4 Q

  190. 9 i  \6 x. v" F8 Q
  191. kpress:                             ;Check key press if press<ESC> then EXIT1 Z; I$ \% V- o7 ]
  192.         cmp     ah, 01h             ;and return a error
    / t* s! S$ \" F6 x
  193. je exit1
    - ~6 V7 \! A. t: W( Y) u: y
  194.         mov     ah, 0ch             ;if press other key then clear8 j2 I& @; f9 u) I8 c/ F
  195.         mov     al, 00              ;keyboard buffer) H% X9 E% D3 y+ l9 p9 m
  196. int 21h
    % D# q9 m  u9 K
  197. jmp casemo ) {. N5 n% `9 F& U
  198. 9 ]. p2 v# `6 w6 w+ M) I
  199. errormsg:                           ;if mouse driver no install
    ( A. R( p7 Q+ B# \! u
  200. call oldint
    , y4 R; K8 a. t* ?
  201. lea dx, offset emsg
    ( Y+ W/ s) p& s) Z9 a0 f
  202. mov ah, 09h
    + o% q7 r$ Z! I
  203. int 21h: D# z  U6 U$ K/ j- Z% W6 @
  204. mov ah, 4ch% h: w/ G3 K7 N. X* l- a6 }5 [
  205. mov al, 28 D& k" ~) F" G
  206. int  21h2 {$ r( O/ o+ v  r* p5 G

  207.   c! O3 ]/ \6 h1 Z! Q0 [5 p; q/ j
  208. exit1:                              ;error exit
    - p* \5 g. E2 y
  209. mov ax, 0002h0 V& i" O  S$ r
  210. int 33h
    8 f( [8 y5 A' V2 O7 o
  211. call  cleascr: u. B( H# C/ [- |
  212. call  oldint8 D2 y4 h0 |$ K% U7 j" L
  213. mov ah, 4ch4 a; @, s* \7 l/ {- z3 y( y$ h
  214. mov al, 01
    - s9 S% A! X0 v% ?
  215. int 21h4 i, S. d) O" o7 ^
  216. 8 V1 \3 k" b" B) \( V, q# P
  217. cleascr proc    near                ;clear screen- u, i) J  A, W. s) B& i9 M
  218. pusha. [; o& z; U: G9 t
  219. mov ah, 06
    ; U- w& x' q3 u# e
  220. mov al, 0
    4 S) P. s0 l, H. @$ x
  221. mov cx, 0/ p0 D0 w+ T5 x- j5 @8 O) s" \. h
  222. mov dh, 24  k) O# ^$ ]  R0 u: W0 ~" l* A/ h
  223. mov dl, 799 q6 ?$ R% h, ]% U. i
  224. mov bh, 07h2 V6 n* i/ s  ]5 S% p) ?
  225. int 10h/ _  ~5 L+ E: L  r. m5 V
  226. mov ah, 02( p+ S2 K0 P/ U/ e
  227. mov bh, 005 R; g& Q1 u" t3 a2 }3 G$ U6 O
  228. mov dh, 0
    ) t9 m( d/ ]3 v9 c% a& q9 \4 f
  229. mov dl, 0
    ) U' @! \3 j: k; u
  230. int 10h4 R: ?, A! i- o. }2 I
  231. popa
    1 `% k$ o% m# l6 D0 F
  232. ret
    # L% a3 H6 P0 X
  233. cleascr endp, P) @- S/ `: F

  234. 4 J$ l4 M1 g6 L! |- h) j& p6 v
  235. showmsg proc    near               ;Show info
    4 o! c" N; \! c! r
  236. pusha) a* ^% r, P* t
  237. lea di, offset showms8 k: X1 y/ z' T
  238. mov ax, 0b800h
    " \! a$ l) \( q/ V
  239. mov es, ax: K' O3 n) Z0 t6 p
  240. mov si, 0/ l, o5 d% f9 \1 x$ M
  241. mov cx, 480
    & C; l; Z$ R  J
  242. mov ah, 07h, A( I0 s& d; W' o
  243. @@:
    5 G, r& I' K. L4 n
  244. mov al, 20h
    % P3 H# U. o4 h, M# }  M) x6 H
  245. mov es:[si], ax
    - A% T" i3 X) q  f) z
  246. add si, 2* ]1 C- i( x: V
  247. loop @b4 r& D, ^$ H# a
  248. mov cx,880
    $ T/ ~: V6 R) \; c1 f
  249. @@:
    & o8 \5 S5 O! e. O) f
  250. mov al, [di]
    8 ^. T. f7 S' G6 l* S2 e1 z# G. G
  251. inc di
      W* c& S' ~6 {' N* ^/ o
  252. cmp al,20h
    , R% [8 l1 S( Y# t. t; i9 J/ l
  253. je showch11 O$ ~+ ^. G7 K- o  X
  254. mov ah, 17h
    9 w* e0 `* T* s9 f$ W2 Q
  255. jmp showch3
    # r( W5 I  G1 Q3 l1 X2 R) R+ a
  256. showch1:+ n! P( E3 V' P0 }  r
  257. mov ah, 07h
    ) y" S+ A7 ]$ l
  258. showch3:
    / n7 r8 y# M3 r" S2 J
  259. mov es:[si], ax
    6 j) L: ~. Z1 K  [- S, k7 A1 x
  260. add si, 2
    , _" K# m1 F+ r  |; R
  261. loop @b
    , e" u$ }& C" }- t
  262. popa
    5 l  a" k  H7 J% z( n
  263. ret, C+ r0 ~! ~* h6 `
  264. showmsg endp  E2 y& p7 _, ?
  265. / L) R! _- K7 m
  266. oldint proc
    : k* [2 g- H8 [% j! z5 |" h
  267. pusha
    % p  e3 A# z( ]- j6 c( J
  268. mov ds, word ptr cs:[old331]' f9 O5 A. q' \2 r+ z$ O
  269. mov   dx, word ptr cs:[old332]
    ( _( r( i" i0 Y8 a
  270. mov ax, 2533h
    . w5 x/ V+ u1 k2 M
  271. int 21h
    # h  {: f; D4 U, c: G1 _
  272. mov ds, word ptr cs:[old741]+ V+ j( q3 h5 f- C3 H, V$ e/ A  w
  273. mov dx, word ptr cs:[old742]' D0 T5 b1 j. {: R4 V
  274. mov ax, 2574h' R3 ]" f1 O( e# b; d- f
  275. int 21h; r; O; s/ `. H( ^+ f2 t
  276. popa# r( G. H% T3 C, `4 D# p2 O
  277. ret
    1 i" ]' h# ~% r  c* Z% I: L
  278. oldint endp2 `" l5 ^' U) p. X' m! Z# k

  279. & \9 O6 _# y9 ^/ @/ G, k- J
  280. memmouse        proc
    8 `+ _  }( ]: @9 O0 ^, w* S$ h
  281.         xor     ax,ax
    2 O- Q6 h  a- A# j1 q; a$ q! w
  282. int 33h7 J! m6 d) Q4 _% \+ S. p1 a% T
  283. cmp ax,0ffffh
    " Y1 U2 E# r# b0 D
  284.         jne     not_loaded( y: w8 h/ T# G% I
  285. mov [memcopy], 1  e+ J( I  U/ r/ d# x, ?
  286. ret
    " h2 t6 B; h$ V5 d

  287.   K% {4 z) j7 D" X, f6 S& g/ B  V
  288. not_loaded:% ], z; F) U# e" @8 R
  289. # Z# S0 k8 J+ T3 g8 T9 `
  290.         mov ax,2574h
    & p  p/ P- P$ }, ^- U
  291.         mov dx,offset new_isr
    - r7 D; N: f* l  K( K
  292.         int 21h! B% f# \( k; @9 [) }7 \8 h

  293. ) q; u0 s% h2 Q' |3 I# c' p9 z
  294.         mov ax,2533h
    $ u' X9 `) x& d: \& T# g! t$ }! O
  295.         mov dx,offset new_33. a" W4 }; K/ q$ l& P$ s. M
  296.         int 21h
    $ `; `9 i, k! t3 a7 D
  297.   Z/ H/ j1 ~3 M& t4 z1 ?
  298.         cli7 K  G5 W; s8 |$ y$ F0 R' I; F
  299. : E, p% o1 X3 k7 n1 l! `
  300.         mov bl,0a8h
    & C; x8 E, p( l2 ?" u" U
  301.         call keyboard_cmd7 N3 H) b6 T3 q0 m) c, B0 Y
  302. + {- g9 d5 G" c$ q: j
  303.         mov bl,20h! b5 |3 ~, E  E  f* K* N
  304.         call    keyboard_cmd' z- z8 j1 i7 L
  305.         call    keyboard_read
    & _1 B( j% ?7 W; ^
  306.         or      al,2
    0 l, r3 I8 {' L' A
  307.         mov     bl,60h4 G- s& |  o/ K
  308.         push    ax  f+ |1 L$ Q/ n, I
  309.         call    keyboard_cmd
    0 g6 H- |% }* [
  310.         pop     ax7 G, z  K- x% f8 h5 ?7 C! @
  311.         call    keyboard_write- `0 e" p3 t& c% A2 ]
  312. 3 L; {) K: T  `+ S
  313.         mov     bl,0d4h
      R" {, X1 R. F. {  C
  314.         call    keyboard_cmd/ P4 ?+ v" A) K* o  G
  315.         mov     al,0f4h# J; G$ b9 v1 i; t3 p
  316.         call    keyboard_write9 L% u4 v" W0 D, g2 Y  E0 ?1 ~6 l
  317. - O( n* e, o1 f$ T6 s, \
  318.         sti% [: Y+ S4 K* }8 p. l
  319.         ret
    - ?; K3 o. V4 h. r4 H- X
  320. call_user_isr:
    ) B# M$ ^( t; x  }
  321. db      60h
    : \7 F  H5 A& z
  322.         mov     cx,cs:[pos_x]2 M& G9 d2 I3 l( E2 ?
  323.         mov     dx,cs:[pos_y]
    : I) X, K# J# K1 Q
  324.         mov     di,0 ;cs:[x_move]
    , _% K- A+ |# A7 V" ]
  325.         mov     si,0 ;cs:[y_move]6 ?$ J2 ^) G3 f/ I
  326.         mov     word ptr cs:[x_move],0
    8 m/ V, g  Y; N# M$ [% }
  327.         mov     word ptr cs:[y_move],0
    ( w! w0 V9 n, `
  328.         mov     bl,byte ptr cs:[buttons]
    : [( f$ n" ]& g9 k6 C. B
  329.         xor     bh,bh
    ! ]5 _# ^5 X) s8 d# ]
  330.         call    dword ptr cs:[user_subroutine]
    & T7 E; F( h$ f) O1 v1 k0 q
  331.         db      61h# R- g3 `9 z: ~" G
  332. ret5 _" o4 @1 `: U5 h0 z
  333. new_isr:' \" Q# c- G0 m, U- P  d
  334.         pushf
    2 ~5 Q. ^) \7 m. ]! T" H+ L
  335.         cli
    - ?7 s; Q8 l+ z5 }
  336.         push    ax
    4 K5 ]  e, _( l0 G
  337.         push    bx
      _/ S( q) R8 s. j1 n
  338.         push    cx
    ( c" z* A* j* @( p$ N% C2 B  A
  339.         push    dx$ U, G7 k% h% X1 [" j, q/ O
  340.         push    di
    ) x& D) L' R# g# a2 S
  341.         push    si
    ( X3 j' Y7 A; S4 S4 P
  342.         push    es" M* u8 F0 C* ~& n" N
  343.         push    ds
    3 m- d; q. u! p$ N9 s/ h, Y5 A
  344. ; S/ i/ Y8 d6 B' o% p9 m3 Z
  345.         push    cs8 |9 J2 v$ w- [0 b" o2 z; i  E
  346.         pop     ds
    7 E+ k9 S3 m) R( B# M

  347. & E* `0 k0 y8 z" J  z
  348.         mov     bl,0adh
    9 Y6 |; Y# D+ _2 x! N4 J
  349.         call    keyboard_cmd
    . y! |4 y: c9 ?
  350. / N+ ]' A0 }* n( w
  351.         cmp     byte ptr [first_time],0
    4 n4 I( U. _4 X+ {+ c6 C1 V" N; }
  352.         je      not_first_time
    ; B" c* k8 A" ]2 d

  353. $ X) z+ \+ @, M0 K6 s9 ^5 k
  354.         mov     byte ptr [first_time],0
    4 z. J( e, s* q8 l
  355.         call    keyboard_read
    7 K. e9 p( {! Q) E- f. b6 g
  356.         call    keyboard_read6 m! M( g2 l$ u
  357.         call    keyboard_read: Y% G( R  Z  ?7 W& ?8 a# a9 b
  358.         jmp     no_show* g8 X0 v7 L$ D& ~2 D; {: y
  359. 1 z3 Q4 l; }( [  T9 }2 A
  360. not_first_time:
    # b3 M  J2 c* y! d! B! r0 d! ?, D
  361.         mov     word ptr [temp_mask],0; S6 ]: U: W& s0 L6 C, }; @. B' l  Q
  362. 2 a( G, N. T/ _  m
  363.         mov     cx,[pos_x]
    3 `, e* Y7 C0 c
  364.         mov     dx,[pos_y]/ a) G6 d1 [& ^2 F6 ?" ^9 ]

  365. # S. W& H# H/ m) g. s! q+ ?
  366.         call    keyboard_read$ Z+ l/ g! {5 v9 U
  367.         and     al,7 ;3; k& O( ?0 m; `8 k7 L% A. w
  368.         mov     ah,[buttons]
    : K$ }# t. k7 O
  369.         mov     [buttons],al6 h- a. j* C5 T6 I% p* }
  370.         cmp     al,ah
    ' \' I, P3 p/ R8 v; D
  371.         je      no_button_change6 ?* W# s7 p( u) w% ^: Y7 l0 O
  372.         and     al,38 _/ h3 H+ j5 `# c) _$ X
  373.         and     ah,3
    : u4 D/ [8 T9 X0 z
  374.         xor     al,ah
    : s! [5 \; m* r! y1 m) f
  375.         xor     bx,bx
    1 n! Y  I  T* b8 x5 n0 k

  376. ) d! g( G- u$ t( v8 R
  377.         push    ax
    ; Z+ S: d) ]$ D- ^& \+ M( x1 H
  378.         test    al,2
    5 ~, R2 i% ^# f4 c
  379.         jz      no_right_button_change! T. x) i" w; i' r3 C
  380.         and     ah,2& D# E/ c1 K& _' M1 N
  381.         jz      right_button_pressed& X8 L0 H! }5 S  ?
  382.         or      bx,16/ J2 D; C0 M% q/ J
  383.         jmp     no_right_button_change0 \4 l- q+ b+ ^) F: J+ b$ p; g
  384. right_button_pressed:/ s$ r: [: J* d6 D1 A/ }
  385.         or      bx,84 p6 L6 I1 z) |) m
  386. no_right_button_change:
    1 W' q) D0 ?0 h& h8 k

  387. ! G5 b# n0 t' ]% d$ A
  388.         pop     ax
    & x/ b+ h, Q! ?! w. k& W. B

  389. + Q3 {3 E- |4 n* {
  390.         test    al,10 J7 E& R3 {2 `4 M2 f( [
  391.         jz      no_left_button_change
    5 H& H6 h( L8 N9 ?+ R0 W: j5 r3 @
  392.         and     ah,1
    & E" a1 z) S5 {" Q
  393.         jz      left_button_pressed
    # ~# y: U7 Q+ H8 E% x
  394.         or      bx,40 K$ Z' n4 B9 p9 O, I
  395.         jmp     no_left_button_change' P$ o, e* a% i* _9 u2 @
  396. left_button_pressed:: Z2 u) H- d/ r! D% y" b
  397.         or      bx,2
    ) U) J# h9 r  d; a7 p6 K0 Q( f2 i
  398. no_left_button_change:
    * [- b4 c! d. e+ t6 Z+ G8 m* G
  399. ! n1 ?' g: s6 H( @
  400.         mov     [temp_mask],bx. ?4 g2 k; A5 L! X% n' q7 o8 @

  401. 2 U7 ?1 d# l- h" \# y
  402. no_button_change:
    4 U( F/ ]" v3 u, J/ M6 e
  403.         call    keyboard_read* M' r% w8 N" A) R; A& Q
  404.         cbw7 s, O; Z  S. @9 W0 f& K9 ]
  405.         add     [pos_x],ax
    / N  y' e% [2 ?, P( K
  406.         add     [x_move],ax
    $ Q4 N: o0 F0 K0 O; x
  407.         mov     ax,[x_min]
    ' X! s6 @( E8 _& q1 {
  408.         cmp     [pos_x],ax
    ! F% V3 g# ]: R* @+ ^
  409.         jg      good_hor1
    ! ^8 G7 b5 [1 U
  410.         mov     [pos_x],ax! r+ t# k, Q! E/ p5 _/ T0 e
  411. good_hor1:+ b3 D" }6 V* a# `1 Z7 T
  412.         mov     ax,[x_max]+ P; f  X2 [- Z" `; L+ C$ ~% h
  413.         cmp     [pos_x],ax
    5 b0 f: u. ^- C8 ?2 [
  414.         jle     good_hor2  i! A6 j. z# R. n# C6 e4 @& f
  415.         mov     [pos_x],ax0 x$ q  ~4 U9 V$ `% @
  416. good_hor2:1 A4 d4 K- _9 W: a9 R4 p5 {
  417. 6 K" A  Q: f& |0 ?8 M) b6 I
  418.         call    keyboard_read" P  I% L+ }7 [0 z- p3 k
  419.         neg     al/ p! q; T5 V# k; I
  420.         cbw4 h. V6 Z% r  H4 Q2 g
  421.         add     [pos_y],ax# s0 H; A& N7 r3 `) U; c9 l& P& Q% p
  422.         add     [y_move],ax
    2 ?+ v: o$ B+ F; u$ _/ E
  423.         mov     ax,[y_min]( w4 \! ?( D$ i
  424.         cmp     [pos_y],ax
    + W) V6 A* I+ o% C/ p; J
  425.         jg      good_ver1
    * g# K+ j: ]3 ^' c1 ]& {% Q
  426.         mov     [pos_y],ax
    - x. y" U4 B1 _8 n$ W
  427. good_ver1:( u% v1 P! t1 @0 l6 |
  428.         mov     ax,[y_max]. t& X# g5 a9 v, w4 l; a, ?1 z9 @
  429.         cmp     [pos_y],ax
    " r/ w0 e' `, [" d
  430.         jle     good_ver2
    # o- z2 c  I. f! Z  U! {
  431.         mov     [pos_y],ax" C7 K2 i/ l! H5 U  g% b+ ~
  432. good_ver2:5 X! P" `, ]. H+ p/ \" L6 r- n
  433. / a9 z2 D+ O9 u( T
  434.         mov     ax,[x_move]$ R. c# F  l' J- h
  435.         or      ax,[y_move]& x$ s. `  Y0 B
  436.         or      ax,ax
    8 k$ I- Y2 c' t) T; X5 U
  437.         jz      no_change_position& j2 m7 ~  P' p* m/ v
  438.         or      word ptr [temp_mask],1
    4 D* I& N- ~- P" F: W: B9 ^
  439. no_change_position:
    / n" [' w/ ~: H9 P( }, g
  440. ' G( N7 Z6 ~1 [  Q+ Q8 E
  441.         mov     ax,[temp_mask]
    : j' r/ u: B* t. t+ w( a
  442.         and     ax,[user_mask]
    : \6 P* E( `7 O" n
  443.         jz      no_call_user
    ! x2 B; _3 T4 [& K# R4 `
  444.         call    call_user_isr8 v. y# v1 P- M  y% B/ ?5 \6 c7 U
  445. no_call_user:
    . C  l; j* M$ a/ Z# j) F! o. C1 _9 C

  446. 1 d; ~( T  D$ g/ U7 N5 b* A' j; }
  447.         cmp     byte ptr [sm_flag],1
    3 _3 j- C% E6 R/ x, C+ U% j
  448.         jne     no_show
    & Z' ^0 y5 a$ u6 b* l7 i* x

  449.   K/ Q: S9 G, \- X9 F
  450.         shr     cx,3
    6 {0 X8 s: `$ {
  451.         shr     dx,38 e$ d' M6 F9 o
  452.         mov     ax,80+ o8 z9 U/ Q0 V# |4 N. j
  453.         mul     dl0 o- F% U4 R6 z8 w& z# p3 o; v' Z
  454.         add     ax,cx8 Z: {. ]( w1 [% c. C
  455.         shl     ax,1
    , T2 x. J( ]2 J9 [1 P8 V
  456.         mov     di,ax1 D5 K4 r. R  B2 ]! C1 d" h& {
  457.         mov     ax,0b800h  v9 H6 p. U- n- \, u  b) g
  458.         mov     es,ax
    2 o4 V3 Q- X. ?% i* v* B6 w9 i7 _# J; h
  459.         mov     ax,[save_char]% r; [# L4 k1 M( A
  460.         stosw, x3 ]4 s, Q# e( }* z

  461. : ]3 `  N9 ^, p/ j- U6 d- L& }' ~) q
  462.         mov     cx,[pos_x]
    7 [& i' j, X% r/ U/ ?4 M+ z9 {! u
  463.         mov     dx,[pos_y]
    ' K5 m/ q( k# g+ z
  464.         shr     cx,3
    1 ^  e( I! Z0 z# R" A- F1 \
  465.         shr     dx,31 k+ n9 v, M8 [9 n3 d
  466.         mov     ax,80
    0 c, h. a! w  o- h
  467.         mul     dl
    ( ^, u" @0 ?9 c+ q
  468.         add     ax,cx* e6 ~, U. e2 P" l) I- R
  469.         shl     ax,1
      ?# m7 a: o, ?
  470.         mov     di,ax1 N6 b# p8 |6 B
  471.         mov     ax,0b800h, @, q9 u; ~0 h" J9 ]
  472.         mov     es,ax9 L, o/ C5 W) {$ P  Q
  473.         mov     ax,es:[di]5 i$ m( Q5 ]3 o6 f
  474.         mov     [save_char],ax
    8 S# y! _- B2 p, t
  475.         not     ah
      i  N2 H8 G4 H& N" }/ ?" P
  476.         and     ah,7fh
    $ J' l. h8 |( U, g7 i  B& m, @
  477.         stosw
    3 @3 S% ^( {* s) |' j# {: Y$ H$ I
  478. no_show:# A5 q: d' E8 `( `% b' c
  479.         mov     bl,0aeh
    9 J( M) M# l& i1 ]
  480.         call    keyboard_cmd9 [5 r$ t0 j2 b6 f3 K1 t4 N4 \
  481. 7 H% Q3 p9 s$ S
  482.         mov     al,20h
    - d* F6 i/ b( g# }
  483.         out     0a0h,al
    " p2 ^( e' k' g. f) T
  484.         out     20h,al0 B) J! h* @- W' g

  485. - t8 e) _5 ]7 x6 b
  486.         pop     ds
      M; B# O6 o* j' P  P
  487.         pop     es" s$ p* @" R5 Y
  488.         pop     si0 i: E$ P9 d4 H* X5 h- x% P3 D3 r7 a
  489.         pop     di
    % f( H, @9 m' O$ p3 ?2 ~6 Y
  490.         pop     dx
    ' Q4 j! ~: \: B: z! l) N0 _
  491.         pop     cx
    3 Y& a( k+ O. k! D: x
  492.         pop     bx4 O# d6 L4 R. x0 Y6 l6 X+ I
  493.         pop     ax
    " u4 x% g9 G! E4 }/ b) [
  494.         popf5 m# {0 P4 d- C, C& Q) ^
  495.         iret
    7 w- ~( t" i- _2 p
  496.   Z; p* |8 k5 z. g0 k0 N4 R* q
  497. first_time      db      1
    * M- f' A' V. Q/ l6 V- I0 i4 F7 `
  498. buttons         db      0
    ; J: G1 _' C, A4 I& W' |6 y: O" E
  499. pos_x           dw      0
    # O, I4 ~# f! F% O4 K0 d
  500. pos_y           dw      0
    + o  G# ^% t( \" i5 B5 a: U
  501. sm_flag         dw      0
    4 U# x. T- I# N" j% b, r
  502. save_char       dw      0
    6 _' i0 q& w6 Z7 n8 ]2 _8 G
  503. x_move          dw      0
    ( o2 a3 J" Q) g/ Z! S: ~" k
  504. y_move          dw      0  F) c4 p; l8 u1 A& k3 ?
  505. x_max           dw      639( |$ U" p# e6 d5 c3 p. Q
  506. x_min           dw      0
    ( l7 e# O7 ]4 R+ D: G
  507. y_max           dw      199
    - K: r2 C' K8 N: j; l
  508. y_min           dw      0; I2 Y0 }& R1 T, b- A
  509. user_subroutine dw      0,05 q5 o3 {& h5 e+ {) ~% b
  510. user_mask       dw      0
    ; X# n# L3 N7 q% S, ]
  511. temp_mask       dw      07 h' U+ h: C' ?( r
  512. 5 N  D. N( [2 J: ]. k7 F6 `
  513. keyboard_read:7 E, C/ L  b* G
  514.         push    cx8 G, q- r8 W" ^: A& f( ~
  515.         push    dx. W; P4 v! P- p1 \
  516.         xor     cx,cx
    ; K1 ^  N" _' c
  517. key_read_loop:
    , j- d* a0 @; J# K) H
  518.         in      al,64h
    $ w1 }/ G- u1 M# W9 B! y5 J
  519.         jmp     $+22 ]3 s0 m8 |' o7 H# e
  520.         jmp     $+2; S& E) ]  E) _3 I/ d
  521.         test    al,1
    " p6 s5 U! ~$ w0 a" t
  522.         jnz     key_read_ready) A, W3 p( ~7 s9 B- V
  523.         loop    key_read_loop
    " B0 D1 f' A( B% e* H
  524.         mov     ah,1
    6 M" }. Y3 M; n/ ^
  525.         jmp     key_read_exit/ b; |, |+ G4 G/ G
  526. key_read_ready:
    . [: W9 c: n2 m, z4 L0 k
  527.         push    cx
    6 W5 l& ^2 [3 o* L: ^+ }- c% W
  528.         mov     cx,32
    8 \$ v% q7 Z' ?8 {
  529. key_read_delay:& a+ j2 {* a$ j' J( i$ i9 F  n0 x
  530.         jmp     $+2, A! Y3 q% s9 r/ W& O$ R
  531.         jmp     $+2
    2 `! A" ^; x! y* q, |
  532.         loop    key_read_delay" k. |4 ]1 [+ R- M; t# ^6 R9 _

  533. ( `, {" l, H! \( I" W( U
  534.         pop     cx
    1 R! t( F' a) \) K/ l( x
  535. , }- X4 F# f3 L% g1 |* G
  536.         in      al,60h+ o* E' |: R* A* Y/ I. t
  537.         jmp     $+29 h! o3 c' d% S+ ?' B
  538.         jmp     $+2
    ) E9 `4 B% e- E: S  `
  539.         xor     ah,ah4 W. _5 j0 U8 b( [
  540. key_read_exit:
    ! `2 V; }2 m4 |7 S4 W: ~. i  X
  541.         pop     dx
    $ Y- R7 P/ p+ i& I
  542.         pop     cx7 t) z. Z2 t, E: Z' ^* x- H
  543.         ret$ ^( Q  V( ?9 e2 N8 |! W
  544. : g7 b: l! h8 \
  545. keyboard_write:
    8 V% {0 f: J0 I5 U1 }
  546.         push    cx# h4 T2 X$ N$ a8 B
  547.         push    dx: \2 I. m5 M9 ~7 ^
  548.         mov     dl,al
    6 J3 [3 c8 |, Z4 W! {3 {6 |' S( P' r- e
  549.         xor     cx,cx$ W5 E4 P' b( @. T) v1 ]
  550. kbd_wrt_loop1:
    " O8 O' L6 w4 v+ T3 v" `' O
  551.         in      al,64h' x9 s6 N; T& x9 N# X
  552.         jmp     $+25 B. Z# F" u! L7 @/ r
  553.         jmp     $+26 ?" i1 b' d' u0 D
  554.         test    al,20h! ~5 g; H1 N; V: S0 a: y
  555.         jz      kbd_wrt_ok16 T; a0 h" I; z3 E1 \1 `: P

  556. 3 M& X; f0 d) J8 w/ A: F
  557.         loop    kbd_wrt_loop1( h; o( U( o' y
  558. 2 a. b6 a9 `6 v( M1 }7 F
  559.         mov     ah,1
    , g+ `: x$ x: D8 Y
  560.         jmp     kbd_wrt_exit
    9 F$ x8 |8 }  H2 n0 ^9 Y: ~( G% M
  561. 7 w3 ^. C9 m! N7 C& \
  562. kbd_wrt_ok1:3 n8 K2 @# U7 \: u" ^, v" J
  563.         in      al,60h% S5 v3 r' ^3 Q
  564. ; Y2 k  o8 t: y
  565.         xor     cx,cx
    $ q! _& [4 H+ Q2 Q
  566. kbd_wrt_loop:4 n- M" A; c8 }7 o
  567.         in      al,64h
    - `/ H% D4 x/ s3 t
  568.         jmp     $+2- r: j2 b/ p( i
  569.         jmp     $+2  m- G& }  v! M  F; H
  570.         test    al,2) }; _1 s0 O! ~( v
  571.         jz      kbd_wrt_ok6 @5 r; Z( e* ?- v- @( F7 \% B( Z

  572. $ w0 i) X) t2 H8 H  B
  573.         loop    kbd_wrt_loop
    / l" H$ k; q( ?

  574. ; h+ G# x1 a! x  |/ i) V
  575.         mov     ah,11 g+ m3 y4 u$ z4 j1 y6 A- V8 @# B
  576.         jmp     kbd_wrt_exit! f: C/ E: q; a
  577. 6 Z( \+ e$ \6 S& B! f
  578. kbd_wrt_ok:
    8 Q0 H/ O2 k! e6 A' }3 v
  579.         mov     al,dl
    - }4 V2 {4 a! j/ u7 \( c
  580.         out     60h,al
    / m* R$ c! [" E6 Q. P
  581.         jmp     $+2
    - g1 A1 u. V* o
  582.         jmp     $+2
    * n: i+ C, q% V+ C# E; M

  583. 5 n- t6 [$ d/ z, D0 O# e$ Y' O( I
  584.         xor     cx,cx
    - K" M2 a2 e) n2 U- I+ g4 @8 B
  585. kbd_wrt_loop3:! Y! s% K* _2 l# i4 s/ U
  586.         in      al,64h
    : h% F# l, ~$ Q9 c, `
  587.         jmp     $+2' v# k* l! }0 ~1 K7 r3 C
  588.         jmp     $+2
    ; q/ z" L" H/ d9 ^
  589.         test    al,29 V2 m8 L. ?, f) [) L
  590.         jz      kbd_wrt_ok3) z4 A  O% Q. q3 I
  591.   o) C& s. S( M+ U9 s2 q
  592.         loop    kbd_wrt_loop3
    9 v8 q# M5 A9 e- l5 y6 f

  593.   a9 H5 J4 W# `' |5 _. d
  594.         mov     ah,1
    ) n4 B2 P. w( z5 Z- r  u
  595.         jmp     kbd_wrt_exit- w3 N0 m& @3 ~, O

  596. ) K8 P" g- l/ ?: N1 o
  597. kbd_wrt_ok3:
    3 r7 r) L" j3 n
  598.         mov     ah,8) s$ s# t8 M' `8 [
  599. kbd_wrt_loop4:% L0 P2 B4 _# e* u+ N
  600.         xor     cx,cx
    1 Q8 K* l5 L9 x% q
  601. kbd_wrt_loop5:- Q' D' M" n8 @# z
  602.         in      al,64h/ m' v' [: _& \, [
  603.         jmp     $+2
    ( c  L6 Y/ H; j) e+ W5 p
  604.         jmp     $+2
    # v  R8 [. E. V# K3 m
  605.         test    al,1
    : t0 S3 y5 g( o; B- Z; \/ E
  606.         jnz     kbd_wrt_ok4( g& g5 t/ u0 a" P+ ?7 b+ Q

  607. $ L1 _# J5 |3 A- ~
  608.         loop    kbd_wrt_loop5& A, g  {, E3 W: I) v
  609. - H7 V) ^, j$ O. q
  610.         dec     ah4 V2 S& S$ E8 z* u  y
  611.         jnz     kbd_wrt_loop4
    & s7 e) ]) R) w0 ?: M
  612.   l$ t  _( J! i( Z% Z2 J$ M
  613. kbd_wrt_ok4:
    6 g1 X7 E0 [2 s; z( q! T/ C' N
  614.         xor     ah,ah+ t* ?! r) M4 P
  615. kbd_wrt_exit:+ a3 \3 ]& {  |! N$ w
  616.         pop     dx- z* O4 Y( s7 Q+ n) x# W5 J
  617.         pop     cx
    3 _+ `1 v0 k3 [: x! \3 g
  618.         ret4 K7 ^8 O7 S( P% D
  619.         
    6 }6 s6 T+ c3 D5 ]# |0 p/ j
  620. keyboard_cmd:* s! w' }& S. f( H# c! F; ~
  621.         xor     cx,cx/ t  N: l$ D8 I5 ?0 N( {8 S! {
  622. cmd_wait:: l1 ^0 u8 I. m% L
  623.         in      al,64h& c# l- o0 w/ U: F/ g$ A
  624.         jmp     $+2
    + G8 d9 g. d% p" L
  625.         jmp     $+2' M) l6 L. f& n# h4 Z
  626.         test    al,21 t. |4 Y+ [" p3 E
  627.         jz      cmd_send) @3 H% b6 a* x3 h
  628.         loop    cmd_wait5 B+ T- E" {2 W3 x

  629.   y$ P" _$ k% j) S' ]* d
  630.         jmp     cmd_error
    0 B- w# ?8 B/ J! r
  631. - b7 e2 T2 R7 E) I/ W5 @# z4 E  Z% z
  632. cmd_send:& V2 G  v& N8 @8 |
  633.         mov     al,bl6 W; c  N/ v' |6 z
  634.         out     64h,al2 P8 w( s5 f( C+ B, W$ [
  635.         jmp     $+2: f; P. @& J+ o( J  H
  636.         jmp     $+20 h$ i4 _. ]) e$ K5 _) b
  637. 2 d1 B$ I0 A6 k! N4 I7 K
  638.         xor     cx,cx9 h4 p% |. O$ ~" c
  639. cmd_accept:: O9 O6 [. v6 `% w7 C
  640.         in      al,64h
    $ I% y) `9 e9 r  }
  641.         jmp     $+2
    , `4 m$ z, H# M: _
  642.         jmp     $+2  X1 k; ^: Z$ s( N* b
  643.         test    al,2
    3 A( ?; Y6 s% O* C) W, S' \
  644.         jz      cmd_ok
    7 }; Z: _- V5 l+ S
  645.         loop    cmd_accept2 Q6 u& g* m3 p# t. e. ~4 C- `
  646.   F& g, f+ h. b* o: E
  647. cmd_error:3 |, H; v, p" F" ?
  648.         mov     ah,1
    ! e: d/ l  c8 W( o. E8 K
  649.         jmp     cmd_exit
      n7 m8 J) m1 k' `- t/ g
  650. cmd_ok:
    9 ]% [$ b+ E9 C+ v. l% M
  651.         xor     ah,ah1 E$ ~/ F: H$ \3 H- ?4 s9 i2 w
  652. cmd_exit:
    1 l' d% j2 B: p1 F( h6 O) y
  653.         ret
    3 A7 c, _8 `! t; k

  654. 7 g& g, y8 h8 P: K' _8 P
  655. new_33:" B& A5 A' |: }8 M4 T) a2 t
  656.         cli- F& v& A4 i8 W/ B; E
  657.         cmp     al,0
    & B$ ~3 D  {* x( d  L$ Y: J3 X5 h
  658.         je      reset_mouse
    : D9 j. ~; L) A2 X' g9 v
  659.         cmp     al,1& d+ y5 d5 ~1 H/ S5 H
  660.         je      show_mouse! k' i" F& N2 b
  661.         cmp     al,2
    ) d# K  Z( Z& S( ~) A9 C
  662.         je      hide_mouse
    2 u) K" I& C  s) H# m
  663.         cmp     al,3
    ! u- M5 M9 L" V+ J+ g' S! u
  664.         je      get_pos
    % c. A  @& H8 S# m  e- ^
  665.         cmp     al,4! s' w$ T- Y% M$ X2 j
  666.         je      set_pos
    ' g! r6 x/ o/ `2 @
  667.         cmp     al,7; I  v, e* B" y# e/ B
  668.         je      set_hor_pos
    : m( S2 s" p0 H8 {. z
  669.         cmp     al,8
    4 }( x! ~. Z' a" t" Y3 E' M* H6 p3 m
  670.         je      set_ver_pos& _1 U  l# F  n& @- @& p
  671.         cmp     al,0bh$ N2 c7 p$ o4 Y
  672.         je      get_mouse_movement* I" w+ K9 ?! L- L) |
  673.         cmp     al,0ch& b7 ^3 z% x/ O3 a9 ~: E7 E9 {; ?$ O
  674.         je      set_subroutines
    2 I7 h: I* S/ W: w* d
  675.         cmp     al,14h
    * H9 `) _" H  ?4 V
  676.         je      swap_subroutines; g% {' i$ X0 h3 k3 g% V
  677.         iret3 O. u" x6 B" p/ X' v' [! X

  678. 6 ?) Y. }! d8 l! O* x% ?. a- s
  679. reset_mouse:
    % ^: _  M8 x7 H% R' E4 d: p
  680.         jmp     _reset_mouse; V7 L# _3 |, _# R9 m' T/ V2 X
  681. show_mouse:
    - {/ [1 W, f3 X. \( ]0 {
  682.         jmp     _show_mouse$ z2 K" p% @# w, v
  683. hide_mouse:
    " s  I! B2 f+ f/ M/ z' B& D
  684.         jmp     _hide_mouse
    8 q. L" N$ C9 _' H8 L  X
  685. get_pos:
    7 r) z8 w$ i; l+ g! ]4 \2 W1 i
  686.         jmp     _get_pos
    $ }% H9 q7 o2 U' z0 [
  687. set_pos:
    3 h0 v  \9 M) b2 N: V4 J
  688.         jmp     _set_pos( w/ F9 h& @6 G3 y. H( o' Q6 W
  689. set_hor_pos:, S" M4 f& a" s( C. d4 \0 V8 @
  690.         jmp     _set_hor_pos1 j; I1 q  X7 N5 s
  691. set_ver_pos:
    , W0 y6 g$ C9 ~7 H  }. @
  692.         jmp     _set_ver_pos+ R9 p& X' q1 E7 x+ Q9 m5 Y* ?
  693. get_mouse_movement:6 A0 s8 b; G, J! r/ r
  694.         jmp     _get_mouse_movement
    7 g; W8 A7 J3 B! U6 B* H; `# L
  695. set_subroutines:! Q' \* }+ n8 O: k, ^
  696.         jmp     _set_subroutines
    4 x' ?7 X0 i% O6 l& }% O2 p
  697. swap_subroutines:
    % @  Y3 \4 d7 U; A0 B
  698.         jmp     _swap_subroutines& U7 R9 v& g, w( v5 J
  699. 9 p* p7 h0 D$ v- S5 c
  700. _reset_mouse:
    0 F2 k( h$ x% x
  701.         mov     byte ptr cs:[buttons],0) i; Y/ T; ?' v# c/ N
  702.         mov     word ptr cs:[pos_x],0: {5 l7 P7 v& b" w" \5 J* j
  703.         mov     word ptr cs:[pos_y],0
    : j2 I' c2 O4 }! @8 P
  704.         mov     word ptr cs:[x_move],0
    + N! C" G3 L! v. W
  705.         mov     word ptr cs:[y_move],0
    2 @  q8 Q3 }. J4 G/ \
  706.         mov     word ptr cs:[x_max],639) G" W7 G+ P/ p3 q! [% h$ e
  707.         mov     word ptr cs:[x_min],0
    & I/ G: K3 Q4 j. l: F
  708.         mov     word ptr cs:[y_max],199* p; e) Z; g0 {2 v& Y* h/ J1 U
  709.         mov     word ptr cs:[y_min],0
    3 \, P, h* ]% c) H4 D" I! u9 Y
  710.         mov     word ptr cs:[user_mask],0$ B, Q/ P- w4 Z1 ^/ Q/ @6 j
  711.         mov     word ptr cs:[user_subroutine],0
    % L. B0 s) K6 j
  712.         mov     word ptr cs:[user_subroutine+2],09 [* N! c) h# }" k7 K7 k3 ^& i
  713.         mov     ax,0ffffh
    " [% u% a: h7 g! m# {8 i! j# i
  714.         mov     bx,3+ q; T; S: X* Q  e$ C! b- u4 V
  715.         iret' @7 y2 G" B0 A/ Y
  716. % v  f$ A9 X8 n! H+ m2 d
  717. _get_pos:' [7 {$ {1 q& n( A2 l# Z' b
  718.         mov     cx,cs:[pos_x]% s  D" e: P5 d$ |" a6 o4 ]
  719.         mov     dx,cs:[pos_y]
    + ~4 J) G# e( P, B* G
  720.         mov     bx,word ptr cs:[buttons]& C6 k# ~# {- w6 J7 {' `
  721.         xor     bh,bh. V3 D; g+ R. L6 y; j8 f5 p# U
  722.         iret3 d. |4 x9 t# M( K* n
  723. % Y& e8 j3 A" F' R( s( M/ Q
  724. _get_mouse_movement:1 A2 {4 P8 o, z* @" G4 X
  725.         mov     cx,cs:[x_move]
    0 m  t0 M: f. n) a
  726.         mov     dx,cs:[y_move]
    ( G; A0 M, a1 M/ D
  727.         mov     word ptr cs:[x_move],0/ y) k% F' V7 |5 a- L( t
  728.         mov     word ptr cs:[y_move],09 r- x7 X: o! W. z3 {+ x
  729.         iret
    ( W2 b/ t  g1 c9 g/ ?  x$ l( u

  730.   n( L2 Q. r$ w' J; }! i
  731. _show_mouse:' G, h. M. C' }& F" Y" j
  732.         push    ax3 |4 _" O2 ^9 j: ~4 s5 e+ J9 h
  733.         push    bx4 A( C8 r+ e1 C! S
  734.         push    di9 n; y- |7 r* c0 E1 t8 R
  735.         push    es' b/ _( H, a7 \+ {7 A- f, {1 k
  736.         mov     byte ptr cs:[sm_flag],1
    % k0 {* }4 a- b) u2 o2 n0 ?  u3 ~
  737.         mov     ax,cs:[pos_y]
    9 d5 f. |9 s! Y" h
  738.         shr     ax,3
    % L# \6 H" s8 k2 C) w
  739.         mov     bl,80' O# E8 p( k9 y1 P) P/ R
  740.         mul     bl
    8 T1 y# j! {- |
  741.         mov     bx,[pos_x]% m$ J! J/ V/ K
  742.         shr     bx,3
    1 s* b; P2 R% v& t4 K
  743.         add     ax,bx+ U' }& ?  r% e& c, @8 y
  744.         shl     ax,16 a% x; U+ _4 B/ E
  745.         mov     di,ax0 h( s; v* e, h' x6 A/ }( E; q
  746.         mov     ax,0b800h
    # Y" W& ~3 U3 j
  747.         mov     es,ax
    ' p& U, ^; g6 H' x! _
  748.         mov     ax,es:[di]
    * f; |* K/ Y! Y8 y- \
  749.         mov     cs:[save_char],ax
    ( k; C$ i  J+ E1 p; a! ?& x3 E; G
  750.         not     ah
    5 ?+ {/ h8 B" A3 F4 i, u
  751.         and     ah,7fh4 o' L3 I& ~; l0 u% T4 C
  752.         mov     es:[di],ax
    $ g2 i: B5 L9 z! \. X
  753.         pop     es6 n1 W7 r( i. E: ^7 |; P3 G% Q( R4 N
  754.         pop     di
    $ ^3 U9 l. Z6 L! d
  755.         pop     bx4 A# P2 T, V, l) j
  756.         pop     ax
    ) d5 D0 q, Y' Q0 P( L% Q& ^
  757.         iret- f4 F3 n  p, g5 c
  758. : C& e; R. z$ w
  759. _hide_mouse:
    ( G5 U# U! L7 W
  760.         push    ax- Y4 p+ c9 U; g
  761.         push    bx
    & N0 S: A- k7 j$ I$ n
  762.         push    di
    ' `% p- s+ [- f5 l# G, x
  763.         push    es8 B  N& M9 `% t7 Z4 z4 w% l8 E
  764.         mov     byte ptr cs:[sm_flag],0
    + ]  V8 M' r' {3 f4 }2 Y# D
  765.         mov     ax,cs:[pos_y]
    9 S4 p' l0 Y+ c/ g0 L2 _
  766.         shr     ax,3
    ; b: C2 \1 x5 U$ c5 c( k
  767.         mov     bl,80
    # @6 {6 _6 H! L5 C) @
  768.         mul     bl& S; u- H3 ]9 u( p. r3 Y
  769.         mov     bx,[pos_x]' r1 c6 V4 J6 q; A( l( F
  770.         shr     bx,3
    6 f; Z! Z6 g6 H8 s
  771.         add     ax,bx" [# H1 j" _/ m' {! s
  772.         shl     ax,1- r! w% b, c* }. }. L
  773.         mov     di,ax
    5 V; u& C  ]  Q% n
  774.         mov     ax,0b800h- U' u# |/ {( f6 \% V  ]; U4 d5 A
  775.         mov     es,ax! n; N# D6 D6 E9 m2 }, k
  776.         mov     ax,cs:[save_char]
    4 z6 S; }* _: D5 }2 t8 V) e8 a0 h
  777.         mov     es:[di],ax' ?9 c+ D! E7 s, N* d2 u
  778.         pop     es% v8 X# f4 [+ z7 f$ u0 c
  779.         pop     di( q! q5 F3 u. @0 A% b1 V
  780.         pop     bx+ j5 P2 N! R0 l2 f0 j
  781.         pop     ax
    2 v* w# n" N) ^0 v! h0 e# q6 F
  782.         iret
    3 A8 x+ b4 L2 P$ U+ V: t" z  q
  783. 3 D" N% i; F7 ?! D( h- e
  784. _set_pos:
    1 U3 I7 e  W& e( `6 H& q
  785.         mov     cx,cs:[pos_x]
    - M0 H" M- @( P% J7 @/ T' w" A" Y
  786.         mov     dx,cs:[pos_y]
    * N% r! u: J# V" N+ W2 j" R+ v3 C' \
  787.         mov     word ptr cs:[x_move],02 S+ g/ Q7 A: g
  788.         mov     word ptr cs:[y_move],0; o% }: O* o, n" l8 T
  789.         iret- a! C( c* t" P+ K. {0 F

  790. $ K4 l) `, [+ k
  791. _set_hor_pos:
    ; S+ x7 b8 T# V/ e
  792.         call    max_min2 j$ N0 g# n3 A1 {
  793.         mov     cs:[x_min],cx
    8 W  u& R! W2 A# k/ d7 m; Y4 B
  794.         mov     cs:[x_max],dx
    7 \3 Y# L$ l$ ^  g6 k4 _' l& F
  795.         cmp     cs:[pos_x],cx4 o% a: H- G& h8 s2 }
  796.         jge     good_hor_min" D# ^8 B. o& o
  797.         mov     cs:[pos_x],cx
    ) d: U5 I5 E4 v0 N) Q% @
  798. good_hor_min:
    7 D" ?1 M+ x# k4 i" z
  799.         cmp     cs:[pos_x],dx7 I8 @" O$ a7 G
  800.         jle     good_hor_max  e& w4 S0 {( o5 T2 z
  801.         mov     cs:[pos_x],dx
    ' }$ K0 r2 e+ `% n+ }/ Y$ t& R
  802. good_hor_max:, C2 b- T6 ?1 z% V% m" f
  803.        iret' X2 l$ F) s/ [4 _% u: ^$ y

  804. $ F% q' E0 \9 |2 j- F) h9 b' [
  805. _set_ver_pos:
    ; q; i3 f& V' z' m! M2 H
  806.         call    max_min
    # F: g7 |1 N( E; D$ w" k- k9 B
  807.         mov     cs:[y_min],cx: P* }% \5 \* ]9 a7 ]
  808.         mov     cs:[y_max],dx
    0 I- F' C7 O3 Z9 K% a$ S/ ?
  809.         cmp     cs:[pos_y],cx
    ' T2 H  \+ j* }4 V; [
  810.         jge     good_ver_min
    & Q  j" j. x0 A& Y4 q
  811.         mov     cs:[pos_y],cx
    ! n8 r6 B; }1 i# ?1 b
  812. good_ver_min:) e9 G& ~" l/ ^
  813.         cmp     cs:[pos_y],dx6 E6 O3 Z- S7 Q! f! u3 U0 R
  814.         jle     good_ver_max) J% Y& T: r8 s! B8 J( s
  815.         mov     cs:[pos_y],dx8 K& h# b+ w; i% @% w
  816. good_ver_max:
    : o1 I1 a5 E6 _3 @
  817.         iret7 ^: ?% R% O& ^
  818. ; T' e0 @3 p: U/ c7 P# c
  819. max_min:
    % u, r# C  p( I3 u) t7 n3 ]
  820.         cmp     cx,dx
    % {3 \6 \7 j* H3 p
  821.         jle     no_swap+ k* [$ a/ s& p) e* d, `# n4 q' `. W
  822.         xchg    cx,dx
    : y+ r  o0 j0 [
  823. no_swap:% j! R% Y% @# k& L( B8 Y# f
  824.         ret. g5 G$ t5 W8 {$ j) l; Z
  825. * d( K: R  C% M! ^* ?
  826. _set_subroutines:
    9 Y! |  X+ x4 X
  827.         mov     cs:[user_subroutine],dx
    8 n# s- f5 c3 k7 o5 n
  828.         mov     cs:[user_subroutine+2],es. \4 h6 U1 C$ B+ q" T, Y* Z2 L2 \! g
  829.         mov     cs:[user_mask],cx
    - z, n& I# g" n* v- U, x
  830.         iret- x. ?. Y0 l2 W( ^% c: [  t

  831. 5 K4 K; }) }  E- |; n( r6 x2 M5 {
  832. _swap_subroutines:
    ) ^7 ^' T' E( C7 G  b
  833.         push    word ptr cs:[user_mask]
    & `+ v8 S0 @  x( ^$ K
  834.         push    word ptr cs:[user_subroutine+2]
    5 d6 ]1 \- l( J% k( O' ]
  835.         push    word ptr cs:[user_subroutine]% U* d- z2 d1 F  p/ C$ X
  836.         mov     cs:[user_subroutine],dx" [- i8 s# j, H( H& D8 U  y$ i7 X0 s% X
  837.         mov     cs:[user_subroutine+2],es0 m, F, z+ b2 }5 }
  838.         mov     cs:[user_mask],cx6 J4 ?9 i- W  ]4 T- `
  839.         pop     dx
    ) q6 \! w, ~, q  B) Q# }
  840.         pop     es
    # I/ `  G$ q* z7 y
  841.         pop     cx0 r6 }3 z* o* S  u# ?
  842.         iret
    0 e# s# A! O! ^( W( k0 |

  843. 4 o* w: c. y. c" A& K- z
  844. memmouse        endp
    9 T. [6 B8 A7 N6 h1 M/ c5 B. o
  845. % c* X5 m& L% m" W5 r& H" g
  846. endof_start:
    ! J+ }# D3 y1 w7 l1 D
  847. * c5 }8 G* D' q+ ~% _% E6 R
  848. emsg db 'No mouse driver install error!$'1 M2 j# `3 |7 a; m8 X
  849. old331 dw 0
    7 j# h5 V+ U2 |+ y: q+ }
  850. old332 dw 06 x+ S$ Y% x# ~0 C
  851. old741 dw 05 w8 M, N8 P/ L  y* a7 [
  852. old742 dw 0
    . _, T! ], D! z) i% r* h. z
  853. memcopy db 0" U7 u) p- ^* V; Y$ Y5 N8 i
  854. okcheck db 0
    + G7 T% d  K$ e9 Z4 M8 N' N- W$ t3 d
  855. pass db 0
    " ]& B- k9 m8 f4 |/ _
  856. chkl db 0% e2 }; J' C7 A$ b+ F
  857. lk db 0
    . r* G2 i. `  k8 G6 U5 ?
  858. chkr db 0  U+ N: {, `, f3 f2 f1 K
  859. rk db 0/ f7 H8 C/ `+ d) ?9 G7 {& L
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '! y' i) {) [0 H- T
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '5 B4 q, l& ^' v" Q
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '% r2 A! Z- b; e
  863. db '                                                                                '
    ) |8 R0 C, ~1 _
  864. db '                                赏屯屯簧屯屯突                                  '
    3 G% Q7 _' }! r. f6 Q
  865.         db      '                                ?OFF汉OFF?                                 '
    6 S: S& @3 q6 q1 l. G8 Z
  866. db      '                                韧屯屯既屯屯图                                  '
    & l/ {) j% M* |% F- K5 i* C; p$ c' ^
  867. db '                                                                                '- q6 D& ]8 Q6 R& k+ h
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '% \4 B: T$ ?/ c  D9 I; y9 j6 e- u' q" T
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    1 H7 S7 Y0 O" }" w- u# L
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '6 G; A- K! B5 o# `+ U  s
  871. 7 D) O6 v+ _2 {5 e$ A8 X
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!% |- `- l) Q# O  U
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... % o3 M7 P7 a: u" e4 v5 r3 Y$ P
& O+ y5 L( C; C; o; z3 d7 h: ^
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-4 00:22 , Processed in 0.095336 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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