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

Enable or disable A20 gate through KBC demo code.

[复制链接]
发表于 2008-10-8 14:58:49 | 显示全部楼层 |阅读模式
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。
  1. ;A200N.ASM , L' R% Z3 K% {# ]* l4 |' m; \
  2. ; 0 {/ I* s8 b5 {0 K2 a/ o
  3. ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
    0 y, X- n/ W) ]( C! C0 l2 g8 k
  4. ;       ml A20ON.asm ' n: \8 C" k& r: o2 ^; Q
  5. ; ; h& V' Q7 m  L. Y; ?4 F
  6. .model tiny
    2 I$ ^# w4 G  g2 [$ T
  7. .code
    6 N+ z7 G1 C+ }
  8. .486# z7 p1 p3 h5 f' Z  I
  9. .startup
    , F+ u  o! B7 o" \3 Y
  10. 7 f+ [5 I- i7 i7 H& }+ p
  11.                 mov     dx, offset msg_author3 H3 ?. f0 v9 I' @. J! x6 o
  12.                 mov     ah, 09h* R! f4 t5 \1 J( K1 \! w- I
  13.                 int     21h
    # l9 W7 n% x: z/ f6 y/ p  `9 @; r* @& I8 f, a
  14. ) f% U% D. B0 j' ?; v# k1 m# X
  15.                 mov     dx, offset msg_fail 5 c  X2 f' u1 @
  16.                 call    A20_ENABLE- O' s4 O) y* S7 w  c
  17.                 jz      exit1) [, `: j$ Z( a" l1 t4 x
  18.                 mov     dx, offset msg_ok ( e; r0 X9 Q; N! O3 p$ R- I

  19. . Z0 `' e5 @4 b" G+ Z/ Q9 I( e, n
  20. exit1:          mov     ah, 09h $ x; k5 a5 e# F/ k- b) e: L
  21.                 int     21h $ I! Y3 J# G: o' [
  22.                 mov     ax, 4C00h
    2 K* e- K. S  C# g
  23.                 int     21h
    2 H/ |* F2 R( A5 N2 i
  24.                
    5 O+ y- B8 q/ j. g
  25. msg_author      db      "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,: ?1 X3 Y5 P( O
  26.                         "2008-07-01",13, 10, "$"
    5 X$ J9 z% `  j& ^1 `* u5 R
  27. msg_ok          db      "A20 Enable OK", 13, 10, "$" 5 N3 w, i1 q# T) N& E4 W& b
  28. msg_fail        db      "A20 Enable FAIL", 13, 10, "$" : `1 _1 j, m( V
  29. / h) M* h" r# |* `( s* J
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------- {5 J* W% E7 i- l; t0 r8 [# S% k: q) o
  31. A20_ENABLE:
    , |+ y6 s$ ]: q2 b+ C7 @( ^' E
  32.                 call    A20Write : b* ]! I7 X" L# s
  33.                 jz      exit_enable! ^: W; p) ]9 e2 w- m( f
  34. / ?( d( q2 Z2 u% `
  35.                 cli                             ; Only need for reading value from KBC ; p% P, _! x( r; L
  36.                 mov     al, 0D0h 0 _$ X7 |# [! c: s4 g* X0 X
  37.                 out     64h, al
    ; A7 V' l: o/ g; h+ M6 j
  38.                 call    A20Read
    8 \  f* r9 w! D
  39.                 jz      enable_int 9 x  @- E3 R( [5 F  t
  40. , o! M( ?. q0 ^
  41.                 in      al, 60h                 ; Get current status
    % h- O; o& p/ p2 t7 a
  42.                 mov     ah, al
    ; ]/ l4 O1 a8 w0 @. p' X/ [/ W( T
  43.                 call    A20Write
      v% ~9 x/ ^3 |& i2 |, G
  44. enable_int:    sti
    ) \1 L9 _' a' [9 S
  45.                 jz      exit_enable
    & q, a) M# j; k9 I* r6 z

  46. ; q$ P! y: N4 k$ J& `; Y  `
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the & f4 _" v& D8 y. @! A  j- m
  48.                 out     64h, al                 ; Out Put Port next
    : i" ?) [! \9 t+ A9 b* d
  49.                 call    A20Write 5 W+ }! M: @  ]; I1 J
  50.                 jz      exit_enable0 R7 @+ D3 m% L1 n% S' N( l# C
  51. ; M0 _7 x  m& n7 |! o  Y
  52.                 mov     al, ah
    0 B4 h: r: R) f; G7 r* o& e
  53.                 or      al, 2                   ; Enable line A20
    3 m! C" K3 p6 h) \8 u$ a" _' ^# m: Q
  54.                 out     60h, al % |: n8 b5 L+ p+ R' N
  55.                 call    A20Write
    : P7 X2 U+ D, l2 @
  56.                 jz      exit_enable, w# o$ G% y3 q5 |0 Z( l
  57. $ J7 M! R' a* s- W
  58.                 mov     al, 0FFh                ; NOP
    * b& q  ~* ~" B
  59.                 out     64h, al 0 Y+ X3 U& U' _& Y2 |/ Q/ v: |
  60.                 call    A20Write 0 X4 i& P* \, Q* C' b* t5 q
  61. 7 j2 W7 y2 P0 M: r, B: C+ P; p
  62. exit_enable:          ret 1 l( a2 R' K& g+ ?* J% W: c( Z% a
  63. 9 O: ]+ w- o2 V' w( @4 M- A4 |7 y
  64. A20Write:       xor     cx, cx                  ; Reasonable wait # K$ D/ o* v: y: \! q9 A
  65. get_wirte:      in      al, 64h                 ; Get KBC read status ' Q& Y( [( R+ h( p& _4 p& g( u
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    - M6 e8 b) }: x! Y4 K" h
  67.                 jz      clear
    7 L9 _5 e# b2 q! X4 p, J& z
  68.                 dec     cx 2 m. L6 ~% v* S0 @3 ]0 c
  69.                 jz      exit_write , y1 f5 p9 ^. e+ J
  70.                 jmp     short get_wirte
    7 e3 O$ r! K6 m0 n: F1 N$ h: ~  z
  71. clear:          inc     al                      ; Clear ZR 2 k* I) y% z! Y. d4 u
  72. exit_write:     ret : |/ U' m& L& R
  73. : a0 V, a% S% w/ P
  74. : H. u* l* k+ _6 i. F. x
  75. A20Read:        xor     cx, cx % A/ Q! K+ g$ A) ]% @# ]
  76. get_read:       in      al, 64h * Y5 S% e5 t" o8 p! c$ C4 O1 i% _5 E! \
  77.                 test    al, 01                  ; If the 'output buffer' is full, has 9 b; V* a/ ~. b. \' w5 ]/ Q" H
  78.                 jnz     exit4                   ; ... & ^' @+ r/ U. c
  79.                 dec     cx 8 [9 q% o4 f5 ?. \. v7 D* A
  80.                 jnz     get_read
    # v' R$ O/ t, Y0 Q. K8 \
  81. exit4:          ret     + k' U6 E4 o% o3 d; r; N  Z
  82.                
    5 g& H$ k) l9 x: f  ^2 q
  83. end
复制代码
  1. ;A200FF.ASM ( {) A' j, J5 `: t
  2. ;
    + E, U' |% v& P/ z8 O
  3. ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-01! z# P4 b9 N( N* c+ |
  4. ;       ml A20ON.asm   ?- c1 k& \! ^, Q: Z8 y
  5. ; ; Y1 z3 E+ E' b; h3 W! F8 M2 `
  6. .model tiny
    . l( D5 E. Q- V8 J7 S
  7. .code/ v& a. p; @' I: J/ N
  8. .486
    8 B8 c- l( x, V$ Q
  9. .startup8 L+ D* g. t6 x: G0 W4 Y+ a& H
  10. ; |& {- u' W$ R7 Z% J
  11.                 mov     dx, offset msg_author
    / C" p+ c4 K0 `+ u% l# B4 I
  12.                 mov     ah, 09h( @6 a( G) ^- a4 q- Z9 x. I
  13.                 int     21h) v3 E& Y7 s6 C& k. f
  14. % d) e$ \" t' h' K' C' N1 N
  15.                 mov     dx, offset msg_fail
    ) R7 C- t5 w7 O4 ?( @( z  e
  16.                 call    A20_DISABLE
    # n9 h7 ^  z; q; N2 O
  17.                 jz      exit1
    - P  u# B" |, A% f  J2 @
  18.                 mov     dx, offset msg_ok 4 z  a+ n! [1 B2 O$ i

  19. . p) j6 H) p$ ~5 j* P
  20. exit1:          mov     ah, 09h & b3 x5 i3 j+ b3 P6 E8 F8 f
  21.                 int     21h
      f7 A6 G: b) K( M$ R
  22.                 mov     ax, 4C00h
    - A7 U5 m! v1 K% }, K
  23.                 int     21h
    * w# z! a" x& [# _/ n
  24.                 $ A, \* H" e. \" p! d  t
  25. msg_author      db      "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
    ' G$ T2 q& D+ V
  26.                         "2008-07-01",13, 10, "$" , L4 i; J$ J1 C, P5 T
  27. msg_ok          db      "A20 Disable OK", 13, 10, "$"
    6 q2 I9 T4 [* I
  28. msg_fail        db      "A20 Disable FAIL", 13, 10, "$"
    % f  [, E9 b. O! b9 Y

  29. % Y3 ~+ \7 J- r  R1 Z6 {- B
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    4 f6 v- y3 N0 \3 i" A
  31. A20_DISABLE:
    / N! B2 l, O2 v
  32.                 call    A20Write ) ?6 F. F0 ^% {: v( c
  33.                 jz      exit_disable7 Z0 W3 v% V7 a* l2 G) R8 X

  34. 2 t+ s* q6 {2 `. c3 m
  35.                 cli                             ; Only need for reading value from KBC
    & R; f, m* z6 T; ?
  36.                 mov     al, 0D0h 1 z; F9 F* v* N/ v! x: O1 R6 {! u0 L4 h
  37.                 out     64h, al , h9 W  b; l# B6 m
  38.                 call    A20Read
    4 w( f5 g' q4 T6 Y' B+ f9 c- d/ S
  39.                 jz      Disable_int 2 P6 C" O6 z; \( {! N  j$ @

  40. / ^: A. Y* s3 g" R. P7 \3 j
  41.                 in      al, 60h                 ; Get current status " U9 m( R0 Q# \/ X. U5 S) M
  42.                 mov     ah, al 9 e1 z- d6 x  u/ s1 v+ `/ v
  43.                 call    A20Write ( Q5 a1 ?9 N+ x; N0 M( r* T5 g
  44. Disable_int:    sti
    : C; f. e1 x" N6 i/ u  C
  45.                 jz      exit_disable2 O+ e; j* R, a& t7 `5 c/ }/ q
  46. # y9 [% c, b% X
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the . P1 P2 [" X5 ]/ j6 X
  48.                 out     64h, al                 ; Out Put Port next 7 m# F/ j! G2 b- p5 [
  49.                 call    A20Write ' p- w% [7 `4 k
  50.                 jz      exit_disable1 h5 `' `+ I0 k6 M% N+ }% o$ g
  51. - N8 Y, B- x7 X. {
  52.                 mov     al, ah 5 S% l8 x! ~* k3 P. r: Z
  53.                 and     al, not 2               ; Disable line A20
    3 G+ W* }0 I* m# l9 S- ~) O, z
  54.                 out     60h, al ( q8 B) f- \- |+ {
  55.                 call    A20Write
    0 |! ?9 E8 _/ _+ M9 g8 E% h
  56.                 jz      exit_disable. O2 q; C3 ?& M7 s$ G) W/ k: W  J
  57. 4 F  Y  e4 s# Q$ J+ V
  58.                 mov     al, 0FFh                ; NOP 9 H, n1 E- X: N! m7 }
  59.                 out     64h, al
    , \$ U$ w1 |$ _, U
  60.                 call    A20Write
    8 m2 W2 X1 Q# q/ N
  61. ) E3 z( S, N$ w) n, J# J
  62. exit_disable:          ret 6 A' N: l* U& r1 @

  63. ) i( H$ d6 L/ K3 |& k; v
  64. A20Write:       xor     cx, cx                  ; Reasonable wait . U7 T' }4 N2 o( i/ F( x
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    # Y; L4 N+ I8 u5 W. o
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear ; \* k  f* E9 H5 S
  67.                 jz      clear
    7 r  x8 B* a2 _2 M# e& M9 g
  68.                 dec     cx
    8 O2 B9 X) D( N4 x/ z
  69.                 jz      exit_write
    3 ?  R; J; I, Q5 z+ ]; W# @
  70.                 jmp     short get_wirte
    ) h# Z/ L4 k& a* [3 K- N  z
  71. clear:          inc     al                      ; Clear ZR
    ( x! X! t& W) R3 j9 l/ M2 B8 \
  72. exit_write:     ret 4 k3 |& {& @* L  L( l

  73. 1 |1 i- u4 l, c( K0 ?7 s

  74. 4 k7 b" [( |& Q* K- e0 [) \
  75. A20Read:        xor     cx, cx
    * `7 M8 ?8 o+ y4 r1 Q& E
  76. get_read:       in      al, 64h
    ; B! \% [* `6 B: M3 |, ^$ [5 B4 V
  77.                 test    al, 01                  ; If the 'output buffer' is full, has , _* A( c, R* X* c
  78.                 jnz     exit4                   ; ... , ~5 H/ G) Z  C% j  o& e
  79.                 dec     cx ) [0 T. f6 Z" X9 y
  80.                 jnz     get_read+ B! ?, M# C2 l" m% s
  81. exit4:          ret     ( M& c$ \# l8 ~3 _' d* F
  82.                
    6 `6 N* R$ S$ [# n) q
  83. end
复制代码
  1. ;A20STATE.ASM % O- I' T& ]6 L8 c" b# Y
  2. ;
    9 h' x4 m; ^1 }
  3. ; Returns the status of the line A20 through the KBC
    ) A& f4 B* i; i2 Z1 |" G8 a. {
  4. ;       programming by bini for debug. 2008-07-01
    # S2 r4 T6 E5 I0 \# K! F
  5. ;
    + I- m+ m* V9 i9 y4 ~* Q
  6. .model tiny
    1 B) E( `0 {* b4 ?
  7. .code( i" A$ ^/ h2 r) p" h8 k& n, Z+ m
  8. .486
    / r& l; l) w( s. `* q
  9. .startup9 z8 w( y9 w* J
  10.                 mov     dx, offset msg_fail " e( X% U% S( h; M6 y! Q2 j
  11.                 call    _GET_A20_STATE_
    8 |2 c/ g, i) S4 o# G7 n
  12.                 jz      exit1                           ;  was a problem' V- d" B; v5 x+ @, t
  13.                 push    ax                              ; Save state, AH ( v& L8 f( d# |! x3 i
  14.                 mov     dx, offset msg_ok                      ; There wasn't a problem
    5 a! k5 L' o. L) g& N! x# B' V( h6 ^
  15.                 mov     ah, 09h . d# d2 `1 M9 z6 y* l& ]5 V$ D8 e. ^1 c
  16.                 int     21h                             ; Print message
    6 L8 k( E; M: u  {* s7 G
  17.                 pop     ax                              ; retreve state
    + l4 m! @: L6 G5 V( L

  18. 3 t. k' F. }- E1 v" i. G
  19.                 mov     dx, offset msg_dis
    * q# k" w; G1 C4 n8 ?2 q6 ~
  20.                 and     ah, 00000010b                   ; bit 1, 2h, indicates state
    $ @" @6 T0 b0 T* a, h# A
  21.                 jz      exit1
    : O' t- l+ m( s4 ^
  22.                 mov     dx, offset msg_en
    0 P: `6 T  W' [4 U9 C5 b+ b

  23. ! ~" h' @6 `% h& t3 O
  24. exit1:          mov     ah, 09h $ L$ A3 g  }' t9 K+ x3 M8 V/ m
  25.                 ; DX already contains address of string
    2 V# M$ s2 P8 F( q# @; a) K: v' `
  26.                 int     21h & W9 x0 D- L* d) V  v5 q$ R

  27. ! V* p* \% q0 p' R' t! S9 F5 N
  28.                 mov     ax, 4C00h ! |' @! X( U, z8 ^9 b6 J
  29.                 int     21h ) U* r# w. S7 ~5 m. P
  30. $ d8 R4 y2 K  a* K) A4 T, C9 x% l- F
  31. msg_ok         db      "OK", 13, 10, "A20 $" - ]' V7 l& H( M
  32. msg_fail       db      "FAIL", 13, 10, "$" : T% r- N, b9 G5 v$ z
  33. msg_en         db      "ENABLED", 13, 10, "$"
    & @% n3 F) w0 k0 N
  34. msg_dis        db      "DISABLED", 13, 10, "$": y: t# r8 b8 z1 R  T3 {6 J4 L
  35. : E' e6 l; b$ ]1 G" P  S- Y

  36. - K( y8 d/ H, f+ Z! j  w
  37. _GET_A20_STATE_: 7 E# u7 L4 y% W& R
  38.                 call    A20Write                ; Wait till the input register is empty * C" O& t4 e1 x" y9 K% M" r4 {
  39.                 jz      exit2+1                 ; Bypas the reset int's # h' e9 i, v4 Q
  40.                 cli                             ; Disable ints so we'll get our value 0 M' W2 @1 `  G; ^- o5 J
  41. ' x' L( ]3 S8 S6 o/ X5 S
  42.                 mov     al, 0D0h                ; Send command to the 8042 command register 3 X, a$ L- l* x! p0 q
  43.                 out     64h, al                 ; to tell it we want to Read the Output Port
    9 L0 H# i# b7 l
  44.                 call    A20Read                 ; Wait till the 8042 output register
    1 H. y1 B- s# D
  45.                 jz      exit2                   ; has something in it's buffer
    ; m* i# `: U+ V% A. q

  46. . ~, W% O# B( J) T7 R- l
  47.                 in      al, 60h                 ; Get it " Y, \" Z' _; M; c, T
  48.                 mov     ah, al * V+ b4 \- H5 \+ s
  49.                 call    A20Write                ; Make sure the input register is empty 0 i$ ]) {$ l( [" z9 P+ b1 u4 m) |
  50.                 jz      exit2
    ) `) t& o# }' G& q

  51. 3 C9 r5 P& h9 v# `& P
  52.                 mov     al, 0FFh                ; KBC NOP command, does nothing 1 U+ [/ A/ c$ L* a) u- z- D
  53.                 out     64h, al 5 a, |. E, n* M: h
  54.                 call    A20Write , t- B' D. B9 v. A; c( C3 ]
  55. $ N6 k9 t* X0 e' E' O: `0 B
  56. exit2:          sti
    6 z5 e( r4 P9 y0 ~0 F& C. Z! I2 {, g" }
  57.                 ret2 K; ~4 v" R. m1 S4 t/ ^& Q' C, P

  58. $ T7 Y+ F" ~! P# I9 s3 \2 L

  59. 5 |* @' \( d4 P) V( G
  60. A20Write:       xor     cx, cx                  ; Reasonable wait + X% ~7 K9 o: {' [' o5 p3 u) U
  61. get1:           in      al, 64h                 ; Get KBC read status
    * |( ?0 |& C4 e7 Q+ |0 w
  62.                 test    al, 02                  ; See if buffer empty, bit 1 clear
    8 N. W+ C5 ~- f& T8 v! D
  63.                 jz      clear . I! l1 g9 l) r# O3 ?
  64.                 dec     cx
    ( O& s( p& ^/ }, v" q' @. f
  65.                 jz      exit3 2 C8 L5 N; D1 N, w" f% R+ w
  66.                 jmp     SHORT get1 " J( J6 L/ w8 t: ], }$ |
  67. clear:          inc     al                      ; Clear ZR
    ) C& q; O4 }" j2 v
  68. exit3:          ret 7 \5 m+ n! l8 i- z, P+ Q7 u
  69. , t6 k. l# P' x" \" ]9 }, \

  70. 8 D* F. `" T+ b
  71. A20Read:        xor     cx, cx & \3 g/ N; }% H3 `* t0 c
  72. get2:           in      al, 64h
    4 x$ r4 i$ X6 M* {  ^
  73.                 test    al, 01                  ; If the 'output buffer' is full, has 2 u) h/ C/ N1 }8 w7 \
  74.                 jnz     exit4                   ; something for me
    $ p. e$ D; P' p4 {5 e  E
  75.                 dec     cx + Q: M, C" h# @
  76.                 jnz     get2
    7 |' y8 }" z2 L9 k+ t9 j
  77. exit4:          ret     2 k( M% I. x1 o, X
  78.                
    : C& H1 f  ]* o
  79. end
复制代码
发表于 2008-10-21 17:14:36 | 显示全部楼层
void openA20()5 q+ s/ ]: L7 A, N/ k0 z
{        while(inp(0x64) & 2);        outp(0x64,0xd1);( {1 j3 r5 N7 O  S$ A# E: p
        while(inp(0x64) & 2);        outp(0x60,0xdf);
: ^% P3 z8 m5 E$ e        while(inp(0x64) & 2);        outp(0x64,0xff);
. @6 V$ ]5 w9 B}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:47 , Processed in 0.088877 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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