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

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

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

/ l2 g6 x2 m* W& i4 a代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;, T( [; q4 F+ p" _/ J
  2. ;          Ufoit PS2 Mouse test program   Ver 0.95 {% Z2 l: d8 T3 r3 t' x# j7 ^
  3. ;                                         By Bini.Yi 易祝兵
    . o, c  P1 I( @8 @: W6 L
  4. ;                                         http://www.ufoit.com 计匠网( }$ Z) `* R" d1 E) A3 U
  5. ;                                         2002/04/06 YYYY/MM/DD9 l9 I% y$ p$ |! b9 {& K
  6. ;* f; ?& i; ?% n1 R
  7. ;         
    ) u5 y1 m: A6 F0 f" D
  8. ;          This program  test the mouse button  click and move.: p: b$ J" a$ O
  9. ;9 f; O4 F$ [7 I3 G8 z: T
  10. 7 G7 @8 p" ]3 P% F; _7 m
  11. .model tiny
    + `5 x# P) T, E5 l( [, O- d
  12. .586) \0 P9 O" h- z0 e( |  U, H+ V
  13. .code
    ! k* Q7 O- j6 e- t3 N) @
  14. .stack  100h
    6 J6 ]7 X- ]2 M8 r. N# c' g
  15. .startup; }+ b- \) @. c
  16. pusha2 L; l5 C9 g, H# d% K$ h
  17. mov ax, 3533h. O/ {# K# t& G4 e1 W1 P0 g
  18. int 21h1 L$ G+ o; m$ t6 ^3 c6 R" t
  19. mov word ptr cs:[old331],es
    ( S( v7 H7 W. O& V: {8 x
  20. mov word ptr cs:[old332],bx
    % E3 v# Y1 @: B( c0 r
  21. mov ax, 3574h
    " C; P* w$ ?0 v
  22. int 21h$ \* N9 ~5 T% C
  23. mov word ptr cs:[old741],es  e. g! a6 r- M+ _/ c3 D
  24. mov word ptr cs:[old742],bx( f' S) L5 }& o% {$ L9 [( l& O( c
  25. popa& c3 N* W9 n: p$ M) O8 \. ^
  26.         call    memmouse/ t) S/ l+ Z$ R- h% I. S
  27.         mov ah, 00. @! t3 s( F0 Y8 T& R# T; [7 |# E- K+ v
  28. mov al, 03* \. F5 `& y# l: @; X: r
  29. int 10h4 T. o$ r6 Q) m# N2 A) R  |
  30. mov ah, 06% t% _' S6 ?) F6 J# V
  31. mov al, 0: o) F* W7 q4 s# Z" N
  32. mov cx, 0" U  b3 o' H' S% ]5 v  D6 ~. e
  33. mov dh, 24' a6 ^. f. @2 [. k. C
  34. mov dl, 79! j. f- {4 H# v" E6 ~
  35. mov bh, 07h& y8 z3 o+ y# p7 a) u
  36. int 10h
    # ]1 y' C0 _! E" V! y
  37. mov ax, 0000
    " M6 Y- R6 Z0 M  t+ i
  38. mov bx, 0002/ s' u# p- S0 a  q. p( y, d
  39. int 33h7 I6 R0 b' H* y/ K8 b+ m& O$ T
  40.         cmp     ax, 0000           ;if no mouse drive install$ n% L7 Q* s; t) X$ u* X' y
  41.         je      errormsg           ;show error MSG: w$ t7 Y" K9 {2 n8 C
  42. mov ah, 02) `2 \, ?  l9 n
  43. mov bh, 00
    ( W* g& X1 D  O2 V" g
  44.         mov     dh, 25             ;Move point out screen! O; x& U" U2 z
  45. mov dl, 79
    ! a2 t! K" p: K
  46. int 10h: q/ a' w0 i1 T2 H; |! @8 P
  47.         call    showmsg            ;Show info% R% V8 X# ^! ?2 U/ p* L0 e3 Z& C; y! p
  48. mov ax, 0001
    2 Q1 D! A) Y& }8 E
  49. int 33h# p& }, a4 F5 U9 c: l+ {
  50. ; mov ax, 000ah
    ) \5 @, `% _( ?3 ~6 }: F: ~
  51. ; mov bx, 0000
    ) q1 d/ g. u( Z; d0 d- E
  52. ; mov cl, 0h
    - m5 P* j) i) d% q; Y4 p0 i
  53. ; mov ch, 0F0h
    4 V6 n/ O/ L0 m4 G
  54. ; mov dl, 0h, M- a6 u  r0 X$ B( B8 |6 W
  55. ; mov dh, 0F0h
    6 Q$ L5 G# N$ j
  56. ; int 33h8 S% J( p3 E8 i, c) q
  57. mov ax, 0004h  g. G+ T3 E/ x& W- j; S7 }) t; U
  58. mov cx, 0319$ R( R" K. w" ?6 a
  59. mov dx, 01035 N/ X: T& T- @8 m  d
  60. int 33h
    # E, A- G2 J. U, }1 m1 V
  61. casemo:                           ;Case button click and point move ; c, X' L: A: m
  62.         mov     ax, 000bh         ;and keyboard press% v7 D& B% W3 v0 ?9 z
  63. int 33h
    $ A5 r7 \7 |6 h" t+ V% q0 h# s$ Z
  64.         cmp     cx, 00h           ;if point move....X) |5 @' V# ^; w6 l
  65. jne xmov
    : A1 p4 O: O) D( a" q2 }
  66.         cmp     dx, 00h           ;if point move....Y
    & O% T/ ?3 p2 v
  67. jne ymov
    9 i/ `% M4 Q4 c) l" S2 H' s
  68. xymovend:                         ;X.Y move end
    # D7 m( p% }6 R5 D6 h$ u# m0 q
  69.         mov     ax, 0003          , D( c9 C: g/ R0 R0 k+ l# _$ n" R0 |
  70. int 33h
    3 r- _$ t0 c. F5 o
  71.         cmp     bx, 0001          ;if left button click  show ON$ q- @9 I- J0 Z4 E% h- n
  72. mov si, 1828
    ' Q! B0 D/ ]: `/ G8 f% t
  73. je listl1 J1 D5 w9 W4 n) A; B  g5 z7 C; a: P
  74. mov si, 1828  G! c  e/ s1 |  l6 ~6 x" B
  75.         jne     nlistl            ;if left no click show OFF/ `4 W6 E+ V& e1 X( W3 _7 ~
  76. testr:
    , f7 u& z2 u( D, l3 y
  77.         cmp     bx, 0002          ;if right button click show ON: H9 @* N1 ~- P5 b) E
  78. mov si,1842
    : X0 {8 A% U/ F1 t" S0 N; L
  79. je listr8 l" ^4 Y2 N1 ]- z$ }
  80.         mov     si,1842           ;if right no click show OFF
    & i! C' m- |& K) w
  81. jne nlistl
    6 k& V( }- ^$ Y( {6 p- h5 Z
  82. casekey:1 w" n1 C: L& e5 Z. {- k6 a& p
  83.         mov     ah, 01            ;if any key press jump check% K3 S0 F- @1 Y4 X1 Q, h( \* i
  84. int 16h
    4 S, p3 d$ w/ @: \
  85. jne kpress0 a  f! n. b( Q9 B* J  Q0 M
  86.         mov     al, [chkl]        ;check x flag
    : s$ d, u* ?8 v* }, ^0 q3 |: @
  87. cmp al, 02h1 j$ k# C& R- I6 w
  88. jnb chkok5 X7 Y, l( i/ ?& O
  89. jmp casemo
    / W& K2 H0 j* M7 g
  90. xmov:                             ;if X moved, get the X flag+14 X$ ~2 V9 ~/ v, T
  91. mov al, [chkl]! {! C8 ]% y. u) s; F
  92. inc al
    & F9 h" r& t7 E0 d1 s% j# L
  93. mov [chkl], al$ P3 e; Z; r0 y1 B+ g
  94. call passok2 [' D2 a/ J: W8 X0 W
  95. jmp xymovend
    * X* M7 [1 u+ e2 W
  96. ymov:                             ;if Y moved, get the X flag+18 l% |1 C/ l1 r, [* u
  97. mov al, [chkr]9 l9 F! w9 F( Y) x9 d
  98. inc al$ v6 o# O' J+ s1 [
  99. mov [chkr], al: H8 q2 A' c  W: `6 f; Z* b9 r
  100. call passok
    ' I9 T3 [5 M- Q: A( q, H
  101. jmp xymovend* {9 a* ^1 {% J/ E

  102. - ^7 c+ P, \" b4 D$ A) X
  103. passok proc near. y: i. S- ?+ m% `
  104. mov al, [okcheck]; r5 ]0 Q" R- D
  105. cmp al, 1
    & v1 Z  [- q6 _& j) P
  106. je let0
    8 S6 V; {6 a. ^2 s. I4 e9 Z
  107. jmp passret
    2 P+ L) W2 Z- u6 Y) u
  108. let0: - M7 _: K. @8 C4 g& o0 L
  109. mov [pass], 1
    / s% Y* j0 p, K$ h5 I% @
  110. passret:
    - q& ~, y0 k( ^! S
  111. ret
    7 [* z+ d/ B# k; s5 v4 Z
  112. passok endp
    8 p9 L. @( O( @9 V( h' K
  113. 3 L0 [& |4 ^7 F/ N3 |$ B9 z8 [5 G
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS
    $ k. Z9 c$ L4 _; o" z
  115. mov al, [chkr]) {/ x8 l) S; y+ q
  116. cmp al, 02h8 x: f/ c" p1 ~9 z9 J) S
  117. jb casemo" k1 M) ]/ s1 S$ z; ^
  118. mov al, [lk]
    4 [+ L7 B2 W3 d
  119. cmp al, 1
    * g# z" L4 f7 K' n4 m
  120. jne casemo
    : F( q( W( _* d" x
  121. mov al, [rk]" w, X- _% p8 g+ Q
  122. cmp al, 1
    , h* B! {: J, s% [$ Z, y) ]/ d! `
  123. jne  casemo. R* h" g, d  n8 I* n2 y' p
  124. mov [okcheck], 1% U' T+ ~. {, e8 D) g$ S
  125. mov al, [pass]
    - f% Q8 N  k8 X. X
  126. cmp al, 15 P, p% l7 {  ?
  127. jne  casemo& O1 @8 ?- Z. l5 q
  128. mov ax,0002h8 l( X" [4 i# x/ W
  129. int 33h
    % ~  z8 A* H2 j' J
  130. call cleascr
    " M' f8 r( `- s+ i: A

  131. 2 ~; ]$ X( Q$ @4 ~
  132. call oldint4 I6 H6 H2 W; E5 i, W- ]0 ~
  133. mov ax, 04c00h0 [: Z- Z/ v' ^* U2 R
  134. int 21h0 Q7 u2 {1 B" U  Y2 u

  135. & {* `4 `( t* \- K
  136. okexit:
    9 R' h- i7 j, j4 ]/ V. T' x
  137. mov ah, 4ch
    ( B: c  Z0 J4 W' \" o8 H
  138. mov al, 0
    ; D, B& E  |* J4 Y/ T4 G
  139. int 21h$ G. |% G4 q! R( J9 E
  140. listl:                                 ;Show ON0 g* b$ T& [% z$ v
  141. pusha$ k) T8 E- f1 [
  142. mov ax, 0b800h
    " _. i7 B) ]! u( t, ?. {, y' d9 u+ G
  143. mov  es, ax
    4 t3 J; X' Q$ @: r
  144. mov ah, 47h
    4 Y9 }9 G; d4 j" K: H% ?7 V
  145. mov al, 20h% S& J! G0 b; ?" u  ^% t
  146. mov es:[si], ax/ X( \. ^! }2 s% p# k2 N5 c' @
  147. add si, 02
    0 h& h$ R0 Z/ U- A) j
  148. mov  al, 4fh, [6 l  k: l% [" W
  149. mov es:[si], ax
    ! }( D) Y% w9 l
  150. mov al, 4eh5 i! f6 ?) I) w5 L
  151. add si, 02- C3 C4 I( u( N! H4 g2 b
  152. mov es:[si], ax
    1 T" y' @* G. Q. B; X2 q( U
  153. mov [lk], 1
    7 l$ g/ J; r; ^* A/ V
  154. popa
    " s) g5 z0 ]9 C: m
  155. jmp testr
    ! {3 o3 {$ Y& @
  156. listr:                                 ;Show ON
    4 e6 r8 Q4 x. B, D/ }6 H
  157. pusha" G' w3 U+ |7 [! H0 O# J* A2 V
  158. mov ax, 0b800h  N8 |& |( {7 t: I" t, C) ~6 R
  159. mov  es, ax: ]+ n% D) `, z; |5 S6 K2 d0 Q
  160. mov ah, 47h
    $ l; S( u" a; p4 u* B: Z( }
  161. mov al, 20h" i3 A# }8 h4 Z& |  `
  162. mov es:[si], ax
    0 t; W4 j; t, Z( I6 n
  163. add si, 02
    3 F5 `1 v& r2 J; j* j. d
  164. mov  al, 4fh/ ~0 U0 t: A. c$ s7 ^. E+ J6 j
  165. mov es:[si], ax
    / [7 Y- s5 E  P( d" q( @% h
  166. mov al, 4eh
    8 G! i" ^+ P3 W  F# n) s4 U
  167. add si, 02* k6 G  _& T* @9 p
  168. mov es:[si], ax
    0 `* l+ z* E, u. a, O4 j/ U
  169. mov [rk], 1, I! \/ e$ D; d) k( W2 l# Z+ s3 c1 ^! U
  170. popa
    - J" `6 X, F( n" i- e  n1 n
  171. jmp  casekey
    # L* q" s/ M8 I
  172. ! g- ^7 b1 [1 m0 ?5 ~3 j3 }+ E
  173. nlistl:                              ;Show OFF
    7 k& V) a2 E0 L8 S
  174. pusha   
    $ Z& E) u; U6 h1 N; t; i
  175. mov ax, 0b800h) |9 z3 Y2 L* P; ?
  176. mov  es, ax: K/ s! B4 [3 X: [+ w* a2 O
  177. mov ah, 17h4 [. h6 e; O" J
  178. mov al, 4fh
    9 _4 t  m. O1 u/ \3 _+ Q+ F; J" M
  179. mov es:[si], ax
    " r8 V$ [# w. [# W2 v
  180. add si, 02
    # `0 U- |: ?- ~/ I/ @' b: O
  181. mov  al, 46h9 [& l- `( V# s) h# ^( t, p
  182. mov es:[si], ax8 f$ p2 R6 Z2 t5 ?2 T3 t
  183. mov al, 46h& @* y' z1 w: O( y
  184. add si, 02
    0 S  Y5 c+ N: p; I
  185. mov es:[si], ax! |) I% @3 }  z6 J) G# l. E4 h  e
  186. popa
    + b& p2 j3 j6 X* z# d# `
  187. cmp si, 18405 s3 o1 c  s' D6 z. L4 d; n1 F
  188. jae casekey7 N5 v/ N% p( v5 Q: u# l% B4 L- j
  189. jmp testr8 @) Q' T# O9 Q. L9 a: x% @$ ^

  190. . q3 g4 H3 ]5 p# i* n) z/ \& Y# [
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    " ^& i5 m9 z* f! d
  192.         cmp     ah, 01h             ;and return a error
    1 o& w/ \+ T  D* i# U4 \/ ?
  193. je exit1
    5 p4 Q7 c+ ?7 R+ y6 C* S4 w
  194.         mov     ah, 0ch             ;if press other key then clear
    6 R+ }* g0 F! Y# Q
  195.         mov     al, 00              ;keyboard buffer
    / _/ I# ]  x" o1 G9 b
  196. int 21h
    + A: v+ g" Y7 U# b& J# f
  197. jmp casemo & O) H: I% @( ^$ m0 s3 V, B) C$ X' F

  198. : q/ u: C) l, X. g2 h# s5 v
  199. errormsg:                           ;if mouse driver no install
    - e1 `0 z' B* z3 ~
  200. call oldint
    4 m/ s; Y$ Y* C: z
  201. lea dx, offset emsg- R: @! s% Y: p* z7 U
  202. mov ah, 09h# l0 t9 k8 x( M4 D3 d3 x
  203. int 21h8 V4 A5 b/ J. f6 o
  204. mov ah, 4ch
    3 b4 L9 P( y) m4 ^; C
  205. mov al, 2
    4 Y# y( p5 ~; z8 i2 v
  206. int  21h. O* h+ w. G$ q8 }1 C1 P- }# ^$ f. O
  207. , A1 `; x( N: ]
  208. exit1:                              ;error exit
    : Z. ^0 z0 S: H' O0 R' T% [; f1 Q
  209. mov ax, 0002h4 x8 F) z6 L5 `' W
  210. int 33h
    % g1 E& X2 V* P. t$ F, J/ c" P
  211. call  cleascr' B  g- }3 z; ]$ @
  212. call  oldint
    + ?/ Q: H; x: Z( V' n9 r! ^5 e3 U
  213. mov ah, 4ch. m; S) F6 v3 ~8 {3 _( Y3 f3 |
  214. mov al, 01
    ) q: {% G+ b. T) J+ J3 l5 S( ]$ p
  215. int 21h, M  V% S& L$ t2 q6 r0 ^: o; V& S
  216. - \" r5 i6 W6 C) \3 s
  217. cleascr proc    near                ;clear screen
    + s6 K" |5 U% Z: n+ ^7 T9 m0 u8 z8 [! c
  218. pusha* T/ ^, ^+ ~) s
  219. mov ah, 06
    # t9 J9 `: r0 k% z* m* S$ T2 k
  220. mov al, 0$ ]' T# k, v( m# J, s+ f5 T4 K
  221. mov cx, 0
    7 n1 a% c2 G; f6 a
  222. mov dh, 24% R5 Y9 w* Z* n! p! H3 r* [3 G" H3 D$ `. v
  223. mov dl, 79
    6 b0 Q$ |2 U! |+ l, }2 m
  224. mov bh, 07h
    . n0 T! ]5 v# C9 z4 H; ?
  225. int 10h/ j0 y' D3 h/ k. ?6 F( {+ f
  226. mov ah, 02
      K1 d7 ]- N0 R% l
  227. mov bh, 005 S0 Y0 x$ p0 }( N
  228. mov dh, 0
    % s" l% b1 x: x+ ~0 n& t, \
  229. mov dl, 0
    , I9 |/ Z5 ^/ D( B$ u: g
  230. int 10h+ H& _; E, X% p6 P
  231. popa! C0 A* D5 b+ k' b
  232. ret1 D# Q7 u) W7 E* ?) z$ K9 G
  233. cleascr endp* \1 s9 w+ J) P" P

  234. 0 s- p4 B- l" Q: T8 }) v% A
  235. showmsg proc    near               ;Show info! w# N! U: ^) F: @7 F" ?1 S
  236. pusha' Q, ]. W% Y, X! Q( r
  237. lea di, offset showms
    1 s# z8 \+ M. s9 a* A/ ]) d
  238. mov ax, 0b800h
    ; S; R5 ^+ X  q) n
  239. mov es, ax/ A* u+ E6 F( \' |+ ~# c" W
  240. mov si, 0. L0 b5 Y7 K* [  z8 Q2 K' P' ~
  241. mov cx, 480
    5 x4 H2 \  {/ R1 z# s+ c4 [  E
  242. mov ah, 07h% `8 |! e. t1 F3 w: ~7 s8 [+ a
  243. @@:
    3 I8 q! U- o3 I8 W  w4 ^: `
  244. mov al, 20h
    $ R& W  j# S% T9 M) B6 F
  245. mov es:[si], ax  {. Q- M1 d& v4 |) w  [+ q& H
  246. add si, 2
    0 h  M: O) J3 V8 p
  247. loop @b, o, Z# ]0 b0 s1 K( s4 t3 m/ b5 c/ k
  248. mov cx,880
    ! J. l, H( F1 @, h; V
  249. @@:3 Z, y! \% L5 }  O# _. R
  250. mov al, [di]
    % p, J& e8 e; N0 s& u
  251. inc di
    , v5 H5 k6 m; O: c
  252. cmp al,20h
    1 @8 j& A3 \% T' O8 D0 i. m  Y$ o
  253. je showch14 a9 `/ s) N4 U! _( \$ Y3 S
  254. mov ah, 17h
    * r* w1 q: ~7 H; V4 k$ ?
  255. jmp showch3 % p* t& x( M3 l$ M, x$ O- e. N
  256. showch1:1 j* N6 Z, u, {: e: X+ z8 A2 ?
  257. mov ah, 07h
    3 ]. B" ]1 Y$ y2 z" p
  258. showch3:
    ( R1 J7 `3 i+ }* R1 k) @
  259. mov es:[si], ax
    ! K+ a0 u  ~' O( w
  260. add si, 2! G) }1 H7 P% J8 ]
  261. loop @b
    - G  K* a4 e3 W5 T8 y+ z
  262. popa
    8 q, M+ @) P% t5 F' ^8 d
  263. ret$ ~0 A0 ]  m8 I$ ]6 n5 }
  264. showmsg endp
    ; L! i' ~9 Y2 K- \

  265. ' l9 M. I' ~1 M. k
  266. oldint proc
    , J* P5 p' W9 W" S( [/ k8 V
  267. pusha
    - ]# Z. G6 \: U) p+ @+ X2 B
  268. mov ds, word ptr cs:[old331]+ b0 O' r7 M! d9 d: c( |  \
  269. mov   dx, word ptr cs:[old332]% C, Y6 e+ ?& n3 m
  270. mov ax, 2533h
    . ~3 `" k; V% y+ N- N& r
  271. int 21h
    " B5 ^: O6 a7 D4 ~$ [
  272. mov ds, word ptr cs:[old741]8 U$ ?7 ]* t1 t- E+ K9 s
  273. mov dx, word ptr cs:[old742]
    # |+ h0 Y6 b3 ]+ A" t
  274. mov ax, 2574h
    ' t- O. q) A8 I3 N) N; _/ p1 W0 O7 c
  275. int 21h
    7 m) B1 E1 |& u: A1 q1 {% I
  276. popa* P0 P5 i2 s7 w* {  X0 h
  277. ret
    ' W0 E- m7 \2 [7 A: u: C
  278. oldint endp
    : _  q5 E; i6 X* C

  279. * ^- ^1 A$ [( I# o- X
  280. memmouse        proc/ O# X( a. l) b- i
  281.         xor     ax,ax
      H9 B& J8 F; W9 a
  282. int 33h2 A  E5 W$ a. ?( W0 b% R: y
  283. cmp ax,0ffffh
    ; C, k" t/ r. @2 @6 a/ Z4 B# b! U
  284.         jne     not_loaded
    ! u, ~, S, p+ b
  285. mov [memcopy], 1
    $ G4 a5 E$ x# @2 F( c
  286. ret; U% y% N" y. P5 X5 l& c
  287. - {+ N& u' I: S1 J
  288. not_loaded:* S' `6 l  L6 _7 t

  289. 3 u% G0 w( y( a9 U1 a
  290.         mov ax,2574h) |9 \* R$ i; k! r0 R
  291.         mov dx,offset new_isr% G3 x+ [2 {- Y* _& s/ A+ `
  292.         int 21h
    & @$ m7 A- L2 A, Y

  293. " j) M6 f# W+ |! S) C
  294.         mov ax,2533h# v! d6 n8 K; e5 w
  295.         mov dx,offset new_33
    # N" q! [9 B. D/ k  B( u7 w; v0 K
  296.         int 21h
    8 D4 q& U, d0 S. a
  297. ) D4 F& T; g+ j  P& Q$ P
  298.         cli
    % |5 a3 F% i/ c, K% P; m! L

  299. 5 ^) Z2 }0 @: }
  300.         mov bl,0a8h! J! i' e5 i% p( E) N
  301.         call keyboard_cmd
    6 k+ T; h9 n. w; X7 C

  302. / H( L8 `4 l) ^  `
  303.         mov bl,20h) V8 c4 j4 Z. x" t! i. P
  304.         call    keyboard_cmd* {/ I: d4 K7 |( b9 d* r9 w9 o
  305.         call    keyboard_read
    ; h! G0 @0 N7 a" _1 ~
  306.         or      al,22 r$ h' ?$ s7 m8 \
  307.         mov     bl,60h% n3 l3 X& z+ ?/ ?  X2 j
  308.         push    ax
    + w9 [) m- s  G9 R
  309.         call    keyboard_cmd
    ' D# |; S5 N: T* F8 o
  310.         pop     ax' \2 b; L8 S7 {8 y1 N. ]/ J
  311.         call    keyboard_write
    . e2 h, S, `" a

  312. % O, y8 K. ?, D( w, z6 z
  313.         mov     bl,0d4h$ c% W6 V0 h& }) o
  314.         call    keyboard_cmd
    0 s6 @$ j- }( z) m$ h+ h
  315.         mov     al,0f4h
    $ x; t: q1 w* R' Z! h2 w  I
  316.         call    keyboard_write# t5 C) a- K) t3 Z9 ?# X( k

  317. ; \& }8 f% A! _( _3 b
  318.         sti
    7 ?9 D# E$ D0 z" a! ], O5 \
  319.         ret
    ( y% k) M! T0 r0 ~. z8 y) N
  320. call_user_isr:* k- P4 H( V8 B7 R, V
  321. db      60h- i* }# Z# f* w6 d
  322.         mov     cx,cs:[pos_x]  j) y! l- R( j7 S3 E! z
  323.         mov     dx,cs:[pos_y]& P- `: _+ K/ _, b; E) L+ C7 m
  324.         mov     di,0 ;cs:[x_move]6 B" I% l* U, A& q3 Y: t
  325.         mov     si,0 ;cs:[y_move]) Q0 C+ @! a) Y) ]2 P
  326.         mov     word ptr cs:[x_move],06 A6 Q3 o4 [9 l) R* `
  327.         mov     word ptr cs:[y_move],0
    5 D4 b1 L7 v/ p: C9 ~" C9 X
  328.         mov     bl,byte ptr cs:[buttons]
    , }4 n9 ]) T/ |4 `9 n; d6 t  e
  329.         xor     bh,bh  Z) |3 v$ N. ^6 _4 k6 z
  330.         call    dword ptr cs:[user_subroutine]* w' \: d% K! r1 g
  331.         db      61h% ?7 E; G  N" E4 H
  332. ret( N% Q6 M: }8 ~* z
  333. new_isr:- `+ m% c' n& }
  334.         pushf2 }) `( O- \$ u+ I/ e, j: Y
  335.         cli& M( O. T* J/ S* O8 s1 ?: B$ j
  336.         push    ax
    - ?; h2 d6 ^* q& Z8 V
  337.         push    bx8 Z6 g# r+ J) p  H$ a" g
  338.         push    cx1 O, M) Z9 c6 C0 A
  339.         push    dx$ a) F9 H9 p7 X3 g
  340.         push    di% d& y8 P) p" y1 z
  341.         push    si
    , o4 k3 W% Q  h1 V" d0 W7 J
  342.         push    es+ ?) a1 b1 s, A/ b1 O
  343.         push    ds6 n' v! ]6 d* I6 w9 T

  344. . ^* A$ q. ]4 }1 l  k% a
  345.         push    cs
    # x) w% H: P7 D) b/ C
  346.         pop     ds$ ]. _  {; _  Q$ i$ |5 `+ N* j
  347. , V$ i/ X4 p. T' O8 j! i
  348.         mov     bl,0adh
    3 J6 J  \; Z0 E. i! e0 e8 S/ c
  349.         call    keyboard_cmd
    / N, z( `7 \" N' s4 g* u. ]

  350.   w# H8 e" z" P  l$ ~1 p5 a
  351.         cmp     byte ptr [first_time],0
    - v4 P& r# E8 m( E
  352.         je      not_first_time% r3 a% A, D$ S. w- m, h" W; {& [

  353. # r( ^4 s* c; W. [" N/ A
  354.         mov     byte ptr [first_time],0( V9 {3 ~& b6 b: A: U
  355.         call    keyboard_read- p4 X) @8 T, M" r% F/ x
  356.         call    keyboard_read
    & X. E5 G( r: P% q* g+ _% h0 f
  357.         call    keyboard_read
    % a2 a* d1 B2 F( y( x  L# R
  358.         jmp     no_show, @, V2 T- h! r0 d' N  X, O
  359. & l+ K% d/ S. G' H& M) k
  360. not_first_time:3 A# K( G' i2 C7 P% h! |
  361.         mov     word ptr [temp_mask],0
    9 b( F6 R2 p# K( T+ ?

  362. 8 P" I' ]* Z+ H* X1 _7 q4 H/ E
  363.         mov     cx,[pos_x]; T* R* b! q' t! O) w# e, z" g
  364.         mov     dx,[pos_y]
    * v/ p& Z& a7 u4 M: K  ^
  365. $ f8 F( a" ?, D& ?. z  n( b( e, a
  366.         call    keyboard_read
    , g+ x5 D" G/ K3 P' D; Z
  367.         and     al,7 ;3
    ( x7 L9 S2 t+ ]  H* K$ J
  368.         mov     ah,[buttons]$ |6 @2 K' h! I- n: t0 n
  369.         mov     [buttons],al1 ^" ]8 q8 T3 s# N  R
  370.         cmp     al,ah
    ; l( h3 \8 ]2 |: C
  371.         je      no_button_change' p2 ^" a8 |5 K4 c$ ~
  372.         and     al,3
    / i& z9 q  R5 x, h+ |! H
  373.         and     ah,33 m4 N1 M1 V) r0 z5 M1 v8 Z
  374.         xor     al,ah1 n$ S) U& q6 F5 L
  375.         xor     bx,bx( ]9 }2 H8 v# t

  376. * R  S! `% H$ z, f' c3 l9 u% p; L' k
  377.         push    ax2 X7 k& M  a* [( k2 J
  378.         test    al,2
    3 I* e9 V, e# w* \% _) v
  379.         jz      no_right_button_change
    , u& n7 M& X: N: u3 s! j5 B7 u! I
  380.         and     ah,2
    / q) |7 ]* a- o/ F% g, Z
  381.         jz      right_button_pressed  O% X3 I7 h' U9 @& ?7 R" F
  382.         or      bx,16$ F9 V0 l3 z4 p4 D, K+ G% K" t9 l& L
  383.         jmp     no_right_button_change3 H. p3 r3 r: ~' c0 c
  384. right_button_pressed:
    + H4 s* j8 k8 L# d4 Y- B2 L
  385.         or      bx,8
    0 r. q, F  G+ ]
  386. no_right_button_change:
    5 @' i) Q% d* e3 u# \4 R. W

  387. ' A0 s( u: C- R
  388.         pop     ax! A! Y: o+ G$ C
  389. 0 S0 F# X$ H# X  y
  390.         test    al,1
    0 `( M. |; b/ ?- U4 Q% e8 `
  391.         jz      no_left_button_change
    , B  ]* d2 \* h3 S
  392.         and     ah,10 t% m" h& b9 Y/ D: U
  393.         jz      left_button_pressed
    3 a' j/ ]) ]$ C0 t# ?
  394.         or      bx,4
    5 i6 A! X% X- B
  395.         jmp     no_left_button_change
    3 ^& `8 H. L% g* {
  396. left_button_pressed:4 v- j  H1 o7 ^+ R: F1 U6 v
  397.         or      bx,2# q: e2 B. [* j! q9 _
  398. no_left_button_change:
    + {6 I$ [3 c( G7 x

  399. % b, ?6 \# k& {+ E, L: m: b) c7 R4 B
  400.         mov     [temp_mask],bx
    9 j" Q9 J7 S* w* k
  401. 4 X( V1 |$ ^' ~- V5 N
  402. no_button_change:
    # a- C# |6 z, ~$ c# J
  403.         call    keyboard_read# `  U; T3 [1 w2 S5 r. e
  404.         cbw! \- S$ x8 P- ~4 s$ {
  405.         add     [pos_x],ax
    , o4 d7 ^. S) y" y  E+ ]
  406.         add     [x_move],ax0 L. Q' E) W+ ~; C
  407.         mov     ax,[x_min]
    4 n3 c8 J2 S# L7 |
  408.         cmp     [pos_x],ax! S6 w  o  s  D, [
  409.         jg      good_hor15 N( v3 |- ]7 ^+ V! U3 q' t
  410.         mov     [pos_x],ax; r' t% ?6 B. t+ F; c
  411. good_hor1:2 D' S/ R; V3 b  S' a! ?
  412.         mov     ax,[x_max]
      W& i! O6 H) D2 i) w' ]7 _& J  T
  413.         cmp     [pos_x],ax
    * v7 }/ w  J* Y% p7 Q1 j" S
  414.         jle     good_hor2
      M. M- r! W. d
  415.         mov     [pos_x],ax
      ^. |( t- ~; {8 f* \
  416. good_hor2:# k4 m3 i2 p- i8 k: W9 U+ g
  417. 3 E2 l4 h9 U, L
  418.         call    keyboard_read( Y8 w# o7 f! t; [6 M4 T& V
  419.         neg     al9 Z4 I6 F, z: h/ Q
  420.         cbw
    ' k- P' }! w9 x* _6 R
  421.         add     [pos_y],ax& p$ p0 h, \, `, |  S8 `! N% B# W
  422.         add     [y_move],ax
      i" J2 Y7 u" p5 y- ~% M
  423.         mov     ax,[y_min]
    . Y! r! W1 V" R7 U/ s$ ]
  424.         cmp     [pos_y],ax
    % r1 Z6 m( T. ], K' R
  425.         jg      good_ver1
    7 ^& x* |/ B+ n# q. [/ Q
  426.         mov     [pos_y],ax
    3 w( U6 c( m0 e, W
  427. good_ver1:
    1 E' C2 I' P; X, C
  428.         mov     ax,[y_max]2 ^: o0 c( q4 F5 F5 I
  429.         cmp     [pos_y],ax" N8 [' G( E2 T$ P0 Z" W. r% H
  430.         jle     good_ver23 g) }" S" k, u( ~: o+ r
  431.         mov     [pos_y],ax
    8 a# ^7 Q# I6 D# X4 g2 m
  432. good_ver2:
    3 {- ~* E9 a4 |# |

  433. : u" y! U0 g" r' @% M0 [% Q
  434.         mov     ax,[x_move]
    5 L" {7 m& ~5 \1 _' R4 A7 Y
  435.         or      ax,[y_move]
    : j8 l8 K  o3 d' H. i
  436.         or      ax,ax) g4 e8 I, O. }! M5 [. w
  437.         jz      no_change_position& u% G) p( D, P
  438.         or      word ptr [temp_mask],14 \( K3 {7 W  r; ]1 H
  439. no_change_position:9 \2 t! A& t  s, I& Y8 r$ Z

  440. ' t; X% }0 F& g1 K& c  j% s. z: y2 H
  441.         mov     ax,[temp_mask]
    9 _6 y, p* _% a  ]
  442.         and     ax,[user_mask]) k- y: r. a0 Q2 _1 c( [# p
  443.         jz      no_call_user+ C0 a, b. Q: w6 |: D3 V
  444.         call    call_user_isr% E; k- d9 f. m/ M! _
  445. no_call_user:: ^. a% m: K( f5 ^) X
  446. 0 ?3 R( x8 Q" @$ W. b* c
  447.         cmp     byte ptr [sm_flag],1! g1 {/ V5 J0 `" u- }$ y. u1 P
  448.         jne     no_show
    8 H3 X& h7 b. W' o

  449.   e! X5 q9 e& V5 u" w0 g
  450.         shr     cx,3
    7 U& i, e- e; c
  451.         shr     dx,31 O7 i. }  d2 J8 |
  452.         mov     ax,805 m6 X9 M" ^! g
  453.         mul     dl
    / Q, T2 h* v) h1 N' D1 }
  454.         add     ax,cx
    ) I1 p" B# }# r- B3 f* h
  455.         shl     ax,1) j7 Q" Y+ y2 q9 h
  456.         mov     di,ax6 _- A7 {) i* Q$ M( {8 }
  457.         mov     ax,0b800h" Q5 J7 ~; n; @( \/ d7 T) X
  458.         mov     es,ax
    4 O* [; t. f6 \4 n
  459.         mov     ax,[save_char]0 K' y" W6 Z/ Z3 ~, ]
  460.         stosw% ~2 z) Z* n  r* O3 B

  461. 5 v% {8 `; d- W$ M3 {- V& E8 q
  462.         mov     cx,[pos_x]
    % H' ^+ ]# n' ~* l( d( q1 o
  463.         mov     dx,[pos_y]
    % U! G% n9 b, M& Y0 T
  464.         shr     cx,3+ T9 b5 N, X, D4 H+ ]; {
  465.         shr     dx,37 [& t5 C+ ^$ v, U
  466.         mov     ax,80
    % t; a7 A5 A) B) |4 \9 v
  467.         mul     dl; W) b- d# M/ q* }9 [7 L) v6 t
  468.         add     ax,cx
    # K. p3 A' K& H6 E/ W: t
  469.         shl     ax,1; ^5 n. `2 P3 f4 z' z; {
  470.         mov     di,ax
    2 l) f$ V/ o5 ~; D
  471.         mov     ax,0b800h
    / m: Q; ~$ ?7 J9 c& ^! z
  472.         mov     es,ax3 L8 w9 C/ S% p4 t8 J% F
  473.         mov     ax,es:[di]
    ! H+ L! `: c) F7 F
  474.         mov     [save_char],ax' @" T5 m/ _3 o* `7 o- `9 b9 u& {; g
  475.         not     ah$ a: U) p% e/ p. ]9 t9 [; [6 D
  476.         and     ah,7fh4 w$ D5 W% l& h, ?( m2 H
  477.         stosw
    6 s6 e9 ?0 [$ @5 ^2 d- c2 v/ y9 Z
  478. no_show:7 c0 o5 N* j5 e
  479.         mov     bl,0aeh
    & n% c  t( y! \' {) Z% S0 U! ~
  480.         call    keyboard_cmd
    2 h! N) v/ F% ?& u! }
  481. & R) b) g; I& ~& q) g7 {
  482.         mov     al,20h
    : E9 ?  G/ r8 ?) r- g1 h0 K5 `
  483.         out     0a0h,al
    % l3 D- `7 f, m$ M
  484.         out     20h,al. ^8 U* Z) R; J) _8 K9 P. X

  485. 0 [% f" I6 f! c( w
  486.         pop     ds# h: A! ]; [! c" I0 E
  487.         pop     es
    - M* I* t1 d7 X9 E* Z7 n. j
  488.         pop     si! O. e5 E  Z* g3 ?2 B4 b# d
  489.         pop     di. `  H/ X8 L# {$ w. Y5 Y3 L4 U
  490.         pop     dx) G; F/ ]. W4 a* c; f
  491.         pop     cx3 t. Y( M) D/ y$ s( m" p$ F
  492.         pop     bx
    % z. x6 L0 E7 o, w
  493.         pop     ax
    1 L1 _" @: g" P3 |3 f
  494.         popf
    " x! R% X( G& U' ~
  495.         iret9 ]" L2 k; I( U

  496.   B& T# ]: i* u
  497. first_time      db      1
    0 z( u! P  ~: R8 V+ i
  498. buttons         db      01 i) H+ T; ~0 i$ E* x9 G' H
  499. pos_x           dw      0: r8 S# |1 p& w# F8 N9 f, D( S
  500. pos_y           dw      0
    $ d! u% d% _/ ]- m% p. Z
  501. sm_flag         dw      0
    # s' h) {* o& \( B8 e
  502. save_char       dw      0
    . M5 ^& h! [) M8 L: p  z" n
  503. x_move          dw      0% u- v7 w: U" u) N/ w( S- X
  504. y_move          dw      0
    : e. E) g5 t# k  h4 Y, X5 J
  505. x_max           dw      6399 b5 B8 L6 A- J0 @- o7 G
  506. x_min           dw      0
    5 U5 y8 S! i% p. a( W' e5 f
  507. y_max           dw      199
    " W% A; s3 g& Q5 v; B7 D
  508. y_min           dw      0
    - S: h6 ?" z0 C1 A9 T& K
  509. user_subroutine dw      0,0  }( L9 G; B- k: F8 B: h8 Z/ E
  510. user_mask       dw      0& {+ t+ [5 |7 l, \: t% Z
  511. temp_mask       dw      0
    2 u1 R& y. P& H  N
  512. # [6 g" y' W+ f( K: H% J/ g
  513. keyboard_read:  X# ~& e* I" o+ y% Y4 h9 i
  514.         push    cx5 t. `2 l4 O# L( |: `! ~
  515.         push    dx, O, D) Q4 X9 O- x  n5 G- [4 a
  516.         xor     cx,cx
    % Q+ c' Y+ c" f8 ?' ?+ K
  517. key_read_loop:
    3 U& D  @! y. a( ?. G$ O
  518.         in      al,64h8 C! U4 r# h% m1 x( j) n; R7 T/ W
  519.         jmp     $+2
    ( ?# r! S/ }. N7 Q3 U' d
  520.         jmp     $+2
    2 P4 J! f7 P8 ?
  521.         test    al,1
    7 u4 l0 U3 c5 H) A, f2 t% b
  522.         jnz     key_read_ready
    ) J0 c- g6 `' @0 c+ R% c/ A" L- B! ]
  523.         loop    key_read_loop; |7 c+ G/ x- n7 h! R7 j$ i
  524.         mov     ah,1
    ' V. E) A4 Y' C! N$ F0 p
  525.         jmp     key_read_exit
    8 F3 I# l( m5 ?- r
  526. key_read_ready:4 j3 k) C# x, M3 a! @0 P% S' F
  527.         push    cx
    ( X) S( [! X" O0 M( ]( Q0 x
  528.         mov     cx,32' g4 e7 g" _% r" [* Z1 h
  529. key_read_delay:
    ' ?& J! j* Y% K$ N3 c4 |. T8 i% g
  530.         jmp     $+2
    % |# w) o/ O% F/ Q9 h2 s# D
  531.         jmp     $+20 U  d3 W1 I- E! C7 s& L, Q; O/ z
  532.         loop    key_read_delay
    & c& }) Z# x! e; T- u) Q9 Y5 V

  533. ' |% V  ?# N8 W- s
  534.         pop     cx
    / n2 P% b" N7 f8 b) {  N

  535. , P4 j, T; W2 G; r( ]" G0 n
  536.         in      al,60h- n8 b: E+ b2 ?% e. U
  537.         jmp     $+27 U, c9 T# X. R' @
  538.         jmp     $+2
    1 D" @5 e2 `" h% u
  539.         xor     ah,ah
    7 W6 q+ w- k3 k1 o
  540. key_read_exit:
    1 |) w# p2 @$ w3 t
  541.         pop     dx; s* W; E9 n; Y3 V0 p/ N/ q7 ^! p
  542.         pop     cx
    1 u8 X  h0 U, E$ s3 F# C
  543.         ret" `" T6 H8 O" D- t

  544. 7 ~* W* }1 S' b: D" m  T
  545. keyboard_write:3 v  x; E+ n( ^; A5 u* R/ {
  546.         push    cx
    . C0 g- c! E5 }! m5 g8 i; z) ?( ]3 D
  547.         push    dx
    & S& y) }- p+ f( k
  548.         mov     dl,al
    1 v% y; a% ~7 _0 r5 z* s
  549.         xor     cx,cx
    8 X; q* l8 j/ G, Z! t. s& {
  550. kbd_wrt_loop1:
    " s* q$ g6 ]( e' C
  551.         in      al,64h5 ^  E; P) G# E, K# d# h6 L# l# t
  552.         jmp     $+2
    & A3 A; n* U# e' Y/ ~7 M" W* V
  553.         jmp     $+22 y: }& l% Y; c
  554.         test    al,20h
    6 t2 O9 w3 R* A  K: S/ d
  555.         jz      kbd_wrt_ok1
    2 s6 V# g) H. {7 s' L

  556. , C+ v+ ?4 k1 `+ v- ^+ l
  557.         loop    kbd_wrt_loop1% [1 t, F! G5 p- u0 T
  558. 5 }; }' E+ O+ T9 {" R8 _( L; l# n
  559.         mov     ah,10 [, |5 O4 o9 s, Y# B5 B& b
  560.         jmp     kbd_wrt_exit
    + s$ A/ f; d: X9 Q% T4 P
  561. + p; u( R0 e9 N$ D
  562. kbd_wrt_ok1:( A( R9 ^' \4 v8 ~
  563.         in      al,60h
    . N2 q0 v$ S0 d% W( [0 z% b- K
  564. : D+ G' u& n3 c; m
  565.         xor     cx,cx
    9 N5 l4 ^! ^8 }- o+ C7 K5 t9 z8 W: [
  566. kbd_wrt_loop:
    " @3 S: L& x# W( @- U
  567.         in      al,64h* K2 V  q7 J4 `* U+ d
  568.         jmp     $+2! A: b: l5 B2 H3 Q- \
  569.         jmp     $+2
    ( e3 [7 b. a' o# W- ?
  570.         test    al,2
    " Q" s# v. a& Y( D3 k1 s: j
  571.         jz      kbd_wrt_ok
      _8 c6 F* S! X' p; {
  572. 2 W  P7 O+ E4 V% y8 J4 @; O
  573.         loop    kbd_wrt_loop
    5 g, J; w2 Z) A  H. o
  574. : L# F/ @/ O  R4 `% K$ }, V1 j
  575.         mov     ah,10 S, C: _9 n( ~0 t. L
  576.         jmp     kbd_wrt_exit: v1 `" M% F/ \% L& i, y
  577. $ @9 y5 w+ v+ I* U
  578. kbd_wrt_ok:8 e' _* K0 z7 f- N# K3 E$ J
  579.         mov     al,dl
    + g  G) R! B. T# p  W
  580.         out     60h,al6 C$ ]7 }* P5 F. K. |* V% P
  581.         jmp     $+25 ^0 G. _" ^, S: I
  582.         jmp     $+28 b' ?6 G# H8 q6 |# ?) m/ F! B) A8 y+ X

  583.   v; t2 o0 S$ ?8 Z' y0 c5 M) G
  584.         xor     cx,cx: e8 s& w) ]+ L4 r8 b
  585. kbd_wrt_loop3:
    + B9 j# ?7 V1 P* X
  586.         in      al,64h
    - k* N- q0 \1 C2 _& A8 M
  587.         jmp     $+2( X5 J6 ]9 t* O& d. v, X) `8 h
  588.         jmp     $+2
    ) Q' T0 P% i8 q0 \' f7 Z  _
  589.         test    al,2( g0 H1 d' [8 T# Z: t0 f
  590.         jz      kbd_wrt_ok3
    # r: P; c2 G: T. }

  591. 6 x+ g: Z8 Y/ K( c2 U0 U! n
  592.         loop    kbd_wrt_loop3' O" N: b2 P2 S, V% |$ E3 s
  593. , E2 D$ Y6 u5 _% }+ w8 ]9 P
  594.         mov     ah,1
      O5 H* w: D$ q- b/ s
  595.         jmp     kbd_wrt_exit& N" g! G) }  h) ]( U( ], Q. \
  596. ) N$ n  u4 g8 @5 d  P
  597. kbd_wrt_ok3:6 O' j7 A# l1 q0 V. }$ m5 `- \
  598.         mov     ah,8$ }  |- I6 G9 k' A2 f
  599. kbd_wrt_loop4:
    7 Z$ c8 @1 |( B6 T- b- h
  600.         xor     cx,cx. ^' e0 z6 u6 ^! ?! A
  601. kbd_wrt_loop5:
    $ q& S% A5 t3 h" G& D! ]2 H  K; N; V
  602.         in      al,64h, B9 c) {* e0 u, o% M1 k
  603.         jmp     $+2
    7 \( o1 M" b: a+ g1 z0 U2 f
  604.         jmp     $+27 N$ d' z( C$ a4 S: r
  605.         test    al,12 O' b1 Q/ ?& V, ]  m1 D7 W
  606.         jnz     kbd_wrt_ok4
    ( t4 }/ @) d+ }5 D5 E
  607. * y: v6 d0 W( F* g2 t7 \
  608.         loop    kbd_wrt_loop5
      P* I; r: X4 e6 t* r& e1 s
  609. 7 H6 L4 K) t) k' O& B
  610.         dec     ah5 Z, I* `% v8 g. R# I
  611.         jnz     kbd_wrt_loop4
    ( N* O% H6 \! s8 E  t- w' |

  612. 3 ~& g8 Q+ h3 `: h5 c& [
  613. kbd_wrt_ok4:
    ! R$ y* y$ f; b: i) X0 ?/ m
  614.         xor     ah,ah
    1 ?- {  m' s( f) l: |2 R- I
  615. kbd_wrt_exit:
    6 m4 R! f. m! m: J) R0 U8 o
  616.         pop     dx
    7 v  V7 m7 p1 v# v0 |& `
  617.         pop     cx: A9 A$ s; ?4 Y. s2 H8 h5 l: p
  618.         ret( y6 v" t2 S6 n& f
  619.         
    7 [* }- t* h8 |; f5 D
  620. keyboard_cmd:$ @0 q* ^4 F4 r0 X% r
  621.         xor     cx,cx! k" ?. c% m: Q" @
  622. cmd_wait:, ]7 W- i4 w, a
  623.         in      al,64h7 [/ _2 [' i! ?" s: J/ x4 Y
  624.         jmp     $+2
    % O5 u/ T, K+ ^; s) z/ t7 F1 [" s
  625.         jmp     $+2% o% ]5 {3 h" i, V) U
  626.         test    al,2' J5 `" e# b- M4 D% d1 A' a" b
  627.         jz      cmd_send* `6 {3 ]! o4 ~/ t( p, r2 t
  628.         loop    cmd_wait
    ( f! s9 k- C) b6 Q

  629. 0 e0 S% D5 v0 F$ G8 k7 K  p
  630.         jmp     cmd_error
    ! F9 J! q5 g& q/ U& V$ x
  631. - g/ ^3 c3 [7 p, s1 m/ Y. J% K9 w' m: u1 Z9 G
  632. cmd_send:7 r' p' u' t& V" K' d5 O' d
  633.         mov     al,bl/ K- q$ j' c9 `' s" _" v7 x) ?; ~
  634.         out     64h,al
    4 ^, Q, M* m0 [* ~! p1 d" t
  635.         jmp     $+23 ?8 ?  d6 f, D  z3 l' Z. K5 t  h
  636.         jmp     $+23 t  g7 S/ v+ {

  637. / g- N: W; g9 U& F; F/ C4 R, b. i8 N
  638.         xor     cx,cx
    9 O8 @/ q' m/ j  F" b) x
  639. cmd_accept:
    5 t4 f+ F" R( m, x% J/ L3 z) H. L
  640.         in      al,64h, n* L) t# X4 V2 ?* n
  641.         jmp     $+2
    / V& Q3 T1 \0 c) l; L0 H
  642.         jmp     $+2
    ; S& }* l4 Z5 @8 L
  643.         test    al,2
    + g. |" O- ?" I. v
  644.         jz      cmd_ok+ c- x6 f& G/ u& n, z( y
  645.         loop    cmd_accept
    4 T- J0 ?0 j- ^0 K6 h7 M

  646. # T; `- M" U& Z# T5 E* J$ ^7 f7 H9 ?& P
  647. cmd_error:. b: l1 x  L$ v8 [, C% X
  648.         mov     ah,1
    8 o+ v( C0 i2 f4 y* j4 Z
  649.         jmp     cmd_exit9 H- l$ B1 ^( c) m( N2 S6 u
  650. cmd_ok:7 j( d; X0 ^7 X3 R9 y. j
  651.         xor     ah,ah, e5 C( ]/ s7 @2 H0 K
  652. cmd_exit:
    8 E9 @& I2 ~$ m* k9 `4 D
  653.         ret
    ( y% e( Z$ @/ g& Q6 I
  654. / w" N' T. ]6 P9 \  Q! {6 ~
  655. new_33:
    % E6 Y+ e' ^' {* \- A& E: ]' N
  656.         cli& O! R% ~& p& ~+ p
  657.         cmp     al,0  a4 U! Y% j1 A# P% W* P+ h
  658.         je      reset_mouse
    ! s0 u7 `. s0 u* a* k( l. J( o
  659.         cmp     al,1
    4 t- O8 ?) d- _5 [7 y# r
  660.         je      show_mouse
    ' E; u: |' f' Y! x& l' C
  661.         cmp     al,2
      H: j' E# \/ b
  662.         je      hide_mouse; H, t8 [0 F* M
  663.         cmp     al,3" m% z. v) e1 @, Q: _% E# B
  664.         je      get_pos8 ~4 Y5 n! Q0 _' X% Z
  665.         cmp     al,4  _5 U9 \* d2 J( G0 t6 E
  666.         je      set_pos! H' l- r; c* L9 N" c4 I: n
  667.         cmp     al,7  R# J4 Y0 W4 _- {
  668.         je      set_hor_pos8 b1 S9 b2 r' W, O- m
  669.         cmp     al,8
    & }. O3 y+ H  p5 S  C6 i
  670.         je      set_ver_pos
    " u* r: O* t6 J2 _: j' u# `2 l
  671.         cmp     al,0bh
    6 w  a/ ?) ~4 P3 }0 U
  672.         je      get_mouse_movement
    - l6 V  ~! n. O$ y0 Y5 P' k0 W0 I
  673.         cmp     al,0ch
    * _: T4 d! J" M8 E' U6 W
  674.         je      set_subroutines
    1 r  F, ?6 n8 ^8 L7 ]6 x
  675.         cmp     al,14h: F  e  n# ?' e8 ^- }, r6 t
  676.         je      swap_subroutines! G3 G* o7 T- w' @7 \( X; P) D
  677.         iret8 h/ I% a( g1 \' e" O

  678. . |# v5 T! N' R: q) N
  679. reset_mouse:7 C/ P$ G5 U. T/ J, Q
  680.         jmp     _reset_mouse
    ) \( E& |) ^9 h8 n6 N9 P
  681. show_mouse:; R0 x2 j7 W; l: D8 W2 C: R
  682.         jmp     _show_mouse  j5 k7 H$ R7 o5 w- Z
  683. hide_mouse:: w+ q* O/ @9 ]. Y: M
  684.         jmp     _hide_mouse& s* D; z" e$ e. ~8 U- g% H$ `0 [
  685. get_pos:. _- Y+ B5 C/ O8 ?  a3 R/ F+ T
  686.         jmp     _get_pos; \- j, W  I8 F, s. |9 d7 d% }
  687. set_pos:
    : N: M& w1 I9 ?) @
  688.         jmp     _set_pos! a+ ~( `: n: t
  689. set_hor_pos:
    * ~; ^: R$ b, Z( u
  690.         jmp     _set_hor_pos
    ' R/ Y% `9 m' r6 K3 J# t7 k5 t
  691. set_ver_pos:* q2 W6 ~% h  [) v% ^
  692.         jmp     _set_ver_pos
    + U- E3 T- T* ~5 q0 T" L6 j
  693. get_mouse_movement:( @. w3 ]1 V- r  T& h- g/ g
  694.         jmp     _get_mouse_movement" ~# K- Z/ {) e7 n+ Q
  695. set_subroutines:
    4 g5 r% g$ T# z1 j/ s! Z
  696.         jmp     _set_subroutines8 Y# `1 s2 D2 W; y) G0 a
  697. swap_subroutines:# j% `& x( _! h
  698.         jmp     _swap_subroutines2 v: D% w2 D: m9 O( @, F' Y  b" q

  699. ) b! b1 o! A3 [2 T
  700. _reset_mouse:
    * V& z2 `% c: ]+ T! e) b
  701.         mov     byte ptr cs:[buttons],0
    " \7 ]7 v5 @9 L% L3 }1 @+ f
  702.         mov     word ptr cs:[pos_x],0
    " H! f7 r# F5 b7 O1 \* N+ Y
  703.         mov     word ptr cs:[pos_y],04 k2 F2 T6 Z/ v4 Q
  704.         mov     word ptr cs:[x_move],05 I% F# E5 v, V4 B/ C/ s
  705.         mov     word ptr cs:[y_move],02 o# i2 h; Q" ~3 |$ l! ]# I
  706.         mov     word ptr cs:[x_max],6396 F$ V/ @$ ]; C+ N0 j
  707.         mov     word ptr cs:[x_min],0" R& l* J2 j2 T
  708.         mov     word ptr cs:[y_max],199
    ) ^& I5 u8 w, P' C6 l
  709.         mov     word ptr cs:[y_min],0
    3 z" S9 E2 g: _
  710.         mov     word ptr cs:[user_mask],0
    ! q6 G* ^. L. W# E2 M6 g( G
  711.         mov     word ptr cs:[user_subroutine],0
    - Q7 q2 v3 _+ r- W
  712.         mov     word ptr cs:[user_subroutine+2],0! l6 H5 |# m# x" m. {6 V! n: f) d
  713.         mov     ax,0ffffh/ s' f0 X! }7 B7 z* B
  714.         mov     bx,3! S5 z/ e: v/ D* n% h
  715.         iret/ H8 v% E  I3 ?" b! @# f% q

  716. ! y  f3 L" O3 h
  717. _get_pos:
      f* v3 z/ u) K8 S% D5 F
  718.         mov     cx,cs:[pos_x]
    9 \/ y& D* L' J
  719.         mov     dx,cs:[pos_y]
    ( ], v, L+ @1 |2 q- |1 s
  720.         mov     bx,word ptr cs:[buttons]# D7 ?  p$ t8 T6 P! b( k
  721.         xor     bh,bh  S/ P2 m- d7 {6 E$ x
  722.         iret1 N+ B) R, o! R- i

  723. ! [7 M3 J3 ?$ G' o0 r8 ?0 m$ v
  724. _get_mouse_movement:+ z) @2 H0 M4 i/ Q; P6 u; Q
  725.         mov     cx,cs:[x_move]
    " ?  l+ h9 P8 u, s
  726.         mov     dx,cs:[y_move]$ |* h, F$ |4 N# d& Y
  727.         mov     word ptr cs:[x_move],0
    5 S& B- _$ d- T2 |0 A0 N
  728.         mov     word ptr cs:[y_move],03 t0 _! G2 A' T, Z
  729.         iret( Q/ m* G7 F6 z) l& Y. g" J
  730. ) {: ]3 u4 G" |  h
  731. _show_mouse:* x- ]+ c* l. q1 E8 V$ d
  732.         push    ax
    ( z4 V: t! W# ]
  733.         push    bx
    % C5 l& X& w7 `" d0 g' C" z
  734.         push    di
    $ ^( J  U+ t  p
  735.         push    es
    0 U; {5 D+ B6 w$ C6 e% g5 x* h) T( B/ j
  736.         mov     byte ptr cs:[sm_flag],14 i9 I7 d, ^0 O; Y. \4 j* Z! F
  737.         mov     ax,cs:[pos_y]
    : V2 N6 f, n$ X) f  V: }. F  B
  738.         shr     ax,3
    8 ^/ m+ }9 n9 }/ l3 l# U" l
  739.         mov     bl,80
    6 }; ?6 ^) W9 z4 P3 ]; f3 p2 G" J5 F
  740.         mul     bl4 P3 p# e" I* Q" s, m* \4 N+ u$ Z
  741.         mov     bx,[pos_x]
    + b/ c% O& W' a+ y6 ]
  742.         shr     bx,31 Q. g& H9 ^6 \, H$ C4 q
  743.         add     ax,bx
    1 E9 w/ K. y8 a
  744.         shl     ax,1. ~! H  J: x, s* j  z
  745.         mov     di,ax' a0 D. @3 b2 U) |8 [' q3 F
  746.         mov     ax,0b800h
    5 e0 k1 u5 q' u: r  O1 R
  747.         mov     es,ax
    - {" W0 ]% v. |8 V; D
  748.         mov     ax,es:[di]
    3 Z6 b# {! E1 P; h' o
  749.         mov     cs:[save_char],ax2 C2 I: N; z. h: O
  750.         not     ah+ x: p" Q7 l, U5 D
  751.         and     ah,7fh
    4 d1 M' l& }% f0 p9 A1 x7 I0 p8 ~
  752.         mov     es:[di],ax" w# p8 [9 l: c: J. I
  753.         pop     es
    : H, g+ v9 I) V# g) U: g1 F% k
  754.         pop     di
    0 V+ Q2 G$ @, ~" L$ z
  755.         pop     bx1 e: C! s2 @  S  B1 i+ ]8 P7 a
  756.         pop     ax
    % P, w6 N% V# d8 o( W
  757.         iret; E. c  f' C. u4 U7 T! _- Q
  758. % p) X" e$ I0 U' d* y
  759. _hide_mouse:
    . u: f) e) X3 X7 U+ |4 G
  760.         push    ax
    ; @: G) p3 s) T1 Y
  761.         push    bx0 S# `  j" z! M8 P/ g
  762.         push    di
    1 }( U- A  `) l9 P
  763.         push    es
    $ ]. l9 N! L5 w" }
  764.         mov     byte ptr cs:[sm_flag],08 i, S6 @3 C( q2 }' A, Y  i( E
  765.         mov     ax,cs:[pos_y]0 \: i( K/ I! V+ V0 v& n
  766.         shr     ax,33 v0 |2 l) \4 V3 \/ c# P, y
  767.         mov     bl,80
    ( m- E7 i' l+ m3 N
  768.         mul     bl
    " X% @( h# A/ e/ v) c* z
  769.         mov     bx,[pos_x]
      j8 Y$ r( K9 G& _9 ?1 Z4 J
  770.         shr     bx,30 }* W' Z* ?, [
  771.         add     ax,bx( M, B7 ~! k4 B5 o* X
  772.         shl     ax,1
    : K* [2 H+ @8 m  S) r
  773.         mov     di,ax) y- A3 \+ O* y# S* B+ U
  774.         mov     ax,0b800h8 L7 B) D* N3 |1 V8 R6 n3 {
  775.         mov     es,ax
    5 c: X( r% H- [( k" `& F
  776.         mov     ax,cs:[save_char]. l3 H4 A( S- c+ h5 q
  777.         mov     es:[di],ax; _* F* V7 Y! G1 ?% w. \
  778.         pop     es
    ' W0 n6 D; y, b
  779.         pop     di
    3 a7 r+ Y5 L+ \
  780.         pop     bx! v+ h# _/ Z# b
  781.         pop     ax$ ^+ T- V5 m: x( x; Y
  782.         iret
      A9 R/ U, c  I- P  F! c
  783. 9 ?6 f/ V) E& s
  784. _set_pos:( ]3 o2 o3 o3 B/ _6 A  x4 q
  785.         mov     cx,cs:[pos_x]% F6 j+ B' a, D" S3 i% R
  786.         mov     dx,cs:[pos_y]
    , q9 D7 @* D( T( ?. v9 L' W9 [$ N; w
  787.         mov     word ptr cs:[x_move],0: a0 V5 G9 t4 U1 G* k$ K
  788.         mov     word ptr cs:[y_move],0! b9 E9 V/ I7 X( w3 N
  789.         iret0 b, `' K/ o, l( y
  790. 8 \0 s0 q* P9 R
  791. _set_hor_pos:- S/ R2 ^1 B9 t. K8 F8 T
  792.         call    max_min
    & {6 Y" n7 j5 a2 }2 w
  793.         mov     cs:[x_min],cx
    & m+ \; @: l+ k. X" b7 @
  794.         mov     cs:[x_max],dx8 h0 t% k2 p; Y2 W. s/ \: [
  795.         cmp     cs:[pos_x],cx' D$ x3 p/ [  y' ^9 U
  796.         jge     good_hor_min
    & j/ K2 h' o8 c. |; i
  797.         mov     cs:[pos_x],cx
    ) f) T- Z& n- X, Z
  798. good_hor_min:
    - F8 H$ |, E8 v& V' Q9 \5 ~
  799.         cmp     cs:[pos_x],dx, H3 ~/ O2 t) H* G$ f: i+ q
  800.         jle     good_hor_max
    * Z$ S; Z2 U, \
  801.         mov     cs:[pos_x],dx
    5 n% D1 D7 c5 J! j9 o
  802. good_hor_max:
    , X: F% H% k2 U  j/ @
  803.        iret* C' v  A  T5 L8 y$ r

  804. ' E& S! a2 E' z" y( I7 B
  805. _set_ver_pos:
    " |% ]* s$ K/ V' Z0 K
  806.         call    max_min
    / I- q3 m7 f) E9 e4 z# c- E9 m
  807.         mov     cs:[y_min],cx
    5 R' |7 }( j. N
  808.         mov     cs:[y_max],dx
    , `. x5 q8 L# b' t* Y
  809.         cmp     cs:[pos_y],cx
    # m) {6 F: B$ W3 g! e5 U0 ~
  810.         jge     good_ver_min+ W" ]. p4 |) _! s4 h2 ~2 C
  811.         mov     cs:[pos_y],cx
    6 q2 G; R) I! y$ ^
  812. good_ver_min:: J! o) i: s$ L8 w1 ^% x. K
  813.         cmp     cs:[pos_y],dx
    7 G" ^7 M+ A: U5 F4 G' Y4 f! |
  814.         jle     good_ver_max
    , a. c4 y9 `. [) g
  815.         mov     cs:[pos_y],dx7 l% J4 _' n# f! Q( l( `* M
  816. good_ver_max:: {+ b' U( d# o  ?+ f2 i! [
  817.         iret: O# ~1 a9 `, P8 n% j

  818. - ]6 d1 z5 X# Z
  819. max_min:
    - p  ?& ^4 g9 U( ^; _2 E
  820.         cmp     cx,dx
    % p! b' t  a1 a3 S/ }8 T' \5 u
  821.         jle     no_swap
    ( f$ c' a$ J& C: f
  822.         xchg    cx,dx
    ) `8 a1 A, ^" I3 N- r2 s
  823. no_swap:- Z. a$ Z; J" ?+ i
  824.         ret
    ! s$ a) g/ t# v

  825. 0 M9 b: ]5 X* c3 o6 D4 H- G6 w" y
  826. _set_subroutines:  `1 v& h7 |  D% B1 ~
  827.         mov     cs:[user_subroutine],dx/ X% h0 b6 ^/ M: f; u# P& s
  828.         mov     cs:[user_subroutine+2],es1 a' w; D6 b* `: h4 S, T
  829.         mov     cs:[user_mask],cx; g" l% i# P; s, W4 u1 w. H, @& y  _
  830.         iret+ H9 A" S& m* C$ v* O5 W

  831. . e( s; m/ Q2 N& x# A' p
  832. _swap_subroutines:4 e, }1 t2 I6 X( n" {* }3 b# p* F
  833.         push    word ptr cs:[user_mask]
    ' G1 e& R, _; p: v- i0 P' I, _/ K/ V4 i
  834.         push    word ptr cs:[user_subroutine+2]0 g. J1 ]2 c# b
  835.         push    word ptr cs:[user_subroutine]
    8 [7 R; T% j, y
  836.         mov     cs:[user_subroutine],dx  G% m6 x8 j. o+ Z7 _$ P$ f8 x0 Z- g
  837.         mov     cs:[user_subroutine+2],es
    3 n( Z7 [1 U+ y! T. `: l
  838.         mov     cs:[user_mask],cx
    ! m5 y% C8 h- ~& J
  839.         pop     dx
    * S3 ]* C- B7 }
  840.         pop     es& r- T" j1 B, I) D
  841.         pop     cx3 F6 o( W- z+ t. W4 A
  842.         iret
    ! @- r! ?$ t% _6 {
  843. + V8 u9 u2 `) k0 U' |
  844. memmouse        endp) b0 q1 D) R# d5 [" N2 N  u
  845. 9 q6 A( C! T1 _2 u& Z
  846. endof_start:
    ! @5 o- Z$ C; `  C, ~

  847. - y5 `% z# W. T! O- e" X3 ~
  848. emsg db 'No mouse driver install error!$'
    . o8 [$ m# p2 y& J+ R* o
  849. old331 dw 0# U1 u+ Y4 j; _; y% A) W& ~: ]
  850. old332 dw 0- E; _6 S  ~* L5 j, x3 a
  851. old741 dw 0  l8 T5 |: H6 q3 ?  s. O- ]
  852. old742 dw 03 p0 `" k1 ~, w) a7 k/ h$ G* |
  853. memcopy db 0- J0 k/ s0 b, ~' E' A) B
  854. okcheck db 0& D2 d5 i! `  v$ s
  855. pass db 09 p7 ]- A/ W1 K, O( r' j
  856. chkl db 06 R# @7 A& x8 A" l: G
  857. lk db 0: y1 I. a  E3 o; ~/ M6 v# V
  858. chkr db 0: s# v1 ~) |5 L, g
  859. rk db 0
    0 I: l# G# l: Z; ~6 a8 _; ]
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    + j9 g2 [: N) b# h8 B/ h( i
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '
    8 S* o  M* {4 l5 Q
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '( a+ v) ~* F# }4 l1 Q9 G
  863. db '                                                                                '9 F" h1 E3 w( J! E, m
  864. db '                                赏屯屯簧屯屯突                                  '% ]7 H" k* |+ V$ W) Y& {, i- E
  865.         db      '                                ?OFF汉OFF?                                 '
    / N0 T# J  t0 P
  866. db      '                                韧屯屯既屯屯图                                  '' T  A7 z& k- `+ R) u; U+ O
  867. db '                                                                                '
    2 b. X- }/ s2 _' B+ t
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    , c! i9 V9 j2 h% \& S
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    ' 6 \) s. S4 P6 v5 U* [! X
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '! V! R0 m9 D& J8 O0 T
  871. % p( g7 A8 j* ^! e
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!& h, V7 [1 d; ~! ?/ T
哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长... - C$ O. d( \5 c! }

0 U4 f" {8 N4 b# V, {4 i谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:39 , Processed in 0.043662 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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