|
|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM 8 o$ F7 I0 g4 a! J0 m- O
- ;
' r$ b; V$ I2 S - ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01! X2 G* V; U& ?" ? q# v b
- ; ml A20ON.asm 2 I! j& L- S: U" i, Y: \( i
- ; ) u4 v4 i% }' {- e! a1 @4 j
- .model tiny, w; p7 Y" ^& ^ v
- .code
0 k+ g( [/ c) k4 d; j( v - .486& ]0 _+ N6 K; W0 a
- .startup
$ ]/ {* G K/ R9 G - 1 U. Y2 t5 a6 L5 W# e7 z+ Q
- mov dx, offset msg_author
0 k; d2 ~" Y9 ^% t( l - mov ah, 09h
8 j( B0 x0 |/ i! [* U - int 21h
0 ?9 x) n: S: l6 D
6 K$ n: G9 ]% n1 w: d6 K: K' R3 O- mov dx, offset msg_fail 2 o$ _3 {0 p4 B+ V
- call A20_ENABLE
* |+ _4 n; Y' b- g/ W$ v - jz exit1' E, l% n9 ~, f6 t
- mov dx, offset msg_ok
6 C0 _. j6 C4 W9 u3 M; O
$ T- |" O6 u. j9 H! o+ h( U8 E3 p) r- exit1: mov ah, 09h
# P! B( V) k# o9 Z- z+ {- Z% J - int 21h
2 g, a$ `" X- S- v, n8 O2 ~- |0 K$ B - mov ax, 4C00h 3 L, ]$ A+ ~- ~# `0 T+ ~; _
- int 21h
; A$ b- X5 b( S8 t6 |4 k6 f# A -
5 z- u# c" R0 a0 T, n8 ^4 ^5 ] - msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,8 V j. w- }( {7 ~; l$ M# g$ P
- "2008-07-01",13, 10, "$"
3 Z$ _9 ?8 ]; v& W - msg_ok db "A20 Enable OK", 13, 10, "$"
' |! I! f, z. F2 Q- g2 [* i - msg_fail db "A20 Enable FAIL", 13, 10, "$"
' F1 Z5 e4 z2 G8 _9 U - 2 A6 W1 c4 U% `0 j1 a0 K5 d
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------* w& f) }. s1 X3 R9 H! u/ q# k- T3 }
- A20_ENABLE:
3 t! ~: b9 H. c" m# o! R - call A20Write ( f# T: l. m* \1 |" b1 T" I/ G" z
- jz exit_enable4 X; m8 h% ^) ~6 E* M' T7 ^
# F, {( _: o: }5 Y. _' P- cli ; Only need for reading value from KBC # \. \& O% W9 |0 | M& O
- mov al, 0D0h d6 q" t7 [- Z- k# L( D2 p
- out 64h, al
5 \4 z( D8 e, _. H0 \ - call A20Read / w& v& N1 x! v
- jz enable_int
; c0 Z" O* N) [0 Q% Y
+ A8 `7 z8 I4 ]5 |3 [6 h- in al, 60h ; Get current status 1 v0 }7 l4 O3 e
- mov ah, al
2 i8 }+ q# t* d; }0 s8 u - call A20Write 1 p9 h6 d- h2 q0 R. b" U! x% G( W
- enable_int: sti
2 Z3 m" z$ \, _' B7 u/ |- t - jz exit_enable
, J! e/ o( g3 n; E+ G2 \; h! h: g1 o
9 {4 E( K/ ]: B9 j4 _- mov al, 0D1h ; Tell the KBC , want to write to the # f" }9 z9 ^1 g) n( C/ a
- out 64h, al ; Out Put Port next
2 X3 t$ g4 b- l1 l/ [ - call A20Write ! T( Q- X- i0 _8 [* \3 o- I
- jz exit_enable1 _! r0 A6 b5 w" ?5 @" A
; K; Z; x# y/ B4 o; v& O- mov al, ah
4 b: u2 m4 B- [% V, A/ L- B' ~) L - or al, 2 ; Enable line A20 ; H. \9 g- ]( X3 m, Q3 A% h
- out 60h, al
' ]) ~% F, c) A+ K$ R9 D5 F0 n - call A20Write
% p4 U! h7 h/ \; w - jz exit_enable
7 d" g8 ?1 w3 p3 l2 M( P- C - & W+ [) Y' u/ ?
- mov al, 0FFh ; NOP
6 O% R3 S1 }; ?3 I1 a8 N" L( c# r8 J - out 64h, al 5 d. C. y! l* q N
- call A20Write ; H; F1 Y' f; j
- 8 D& R' n, [! C) M
- exit_enable: ret
0 k/ s0 Z3 v3 E. d
/ O$ Y w. q9 h. _' a- A20Write: xor cx, cx ; Reasonable wait + D/ d: D# L& m& a! f
- get_wirte: in al, 64h ; Get KBC read status 9 G* N5 N8 ^6 g. ?
- test al, 02 ; See if buffer empty, bit 1 clear
+ Y/ W! _4 `0 L - jz clear 5 \2 u* b- z8 h4 T" g; ]1 K$ F& E
- dec cx
& J/ l. }0 `0 ?6 C% P - jz exit_write
& t, T6 E/ ?" o) X7 w. B - jmp short get_wirte ; m2 Y$ W' p' c3 G; j. w9 m
- clear: inc al ; Clear ZR 4 l- \+ I: U6 ^: D8 A; g8 A
- exit_write: ret $ N1 H5 @# R2 D& M. q8 z0 F$ J
5 s; ^* ~7 A* D6 v1 f; c4 S, r
( o8 ~$ O' Z, ?3 F c2 X- A20Read: xor cx, cx ]6 S9 n6 }2 C% k
- get_read: in al, 64h
- N. E( h1 Q+ l6 M8 V' e% K3 C, Y/ N - test al, 01 ; If the 'output buffer' is full, has
. L5 _9 e* l) G k - jnz exit4 ; ... 9 j# Z! I4 T* {, M* S
- dec cx ( j3 e5 U! G1 e) B& }0 [2 s9 ~
- jnz get_read
% ?3 O* s& J* t0 U. z6 r( _7 n R ] - exit4: ret 9 d$ k/ R* Y: w. p5 B7 x
- 1 y7 C0 g7 f% P" [* R$ h6 W
- end
复制代码- ;A200FF.ASM ' u3 \1 m3 j' k$ Q h
- ;
; I- O. \; w3 Y9 V* N, R4 ?$ i' B/ ~ - ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-019 g3 o$ y: @: M- T6 m: h
- ; ml A20ON.asm
" ~1 f- M' \" V | - ; - c/ N7 T2 x: F, V F
- .model tiny
9 Y/ U2 g7 A$ C# g - .code) E2 |) f: \9 G/ _7 ^# N. m1 v
- .486- ^6 s Q. _6 ` F+ W! ]; @
- .startup: t; }# n) Y4 c0 a' E: G
- - h8 z/ {+ ?& f4 K
- mov dx, offset msg_author- L- o- Y- p) A1 K
- mov ah, 09h# b( U& n' k+ Q
- int 21h
1 h! Q9 ]5 \, F8 _ - 1 i7 R5 f2 {, i, a9 q1 T: |
- mov dx, offset msg_fail $ V |' z9 ~# G8 n0 B
- call A20_DISABLE
. @1 \, y. J" ]( h+ L+ v - jz exit1: w; K9 s2 I/ t
- mov dx, offset msg_ok 7 S6 w4 X, O, e% g$ i2 ~9 Y, G' U7 _! Q
8 G4 l {' o9 S. D! u4 b! w- exit1: mov ah, 09h % b+ {6 r6 s) e3 k% k3 R1 {
- int 21h % K0 v/ B+ c& L9 [; L
- mov ax, 4C00h
: ~( E3 M8 l! l2 I- R9 ]4 [ - int 21h % c5 q) }2 Q5 t2 Q$ \, [5 l4 k l
-
' {- Q! M5 M) ~! I4 \& n1 n: b - msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,: m$ X9 v# ^# E
- "2008-07-01",13, 10, "$" ' G+ e( a/ Z9 Q; g9 ?) }
- msg_ok db "A20 Disable OK", 13, 10, "$"
6 y3 ], n6 b+ k8 ]& Y - msg_fail db "A20 Disable FAIL", 13, 10, "$"
7 X O" B. ]6 ~; L' n& a
" l: w9 n. q; n4 D- ;------------------------ follow code maybe make to lib, if you want...-------------------------------
; R( l$ z& p) e - A20_DISABLE:
" J5 i# o6 _5 @; p. I' f - call A20Write
, B- } L" i1 j# U z% k - jz exit_disable0 I; G" |9 n c
- + @" q1 c S5 h# q* e
- cli ; Only need for reading value from KBC
7 R: ~( K9 d- T* M - mov al, 0D0h
% k* F) v3 Q0 S - out 64h, al + n$ p! ^+ w' b7 C& A" \! g0 x
- call A20Read : C' f$ n7 [! y4 j
- jz Disable_int 5 |6 A0 ]' H4 i- i3 U4 D
2 v! a# O: C2 _2 f- in al, 60h ; Get current status w$ m3 Y0 Q9 x
- mov ah, al
8 }3 Y( w: s, Y3 r - call A20Write " J: [; }5 F+ }# [- Y3 t
- Disable_int: sti ' f, `, B9 }$ a2 w& I
- jz exit_disable3 X! q3 H2 h1 z* {& q
- + z( _( G7 D* X
- mov al, 0D1h ; Tell the KBC , want to write to the
& _) U {4 u- m' f - out 64h, al ; Out Put Port next
$ ]: a1 V: z5 ]& L: c* b0 y - call A20Write 3 F- G4 `0 Q: \* J
- jz exit_disable
0 `* G1 e* q5 n2 F" {" [6 k* _ - - v+ P8 X: i1 M8 C6 V' k4 N
- mov al, ah & Y! l4 ]4 M5 D- }/ ^$ ]" n
- and al, not 2 ; Disable line A20
/ y6 O- o( y* F - out 60h, al ; M P3 z3 @3 c3 P* s+ L- S
- call A20Write ( P5 O4 K2 C Z! w" v* `
- jz exit_disable& C/ I3 H& B9 o" h1 y
- 9 k8 r# w4 S# o) p6 b V |+ Q
- mov al, 0FFh ; NOP
& U( @! s. ~9 x. F8 D2 Q$ G$ E - out 64h, al
4 l; H4 x2 l" [* D8 h8 F8 ?6 A - call A20Write
& Y2 j9 P$ q V$ F2 i- P - % p& Y4 Z# z* ]. v9 U0 v3 b( C
- exit_disable: ret + H6 F" B3 i/ b1 v! u* Q, ]
- # o( E/ E4 _5 W* v% `
- A20Write: xor cx, cx ; Reasonable wait , U9 p1 [( w+ ^5 z( [) F
- get_wirte: in al, 64h ; Get KBC read status
+ t3 P" O q8 f7 t+ |, E. k* R4 n - test al, 02 ; See if buffer empty, bit 1 clear $ i2 {& e a3 Y0 d T' }+ o. O
- jz clear
+ N* P8 R W5 ^" e/ d4 O - dec cx / `$ y, b4 E7 T2 ^3 L
- jz exit_write ; ~0 c4 D3 w: X6 j* j9 l4 e$ O
- jmp short get_wirte
' c, x/ o3 @: R6 E: e& O, s) e$ C - clear: inc al ; Clear ZR
@8 f3 [- s8 }3 H2 Z, u - exit_write: ret ! B. `1 m) d( E" m
- * {/ ~) j: q0 s; b2 Z8 X) [
* ]7 y. S# K3 m- A20Read: xor cx, cx - O" ^, c0 C+ N4 m/ N
- get_read: in al, 64h
: J4 O8 J- P# @ - test al, 01 ; If the 'output buffer' is full, has % I0 ]3 q2 H" }7 k( ~: t1 g/ K t
- jnz exit4 ; ... ( Q* T6 U9 s' a
- dec cx
+ y( t* i9 N6 ^; i F - jnz get_read
: h: b$ S; @7 l9 a - exit4: ret
* I0 ^: O1 ?" Q1 C8 M -
$ l; Y* g e! {# |, d( W - end
复制代码- ;A20STATE.ASM
. Z0 z9 l/ v/ v; B$ m- j - ;
/ S3 o6 A# g n; C3 o/ @ - ; Returns the status of the line A20 through the KBC " ?4 [& ~- k/ J# `1 Q
- ; programming by bini for debug. 2008-07-019 u1 J9 h+ n/ d: b5 _
- ;
$ ~9 a% ?6 {/ z+ z0 E2 B( @8 X3 x - .model tiny. T0 Z: u2 a$ T' P X
- .code
+ {, d* T% a$ w- _ - .4864 x# C$ c( u/ A' s% I g0 j1 @
- .startup8 T1 {4 I0 Q; u. t9 Y# {1 e
- mov dx, offset msg_fail - g' m4 X5 B! G5 }' P' X
- call _GET_A20_STATE_+ Y, F$ k4 F$ H8 k6 ]( ^/ K6 A
- jz exit1 ; was a problem
' A! D& X q* }4 k( ` - push ax ; Save state, AH
4 E* b8 h8 C3 M/ t: R5 J/ ^) e - mov dx, offset msg_ok ; There wasn't a problem + @( T# a x2 H, U: i/ ?
- mov ah, 09h
3 T. C0 K# F7 ^2 q+ Z2 x6 Q - int 21h ; Print message
" o; _7 a7 F) d5 u4 n, M2 w - pop ax ; retreve state
, z0 T1 _% s E' `! g- Z - 5 ^8 E- S) Y: q6 c* u6 c
- mov dx, offset msg_dis " V# I& d d E2 k& `9 V
- and ah, 00000010b ; bit 1, 2h, indicates state
6 N- G5 a4 l4 @' P5 [5 b& `4 n - jz exit1
5 }' s: {% P& e3 Y2 M - mov dx, offset msg_en # m, p' m, d2 H6 h" _* o: L
( t; B8 r* Q. M8 \' O+ @& H- exit1: mov ah, 09h 5 V, \5 L' W/ _* r3 Y
- ; DX already contains address of string
' x3 l; v- T9 Q7 R& _0 u# O, R - int 21h
8 Y& w- Y) Q+ t4 ?) q ?' ~% P2 n - + ?' L$ O- J: B2 j" e1 ?) a$ ?
- mov ax, 4C00h % U+ S3 Y/ D7 W9 p$ j
- int 21h - d) I/ E9 h- u: ~5 L
- + E# j7 ]* C- W
- msg_ok db "OK", 13, 10, "A20 $" : d; [- D B: H; g! B5 {
- msg_fail db "FAIL", 13, 10, "$"
w5 C0 G, j! ]* I; A' O# u- U6 } - msg_en db "ENABLED", 13, 10, "$"
" \, ^9 x9 Z& k+ _/ l. B - msg_dis db "DISABLED", 13, 10, "$"
% `8 Q" Q! A& l) }2 n
* P6 F: q3 L! h7 n3 Z-
( {9 F0 a Q2 |$ R - _GET_A20_STATE_:
% K$ p# z" q/ y, E3 j W - call A20Write ; Wait till the input register is empty : A/ b }$ I+ m: |" g6 A
- jz exit2+1 ; Bypas the reset int's ' L/ ]! a. j% y% }
- cli ; Disable ints so we'll get our value $ g; z" C9 ?6 d2 ~+ c
- % Y- m) K" \, {$ J7 n4 h
- mov al, 0D0h ; Send command to the 8042 command register
$ ^& f4 H K! K8 ?) \: W5 G - out 64h, al ; to tell it we want to Read the Output Port # ~6 ? q, ?+ U& x$ N0 o5 s# q& @
- call A20Read ; Wait till the 8042 output register . H! |4 Q/ K4 q
- jz exit2 ; has something in it's buffer 5 q4 B% k0 l0 F- [" X$ d* }
$ l; Y8 I: e! i+ X2 J- ?' u- in al, 60h ; Get it / u6 U$ }5 W# L1 x3 N
- mov ah, al & ~ G1 C6 W9 b4 A- b, w
- call A20Write ; Make sure the input register is empty
, M9 M0 o0 y* G; q' T" \+ V5 { - jz exit2
4 z$ C0 ~9 w+ z. \8 ?" p9 h - ' X* o# N: ^$ L( Z: k
- mov al, 0FFh ; KBC NOP command, does nothing 5 o1 z3 p T9 T6 W+ e" J
- out 64h, al
5 P- e8 a; \6 }$ I1 e, o$ Y! }* ? - call A20Write . ]7 f( V. e# q1 Z
# Q# m6 z$ m6 y& _! Q# ?- G; w- exit2: sti . f# D1 ], r: p3 K- O7 A( I5 [+ t _
- ret
) \% M( J4 |, V5 R( s - ! Y5 m; p8 `: k/ B0 ?1 H& X
- , s J9 H9 s9 ]8 T! g7 L( S
- A20Write: xor cx, cx ; Reasonable wait
J$ i* k: Y" e. A - get1: in al, 64h ; Get KBC read status
- n7 p+ M W$ }" a - test al, 02 ; See if buffer empty, bit 1 clear . g, P5 k& |0 c6 u
- jz clear + f6 y6 n- T; v8 L
- dec cx : U& j% y+ _# Q K( |# Y/ ^
- jz exit3
( z* o; |$ u+ Q - jmp SHORT get1 ; U& T$ j. S. y9 P* a+ s0 b
- clear: inc al ; Clear ZR
/ e# C" K1 f: h5 E2 s - exit3: ret 6 a5 f& r0 v6 M- H
- ; _9 t8 {0 T4 K2 y. e1 P, Z
- 6 v' _% p8 k+ n$ P6 o4 |7 ]9 u# g
- A20Read: xor cx, cx
+ Z: ]6 d; ^2 r! ^9 u - get2: in al, 64h
3 ]' {7 j3 K& ` M - test al, 01 ; If the 'output buffer' is full, has ( }9 w$ e; v; i& E1 v! o. o
- jnz exit4 ; something for me
; C d+ `( v& n) o+ y1 V - dec cx
9 U7 v& d5 p3 E T+ {: s; P5 { - jnz get2, D7 Q' o! [( J
- exit4: ret
% F: a, h: @0 T& F ^" j - , w$ X9 z- p8 _, b" V! R: ]+ i# a: f
- end
复制代码 |
|