|
|
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。- ;A200N.ASM & ?% P5 H5 O5 C8 d
- ;
A5 n* M. J# d6 A E7 ^9 z% p - ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
# O9 [! j4 j) o; W - ; ml A20ON.asm
+ K0 A- K5 s- c% V9 T - ;
9 f9 t& \* d: n, v! [* M! m - .model tiny
6 Q2 U9 F/ k5 c0 W+ H1 Q. ?/ V3 b3 y - .code' f4 ^9 x5 B' T* ~" k( r- \; s
- .486 g* a4 p" F4 Q
- .startup
" `! ?- ^/ v, o1 q- P
V% E, F" ~! i8 u- mov dx, offset msg_author
* k' `4 x l( K+ i: B. ^ - mov ah, 09h
3 S" k4 C4 U( n5 J - int 21h( E& G% ^; \! f4 h
. [5 v% Y, [: `6 n+ {, o& o5 ^- mov dx, offset msg_fail 3 `6 w' o. D+ H5 ]' L6 e
- call A20_ENABLE
# y* Q" |9 S$ z2 O' u* }0 B) q - jz exit1
) H- ~0 r7 h$ a/ P& _$ \" ? - mov dx, offset msg_ok
2 S: P2 J: g. J) I1 D - ], h& W/ o8 ^" S! ~" r+ p
- exit1: mov ah, 09h 8 o' u+ g4 y6 s8 ^" ?
- int 21h 8 c5 m# f$ {, ~& m
- mov ax, 4C00h
1 r# _* C+ y g p3 q- ] - int 21h ! B1 \2 F$ ?& [& k, d* ]* e0 x
- B# J3 D: t7 W1 P% x% ]
- msg_author db "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,; I; ^- c! a: s1 J# q% G
- "2008-07-01",13, 10, "$"
4 f5 O9 m% H6 f - msg_ok db "A20 Enable OK", 13, 10, "$"
3 X* J' s* S& k+ F - msg_fail db "A20 Enable FAIL", 13, 10, "$"
\$ A9 Q8 Q% S3 M8 ]
) x' z+ g5 L! K/ r. B- ;------------------------ follow code maybe make to lib, if you want...-------------------------------7 U5 h) B; u* b7 H, Y% s
- A20_ENABLE:
' ^! ?: j* n! v. ^. R& q4 T - call A20Write
% |* B7 y L3 ^5 p, m( N# [ - jz exit_enable
, l) b5 n Q+ O& X/ u6 O
9 D' c6 Y2 N9 R8 z$ Z; x- cli ; Only need for reading value from KBC
% ]5 z1 s C& u+ h* p" F" ? - mov al, 0D0h / Z- L3 g' M2 q) m2 h! ~: }. f
- out 64h, al O! ?0 x4 J, n/ [) x8 o& r
- call A20Read 0 }* z/ S [& @# O
- jz enable_int
- ^, s A& v( z5 }; c0 C
4 T; J$ z- H9 @ x/ D- in al, 60h ; Get current status # E" b) n! Q3 ]
- mov ah, al
+ C) T# g/ P& e, k/ N* z - call A20Write
- ?& m) s0 W- N5 F( g( @ n - enable_int: sti
+ P. s7 @+ i; ?5 W$ v - jz exit_enable
" E3 V/ Q+ f% I8 q% s' m- W- m4 t
* S& I6 N/ t2 }: p' r3 Q) y3 U- mov al, 0D1h ; Tell the KBC , want to write to the
, g( k- p/ z% j) @3 u3 a) y$ i8 X - out 64h, al ; Out Put Port next ( N/ x1 g" D( C" g7 P; u
- call A20Write 3 t; `; L) x7 u8 V( M( P& z+ A- r
- jz exit_enable
! B( Z, p8 t8 S1 O) v0 S& }
5 ?3 x1 }( v" C' R5 I- mov al, ah 2 _" |3 J8 G( X7 z" } d1 @/ J& l
- or al, 2 ; Enable line A20 + Q! N6 e# H9 R2 o/ F
- out 60h, al
. p* {8 }7 u5 E1 ~) x% J0 z - call A20Write
6 {/ I. o: ~/ W - jz exit_enable
- p& `1 [; f# l7 n. H - 4 n' y: c% Y1 I- C; n
- mov al, 0FFh ; NOP
* O9 y% p. [5 l A4 Z: A2 |, l* m - out 64h, al
* v. ^ x, w2 f - call A20Write " z0 [# D( C. S+ b
$ S" Y& a2 `2 }% K+ G- l# H9 n- exit_enable: ret
. L- u+ D$ `! G* i' d - % k. ^: g9 M# x$ g$ r4 G
- A20Write: xor cx, cx ; Reasonable wait 6 g6 j( ~) @/ N) @* c+ o
- get_wirte: in al, 64h ; Get KBC read status " r E0 h3 ~; e
- test al, 02 ; See if buffer empty, bit 1 clear 7 J( a# y, O+ ^) P, ]( p ?# I
- jz clear ! D% I! n( @4 ^: B0 x5 ?
- dec cx
7 c$ |, X& V/ x# ~( W - jz exit_write 9 X" k3 _1 w2 g& S+ g/ `% y: w, L
- jmp short get_wirte , x M4 U4 e+ K9 W% L7 c# X1 `3 \
- clear: inc al ; Clear ZR 1 o: \2 I# [8 ?& I9 m% w- V# U: @" j
- exit_write: ret & \) M8 Z4 c) E6 ?' ~7 p4 T
- 6 O5 K/ v6 e5 I: a" {8 ?, b
' W! j- r& O( e/ J4 h! L; g- A20Read: xor cx, cx . L& G* ]) h) e# \
- get_read: in al, 64h ; {0 }* v# v. R% _$ }
- test al, 01 ; If the 'output buffer' is full, has
' v/ v" J: Y1 H0 n - jnz exit4 ; ...
f7 M) g: X0 R. t/ O - dec cx . D7 I% o4 P8 n. P: Y
- jnz get_read
7 z$ e3 \7 g% F; E4 L - exit4: ret . |% ]# H; R' |. F+ v: {0 F
- ( K% |2 M H; e" s* S: d5 b
- end
复制代码- ;A200FF.ASM ; j5 Q) J! r `
- ; " b5 p* ^- \7 J# M. r4 T" b" l
- ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01& m6 b* Z! {, N( V4 ]. s) G0 i3 Y
- ; ml A20ON.asm ! i' U+ A/ o6 f& ^8 k
- ;
, q( m' A% D& m& @ A9 C - .model tiny
2 x" C6 u+ g' B" ^ - .code2 O0 \- ? B( t ^
- .486 f$ s0 j1 K0 n
- .startup
8 M; L; T+ M' S" x( z7 p - 3 E" W% y! A1 N; q
- mov dx, offset msg_author) Z: l9 J4 e% T6 L) J4 ~5 }
- mov ah, 09h
}- T# {2 j, j% B2 u9 e9 \ - int 21h
& w' Z% o* O9 c! A7 ^0 s* M' N - * N5 C, Q2 b7 `. `* |' ]
- mov dx, offset msg_fail . w0 z5 c- T& k! u% ~
- call A20_DISABLE2 c$ G/ o$ c2 d+ m/ h
- jz exit16 e8 X K$ t6 p/ P& n" ]: `
- mov dx, offset msg_ok
+ ?/ j: [: H% Z0 V" Q - $ c2 y, e( S) K7 w
- exit1: mov ah, 09h
) E' T8 w7 m/ Z- u: p! d2 A/ X, F - int 21h
4 h2 z( I1 B/ k2 q - mov ax, 4C00h
: E% s; L) G6 D# i. V8 K3 g - int 21h ' L2 s$ a* z! ^& _. O
- , @( o2 l, Q' x6 ~/ }3 K
- msg_author db "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
% L# {) n1 k" q: E% z- c - "2008-07-01",13, 10, "$" " D' @2 e: y1 R% U
- msg_ok db "A20 Disable OK", 13, 10, "$"
$ }3 h. | F* o5 q- S - msg_fail db "A20 Disable FAIL", 13, 10, "$" # ~0 i4 I& t) K+ Y! G9 I! |) T* A
- 4 A: n5 j% F6 |2 O t1 j
- ;------------------------ follow code maybe make to lib, if you want...-------------------------------
8 g3 G) }# Q/ h) h, {/ r - A20_DISABLE:
# [% ^6 V2 B$ N; k - call A20Write . N; H9 g6 e9 Z0 N
- jz exit_disable+ M6 w0 o8 a* T* a- W
3 m1 q1 X7 w! M# `" ]! D- cli ; Only need for reading value from KBC * L/ R& D6 \3 I& ~7 m# M
- mov al, 0D0h 2 b& [. b' d4 c) U' @9 ]! |1 H& b, i) ~6 l
- out 64h, al
! P$ d/ {: T0 |8 k& r% U - call A20Read
8 c0 W" ~8 R0 b - jz Disable_int
$ b; g: C0 K( T; T
1 t: m. o$ r+ E3 S Y* T4 v- in al, 60h ; Get current status
2 v, R: e2 m: g- c4 I+ ` ^ - mov ah, al
* `8 T) i5 J+ B4 r. y; ?( B - call A20Write ( b9 H6 n- ]- z5 u; h- v+ L/ e
- Disable_int: sti
0 C' Y- Q7 R( i0 U - jz exit_disable% ]3 M: M7 f# w, q2 ~3 P
+ M8 T% x! q) O) t3 \+ F- mov al, 0D1h ; Tell the KBC , want to write to the
9 Y8 e0 r# O8 M. o! n. d- `. k - out 64h, al ; Out Put Port next . d0 X5 k) T, X3 L( G
- call A20Write
" S/ x5 u" r, C3 x) z. P - jz exit_disable" N0 p3 f/ x: C* Y& K0 _+ J2 F! a
- 2 }; Z; y" J) d+ X" k
- mov al, ah
4 K! [ Y+ |. \- U8 O# b - and al, not 2 ; Disable line A20
& ^- g: k. t" R8 ^8 ^- D - out 60h, al 4 Q- n9 D- j, U& Z' e0 B; q
- call A20Write
7 N$ p' w% Q9 J2 R7 ~, M) @ - jz exit_disable
$ Y* \1 {* O2 L* t - ( E% c( u/ w& P
- mov al, 0FFh ; NOP
5 _- [. d. T/ D0 ^ J, V" B) y - out 64h, al * E! A9 _8 l# U1 S
- call A20Write
/ o& j+ k: `7 ], e9 K9 ^( u& } - " S: b3 P: @9 T5 _# Q% u7 e
- exit_disable: ret 1 V" O, | ]- g; P$ {
2 Y8 ^8 S* x2 R% D- A20Write: xor cx, cx ; Reasonable wait
- ?, [* O; t' ^* J0 h - get_wirte: in al, 64h ; Get KBC read status
; B: t6 m- {3 _* ~. }* Z - test al, 02 ; See if buffer empty, bit 1 clear # c: I& W4 w- C* s5 x! G' D
- jz clear Y+ L# x! o# w7 P
- dec cx " e+ r1 C# Y9 x& M
- jz exit_write
0 {5 A/ B! n* A$ k - jmp short get_wirte
% W; {7 z( \. `+ X6 s - clear: inc al ; Clear ZR / S6 q8 m# m- k; ~
- exit_write: ret
/ _- \4 ^6 c9 k$ u% ~" B$ o6 L
, O4 C+ A5 q. h3 M1 t! G1 Z, ?# V
& t2 E& i0 [" @- A20Read: xor cx, cx % p5 l" s! r8 x2 Y$ W' x
- get_read: in al, 64h 2 M6 x2 C* B& K E/ P" p
- test al, 01 ; If the 'output buffer' is full, has $ p( b2 T; Y- p% V/ m7 o
- jnz exit4 ; ... - m& `& S) `( G% R* L
- dec cx 5 q0 m/ O8 P4 ~. l. e9 |" c
- jnz get_read% S F2 T) Q6 z# M; N8 D# s2 T6 j
- exit4: ret
% x; O; y3 V. e; ] -
% x6 q- J; j, L# ]9 c3 U* [ - end
复制代码- ;A20STATE.ASM
& X$ \( r+ A5 l1 f# {# C - ; " F3 j- J. E/ X) P3 v; B6 w
- ; Returns the status of the line A20 through the KBC r3 S3 v% J8 `: y* `% H: l
- ; programming by bini for debug. 2008-07-01
5 e# k5 j$ _$ ? - ; : F3 x1 z* b# U( O( L. N
- .model tiny; e' E3 c7 `$ n$ B3 W5 A% U
- .code
4 F& K# h, J# Z2 R0 }' M4 j' Y - .4863 D6 k& N1 ^3 Y5 [+ I
- .startup
6 E/ }" B8 W3 M% L" j& F- Z6 Q2 W - mov dx, offset msg_fail
2 a8 e# n5 y: R( r+ w - call _GET_A20_STATE_8 n# f% I4 {: K& N/ l, x& \; ?
- jz exit1 ; was a problem
$ a' T4 O6 W$ ] r7 d) g) a, J - push ax ; Save state, AH + p6 I: k3 @7 t. `$ e8 y
- mov dx, offset msg_ok ; There wasn't a problem : q/ |. [3 s+ U! U
- mov ah, 09h
! w' _4 q/ \+ f2 H+ w% R - int 21h ; Print message " o( T, _# _$ | t7 j- }
- pop ax ; retreve state 0 S: f9 w2 c# v4 s% I$ N. {
- % z+ `. K8 X0 ]2 s$ i$ Q. m
- mov dx, offset msg_dis
6 B4 o; y! D- W$ ^ - and ah, 00000010b ; bit 1, 2h, indicates state ( V- Z, a- s. D- Q9 f
- jz exit1
5 l1 P7 o9 c+ ~$ E6 @ - mov dx, offset msg_en
) L1 b% _3 j+ L/ a/ `% q - $ w, O+ A9 v* ]$ w
- exit1: mov ah, 09h 4 K! f1 j: _ j, u) y6 c
- ; DX already contains address of string # V6 \# @- F; a( _% ^) J! G
- int 21h & v3 j- _0 E q) R
/ d2 n2 Q1 v) _- mov ax, 4C00h
. I6 j" a2 o: M* [: V - int 21h
' E+ k+ b F0 Y5 f ` - 8 o% U9 ^6 H7 X( F, v
- msg_ok db "OK", 13, 10, "A20 $" 5 Z) Y! S* C. f2 l
- msg_fail db "FAIL", 13, 10, "$" 6 I ], @3 r* z5 u/ B
- msg_en db "ENABLED", 13, 10, "$"
( i: w. n& Z2 q& S( X+ z" Q - msg_dis db "DISABLED", 13, 10, "$"- [2 N# U# Z0 p
- + P) [# s1 P+ \. `1 e) O# ]
- , W: O7 n# O5 J
- _GET_A20_STATE_: & u! y1 `' P5 I6 ?" R9 i0 J. O* R& L
- call A20Write ; Wait till the input register is empty
" \0 n0 V+ `5 [; B! j* F' T - jz exit2+1 ; Bypas the reset int's
/ i8 n5 a: k0 W4 X2 Z - cli ; Disable ints so we'll get our value , V1 q4 ~% ^% `' M6 z; H0 |: I) l
- & ^! V# B& c' S) I+ O4 d/ X5 B5 i
- mov al, 0D0h ; Send command to the 8042 command register
3 Z% Z" A6 _% P. g5 b - out 64h, al ; to tell it we want to Read the Output Port
4 d5 r4 k2 C! ]& v7 S6 J - call A20Read ; Wait till the 8042 output register
* Q, C/ f" e9 ^! Z+ J - jz exit2 ; has something in it's buffer 9 z( R- d3 S/ W8 O) k# q
1 E$ a6 S! C0 U# c. f- in al, 60h ; Get it ) K9 g4 {1 ~3 I% L Z, T0 O
- mov ah, al
7 d6 ?1 u! [+ Q/ V - call A20Write ; Make sure the input register is empty ! B7 A* u$ @& D
- jz exit2 : Q- F7 {6 m$ @2 `0 r
6 i& ]+ h+ H% w! A! F+ E( V8 ?- mov al, 0FFh ; KBC NOP command, does nothing # m4 o e" s. l% P% B, M$ w% D9 \
- out 64h, al
. X' B( M4 b: L0 K& B3 v - call A20Write 5 i. @, E( [; P" ?' e( K: o( t! J
5 i/ `0 `8 \( R- \: h- exit2: sti
# z% R/ U/ y, R2 ? _5 { - ret& b- `. v+ m5 D. b
- 3 O7 E1 ~: G% n( N, V
# i8 j; d! \" @# {, h( D6 Y- A20Write: xor cx, cx ; Reasonable wait 2 G- M8 K! X, N( V- i' X
- get1: in al, 64h ; Get KBC read status
. l: f( c% O% s. c - test al, 02 ; See if buffer empty, bit 1 clear
( Y5 F8 v8 |2 }* H) }. p; V1 k$ A& ]( G - jz clear / p4 e& M$ J" M& o4 Q$ `
- dec cx # O0 F4 ~. _& @$ I- D$ X8 L( J
- jz exit3 5 `* J- W9 r ~& ?% z1 t' S0 c
- jmp SHORT get1 4 R/ C# F# k# |8 a4 ?8 b3 t
- clear: inc al ; Clear ZR
4 x6 i5 g) P( T0 U' _, g. o - exit3: ret 8 T3 j; W; F$ U/ x5 @; N2 ?
- ! {1 f% D1 V0 b
2 G. n- Y# e' l$ T7 o8 @6 m7 ^7 C# r5 t- A20Read: xor cx, cx
) t0 s7 M0 X/ k$ x& ]/ A. R7 t - get2: in al, 64h $ q! N5 w2 `' O% |6 |' ~
- test al, 01 ; If the 'output buffer' is full, has
2 \& E& \. Y7 c8 ]0 U$ A - jnz exit4 ; something for me
& B6 h7 ]; M9 [4 \( ? - dec cx
2 O8 g, l( Y5 Z7 x! Y) A3 F# n( i - jnz get2" N8 B/ w& E0 J# q' M& k3 G
- exit4: ret 2 L" E% r; t$ \) z
-
|* t, P4 {& d7 O9 M7 p M1 W - end
复制代码 |
|