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

Enable or disable A20 gate through KBC demo code.

[复制链接]
发表于 2008-10-8 14:58:49 | 显示全部楼层 |阅读模式
反正图方便的,就拿去参照,也是之前遗留的code,整理了一下,好象其中的代码,一位Korea的同学有留下来一段code。
  1. ;A200N.ASM 2 @2 b8 X' I: w0 N* U" f- r+ }
  2. ; ( v) U( |; y$ z3 G# D- U
  3. ; Trun on the line A20 through the KBC, programming by bini for debug. 2008-07-01
    4 R! ~; i6 ?, k- K# l* ~8 }
  4. ;       ml A20ON.asm 3 d8 d$ ]! {9 z& \9 |
  5. ;
    5 _" V% Z: Y# ~! w: \5 C; [8 q5 t. k
  6. .model tiny
    * j& @' }: B1 |/ r  \5 N5 a
  7. .code, ?8 Q) N" }( _. ~
  8. .4861 {# n; U/ A9 x  ^- e+ X$ S3 d
  9. .startup1 b3 O2 R: f' u
  10.   g2 E, k" a+ }. N- I
  11.                 mov     dx, offset msg_author3 `8 M7 k; R, d
  12.                 mov     ah, 09h
    ; V" ^( U" f8 Q2 A+ D1 b
  13.                 int     21h9 H4 }8 b4 Y6 V7 |$ r. v0 V' ^* P

  14. ; A% a- B1 [6 m. e: D  {; h
  15.                 mov     dx, offset msg_fail
    2 R' {+ R# l& G( y6 i
  16.                 call    A20_ENABLE
    ; S6 c- N& A6 d$ v; v
  17.                 jz      exit1; J' k  f  w7 V" k, ?' x
  18.                 mov     dx, offset msg_ok ; B) p4 q2 i# M2 V

  19. 8 q! `' s) c, A- Y
  20. exit1:          mov     ah, 09h   a+ N) ^/ r+ s7 g0 ~
  21.                 int     21h / A% `3 W( f  n# y  A1 R$ E0 n
  22.                 mov     ax, 4C00h
      e; v* x$ Y% O" {- {" Y, F
  23.                 int     21h
    6 J4 r5 _% s* P* S: p% h
  24.                
    ; j8 i2 X3 t* Y/ ~6 T; b
  25. msg_author      db      "Trun on the line A20 tools through the KBC, programmin by bini", 13, 10,5 v5 g) N  ?" Z$ e" b$ _7 S* `6 v
  26.                         "2008-07-01",13, 10, "$" * S; Z, d9 k; w( V0 A" P* V
  27. msg_ok          db      "A20 Enable OK", 13, 10, "$"
    6 g/ q7 k: _( c( S6 W$ p/ R
  28. msg_fail        db      "A20 Enable FAIL", 13, 10, "$" 2 @$ }8 ^7 P2 w* E* D
  29. # E# z& `8 ]3 o; D6 N/ x
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    5 M4 W8 F2 o% [# V6 U3 h" n& S
  31. A20_ENABLE:
    $ h5 B( l, b, l1 ^, ~. q
  32.                 call    A20Write
    ! z5 V  `& n( d) S, b7 O, a, p
  33.                 jz      exit_enable- }/ X" f$ C; Q0 v3 W( S
  34. ' t& k3 Q, B# p, Y
  35.                 cli                             ; Only need for reading value from KBC
    ( F) g# a- c. i1 T9 Z( K/ O0 G
  36.                 mov     al, 0D0h 1 d8 z: I2 h0 w0 T( V# v" |+ K
  37.                 out     64h, al
      Z/ S- `# B+ A+ l" H
  38.                 call    A20Read
    % |) o& }" ^; c1 @# @' l- _
  39.                 jz      enable_int 6 R4 K- F3 C9 v

  40. ; L8 K7 j. m, f" g, |/ v; f5 Q
  41.                 in      al, 60h                 ; Get current status
    ) y+ M% E1 N* d8 y! y# b& ^6 M
  42.                 mov     ah, al 9 u- V4 t" E$ l
  43.                 call    A20Write 8 P) X% S$ K# D% y4 M& ~, A: ^
  44. enable_int:    sti 4 K9 o4 n! ]5 r0 t+ e
  45.                 jz      exit_enable6 p! n4 k; w% q1 b& c4 r0 u
  46. # M5 K5 ]) d* g/ j' V4 e* T
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the   N9 p6 p- Q& s7 `  w! \
  48.                 out     64h, al                 ; Out Put Port next
    2 h3 ]% b8 ~( M/ X% U; S+ u
  49.                 call    A20Write $ e' u6 k: _8 N: ]0 o: g
  50.                 jz      exit_enable
    $ Z: @/ n$ U5 f" b( m/ R  a+ |
  51. 2 y0 z  k4 q0 ~# Z; G% K- W! F( h
  52.                 mov     al, ah
    6 `  k/ q* i) V$ `
  53.                 or      al, 2                   ; Enable line A20
    - k8 a& [. ^. _5 z0 w: k; D9 h* p: F
  54.                 out     60h, al
    $ R: m% [  {. S+ U
  55.                 call    A20Write / M- n% j# Z/ C+ b
  56.                 jz      exit_enable
    8 W# W- G4 C8 J7 z% r

  57. . |2 E) |) X* T) C- ^
  58.                 mov     al, 0FFh                ; NOP
    % G4 _5 @% C* P( E! q) C+ z* l
  59.                 out     64h, al / a4 V  p5 B  z3 F& v0 o
  60.                 call    A20Write ! G+ m( ~/ P; V. t% L2 I
  61. ! C: B$ s  i; ]# ~
  62. exit_enable:          ret
    . U$ @/ t- j; H2 t0 S
  63. . S% H6 x# M$ p& C
  64. A20Write:       xor     cx, cx                  ; Reasonable wait 3 t9 q1 ^% l, ~5 D0 X. o
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    / f5 L% g9 d9 F' [
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear 9 F: @% R/ {: _; K
  67.                 jz      clear
    , H5 z5 h4 a1 ^) @* r& ~
  68.                 dec     cx
    3 n1 \; B5 Z/ s' S: o3 I" q
  69.                 jz      exit_write
    ) \& S8 Z" f" e8 Z
  70.                 jmp     short get_wirte ) y. _, E- Y- m( h6 Y, ]. c+ b; n) }+ \
  71. clear:          inc     al                      ; Clear ZR
    / }2 S) j5 Y' a' o
  72. exit_write:     ret
    5 j6 U  Q& r( g) `$ A; {+ U4 y
  73. 2 W3 ?! \" b% v' p" }; [

  74. / J6 N4 F" |9 A# V) `/ Y) ]+ M
  75. A20Read:        xor     cx, cx
    ) N( f/ t; B9 m
  76. get_read:       in      al, 64h
    * E, P4 w" ?9 Q8 U1 ]
  77.                 test    al, 01                  ; If the 'output buffer' is full, has 8 f1 u8 x. b2 s4 |
  78.                 jnz     exit4                   ; ... : ^; e8 w7 w7 n. }6 v/ Z9 e) O3 H
  79.                 dec     cx
    0 N4 |+ _5 H. Q, I7 h
  80.                 jnz     get_read- P% B" a9 O+ m, M5 I: |
  81. exit4:          ret     ' n$ w* z. j! Q, P& t
  82.                
    # ~2 B2 D9 j+ O. p7 Y
  83. end
