|
|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM . Q: R& x9 j1 R; J
- ;
7 F& h* Y( m/ R3 X3 t" n* ? - ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
- X3 g9 ^2 |$ b8 I% d - ; ml A20ON.asm
- W0 R% A0 o+ A7 G - ;
3 k. j2 v4 I- ?* ~( d1 E& b8 z - .model tiny
1 D O4 p) a( ^. n$ K - .code8 f% H7 _- v0 C/ j1 w: ]
- .486
. }7 H" d' F5 m- J: o; Q" G" u - .startup
( ?1 ?$ {3 k+ Z - 0 p$ D# t- q( A! R7 X
- mov dx, offset msg_author
/ C8 n2 W/ q U/ `& C( p - mov ah, 09h
' Z9 H* E/ a) i - int 21h9 U& k0 \3 {6 j$ L e1 {
: y' d5 v% T2 D5 l- mov dx, offset msg_fail : k, y9 d( h, y S
- call A20_ENABLE Q% i! l' c4 b: q. I' |* j* O( H; \
- jz exit1& f5 c) y4 ^" h, C' w, Z
- mov dx, offset msg_ok # U9 V& |3 N9 \2 L
- * ]! G' K. R; Y) l! f
- exit1: mov ah, 09h " r3 a' [: ?8 E1 i6 J# I3 x
- int 21h " R# o4 f, I6 O8 K# c2 T
- mov ax, 4C00h
' E5 ^+ m0 r3 h3 b - int 21h 5 M0 H' d8 v+ C# z: k9 f1 i( i$ k- ^; t
- 8 K( J$ f* V% t$ d# [
- msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,
) B; S9 H; q7 }- _' p- A- d/ a - "2008-07-01",13, 10, "$" 7 M2 I3 u# u0 t- l
- msg_ok db "A20 Enable OK", 13, 10, "$" ! i- Z! R+ H; {: s
- msg_fail db "A20 Enable FAIL", 13, 10, "$"
1 q4 E% _- O. O. I2 i- W; _9 g - - X. @+ o/ J2 ]$ ~! N# {& _
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------
! Z7 v5 |/ i* V! S' o - A20_ENABLE:
3 ?5 w1 w; r0 m0 N - call A20Write
6 ^4 Z/ c, q( g, t! f - jz exit_enable$ f" w, x9 m& j$ j; j$ r
- ; Y% w) ^% R; M* s! }2 C
- cli ; Only need for reading value from KBC
# _% \, a* f/ W2 c6 ]$ Y) Y7 u9 K - mov al, 0D0h . ], {- P' s; [) K* w
- out 64h, al
8 L) p; N; X; u* S - call A20Read a* M# U3 b5 ]
- jz enable_int 9 c7 r$ U7 U5 B4 f9 \! f
* W& P$ ]" w5 ^1 W7 f, D1 {- in al, 60h ; Get current status
) Z) t1 Y, c' e - mov ah, al
2 K7 [. o& y3 u- g7 @ - call A20Write
?8 A3 X1 [( g6 U x - enable_int: sti
" T ]' i. L9 ? - jz exit_enable
, E9 n+ @* I/ T1 A" D }3 u; O
# S4 z7 c/ g1 M4 x, Q- mov al, 0D1h ; Tell the KBC , want to write to the 7 H0 E" z, C8 Z- b% N: r
- out 64h, al ; Out Put Port next ' G4 w. `( s2 K0 y7 h, |
- call A20Write
7 T) J! h: ?* b# t5 ] - jz exit_enable2 p+ G; U/ }' Z
: E9 p- ^$ N( c- mov al, ah
8 g. w# N+ o* U- U8 U - or al, 2 ; Enable line A20
, D3 _+ t. l) ^. \ - out 60h, al ) c9 n+ h' Q7 z6 H' m3 U8 k
- call A20Write 8 }; I# j6 p5 u4 D3 ?
- jz exit_enable
6 A* y9 c B A7 U/ e - 1 s+ r) i8 e' ]/ _
- mov al, 0FFh ; NOP # ~2 ?% Y4 ^, K/ W6 [
- out 64h, al
$ o! p& v) e9 m { - call A20Write , E M! ?1 P4 R
- - V. P, A! |3 l6 i% @
- exit_enable: ret
" ?0 m, l$ U7 o: y - 7 P" e4 p0 @8 X9 |) W
- A20Write: xor cx, cx ; Reasonable wait
$ S6 E* k% A1 ~8 O3 e - get_wirte: in al, 64h ; Get KBC read status
! @) Y! g# L1 G' @6 Z) h - test al, 02 ; See if buffer empty, bit 1 clear
0 H% R4 G7 z# `: y; E - jz clear 0 F* f$ y7 x' C4 v
- dec cx p2 A0 {& {! p4 h! W& M. j/ F
- jz exit_write & f: J; Y$ r9 x
- jmp short get_wirte * s/ v6 u4 Y* M3 Q5 M" [
- clear: inc al ; Clear ZR
# B- y# @8 ~$ l4 \ - exit_write: ret
2 h. Z+ F# |3 a" d1 l7 I/ o* y5 ?- |3 ^2 Q - ' P, \- V3 ~" c& a
( C& \* Q- s* f9 g6 S. L) ^) ~- A20Read: xor cx, cx # Y7 \' {" _7 z' b* P' O; y9 y
- get_read: in al, 64h
( O5 H1 W& |; o" \# W7 K - test al, 01 ; If the 'output buffer' is full, has ( O) V& Q0 }- l( Z4 O
- jnz exit4 ; ...
! R( E+ P% d' N - dec cx ) q5 U( j9 O1 Q
- jnz get_read
2 v' w/ q4 W9 V - exit4: ret $ t$ b2 c/ r- q1 J7 G( ?
-
) \ M7 u1 f# ~, I" R - end
复制代码- ;A200FF.ASM " P2 `% `9 e K1 y( n3 ]+ H M
- ; 5 _* u+ u) H8 Z
- ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-011 ]+ r9 e% W2 q. \" B1 A
- ; ml A20ON.asm ' O0 T, h7 [& y4 r: t
- ;
, }: x' E; s8 }2 ?3 s$ T - .model tiny
; k' V# W+ e: i3 ]4 S - .code
0 i1 p; I$ H, G0 K$ t - .486
0 Z7 o# ^# j2 k6 E2 O4 t - .startup. C# ?( K0 v- H$ B0 N5 ?; H z
- 0 U$ U: o8 Y+ f
- mov dx, offset msg_author
' `. J( P, q& M% k& P. C - mov ah, 09h
- [+ y, S7 y0 p3 U( c& J7 E - int 21h& H, Z9 i- O! Y
- 7 `% }! v; o U- b! V/ C" Z
- mov dx, offset msg_fail
2 T: E' l) c8 _. Q - call A20_DISABLE
1 f3 F& u* Q# P+ j - jz exit1: W( {0 E1 u" j" J
- mov dx, offset msg_ok
0 L4 @! Q' R/ ~3 ~
# @5 {2 @0 D* T, e: Z1 y- exit1: mov ah, 09h 5 \" s/ P! n! T0 ?0 @# Q9 D
- int 21h ) m# e2 {0 H8 }8 D8 q% Y1 i3 s! U
- mov ax, 4C00h
$ z' ~" q) d3 q - int 21h 7 C w- y" E, x0 ?7 t+ T5 u
- % l" F4 G! H* P/ _) C
- msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
% a1 k/ u9 i) I; Z2 m& v- O$ x - "2008-07-01",13, 10, "$" * {7 _5 F; H" a$ d3 Z5 `! W0 K( ^' H
- msg_ok db "A20 Disable OK", 13, 10, "$"
' w* D# b7 Z& j2 g1 O, m4 D- C - msg_fail db "A20 Disable FAIL", 13, 10, "$"
+ W8 F1 ]( s5 K% K4 u8 O) m, \
) f4 a% @ e) t. p: i: n- ;------------------------ follow code maybe make to lib, if you want...-------------------------------
' C2 w9 l, R2 Q2 D4 w - A20_DISABLE:
4 E3 m9 _( r3 o$ Q) v. \# n+ d - call A20Write
$ n( F7 x) J+ L' X3 T - jz exit_disable
+ U2 P6 z+ \! D* b, Y - 9 ~* ~0 Y0 K! K- u9 Y# }5 p
- cli ; Only need for reading value from KBC
2 j$ K A% a" _3 s - mov al, 0D0h ( L# J0 e. c3 Y6 K( j( X
- out 64h, al
/ U M" M5 H6 a2 {: z; V - call A20Read % B* w/ u; k1 C6 @
- jz Disable_int
4 w, \7 J4 r2 Q& V/ Q" \( I5 l' y
' f. M/ Y5 F+ b4 ?8 _2 }9 k- in al, 60h ; Get current status ! K# A* [3 [! N; g: ^- \3 N
- mov ah, al
1 q8 A& t5 a. L, r3 A1 p1 K - call A20Write + T* a/ x" \! o- P, k9 v
- Disable_int: sti : G* n% `/ P$ o
- jz exit_disable0 g9 k2 F1 q2 O. S
9 m# T W! e4 C0 i% [9 Q1 u- mov al, 0D1h ; Tell the KBC , want to write to the
, E/ k- w# _9 p7 \& h$ o* S - out 64h, al ; Out Put Port next * @3 E o* o6 h) }
- call A20Write & q* B- L$ f; T# n6 r5 `7 I
- jz exit_disable2 ^3 n/ C( _* ~3 B% M) {8 E
- 1 b: u, S; i! W$ D
- mov al, ah
) R0 V, x5 s, x+ L - and al, not 2 ; Disable line A20
! Z/ A0 {( a) T4 F+ r& C - out 60h, al
& ^9 a5 d9 F: ^ - call A20Write / ^# @, i% Q3 x% y7 [/ \- r
- jz exit_disable/ U: O9 t M0 A7 K8 ^0 q6 D
- # J1 C* w$ x) s0 N, ~ ]
- mov al, 0FFh ; NOP
3 g% r' U9 X# k2 P! V. h" O, D - out 64h, al
8 [8 \7 ?5 r+ j - call A20Write 0 E6 ^2 y4 A# ?) D
- 0 j- g- E# |5 r- R0 K8 ^
- exit_disable: ret ! l; j D) Y n
& ?7 K1 \) c- f% N! f, m$ b- A20Write: xor cx, cx ; Reasonable wait . Z' Q! r0 m3 c: `# i! F
- get_wirte: in al, 64h ; Get KBC read status $ N% n) }( t8 S% I3 \$ m* u* h
- test al, 02 ; See if buffer empty, bit 1 clear * Q5 t% L6 `, ^# P
- jz clear 4 w. E& @! }4 a" S" `% m
- dec cx % k I0 ?. b0 d# y
- jz exit_write - k1 R2 T. E1 n2 s
- jmp short get_wirte
, T4 z B: G4 V - clear: inc al ; Clear ZR # O- Z% y* i) w- w) @; Z. W: W
- exit_write: ret
$ a- @- z8 A/ P( i6 v
: N! m% {5 S! t+ U' R5 p+ d0 g5 [- ( t( H% u L( {5 Z
- A20Read: xor cx, cx
& f9 C1 E* a# ^& S( r# n - get_read: in al, 64h ! }6 X& D- D( C
- test al, 01 ; If the 'output buffer' is full, has # |4 n$ [1 Q+ z0 v h& R/ m
- jnz exit4 ; ...
, Y/ Z- }& {; `1 f8 E2 y1 j( e - dec cx g. q( l5 d: ]- V! Q" G* A3 d
- jnz get_read
7 t9 Y4 W- R/ y* N& h. d$ j: p$ Z - exit4: ret : x! ]1 \7 c) b% ^; a, }$ V
-
6 \' b" ? L! v7 Y/ ~3 s - end
复制代码- ;A20STATE.ASM
+ u0 S0 g$ b; h3 I - ; / I* f0 Y Y6 J& [
- ; Returns the status of the line A20 through the KBC
( C2 v+ N. J+ d0 U$ n9 P - ; programming by bini for debug. 2008-07-01$ M/ g: c. }9 F. h0 X9 ` B9 |
- ;
, w0 x G1 V" X; z, b - .model tiny% u/ a7 M0 e$ c8 ?: z5 a' x7 k
- .code. p7 }6 D% z3 m' h7 u1 f
- .486) H3 X3 b0 V6 Q8 F( B! _: S
- .startup" u1 z+ g% v% q: }$ |. b$ N
- mov dx, offset msg_fail
9 o! L2 h5 O& C& [$ q - call _GET_A20_STATE_
; a- M( U6 } {- \ - jz exit1 ; was a problem4 b4 I$ r, x- c
- push ax ; Save state, AH f$ n( A Z# r% N
- mov dx, offset msg_ok ; There wasn't a problem 7 s- R- z. b/ @/ q" v! _
- mov ah, 09h
& Q) p5 q6 U, d: F6 t; U - int 21h ; Print message , v7 i( d- ? U8 h1 N+ a
- pop ax ; retreve state 3 S6 C! _/ J3 H- r `8 n3 O) `
; F7 W' ?0 _8 g4 E& P- mov dx, offset msg_dis
: i: Q9 t* D7 w+ Q - and ah, 00000010b ; bit 1, 2h, indicates state " n3 b7 d+ @9 l- ]1 ]
- jz exit1
" }8 d8 f* t n - mov dx, offset msg_en
1 {9 k+ Q W Q K1 Z* \! J) f
) U% o' [- W# U/ m% y- exit1: mov ah, 09h ) w- A3 `& x3 i; ]+ w0 I
- ; DX already contains address of string
+ e/ j" _- X+ B5 z6 s - int 21h ( E5 T `2 @) h5 Z( [5 S' C
- ! K+ b9 z' U: B0 M! f# i$ {7 |
- mov ax, 4C00h 4 a1 x* I) [/ ^5 }$ s$ d
- int 21h 6 G% {- f$ p* C- Q/ ^3 v
/ l/ A5 W# p9 d- msg_ok db "OK", 13, 10, "A20 $"
! ]' E5 U3 d* B- |& u0 o8 i6 ? - msg_fail db "FAIL", 13, 10, "$"
4 X P$ y: S* P. u. B+ L5 p) I9 | - msg_en db "ENABLED", 13, 10, "$"
8 K7 O4 e& e' G - msg_dis db "DISABLED", 13, 10, "$") I% J- `3 H8 C C4 o5 |4 b
5 o4 }# `6 w+ c2 `7 U7 R-
. W( j5 {6 g- ^8 u+ ~5 ?: F - _GET_A20_STATE_:
) F( n3 K) k: m% T+ b2 \ I - call A20Write ; Wait till the input register is empty 2 ?& f4 Y4 s" { Z1 [
- jz exit2+1 ; Bypas the reset int's . s4 n1 U9 o( y, c, i
- cli ; Disable ints so we'll get our value 5 L: p$ C1 u8 i2 S
- 4 \' a @' F3 A
- mov al, 0D0h ; Send command to the 8042 command register . p0 F9 a" s z
- out 64h, al ; to tell it we want to Read the Output Port |# n4 ?& g4 Y( B
- call A20Read ; Wait till the 8042 output register
- ~$ V# J( X- `4 h5 r5 ~$ p - jz exit2 ; has something in it's buffer 6 |/ b6 c& O7 M2 [2 Z
- 3 s+ l* w4 x4 x0 n2 K( s+ Z7 M
- in al, 60h ; Get it 3 X# |. H6 L8 ^* ~* [3 C& ]
- mov ah, al 2 Q5 d4 M4 y) ~( o' S3 z( l
- call A20Write ; Make sure the input register is empty ! ]7 B4 f- v+ x) J: p
- jz exit2
3 P( G0 M( G* b$ I6 w
+ C9 T: C' h j7 D+ |& k6 ] F- P- mov al, 0FFh ; KBC NOP command, does nothing
3 p( P' j( s q) R - out 64h, al 5 I% u7 M) ^$ m, K
- call A20Write
; j" @1 z2 u, H4 T' `! D' S( U - ! s% o) M5 x! A. z
- exit2: sti
I4 G. C9 \5 b" Z9 E# x) F/ l - ret
, o, F, @$ ?9 @& F. M6 W
" J7 I# r% i8 Q- ' V ]9 _9 A7 {7 Z% n
- A20Write: xor cx, cx ; Reasonable wait 6 W7 n& H( q# o- N( t
- get1: in al, 64h ; Get KBC read status ; V) r5 N) v; q" l6 H. m
- test al, 02 ; See if buffer empty, bit 1 clear $ O/ I! p) M% V! g& J
- jz clear
: Y: Q% @7 r( ~% p# H" O/ }$ q - dec cx * [# v; t# b6 ]& x( _. W
- jz exit3 / m5 @. D; t8 m+ Y1 z
- jmp SHORT get1
' y0 c u, G+ x& t- h) i! i. } - clear: inc al ; Clear ZR
5 C2 m0 J; b o5 J - exit3: ret 9 D& A! n H. U: l
- & l h" |" a& `' O+ n! X3 O7 K
% p, k1 {) J- W! B) Y- L9 r- A20Read: xor cx, cx $ I" l) }1 N$ X5 ^ ]
- get2: in al, 64h ! w7 o/ n" X& p- H# L3 K+ `9 S
- test al, 01 ; If the 'output buffer' is full, has
N7 D! c9 S/ d1 H - jnz exit4 ; something for me
0 i% s! a5 i9 y5 K( \5 J - dec cx : v$ i( D/ u( A' Q" J9 W
- jnz get2
2 T- A# k% r: u7 D! P2 ], g1 k9 I& d. s! s - exit4: ret : \3 q0 A' R1 ^0 V0 h' E
- 3 G' s$ O8 S3 k9 e% p
- end
复制代码 |
|