找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 13108|回复: 1

Enable or disable A20 gate through KBC demo code.

[复制链接]
发表于 2008-10-8 14:58:49 | 显示全部楼层 |阅读模式
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。
  1. ;A200N.ASM
    + Q+ H$ J7 Q5 ]" Q! X
  2. ;
    ( G+ c7 {' M& Z9 x8 P7 |- @
  3. ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-014 R5 u& y3 h5 b6 {" i/ o
  4. ;       ml A20ON.asm
    * I, c% e/ @! }* l- M$ s+ y' o- C
  5. ; % L! |, @9 {6 R
  6. .model tiny$ P, W/ L, i" U% ]! O
  7. .code
    / C1 ]0 C& Z$ w4 |
  8. .486
    ( H) d( z2 t+ _" S. N
  9. .startup2 y% m0 }! E2 u6 ~
  10. $ @4 ~8 i5 h1 x" a
  11.                 mov     dx, offset msg_author; G- B# _8 c" B  n; c
  12.                 mov     ah, 09h9 N0 j; `( T; Y9 C" x
  13.                 int     21h' _& ^2 p1 O9 J% }& ~1 A4 ]* F

  14. . s, J: t4 v6 d0 I. ~) i- l/ |
  15.                 mov     dx, offset msg_fail
    , d  X* ]+ W! G- u- z) w
  16.                 call    A20_ENABLE
    , I& ]8 G# z! ~4 l5 e) `6 d# P! U: ]1 E
  17.                 jz      exit1
    $ o3 I/ q& l: S  L
  18.                 mov     dx, offset msg_ok
    ) r6 T- V1 [9 n/ Y

  19. * O+ }( ?4 A1 F9 p9 E0 Q5 w
  20. exit1:          mov     ah, 09h 0 v* x5 U/ d7 h  n! a& E
  21.                 int     21h
    1 w5 y( V# h' q
  22.                 mov     ax, 4C00h % M' V4 n  B6 I" c7 Z8 ~5 V
  23.                 int     21h / d6 {7 f; }9 S8 a; b% C
  24.                
    4 d" B$ b# {4 o2 ]
  25. msg_author      db      "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10," g, B* a9 f/ t/ |" l9 _
  26.                         "2008-07-01",13, 10, "$" 5 r  a: O' w3 f9 v+ A
  27. msg_ok          db      "A20 Enable OK", 13, 10, "$"
    : H5 _9 I: e+ ]- w/ u
  28. msg_fail        db      "A20 Enable FAIL", 13, 10, "$" ( R) U1 a* ~, K* W4 w( o/ }! Z

  29.   |" m0 x0 d& }: \4 P) Z' P
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    & w/ F% s( F9 {# ?& T# z' D5 w
  31. A20_ENABLE:   P, o: x' O# i0 e' M8 A% P2 Q* q
  32.                 call    A20Write . r: {! r5 J7 l* t1 {
  33.                 jz      exit_enable0 E. v% M' T0 h* w% P! X

  34. & ^0 h8 ~) S5 ~! u- h
  35.                 cli                             ; Only need for reading value from KBC
    - J# s$ i; e5 o/ N" p+ B
  36.                 mov     al, 0D0h
    5 B' f8 ?5 c) q1 F
  37.                 out     64h, al + x6 Z1 v/ l5 ?; ?" E
  38.                 call    A20Read
    3 L7 \- H. ^/ k8 F
  39.                 jz      enable_int ( N6 l; P$ H1 i6 \1 ^% N

  40. # _( p- C1 y( p
  41.                 in      al, 60h                 ; Get current status - W4 q$ a+ a- L& G& h+ u$ R$ K' @. i! {
  42.                 mov     ah, al
    + s% Z$ |) H$ p! {) g+ S3 s. q
  43.                 call    A20Write 0 B( T/ m+ T- F+ N
  44. enable_int:    sti 8 H# r7 C% i# g3 k
  45.                 jz      exit_enable
    ' W8 T' ?( L, B7 T
  46. 3 K$ [  \' q( I* e5 N
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the
    4 U9 q3 h1 V0 i6 p# d
  48.                 out     64h, al                 ; Out Put Port next
    4 T3 y1 r6 y" n8 z: p1 L& W% Y% h
  49.                 call    A20Write
    ; i9 [0 V& |" \
  50.                 jz      exit_enable
    ; u: j) _8 J# {/ s. l( G

  51. * m; Q; L0 C. e( M* X0 c
  52.                 mov     al, ah
    $ Q( ^) f$ X$ k0 E
  53.                 or      al, 2                   ; Enable line A20
    9 n, O  L$ C" I4 N0 N$ w; _5 _1 z
  54.                 out     60h, al
    6 R5 a4 o7 \' g% P2 d( O
  55.                 call    A20Write
    + m2 i4 ?( l! D( p$ ]
  56.                 jz      exit_enable  e! J  Q/ P7 _3 f; L8 m& w2 M

  57. 1 z# l8 Z5 ]9 I- j
  58.                 mov     al, 0FFh                ; NOP
    4 |1 i; i4 c) C$ f+ T2 Y4 G# ^, y
  59.                 out     64h, al
    # ^7 R& Z! G( p/ m
  60.                 call    A20Write
    & g1 `; X: c; a) W6 X0 Q

  61. 6 j1 ^4 Y6 z$ I8 x0 Z3 E
  62. exit_enable:          ret ; i) Q% n5 v  e! r- ]6 B! `( A
  63. 2 c% S* ^% ?+ A* ~, \$ t! m0 p
  64. A20Write:       xor     cx, cx                  ; Reasonable wait
    " X0 ?! u3 M7 G
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    6 k2 l$ J5 W$ i0 ]' w9 K- C; n
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear % m. t0 w) {0 T% g; E
  67.                 jz      clear
    4 i/ `$ ]7 W$ X% |6 U; @& \% Q
  68.                 dec     cx * y) a6 N2 Z. @/ h$ R
  69.                 jz      exit_write - c% [& T& H, ?6 F/ ~
  70.                 jmp     short get_wirte 8 |+ K! n+ A! V: E  K
  71. clear:          inc     al                      ; Clear ZR
    7 k& u# I2 C: ]7 \3 e& s
  72. exit_write:     ret
    3 R% h2 _# E/ o% \, J8 [+ o3 z

  73. 3 F2 `% {* ?0 [4 |0 X9 L* \3 t! ]( ~  X
  74. & M' s0 e1 t) l0 t' B5 O
  75. A20Read:        xor     cx, cx
    - K# J  R, g' ^2 d# Z$ z* _! H+ g
  76. get_read:       in      al, 64h " ~& n. ?9 n' q
  77.                 test    al, 01                  ; If the 'output buffer' is full, has
    ( Z/ b/ E/ U+ F+ O9 l" D) U
  78.                 jnz     exit4                   ; ... 9 B7 O8 P* ^0 v/ q- N) T
  79.                 dec     cx
    / l% l2 p! ~5 L' G7 X
  80.                 jnz     get_read( V6 g+ l: F, c- b: m4 @% K
  81. exit4:          ret     
    ' z& d" s' S6 Y+ E
  82.                
    : u/ v; g' D, p) F2 b
  83. end
复制代码
  1. ;A200FF.ASM
    - S  _" E2 x8 E: X4 `8 ?' @
  2. ; 1 D% Y9 S4 i, V4 M! ]& f; T0 l
  3. ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01
    7 y, E* E# Y! \
  4. ;       ml A20ON.asm
    : H7 k% f: ?" n5 c; z
  5. ;
    - r7 t. o: f0 u; c6 ]4 z# h0 a
  6. .model tiny: k( |# `" \3 F" T
  7. .code: i$ u& k* o3 e* |( F  V# @
  8. .486- M$ E1 t0 j& }' {- \4 H6 H) R
  9. .startup
    3 s8 R4 g/ z3 @5 _! H
  10. 9 K. \3 ]# I% \; t. \; g
  11.                 mov     dx, offset msg_author
    * R1 ^& R  ]2 y, M
  12.                 mov     ah, 09h2 O! o/ |5 D% f2 W$ S% C
  13.                 int     21h! B: f' E, N; Y7 d# R8 o8 H

  14. , p8 i, U! f7 f% y4 `- D% r, |
  15.                 mov     dx, offset msg_fail
    # @: R" x% d/ n4 Y! j: e! @
  16.                 call    A20_DISABLE
    * B! X0 i8 Z0 v2 `9 i" |% ~
  17.                 jz      exit1
    : E% Z) x  w- b/ ]) ~
  18.                 mov     dx, offset msg_ok
    + u) ?. P. A6 d# W

  19. + b  s: y: Y+ V
  20. exit1:          mov     ah, 09h
    3 H5 n7 c" Z8 H& w4 y
  21.                 int     21h
    % f4 ]2 G  c8 x+ [& P0 Z
  22.                 mov     ax, 4C00h ! e4 V" D4 V- O- H" i) o6 u
  23.                 int     21h
    & \/ F1 ~% M' [  B3 G
  24.                 / i0 h, h& A: A4 I. V+ N% e' [
  25. msg_author      db      "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,, t5 m$ x5 i6 R+ J$ `
  26.                         "2008-07-01",13, 10, "$"
    - }& ^# c2 L7 L8 ?/ [
  27. msg_ok          db      "A20 Disable OK", 13, 10, "$" 6 [8 l; [! G, g5 w* U( V
  28. msg_fail        db      "A20 Disable FAIL", 13, 10, "$" 5 o& J% K' b* d
  29. , K4 t3 K9 L( v3 ]8 J$ c
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------* j. }; b. S% L) n: o. G
  31. A20_DISABLE:
    ( r/ k8 h, G$ S  o" R
  32.                 call    A20Write
    7 _- H! f, J8 i3 v) t" z
  33.                 jz      exit_disable' Y' W: a- V' v8 X
  34. 5 P+ t; ?& {6 O
  35.                 cli                             ; Only need for reading value from KBC + ]8 u  Q0 ^5 W9 n6 S% [  |
  36.                 mov     al, 0D0h " q' y: E7 G0 j- F1 A! {
  37.                 out     64h, al
    ' D! B" @8 {; h! v9 U
  38.                 call    A20Read
    * r9 q, ~" Z9 J$ l
  39.                 jz      Disable_int   M4 P/ U: D4 {  b$ Z$ J1 C' \( C) D

  40. ! Z7 T+ b# _+ n% D" Z
  41.                 in      al, 60h                 ; Get current status : s9 ?5 R, J' m6 Q, K. ]: Z" }, E
  42.                 mov     ah, al
    / b9 [2 ]+ u) H% x3 Z
  43.                 call    A20Write
    ( p5 g9 ^; S3 Y6 u" a
  44. Disable_int:    sti 1 Z/ M8 U' W& y; W+ P) A3 N
  45.                 jz      exit_disable
    ' w! c7 T( b: {4 Q

  46. 7 H) f- p# g5 y8 X$ B
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the ! `! }: x+ N0 w+ w6 e
  48.                 out     64h, al                 ; Out Put Port next
    # N/ K- G3 Z& F' c8 u
  49.                 call    A20Write % @$ L. |9 P1 w% Y$ T" w
  50.                 jz      exit_disable# s& a$ R1 A$ i" Q5 M+ h. n

  51. - C* K2 L( W( C& [# u. H+ j) s! Q" R# r
  52.                 mov     al, ah 3 e4 B2 M6 K6 c! O0 |
  53.                 and     al, not 2               ; Disable line A20 , s4 _4 b" Y6 Q: ^# d; u1 l6 v
  54.                 out     60h, al
    * B% I# K. c) B' q
  55.                 call    A20Write ) p/ n2 Z' w' L7 O7 B0 q
  56.                 jz      exit_disable' i' X% U0 f" `
  57. ) D  q' N7 F( r" F
  58.                 mov     al, 0FFh                ; NOP * @: A. m9 w3 ~$ h, a' s
  59.                 out     64h, al
    ' }& G! c; k5 Y4 K
  60.                 call    A20Write
    , u1 @" _- E( r. F! q, Q; V

  61. # T9 E/ N0 f) F5 T! D/ g
  62. exit_disable:          ret # R& k9 b4 R7 a# U- K' I" I4 p
  63. 6 Y$ H* }$ B6 h: H  k
  64. A20Write:       xor     cx, cx                  ; Reasonable wait ' Q3 y% p; w# x8 C0 ^' T1 @9 [
  65. get_wirte:      in      al, 64h                 ; Get KBC read status ) a( r8 X& H8 B4 |  S
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear * s/ @; T0 e: n9 s6 I, y7 q6 r
  67.                 jz      clear   {) E/ Z8 R" A2 `' R$ \  J
  68.                 dec     cx ) y9 M4 T# w) [: |" W' U
  69.                 jz      exit_write
    $ w0 `4 C1 n( c! |
  70.                 jmp     short get_wirte
    6 m( r4 J- `+ K5 ?$ W7 X2 r
  71. clear:          inc     al                      ; Clear ZR 3 E$ k, K1 }% ^5 U4 G, r4 w0 ?, k
  72. exit_write:     ret : i; [2 F, {) v3 }9 H0 d4 Q* `
  73. # c7 s- l; e5 `5 [( f  J7 J7 ^+ }

  74. 2 T3 q9 z: J9 i! N1 a! m0 M4 a' _
  75. A20Read:        xor     cx, cx 7 Z! H3 ~. u8 m) I, O
  76. get_read:       in      al, 64h
    5 a9 I( M$ h& ~6 n
  77.                 test    al, 01                  ; If the 'output buffer' is full, has 1 u. `- Z1 b$ B5 |2 U2 Z* |
  78.                 jnz     exit4                   ; ...
    5 S8 G9 B& s9 p- g, W
  79.                 dec     cx
    3 W) D  d$ g5 T, y) Y
  80.                 jnz     get_read
    & t1 N1 {% ^$ }) P$ E4 e
  81. exit4:          ret     
    1 z) }) V5 k* t' B7 }7 h
  82.                
    : Y. h4 o* w8 ~6 o
  83. end
复制代码
  1. ;A20STATE.ASM " h0 Y" X4 M- |* y9 Y# j# V! X
  2. ;
    3 y. s7 z4 N. Z0 x2 E/ q2 I  |
  3. ; Returns the status of the line A20 through the KBC / U/ e. y6 C/ I4 ?( [# _
  4. ;       programming by bini for debug. 2008-07-01
    6 p/ y! E# D/ h$ U" I5 ~
  5. ; # k5 R; u: d- Y( W$ C- L
  6. .model tiny$ C" l5 N4 H- W+ p  R0 l# U0 _9 j7 M
  7. .code1 R% u, \) X$ l+ L4 g. X
  8. .486
    + D& a# y- o" ^5 X! o+ }
  9. .startup
    9 Y; Y! H; b5 b2 O
  10.                 mov     dx, offset msg_fail
    ) a5 P4 J7 H5 F% K, e) n
  11.                 call    _GET_A20_STATE_7 J6 K' N1 p: x
  12.                 jz      exit1                           ;  was a problem
    ' x# U  J% U( M) O' G. G
  13.                 push    ax                              ; Save state, AH - @0 w0 b4 t6 Z, s+ T$ Z+ h% I; P# ?
  14.                 mov     dx, offset msg_ok                      ; There wasn't a problem
    9 k) Y. j2 W) a9 ~2 m1 z  D- f# P7 E
  15.                 mov     ah, 09h   u- K9 q% ?: }1 w  \: [* B
  16.                 int     21h                             ; Print message / C  F0 R: ~' g8 x
  17.                 pop     ax                              ; retreve state
    : h1 q; [" O9 W! @8 c/ Z
  18. 8 C3 \# a9 I  Z* Q) @/ o
  19.                 mov     dx, offset msg_dis 1 w. d6 |% X1 [& ]- i
  20.                 and     ah, 00000010b                   ; bit 1, 2h, indicates state , @! m* ^% e6 _" U4 j6 j8 U. t
  21.                 jz      exit1 2 C7 l. M: z4 c/ L
  22.                 mov     dx, offset msg_en & Z$ t/ P5 t* E' @1 ^+ U; U
  23. - w3 k' ^5 P' d4 T2 s4 R
  24. exit1:          mov     ah, 09h
    6 f$ e! n0 [5 l5 a
  25.                 ; DX already contains address of string ( d: n! C$ k2 d6 p' v8 ~, [
  26.                 int     21h " _$ ]: r+ j1 @: ?
  27. 0 H4 d! B1 |* ]5 j
  28.                 mov     ax, 4C00h / M! M; R( ~6 ]2 |; G+ r% f
  29.                 int     21h 6 m8 K0 M$ T! \/ K* [2 u

  30.   J* L6 Z) c& q  S! q4 p: R
  31. msg_ok         db      "OK", 13, 10, "A20 $" 8 ]0 v/ z% b( A+ {5 }& [
  32. msg_fail       db      "FAIL", 13, 10, "$" * _' _( U3 \/ K0 D1 V
  33. msg_en         db      "ENABLED", 13, 10, "$"
    7 o/ }8 x. j& U- d
  34. msg_dis        db      "DISABLED", 13, 10, "$"$ v) j4 S; S; I) T. u3 S

  35. : W3 V, c. G4 D* o: P( h
  36. 0 z4 g- V2 r& H+ N- ~. S2 ~
  37. _GET_A20_STATE_:
    7 f( q! v; a5 o- O; K
  38.                 call    A20Write                ; Wait till the input register is empty - M# _' K/ s  y3 z$ F1 ]& F& {
  39.                 jz      exit2+1                 ; Bypas the reset int's & A' n" d+ I8 t: L$ c5 @' ~: x1 I8 M
  40.                 cli                             ; Disable ints so we'll get our value " U3 H' @% l# }1 N" ~, m+ ?: j8 n
  41. - p4 R( b7 q0 D- ?! p* n
  42.                 mov     al, 0D0h                ; Send command to the 8042 command register
    : r4 n( {8 U0 b' D
  43.                 out     64h, al                 ; to tell it we want to Read the Output Port
    ) _. _& X& ~( ?; ^& y5 G
  44.                 call    A20Read                 ; Wait till the 8042 output register
    . d* ?" P7 j0 J; d4 h4 _
  45.                 jz      exit2                   ; has something in it's buffer ) \% Z4 V, \1 N; C6 B! I( v

  46. $ T' j( w+ C8 d. \/ }0 r
  47.                 in      al, 60h                 ; Get it 6 R8 |. b" a7 D8 z; J* w* z
  48.                 mov     ah, al
    9 }) U1 {/ o4 U- l
  49.                 call    A20Write                ; Make sure the input register is empty
    / [% ]! o# t4 g
  50.                 jz      exit2
    / R  c. U! r, _3 W, c- a
  51. 7 m( ~$ F2 l( S6 Y7 U9 m' h, o
  52.                 mov     al, 0FFh                ; KBC NOP command, does nothing
    6 H8 s% R! ~6 y
  53.                 out     64h, al
    - F$ n3 o' R6 x: F# w0 k7 c) x+ A
  54.                 call    A20Write
    2 Q' c6 y4 |6 q4 E; z

  55. $ t- _1 C2 F; Y
  56. exit2:          sti # f, P  V( I" s, c$ C
  57.                 ret  I) g2 ]9 }4 J( x. ]

  58. / Z. q' o  y% Q

  59. + q: ~6 ?* _" m7 \2 u
  60. A20Write:       xor     cx, cx                  ; Reasonable wait
    7 m# D0 @3 H( Y
  61. get1:           in      al, 64h                 ; Get KBC read status . S: t9 g. E- V/ @! h5 v2 E  k
  62.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    5 l3 f* k! N+ P- U1 r8 P( t
  63.                 jz      clear 0 t7 V6 R; R- p7 ~8 s
  64.                 dec     cx 1 ~1 b2 T) h; A- G* c' U* N( A
  65.                 jz      exit3 $ {) y  K4 H+ ?+ A
  66.                 jmp     SHORT get1 4 F$ b( }- u: c
  67. clear:          inc     al                      ; Clear ZR * w# Y0 D7 R8 S* [9 I' ?' G
  68. exit3:          ret 3 |2 z' P+ j! \6 J% P3 O
  69. % b" z$ B* L, i! Y6 Z
  70. 8 k# O) z9 }; m# F; T, S
  71. A20Read:        xor     cx, cx 6 G1 T# F# K  C- Z* _, b; e
  72. get2:           in      al, 64h 0 e0 X4 D+ X: S. J) {" w- f8 q; B4 D
  73.                 test    al, 01                  ; If the 'output buffer' is full, has ; M+ y" _/ V9 ~* h
  74.                 jnz     exit4                   ; something for me
    . W: v5 U5 |7 z" U! N$ E
  75.                 dec     cx 8 U  h: `& g) c9 q7 Q  W. c) f
  76.                 jnz     get2
    % U( A/ e& V; f8 B( H) f
  77. exit4:          ret     
    % L2 G' C; S$ Z
  78.                
    3 A# L' ]  f7 \! T; F% k" g
  79. end
复制代码
发表于 2008-10-21 17:14:36 | 显示全部楼层
void openA20()
1 B/ j! b* N0 r5 j{        while(inp(0x64) & 2);        outp(0x64,0xd1);
+ n5 H+ L; D% V2 p        while(inp(0x64) & 2);        outp(0x60,0xdf);
9 ^: c8 W9 H$ J" j# ~- y        while(inp(0x64) & 2);        outp(0x64,0xff);
* k! _) w9 B; h" I4 r) M5 Y}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2024-11-21 18:33 , Processed in 0.025594 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表