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

Enable or disable A20 gate through KBC demo code.

[复制链接]
发表于 2008-10-8 14:58:49 | 显示全部楼层 |阅读模式
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。
  1. ;A200N.ASM
    : W$ \7 y9 @( Z) y' p) y) |% A
  2. ; 5 e" Q" x4 j+ D8 M4 |! g2 P/ N
  3. ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01% J/ l9 e' h7 i5 F
  4. ;       ml A20ON.asm
    & C; E8 o' F  o+ w. s4 I3 O
  5. ; ; ?: j/ |; Q! y0 E* [& L. D4 p* S+ b
  6. .model tiny
    / a& z  v8 O8 ~* z/ E
  7. .code
    ) H1 q3 [% K; H) y6 r/ _2 F
  8. .486  v  D% s" u5 V8 Z5 D
  9. .startup
    ! L/ @  h' }2 Y6 T# R! X

  10. ) f8 P& ]% y2 l1 ]  _2 R/ U0 h. R  h
  11.                 mov     dx, offset msg_author! v# {) ^. C& \1 I3 q$ R
  12.                 mov     ah, 09h! o' X- V3 A( P  W2 n4 t% s
  13.                 int     21h8 r9 U/ Y3 d0 P( w  j# n4 R3 A
  14. 5 g" h% G: P8 ~3 G8 G8 X
  15.                 mov     dx, offset msg_fail : _$ T# ^5 q0 ^
  16.                 call    A20_ENABLE" v8 k. [: Y' E& B# @
  17.                 jz      exit12 R$ m; _# p6 Q" z; H2 g8 s: z2 }
  18.                 mov     dx, offset msg_ok 1 _0 k- F2 d% y, B+ n4 Z. Y; R9 p

  19. ; F4 V3 f" T. R
  20. exit1:          mov     ah, 09h
    ' u9 _/ U, w! |9 G8 z* c/ d( a
  21.                 int     21h
    9 }5 z( S& J6 ?5 ?& U
  22.                 mov     ax, 4C00h 8 ]4 i6 b4 j& t7 ?
  23.                 int     21h 3 R% k  V4 u% g0 r( S' d
  24.                 0 `  U9 U* ~9 g0 h# {5 L& |' `
  25. msg_author      db      "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,. X& I3 H! o8 @$ p0 d
  26.                         "2008-07-01",13, 10, "$" ! l4 W2 v" e3 \0 m* l
  27. msg_ok          db      "A20 Enable OK", 13, 10, "$"
    ) v/ g: S0 y  P9 P+ G& ^
  28. msg_fail        db      "A20 Enable FAIL", 13, 10, "$"
    : l( a: U2 `- i

  29. 3 f' q0 y1 T0 x2 ~5 X
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    $ k0 L3 ]4 f" Y! v- o
  31. A20_ENABLE: , a* ^% M% b7 ]
  32.                 call    A20Write
    ; X8 j! U% q0 |2 s! t; H
  33.                 jz      exit_enable( p: d* }5 f$ n! p- B' j
  34. 3 u2 I. N4 {8 h* j6 M4 G
  35.                 cli                             ; Only need for reading value from KBC 8 _9 g. j4 a# y' j3 a
  36.                 mov     al, 0D0h
    $ N0 j; F7 Q! s3 H' x
  37.                 out     64h, al
    , ^% v4 h" r5 s$ s$ Y
  38.                 call    A20Read & b2 }4 l" w3 h& _* x4 B/ Z
  39.                 jz      enable_int 1 Z& }! d6 o! ^
  40. * Z3 U8 z* y# r" l8 u7 C5 O4 x
  41.                 in      al, 60h                 ; Get current status
    0 K1 b( H$ x; G2 y$ c
  42.                 mov     ah, al
    " H8 I- i- c, S+ F
  43.                 call    A20Write ) D% {% L" s9 j9 t: ]: P+ g
  44. enable_int:    sti
    $ r# F6 g* _7 W' ^" z
  45.                 jz      exit_enable2 P' M4 H) X( X; E  K9 m

  46. 5 R& z& `% K: Z7 N# m7 z, y
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the
    / X4 K8 i( l4 E; L& d; N) M/ u
  48.                 out     64h, al                 ; Out Put Port next % z1 f+ A+ R2 G* D# G3 [, @* _
  49.                 call    A20Write ( N0 {- u4 o5 s" [
  50.                 jz      exit_enable9 M) C0 J7 R0 T: C

  51. $ v) [! W  M" A' @
  52.                 mov     al, ah / r) L1 ]2 A* P8 l1 f
  53.                 or      al, 2                   ; Enable line A20
    , v# H# K/ @. e9 ?
  54.                 out     60h, al
    2 }+ G" I8 A& F, W: P; Y
  55.                 call    A20Write 1 F" |, m( M! m1 x; Y
  56.                 jz      exit_enable
    * r8 {6 e( i! Q0 C1 T

  57. : ~$ R+ `4 Y  ^% M$ m! H6 W( w
  58.                 mov     al, 0FFh                ; NOP # G  o2 {* V" U" f- M' e9 n3 Q: E
  59.                 out     64h, al
    % r2 b+ x3 P8 Z1 ]  }' o- H
  60.                 call    A20Write
    $ |! w  g+ l/ D
  61. + ~9 }/ b6 }) X8 k6 d; A
  62. exit_enable:          ret
    ; H& W. g4 Y& D
  63. 8 R# Q# C5 G+ B* V6 z  Y) X
  64. A20Write:       xor     cx, cx                  ; Reasonable wait . }6 r  J  W2 o$ M5 s% ]9 u( {" j+ W
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    2 u! Q, a: [- U
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear 1 Z: x/ `3 e' R5 L7 C  z3 s& @( M- t# ~
  67.                 jz      clear
    0 Q! V; ?4 k- n1 C" z
  68.                 dec     cx
    # `* y' B* t- K0 b9 }$ c$ L
  69.                 jz      exit_write
    - _9 z$ P! |1 R' K0 B8 ~
  70.                 jmp     short get_wirte
    % _9 y; y( b) n9 g3 O
  71. clear:          inc     al                      ; Clear ZR
    : `+ l# R. }% h* s3 ]
  72. exit_write:     ret
      }# @& m: j& `+ {0 P9 w4 n- H

  73. 5 s7 O4 G( F" f$ c

  74. ( \/ o' Z3 J0 G& T: T. ]) K$ {
  75. A20Read:        xor     cx, cx
    ; Y0 V) j5 A9 L7 f# B2 i* H% w
  76. get_read:       in      al, 64h
    7 @; J2 A+ Q2 A
  77.                 test    al, 01                  ; If the 'output buffer' is full, has 7 P% K# y/ M' p) l/ u, n. [
  78.                 jnz     exit4                   ; ...
    2 _! @/ l+ m. e/ N5 h1 v
  79.                 dec     cx
    2 r0 ~6 H: U- [
  80.                 jnz     get_read
      e6 O$ c0 i+ T/ \/ \) B
  81. exit4:          ret     
    ( z. d3 `- G  c6 A! Q& q
  82.                 5 Z4 i. z$ y' j4 p3 t
  83. end
复制代码
  1. ;A200FF.ASM 7 H* _* g' ~  O& ^$ e* ~# p- T9 X
  2. ;   u" ^  x, c# k5 a' e& Z0 o* w) Z
  3. ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-014 e! h6 o5 c* u# M2 o: q% P# w+ ?
  4. ;       ml A20ON.asm : b( g! F& |% [! g; V
  5. ; ( C0 @5 b4 N7 J' K) l: Q
  6. .model tiny
    ' X6 l, A- X8 Q* R
  7. .code# {* [2 a$ a5 Y/ h$ K. c# e
  8. .4861 X$ |, x2 L- B& {0 `5 Q5 n9 ?
  9. .startup. P' r' G$ W# j: @% n& i; m
  10. : i* _4 v5 ?, s  ^5 V* Q; f. {9 r
  11.                 mov     dx, offset msg_author
    2 U* S! f1 y2 P) b: F+ q8 A, Y
  12.                 mov     ah, 09h
    % n6 |' U2 e8 I& @& S0 M+ o, C
  13.                 int     21h0 M" _, T2 i7 F7 R4 C9 `+ @

  14. - |  O2 `1 O# I1 ~+ x
  15.                 mov     dx, offset msg_fail
    * r2 G) ^7 i3 K7 z  J
  16.                 call    A20_DISABLE
    2 }+ W" m/ ~  Q$ m. X5 i/ E; N, B5 e
  17.                 jz      exit1: Y- t) A: s0 @
  18.                 mov     dx, offset msg_ok
    - q) d# i7 V0 ^8 R- M

  19. # h* `/ f8 f: l5 T5 c6 N
  20. exit1:          mov     ah, 09h
    " b( _0 t% c5 J7 s5 D
  21.                 int     21h - u9 [4 W8 }! V( A7 m' V
  22.                 mov     ax, 4C00h
    3 q4 ]2 y. J% Q+ x. L; _
  23.                 int     21h ) k1 ^/ {7 F) O- D
  24.                 + j! m6 g: D% |( R' i2 s( q5 ^3 D) Q! W
  25. msg_author      db      "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
    $ j! S" l) W! ?; w! g
  26.                         "2008-07-01",13, 10, "$"
    . A" g; x9 o  o+ n" ~
  27. msg_ok          db      "A20 Disable OK", 13, 10, "$"
    ( }  ?( A4 T8 V, P5 X% U* E0 W
  28. msg_fail        db      "A20 Disable FAIL", 13, 10, "$"
    2 d2 R, t! D1 L' A) S$ D$ b
  29. , a0 H# @& K" {  N
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    - p% R- l! v) B- B, N) v
  31. A20_DISABLE:
    7 V# {1 H9 S8 b4 t4 e/ F
  32.                 call    A20Write 1 j- }* p6 ^3 ]0 z
  33.                 jz      exit_disable
    + q8 X! W. ?0 s9 l1 T

  34. ! A, k' {, v, l) D
  35.                 cli                             ; Only need for reading value from KBC 4 u: q, n) X( F6 K- t2 n# x6 R4 x- l
  36.                 mov     al, 0D0h 9 M, q3 Z3 f2 F, ~
  37.                 out     64h, al
    1 ?2 _  X9 z. v9 P" v
  38.                 call    A20Read 6 M- E# r4 n6 Q# r/ F
  39.                 jz      Disable_int
    ; J1 e9 c" u: d* p2 j) e
  40. 8 n% d* T+ S, E& P( ]/ b
  41.                 in      al, 60h                 ; Get current status
    " j0 m# C# q0 j* w9 {
  42.                 mov     ah, al
    ( ~4 U) h  S% n( C3 l, L* Y0 X
  43.                 call    A20Write 9 J1 i6 B+ l$ ~1 ]7 `& @
  44. Disable_int:    sti
    ) @& s( e, _' p. F7 q
  45.                 jz      exit_disable  E2 q) Y. ^# b# D* g

  46. 3 f$ c' }# v0 ?& q9 a- D, W2 |  T  Q
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the
    ! A1 b/ h$ U' E2 E3 ]' p6 _5 y& c
  48.                 out     64h, al                 ; Out Put Port next
    ' d, [8 p4 f7 H5 F5 s
  49.                 call    A20Write
    3 G8 f$ D7 R: c9 w2 z
  50.                 jz      exit_disable& m* p1 z6 P& ^* ^, c7 \- \' n, P( }# W
  51. * i: D1 F5 d& K, ~2 [
  52.                 mov     al, ah
    $ W3 K  j' Y4 w/ @: \6 j' `
  53.                 and     al, not 2               ; Disable line A20
    % j# d. r1 g' p" l
  54.                 out     60h, al
    ) s9 m8 }& K. ]* u4 X; L
  55.                 call    A20Write 3 Z: S2 Y# M7 ~' T# `
  56.                 jz      exit_disable* I* n5 Z$ x) b3 P: g2 p: s

  57. / C8 _- [% P: {/ h: ]
  58.                 mov     al, 0FFh                ; NOP
    - o. _. Q* [3 ^, z1 N& \2 I) ?! b
  59.                 out     64h, al
    6 A+ b% ]& q/ X, ^1 r* n
  60.                 call    A20Write
    . d& l7 d3 s  ~0 N! c- B/ O
  61. 1 u. G' Y& u0 }. k
  62. exit_disable:          ret
    ( i, e' g* W  ?1 n/ u. C

  63. ! G) G6 f* y  d- o$ u
  64. A20Write:       xor     cx, cx                  ; Reasonable wait
    9 |3 Z& f1 Y+ ]$ J% Y: Q
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    ( L& {* Y2 J6 U! G
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    : d' q6 ~( ^9 v- {6 t
  67.                 jz      clear ( \" y( o# y- X$ N: I
  68.                 dec     cx
    : |: Z' }  b8 L" u! A! g: j* F0 x
  69.                 jz      exit_write
    4 ]8 P0 b# |- i4 k2 U6 ?2 N* ^
  70.                 jmp     short get_wirte 8 s6 j6 D. L8 @( X* D) i/ c9 e& J; U
  71. clear:          inc     al                      ; Clear ZR
    - u/ F& e8 l- |) Y0 ^  y" T
  72. exit_write:     ret - t# \1 c3 C$ T) T/ O

  73. 4 D/ H" k7 A& U# s) z' ?) [5 ?/ C
  74. ! g: g( N! C: `) {
  75. A20Read:        xor     cx, cx
    8 i; X$ x& i9 c: _
  76. get_read:       in      al, 64h ' X& s) T2 a- @( B  C
  77.                 test    al, 01                  ; If the 'output buffer' is full, has
    4 a; T: t' P7 M' i) d' L
  78.                 jnz     exit4                   ; ...
    ' k" `% p/ L7 d5 [- c! S
  79.                 dec     cx 9 n0 W+ f% N3 t4 J; m7 n+ [
  80.                 jnz     get_read
      t2 g' d# W' c9 W+ T1 G
  81. exit4:          ret     ' k0 @1 q+ K9 v, Q3 G. [
  82.                
    * J8 r7 U: `/ `5 d# _! R5 e+ X2 Q" t
  83. end
复制代码
  1. ;A20STATE.ASM 1 n/ ^! Z) Z" Z, G( k  @! T. N% `0 v
  2. ;
    3 y- e; Z! B) b
  3. ; Returns the status of the line A20 through the KBC
    ( ~  m1 _% e4 Q% \
  4. ;       programming by bini for debug. 2008-07-012 f3 D2 h1 T; p' V7 C& b5 m
  5. ; 7 S6 l9 a' D! c) P& N& g; h
  6. .model tiny
    3 A4 _4 F. B+ l0 H9 W
  7. .code
    , d" z9 q6 @9 U* s% X
  8. .486
    & S4 H! W. P6 e4 d4 n& {" q8 a( A! X" r
  9. .startup. \, p9 a5 G$ p7 V9 ?' x; d) @7 L
  10.                 mov     dx, offset msg_fail
    ! H& O2 d- L5 D1 a% h+ K% X
  11.                 call    _GET_A20_STATE_
    , B: J/ L* f/ V! R$ {8 O
  12.                 jz      exit1                           ;  was a problem$ g  }0 l2 R/ E! d7 b
  13.                 push    ax                              ; Save state, AH
    1 F( a& D* K: M! ]; e) F/ D
  14.                 mov     dx, offset msg_ok                      ; There wasn't a problem % N0 p% E: z" m: E9 P( x) H; [, C
  15.                 mov     ah, 09h 8 \+ K$ R, c) a/ F" S3 _- M
  16.                 int     21h                             ; Print message
    ; |: {: j, k' r1 T/ @. x2 g9 J( g
  17.                 pop     ax                              ; retreve state 6 [8 b6 Y& i* F' E" l( d. D! X

  18. 0 |0 U" `6 R& ]8 r
  19.                 mov     dx, offset msg_dis
    + \) e- h& z1 Q. v* i" C# W
  20.                 and     ah, 00000010b                   ; bit 1, 2h, indicates state
    ' |0 G% f3 a3 J" m; V
  21.                 jz      exit1 : d7 _4 G6 ?# ]$ x
  22.                 mov     dx, offset msg_en
    2 o; C& K" b% C+ O  h$ V! E
  23. ; r) A' ~8 s2 R  U( k& W% p
  24. exit1:          mov     ah, 09h 6 g0 V& w9 ?6 b
  25.                 ; DX already contains address of string % G6 K0 a' b2 w  k
  26.                 int     21h , l7 _; @3 s* M

  27.   ]& l7 v; P, k) W/ Z
  28.                 mov     ax, 4C00h 3 h8 ~0 ]9 T/ g# Y
  29.                 int     21h & ?2 e/ x# c9 \; w) }: @
  30. ' h6 |' a7 B/ s  O0 C
  31. msg_ok         db      "OK", 13, 10, "A20 $"
    9 v# N1 F* O5 Y
  32. msg_fail       db      "FAIL", 13, 10, "$" # v- V7 [; K6 k( R0 U; W. e/ |: |1 V8 P
  33. msg_en         db      "ENABLED", 13, 10, "$"
    - ?! U( g4 f/ j& o' H" L
  34. msg_dis        db      "DISABLED", 13, 10, "$"
    8 Z' w3 R. O5 g. K

  35. 0 T, Y3 _, D: E  q
  36. 0 \7 T& N0 u6 R
  37. _GET_A20_STATE_: - T; j- M+ u/ t& x' ^. m. ?
  38.                 call    A20Write                ; Wait till the input register is empty ) L8 N: @: S2 c9 E; @- }( I
  39.                 jz      exit2+1                 ; Bypas the reset int's
    8 a& S# R/ C3 b  [' [* m8 _6 ~7 O2 [
  40.                 cli                             ; Disable ints so we'll get our value 4 [0 a* i$ T" I. ?* |9 [

  41. 4 {* z1 Y( o2 O, h- a4 z9 e1 C
  42.                 mov     al, 0D0h                ; Send command to the 8042 command register
    ) t2 O; o0 c% C9 Q* ^, N- a) h
  43.                 out     64h, al                 ; to tell it we want to Read the Output Port " I3 B! m/ n& d8 Z6 P; G
  44.                 call    A20Read                 ; Wait till the 8042 output register
    $ [* Z2 y- x+ C4 S$ \" L0 f
  45.                 jz      exit2                   ; has something in it's buffer 4 S: f: T6 o% N9 I) I* F& a* ~

  46. 4 g( w( R8 H5 [6 }0 R5 }
  47.                 in      al, 60h                 ; Get it + @9 X7 n5 E- }0 s, ~4 z3 D' t
  48.                 mov     ah, al
    / L# D4 {8 Y& j
  49.                 call    A20Write                ; Make sure the input register is empty
    : L- d9 t  j4 x' z: J' j- X
  50.                 jz      exit2 % t! l7 D0 L! D

  51. 1 i8 N' [3 m9 j8 i7 r5 q3 P
  52.                 mov     al, 0FFh                ; KBC NOP command, does nothing ( q" j: _6 v7 }& w
  53.                 out     64h, al
    0 e, e5 A: q$ Z6 G
  54.                 call    A20Write
    1 R% m, c0 S# L* d8 V

  55. . d) y6 K$ T1 b/ c! t* T8 ?
  56. exit2:          sti
    , J6 I) \6 I1 m% I5 W& |
  57.                 ret3 {$ g% |; v' u, E
  58. * P& o2 B( i& t, `; Y% q$ D" c

  59. 8 w3 d: b' t; X+ |
  60. A20Write:       xor     cx, cx                  ; Reasonable wait : }/ ~- M" m! h: {9 L0 D
  61. get1:           in      al, 64h                 ; Get KBC read status
    % }- r) M8 U) b% L0 G( U
  62.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    : Y2 Q- x+ k' h4 B! I1 C$ W. V5 @% E
  63.                 jz      clear ; S" _4 f; N$ ^1 R, w
  64.                 dec     cx & X( S# T( z6 ]5 w- h
  65.                 jz      exit3 ; B  A4 J, \; s. _* S* e6 u
  66.                 jmp     SHORT get1 4 `  |9 d. U- ~/ c
  67. clear:          inc     al                      ; Clear ZR ( o. `$ F0 H2 i( C8 A) C
  68. exit3:          ret
    4 ~7 C2 X3 G7 [2 w- n1 ?) X
  69. - \, A: G& A$ u

  70. / T, T/ ]3 ]0 `' Z
  71. A20Read:        xor     cx, cx 9 f( h: b" c! J0 B# W
  72. get2:           in      al, 64h
    ; Z/ N1 O8 G4 m* r" r( g$ T
  73.                 test    al, 01                  ; If the 'output buffer' is full, has
    * }7 P5 M/ i' m2 c% U) }5 B
  74.                 jnz     exit4                   ; something for me ! m/ E% a+ F$ z* ~6 p
  75.                 dec     cx . |( t4 k, q# P" l" z8 A1 q
  76.                 jnz     get2
    - d, [! L* \5 @, ~" \
  77. exit4:          ret     * g2 u6 \6 z4 N
  78.                 / ~, z7 m9 A' a$ H( u  V5 x8 y
  79. end
复制代码
发表于 2008-10-21 17:14:36 | 显示全部楼层
void openA20()
2 \+ }8 r- W/ D1 n{        while(inp(0x64) & 2);        outp(0x64,0xd1);. R( h4 G* O7 l
        while(inp(0x64) & 2);        outp(0x60,0xdf);
8 \" x) ?* P0 e9 {        while(inp(0x64) & 2);        outp(0x64,0xff);
! ?3 Z* c+ K  @: a8 s6 k/ R}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:37 , Processed in 0.056936 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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