Autor Thema: Problem mit A20-Gate  (Gelesen 3053 mal)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« am: 29. July 2006, 12:39 »
Hi
ich hab ein problem mit dem A20-Gate.
Meine Procedure, die das Gate activiert funktioniert zwar in DOS
aber bei beim booten hangt sie sicht auf. :cry:

     CLI                         ;Disable Interrupts
     CALL Enable_A20
     STI                         ;Enable Interrupts
     JC A20_Error


Enable_A20    PUSH AX
    .1        IN   AL,  0x64         ;Wait until KBC is ready for 0xD0 command
              Test AL,  0x03
              JNZ  .1
              MOV  AL,  0xD0
              OUT  0x64,AL
    .2        IN   AL,  0x64
              TEST AL,  0x01         ; Wait until KBC has data
              JZ   .2
              IN   AL,  0x60
              OR   AL,  0x02
              PUSH AX
    .3        IN   AL,  0x64           ; Wait until KBC is ready for Command
              TEST AL,  0x02
              JNZ  .3
              MOV  AL,  0xD1
              OUT  0x64,AL
    .4        IN   AL,  0x64           ; Wait until KBC is ready for Data
              TEST AL,  0x02
              JNZ  .4
              POP  AX
              OUT  0x60,AL

;Check
    .5        IN   AL,  0x64
              Test AL,  0x03
              JNZ  .5
              MOV  AL,  0xD0
              OUT  0x64,AL
    .6        IN   AL,  0x64
              TEST AL,  0x01
              JZ   .6
              IN   AL,  0x60
              SHR  AL,  0x2            ;A20-Gate Bit to CF
              JC   .NoError             ;CF Invertieren
              STI
              JC   .Exit
    .NoError  CLI
    .Exit     POP  AX
    RET

könnt ihr mir vieleich sagen wo mein fehler ist?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 29. July 2006, 14:44 »
Also dein Code den du verwendest funktioniert sowieso nicht auf allen PCs. Bei manchen geht er und bei manchen hängt der PC sich auf. Unter DOS geht es und beim Booten nicht? Ein und der selbe PC? Könnte vielleicht daranliegen das in DOS sowieso das A20 aktiviert wird (falls nicht geändert). Du meinst jetzt auch das echte DOS? Also dann wird der Code vielleicht bei deinem PC nicht funktionieren. Bei mir hat er bei 3 von 4 funktioniert. Beim 4 hat der PC sich aufgehangen. Ich habe jetzt den Code verkleinert wie er auch in vielen Tutorials zu finden ist. Da funktioniert er bis jetzt auf allen PCs die ich damit hab laufen lassen. Hier:

;set A20-Gate
Empty8084 ;macro
mov al,0D1h ;command write
out 64h,al
Empty8084 ;macro
mov al,0DFh ;enable A20 (Bit 1 gesetzt)
out 60h,al
Empty8084 ;macro
...


macro Empty8084
{
local Empty8084Adr
Empty8084Adr:
in al,64h
test al,00000010b ;2
jnz Empty8084Adr
}

Ich hoffe mal der funst bei dir auch. So wie ich es mitbekommen habe, sollte der auf den gängigsten PCs funktionieren. Ich habe aber gehört das es keine aktivierung des A20 gibt die auf allen PCs funktioniert. Selbst M$ hatte unter DOS Probleme damit. Die Testen in ihrer Himem.sys auf sämtliche PCs um dann dementsprechend zu aktivieren. Aber den genauen Code kennt wohl nur M$ und evt. IBM.

bitmaster
In the Future everyone will need OS-64!!!

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. July 2006, 14:58 »
Hab grad rausgefunden das dafür ne BIOS funktion gibt
die müste doch eigendlich auf allen PC laufen oder!?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #3 am: 29. July 2006, 15:04 »
Zitat von: MNemo
Hab grad rausgefunden das dafür ne BIOS funktion gibt
die müste doch eigendlich auf allen PC laufen oder!?
Stimmt, habe ich gerade gar nicht dran gedacht. Weiß ich gar nicht genau, aber die sollte schon funktionieren. Versuchs doch einfach. ;-)

bitmaster
In the Future everyone will need OS-64!!!

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 29. July 2006, 15:13 »
deaktivier mal vor der Routine Interrupts (cli),
das war bei mir jedenfalls das Problem

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 29. July 2006, 15:22 »
Zitat von: scales of justice
deaktivier mal vor der Routine Interrupts (cli),
das war bei mir jedenfalls das Problem

hab ich doch (weils sonst in dos auch nit gefunzt hätte, da ist es dann aber irgend wann weiter gegangen wenn man aufm KB rumgehämmert hat)
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 29. July 2006, 19:04 »
Also das mit dem Interrupt hat unter DOS nit gefunzt.
Ich hab aber das hier
Zitat
Note:   bit 0 (system reset) should always be set when writing the output
     port, as the system may hang constantly; use pulse output port
     (command FEh) instead.
in Ralf Brown's Port liste gefunden
Da ist es ja kein wunder, dass sich das auf hängt
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen