|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM , L' R% Z3 K% {# ]* l4 |' m; \
- ; 0 {/ I* s8 b5 {0 K2 a/ o
- ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
0 y, X- n/ W) ]( C! C0 l2 g8 k - ; ml A20ON.asm ' n: \8 C" k& r: o2 ^; Q
- ; ; h& V' Q7 m L. Y; ?4 F
- .model tiny
2 I$ ^# w4 G g2 [$ T - .code
6 N+ z7 G1 C+ } - .486# z7 p1 p3 h5 f' Z I
- .startup
, F+ u o! B7 o" \3 Y - 7 f+ [5 I- i7 i7 H& }+ p
- mov dx, offset msg_author3 H3 ?. f0 v9 I' @. J! x6 o
- mov ah, 09h* R! f4 t5 \1 J( K1 \! w- I
- int 21h
# l9 W7 n% x: z/ f6 y/ p `9 @; r* @& I8 f, a - ) f% U% D. B0 j' ?; v# k1 m# X
- mov dx, offset msg_fail 5 c X2 f' u1 @
- call A20_ENABLE- O' s4 O) y* S7 w c
- jz exit1) [, `: j$ Z( a" l1 t4 x
- mov dx, offset msg_ok ( e; r0 X9 Q; N! O3 p$ R- I
. Z0 `' e5 @4 b" G+ Z/ Q9 I( e, n- exit1: mov ah, 09h $ x; k5 a5 e# F/ k- b) e: L
- int 21h $ I! Y3 J# G: o' [
- mov ax, 4C00h
2 K* e- K. S C# g - int 21h
2 H/ |* F2 R( A5 N2 i -
5 O+ y- B8 q/ j. g - msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,: ?1 X3 Y5 P( O
- "2008-07-01",13, 10, "$"
5 X$ J9 z% ` j& ^1 `* u5 R - msg_ok db "A20 Enable OK", 13, 10, "$" 5 N3 w, i1 q# T) N& E4 W& b
- msg_fail db "A20 Enable FAIL", 13, 10, "$" : `1 _1 j, m( V
- / h) M* h" r# |* `( s* J
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------- {5 J* W% E7 i- l; t0 r8 [# S% k: q) o
- A20_ENABLE:
, |+ y6 s$ ]: q2 b+ C7 @( ^' E - call A20Write : b* ]! I7 X" L# s
- jz exit_enable! ^: W; p) ]9 e2 w- m( f
- / ?( d( q2 Z2 u% `
- cli ; Only need for reading value from KBC ; p% P, _! x( r; L
- mov al, 0D0h 0 _$ X7 |# [! c: s4 g* X0 X
- out 64h, al
; A7 V' l: o/ g; h+ M6 j - call A20Read
8 \ f* r9 w! D - jz enable_int 9 x @- E3 R( [5 F t
- , o! M( ?. q0 ^
- in al, 60h ; Get current status
% h- O; o& p/ p2 t7 a - mov ah, al
; ]/ l4 O1 a8 w0 @. p' X/ [/ W( T - call A20Write
v% ~9 x/ ^3 |& i2 |, G - enable_int: sti
) \1 L9 _' a' [9 S - jz exit_enable
& q, a) M# j; k9 I* r6 z
; q$ P! y: N4 k$ J& `; Y `- mov al, 0D1h ; Tell the KBC , want to write to the & f4 _" v& D8 y. @! A j- m
- out 64h, al ; Out Put Port next
: i" ?) [! \9 t+ A9 b* d - call A20Write 5 W+ }! M: @ ]; I1 J
- jz exit_enable0 R7 @+ D3 m% L1 n% S' N( l# C
- ; M0 _7 x m& n7 |! o Y
- mov al, ah
0 B4 h: r: R) f; G7 r* o& e - or al, 2 ; Enable line A20
3 m! C" K3 p6 h) \8 u$ a" _' ^# m: Q - out 60h, al % |: n8 b5 L+ p+ R' N
- call A20Write
: P7 X2 U+ D, l2 @ - jz exit_enable, w# o$ G% y3 q5 |0 Z( l
- $ J7 M! R' a* s- W
- mov al, 0FFh ; NOP
* b& q ~* ~" B - out 64h, al 0 Y+ X3 U& U' _& Y2 |/ Q/ v: |
- call A20Write 0 X4 i& P* \, Q* C' b* t5 q
- 7 j2 W7 y2 P0 M: r, B: C+ P; p
- exit_enable: ret 1 l( a2 R' K& g+ ?* J% W: c( Z% a
- 9 O: ]+ w- o2 V' w( @4 M- A4 |7 y
- A20Write: xor cx, cx ; Reasonable wait # K$ D/ o* v: y: \! q9 A
- get_wirte: in al, 64h ; Get KBC read status ' Q& Y( [( R+ h( p& _4 p& g( u
- test al, 02 ; See if buffer empty, bit 1 clear
- M6 e8 b) }: x! Y4 K" h - jz clear
7 L9 _5 e# b2 q! X4 p, J& z - dec cx 2 m. L6 ~% v* S0 @3 ]0 c
- jz exit_write , y1 f5 p9 ^. e+ J
- jmp short get_wirte
7 e3 O$ r! K6 m0 n: F1 N$ h: ~ z - clear: inc al ; Clear ZR 2 k* I) y% z! Y. d4 u
- exit_write: ret : |/ U' m& L& R
- : a0 V, a% S% w/ P
- : H. u* l* k+ _6 i. F. x
- A20Read: xor cx, cx % A/ Q! K+ g$ A) ]% @# ]
- get_read: in al, 64h * Y5 S% e5 t" o8 p! c$ C4 O1 i% _5 E! \
- test al, 01 ; If the 'output buffer' is full, has 9 b; V* a/ ~. b. \' w5 ]/ Q" H
- jnz exit4 ; ... & ^' @+ r/ U. c
- dec cx 8 [9 q% o4 f5 ?. \. v7 D* A
- jnz get_read
# v' R$ O/ t, Y0 Q. K8 \ - exit4: ret + k' U6 E4 o% o3 d; r; N Z
-
5 g& H$ k) l9 x: f ^2 q - end
复制代码- ;A200FF.ASM ( {) A' j, J5 `: t
- ;
+ E, U' |% v& P/ z8 O - ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01! z# P4 b9 N( N* c+ |
- ; ml A20ON.asm ?- c1 k& \! ^, Q: Z8 y
- ; ; Y1 z3 E+ E' b; h3 W! F8 M2 `
- .model tiny
. l( D5 E. Q- V8 J7 S - .code/ v& a. p; @' I: J/ N
- .486
8 B8 c- l( x, V$ Q - .startup8 L+ D* g. t6 x: G0 W4 Y+ a& H
- ; |& {- u' W$ R7 Z% J
- mov dx, offset msg_author
/ C" p+ c4 K0 `+ u% l# B4 I - mov ah, 09h( @6 a( G) ^- a4 q- Z9 x. I
- int 21h) v3 E& Y7 s6 C& k. f
- % d) e$ \" t' h' K' C' N1 N
- mov dx, offset msg_fail
) R7 C- t5 w7 O4 ?( @( z e - call A20_DISABLE
# n9 h7 ^ z; q; N2 O - jz exit1
- P u# B" |, A% f J2 @ - mov dx, offset msg_ok 4 z a+ n! [1 B2 O$ i
. p) j6 H) p$ ~5 j* P- exit1: mov ah, 09h & b3 x5 i3 j+ b3 P6 E8 F8 f
- int 21h
f7 A6 G: b) K( M$ R - mov ax, 4C00h
- A7 U5 m! v1 K% }, K - int 21h
* w# z! a" x& [# _/ n - $ A, \* H" e. \" p! d t
- msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
' G$ T2 q& D+ V - "2008-07-01",13, 10, "$" , L4 i; J$ J1 C, P5 T
- msg_ok db "A20 Disable OK", 13, 10, "$"
6 q2 I9 T4 [* I - msg_fail db "A20 Disable FAIL", 13, 10, "$"
% f [, E9 b. O! b9 Y
% Y3 ~+ \7 J- r R1 Z6 {- B- ;------------------------ follow code maybe make to lib, if you want...-------------------------------
4 f6 v- y3 N0 \3 i" A - A20_DISABLE:
/ N! B2 l, O2 v - call A20Write ) ?6 F. F0 ^% {: v( c
- jz exit_disable7 Z0 W3 v% V7 a* l2 G) R8 X
2 t+ s* q6 {2 `. c3 m- cli ; Only need for reading value from KBC
& R; f, m* z6 T; ? - mov al, 0D0h 1 z; F9 F* v* N/ v! x: O1 R6 {! u0 L4 h
- out 64h, al , h9 W b; l# B6 m
- call A20Read
4 w( f5 g' q4 T6 Y' B+ f9 c- d/ S - jz Disable_int 2 P6 C" O6 z; \( {! N j$ @
/ ^: A. Y* s3 g" R. P7 \3 j- in al, 60h ; Get current status " U9 m( R0 Q# \/ X. U5 S) M
- mov ah, al 9 e1 z- d6 x u/ s1 v+ `/ v
- call A20Write ( Q5 a1 ?9 N+ x; N0 M( r* T5 g
- Disable_int: sti
: C; f. e1 x" N6 i/ u C - jz exit_disable2 O+ e; j* R, a& t7 `5 c/ }/ q
- # y9 [% c, b% X
- mov al, 0D1h ; Tell the KBC , want to write to the . P1 P2 [" X5 ]/ j6 X
- out 64h, al ; Out Put Port next 7 m# F/ j! G2 b- p5 [
- call A20Write ' p- w% [7 `4 k
- jz exit_disable1 h5 `' `+ I0 k6 M% N+ }% o$ g
- - N8 Y, B- x7 X. {
- mov al, ah 5 S% l8 x! ~* k3 P. r: Z
- and al, not 2 ; Disable line A20
3 G+ W* }0 I* m# l9 S- ~) O, z - out 60h, al ( q8 B) f- \- |+ {
- call A20Write
0 |! ?9 E8 _/ _+ M9 g8 E% h - jz exit_disable. O2 q; C3 ?& M7 s$ G) W/ k: W J
- 4 F Y e4 s# Q$ J+ V
- mov al, 0FFh ; NOP 9 H, n1 E- X: N! m7 }
- out 64h, al
, \$ U$ w1 |$ _, U - call A20Write
8 m2 W2 X1 Q# q/ N - ) E3 z( S, N$ w) n, J# J
- exit_disable: ret 6 A' N: l* U& r1 @
) i( H$ d6 L/ K3 |& k; v- A20Write: xor cx, cx ; Reasonable wait . U7 T' }4 N2 o( i/ F( x
- get_wirte: in al, 64h ; Get KBC read status
# Y; L4 N+ I8 u5 W. o - test al, 02 ; See if buffer empty, bit 1 clear ; \* k f* E9 H5 S
- jz clear
7 r x8 B* a2 _2 M# e& M9 g - dec cx
8 O2 B9 X) D( N4 x/ z - jz exit_write
3 ? R; J; I, Q5 z+ ]; W# @ - jmp short get_wirte
) h# Z/ L4 k& a* [3 K- N z - clear: inc al ; Clear ZR
( x! X! t& W) R3 j9 l/ M2 B8 \ - exit_write: ret 4 k3 |& {& @* L L( l
1 |1 i- u4 l, c( K0 ?7 s
4 k7 b" [( |& Q* K- e0 [) \- A20Read: xor cx, cx
* `7 M8 ?8 o+ y4 r1 Q& E - get_read: in al, 64h
; B! \% [* `6 B: M3 |, ^$ [5 B4 V - test al, 01 ; If the 'output buffer' is full, has , _* A( c, R* X* c
- jnz exit4 ; ... , ~5 H/ G) Z C% j o& e
- dec cx ) [0 T. f6 Z" X9 y
- jnz get_read+ B! ?, M# C2 l" m% s
- exit4: ret ( M& c$ \# l8 ~3 _' d* F
-
6 `6 N* R$ S$ [# n) q - end
复制代码- ;A20STATE.ASM % O- I' T& ]6 L8 c" b# Y
- ;
9 h' x4 m; ^1 } - ; Returns the status of the line A20 through the KBC
) A& f4 B* i; i2 Z1 |" G8 a. { - ; programming by bini for debug. 2008-07-01
# S2 r4 T6 E5 I0 \# K! F - ;
+ I- m+ m* V9 i9 y4 ~* Q - .model tiny
1 B) E( `0 {* b4 ? - .code( i" A$ ^/ h2 r) p" h8 k& n, Z+ m
- .486
/ r& l; l) w( s. `* q - .startup9 z8 w( y9 w* J
- mov dx, offset msg_fail " e( X% U% S( h; M6 y! Q2 j
- call _GET_A20_STATE_
8 |2 c/ g, i) S4 o# G7 n - jz exit1 ; was a problem' V- d" B; v5 x+ @, t
- push ax ; Save state, AH ( v& L8 f( d# |! x3 i
- mov dx, offset msg_ok ; There wasn't a problem
5 a! k5 L' o. L) g& N! x# B' V( h6 ^ - mov ah, 09h . d# d2 `1 M9 z6 y* l& ]5 V$ D8 e. ^1 c
- int 21h ; Print message
6 L8 k( E; M: u {* s7 G - pop ax ; retreve state
+ l4 m! @: L6 G5 V( L
3 t. k' F. }- E1 v" i. G- mov dx, offset msg_dis
* q# k" w; G1 C4 n8 ?2 q6 ~ - and ah, 00000010b ; bit 1, 2h, indicates state
$ @" @6 T0 b0 T* a, h# A - jz exit1
: O' t- l+ m( s4 ^ - mov dx, offset msg_en
0 P: `6 T W' [4 U9 C5 b+ b
! ~" h' @6 `% h& t3 O- exit1: mov ah, 09h $ L$ A3 g }' t9 K+ x3 M8 V/ m
- ; DX already contains address of string
2 V# M$ s2 P8 F( q# @; a) K: v' ` - int 21h & W9 x0 D- L* d) V v5 q$ R
! V* p* \% q0 p' R' t! S9 F5 N- mov ax, 4C00h ! |' @! X( U, z8 ^9 b6 J
- int 21h ) U* r# w. S7 ~5 m. P
- $ d8 R4 y2 K a* K) A4 T, C9 x% l- F
- msg_ok db "OK", 13, 10, "A20 $" - ]' V7 l& H( M
- msg_fail db "FAIL", 13, 10, "$" : T% r- N, b9 G5 v$ z
- msg_en db "ENABLED", 13, 10, "$"
& @% n3 F) w0 k0 N - msg_dis db "DISABLED", 13, 10, "$": y: t# r8 b8 z1 R T3 {6 J4 L
- : E' e6 l; b$ ]1 G" P S- Y
-
- K( y8 d/ H, f+ Z! j w - _GET_A20_STATE_: 7 E# u7 L4 y% W& R
- call A20Write ; Wait till the input register is empty * C" O& t4 e1 x" y9 K% M" r4 {
- jz exit2+1 ; Bypas the reset int's # h' e9 i, v4 Q
- cli ; Disable ints so we'll get our value 0 M' W2 @1 ` G; ^- o5 J
- ' x' L( ]3 S8 S6 o/ X5 S
- mov al, 0D0h ; Send command to the 8042 command register 3 X, a$ L- l* x! p0 q
- out 64h, al ; to tell it we want to Read the Output Port
9 L0 H# i# b7 l - call A20Read ; Wait till the 8042 output register
1 H. y1 B- s# D - jz exit2 ; has something in it's buffer
; m* i# `: U+ V% A. q
. ~, W% O# B( J) T7 R- l- in al, 60h ; Get it " Y, \" Z' _; M; c, T
- mov ah, al * V+ b4 \- H5 \+ s
- call A20Write ; Make sure the input register is empty 0 i$ ]) {$ l( [" z9 P+ b1 u4 m) |
- jz exit2
) `) t& o# }' G& q
3 C9 r5 P& h9 v# `& P- mov al, 0FFh ; KBC NOP command, does nothing 1 U+ [/ A/ c$ L* a) u- z- D
- out 64h, al 5 a, |. E, n* M: h
- call A20Write , t- B' D. B9 v. A; c( C3 ]
- $ N6 k9 t* X0 e' E' O: `0 B
- exit2: sti
6 z5 e( r4 P9 y0 ~0 F& C. Z! I2 {, g" } - ret2 K; ~4 v" R. m1 S4 t/ ^& Q' C, P
$ T7 Y+ F" ~! P# I9 s3 \2 L
5 |* @' \( d4 P) V( G- A20Write: xor cx, cx ; Reasonable wait + X% ~7 K9 o: {' [' o5 p3 u) U
- get1: in al, 64h ; Get KBC read status
* |( ?0 |& C4 e7 Q+ |0 w - test al, 02 ; See if buffer empty, bit 1 clear
8 N. W+ C5 ~- f& T8 v! D - jz clear . I! l1 g9 l) r# O3 ?
- dec cx
( O& s( p& ^/ }, v" q' @. f - jz exit3 2 C8 L5 N; D1 N, w" f% R+ w
- jmp SHORT get1 " J( J6 L/ w8 t: ], }$ |
- clear: inc al ; Clear ZR
) C& q; O4 }" j2 v - exit3: ret 7 \5 m+ n! l8 i- z, P+ Q7 u
- , t6 k. l# P' x" \" ]9 }, \
8 D* F. `" T+ b- A20Read: xor cx, cx & \3 g/ N; }% H3 `* t0 c
- get2: in al, 64h
4 x$ r4 i$ X6 M* { ^ - test al, 01 ; If the 'output buffer' is full, has 2 u) h/ C/ N1 }8 w7 \
- jnz exit4 ; something for me
$ p. e$ D; P' p4 {5 e E - dec cx + Q: M, C" h# @
- jnz get2
7 |' y8 }" z2 L9 k+ t9 j - exit4: ret 2 k( M% I. x1 o, X
-
: C& H1 f ]* o - end
复制代码 |
|