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

Enable or disable A20 gate through KBC demo code.

[复制链接]
发表于 2008-10-8 14:58:49 | 显示全部楼层 |阅读模式
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。
  1. ;A200N.ASM 6 a" K# X3 d5 `
  2. ;
    $ z( p6 X( o4 |9 i* w
  3. ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-016 z( g5 V' ?6 ^
  4. ;       ml A20ON.asm 7 w8 e" f. J9 ~# @2 W1 D
  5. ;
    8 b6 o7 k6 w6 }% v
  6. .model tiny6 X6 ~  i* L/ r0 x3 ^$ |/ K
  7. .code
    / F1 w: O9 e# C6 w( Y
  8. .4864 M: X3 k2 s1 i7 b$ Z7 \
  9. .startup' P7 f) F. X3 r
  10. & P8 v; u7 B' p. \: [, \
  11.                 mov     dx, offset msg_author
    : C' X* {( o3 E0 K* E% n% f
  12.                 mov     ah, 09h
    ' w0 y0 Z  [1 w( e& l
  13.                 int     21h1 |( y9 ]$ _* \$ |8 l

  14. " ]) k8 b1 U! j  p( X7 \# }
  15.                 mov     dx, offset msg_fail
    8 z( G+ j/ u/ ^/ |; @+ h
  16.                 call    A20_ENABLE
    3 E+ |+ s2 c% }, P9 w, U3 g
  17.                 jz      exit10 t; v  b% D) ?* Y4 K& a
  18.                 mov     dx, offset msg_ok
    " @# ^2 Q) q2 k; \! I

  19. - t1 b8 L$ p) ^& l. ]
  20. exit1:          mov     ah, 09h
    2 A4 P4 r: k2 l2 l& m4 j
  21.                 int     21h 8 z# N0 C+ H& W4 w. ?
  22.                 mov     ax, 4C00h
    + ]0 w, U! F' S% k9 Q  {
  23.                 int     21h % @5 b8 B/ b! i9 t
  24.                
    ! ]* d$ P3 O" N, V5 z- w
  25. msg_author      db      "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,
    ! K% X4 R, J6 n, o  y5 J" [1 J
  26.                         "2008-07-01",13, 10, "$" 6 S+ s9 j: Z* w* ~5 H6 r
  27. msg_ok          db      "A20 Enable OK", 13, 10, "$"
    ) H& P" ]2 T) v: e2 `! D- E
  28. msg_fail        db      "A20 Enable FAIL", 13, 10, "$"
    ) ~" _, _) J- g5 D) u+ k! m

  29. ; b$ j! _' t, f
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    3 k/ Y2 q# u0 K+ o- }, Q) M! u
  31. A20_ENABLE:   x) T# X7 U1 n3 z8 u! |' D
  32.                 call    A20Write
    , [2 {! ^; R( H, l( `, r
  33.                 jz      exit_enable
    & ~4 R0 Y4 D" l1 Q( ?) m' x$ N% o
  34. 2 a2 j' Z8 M, l) k6 l  T4 j
  35.                 cli                             ; Only need for reading value from KBC
    4 l* h7 t7 B/ t
  36.                 mov     al, 0D0h ; J" u0 |+ L! I' e3 p% ]  X* Z$ g) m1 K+ Q
  37.                 out     64h, al
    6 P2 W( M- G6 n. q# j) r4 P7 i
  38.                 call    A20Read
    ) ^! j0 \9 ^( J: G
  39.                 jz      enable_int
    $ |( Q8 M  ~. I
  40. 6 N- i" T7 x  @0 g" v, C
  41.                 in      al, 60h                 ; Get current status ' ~1 V% j2 W4 L& |8 w1 q
  42.                 mov     ah, al 7 N: J' [$ z! {) ^; t! b# ^
  43.                 call    A20Write ) C/ l" {5 y, e2 A! b! s" B; \
  44. enable_int:    sti
    5 Q: b; Z5 H$ k1 J; i4 u# i3 H
  45.                 jz      exit_enable2 z  L9 P2 T7 N3 a$ R1 l8 D( b

  46. 0 K4 D* L7 q  h/ Q- W. V
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the
    * p6 _) `, z6 X& l% |7 L. s$ x
  48.                 out     64h, al                 ; Out Put Port next % I- \+ }8 n4 `' y" Y, ?
  49.                 call    A20Write 9 w3 ~  h. Z7 U1 s" W/ \& X) E
  50.                 jz      exit_enable  F/ k3 S2 x4 R7 r; z: G& a

  51. # q5 r' @) ^1 A+ R6 E5 t  F8 S
  52.                 mov     al, ah
    - i. E/ ^0 _* q# ?- u
  53.                 or      al, 2                   ; Enable line A20
    # \8 S6 p2 c4 C
  54.                 out     60h, al
    " {$ @) ^! ^$ T8 y- c
  55.                 call    A20Write
    ! a. I- ^" g9 u0 `
  56.                 jz      exit_enable
      l( v8 z# I% _7 e  F

  57. , O: a2 m. D" H, L
  58.                 mov     al, 0FFh                ; NOP $ c: J8 p9 A3 o/ c
  59.                 out     64h, al
    ' I5 T. m5 g& C& t
  60.                 call    A20Write & T1 b( V9 N4 r; h' G
  61. 7 Y) Q8 @! W$ T* a9 C! t9 j# Q  o
  62. exit_enable:          ret 0 F, ~3 Y' l' U1 w2 U1 X4 i9 D

  63. $ H  L) @' T4 e" {% `/ z5 s! c
  64. A20Write:       xor     cx, cx                  ; Reasonable wait
    9 n. {* o7 o* [
  65. get_wirte:      in      al, 64h                 ; Get KBC read status & m( r7 z2 K3 {6 t1 w5 A7 a; D7 F
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    * n3 q/ S) ~& ?
  67.                 jz      clear 2 i4 W; n1 t$ i1 Q% B+ c$ X
  68.                 dec     cx 4 L. {+ c; h+ i# q) o
  69.                 jz      exit_write
    . D" J8 d, X) y! R, @
  70.                 jmp     short get_wirte
    0 p8 i" ]- \! ]- U1 h6 H
  71. clear:          inc     al                      ; Clear ZR
    5 l0 n4 `2 s; _( F
  72. exit_write:     ret 0 e" g% l/ M% N- o7 [3 C! v+ b
  73. * l& i- l+ j" A7 M) a
  74. 2 c. P/ d, ]/ S9 V) x0 M
  75. A20Read:        xor     cx, cx ' ]: |9 T$ C4 e* ^, P
  76. get_read:       in      al, 64h ' W# a1 A7 r3 p  _3 A# E/ \" d7 z
  77.                 test    al, 01                  ; If the 'output buffer' is full, has
    ) g' @4 [0 ]( v) j
  78.                 jnz     exit4                   ; ...
    7 h" `0 @! e+ z4 T* N1 ~  g. y* {
  79.                 dec     cx
    & z( T  I5 `8 f5 q" y
  80.                 jnz     get_read8 a# Q) w+ W# }1 c/ G
  81. exit4:          ret     
    0 u% c( o2 Q/ y. s2 y4 K6 h3 K
  82.                 $ e8 U& X( S: `/ {4 @
  83. end
复制代码
  1. ;A200FF.ASM . {1 t7 D4 O" {$ t  @" @! X
  2. ; 0 v7 a. z) R* Q" A
  3. ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01
    # h2 d) ^& F$ G& z# I" e7 j
  4. ;       ml A20ON.asm
    : ?6 l2 H! }3 `, q$ Q, B, G5 K7 {2 i
  5. ;
    / j- t6 `5 O' f% i
  6. .model tiny
    5 f+ {# l1 m, U; Q' \  C" k" E( z
  7. .code
    / R& l* n6 j; v0 h1 S
  8. .486& |0 c3 s0 K( x
  9. .startup6 ], C$ L. v0 O! ?9 O( s. w
  10. + c* H2 H% n5 ~6 M# y9 T6 [
  11.                 mov     dx, offset msg_author" j7 e1 O& A  p" ^( ?
  12.                 mov     ah, 09h
    " o6 e: q+ w5 p
  13.                 int     21h
    $ E5 X3 V( n% _
  14. & p( I4 @- a. x" q4 y# X
  15.                 mov     dx, offset msg_fail 0 h$ `, \: [6 b8 u; @6 _
  16.                 call    A20_DISABLE& m% _4 g( s/ q& R7 h: x
  17.                 jz      exit1, i1 Y; H$ M; Y8 K- e$ F2 e
  18.                 mov     dx, offset msg_ok 1 n, f6 ?& m. m8 p2 K. ~' Y( c4 ?
  19. ! q2 v% {8 ?9 R5 e9 P$ p& u# \& ?+ r" Z" P
  20. exit1:          mov     ah, 09h & I9 f1 G# A  P9 Y
  21.                 int     21h " H6 q# N0 Z' R4 e1 D$ a
  22.                 mov     ax, 4C00h
    6 }. R+ N. j  b" b
  23.                 int     21h * N" ^' p8 k, z$ V. Q
  24.                
    * u7 [$ T/ j9 z' [: y
  25. msg_author      db      "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
    6 s: d/ K- H# J- E, e
  26.                         "2008-07-01",13, 10, "$"
    7 `; k( d/ p' A5 \  S
  27. msg_ok          db      "A20 Disable OK", 13, 10, "$"
    : _4 S. v' O& Y+ v6 T
  28. msg_fail        db      "A20 Disable FAIL", 13, 10, "$" ( ]& {) ^+ R6 y5 D
  29. ! i  h# T1 D3 |6 d+ [" A$ P
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------5 ~! C1 @  Z8 ]" f3 s6 M" q5 s$ j. y
  31. A20_DISABLE: 1 I+ i0 E9 z4 v& l; e8 [
  32.                 call    A20Write
    : C: g: C9 F- [" t! ~! @) l
  33.                 jz      exit_disable
    2 w& N: R  [9 X3 S9 g4 K0 t
  34. 5 I" h. Y1 Y% V/ j
  35.                 cli                             ; Only need for reading value from KBC
    - O/ Z/ ~5 z" a' C  N* i
  36.                 mov     al, 0D0h
    $ t& I, A- ^0 P) N2 K
  37.                 out     64h, al
    0 x5 ]4 r1 n; R) D( t9 q0 Z
  38.                 call    A20Read . O; \" X2 F, y& ^* W0 x
  39.                 jz      Disable_int
    & V. F3 I; B1 `% t; Z

  40. ( Y6 G) `( E2 h# H; E
  41.                 in      al, 60h                 ; Get current status + o8 r) [7 E& I( ^4 P/ u. `" `
  42.                 mov     ah, al - b! l+ D2 x/ v+ {' P
  43.                 call    A20Write
    % {& g3 u& ?; s8 ]
  44. Disable_int:    sti : j3 x9 @. }" g9 F. C# |+ ?- ]+ C
  45.                 jz      exit_disable% o0 d" q5 D# F; x7 t: ]

  46. # V2 I( H* b1 m% |6 k: M% @
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the
    + y3 }1 c/ \: T8 |9 x9 k: z% ]4 T
  48.                 out     64h, al                 ; Out Put Port next ; p. }  X. k1 V3 e+ m) N6 W
  49.                 call    A20Write
    , h" X* ^1 a* f3 j* a
  50.                 jz      exit_disable2 T, ^/ u/ I& |% G5 v

  51. 7 p" r) `. ^5 ^/ Y1 b' D
  52.                 mov     al, ah
    $ ?: L! B$ j& i2 r, E* w3 h
  53.                 and     al, not 2               ; Disable line A20 ' A, u# P- W- a2 S1 G& V1 p
  54.                 out     60h, al
    7 `$ g- J: @; g0 w# F
  55.                 call    A20Write : z) @( N6 Q' b" J
  56.                 jz      exit_disable
    4 F+ U% l1 \. q. s2 e2 |
  57. + X, n; S" M' l8 D
  58.                 mov     al, 0FFh                ; NOP 7 h2 \: g# a; i
  59.                 out     64h, al ' c/ W# A2 c. v# x
  60.                 call    A20Write
    1 @5 p/ n6 p. {
  61. 8 e# k2 Y8 Z3 t: K4 h) w* o9 W
  62. exit_disable:          ret
    3 k( _( H- w. _9 C( p' K; k
  63. 9 Q2 N  g  @) Z* V
  64. A20Write:       xor     cx, cx                  ; Reasonable wait % ?( X0 r' U6 _. q  v6 x5 G, K. j
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    ; L: T; ]* Z3 f0 ~* A( s) t
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    0 X+ B5 w1 @8 q4 A; j4 T
  67.                 jz      clear
    + H* z6 w# Y% V' b" d, u
  68.                 dec     cx ( L5 I5 B/ A, Z+ S" i" _
  69.                 jz      exit_write
    + u# ]0 B6 |5 w+ i
  70.                 jmp     short get_wirte , K( F! {7 j8 r4 b% t
  71. clear:          inc     al                      ; Clear ZR
    1 ~% A/ Z, C( V
  72. exit_write:     ret
    ) @; t( M, U6 @4 y& S

  73. / i; H# ]& `$ v' q& Y7 F
  74. 9 ?* ]+ s, E9 W8 Z& y  z
  75. A20Read:        xor     cx, cx
    ; k. m  N+ }# _3 N
  76. get_read:       in      al, 64h 7 f% z$ F& u; Q" E9 {6 m
  77.                 test    al, 01                  ; If the 'output buffer' is full, has 7 Z2 p, e0 [- |
  78.                 jnz     exit4                   ; ... " c  D, C8 |6 o
  79.                 dec     cx
    , ?, D- ]& y7 i& P+ O( g5 o# V
  80.                 jnz     get_read
    ! p( o6 l7 k+ ^2 z& W( U$ C
  81. exit4:          ret     0 c" M3 S! P6 N! F
  82.                 ! k- ]) ]6 b1 _9 y  g* Z
  83. end
复制代码
  1. ;A20STATE.ASM
    6 V" {- w+ B" O$ s# K
  2. ; 3 ~6 R! c/ U' s* P* b: E" o  R% F) Y. j
  3. ; Returns the status of the line A20 through the KBC
    ' `) e* u) A# t5 e8 i
  4. ;       programming by bini for debug. 2008-07-01
    4 N2 k7 A) z. m6 N
  5. ; " R1 ^  H) U, R; o  |
  6. .model tiny
    8 P" O! c1 M1 k" e
  7. .code
    6 ?' {! H, s& _) K1 [. W; @7 P
  8. .486" E, P8 i- ~4 ^- j! D
  9. .startup7 T0 a% f; @9 u. j
  10.                 mov     dx, offset msg_fail 6 r8 v, Q% I4 x
  11.                 call    _GET_A20_STATE_  b1 V$ N( o0 U  ^7 M2 C
  12.                 jz      exit1                           ;  was a problem
      k: q% M( a  n$ D; G9 J* F$ w& A! g
  13.                 push    ax                              ; Save state, AH 2 C" x* w  ^$ _3 G$ c7 F' v
  14.                 mov     dx, offset msg_ok                      ; There wasn't a problem # d, z6 a% u, j7 k
  15.                 mov     ah, 09h % I( ~- }* b8 ~7 s) d  m
  16.                 int     21h                             ; Print message
    4 E! z+ k( _8 L( l
  17.                 pop     ax                              ; retreve state
    ' q9 [; w( G/ H" c; A

  18. 2 }7 W% V- H  D4 a
  19.                 mov     dx, offset msg_dis 7 b* j) s! m6 f- j' q
  20.                 and     ah, 00000010b                   ; bit 1, 2h, indicates state
    , ]: j, T2 }% _/ j! b( b
  21.                 jz      exit1
    1 b& s6 k( v* O2 U$ N. z+ N. M
  22.                 mov     dx, offset msg_en
    ! z- g1 h% ^+ C
  23. 1 l. L) F# n' U% ]
  24. exit1:          mov     ah, 09h 7 \& R5 w" B; I* l2 Q7 p
  25.                 ; DX already contains address of string
    . f. E, O. J) [: j9 ~3 T: S+ c
  26.                 int     21h / X1 D7 V/ a0 X  j" c' [+ f8 U
  27. & U* V+ V6 y2 ]7 \
  28.                 mov     ax, 4C00h ' I- `4 {) g) \  z
  29.                 int     21h ( l. y% A' W' g* I  L/ h5 B0 B4 ?

  30. $ |+ C, ^% z' [- b. Y1 ]; z" P. M6 J
  31. msg_ok         db      "OK", 13, 10, "A20 $"
    5 a2 E) T' F5 a( @
  32. msg_fail       db      "FAIL", 13, 10, "$"
    ) s+ N5 n$ N; T/ d
  33. msg_en         db      "ENABLED", 13, 10, "$" , E  |: A+ o# g9 ]3 z9 y
  34. msg_dis        db      "DISABLED", 13, 10, "$"! `. W6 \6 X" z: u9 d: L* x; c
  35. % m' e# `& Y' p8 H: _7 ?# Q, U

  36. 2 y* A8 x# Y5 @% n
  37. _GET_A20_STATE_: # s( v6 P* t. ?* C6 d) w" @# Z
  38.                 call    A20Write                ; Wait till the input register is empty
    - c7 V( f  q" V, Y
  39.                 jz      exit2+1                 ; Bypas the reset int's
    2 W& C! W# N- j1 \
  40.                 cli                             ; Disable ints so we'll get our value
    ! p0 t; y) _: r) ]  U
  41. . v# }- W' x6 P. n) Y
  42.                 mov     al, 0D0h                ; Send command to the 8042 command register
    " X$ m. B( f2 k- c1 a0 o
  43.                 out     64h, al                 ; to tell it we want to Read the Output Port 7 ~; Z1 G6 ]3 z* X
  44.                 call    A20Read                 ; Wait till the 8042 output register
    3 o2 `0 K3 p& X, W" E) m4 V) ^
  45.                 jz      exit2                   ; has something in it's buffer 7 A/ \4 Y4 R. E& a, U, h) I

  46. 9 F1 w$ G# }2 i- l) D, H1 D5 O
  47.                 in      al, 60h                 ; Get it
    " U& V: \, T1 s) u7 k0 Q( \! F, y
  48.                 mov     ah, al
    3 t! `( t6 m5 V! ]$ z
  49.                 call    A20Write                ; Make sure the input register is empty 0 ^, s& [7 T+ A' |
  50.                 jz      exit2 7 |* [( C. y$ w

  51. 6 V- s6 w6 h3 w  E- a) L
  52.                 mov     al, 0FFh                ; KBC NOP command, does nothing 2 B! @, H7 g/ v1 c+ p
  53.                 out     64h, al
    ; e% G$ W4 a' {
  54.                 call    A20Write ! G, m$ k% k6 o, q9 M$ y: ?: ]
  55. - [+ o* S: [& o7 M
  56. exit2:          sti , i% V/ c& R3 j1 B
  57.                 ret
    3 P( _# v9 O$ m* S
  58. * U9 C8 S" t. o+ q" Q/ m- `0 h
  59. " w! J9 y3 }; ~0 M7 N' F# z! N) _/ k% ~
  60. A20Write:       xor     cx, cx                  ; Reasonable wait - K( w$ M* o8 @  F, e0 _0 D
  61. get1:           in      al, 64h                 ; Get KBC read status
    # z* d% Z$ `& {8 l
  62.                 test    al, 02                  ; See if buffer empty, bit 1 clear ! I- x4 u, t. P
  63.                 jz      clear + c7 q$ w4 ~( L3 j5 T
  64.                 dec     cx 2 ?  m$ Y" @- w# X' q" {
  65.                 jz      exit3 + @: i" B0 L3 x  a$ u% v8 u& }
  66.                 jmp     SHORT get1
    " F% |7 h8 W8 Z: _" l/ B
  67. clear:          inc     al                      ; Clear ZR ( j/ n+ A5 u8 y5 M2 K& m% ~
  68. exit3:          ret 5 a* d5 O1 m) @
  69. . a7 t& H2 }' S# H

  70. 5 b( G, S9 S) i% h) B
  71. A20Read:        xor     cx, cx / ?( @& A7 P/ `0 P
  72. get2:           in      al, 64h
    3 j: K) x1 S/ |$ R! Q; x9 F' ]
  73.                 test    al, 01                  ; If the 'output buffer' is full, has
    # S9 ?& `$ C. u- z& a# g" V& i
  74.                 jnz     exit4                   ; something for me
    7 Q& a6 C& V: N0 r3 N
  75.                 dec     cx
    " f7 H0 z) ?- Z$ V- m6 H% L
  76.                 jnz     get2# {  f- N# `" f. R
  77. exit4:          ret     
    * a- _/ a+ {  f* [& P, a7 @: Z; R3 }
  78.                 ( o% I+ V1 x( B( C
  79. end
复制代码
发表于 2008-10-21 17:14:36 | 显示全部楼层
void openA20()
2 _. d; I6 Z+ C" x" o4 w{        while(inp(0x64) & 2);        outp(0x64,0xd1);) [5 |8 b7 e# h
        while(inp(0x64) & 2);        outp(0x60,0xdf);" Y% P& ^" M4 P( L# W
        while(inp(0x64) & 2);        outp(0x64,0xff);
+ k: _: c5 l' k. Y' G}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:48 , Processed in 0.024004 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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