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

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

[复制链接]
发表于 2008-12-24 11:18:22 | 显示全部楼层 |阅读模式
这是我学习assembly language第一周所写的一份PS/2 for 鼠标测试程序(DOS)。其中Mouse驱动部分我参照网上的一些代码,但已无从知道出处。呵呵,你还能找到这样好的PS/2的代码吗?如能帮助到您,希望您也能共享一些东西让大家分享。。- w& n# F0 |9 H  y' u
( c/ X3 D. I! I$ U& L$ g
代码很乱,我不重新排版了。 Download回去,你们自己排!这样也好多看看代码
  1. ;
    $ Q0 v+ C8 u) [
  2. ;          Ufoit PS2 Mouse test program   Ver 0.98 X: X# ]" W* a9 ~" m- A" d
  3. ;                                         By Bini.Yi 易祝兵
    # j" u; G6 m  O' \9 W
  4. ;                                         http://www.ufoit.com 计匠网
    . i: O6 q* u; ]8 e  M) k  S" N
  5. ;                                         2002/04/06 YYYY/MM/DD9 V: I3 j6 j6 n% _9 q* w% Y. U1 o
  6. ;
    ( K" x& ^3 F; j- a! v- _6 S
  7. ;         
    5 P) o3 i. A: A
  8. ;          This program  test the mouse button  click and move.
    4 B0 d' P  g; N2 Q" W0 F% @8 o" I) f2 I
  9. ;0 ^3 Y% J3 g. `* ]. _* x/ g7 M2 N! m
  10. * q6 [' h) H; x" |# q5 h
  11. .model tiny7 D5 c$ I- Y# N/ I! I
  12. .586
    6 y# g) [" a$ A- k. T
  13. .code! k2 z8 ~9 a) ~( d% A0 r) G
  14. .stack  100h
    1 n/ N# D* M7 F% p4 B; U4 S4 R
  15. .startup
    ; {( F! f) t/ o* n1 t) I
  16. pusha7 R4 }' n/ G1 X; \! |
  17. mov ax, 3533h
    # x+ K& e2 i  \; ^- b$ `/ Z6 C/ C; o
  18. int 21h
    * d0 p$ `+ ^/ s' e0 E. w4 c) [
  19. mov word ptr cs:[old331],es. s% D+ h% h' I, I5 V
  20. mov word ptr cs:[old332],bx# s0 w* p' z0 ^9 X
  21. mov ax, 3574h
    6 l$ X6 k2 N( [2 W, o( Y$ l
  22. int 21h
    9 L0 r0 a1 P4 x8 Y
  23. mov word ptr cs:[old741],es7 Q% @% t5 D3 e' X" q
  24. mov word ptr cs:[old742],bx
    * O8 ]! x- C5 K# d5 c/ c! `
  25. popa$ G5 o* D/ \. T' l' y
  26.         call    memmouse2 q2 A% N: G. w1 \; o9 w
  27.         mov ah, 00
    + o& V$ H) N: L0 t' a/ |) L
  28. mov al, 03) P; n% o8 R, `3 l- y. c
  29. int 10h4 j  y. z: f% N+ K7 r
  30. mov ah, 06' N/ `9 X8 z1 p( l* |  ?- V" n
  31. mov al, 0
    + N2 S3 P' F- m  E# W' ~
  32. mov cx, 0" y' {' ~3 ~( Y; v
  33. mov dh, 246 J+ n7 f3 z# Q' O
  34. mov dl, 79/ }0 E' X9 g2 }* }
  35. mov bh, 07h& Q) P. E4 ?  C2 |0 i
  36. int 10h5 W, F3 P9 b; U0 `! P- f
  37. mov ax, 0000
    ( |$ [% U. [  _2 Y2 h
  38. mov bx, 0002! v% O* H  H% G: F3 @
  39. int 33h0 O- s. b$ P* c1 {
  40.         cmp     ax, 0000           ;if no mouse drive install
    * S5 H+ b$ \$ R7 v3 x$ t5 j
  41.         je      errormsg           ;show error MSG
    , [. M, Q9 L9 s8 @: W
  42. mov ah, 02
      G4 I) x  f. I/ C1 t; m9 x
  43. mov bh, 00
    3 k: I" c3 i, s2 Z3 y
  44.         mov     dh, 25             ;Move point out screen
    3 J0 O3 d5 ?1 x4 A! F. w
  45. mov dl, 79
    3 T3 V% v$ Z. g( d
  46. int 10h( T; D; k9 f3 ~2 \- }
  47.         call    showmsg            ;Show info
    5 l* N9 F* m' ], X0 p( F- G
  48. mov ax, 0001
    % ]8 D1 g) i8 j, j  h: x
  49. int 33h
    % F7 f- l/ e2 z
  50. ; mov ax, 000ah
    + C, A) l% C. P: R
  51. ; mov bx, 0000
    & k3 M6 h; z( c
  52. ; mov cl, 0h
    " ?- m, F* v! Y* {; D& x
  53. ; mov ch, 0F0h
    : M! M* f" q- U6 k1 z& v% C0 ~  J
  54. ; mov dl, 0h
    ( Z5 r. _" \5 u0 Z' I5 q
  55. ; mov dh, 0F0h
    % z" j8 J4 Y' @
  56. ; int 33h
    - {/ @. Y2 Y, J. V8 e" a* e
  57. mov ax, 0004h  e% o' h" s+ D  O. z* }
  58. mov cx, 0319; w; t! ^1 ^& l
  59. mov dx, 0103
    , V( x' d3 g' y5 T
  60. int 33h
    " B) {, i/ C( F- m6 u
  61. casemo:                           ;Case button click and point move ( b6 M; C( @2 \8 u
  62.         mov     ax, 000bh         ;and keyboard press
    ; b; {# ]- w( ~6 E1 D  }& P4 P
  63. int 33h
    7 m+ T; \, \. b& M! b/ j" F+ r& ]1 z
  64.         cmp     cx, 00h           ;if point move....X
    ) u1 D" ], r  P: Q
  65. jne xmov
    6 W4 s4 B$ w* p/ y
  66.         cmp     dx, 00h           ;if point move....Y
    % w7 m: l. |5 l' C  X  q
  67. jne ymov0 o! i+ k* z- f
  68. xymovend:                         ;X.Y move end/ h! S7 W- c% E; @6 w
  69.         mov     ax, 0003         
    4 Y& @8 B2 y+ K9 L. H
  70. int 33h
    1 w# l8 Y( D9 v9 p9 h3 ~7 ?: m0 H7 R! w
  71.         cmp     bx, 0001          ;if left button click  show ON
    ' d5 ?. u1 l: N, V* C
  72. mov si, 1828" A' o! }, d6 m. r
  73. je listl
    ( |8 B% N( }, P6 x
  74. mov si, 1828
    & h8 ^% [+ \) U9 v6 i  U, s
  75.         jne     nlistl            ;if left no click show OFF0 ~/ J1 u# b5 }) Y2 C
  76. testr:
    ! j. M. W6 y- t$ n7 [
  77.         cmp     bx, 0002          ;if right button click show ON
    . m  G5 K# E( z0 A: s4 a, J
  78. mov si,1842
    ( _7 K1 m* A# x
  79. je listr. B3 p1 v. D4 @/ _' v
  80.         mov     si,1842           ;if right no click show OFF
    7 S3 ~  Q$ Q4 g- v6 R, Z) W
  81. jne nlistl' ?$ Z. E3 e3 C' N
  82. casekey:
    4 Z: I0 r. K8 o$ O3 g: L' ?
  83.         mov     ah, 01            ;if any key press jump check$ F- D* ~1 W6 B: b
  84. int 16h  E' w. l& M; m
  85. jne kpress* U, n8 s% ~( G
  86.         mov     al, [chkl]        ;check x flag
    % R2 [% a" x4 k. |: }  }5 m3 x- y
  87. cmp al, 02h4 V* Z) e1 T- b/ r! ]2 v
  88. jnb chkok
    . o) n' \8 _/ {, U0 k$ E
  89. jmp casemo
    3 M" |* d- i( E! |; D$ v; N) R) |
  90. xmov:                             ;if X moved, get the X flag+14 w# i7 h: f& c" F- \
  91. mov al, [chkl]
    % ~0 A2 T: V( Y5 h2 ?" L: r
  92. inc al
    4 L; I$ Y+ {9 l. R. t" w( J
  93. mov [chkl], al& ?" F9 \5 J# n1 Y  J
  94. call passok
    % l5 L) t8 d' B! J% n) e1 f8 {
  95. jmp xymovend
    + ^9 A3 n7 Y' Y) I' q% h5 f0 b
  96. ymov:                             ;if Y moved, get the X flag+1
    + f, H8 R3 `8 H+ I- v5 t/ J
  97. mov al, [chkr]4 e, V6 }% U+ ?4 t  S
  98. inc al
    : J$ X+ `# a3 F6 l! T# Y! K/ Z
  99. mov [chkr], al
    " h5 i. ~3 q4 y) p( x6 J) L
  100. call passok
    0 {. O/ f& A# `* d5 D1 r  _0 f
  101. jmp xymovend. M" `; s9 H2 k) H7 R
  102. ) Y1 |. |4 Q+ l# d' A. K; ?
  103. passok proc near/ V+ ^: x1 p& a5 w$ q+ m
  104. mov al, [okcheck]' s3 O) p9 ~; Q9 m6 k) W7 H
  105. cmp al, 13 Y$ ?1 w& \! l" Y
  106. je let0# U" b2 H6 H' d! _. a5 G+ I
  107. jmp passret
    0 N, ?# H/ r* r8 `: L  I! v) v
  108. let0: 4 b$ u4 J0 M+ t2 |4 w# Q
  109. mov [pass], 13 ?! d7 |, l! F/ m, b# i7 F6 a
  110. passret:
    3 o# s# s* O. J' |
  111. ret
    * g: W: k3 i8 X& J8 K, l) B7 ?
  112. passok endp 8 e1 R9 d* T( G& g& @9 v
  113. : r% v2 L0 y4 s# t
  114. chkok:                            ;if x flag and y flag>=2 and... then PASS" N7 r7 a; _' Z: N
  115. mov al, [chkr]* t7 v2 @2 L' T2 i4 l
  116. cmp al, 02h4 F5 @7 u5 P, S7 K- V* k" Z  Z
  117. jb casemo
    ) B- z% i8 w4 a  N
  118. mov al, [lk]- e: c, ^0 N0 H6 f8 o
  119. cmp al, 1
    1 r) B+ o# k! Y# K
  120. jne casemo+ ]. {8 E# w- ?2 K/ z
  121. mov al, [rk]/ Q( j: D4 l: [
  122. cmp al, 1+ {+ h% [- R6 F* q& B0 P
  123. jne  casemo- W( ^% G4 p: R' L9 g3 s) }
  124. mov [okcheck], 1
    & e$ f8 ~6 j) o! O5 U( ?5 F
  125. mov al, [pass]
    9 K8 s* W7 N( o% O" l. T
  126. cmp al, 1
    9 t' K3 U8 T+ j$ O0 k
  127. jne  casemo" }( b5 q. c; ~* ?2 l4 j- t- Z3 S
  128. mov ax,0002h
    8 m0 ?9 c8 U1 [, H
  129. int 33h2 v2 g) X( G( f7 U
  130. call cleascr
    0 s1 v9 H3 R) _7 R9 i3 y
  131. " Z% p' g# f; Y7 G
  132. call oldint0 K$ s% r* l, |+ h8 J
  133. mov ax, 04c00h- {1 i* ?* Q4 R4 _& Q% o
  134. int 21h
    " Y3 i; D  Z4 w5 Z! g

  135. ' @' a& l  @# [, x
  136. okexit:. S6 T. R: c) {+ I* e, f2 g$ p
  137. mov ah, 4ch
    * d2 i% p5 v1 |
  138. mov al, 05 {5 i. W  U$ ]+ W$ i1 g4 A
  139. int 21h7 ]) G  r& a0 X& F3 s7 D5 g. w
  140. listl:                                 ;Show ON
    7 k! W' G! [/ U+ ?* p, ~
  141. pusha2 ?0 O0 ?9 w) j- B2 `. K, j1 M8 q
  142. mov ax, 0b800h5 Q- l- u6 H% C$ t9 {4 J
  143. mov  es, ax- S) C. G& `" [9 o+ a
  144. mov ah, 47h
    ; a$ T* b5 D! J
  145. mov al, 20h, f: C/ j, \) a$ o
  146. mov es:[si], ax
    ( d/ L% J4 D' L% p7 U6 g
  147. add si, 02
    . \; B: |7 g$ m# `* `/ Z" Q
  148. mov  al, 4fh
      p: l" K1 B* L8 ]5 R( ?. w
  149. mov es:[si], ax5 z! ~9 ~# j; P
  150. mov al, 4eh
    7 ^3 S2 h! ?& Y% K) _% _, O3 h
  151. add si, 02- p5 T; }$ K$ `4 H9 ?+ O; }
  152. mov es:[si], ax
    / c3 S9 \. `9 U
  153. mov [lk], 19 J' j) L+ g8 P: u4 h2 k+ q
  154. popa0 Y$ ^" c, J8 M+ B0 g$ M
  155. jmp testr
    ( Q( p7 d: \# V
  156. listr:                                 ;Show ON* ^. w  I3 U! j; O
  157. pusha
    6 D7 |1 s/ G) l- \9 J
  158. mov ax, 0b800h
    1 b% F4 a. m- c* R+ B
  159. mov  es, ax% p; `% |) B0 g3 D% _4 O. D: e
  160. mov ah, 47h
    - i8 j# Z& e2 S/ m) G
  161. mov al, 20h( s- x: @1 H+ Q3 y
  162. mov es:[si], ax: L3 O3 T$ i* b& |3 m- ?
  163. add si, 02
    % [- }+ L( q  x  y
  164. mov  al, 4fh0 e: y8 n9 b2 R" y* t
  165. mov es:[si], ax
    3 A9 K* \" K6 G7 h1 `5 c
  166. mov al, 4eh
    2 i. a, e4 B, p
  167. add si, 029 ]1 d% E# U$ U' m0 Z- w
  168. mov es:[si], ax+ {5 M( e8 v8 @
  169. mov [rk], 1
    & V8 M9 ?/ g. }8 ^4 \( ~3 Y/ O
  170. popa
    1 i5 V. ]. t% ^, @9 s8 d0 p
  171. jmp  casekey
    ) d( {( b" \2 ^9 Z7 f! {8 I
  172. . R1 Q! }# z( d3 L
  173. nlistl:                              ;Show OFF+ `! l- M6 {. e  X* f
  174. pusha   5 Z- i0 r% _; G( z
  175. mov ax, 0b800h
    # o6 L, w2 O! y5 U9 y- r4 ~$ H
  176. mov  es, ax
    : m* e. K/ m' @/ Y. N1 _4 v
  177. mov ah, 17h7 \, z  R3 s! j+ S, }
  178. mov al, 4fh
    9 l3 Q; z! f1 {) P
  179. mov es:[si], ax/ b/ b: Y+ D3 G0 j* w) V7 u
  180. add si, 02
    : A' E  [- F- p& o' O
  181. mov  al, 46h
    $ I4 b. P7 K( P, z: g
  182. mov es:[si], ax
    9 p, r$ U1 Z& Q0 |2 G
  183. mov al, 46h
      L6 Y3 C  o: N" d( G2 s+ E: ?7 @
  184. add si, 02
    * J" ?+ I" {* ~: e: S8 K' S. l
  185. mov es:[si], ax8 t: d, N9 {) I) E5 N! T
  186. popa
    , c: ^8 p, n7 V4 ?
  187. cmp si, 1840  N3 x3 B" n+ c! i$ T9 t  Z
  188. jae casekey2 _& i+ J5 _; C" }# z
  189. jmp testr& g- C7 E5 j5 ]# U" w- w

  190. 2 a2 @" U  A0 s- P8 E/ }2 N
  191. kpress:                             ;Check key press if press<ESC> then EXIT
    , `: j, j9 b* T, Z
  192.         cmp     ah, 01h             ;and return a error
    % `/ G( G, u7 [  O7 g4 p$ e- h
  193. je exit1  v( r& w+ T- u
  194.         mov     ah, 0ch             ;if press other key then clear/ j( W* i. `  p  m$ l
  195.         mov     al, 00              ;keyboard buffer
      A0 ?) @2 w! q! U: q0 M
  196. int 21h$ @0 p6 E1 U( w$ F! x
  197. jmp casemo
    : g- n) u  s& x- M2 }, L2 Q

  198. ) Q! o* A; b# r% V' v
  199. errormsg:                           ;if mouse driver no install% `+ }3 O, o, I5 W9 ^
  200. call oldint
    2 u) t1 B7 J7 j3 ^: `" B* A2 ]
  201. lea dx, offset emsg- H- e8 s9 Q5 \) g' T
  202. mov ah, 09h
    # w6 N. [  n7 ^% K) f' p! ^4 ^
  203. int 21h  e: q/ S' Z# S9 ]9 a2 I8 Y8 o
  204. mov ah, 4ch
    6 }3 n. v5 L$ m% j
  205. mov al, 23 e! _$ Q, J. T" s: l
  206. int  21h7 Z# ~3 C% J  Y4 M; B' ~
  207. + [& X  Y: L5 E" |) i/ L$ C6 [
  208. exit1:                              ;error exit+ ?. A5 E/ I" x% q- m5 U% W
  209. mov ax, 0002h
      w/ z; o, Y) \8 f5 O
  210. int 33h7 `2 B! T# ]* @4 i! Z$ P  c
  211. call  cleascr( @7 M/ ]9 u) M2 M7 s5 ]
  212. call  oldint& u) w: o# u% l
  213. mov ah, 4ch# ^! T. ^" L( l2 ?
  214. mov al, 01
    $ T' C, C- O. Q, J. e8 ?
  215. int 21h
    - `: z4 q8 a: a: D0 ~; ~/ i

  216. 7 D8 I  j+ R& r. t7 R! v. f
  217. cleascr proc    near                ;clear screen8 \, f1 e2 G7 P) k# V
  218. pusha- t7 b/ K* p8 f  N
  219. mov ah, 06
    " B, T  Z  P# t2 m' Z' s0 ~
  220. mov al, 0
    ! P$ k3 e, j9 V
  221. mov cx, 0! [5 b# N% m9 `% j
  222. mov dh, 24
    0 L: H( i3 Y+ d) J1 p" r0 [
  223. mov dl, 79) N! d! P/ N2 D! [
  224. mov bh, 07h
      |2 x* K: f2 N; \4 u4 }
  225. int 10h/ N0 v5 g4 r' Z) r! t8 A
  226. mov ah, 02( P# n  }+ k2 q: @9 j
  227. mov bh, 00
    , W) A( y( T$ x/ t- N
  228. mov dh, 0+ }7 i9 m6 ]. \# m+ I/ w) {
  229. mov dl, 0
    8 A/ |! |9 A% w. t2 S+ Z% [
  230. int 10h3 v) ]7 W- K4 P9 ^
  231. popa
    + E( K1 ], `/ z4 }5 z
  232. ret
      b( u( v- ^$ f! j7 |: P! u# d
  233. cleascr endp& x1 C6 H5 b& @+ u6 p5 H2 D' ^$ {+ V8 `

  234. - `0 ^/ M0 k! E( Q$ _3 s. m
  235. showmsg proc    near               ;Show info- x% u6 e* w# M& g' ~" r) W/ i
  236. pusha
    % j; F* o; a- `! r/ o! t
  237. lea di, offset showms
    ) `  M* _( B9 _. A" k
  238. mov ax, 0b800h4 S6 U7 D$ R$ F) ?( @) y
  239. mov es, ax6 m' A$ e- o2 u; R
  240. mov si, 0
    , }4 }' M% _+ \
  241. mov cx, 480
    $ j* r' I$ E- P! C3 u" u) S
  242. mov ah, 07h
    # [1 _) ^$ }: \3 J
  243. @@:
    2 T5 K) b- j8 W7 H# x' W
  244. mov al, 20h
    . @/ V+ L( U. q$ B3 o  q" U. M+ ~
  245. mov es:[si], ax4 P) i: I% X" }' [8 B7 N* \
  246. add si, 2
    : k& N4 }% `1 i) T
  247. loop @b
    + N* I! H3 d: T4 C* O: d
  248. mov cx,880
    - d. R" q2 m9 I$ K5 V$ L7 g3 w
  249. @@:
    5 A) T- b5 }' V7 p6 S  Z! Q
  250. mov al, [di]
    ' X2 N0 P1 ]4 P5 l8 s
  251. inc di6 l% B' R2 B* S  d  [! i7 u
  252. cmp al,20h
    . \! [  D6 Y: h# y8 z3 O& X1 F) C
  253. je showch1
    ( [+ M% V! k1 W% t* f8 v7 M
  254. mov ah, 17h
    0 v, X: R+ ?3 m4 S% @+ o. G
  255. jmp showch3
      c2 D$ ]! x# ]& q1 l9 z
  256. showch1:
    3 v! r- [2 R- k; Z
  257. mov ah, 07h
    / F' q% Y6 i  a! A
  258. showch3:7 Q4 }- Q5 M. f
  259. mov es:[si], ax3 A* s8 @; u8 J3 g: {
  260. add si, 2/ U7 T) r/ V' e! Q9 G
  261. loop @b
    - s& F& t# j& f5 u1 F/ k
  262. popa
    8 r5 ~% e2 I4 l2 x6 W/ o
  263. ret
    " W- c5 W+ j, ^! R9 ~
  264. showmsg endp0 t. ]5 l) @- E2 f6 h; n4 e5 }! _
  265. ! F. j3 T+ G+ y5 ?; x# I: N$ A
  266. oldint proc( x* I3 V: B+ Y* f# ^8 \' @& r4 p
  267. pusha, L  ]" q2 Z; S' w2 q
  268. mov ds, word ptr cs:[old331]2 |' g2 v5 f- R$ ^0 a1 W" j% s/ }( q
  269. mov   dx, word ptr cs:[old332]& I% B* j: ^0 s( v9 y9 q
  270. mov ax, 2533h
    8 `  M) y9 x" ]5 z* I
  271. int 21h
    ! d1 n+ z1 ]5 f' {
  272. mov ds, word ptr cs:[old741]
    * D9 r  _+ n3 W! j
  273. mov dx, word ptr cs:[old742]
    & X9 k. t& a) b
  274. mov ax, 2574h
    1 \% A8 m* C0 }$ w8 @- i
  275. int 21h  T' p" B+ ]5 g9 ]7 ?; P
  276. popa
    6 o& W1 N, k8 _( s9 i4 o2 b2 y
  277. ret) Q" o# G: i0 ~/ s& [! `9 c
  278. oldint endp
    ! Q+ i$ \5 d' X  g# ~0 b, C1 d
  279. ' E5 P0 m! @" V2 G! H6 a
  280. memmouse        proc/ @; t# V- H: y
  281.         xor     ax,ax
    " @/ _5 R+ y- Z6 U
  282. int 33h" l8 f; H4 B) T5 I% A8 u
  283. cmp ax,0ffffh
    " |# p) V- K3 O% G- G* J
  284.         jne     not_loaded
    5 x" t. a8 e- X; W+ S1 }1 Y1 C
  285. mov [memcopy], 1, M+ _+ \% M; v" _
  286. ret: v  ^/ D+ l- C9 ~3 e* j- t6 S
  287. : ~. \% ~/ V7 ~4 P5 z3 q; [" E
  288. not_loaded:
    ( p2 N. |1 C# S1 E' b
  289. ! U* H2 M' f; T9 Q) z
  290.         mov ax,2574h3 h, w1 X, j* ~. E- p
  291.         mov dx,offset new_isr
    & c. p- U& N  U% t# l1 E3 o) C
  292.         int 21h* q% e7 k, }0 D2 ^5 r7 w0 M$ p  J! m* P
  293. % W$ G! c' \# N8 N! S- @
  294.         mov ax,2533h% x' \( V7 N' ~+ ?* I& ?
  295.         mov dx,offset new_336 n+ }5 s4 a1 p" _8 `8 k5 `5 B; K
  296.         int 21h
    & t7 |5 j6 ^! Z% i, G; F
  297. 7 Z2 K: h; T' A" S
  298.         cli, ^2 }% Y. C$ X. y7 D3 ]
  299. * Y9 |% G$ n7 ?8 z$ l$ b
  300.         mov bl,0a8h
    ( X% T; @# k% G  y8 W! w
  301.         call keyboard_cmd& s5 U  b" i0 q$ ^; D

  302. & q- u5 I4 R8 C- E9 }
  303.         mov bl,20h; {& ?7 c9 F) U# Z4 \# a
  304.         call    keyboard_cmd8 g6 v  U/ L; N7 [: O8 W
  305.         call    keyboard_read
      b. E% J7 B' |7 S( i
  306.         or      al,2
    . J$ b* m* C. t' q
  307.         mov     bl,60h
    ; t3 B; ]$ \, \6 q, A8 I- R" l
  308.         push    ax
    2 r* m! ~! L1 m
  309.         call    keyboard_cmd
      g% r) f9 c0 @1 x
  310.         pop     ax
    8 d8 a7 x$ p1 C/ t% q
  311.         call    keyboard_write  a9 Y$ j2 C* y2 a3 r

  312. 4 _7 ?9 H; n$ @% L  E  L
  313.         mov     bl,0d4h
    ! T3 i" ?2 _% F( V/ k
  314.         call    keyboard_cmd
    7 i/ m3 U& x6 u; G8 c
  315.         mov     al,0f4h
    0 g5 d* i0 @- Z# E7 s" [
  316.         call    keyboard_write9 n1 Z/ X+ @6 b, s* S- W

  317. 4 K1 Y+ l' g2 q5 `
  318.         sti
    : @5 L1 S2 R) t
  319.         ret" f6 {( f1 X: z$ X! |5 }9 P
  320. call_user_isr:
    ' I' c( K) T  A3 N$ u  f& ^2 i
  321. db      60h/ w& S% r+ }1 ]6 `; @
  322.         mov     cx,cs:[pos_x]& }/ Y2 M1 q5 c* l
  323.         mov     dx,cs:[pos_y]- M- ^4 c+ O  ]
  324.         mov     di,0 ;cs:[x_move]; c; U$ R( p9 f9 r; `
  325.         mov     si,0 ;cs:[y_move]
    / k6 I8 u  c, l* w. D
  326.         mov     word ptr cs:[x_move],0( j0 Z. Y( i+ k+ M# y: c
  327.         mov     word ptr cs:[y_move],0
    5 V' _) _5 @& v" A
  328.         mov     bl,byte ptr cs:[buttons]
    % |* _( o1 S4 S" x; F
  329.         xor     bh,bh' I: Z# V& D9 V9 [3 ?  C
  330.         call    dword ptr cs:[user_subroutine]
    0 O6 M3 m, j1 _3 \3 {+ U
  331.         db      61h
    9 F  W5 x. k! ^0 N, [' b5 L
  332. ret) F/ Z* w6 ~1 R5 ]# l  p$ u
  333. new_isr:
    + Q* `' D7 a1 w" ~5 U) w, y2 c( n
  334.         pushf) O4 G8 j1 q  l8 u0 G5 u+ W; J
  335.         cli6 k3 v: }# L0 k
  336.         push    ax- w1 B+ E( n7 l4 X! }) Y- v
  337.         push    bx
    + @+ @% ?/ J1 _" \6 n
  338.         push    cx
    " f  Q3 |; B6 m7 D% ~# {
  339.         push    dx4 j! |6 F1 t  I% T1 a: o  t. E3 }
  340.         push    di
    4 O- y; q1 j) H( z+ E' J/ C% U9 f
  341.         push    si- u/ ~. x+ O/ H5 d3 @6 p5 N2 o
  342.         push    es
    ) W0 K& m& m# a5 T% T" Y9 I; _; F
  343.         push    ds
    1 v  ]- }  z9 Q/ _+ K7 M
  344. * x4 v2 z% K! G0 U+ `( v
  345.         push    cs; T7 H5 {. @  O& ]% _8 r( J5 P! c
  346.         pop     ds5 r2 Q8 y1 d. t* h3 n( |1 Q" |

  347. . F$ `, y( X% x& k
  348.         mov     bl,0adh
    0 {3 k( O- O) f! ^
  349.         call    keyboard_cmd  s2 ~( Z. U* d4 E' t8 H

  350. 5 L. \1 C4 v' ?: O: ?
  351.         cmp     byte ptr [first_time],0
    + m) j9 ~7 j0 c
  352.         je      not_first_time
    ( \$ [/ B9 S, e3 @- v; Y5 R
  353. 8 a& E2 ^% M3 @8 s1 a
  354.         mov     byte ptr [first_time],0
    6 L& W! M# G0 I8 M7 l
  355.         call    keyboard_read
    , f. ]  B$ t! k! W1 \' E
  356.         call    keyboard_read+ W% T* z" T5 y+ ]
  357.         call    keyboard_read& ]+ s" l3 _. ~
  358.         jmp     no_show  N2 B0 c* R, Y2 R5 M& K
  359. " H* a; q- W0 W& g' J
  360. not_first_time:
    1 E- {" z) Y3 S3 }  c% ~8 H
  361.         mov     word ptr [temp_mask],0' a2 L! Q3 ^* r" P2 x0 D

  362. 5 m) U# y4 H0 {0 J
  363.         mov     cx,[pos_x]
    ( h5 o3 @; k# J8 D$ i( v
  364.         mov     dx,[pos_y]
    " B  e2 n- L/ ~# \! k9 Q/ D1 b! c
  365. 8 r4 B* w2 n/ Q& N) S# Y/ ]
  366.         call    keyboard_read2 r" l$ {: |$ r+ ]9 o% p8 [; {; V
  367.         and     al,7 ;3
    3 d* m1 o% C# s
  368.         mov     ah,[buttons]5 E- `4 U, s9 b+ D
  369.         mov     [buttons],al: S1 u/ |8 S2 f! U6 K: H% {
  370.         cmp     al,ah4 ]0 m* v; R' K5 q( u
  371.         je      no_button_change& w' G% H4 o+ a0 t
  372.         and     al,31 A/ v1 q0 \; w% |$ t2 M3 b$ y: x- _
  373.         and     ah,3
    / U9 B0 ^8 Q( w+ x
  374.         xor     al,ah( Q% `7 n! T3 H5 _% @
  375.         xor     bx,bx
    ! f# E* Y( J4 ?6 @+ |1 D/ ]
  376. . E1 ]! `% ^- G* {3 Y$ z
  377.         push    ax, k4 d/ z6 o. n/ s
  378.         test    al,2! q. z/ M% ~+ h: w
  379.         jz      no_right_button_change
    8 D2 R' a3 t7 I0 V  U; {
  380.         and     ah,2: Q$ A, A5 m- G  t8 B
  381.         jz      right_button_pressed* \9 R  W, d. Q. j3 e. B/ ^
  382.         or      bx,16
    3 M$ C7 P/ S/ n! \
  383.         jmp     no_right_button_change; ~4 ^  S: c) I- R! \* d! N* |( L( F
  384. right_button_pressed:- l& H, Q) W9 r, N1 S
  385.         or      bx,8! x2 U9 |  y. Q, B! l, d
  386. no_right_button_change:
    & ]& C8 h5 ^2 y1 Z! T' o: R' s
  387. $ k" U* @& t# C4 T! V- J
  388.         pop     ax
      I) T; m/ [" h) K
  389.   f) i- d- Y% h8 [4 S
  390.         test    al,1
    * q; i7 Y' v4 |+ D% _
  391.         jz      no_left_button_change6 R  X' Y4 F% O, P: k3 d
  392.         and     ah,12 X6 D, [# B+ K( N+ |
  393.         jz      left_button_pressed
    ( x& O' S7 x# `9 J# X
  394.         or      bx,4
    2 R" A" G, @/ [* t
  395.         jmp     no_left_button_change
    $ E2 v3 I( s) I+ v/ f6 A1 D5 a
  396. left_button_pressed:5 H8 x) S, V5 U9 {8 [% h
  397.         or      bx,23 b; p0 n" D- l5 P' r3 q
  398. no_left_button_change:& W% r% L1 C+ _/ b

  399. & W) a+ G% D  k: Z# L
  400.         mov     [temp_mask],bx5 p2 o! V5 R. X5 {. H

  401. & X, p3 P) f# ?9 @" p3 g+ \; ]
  402. no_button_change:1 k1 @6 d2 r- ~- E
  403.         call    keyboard_read, @2 f/ X' N* v
  404.         cbw$ o2 S+ U2 s5 o
  405.         add     [pos_x],ax
    ( J6 \3 ~' F' D+ F9 k$ z4 q
  406.         add     [x_move],ax1 V# b& s' o( {7 t
  407.         mov     ax,[x_min]
    4 j* H7 B5 C# R
  408.         cmp     [pos_x],ax
    ( d. O( B7 U) P' O2 ~
  409.         jg      good_hor1
    8 u' `8 J  u6 H1 d! B! b
  410.         mov     [pos_x],ax: n1 C. L5 k9 Q9 V; R3 b- o
  411. good_hor1:3 c$ k& I  X. l  {. d  f
  412.         mov     ax,[x_max]
    ( I% ], H+ ?6 ?4 q. q
  413.         cmp     [pos_x],ax  T! c1 T9 B0 o; J! a1 p2 O. ]
  414.         jle     good_hor2* {/ w) J$ o9 ?; ^  ~. t
  415.         mov     [pos_x],ax$ U" D/ c5 R1 F( k. V( \
  416. good_hor2:
    : X4 T, ~4 T* v7 W: p+ a9 t. s

  417. ( G. l" c+ r  k( @9 u4 P
  418.         call    keyboard_read0 Y( X. L) O& T  M- e  f
  419.         neg     al
      I! t% b5 I' ~# F- C8 @' X1 _% Q9 a% K
  420.         cbw; b  Q# a( g' r( t+ ^5 [
  421.         add     [pos_y],ax( T( G5 g, v- H; c! ~% u0 R
  422.         add     [y_move],ax  I$ H  Z3 s0 T0 E; g
  423.         mov     ax,[y_min]
    9 \' D. ]" y+ w5 ^; M5 g6 F+ j( Z
  424.         cmp     [pos_y],ax$ Q1 }9 ^% `* B" g: W) j+ e
  425.         jg      good_ver1
    9 d% [8 B% R! [  o2 [
  426.         mov     [pos_y],ax, l# `, a+ T2 A
  427. good_ver1:* h) e9 d5 l( |3 `; t
  428.         mov     ax,[y_max]
    7 `& }6 [5 N3 W" G  f' u* I9 `
  429.         cmp     [pos_y],ax0 y# ]5 s& l. P' T3 a* \: {
  430.         jle     good_ver2
    ) r/ |% `0 _8 B8 q% w
  431.         mov     [pos_y],ax7 M* f1 v  \* v! g0 Q4 x9 }
  432. good_ver2:+ u) v9 ]" H' h7 [6 P' w

  433. 1 J' {) `6 s9 Z3 L0 w) n$ z
  434.         mov     ax,[x_move]5 h8 i7 {: ^7 {5 [: d* x% V
  435.         or      ax,[y_move]
    / W$ Z* C6 p& j. e4 B( b- o- [" X1 b
  436.         or      ax,ax9 i5 L7 m& v) I
  437.         jz      no_change_position' x& V& [+ k- A: X1 N/ E& S- X& |) W
  438.         or      word ptr [temp_mask],1
    / h+ ]1 f0 R& S: D# z- s4 j
  439. no_change_position:
    1 F: v" Y+ \' q+ s

  440. . k& n3 C3 H4 T# S
  441.         mov     ax,[temp_mask]  w, Z; o' b8 C
  442.         and     ax,[user_mask]
    3 f/ o3 ]* @  ^- D% ?
  443.         jz      no_call_user* I# q2 a% @" i/ I) y0 Q' l
  444.         call    call_user_isr
    : r3 U6 ^* q+ R/ a2 O+ m4 A0 X' N
  445. no_call_user:3 v) V! A  h5 ^% e4 o. s5 H: E
  446. 7 d( o# A+ h- r- J; s
  447.         cmp     byte ptr [sm_flag],1
    0 A: P: r9 J. j; n4 |6 v% ?
  448.         jne     no_show
    % u5 m% l/ O5 H; Z! |: l. c9 d
  449. 5 s, m3 R1 u+ j. ?3 Z" l7 c
  450.         shr     cx,3
    9 g+ b: |' R7 J! g* B) i6 a
  451.         shr     dx,3; h2 V5 A  q% K* U, f
  452.         mov     ax,802 M5 i# Q0 Y* O( z2 M: ^2 y
  453.         mul     dl
    5 v! E2 a- X  B
  454.         add     ax,cx, h# h0 w0 Y% h+ d
  455.         shl     ax,18 {/ {" F4 s4 u9 E
  456.         mov     di,ax
    + U7 d, K1 S$ u7 T" s; V
  457.         mov     ax,0b800h
    * X3 \1 U, W+ n& ?% J7 V* J
  458.         mov     es,ax
    8 r1 L& W! f) s5 Y0 G" Q
  459.         mov     ax,[save_char]# R* R; W3 E% D4 @8 ]
  460.         stosw/ O) P# i8 |, Z' E' [
  461. / G$ I1 W5 b+ }2 a
  462.         mov     cx,[pos_x]
      K7 `: c6 e: K/ U" q( i
  463.         mov     dx,[pos_y]1 u2 r% ~2 G* `0 ?0 C$ I$ O  o* L
  464.         shr     cx,3
    2 z  i5 v7 l/ j% k/ G
  465.         shr     dx,31 B: K2 l" g! p) s! d2 A" M
  466.         mov     ax,80
    4 P9 n! f& d( t* Q; Z+ J$ I1 L# R
  467.         mul     dl" w/ f, B$ P. ?# [- |; P
  468.         add     ax,cx7 h, x6 H3 m' Q: p3 t8 u! W+ \
  469.         shl     ax,1
    7 ^# q4 R/ |2 ]
  470.         mov     di,ax* M1 Y' \  U# |! U# g
  471.         mov     ax,0b800h
    8 V3 q% Y5 ^7 m
  472.         mov     es,ax; q1 h3 s: L3 F( [3 @) p
  473.         mov     ax,es:[di]' S. z3 A  L: ^2 k6 B
  474.         mov     [save_char],ax" L# Y8 r6 i8 X; |
  475.         not     ah
    : M6 d% X! T+ k
  476.         and     ah,7fh
    4 O% |6 _/ m8 Q" [9 @
  477.         stosw3 y+ |) q- |, a
  478. no_show:/ w! l: L0 m, Q5 c( O) }
  479.         mov     bl,0aeh7 d/ J! S+ X; Q* L) J$ C$ \
  480.         call    keyboard_cmd8 B7 _: j. _; t" Z/ W
  481. ) x- O7 ^7 |7 [4 K" O5 f) R8 Z
  482.         mov     al,20h
      c8 r6 c+ Q, K5 f
  483.         out     0a0h,al) E/ D& d) V3 ?# B" K% M- Z/ H
  484.         out     20h,al* E" O" i- q$ q; b$ O& y5 a0 t1 V
  485. ; g: i9 v# f6 _9 K: S; {
  486.         pop     ds
    * v7 @3 D& j2 }5 i
  487.         pop     es
      `0 z5 ^5 M3 N
  488.         pop     si
    8 [1 a' N" Y* f0 U" ]  D
  489.         pop     di: A0 c) ?& @. c$ _# V' Q/ ?/ Y: O
  490.         pop     dx
    6 g) i0 l/ z; T' ?* i* n1 [
  491.         pop     cx
    , W& e5 I; w+ r7 h, `: w9 ^
  492.         pop     bx
    2 ^% ?; u$ E. x7 ~  U: ^
  493.         pop     ax
    * S. `0 A1 g* Q" b/ u
  494.         popf$ _  D& k. [3 `/ r/ H6 }( l4 ^
  495.         iret
    * k) ]* ~! p' U1 B  W, a  ?' j# d
  496. $ M# R8 G- ^) K. l& ~, C" J) D
  497. first_time      db      10 C! @! J7 o. n3 s) a2 u" P. u( L1 w
  498. buttons         db      0
    1 O4 N6 y, A( ?' {
  499. pos_x           dw      01 o3 h. n6 k4 c3 l
  500. pos_y           dw      0& @0 [# U3 U: ]( ]
  501. sm_flag         dw      09 i8 h$ p( b+ K  T1 z: H6 I& \
  502. save_char       dw      0
    ' V6 O6 {# V: U/ Z$ L( o, F% B; R
  503. x_move          dw      0; Z9 ?1 f% ~. [( B8 T4 y! \5 }3 u
  504. y_move          dw      0
    ) B) ?$ T6 Y% L; M
  505. x_max           dw      6395 }' r0 c) w* ^! f- ~$ `
  506. x_min           dw      0
    7 M1 H6 V& S% O0 U$ C+ [; Z
  507. y_max           dw      199
    7 A- V6 p9 P2 }" ?' G* t
  508. y_min           dw      0
    ' c; E  h8 ^- f( Y) v7 \
  509. user_subroutine dw      0,0
    + h% ?% w; |5 X$ O' L, Q5 l
  510. user_mask       dw      0
    / P( ^* p5 H% e: D4 P! l
  511. temp_mask       dw      0
    * I0 E) |- x: t
  512. * ?" \; R8 F2 ?1 Y# }" q
  513. keyboard_read:
      E# `* v+ Q5 o1 ]" T
  514.         push    cx
    / L: \$ g: n, n& e' t2 h
  515.         push    dx
    # y/ B1 f% F( G3 c
  516.         xor     cx,cx
      }5 a; M$ D) f! Q+ L: `
  517. key_read_loop:! H7 E) K. h. I, b' b
  518.         in      al,64h( w  u9 d; e" m* j! P3 r
  519.         jmp     $+2
    + q+ A9 E: C8 G0 i
  520.         jmp     $+2) R# z& P( ^" N$ B" e' `' a/ x
  521.         test    al,1
    9 o/ ]* j1 G- F" y
  522.         jnz     key_read_ready5 j. S7 B* V# |1 S2 v3 u
  523.         loop    key_read_loop
    5 k& {' D  x2 ]* k2 S; A8 H
  524.         mov     ah,1- P4 C( [/ A" K) y5 h5 V
  525.         jmp     key_read_exit
    7 V# |% a% U4 j7 T9 @9 M- n1 S
  526. key_read_ready:
    " l( `1 S9 W6 `
  527.         push    cx8 D- D, c8 \- h$ X! k% {; \3 [+ T$ X
  528.         mov     cx,32- M( B* K8 S! X- G/ M) N
  529. key_read_delay:
    9 a3 y, N; z6 a' A
  530.         jmp     $+2
    6 Q% ~6 Y' z6 E, [  {- I) N% ~0 E
  531.         jmp     $+28 x& k& n* a  |& `% g1 K5 ^
  532.         loop    key_read_delay9 |9 x! x! n8 P$ t* S) p2 _* q

  533. % J& {. m# \! x0 W# `  I& [
  534.         pop     cx
    1 A, Z5 J. G% m, ?) \- [* y
  535. % Z0 w$ W1 m% w% X1 @
  536.         in      al,60h0 R9 h' e4 Q0 `9 K6 \- p2 o
  537.         jmp     $+2
    . Z3 ^3 [% a( |% i0 I# T
  538.         jmp     $+2
    ; G+ h" F. M0 d8 T  T3 f
  539.         xor     ah,ah
    - a0 `% L/ l9 d7 {7 i
  540. key_read_exit:
    6 G% l. p/ s2 R: M4 A3 _' k
  541.         pop     dx2 N) W7 Y4 ~) P; m
  542.         pop     cx- X: X+ M( o4 m
  543.         ret
    ) M. X; k  h  L

  544. ; J2 G$ T/ l" n5 S- m% t. \' H5 t
  545. keyboard_write:
    - |$ U! m% Y9 ?) o) T1 n5 U
  546.         push    cx
    9 q" j4 T% L) X. I( Q+ `3 a. I* F
  547.         push    dx+ R  Y+ v# P8 W% o6 h
  548.         mov     dl,al% d7 G, G8 J5 M: \/ a6 u' j# d
  549.         xor     cx,cx4 m5 c3 _4 b; N# h2 ?
  550. kbd_wrt_loop1:1 a6 H3 ]  V: F$ f/ v
  551.         in      al,64h
    ( Y6 R$ z2 O! `4 l/ {. q. \* a4 I+ D
  552.         jmp     $+2
    4 I3 x, H. U' q
  553.         jmp     $+2
    ; }0 L8 x* m6 B" n6 z: {
  554.         test    al,20h7 Z5 J9 \# O) z; o
  555.         jz      kbd_wrt_ok19 D; y+ Q/ N8 Q" ]+ J/ p  U- X

  556. ; f1 M% Q! G8 Q5 @. T
  557.         loop    kbd_wrt_loop1
    & A; o/ v. y2 L4 E4 |6 F& a

  558.   A- y& g* X* ~3 b
  559.         mov     ah,1& B" z4 O$ ~: z" G
  560.         jmp     kbd_wrt_exit1 g! t7 K1 b( e0 D7 C2 I1 y/ }7 k
  561. % H+ O' v: A9 C( e: G" \( }6 G! r
  562. kbd_wrt_ok1:
    " H% K, X& ?( q1 A1 R! g4 H
  563.         in      al,60h( ]. ~' |- U: v- g% V. i

  564. 0 R+ I7 n+ l( B: v9 c
  565.         xor     cx,cx
    3 I- `& _- {9 i( R: c  ~& M8 E( x
  566. kbd_wrt_loop:
    1 K$ _4 x) i) d6 c/ h
  567.         in      al,64h
    2 c% _9 G) @9 S) ~( x1 I9 a. `, q4 j
  568.         jmp     $+2; B3 p' \8 A' K! ?- z  T8 u8 W
  569.         jmp     $+2
    ; U  j* `( r7 W0 {3 M: ?
  570.         test    al,2/ |! S2 {4 `+ ~
  571.         jz      kbd_wrt_ok
    ( c& r# p- Z- N- C, `7 v3 J# ]2 y5 @( b

  572. ; B( }+ M  [* u& D9 \/ p5 w
  573.         loop    kbd_wrt_loop' J5 V% ?% Q1 W: S, d

  574. ! C  j( \) \+ `8 G  b' g5 Z
  575.         mov     ah,12 _. h0 h/ B2 G6 j1 r
  576.         jmp     kbd_wrt_exit
    - M6 J9 |2 e# s$ ]& G- q

  577. ! j+ d9 _% O4 \* g- q1 e- H7 g# ]
  578. kbd_wrt_ok:
    + f0 Q1 g, @6 a3 v% V7 X, l
  579.         mov     al,dl
    , ?* ?; h: p' d9 \+ g. S
  580.         out     60h,al2 W' y3 G4 y$ P$ I* T
  581.         jmp     $+2
    . [( F; |  n1 K! o$ y
  582.         jmp     $+2
    8 ]& u: t  V; i0 U* K. f" F

  583. 5 b. Y# v- O6 Q
  584.         xor     cx,cx
    7 V) l2 r/ F  _8 E6 L
  585. kbd_wrt_loop3:
    / y$ Q8 v/ T& K' a) r" B# Y
  586.         in      al,64h' j3 f2 n7 x# ^, i" d
  587.         jmp     $+2
      F4 w' ?( p' d+ _' A; h" f8 g
  588.         jmp     $+2
    # w+ B6 y6 T2 o. o: }
  589.         test    al,21 o# ?; r4 _5 ~0 J7 `5 c% g2 W- h
  590.         jz      kbd_wrt_ok3
    * A4 Z; P, l1 B( `

  591.   ~! ~# D+ b3 R& Y+ M# g
  592.         loop    kbd_wrt_loop3
    - z8 _/ ^6 z  v8 r9 @3 P

  593. ! t; B; |" m3 v5 E' F) A
  594.         mov     ah,1
    8 a+ B- T# V' D5 X" ~
  595.         jmp     kbd_wrt_exit
    8 u! }7 i/ ]: o+ h* e/ O
  596. , J6 R8 I5 V% `3 d( r$ }
  597. kbd_wrt_ok3:9 C  }- s+ `: J9 V, D* j+ {
  598.         mov     ah,8
    - P2 e# K  z; K$ ^; U) u
  599. kbd_wrt_loop4:
    ) A, z3 `) H' ?2 e. z% P1 p+ z
  600.         xor     cx,cx( @5 Q8 h7 X7 h# A) q/ p( P2 w
  601. kbd_wrt_loop5:
    & d4 p0 G1 F* W
  602.         in      al,64h
    . e# q3 w' L/ d) O) E; f2 M7 z* O
  603.         jmp     $+28 I8 J! O# i4 _- G; U
  604.         jmp     $+2
    + t1 a0 R; y- D: ?
  605.         test    al,1: u8 Z5 Z7 w, n/ g
  606.         jnz     kbd_wrt_ok40 y0 V% m( G4 K& b, @$ T! a0 I
  607. ) y: e2 b5 v( ~! M5 B! J. f
  608.         loop    kbd_wrt_loop55 Z/ c1 V* |7 p! `! B' {; s
  609. ! C8 C$ g+ E$ f" ~. \
  610.         dec     ah- f# k0 Y. `# {* J+ ?, K4 \
  611.         jnz     kbd_wrt_loop4
    : T3 v% G5 e7 R9 ?* w- Y
  612. ( Y- i2 C- j, m
  613. kbd_wrt_ok4:
    + Q" K7 A: k$ m, l9 y6 S7 H
  614.         xor     ah,ah
    6 b' `6 y5 ^$ K8 w& g( }
  615. kbd_wrt_exit:; ^5 I* H! `) {) |8 d. b6 I
  616.         pop     dx
    8 H7 [) j1 a& j: ]4 X, s
  617.         pop     cx
    ) p# {8 @- F6 J% w' x( z6 P
  618.         ret
      {8 U' J! H0 ^1 ]
  619.         ! l/ v. W2 |$ t: R6 c3 t4 [4 ?0 r4 e! U) ~
  620. keyboard_cmd:
    ' e3 _3 R# B1 x' _( t  m
  621.         xor     cx,cx
    9 h8 p6 F# S# H7 g& |, @
  622. cmd_wait:" J( A6 h/ x  N. p& T
  623.         in      al,64h
    + Q  ^. ~! s/ Z' y$ i
  624.         jmp     $+2
    4 B  U0 o$ H/ X' q: Z7 C, k4 r
  625.         jmp     $+2
    & k% ^8 M0 B& X9 f2 m; W9 L) d
  626.         test    al,2, d, M  q7 s3 X% t4 c' K
  627.         jz      cmd_send9 G; s0 K3 [4 K6 ~
  628.         loop    cmd_wait' p+ R4 [1 A1 b1 |$ h! j1 ?3 f
  629. - o$ T2 s: F" `' w6 Y: D1 z  ^
  630.         jmp     cmd_error
    2 L4 L; W6 r, N7 r' M8 ?; `
  631. 6 r6 M$ O" L' `- G  K, m( M
  632. cmd_send:7 a5 `9 H5 L5 i, g1 J- b  _
  633.         mov     al,bl/ ]" [" D5 O) D4 e& ], l
  634.         out     64h,al8 g4 n8 D$ G- D. r( I9 K
  635.         jmp     $+2
    ) B, o) I( p, M- A
  636.         jmp     $+2
    9 h! J2 `) w" w- L8 p6 I" W

  637. 5 X2 `# I1 k5 I4 b
  638.         xor     cx,cx% G' t$ ?+ I' l7 A  P* s
  639. cmd_accept:
    ) \1 e* _4 u0 P2 }/ ~* g+ ~
  640.         in      al,64h* p2 S' l5 _" f/ ^/ E) @% y( |
  641.         jmp     $+2
    * ^$ U. H4 m. R$ {
  642.         jmp     $+2
    . Z% I2 U" w; z1 j) o9 k
  643.         test    al,2
    % M1 e+ s1 h  Z1 ^* o( v' F  r
  644.         jz      cmd_ok
    - i" i  @# n6 s, E' x
  645.         loop    cmd_accept" ^- r' \' ?2 I( j. ?
  646. / o0 P0 o! j9 z% s# J8 E
  647. cmd_error:3 Q8 u7 W% b2 V1 b8 Z
  648.         mov     ah,1
    7 b! E+ ?8 L6 B+ G
  649.         jmp     cmd_exit) u2 `' I7 V; [7 W* ~# @
  650. cmd_ok:
    ) ^' i7 F+ K& ?* @% B6 y
  651.         xor     ah,ah- E: ]2 @3 U# i) j
  652. cmd_exit:
    ' b$ r" E6 u- V2 d& D: ~
  653.         ret% I! U2 x" c3 m6 z. \

  654. $ ^4 n( @  u  l2 Z6 o: _" |4 K
  655. new_33:9 }$ M1 E. X! |! g3 z
  656.         cli$ e4 K) ?4 Z: t! P+ y
  657.         cmp     al,0, v+ Q4 j" q' F; `3 ^0 Y$ U  q# ^3 Q5 H
  658.         je      reset_mouse% ^, e3 q9 |: D$ r- d' X
  659.         cmp     al,1
    & [0 |# q% A+ {# W7 K* F( Q+ x
  660.         je      show_mouse
    3 z' @1 N( H5 G- g
  661.         cmp     al,28 [/ J/ O1 G" m" j1 N# ]# C
  662.         je      hide_mouse2 o5 ~/ F. w( B& w1 c8 B
  663.         cmp     al,3
    - Y& Z8 v  x8 t
  664.         je      get_pos/ m* b& }6 r! |" ~  F$ |3 b
  665.         cmp     al,4& C: A& c8 ]" V& w) y" y
  666.         je      set_pos$ T3 b# ]! j3 C( P+ C( {- {
  667.         cmp     al,7
    3 v% ?! N6 N+ e1 s
  668.         je      set_hor_pos) ~: H7 E4 I/ w
  669.         cmp     al,8
    ( _3 |" Q4 S" e, z  y1 V% J
  670.         je      set_ver_pos$ K( k6 o0 j* @) a# U
  671.         cmp     al,0bh5 }, x- d& R3 h% [/ R5 @
  672.         je      get_mouse_movement3 g$ ]# Z  S3 X9 Q# Z7 \: z( S# y
  673.         cmp     al,0ch( K. m2 Q& T5 |" `. H
  674.         je      set_subroutines  ]2 a  K5 t, o: a
  675.         cmp     al,14h$ {& P5 C* H  N. K
  676.         je      swap_subroutines5 U/ i: v/ v  e: x
  677.         iret
    7 U/ i1 b5 h  a  j- @8 x; p
  678. 5 }9 `% Q4 `4 g+ G- c5 N% L& R$ d
  679. reset_mouse:/ c7 F1 T$ T$ K) I. \! P; I
  680.         jmp     _reset_mouse
    2 F$ X' }: e& X: E
  681. show_mouse:0 U7 D; ?2 [5 e- d6 h! b8 \! v
  682.         jmp     _show_mouse
    3 k, {! {+ u$ E. l& W9 g" V
  683. hide_mouse:; d' r; u# Z) R4 L( o- a5 ]
  684.         jmp     _hide_mouse% o/ O0 R" I# j. `
  685. get_pos:
    $ T; q/ y  J/ ]
  686.         jmp     _get_pos0 ]; K: V2 N' Y6 X' {+ `
  687. set_pos:+ G, O6 k; B& \$ [! O, n
  688.         jmp     _set_pos
    $ b1 E/ J$ f$ d
  689. set_hor_pos:
    5 [! _8 o" p# Q+ O
  690.         jmp     _set_hor_pos7 e% p, }+ k. ^
  691. set_ver_pos:
    # f- Y/ A6 {6 c+ M) k  B# h9 ]
  692.         jmp     _set_ver_pos* \& a9 d4 e! H# V6 r
  693. get_mouse_movement:3 k& r6 I2 O# d! I) _1 a- _! ]+ B
  694.         jmp     _get_mouse_movement, x0 b3 X/ _3 Y/ a2 W
  695. set_subroutines:
    & f8 g% q7 q# M
  696.         jmp     _set_subroutines
    " f% r  @/ t5 P/ y. F3 Z
  697. swap_subroutines:0 ^# q% o9 b0 v3 p! ^1 L
  698.         jmp     _swap_subroutines& M3 M1 E# j: H. |0 q/ M
  699. ; d/ ]8 q9 J; `5 g+ o- d& c# v
  700. _reset_mouse:
    " w( n" e4 [+ _
  701.         mov     byte ptr cs:[buttons],0
    8 m; m3 P0 p0 h+ I6 h! X4 M. g
  702.         mov     word ptr cs:[pos_x],03 K8 V5 X' ?1 p3 p2 N
  703.         mov     word ptr cs:[pos_y],0
    6 l0 u! j5 b6 n. c% K
  704.         mov     word ptr cs:[x_move],0
      ?2 K8 d$ y. E$ L
  705.         mov     word ptr cs:[y_move],08 T7 B5 D$ ~7 o
  706.         mov     word ptr cs:[x_max],6390 Z  w" [5 u  d4 K; Y" w* ]1 z
  707.         mov     word ptr cs:[x_min],0: B/ F& j6 S1 A: |3 S6 m: G0 b
  708.         mov     word ptr cs:[y_max],199
    / L# K/ M5 e: K2 K* ^
  709.         mov     word ptr cs:[y_min],0
    2 [$ Z  H1 L3 ^: f( L
  710.         mov     word ptr cs:[user_mask],0
    " H7 X, J5 R3 Z6 f
  711.         mov     word ptr cs:[user_subroutine],0
    9 z, |5 j8 j' s5 s
  712.         mov     word ptr cs:[user_subroutine+2],0! ?# u, d3 M1 k0 w9 r
  713.         mov     ax,0ffffh, u7 K* @: W! K; ?- U
  714.         mov     bx,3; I7 E( m0 \0 T9 f
  715.         iret
    9 D& n1 p* y% Q, e# F
  716. " F4 D) M9 H" w* u
  717. _get_pos:. H) m+ N5 N1 C" U
  718.         mov     cx,cs:[pos_x]* h; Z* u, F. f5 }+ ], n5 Y
  719.         mov     dx,cs:[pos_y]
    6 h7 D% W# c! R' _' }3 _
  720.         mov     bx,word ptr cs:[buttons]
    . r$ z( n- c, G: l. L, B% |$ h
  721.         xor     bh,bh2 ?- |) n1 I8 g+ `9 X
  722.         iret
    ; X- m% V5 h( r  q! f& B7 D3 m* G) w
  723. 7 M/ @; [. n/ b. H
  724. _get_mouse_movement:
    ) d3 d6 C6 ~' ]# ?7 e8 D- o4 D) k
  725.         mov     cx,cs:[x_move]' y: k4 Y- B& c7 t
  726.         mov     dx,cs:[y_move]' N; K4 J! `  X  N  b# B# V. s
  727.         mov     word ptr cs:[x_move],0, E( S: L2 y2 Y, r
  728.         mov     word ptr cs:[y_move],0! ]( t& N0 s$ ^
  729.         iret
    & [8 W, ]) O) X# y! X6 I
  730. 4 K& g: i, O7 I% G. @% }
  731. _show_mouse:4 r* @8 E3 I) S4 {
  732.         push    ax
    7 }" v& }2 \$ n- S  Z! ?# n
  733.         push    bx# Z' f. `( K. v, I. m* B
  734.         push    di1 P- P2 s$ w. h4 r' K5 B
  735.         push    es! p; m+ O8 ]' E( A6 {
  736.         mov     byte ptr cs:[sm_flag],10 _! g/ t6 M" x5 f/ `, A
  737.         mov     ax,cs:[pos_y]
    ! V" u4 ?9 k) `0 G0 d* a
  738.         shr     ax,3
    % M) |# C2 m4 x8 R
  739.         mov     bl,80
    % O: R6 t  \) p; t9 x
  740.         mul     bl
    * x$ }! I/ K0 m% P: ?  h
  741.         mov     bx,[pos_x]9 ]8 N& }' v# j8 Z, S. ^
  742.         shr     bx,3
    9 ?0 G! }6 P$ D# I
  743.         add     ax,bx
    0 J2 I7 ]) Y' `# {
  744.         shl     ax,1% _+ b+ ]/ n! X; P# `/ |
  745.         mov     di,ax
    + N  R( d9 N( K5 l
  746.         mov     ax,0b800h# [% L. F; L" Q! M" x* l6 n: r
  747.         mov     es,ax
    ) Q7 i6 I8 r8 y3 d$ _- G6 R
  748.         mov     ax,es:[di]8 ]# V8 K; R; X, K2 v
  749.         mov     cs:[save_char],ax. g' e# b! C# P5 z; k
  750.         not     ah
    # M9 D+ u% w% }' i1 X
  751.         and     ah,7fh/ F  u* h# \$ J9 B3 j
  752.         mov     es:[di],ax
    $ J7 A  R2 R" \. o! H8 L6 M4 D
  753.         pop     es
    4 G; z( V8 }4 _0 L" L8 q
  754.         pop     di/ r  y+ }: d0 o, e" l9 H8 O" q
  755.         pop     bx! X$ I5 k( I! ^
  756.         pop     ax3 b! p! C3 h& p$ F' a
  757.         iret& ]/ m/ \9 f/ A5 w! D- |
  758. " g4 |6 x, `8 c. b) g9 V
  759. _hide_mouse:
    * n+ n0 k& p. |. Z9 g
  760.         push    ax0 y1 }% z! C3 q$ f) S" f: @. K" |% e
  761.         push    bx+ I% G5 ~9 S3 a3 v- U$ m; J, `
  762.         push    di8 t2 s0 `1 F% k% S& x
  763.         push    es
    / j/ n1 \0 }  t& B  d6 f
  764.         mov     byte ptr cs:[sm_flag],0
    6 l  c9 W/ s( j# p
  765.         mov     ax,cs:[pos_y]
    . E, S" I  M7 ~6 {/ i9 E( Z
  766.         shr     ax,3
    : L2 |: ]3 ~- ]
  767.         mov     bl,80! t6 i: Q- R0 p. C4 [
  768.         mul     bl
    $ y( v0 D! K( \) k7 w" _! u
  769.         mov     bx,[pos_x]' j  K6 ]2 k) w
  770.         shr     bx,3
    - T8 e+ ?" }3 O' A! a
  771.         add     ax,bx
    % s  b8 H, I/ c# S, W4 X0 d
  772.         shl     ax,1% V- J; v, J) e% R
  773.         mov     di,ax
    9 s* |4 K, T6 P
  774.         mov     ax,0b800h
    9 b& n# H6 d  |6 T
  775.         mov     es,ax1 f0 r( X2 U; E5 R6 P
  776.         mov     ax,cs:[save_char]
    + J, ~# }4 l7 X( z: j
  777.         mov     es:[di],ax
    4 W* s; w  e8 C
  778.         pop     es
    / i7 @1 ~* z/ H1 C
  779.         pop     di, x/ W1 v8 @0 G+ U2 n5 j5 Y3 d& K) n
  780.         pop     bx: q) S! g  \  i* t: D
  781.         pop     ax& s8 l& ]- n( _
  782.         iret
    % r( {" _1 e1 w

  783. 5 i1 y3 G5 W- y9 x+ c" z- m! E% @
  784. _set_pos:
    ( s7 u* F/ b1 |2 d- u; |
  785.         mov     cx,cs:[pos_x]4 Z* @2 y2 }- }
  786.         mov     dx,cs:[pos_y]  M% }8 b6 U# Q# D# w
  787.         mov     word ptr cs:[x_move],0
    - S  t' B2 J6 Q2 b& `  y9 V
  788.         mov     word ptr cs:[y_move],08 e& J% ^, S/ q. ^( @- \: K5 f1 `
  789.         iret) M/ y% _6 ?. x% c2 @" {

  790. * J, {( ]8 E, F$ D7 h/ W
  791. _set_hor_pos:
    & e( a- @. p  I4 p# \2 v9 m. ]
  792.         call    max_min
    5 \( P& f' E5 G  \! o2 g) m3 g
  793.         mov     cs:[x_min],cx
    - p. H; {: |8 s$ }3 ]# A: q6 N1 d1 n
  794.         mov     cs:[x_max],dx" L6 g1 K' z, i6 C
  795.         cmp     cs:[pos_x],cx
    ; E) F- S, L+ c! O
  796.         jge     good_hor_min
    $ u: Z6 L& f  o. B
  797.         mov     cs:[pos_x],cx( r4 l/ O- |; G) W3 i( n
  798. good_hor_min:
    7 H$ {1 i5 N7 ^7 L" i4 l
  799.         cmp     cs:[pos_x],dx
    5 T$ E4 Z9 v4 W, p/ E6 N
  800.         jle     good_hor_max
    5 C$ w* z- K7 C6 I8 Y: ~
  801.         mov     cs:[pos_x],dx
    5 ~! c+ t. H4 r# |- h" J% O9 L
  802. good_hor_max:
    : G8 {1 f0 R: E( v
  803.        iret8 x! p- D* s6 O9 v* [6 K
  804. % v/ w4 d. u) {6 v8 F' O- K- r# j6 b
  805. _set_ver_pos:
    , x# z5 B' k( I! o; i( _
  806.         call    max_min. |5 @. j) N  l& c3 F: ^
  807.         mov     cs:[y_min],cx( l3 X; {: ~4 j0 a3 w; `9 u
  808.         mov     cs:[y_max],dx
    : f. j( `! u2 m' B5 d' d9 Y! ^
  809.         cmp     cs:[pos_y],cx
    + U6 V3 P4 w, {! |$ b
  810.         jge     good_ver_min% N5 j5 V; J1 P* c8 E& G" z
  811.         mov     cs:[pos_y],cx5 j4 ]8 I  o* x0 m; v% m
  812. good_ver_min:
    + R% x- L8 D. ?+ x# ~
  813.         cmp     cs:[pos_y],dx% N9 K) \- \! y
  814.         jle     good_ver_max
    ( L$ X0 g$ C6 x0 ~
  815.         mov     cs:[pos_y],dx
    ! Q! o9 Q  w$ n, t2 L
  816. good_ver_max:
    $ S# f7 y9 C3 U5 ^  \1 Y# L
  817.         iret, Q0 C$ G. q6 d6 C5 w7 F& C
  818. " e* E. G6 W) c% t) Z
  819. max_min:
    & b  D% s- B1 i
  820.         cmp     cx,dx$ O; {$ E  ~! t/ ~/ Y- S
  821.         jle     no_swap- a7 |- W& f) r  t( q
  822.         xchg    cx,dx7 g: i  V% ]6 f; D& M0 b
  823. no_swap:9 O; K+ t" O4 z* ~
  824.         ret
    : N- C! S$ Q' w$ ?$ C. o
  825. ! ~5 j! C) B+ m7 y
  826. _set_subroutines:
    ; _0 m  v3 C8 V  K4 ]" p6 [: m( V- g
  827.         mov     cs:[user_subroutine],dx( H7 H. N1 m# k) M
  828.         mov     cs:[user_subroutine+2],es! L0 f" `5 q0 W( [, M) b
  829.         mov     cs:[user_mask],cx
    : I, Q) R+ I8 C  b+ F- `- a. t
  830.         iret
    # `* u% A) n/ p. W6 b% D

  831. , h5 |% J* |# Y$ G8 ?
  832. _swap_subroutines:9 q( B4 w7 U: x2 c( A  D
  833.         push    word ptr cs:[user_mask]
    9 s% q% D* c, X& \: l( |, T( v& K, `
  834.         push    word ptr cs:[user_subroutine+2]: M. `) n* P6 w6 }0 \* z- z
  835.         push    word ptr cs:[user_subroutine]
    : V$ i: V$ v" |+ Y
  836.         mov     cs:[user_subroutine],dx5 b7 }7 K% o1 ?, n+ }7 B
  837.         mov     cs:[user_subroutine+2],es3 b  Z* G7 \9 B9 `
  838.         mov     cs:[user_mask],cx
    2 Z& A5 r' V+ Q  B* L& H/ q) |( p
  839.         pop     dx7 j0 a/ C% P' j" q
  840.         pop     es
    - \% ^; c1 ~# B6 Y
  841.         pop     cx: k' ?* d" d& G* d/ U
  842.         iret# t! M# a- q! {7 C# r* Z

  843. ! d0 w, f0 u' f- h% ^: O0 P
  844. memmouse        endp+ I& z$ H( Z* m) X2 F$ \/ H# X* D  m0 J

  845. : Z. k# Y# a# X+ \' K0 Z9 J% f3 z
  846. endof_start:
    4 J: u! Z% n3 S) x

  847. ! I( I% \$ [5 d3 K# k
  848. emsg db 'No mouse driver install error!$'
    5 v/ Z% P/ v/ }+ G- R
  849. old331 dw 0% `+ i: b1 L9 [
  850. old332 dw 0, Y5 U" E9 |9 H/ B: M/ o
  851. old741 dw 0
    - Y4 Z( k- w) |
  852. old742 dw 0
    - e  U. B$ Q5 s
  853. memcopy db 0
      p, N( t; H$ j/ @% ?/ S
  854. okcheck db 0
    , n3 D1 j6 C& U* V
  855. pass db 0
      S9 P4 G1 c. d/ w
  856. chkl db 0
    6 U) I& r$ \& |
  857. lk db 0
    " F+ U; @4 m! h' E/ n
  858. chkr db 0
    ; m- ]1 g- e  X& Z; x: ~
  859. rk db 0
    & h+ a, V; X6 t6 Z9 Q: t
  860. showms  db      '                  赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    ! o4 M, h; y& `6 }
  861.         db      '                  ?UfoitmousetestVer0.9Bini.Yi?                '- B2 k* i% @& {2 V+ k
  862.         db      '                  韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?                '
    6 |, {6 D5 i  q6 f
  863. db '                                                                                '+ F# {" G( ?/ u: ?3 O
  864. db '                                赏屯屯簧屯屯突                                  '" t0 R$ w: `8 F" q/ }' f
  865.         db      '                                ?OFF汉OFF?                                 ': r8 t; Y; m4 g5 E0 {3 f
  866. db      '                                韧屯屯既屯屯图                                  '
    4 q4 s* c9 S( @
  867. db '                                                                                ') ], ]8 a" Z6 [8 G/ a2 f
  868. db      '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突                     '
    + c/ `0 b* A( g3 b8 T: J/ g
  869.         db      '                     ?IFFail,Press<Esc>toExit?                    '
    7 S8 K( T2 C: z) p% l/ q& }. m- ~' ?
  870.         db      '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图                     '
    0 @! V+ S+ B- n, B9 U* K' U
  871. : g9 B6 B8 ^2 o
  872. end
复制代码
发表于 2008-12-24 11:48:37 | 显示全部楼层
真的是压箱底的东西了, 现在都不好找了!
+ D7 Y, a1 M7 I哪天有空把这个驱动嵌入到我的一些 DOS 工具中来支持 Mouse, 哈哈!
回复

使用道具 举报

发表于 2008-12-24 12:07:02 | 显示全部楼层
好长...
& }9 l) T1 P+ T# N6 J$ z' l: E2 `, {: k+ V
谢谢!
回复

使用道具 举报

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

回复 1# 的帖子

好东东,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 09:36 , Processed in 0.024885 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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