|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM
5 c i+ |( A4 l# m: a* H - ; $ i$ o- T7 Y* A; X/ u8 d$ v
- ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
9 ~+ c& U' R+ G: Z3 N2 `& { - ; ml A20ON.asm
7 H$ [3 }& {$ k! [8 U1 }, }. E - ;
0 E4 i0 w/ C5 Q - .model tiny: ]# O$ f* j7 J
- .code
7 q" |7 g9 n0 a' k/ W+ F3 E, }9 ] - .486
* z2 K, c. _! X/ M: d+ t) Q. W2 { - .startup
1 e: h0 s0 y+ ~ - % q( d: u3 E. M- c2 V( J1 k' \
- mov dx, offset msg_author
$ n0 N% y9 E. P' f - mov ah, 09h
& f7 v& j0 ~& H% W) t, a0 T& S - int 21h
+ C7 _$ Y: `( m# }. r% v
, g! Y" Z% t) M8 _: C+ j4 y- mov dx, offset msg_fail ) \/ j, V8 k# K' }
- call A20_ENABLE( Q L1 G3 X2 u; x
- jz exit1
% c& T$ X+ d0 j0 ~ D2 s h3 N - mov dx, offset msg_ok
+ D) ^7 @0 D) F" l
5 E4 u+ Q0 y% q# L( L- exit1: mov ah, 09h , ~* h" U; Z$ d/ A/ k5 W' q
- int 21h
3 u$ B) Q& j; Z! N( `- p! G2 o! |) } - mov ax, 4C00h
7 \/ [9 d- K% n" I0 U! D! } - int 21h ; ^' M! ?6 z m0 \9 O. c
- * T! A$ l; ]) X4 O# w8 }
- msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,, q$ h2 F7 U# c' U, Z9 S7 R
- "2008-07-01",13, 10, "$" [2 f+ ? J9 G u+ h: Q
- msg_ok db "A20 Enable OK", 13, 10, "$" 0 T. C) s* f% B/ j
- msg_fail db "A20 Enable FAIL", 13, 10, "$" % e- Z( _& ~9 q) l
. H ]+ _* l& W8 |) W% N6 g- ;------------------------ follow code maybe make to lib, if you want...-------------------------------. x$ R% O: @% @) p! u% ^- `
- A20_ENABLE: ) o! }6 |$ k9 o. P! @0 K
- call A20Write , e$ p& d2 w) f7 b9 U
- jz exit_enable8 X& G5 z' d' a0 V% m# Q# q$ ?7 y6 V, f$ c
" a/ u: L5 V! C2 _9 B! J- cli ; Only need for reading value from KBC
7 N& ?5 E, o7 \1 M - mov al, 0D0h $ v8 M" J; t0 ~: a7 r4 i5 [$ r
- out 64h, al
2 R& M4 I1 U8 o" b - call A20Read 5 g5 \6 o9 _% |. w- Q2 e
- jz enable_int . R9 x% H& ]+ K& U& \1 Z
3 C) [- }- ^4 v) a0 `- in al, 60h ; Get current status
, z6 x* R- C1 E% u5 C - mov ah, al : i0 |1 q6 O/ A9 |& F2 Z0 K
- call A20Write ) K \- d7 U5 ^6 C' ^$ z" @( V
- enable_int: sti 1 I: ^! n) R3 U. c1 k
- jz exit_enable% f' x! }. I# |; W& i$ A% p4 @
- ' o) P1 f& h$ F9 E2 P5 |
- mov al, 0D1h ; Tell the KBC , want to write to the . a6 y& V1 ?/ R6 ]2 L
- out 64h, al ; Out Put Port next
" E6 w. E, c7 H+ \+ ~ R; _ - call A20Write
3 R( Y4 p5 I. V- B' U( e% y+ [ - jz exit_enable
' `) g3 s4 U+ D% U
+ a- J. @! U0 \8 k* k- mov al, ah ( E# o: v$ _7 S$ x) X) B
- or al, 2 ; Enable line A20 9 T$ b o, X* r$ t( L
- out 60h, al
: m5 N6 [$ Y' R4 D - call A20Write
4 Q% c% j+ e1 G! | - jz exit_enable
\5 \7 M3 ?: a# r
, e; @( \3 K5 B. }- mov al, 0FFh ; NOP 5 S7 _. g) V$ |6 L) ?! z
- out 64h, al . z1 p4 u1 I6 {6 `5 s' {
- call A20Write ) h5 D+ L0 D' [ K7 y6 P7 L o- Z
- + F8 s8 i& L5 M
- exit_enable: ret
, ~; _, K4 |1 b - ! W4 j [4 J: f2 A$ w3 N
- A20Write: xor cx, cx ; Reasonable wait
& |# p: }' \ M6 { - get_wirte: in al, 64h ; Get KBC read status % r. \0 Z b. V- v8 J% R
- test al, 02 ; See if buffer empty, bit 1 clear
1 u, C6 Y6 R x) J - jz clear 0 A( J) S3 a3 l
- dec cx / F5 C& x! v% k1 h& c8 _
- jz exit_write & v( G* O( g( w
- jmp short get_wirte
6 _# W+ D3 G! I6 d - clear: inc al ; Clear ZR
% i/ H( Q. z( g& ^' R6 | - exit_write: ret
n' D! s/ k( k6 o x" _ - & o1 u; w. b; I1 M) }2 K
. C# [ M- X. j- u: I( C0 E- A20Read: xor cx, cx
! s" w& `' w! \7 K& w& r& x - get_read: in al, 64h & I2 m9 q; P, j- p
- test al, 01 ; If the 'output buffer' is full, has 4 p) b: n% V6 j! {
- jnz exit4 ; ... ) G6 ]: L, p$ H7 X# h
- dec cx
+ }4 n7 F8 W' k) N7 S5 N; b - jnz get_read
0 i3 E( g0 V8 U& V! Q, S9 T - exit4: ret 7 M Q0 F" W1 B6 B+ T. ?3 a+ u# y6 q
-
* r( }; f3 \$ E) Z - end
复制代码- ;A200FF.ASM 6 Y4 l9 ]1 g: H- J; b
- ;
8 O7 \6 n4 u1 K - ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01
* q) u+ r* f. Y- T - ; ml A20ON.asm ) h/ E, X* {. A( S
- ;
8 r# T% y- u, N+ w/ u" S" l) x. ~ - .model tiny
4 _# |$ W9 e* e2 j- n* s - .code
0 x8 {" G( y* S8 e - .486! D6 K2 ]8 h \4 j2 ?, l7 T
- .startup
/ t3 G4 f) P# O7 ]% c* v1 ^ - , c" r, F- v0 A- t# I
- mov dx, offset msg_author, |" W" ]( h* q' g
- mov ah, 09h+ s. `6 _- ~2 e+ {3 T+ y
- int 21h9 i8 J) ^0 K1 @% A3 i! O
/ v) F2 x5 ?/ H1 z! v- mov dx, offset msg_fail
2 e# s( w- j `2 `! z" M - call A20_DISABLE0 X! U9 U# Y( S# f8 J) g3 b! q( l
- jz exit1* U7 Q! i8 y1 L+ C+ i+ j
- mov dx, offset msg_ok ; T& Y- G) x+ L& s, s6 J9 |
2 o- K4 Z$ h! {! y. I# w- exit1: mov ah, 09h
, h7 z3 d( [0 \. C. L" _ - int 21h 6 @! L9 {8 [6 u: {4 R
- mov ax, 4C00h * A5 A- o. k+ z0 k: k, T! \+ B
- int 21h / [% R" t0 [5 U
- 7 a* D* ]3 q7 {
- msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
, K) ?& _7 Y, f) ^: G - "2008-07-01",13, 10, "$"
6 s$ m# H# l0 i5 C% L" [+ R4 [! X - msg_ok db "A20 Disable OK", 13, 10, "$" / K6 N, ~* ]9 r5 G
- msg_fail db "A20 Disable FAIL", 13, 10, "$" - A; ^; m" r4 T" V' ]( r8 C8 Z
" y9 I; Q% o3 W5 ~/ k- ;------------------------ follow code maybe make to lib, if you want...-------------------------------( ]' p' ~6 o3 q5 d ^6 p
- A20_DISABLE: . X( d( t# e; C2 g& ^. K k0 `! C
- call A20Write 6 u4 l8 M$ v0 y0 U$ s
- jz exit_disable8 J- v" @2 L$ Y4 G
- : J1 v$ v) Y5 q5 U% G9 v$ h% ?
- cli ; Only need for reading value from KBC 1 c& c8 W9 q$ ]# T
- mov al, 0D0h
) J) n% b7 u+ o1 P - out 64h, al
& v) @ U$ {; x - call A20Read + s% ~* _, z3 y: e. r. a( e {6 W
- jz Disable_int 7 x! \# f0 u9 y% |6 t" R3 r
" a+ z2 X" ]3 G& ]- in al, 60h ; Get current status $ u* X2 K. v2 |/ {2 b
- mov ah, al , p' T0 k+ G% I+ ^2 ]; c2 `7 _3 F
- call A20Write
/ z3 \7 p: Y0 E2 S - Disable_int: sti
' P. q. Z6 ^% P9 r, a7 d' k. ^ - jz exit_disable
& q' p7 G- Q' @7 j- _: S) u
$ l7 T" {" V9 ]! s5 B& M* E- mov al, 0D1h ; Tell the KBC , want to write to the
/ r0 c& U! L/ l* [( u5 R0 f% E - out 64h, al ; Out Put Port next
' k9 M8 u( h& a+ A- ?& M; n - call A20Write ! u" K( x, ?* F( P. y
- jz exit_disable; \4 z: K% Z. B" S2 g% I6 a3 m/ d
# }' }( n2 d7 ^' m; P" m. @; F- mov al, ah
4 A2 T: m- y8 D: {+ N1 D# W+ ]8 T - and al, not 2 ; Disable line A20 2 `4 }: \' o( [' s# R8 Z' P
- out 60h, al " T5 F, j$ V: a; |+ r1 d, X: O# A7 ~5 F
- call A20Write ' w! g- Q. L2 o( |2 q
- jz exit_disable
9 ^ P. t7 N) H6 g# V - 3 g* ]1 C) e4 B: p+ |' ~4 b
- mov al, 0FFh ; NOP
' A. K) I' ]( n7 Y* c - out 64h, al ; i( G3 A M: d7 P* J5 i
- call A20Write 4 p* P) r% `* c7 n( K2 W9 z+ z" }
- 2 g; ]! I/ O" g! H
- exit_disable: ret 6 d3 j' V( r' E1 B! W7 C
! E; h2 m2 W8 [3 d- A20Write: xor cx, cx ; Reasonable wait
# n0 m/ y, ^: ~; n/ | - get_wirte: in al, 64h ; Get KBC read status
, `! V2 R" Z" w' ?% G - test al, 02 ; See if buffer empty, bit 1 clear
. x. g$ T% p* ] - jz clear ; m; N+ a3 U) K! D$ D/ X2 R
- dec cx % b0 i& L/ v1 z& y
- jz exit_write
: l2 Y6 u/ N& n; M* G - jmp short get_wirte
5 V$ ^, e! v- `$ z - clear: inc al ; Clear ZR
9 B& l! A( F, s8 q3 v. @/ a: N - exit_write: ret ; E& j) K: k4 v* w( T
$ e( e$ l: P' [' Z
4 x, w* Y- m Z- A20Read: xor cx, cx
5 v2 U* `& A( d - get_read: in al, 64h 0 ?# O0 c) }7 ^& b# x
- test al, 01 ; If the 'output buffer' is full, has
7 C( k2 [% E5 Z \ - jnz exit4 ; ...
2 f h: o. G+ ~9 }. z - dec cx
0 \# \ c) U, c* f9 R# l B% B/ ` - jnz get_read
2 i( i$ i& o3 C$ [+ t - exit4: ret : n) F" ]$ H @# r, D4 C
- , |) `: [/ G5 f7 ]. J; R
- end
复制代码- ;A20STATE.ASM - V/ p4 _: {# e, a3 X' n& n( T* y
- ; ! x6 N4 e* g. J% X6 n
- ; Returns the status of the line A20 through the KBC
4 s3 q1 P! R( t- J2 ] - ; programming by bini for debug. 2008-07-01
, T" @) j4 }& p; I8 X ]' A- h9 e - ; + b! d+ N; F2 r6 @6 c9 \" x
- .model tiny" r% R5 h/ F' L- E
- .code, f8 {; R3 V0 r4 G+ X
- .486
8 w7 {: }) Z0 O - .startup
3 w' m. s3 A4 i+ _. b9 e - mov dx, offset msg_fail
" s- e" Y* S* a0 _& f/ G5 D5 E - call _GET_A20_STATE_8 z" `3 g$ q+ c8 b" f4 _( z' ]
- jz exit1 ; was a problem
& Z& f) R9 p* [ - push ax ; Save state, AH
, ^( L9 k% s d0 Y7 }: w2 _ - mov dx, offset msg_ok ; There wasn't a problem & ^* m. y2 i( Q% O3 T1 m$ F
- mov ah, 09h
+ m. y0 c Z/ H& K a% Y! C - int 21h ; Print message : p5 S: r1 I( {, g
- pop ax ; retreve state : f( W* s" {, f. h
* P! ~6 @2 x( v. G- mov dx, offset msg_dis ) C A/ t x( N6 I) l* @. W
- and ah, 00000010b ; bit 1, 2h, indicates state # y/ X) w' Q: X, k
- jz exit1 . M# i5 T) h" d. A: i: {/ v$ p+ W
- mov dx, offset msg_en
& [! e5 U1 ? U( k+ L2 q - / b- r0 ~5 G1 | P9 p
- exit1: mov ah, 09h ' y3 e2 W, l) d) p2 Y: P
- ; DX already contains address of string
. I! ]9 M9 v) H2 _ - int 21h
# z: T' [4 K4 _3 U z - 0 R% w' _. [0 @ B
- mov ax, 4C00h 9 a) ^0 l; M8 E
- int 21h + K8 j8 T- c0 a2 u# [+ S! Y
. S% Y: ]4 x( ~8 u& W& e- msg_ok db "OK", 13, 10, "A20 $" " V5 N. Z) \8 ~; n
- msg_fail db "FAIL", 13, 10, "$"
6 w3 N! [3 T: @+ o, j - msg_en db "ENABLED", 13, 10, "$" ( i# N4 c) C+ k7 v" m1 e( y
- msg_dis db "DISABLED", 13, 10, "$"% [6 b, h1 e" F/ l3 \% s/ U3 q/ D
- 2 o8 B7 _3 M) w2 H2 `2 c! @
- 0 K/ O4 z& R! O& l$ K Z9 I6 i
- _GET_A20_STATE_: $ V9 n; c l9 `% k
- call A20Write ; Wait till the input register is empty $ T2 H: ]: `# u) |* M8 s
- jz exit2+1 ; Bypas the reset int's
& n2 A, X7 @ a0 X+ a - cli ; Disable ints so we'll get our value
! H( h5 ~! {4 ]3 k0 _! W1 K* B - # j9 ?( z" z5 O& o. U/ ~- B+ g
- mov al, 0D0h ; Send command to the 8042 command register # k, ? J1 |+ ]; z; [) n
- out 64h, al ; to tell it we want to Read the Output Port
b4 |4 M6 f4 Z2 \ - call A20Read ; Wait till the 8042 output register 3 v/ e) K* O8 b
- jz exit2 ; has something in it's buffer 5 n& u* p' G" F t, M! I
- * h! U- A1 y7 }1 Q/ h
- in al, 60h ; Get it : h& [& r1 q% }2 K* j& Z
- mov ah, al 2 X) N% J( R$ z5 E) H7 ?6 G1 }' F
- call A20Write ; Make sure the input register is empty
+ F& c+ W" i: B6 e2 [! y& P - jz exit2 - q1 N# [ J$ B# _4 ~
) _0 A/ |% q2 m& [/ n* o* h+ H2 C- mov al, 0FFh ; KBC NOP command, does nothing ; Y# }! j# J& A, v
- out 64h, al
2 I2 w* k) Y6 ]! C) \1 w - call A20Write |2 u( X) F2 c& k
- 8 c0 V% `1 b0 Z3 Q* ~
- exit2: sti ! C y2 L+ P8 h8 c) x- m h8 w
- ret5 ]+ c! f6 o" o; s7 m
- / z8 @% r2 i" j2 }$ E
' N3 w* e0 `$ p: {7 `- A20Write: xor cx, cx ; Reasonable wait % ^4 q# w: R5 @3 j# I
- get1: in al, 64h ; Get KBC read status
8 f! X$ f: d% A$ f) {3 H7 k- A - test al, 02 ; See if buffer empty, bit 1 clear
8 v/ U/ T" d' B1 C7 K- ]" @ - jz clear
1 C+ [) q1 t. z3 o1 f$ D - dec cx ' G2 _7 N' B' e( Z/ Z* U( _
- jz exit3
/ l- x6 ?7 s: {8 P# V% K+ J - jmp SHORT get1
; B9 P' ]# q6 {1 G3 u1 g - clear: inc al ; Clear ZR 3 P2 r8 R% M7 u! h, U
- exit3: ret 1 Z/ U& w* T# S! L5 W4 n
- 7 V2 c: z( f, F3 c3 G$ p" V! b1 N
- 6 D+ A) \' N* u5 G6 Z9 u
- A20Read: xor cx, cx
9 \' [, r" i3 W9 m! \' @ - get2: in al, 64h
8 b$ w) n) c4 \4 g ?! e - test al, 01 ; If the 'output buffer' is full, has
/ d4 t$ _+ R M! S4 P$ N - jnz exit4 ; something for me l/ t8 J& z8 r" c; y% K) [
- dec cx 1 ^8 y9 N0 A% O) u7 v
- jnz get20 _" A' y0 R" v( A# D% A' D4 p5 r2 `
- exit4: ret
4 I/ b+ Y6 k& G2 T6 u: s! \) Q: g - 8 o1 w- B; A& Y; u% w+ w L9 u
- end
复制代码 |
|