复制代码
  1. ;A200FF.ASM & o, E* {' s" W3 s) L9 z
  2. ;
    9 S& [$ X1 g1 G% D% m% c2 y. ~
  3. ; Trun off the line A20 through the KBC, programming by bini for debug. 2008-07-018 F2 s5 c7 T. x4 n: |6 T
  4. ;       ml A20ON.asm
    : ]. w* P. X: M7 S. v
  5. ; 9 A! H! r( f* ^: N& U' b
  6. .model tiny8 }+ o# I+ f. Q$ h
  7. .code( Q1 G4 m5 O  M+ }, D- m
  8. .486
    8 ], R  t/ ?! l& e. A, z
  9. .startup
    $ p2 I+ ~9 }" p
  10. ; Q! C! \9 L2 W$ A& ~
  11.                 mov     dx, offset msg_author
    % z5 a/ P% ^7 j% h8 B$ S
  12.                 mov     ah, 09h
    5 s$ H" Y! \2 k* F
  13.                 int     21h3 `0 x; c3 r, M6 L9 e0 ^
  14. 0 l0 r, Y2 K( v
  15.                 mov     dx, offset msg_fail ; l# f+ A, s# L0 i/ d( i2 }% g2 }! d0 p
  16.                 call    A20_DISABLE
    2 z2 N% [2 k8 I) g; Y" y8 b! ~
  17.                 jz      exit1
    * D) T% }) X4 q7 r, S: F3 Z
  18.                 mov     dx, offset msg_ok
    1 W- E1 D5 w% G5 ^* J2 Z
  19. # x8 F6 [$ V! Z/ W- j! J
  20. exit1:          mov     ah, 09h , n/ H5 P$ i) V: X
  21.                 int     21h
    5 g! U+ x" N! T. _& m$ n. d9 b
  22.                 mov     ax, 4C00h
    " Z  v2 C) i6 K% ~" m. Q8 T- h
  23.                 int     21h + E$ Q& M+ X6 R
  24.                
    ; N: T+ F! N0 D
  25. msg_author      db      "Trun off the line A20 tools through the KBC, programmin by bini", 13, 10,
    & n- [- B0 L6 ~5 Z3 x) X1 J
  26.                         "2008-07-01",13, 10, "$" 6 x7 v3 H* Z! _! e6 Y, a; c
  27. msg_ok          db      "A20 Disable OK", 13, 10, "$"
    0 \. q8 ^- M9 U* x6 K. Y# ~) y' @) i
  28. msg_fail        db      "A20 Disable FAIL", 13, 10, "$" + }* ^; o/ Q" Q& A' c
  29. : p4 R/ A' @5 S4 J
  30. ;------------------------ follow code maybe make to lib, if you want...-------------------------------
    $ X9 ^% b1 R* y" o4 [9 P
  31. A20_DISABLE:
    1 k2 ^; y$ _) X
  32.                 call    A20Write
    * J+ a4 F2 ~4 t% U
  33.                 jz      exit_disable
    ! e1 B1 X6 Y0 H  q3 `7 A
  34. 5 h8 F: Y8 V8 v; c6 ~$ m! d$ q) G
  35.                 cli                             ; Only need for reading value from KBC 8 n- F* s2 [4 {2 u% H9 P
  36.                 mov     al, 0D0h
    ! G  v+ t& r7 _* O8 B
  37.                 out     64h, al   O. G+ ~9 Y+ }4 y3 ~, ?
  38.                 call    A20Read
    . A& q, h: P" x4 E
  39.                 jz      Disable_int % m8 T) G" O6 E3 E

  40. - p* a* `- }/ Z& ]& J* x
  41.                 in      al, 60h                 ; Get current status
    9 E- f( Q3 ^. Y7 r1 ^8 J
  42.                 mov     ah, al
    ! \0 O/ v' B+ Q  y' C7 B  ^
  43.                 call    A20Write ) L( r) Y. O; t/ O
  44. Disable_int:    sti
    4 z9 G* C8 X. c
  45.                 jz      exit_disable
    * [* E; e0 J6 j% O6 A

  46. 0 o* ?8 Q! ~# r6 i
  47.                 mov     al, 0D1h                ; Tell the KBC , want to write to the , C7 j/ u$ e6 W& X5 C8 Y, `( a) V
  48.                 out     64h, al                 ; Out Put Port next
    $ b- [: m" k. {) l
  49.                 call    A20Write
    ( }& j) g. X1 B+ L
  50.                 jz      exit_disable
      t3 s& q1 s. G' b

  51. ; K" d! W* B9 f* r8 j" E! u5 [
  52.                 mov     al, ah ! h6 N) C. J. X+ d0 u/ h
  53.                 and     al, not 2               ; Disable line A20 & Q# j1 I5 S: J5 O8 C8 b
  54.                 out     60h, al " V  ^$ m) P; A& Z% T
  55.                 call    A20Write
    # S2 U5 M4 t9 Y7 g) E2 Q
  56.                 jz      exit_disable
    ) C. b% r( t8 {4 q

  57. % [; h- S/ n8 ^0 _) Y0 l
  58.                 mov     al, 0FFh                ; NOP : g; Y0 g, h! p3 J3 A
  59.                 out     64h, al
    $ B5 B! B3 K; z2 x$ [' q
  60.                 call    A20Write * A5 ~) n3 P# n# S: g7 Q

  61. ; u- p% e3 P% j6 p4 X' U
  62. exit_disable:          ret 3 o5 K- ^! O( {# z

  63. ) a- m( i" I( x# f$ K
  64. A20Write:       xor     cx, cx                  ; Reasonable wait / z' d5 `$ g1 L( y9 t- q
  65. get_wirte:      in      al, 64h                 ; Get KBC read status
    ; k% a6 A: R+ }* C, O. h! A) U
  66.                 test    al, 02                  ; See if buffer empty, bit 1 clear " O; r- E3 y2 ^# z  n
  67.                 jz      clear
    & \+ R5 ~- s$ t% R4 ~
  68.                 dec     cx : \% Y' d$ c2 I' Q- t; J9 r
  69.                 jz      exit_write
    ! a& Q6 F# d- q" A" C* s
  70.                 jmp     short get_wirte
    4 t' |0 Q  _4 g
  71. clear:          inc     al                      ; Clear ZR
    1 b. Z9 T& w" @2 T& {, U; g5 U) w
  72. exit_write:     ret   g1 t# D1 P- X3 ?( o- G$ C4 ^
  73. ! _; O. l8 N4 w8 y" ?! i: D
  74. 7 y! K/ E( [/ a
  75. A20Read:        xor     cx, cx
    ( j0 H5 q# @+ i" Q
  76. get_read:       in      al, 64h
    2 L$ H3 `0 r2 z
  77.                 test    al, 01                  ; If the 'output buffer' is full, has
    & n- \, ^5 s4 G# l. k' |) y& @
  78.                 jnz     exit4                   ; ... , ~, `  r1 r/ u
  79.                 dec     cx
    , X1 d; L4 v2 F, C, z* N5 D0 O6 j
  80.                 jnz     get_read: |' c$ s% i1 _2 \! J! O: M2 J; E, o. e
  81. exit4:          ret     
      P. W$ Z: E$ ~% Y4 y* t
  82.                
    & m' }( v8 E+ P* O: z6 t
  83. end
复制代码
  1. ;A20STATE.ASM
    5 G/ O& r7 w# r$ I6 x6 H/ j7 Y: |
  2. ;
    ( i1 A# d1 _* X: i
  3. ; Returns the status of the line A20 through the KBC ) l5 E8 T( i; J5 x
  4. ;       programming by bini for debug. 2008-07-012 j1 o3 q5 h9 c2 O& A3 y1 E9 n
  5. ; : [, n3 f7 n1 ~) u
  6. .model tiny
    9 S8 ^0 z% ?+ @2 I3 M1 |  i0 [! t
  7. .code
    3 ]* A+ \( S$ v) |
  8. .486( b; v% f: ~* O0 l% [
  9. .startup2 I! E  R5 S, Q: H
  10.                 mov     dx, offset msg_fail
    1 U; S2 z& X* f5 g. X( z
  11.                 call    _GET_A20_STATE_
    ( q- f% K4 l8 ~, @  s, z) M
  12.                 jz      exit1                           ;  was a problem
    / I, }4 x1 z0 M! M$ K0 ~. Z* e
  13.                 push    ax                              ; Save state, AH ' ?1 l  g4 w5 N) n  [! r
  14.                 mov     dx, offset msg_ok                      ; There wasn't a problem ' ~8 [' k3 S' _' p
  15.                 mov     ah, 09h
    * Q- k% _/ V3 `1 B  w
  16.                 int     21h                             ; Print message . Q, `% N. Z+ Z: @! Y/ C+ w
  17.                 pop     ax                              ; retreve state 6 G+ H7 x% W8 @1 t( J1 o

  18. + t+ C0 ^" G1 B2 e1 z
  19.                 mov     dx, offset msg_dis
    $ o. B: w. U" c0 e
  20.                 and     ah, 00000010b                   ; bit 1, 2h, indicates state
    2 S4 K* R' h+ ^- o; w
  21.                 jz      exit1
    / }4 S5 G* b1 O* H
  22.                 mov     dx, offset msg_en
    + v' h4 ]/ g9 m3 ?5 J* j
  23. 3 V" b* Y" ~( j
  24. exit1:          mov     ah, 09h
      g8 R* b/ L7 P; q9 P
  25.                 ; DX already contains address of string
    3 {9 R9 v2 R" e0 G# k& [- q$ f+ A# B
  26.                 int     21h ' B, P1 ^$ m, r0 _9 D" j3 {" O
  27. 5 |' R3 j8 ^, b9 u3 Q' g5 z2 _) t. O
  28.                 mov     ax, 4C00h " l! S5 Q7 ]5 L- K  P5 P1 c. y; ]& X6 U
  29.                 int     21h : Q8 N! m9 u8 O( I
  30. % B7 u9 ^7 J! A
  31. msg_ok         db      "OK", 13, 10, "A20 $"
    % n3 h8 q- U0 z  p
  32. msg_fail       db      "FAIL", 13, 10, "$"
    % k! D  C9 X3 p8 @
  33. msg_en         db      "ENABLED", 13, 10, "$" 7 d) H' {, k! v1 S- {
  34. msg_dis        db      "DISABLED", 13, 10, "$"$ _! G, K" T; H# I. t

  35. 1 |0 J/ `3 `% k/ J- |8 T
  36. , |' T0 O- A+ I/ u' @. ?! B
  37. _GET_A20_STATE_: * P, h) d! u2 n/ x, ~) ~0 y' l% B8 V
  38.                 call    A20Write                ; Wait till the input register is empty ( Q; A5 X5 F9 e2 q4 W$ j0 w0 R
  39.                 jz      exit2+1                 ; Bypas the reset int's 0 i3 u0 `$ [- @* b
  40.                 cli                             ; Disable ints so we'll get our value
    % p- l0 C" q: i) m

  41. $ x# v1 [* I$ k$ E4 u8 W9 G, e
  42.                 mov     al, 0D0h                ; Send command to the 8042 command register 5 |- D% ~8 v% w0 x$ V$ i$ F
  43.                 out     64h, al                 ; to tell it we want to Read the Output Port
    ' _1 n7 x" X; ?) h; U
  44.                 call    A20Read                 ; Wait till the 8042 output register 8 f. `1 h9 G2 j: Q
  45.                 jz      exit2                   ; has something in it's buffer ' Z- B  f  r& |- ~! Z
  46. 9 D+ n4 ^9 o) k& _2 f- @7 l
  47.                 in      al, 60h                 ; Get it 0 V/ P3 }1 F1 ?1 u1 s/ ~
  48.                 mov     ah, al ' ~. b& z) D$ q6 T
  49.                 call    A20Write                ; Make sure the input register is empty
    ( J+ h# Y: H5 e9 z: G0 r
  50.                 jz      exit2
    ' u5 C0 r/ e: t: w2 r- O1 x1 f9 J

  51. 3 n6 D1 E5 H9 }# \6 ^" X) w
  52.                 mov     al, 0FFh                ; KBC NOP command, does nothing
    1 N. V' h- d* `5 a
  53.                 out     64h, al
    1 \" o( d) i( G# U
  54.                 call    A20Write , F2 ]# ]7 `3 \

  55. 3 ^1 L6 [$ J- f" v
  56. exit2:          sti & V8 }# V& M% i7 v
  57.                 ret
    ( P9 d% N. C8 _% s5 U8 C5 V5 [

  58. . k9 j' h: I0 D) f

  59. 7 h2 t$ h/ Z" L$ q) R* w8 S6 q. ~, a+ E
  60. A20Write:       xor     cx, cx                  ; Reasonable wait
    ' C9 Z9 U# [5 O. a
  61. get1:           in      al, 64h                 ; Get KBC read status 4 k8 D1 Y, l3 H- [
  62.                 test    al, 02                  ; See if buffer empty, bit 1 clear
      G0 d7 {: i3 _, Y0 [& k. s4 B0 A9 w
  63.                 jz      clear & B: ~3 f2 h7 L* H) z5 K2 e
  64.                 dec     cx
      d2 J* G$ M0 Z" ^
  65.                 jz      exit3
    & P, j, r" M; Q
  66.                 jmp     SHORT get1
      n8 |* v* w) `- ^
  67. clear:          inc     al                      ; Clear ZR
    5 d) E# O' P! f4 h/ n9 m2 Q
  68. exit3:          ret ( S. C0 ?% O/ h" h& |6 y, [( F% ?
  69. 5 O/ _+ u" P# _* g

  70. # S; H" j/ _/ l& x1 ^+ C0 b
  71. A20Read:        xor     cx, cx
    / v9 h$ O( q+ L4 y$ q1 o! o/ ?
  72. get2:           in      al, 64h 8 Z* I% E5 J5 h4 V$ d: U
  73.                 test    al, 01                  ; If the 'output buffer' is full, has
    8 S' N5 H" ^$ d1 T' e
  74.                 jnz     exit4                   ; something for me / v; v" m# y: z! _: y7 F: D& m
  75.                 dec     cx
    5 t) k, {; I& g1 D/ X! x& ?
  76.                 jnz     get2
    & @- t5 }  ?4 c4 }2 N6 E- B! `+ o" m
  77. exit4:          ret     
    1 Q6 }1 h) e% g3 |0 e- ]; O
  78.                   n; [. S. |; J- C0 ~
  79. end
复制代码
发表于 2008-10-21 17:14:36 | 显示全部楼层
void openA20()$ v5 e& n" u5 A7 e
{        while(inp(0x64) & 2);        outp(0x64,0xd1);
3 y: \& {: D- W( P5 n; o6 O        while(inp(0x64) & 2);        outp(0x60,0xdf);
! r$ T, r3 m3 x" H  Y        while(inp(0x64) & 2);        outp(0x64,0xff);0 ~5 b+ M8 Z4 @$ x8 G6 _
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 05:41 , Processed in 0.023317 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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