|
|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM 4 p6 N" B7 E, r6 q& S- n
- ;
' S1 |% ~8 A: G9 T4 Z - ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
9 ~. z8 Q! s! q% S$ a) T; _$ I* G - ; ml A20ON.asm
9 h9 j& U0 F) [1 W - ; ) m x" ]1 `7 m, K: D+ p; K
- .model tiny
* u" c( h! n' M6 \8 h - .code, S$ ?6 v; A* z( M) m7 U$ @7 @7 S* [
- .486
! O# |0 K% i1 o - .startup3 O/ c% ?" O2 P/ Y P) p5 [
5 x1 q; u- e' D3 q- mov dx, offset msg_author
. ^, X& A5 j6 B - mov ah, 09h& H8 R9 ?4 j3 `) s1 }4 ^
- int 21h% e q$ \, j/ ]) `
. U, @: t6 X$ ]) O- mov dx, offset msg_fail
# B, U5 K, `$ K. X/ F - call A20_ENABLE- R; R% B+ |) Y: [9 M/ A% L B
- jz exit1
7 H! j- b0 z- k) Q( f - mov dx, offset msg_ok
) k! l4 g- W2 K* b9 @# @ - # K; e1 f9 J' b( F* h8 L8 d
- exit1: mov ah, 09h 2 Y+ q. H% G4 a2 n
- int 21h 7 S7 E( B* U: g2 v
- mov ax, 4C00h ! D, n2 f! u# t; k% ^
- int 21h
; U4 _( V! m4 {* d9 s# {) Y, w+ z - 3 w- q4 e; g+ K$ P, L/ r
- msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,
: ]4 G/ b- d; Z8 Z+ e7 f" ^ - "2008-07-01",13, 10, "$" ) d6 F! P! O; v! j# g
- msg_ok db "A20 Enable OK", 13, 10, "$"
. w; W5 M2 v- v( ~0 W - msg_fail db "A20 Enable FAIL", 13, 10, "$" ) A7 _7 a- X) A
- " u" @; u1 b& J, z7 Y* P5 h g
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------0 y& O$ ^! p9 m9 e @
- A20_ENABLE: H( P! F, A- ]& O- M
- call A20Write 2 F: n3 m3 k5 r3 m; E0 j3 h5 f/ H
- jz exit_enable
$ c$ q! I' B* b ]
2 P9 x' @. ]9 g1 e/ [- cli ; Only need for reading value from KBC ; t5 j, F3 B9 y9 ?
- mov al, 0D0h 4 j6 z" q- }2 Y: N1 _9 p
- out 64h, al
# U v( _6 V( O - call A20Read 0 L5 O3 _) S# P7 X$ e& J
- jz enable_int
+ J7 |: Q N D' Y# {) n% f5 F3 G - # D' Z0 m$ ~! P; t/ q1 B; I& y
- in al, 60h ; Get current status " T& b+ U, n6 Q/ B/ f
- mov ah, al " r* o _/ B3 k4 ~9 D4 _; R
- call A20Write
5 l7 l, ]& N) f6 }7 @ - enable_int: sti % ^* P, v9 A% Z, W; {# I
- jz exit_enable
s1 c9 ]- e5 z
* b0 r& e9 o- o+ z- mov al, 0D1h ; Tell the KBC , want to write to the ( K9 m: o$ Z& \6 _
- out 64h, al ; Out Put Port next
/ S( x& J9 E, y5 P4 y5 \+ s - call A20Write
# i5 ^1 @' s% y. B9 Y' L' W - jz exit_enable- e' e4 Y: Q) l( T
- 6 Q: V. a# ~: l' h( ]7 j
- mov al, ah
+ O _. _. h/ `8 v* j$ z - or al, 2 ; Enable line A20 5 D$ e, d& e" m+ U, ?3 W8 u
- out 60h, al 3 H8 ^( f' s9 }% N( |
- call A20Write # `( N( A" }& K2 J) b, V
- jz exit_enable5 s+ j" {# B( n$ V* v2 m
4 N) p) }' B6 _0 {. r* h, W3 X# p- mov al, 0FFh ; NOP
9 e; F F3 K; J4 r( q* d9 E - out 64h, al
0 f: d f7 Z1 M. ?+ ?6 q$ f - call A20Write
' U# e9 h6 w7 c: H7 ` - ( l! _+ x6 Z) o. E4 n; r( X' H2 m
- exit_enable: ret
k8 @# I" Z, u3 O
4 f$ y1 i1 H; X- C$ f- A20Write: xor cx, cx ; Reasonable wait
2 [3 [4 {& C, _) ~ - get_wirte: in al, 64h ; Get KBC read status ! n5 p* x$ {$ o6 |0 i, `2 l; O
- test al, 02 ; See if buffer empty, bit 1 clear & ~% T$ X$ b( |( V/ f1 H5 }7 [' r
- jz clear 1 p! W, @" t, G
- dec cx
/ P0 Y9 m% g- t) Q7 |3 B/ A5 c - jz exit_write + i3 J N; e4 R! e! |
- jmp short get_wirte + q8 o% ?8 Q l! S$ F( Q
- clear: inc al ; Clear ZR . d( g- V9 |6 v
- exit_write: ret ' \) S- H' s5 e" L4 x$ C
' M0 I: q$ X# f8 k. t" `/ e& a- 8 f! {" l# Z- p: ~* x$ s) J: W
- A20Read: xor cx, cx $ X9 H6 b, H7 k5 \
- get_read: in al, 64h
' n& V% |: R* k. @ B - test al, 01 ; If the 'output buffer' is full, has / }1 L8 m# a/ R1 U: Q
- jnz exit4 ; ... 8 E8 H( z p$ |6 H# n
- dec cx $ l, C8 s( R: i/ O$ D
- jnz get_read
1 \! Y* |" ?& P9 { - exit4: ret 7 M" w: |8 w9 @) Q# L" N
-
8 `0 p+ t% d. m% s3 I - end
复制代码- ;A200FF.ASM
N" p( d* A5 a* _, ]5 J7 R - ;
/ j: T/ u5 n! y' X - ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-011 @) f3 E( j5 d! C- v
- ; ml A20ON.asm
9 q, }9 F1 x: O7 T& h, B3 ` - ; % r( A- f6 y' w4 X, s- f s$ e) \5 n; [
- .model tiny
+ x! F" n+ @' [7 l' { - .code
# u$ U5 I! }6 U* c - .486* y% S4 a/ }" g' d+ f0 ], U
- .startup
# b4 Z* f: l& i l& J
' l, g% a% ~, u$ m7 D- mov dx, offset msg_author% w* q- T% M, x( A0 {5 E5 S2 }7 Y
- mov ah, 09h- J, j# t* U5 ?' ~% _
- int 21h N) L9 L* u+ O# O- S
* w9 |8 u0 E( r- F) B- mov dx, offset msg_fail
7 A% `; E& C7 k8 x - call A20_DISABLE
/ E5 Y7 L$ w, i - jz exit13 H4 Z! G: P' V F
- mov dx, offset msg_ok 4 d9 C8 j" R) ^* ~. \
- ' E4 G+ u5 i- b; x( t
- exit1: mov ah, 09h
& b4 k% k8 v( D, ]9 N - int 21h
( r- W' g# r4 _6 Y7 }! B; N4 B& F5 @' r - mov ax, 4C00h
8 F" ^* e: H9 y4 B6 {3 m - int 21h * q3 ^/ U5 L! O2 t g1 o' @
- 8 q9 o# A% A6 {2 @4 l
- msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,* I' A2 z y2 p+ K0 R
- "2008-07-01",13, 10, "$"
2 {% s$ |- g" K! v( w$ U - msg_ok db "A20 Disable OK", 13, 10, "$"
8 Q* q. [* H+ A0 Z - msg_fail db "A20 Disable FAIL", 13, 10, "$" ' K* F# U" g! d5 q9 Y" o
- ! q4 V `( l2 y( ]% c6 r, `
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------" \& i& }# A5 ?4 O" q! A% o
- A20_DISABLE:
; q& T# r* R& H4 A9 A/ Z - call A20Write ; g4 b8 q/ V& N. b0 B* ?- @
- jz exit_disable7 A2 P. d* D0 L. T
0 I" t+ c ~3 b5 ?" y8 p- cli ; Only need for reading value from KBC ( I5 u+ d) ~4 E. C% Y0 Y8 E( I* b
- mov al, 0D0h
( C* r* J, e; H+ @ - out 64h, al # ^6 T" \' f0 V. J
- call A20Read
5 d( O! s+ t5 C - jz Disable_int
+ G& B m9 G5 \ Q5 ]+ h* ?: f - : |3 v2 C" _- R% }1 q3 ~; m+ a; N
- in al, 60h ; Get current status
$ D! } T! R/ P i - mov ah, al
4 [9 ]1 |- c9 Q8 \; B. w' t - call A20Write
6 ?7 Z6 _9 h- O& \. s - Disable_int: sti
* x8 q/ M, t3 K4 ~/ e% y3 X# V - jz exit_disable0 b5 [2 C$ H7 Y, C O3 J
/ c8 L7 ]- t5 m- mov al, 0D1h ; Tell the KBC , want to write to the
: J) u% ^; @; X: c0 t+ D* ^! V - out 64h, al ; Out Put Port next
7 a& }$ \% L9 w- T5 z1 o+ z) ~. g l i# K - call A20Write 1 d0 h- g3 ^ s# u8 U% e% x7 A- t
- jz exit_disable
1 \9 T( k1 u- S - 3 n+ s2 U- n9 w
- mov al, ah
7 i! [: X- `1 w: w - and al, not 2 ; Disable line A20
3 W0 r! {( b4 k r - out 60h, al
% a) u7 R. v8 J' k* k. M6 n - call A20Write
! S- r3 P! |( y - jz exit_disable6 ?- ]! i+ N9 m1 e6 H+ _9 O
- 6 ]" y4 }4 I0 }. n, Y2 ~ W( d
- mov al, 0FFh ; NOP
7 m5 m/ d$ c. ]4 V - out 64h, al
0 i, v B4 B: H: ? - call A20Write 5 J5 D0 \4 R4 c4 q7 z3 `7 M
- 6 M. u$ p* }6 _7 R; {. {
- exit_disable: ret
* y! s& ~, G1 y- O6 M
) k* a, }+ Y4 e- A20Write: xor cx, cx ; Reasonable wait
9 ?' n, a3 |* s& C) X: s - get_wirte: in al, 64h ; Get KBC read status
) z" H. `+ m/ t7 b - test al, 02 ; See if buffer empty, bit 1 clear
: S! g/ K& F9 `! W& x7 ] - jz clear ; {/ l8 O, c' N. ^8 e
- dec cx - P9 F" K: o* R/ |
- jz exit_write 4 ?( E6 m( g% B* r' N" K- {+ R
- jmp short get_wirte
1 ]$ z5 s- }, T9 j. s - clear: inc al ; Clear ZR 0 K3 r. H1 c8 R. @ I- d/ f1 A
- exit_write: ret 3 {* F9 @3 r% a6 T, q
- 5 F5 S1 V" G! e5 A f
6 l2 F) D9 Q% T2 E7 A8 l- A20Read: xor cx, cx
; x9 r$ l. r+ Y, x0 M! V" N - get_read: in al, 64h # V4 _1 r3 G$ g
- test al, 01 ; If the 'output buffer' is full, has
' L' n7 A$ H8 X7 C) m - jnz exit4 ; ...
% B, B- ~/ @& v% ` M C - dec cx ! f. H% u3 p R6 H3 X7 I
- jnz get_read
# M0 q+ k) k2 [; |' h+ s! p% } - exit4: ret
) ?# d9 B. C" S/ J% n+ D - 3 ^3 k* f& o( r; e7 c
- end
复制代码- ;A20STATE.ASM $ K# |# ]. F9 y3 h! S' a2 h
- ;
6 z, e3 V; I+ Y( r - ; Returns the status of the line A20 through the KBC
1 e4 P2 e% p, a9 k6 p! J* G* R1 \: e - ; programming by bini for debug. 2008-07-01& j0 I+ t* A& H" G& e: ]
- ; ) P; S% N7 o: U4 r' e. H0 i
- .model tiny" F/ G4 b( V; H1 s
- .code l- e3 }- R$ U
- .4860 y9 |8 |1 L' N* i
- .startup
. l; C$ P. `: J& B9 T5 I - mov dx, offset msg_fail
+ P; o W& a& A1 ~; l - call _GET_A20_STATE_
+ n- q! Z/ }6 P - jz exit1 ; was a problem
6 \( Z* X7 Z- K( f7 g' ~ - push ax ; Save state, AH 0 I8 ~5 {, H! l& c
- mov dx, offset msg_ok ; There wasn't a problem ' m- G: G. h% K! v3 c) v
- mov ah, 09h
6 ?) s* n3 h" G5 t; Q - int 21h ; Print message 0 A7 ~7 m7 V* P* o0 @
- pop ax ; retreve state 0 A5 l* c- F$ G/ E; E
1 h# w) j9 L @# n- mov dx, offset msg_dis : |% P5 x4 Z9 }1 k6 c- A8 v7 x! e8 o
- and ah, 00000010b ; bit 1, 2h, indicates state
1 ]6 B! B7 Y" _$ H5 n* X - jz exit1
6 q8 c6 O& y$ n" J, |, B: p - mov dx, offset msg_en & ~1 N! J8 ]: @3 x' D
3 T* \3 x! W6 R8 W: p+ t& C- exit1: mov ah, 09h
q0 t, F- ^$ A& h9 k6 z - ; DX already contains address of string
/ [; L+ t% T w9 m3 F4 ^) c5 @ - int 21h
" L5 Q) V- H) Q0 N) G# ?
{* e) T |8 b- H0 o$ R' p x0 }- mov ax, 4C00h % O: E. k Z; P/ h& o
- int 21h & W: s. s- `: \3 n3 o& [- T
6 Q5 X4 ~% ^- n; Y8 I: D; I W! o; {0 H- msg_ok db "OK", 13, 10, "A20 $"
7 ^' [4 F% z+ W7 H1 {4 X7 A% Y - msg_fail db "FAIL", 13, 10, "$" 2 w2 F* b# n9 \, g5 n
- msg_en db "ENABLED", 13, 10, "$"
3 V( e1 I& b& w$ x5 I - msg_dis db "DISABLED", 13, 10, "$"/ B6 @: T' {1 q) ~+ _9 q
P* u: v) H) J3 T( l1 p, r-
- K/ l+ e$ U2 K) S3 ]( u2 \ - _GET_A20_STATE_: * H" w X! N. U8 u, c# c% U. g& Y# P
- call A20Write ; Wait till the input register is empty $ J. j* A9 m: ]9 o
- jz exit2+1 ; Bypas the reset int's 1 u T. T# n* P! \3 Y! D3 M
- cli ; Disable ints so we'll get our value
1 a0 L! E" ^7 ^" ~ Q
8 q! R8 }! k! r4 d- mov al, 0D0h ; Send command to the 8042 command register
* R0 A N4 t& i* ]2 b5 I - out 64h, al ; to tell it we want to Read the Output Port
, t4 P: I: M$ H4 b# q7 s! e- ~ - call A20Read ; Wait till the 8042 output register
) ^' t$ V! \ P9 y* X3 d, G H1 i - jz exit2 ; has something in it's buffer : |+ _5 E) Y+ U4 \
2 U3 c. p: G" s- in al, 60h ; Get it
' H9 I: a, Z# R" R: I7 Z1 H* e - mov ah, al
: A! w6 I7 _ w5 ^ - call A20Write ; Make sure the input register is empty
1 c9 Z8 f1 g; C& @9 o - jz exit2 ' t. e, ?. P# B- L
- ! M5 j' S# B/ A( r0 p8 m* Q
- mov al, 0FFh ; KBC NOP command, does nothing 9 n/ Y; A" y& k. E8 F6 `8 t
- out 64h, al
7 N4 h. a8 s( p" O9 y8 R - call A20Write
1 b: i, S( s: o
6 D1 _' a' c$ D+ ^# M& V9 [- exit2: sti * ^6 z* Z i! n5 v
- ret
' D- U& a5 b- P# ^. U! j% V& n
4 b8 n! E8 H1 N
' d9 p+ {% T' r2 n/ O' e; [- A20Write: xor cx, cx ; Reasonable wait + j, S2 c9 W4 x. e# |
- get1: in al, 64h ; Get KBC read status
; y9 s0 \* a! M- y - test al, 02 ; See if buffer empty, bit 1 clear # g$ E; @. s& z6 S7 [6 d$ \
- jz clear
4 Y0 \3 D8 q: f5 ` - dec cx
, u% o( z( L' Z1 \- a% o - jz exit3 7 q9 m j" ]3 E( g, |
- jmp SHORT get1
8 a0 h: N: Z, L0 e, n - clear: inc al ; Clear ZR 0 [9 r4 k5 l# x% y: r! Q; V7 `
- exit3: ret , Y l+ o# i; `* l0 z6 }1 s" w. V
0 m( H6 o2 o9 Z% U6 }" G
" U2 D* S Y( y: [- A20Read: xor cx, cx " A6 I' v/ v' ^6 Q) E$ t$ }
- get2: in al, 64h
| j2 e9 W+ Q# o7 }, ]! B- ^" g3 E - test al, 01 ; If the 'output buffer' is full, has 8 A; I4 X6 f# K+ V. p2 a; o
- jnz exit4 ; something for me & B3 d6 W+ e- l H5 e5 F d% ~
- dec cx
/ {, P/ e2 v* p" D* Y. u# t - jnz get2
7 b& |8 n; h$ a- C - exit4: ret
% y+ i' A( o2 Y" a ^) \, T. M4 U4 b" G -
( ]: Z/ w" l6 n& s" C. Z - end
复制代码 |
|